apostila 2pp

apostila 2pp

(Parte 6 de 15)

J o a o \0

No caso acima, as duas células não usadas têm valores indeterminados. Isto acontece porque o C não inicializa variáveis, cabendo ao programador esta tarefa. Portanto as únicas células que são inicializadas são as que contêm os caracteres 'J', 'o', 'a', 'o' e '\0'.

Um exemplo do uso de strings é dado abaixo.

#include <stdlib.h> #include <iostream> using namespace std; int main () { char string[100]; cout << "Digite uma string: "; cin >> string; cout << string << endl; system("pause"); return(0); }

Neste programa, o tamanho máximo da string que você pode entrar é uma string de 9 caracteres. Se você entrar com uma string de comprimento maior, o programa irá aceitar, mas os resultados podem ser desastrosos. Veremos porque posteriormente.

Como as strings são vetores de caracteres, para se acessar um determinado caracter de uma string, basta "indexarmos", ou seja, usarmos um índice para acessarmos o caracter desejado dentro da string. Suponha uma string chamada str. Podemos acessar a segunda letra de str da seguinte forma:

str[1] = 'a';

Por que se está acessando a segunda letra e não a primeira? Na linguagem C, o índice começa em zero. Assim, a primeira letra da string sempre estará na posição 0. A segunda letra sempre estará na posição 1 e assim sucessivamente. Segue um exemplo que imprimirá a segunda letra da string "Joao", apresentada acima. Em seguida, ele mudará esta letra e apresentará a string no final.

#include <stdlib.h> #include <iostream> using namespace std; int main () { char str[10] = "Joao"; cout << str << endl; cout << "Segunda letra: " << str[1] << endl; str[1] = 'U'; cout << "Agora a segunda letra eh: " << str[1] << endl; cout << "String resultante: " << str << endl; system("pause"); return(0); }

Nesta string, o terminador nulo está na posição 4. Das posições 0 a 4, sabemos que temos caracteres válidos, e portanto podemos escrevê-los. Note a forma como inicializamos a string str com os caracteres 'J' 'o' 'a' 'o' e '\0' simplesmente declarando char str[10] = "Joao". Veremos, posteriormente que "Joao" (uma cadeia de caracteres entre aspas) é o que chamamos de string constante, isto é, uma cadeia de caracteres que está pré-carregada com valores que não podem ser modificados. Já a string str é uma string variável, pois podemos modificar o que nela está armazenado, como de fato fizemos.

Veja como você está:

a) Escreva um programa que leia um caracter digitado pelo usuário, imprima o caracter digitado e o código ASCII correspondente a este caracter.

b) Escreva um programa que leia duas strings e as coloque na tela. Imprima também a segunda letra de cada string.

Introdução às Funções

Uma função é um bloco de código de programa que pode ser usado diversas vezes em sua execução. O uso de funções permite que o programa fique mais legível, mais bem estruturado. Um programa em C consiste, no fundo, de várias funções colocadas juntas.

Abaixo o tipo mais simples de função:

#include <stdlib.h> #include <iostream> using namespace std; int mensagem () /* Funcao simples: so imprime Ola! */ { cout << "Ola! "; return(0); } int main () { mensagem(); cout << "Eu estou vivo!" << endl; system("pause"); return(0); }

Este programa terá o mesmo resultado que o primeiro exemplo estudado. O que ele faz é definir uma função mensagem() que coloca uma string na tela e retorna 0. Esta função é chamada a partir de main(), que, como já vimos, também é uma função. A diferença fundamental entre main e as demais funções do problema é que main é uma função especial, cujo diferencial é o fato de ser a primeira função a ser executada em um programa.

Argumentos

Argumentos são as entradas que a função recebe. É através dos argumentos que passamos parâmetros para a função. Vamos ver um exemplo simples de função com argumentos:

#include <stdlib.h> #include <iostream> using namespace std; int square (int x) // Calcula o quadrado de { cout << "O quadrado eh : " << x*x; return(0); } int main () { int num; cout << "Entre com um numero: "; cin >> num; cout << endl; square(num); system("pause"); return(0); }

Na definição de square() dizemos que a função receberá um argumento inteiro x.

Quando fazemos a chamada à função, o inteiro num é passado como argumento. Há alguns pontos a observar. Em primeiro lugar temos de satisfazer aos requisitos da função quanto ao tipo e à quantidade de argumentos quando a chamamos. Apesar de existirem algumas conversões de tipo, que o C faz automaticamente, é importante ficar atento. Em segundo lugar, não é importante o nome da variável que se passa como argumento, ou seja, a variável num, ao ser passada como argumento para square() é copiada para a variável x. Dentro de square() trabalha-se apenas com x. Se mudarmos o valor de x dentro de square() o valor de num na função main() permanece inalterado.

Vamos dar um exemplo de função de mais de uma variável. Repare que, neste caso, os argumentos são separados por vírgula e que deve-se explicitar o tipo de cada um dos argumentos, um a um. Note, também, que os argumentos passados para a função não necessitam ser todos variáveis porque mesmo sendo constantes serão copiados para a variável de entrada da função.

#include <stdlib.h> #include <iostream> using namespace std; int mult (float a, float b,float c) // Multiplica 3 numeros { cout << a*b*c; return(0); } int main() { float x,y; x=23.5; y=12.9; mult (x,y,3.87); system("pause"); return(0); }

Retornando valores

Muitas vezes é necessário fazer com que uma função retorne um valor. As funções que vimos até aqui estavam retornando o número 0. Podemos especificar um tipo de retorno indicando-o antes do nome da função. Mas para dizer ao C o que vamos retornar precisamos da palavra reservada return. Sabendo disto fica fácil fazer uma função para multiplicar dois inteiros e que retorna o resultado da multiplicação. Veja:

#include <stdlib.h> #include <iostream> using namespace std; int prod (int x,int y) { return (x*y); } int main () { int saida; saida = prod (12,7); cout << "A saida eh: " << saída << endl; system("pause"); return(0); }

Veja que, como prod retorna o valor de 12 multiplicado por 7, este valor pode ser usado em uma expressão qualquer. No programa fizemos a atribuição deste resultado à variável saida, que posteriormente foi impressa usando o cout. Uma observação adicional: se não especificarmos o tipo de retorno de uma função, o compilador C automaticamente suporá que este tipo é inteiro. Porém, não é uma boa prática não se especificar o valor de retorno e, neste curso, este valor será sempre especificado.

Com relação à função main, o retorno sempre será inteiro. Normalmente faremos a função main retornar um zero quando ela é executada sem qualquer tipo de erro.

Mais um exemplo de função, que agora recebe dois double’s e também retorna um double:

#include <stdlib.h> #include <iostream> using namespace std; double prod (double x, double y) { return (x*y); } int main ()

{ double saida; saida = prod (45.2,0.0067); cout << "A saida eh: " << saída << endl; system("pause"); return(0); }

Forma geral Apresentamos aqui a forma geral de uma função:

tipo_de_retorno nome_da_função (lista_de_argumentos) { código_da_função }

Veja como você está. Escreva uma função que some dois inteiros e retorne o valor da soma.

As estruturas de controle de fluxo são fundamentais para qualquer linguagem de programação. Sem elas só haveria uma maneira do programa ser executado: de cima para baixo comando por comando. Não haveria condições, repetições ou saltos. A linguagem C possui diversos comandos de controle de fluxo. É possível resolver todos os problemas sem utilizar todas elas, mas devemos nos lembrar que a elegância e facilidade de entendimento de um programa dependem do uso correto das estruturas no local certo.

O Comando if Já introduzimos o comando if. Sua forma geral é:

if (condição) declaração;

A expressão, na condição, será avaliada. Se ela for false (falso) ou zero, a declaração não será executada. Se a condição for true (verdadeiro) ou diferente de zero a declaração será executada. Aqui reapresentamos o exemplo de um uso do comando if :

#include <stdlib.h> #include <iostream> using namespace std; int main () { int num; cout << "Digite um numero: "; cin >> num; if (num>10) cout << "O numero eh maior que 10" << endl; if (num==10) { cout << "Voce acertou!" << endl; cout << "O numero e igual a 10." << endl; } if (num<10) cout << "O numero e menor que 10" << endl; system("pause"); return (0); }

- O else

Podemos pensar no comando else como sendo um complemento do comando if. O comando if completo tem a seguinte forma geral:

if (condição) declaração_1; else declaração_2;

A expressão da condição será avaliada. Se ela for diferente de zero (true) a declaração 1 será executada. Se for zero (false) a declaração 2 será executada. É importante nunca esquecer que, quando usamos a estrutura if-else, estamos garantindo que uma das duas declarações será executada. Nunca serão executadas as duas ou nenhuma delas. Abaixo está um exemplo do uso do if-else que deve funcionar como o programa da seção anterior.

#include <stdlib.h> #include <iostream> using namespace std; int main ()

{ int num; cout << "Digite um numero: "; cin >> num; if (num==10) { cout << "Voce acertou!" << endl; cout << "O numero e igual a 10." << endl; } else { cout << "Voce errou!" << endl; cout << "O numero e diferente de 10." << endl; } if (num<10) cout << "O numero e menor que 10" << endl; system("pause"); return (0); }

- O if-else-if

A estrutura if-else-if é apenas uma extensão da estrutura if-else. Sua forma geral pode ser escrita como sendo:

if (condição_1) declaração_1; else if (condição_2) declaração_2; else if (condição_3) declaração_3; . . . else if (condição_n) declaração_n; else declaração_default;

A estrutura acima funciona da seguinte maneira: o programa começa a testar as condições começando pela 1 e continua a testar até que ele ache uma expressão cujo resultado dê diferente de zero. Neste caso ele executa a declaração correspondente. Só uma declaração será executada, ou seja, só será executada a declaração equivalente à primeira condição que der diferente de zero. A última declaração (default) é a que será executada no caso de todas as condições darem zero e é opcional.

(Parte 6 de 15)

Comentários