Baixe o app para aproveitar ainda mais
Prévia do material em texto
Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 2 de 27 Linguagem C++ - Tutorial Este Tutorial pretende dar uma breve e simples introdução a vários aspectos da linguagem C++. Não é objetivo criar um Tutorial extenso, quer em teoria quer em prática, mas sim dar a conhecer certos tópicos que poderão ser posteriormente desenvolvidos. Este Tutorial foi criado a pensar em todo aquele que quer aprender C++. É fundamental, para quem quiser seguir convenientemente o Tutorial, ter um compilador de C++ em casa. Aconselho o Visual C++ pela sua facilidade de funcionamento. O C++ é uma linguagem difícil de aprender e, falando por experiência própria, pouco estimulante. Digo isto porque se, por exemplo, no Visual Basic não é preciso grandes conhecimentos para fazer janelas, desenhar imagens, incluir som, no C++ é! Nos primeiros capítulos irá trabalhar-se com o DOS prompt, o que não é muito apelativo... Mas o leitor tem de perceber que é importante aprender as bases antes de criar programas mais vistosos. Este Tutorial tem um pouco de teoria, mas é sobretudo com a prática que se aprende programação! Se não experimentar os exemplos e ver as coisas funcionando não aprenderá nada! Escrevendo na saída padrão (tela DOS) Um programa em C++ é um conjunto de funções. O conceito de função será explicado mais à frente. Por agora só é preciso saber que todo o programa em C++ tem obrigatoriamente de conter uma função main. Aqui está o programa mais básico do C++, um programa que não faz nada: // programa que não faz nada! int main() { /* o código que faria o programa funcionar deveria estar aqui */ return 0; } Aquele texto começado por //, é um comentário, os comentários são ignorados pelo compilador e devem ser usados abundantemente, para fazer com que o código seja mais fácil de compreender. Existem duas maneiras de realizar comentários, usando "//", o que fará com que toda a linha, a partir daí, seja comentada, e /* em que o texto que fica entre */ é um comentário. Antes de main() está a palavra int, que é uma palavra reservada do C++. Por agora não é necessário compreender estes conceitos, necessário é compreender que aquilo acima é a base de qualquer programa em C++. O C++ é Case Sensitive,ou seja é diferente escrever mAin(), Main(), MAIN(). Se não houver uma função com o nome exatamente igual a main(), o programa não funcionará! Os Arquivos fonte da linguagem C++ têm a extensão ".cpp". Sempre que criar um arquivo com código em C++ , ponha-lhe um nome do gênero: "nome_Arquivo.cpp". Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 3 de 27 Antes de mais nada, o que é a saída padrão? Sempre que me referir saída padrão falo de uma saída no DOS. A seguir encontra-se o programa de praxe para quem começa a aprender uma linguagem de programação: // este programa escreve na saída padrão a mensagem "Olá Mundo!" #include <iostream.h> // é obrigatório para poder usar cout<<"..."; int main() { cout<<"Olá Mundo!"<<endl; return 0; } Comecemos pela primeira linha, o C++ é uma linguagem poderosa devido às suas bibliotecas, a primeira linha permite ao programa poder escrever na saída padrão. Por agora o leitor terá de se contentar com esta explicação, e usar sempre aquela linha. Só mais adiante ela poderá ser explicada com clareza. Explicado assim por alto, o que #include <iostream.h> faz é incluir no programa o conteúdo do arquivo iostream.h Já dentro da função main() encontra-se a instrução cout<<"Olá Mundo!";, que fará aparecer na tela "Olá Mundo!". A palavra endl diz ao programa para mudar de linha e todas as instruções dentro do main() têm de ser concluídas com ponto e vírgula ';'. Isto não é bem assim, mas por agora terá de servir. Saída formatada Largura da saída: Você pode querer que a sida seja alinhada em colunas, o que significa que a saída deve ser escrita com uma largura fixa. Um programa pode especificar uma largura default para cada item mostrado inserindo o manipulador setw no fluxo ou chamando a função membro width. O manipulador setw e width usam um parâmetro de largura. Exemplo: mostrando uma coluna de números: #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; for (int=I; I < 4; i++) cout << values[i] << ‘\n’; } Os programa mostra a seguinte tela: 1.23 35.36 653.7 4358.224 (repare que os números estão desalinhados) Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 4 de 27 Chamando a função width com um argumento de 10, o resultado seria: #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; for (int i=0; i < 4; i++) { cout.width(10); cout << values[i] << ‘\n’; } } Significa que a saida deve aparecer em colunas de pelo menos 10 caracteres de largura. O resultado seria assim: 1.23 35.36 653.7 4358.224 (a coluna possui 10 caracteres de largura e os números alinhados a direita) Algumas vezes é preciso usar larguras diferentes para dados diferentes. O manipulador setw oferece esta capacidade. Exemplo #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; static char *nomes[]={“Zoot”, “Jimmy”, “Al”,”Stan”}; for (int i=0; i < 4; i++) { cout.<< setw(6) << nomes[i] << setw(10) << values[i] << ‘\n’; } } O resultado seria: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4538.224 Note que a utilização de setw ou width não provoca nenhuma truncagem. Se o valor mostrado for maior do que a largura corrente, o dado inteiro será mostrado mesmo assim. Para restaurar a largura default do objeto, usa a função width ou o setw com um argumento zero. Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 5 de 27 Você pode usar a função fill para definir o valor do caractere de preenchimento para saídas que tem larguras diferentes da default. Exemplo: #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; for (int i=0; i < 4; i++) { cout.width(10); cout.fill(‘*’); cout << values[i] << ‘\n’; } } A saida gerada é: **********1.23 *********35.36 *********653.7 ******4358.224 O asterisco completa o que falta para ficar com o tamanho de 10. Justificando a saída Suponha que você queira que os nomes do exercício anterior fiquem justificados à esquerda e que os números permaneçam justificados à direita. Você pode usar o manipulador setioflags para especificar que a saída deve ser justificada à esquerda ou à direita. Exemplo: #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; static char *nomes[]={"Zoot", "Jimmy", "Al","Stan"}; for (int i=0; i < 4; i++) { cout << setiosflags(ios::left) << setw(6) << nomes[i] << resetiosflags(ios::left) << setw(10) << values[i] << '\n'; } cin.get(); } O resultado seria: Zoot 1.23 Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 6 de 27 Jimmy 35.36 Al653.7 Stan 4538.224 O exercício ajusta a justificação à esquerda usando o manipulador setiosflags com um argumento de ios::left. (isso tem que ser incluído). O manipulador resetiosflags desliga a justificação á esquerda para retornar ao modo default de justificação à direita. Precisão Suponha que você queira que os números de ponto flutuante do exercício anterior sejam mostrados com uma casa decimal. O manipulador setprecision informa ao objeto para usar um determinado número de dígitos de precisão. Exemplo: #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; static char *nomes[]={"Zoot", "Jimmy", "Al","Stan"}; for (int i=0; i < 4; i++) { cout << setiosflags(ios::left) << setw(6) << nomes[i] << resetiosflags(ios::left) << setw(10) << setprecision(1) << values[i] << '\n'; } cin.get(); } O resultado seria: Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003 A notação científica mostrada pode não ser aquilo que o programa precisa mostrar. Existem dois sinalizadores, ios::fixed e ios::cientific, que controlam a maneiro como um número de ponto flutuante é mostrado. Um programa pode ligar e desligar estes sinalizadores utilizando os manipuladores setiosflags e restiosflags. #include <iostream.h> #include <iomanip.h> main() { static double values[]={1.23, 35.36, 653.7,4358.224}; static char *nomes[]={"Zoot", "Jimmy", "Al","Stan"}; for (int i=0; i < 4; i++) { cout << setiosflags(ios::left) << setw(6) << nomes[i] << resetiosflags(ios::left) << setiosflags(ios::fixed) << setw(10) << setprecision(1) << values[i] << '\n'; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 7 de 27 } cin.get(); } O O resultado seria: Zoot 1.2 Jimmy 35.4 Al 653.7 Stan 4358.2 O exercício a seguir usa o manipulador setiosflags para ligar o sinalizador ios::fixed, de modo que o programa não mostre mais os números em notação científica. OBSERVAÇÕES IMPORTANTES Os dois comandos a seguir são semelhantes: cout.put(‘A’); cout << ‘A’; Os dois commandos a seguir também são semelhantes: cin.getline(nome, 35); (considerando um char com 35 posições) gets(nome); Os dois commandos a seguir também são semelhantes: cin.get(ch); cin >> ch; (considerando ch uma variável tipo char) Não há nada melhor para aprender estes conceitos que experimentar! Faça um programa parecido, mude as palavras... E já agora um pouco de teoria extra. Existem três momentos na realização de um programa: design time (tempo de criação do código), compile time(quando o compilador está a criar o executável) e run time(durante a execução do programa). Lendo Valores da Entrada Padrão (teclado) Variáveis e Seus Tipos Até aqui já sabemos escrever na saída padrão, mas é fundamental que escrevamos aquilo que queremos e quando queremos. Ao escrever cout<<"Olá!; sempre que rodarmos o programa aparecerá "Olá!", e se quisermos escrever outras coisas? O conceito de variável nasce daqui. Variável é tipo uma gaveta onde temos um valor que pode mudar quando quisermos e há vários tipos de variáveis, sendo as mais simples as seguintes: // declaração de variáveis int main() { int a; // cria uma variável numérica de tipo inteiro com o nome a double b; // cria uma variável real com o nome b char c; // cria uma variável que contém um único caractér bool d; // cria uma variável booleana (true ou false) return 0; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 8 de 27 } Isto assim não dá muito jeito, é preciso poder alterar o conteúdo das variáveis. Para isso existe o operador '='. O exemplo seguinte mostra como declarar, inicializar e mostrar na saída padrão variaveis. // declaração, inicialização e escrita de variáveis na saída padrão #include <iostream.h> int main() { int a; // declarar a variável a como inteiro a = 2; // atribui a variável a com o número 2 cout<<"a = "<< a<<endl; // escreve na saída padrão a = 2 double b = 1.2; // declarar e inicializar a variável b com 1,2 /* atenção que no C++ a vírgula ',' é representada por um ponto '.' */ cout<<"b = "<< b<<endl; // escreve b = 1.2 char c = 'C'; // declarar e inicializar a variável c com o caractér 'C' cout<<"Linguagem "<< c <<"++"<<endl; /* escreve Linguagem C++ */ return 0; } As variáveis podem ter qualquer nome e é diferente escrever int verde; e int Verde; Serão criadas duas variáveis distintas. Não sei se reparou mas por vezes uso aspas ' " ', e outras vezes a apóstrofo ' ' ' para representar texto. Isto funciona assim, texto entre aspas é considerado uma string (conjunto de caracteres) e entre apóstrofo(aspas simples) um único caracter. O tipo bool apenas suporta os valores 1(true) ou 0(false). A sua utilidade será verificada mais à frente. Lendo da Entrada Padrão (teclado) Em programação é muito comum precisarmos de pedir valores ao usuário do programa em run time. Para isso usa-se um método semelhante ao cout<<""; // declaração, inicialização e escrita de variáveis na saída padrão #include <iostream.h> // a variável de leitura também se encontra neste Arquivo int main() { int a; // declaração da variável a cout<<"introduza um número inteiro:"<<endl; cin>>a; // lê do teclado um valor inteiro e guarda na variável a cout<<endl<<"Acabou de introduzir o número: "<< a << endl; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 9 de 27 cout<<"Pressione ENTER para terminar o programa."; cin.get(); // espera que o usuário pressione ENTER } A melhor maneira de aprender o conceito de cin, é testar o programa. Resumidamente o que ele faz é parar o programa à espera que o usuáro introduza um número seguido de ENTER. Outra novidade é a instrução cin.get(); Se alguém experimentou testar algum dos programas anteriores clicando no seu executável, com certeza que não viu nada! Isto porque não havia nada que indicasse ao programa para parar, para que o usuario pudesse ver o que estava a acontecer! O cin.get(); faz com que o programa pare, à espera da tecla ENTER por parte do usuário. Variáveis Constantes Pode haver a necessidade de se ter uma variável constante, que não mude durante a execução do programa, para isso basta fazer const in a =10; Desta forma o a permanecerá igual a 10 durante todo o programa. A utilidade das variáveis constantes será verificada novamente quando falarmos de arrays. Nos próximos capítulos vamos-nos debruçar sobre os tipos de variáveis numéricas, só depois falando do char. Operações aritméticas com variáveis numéricas Este capítulo mostra como efetuar cálculos na Linguagem C++ com base num exemplo prático. A tabela seguinte mostra os operadores aritméticos do C++: operador exemplo descrição = a = b = c; o exemplo teria o seguinte resultado a = ( b = c ) + a = b + c; guarda na variável a a soma de b e c - a = b - c; guarda na variável a a diferença entre b e c * a = b * c; guarda na variável a o produto de b e c / a = b / c; guarda na variável a a divisão de b com c Desta maneira representam-se as operações aritméticas básicas. Contudo oC++ disponibiliza outros operadores (de conveniência): operador o mesmo que: a += b; a = a + b; a -= b; a = a -b; a /= b; a = a / b; a *= b; a = a *b; a %= b; a = a % b; a; a = a + 1; --a; a = a - 1; Para aquele que está a aprendendo, penso que a instrução a=a+b; poderá ser um pouco confusa. O que vai se passar é o seguinte: o a armazenará a soma do seu valor com b. Se a=2 e b=3, (a=a+b) é o mesmo que (a=2+3). Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 10 de 27 Para solidificar esta teoria, fica aqui um exemplo prático. O objetivo deste programa é pedir ao usuário 3 números e apresentar a sua média. // média de 3 valores #include <iostream.h> int main() { // declarações das variáveis int a, b, c; // o mesmo que int a; int b; int c; double media; /* variável para armazenar o valor da média, double porque o resultado pode não ser inteiro */ cout<<"Introduza 3 números inteiros: "; cin>> a >> b >> c; // o mesmo que cin>>a; cin>>b; cin>>c; // calcular a média media = (a+b+c) / 3; // apresentar o resultado cout<< endl<< "A média é: "<< media<< endl; cout<<"Enter para terminar"; cin.get(): return 0; } Operadores de Incremento e Decremento Existem dois tipos de operadores de incremento e decremento: exemplo: ++i; i++; No primeiro caso a variável é incrementada e retorna o seu valor. No segundo, primeiro é retornado o valor da variável i e só depois esta é incrementada. Exemplo prático: #include <iostream.h> int main() { int i = 2, j = 3; // declaração e inicialização das variáveis j e i int a = 0; // para testes a = ++i; // a=3, i=3 a = j++; // a=3, j=4 --i; // i = 2 j--; // j=3 Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 11 de 27 return 0; } Instruções de controle de execução com operadores lógicos Já aprendemos a usar variáveis, a fazer cálculos e apresentar resultados. Agora chega a parte de aprender a fazer com que o nosso programa tome decisões, decida entre fazer isto ou aquilo, fazer a mesma coisa um número pré-definido de vezes, ou simplesmente enquanto nós quisermos! Nos próximos capítulos falaremos do que são as instruções de Controle e Execução, porém, para as podermos utilizar convenientemente e com sabedoria, é necessário primeiro conhecer os operadores lógicos. Operadores Lógicos As seguintes tabelas definem todos os operadores lógicos do C++. Sejam a e b duas variáveis booleanas (do tipo bool): Operação AND (&&) a b a && b 0 0 0 0 1 0 0 0 0 1 1 1 Operação OR ( || ) a b a | | b 0 0 0 0 1 1 1 0 1 1 1 1 Operação IGUAL ( = = ) a b a b 0 0 1 0 1 0 0 0 0 1 1 1 Lembre-se que um bool apenas permite os dois valores lógicos true e false. Tente fazer o seguinte exercício: int main() { Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 12 de 27 bool b = true, c = false; bool a = 0; /* embora se possa inicializar ou atribuir um bool com 0 ou 1 recomenda-se sempre que se use true ou false */ // exemplo b = !a; // b passou a false c = a || b; // c continua a false // tente encontrar o novo valor de a a = (!b) || (a && c); return 0; } Operadores Relacionais operador descrição a > b retorna true se a maior que b a < b retorna true se a menor que b a <= b retorna true se a menor ou igual a b a >= b retorna true se a maior ou igual a b a == b retorna true se a igual a b a != b retorna true se a diferente de b Instrução if-else A instrução if-else tem a seguinte sintaxe: if( <teste> ) <instrução 1> else <instrução 2> ou simplesmente if( <teste> ) <instrução 1> No primeiro caso, se <teste> for true, então realizar-se-á a <instrução 1>, se for false passa para a <instrução 2>. No segundo caso apenas se <teste> for true se poderá efetuar a <instrução 1>. Vejamos o seguinte exemplo prático: #include <iostream.h> int main() { int a, b; // pedir dois valores inteiros Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 13 de 27 cout<<"Introduza 2 valores inteiros: "<< endl; cin>>a>>b; if( a == b ) cout<<"Os valores sao iguais!"; else cout<<"Os valores sao diferentes!"; cin.get(); return 0; } No parâmetro de teste do if pode-se ter qualquer expressão, mas só será efetuada a instrução correspondente se o resultado dessa expressão for true. Talvez você se pergunte: Então e se eu quiser por mais que uma instrução? Aqui entra o conceito de scopo. Um scopo é sempre limitado por chaves, por exemplo, existe o scopo da função main. Penso que com o seguinte exemplo as coisas se tornarão mais claras: #include <iostream.h> int main() { int a, b; // pedir dois valores inteiros cout<<"Introduza 2 valores inteiros: "<<endl; cin>>a>>b; if( a == b ) { cout<<"Os valores são iguais!"; cout<<"Veja, foi usada outra instrução dentro deste if!"; } else{ cout<<"Os valores são diferentes!"; } cin.get(); } Se a condição do if for true, ele realiza a instrução seguinte, e um scopo é um conjunto de instruções (também pode ter só uma como se vê no else). Atenção que uma variável declarada dentro de um scopo deixa de existir fora dele! Exemplo: #include <iostream.h> int main() { bool b = true; if(b){ // entrará sempre pois b = true int a = 4; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 14 de 27 cout<<"a= "<<4; } a = 3; // ERRO!!! /* a variavel só existe dentro do scopo em que foi declarada! */ } Operador Ternário O operador ternário é um caso especial de if e tem a seguinte sintaxe: ( <teste> ) ? <instrução 1> : <instrução 2>; Programa exemplo em que o operador ternário recebe a variável a com o módulo da variável b. Para os mais esquecidos chama-se módulo de um número à sua versão positiva, exemplo: módulo de -1 é 1, módulo de 2 é 2, módulo de 0 é 0; #include <iostream.h> int main() { int a, b; cout<<"Introduza um número inteiro diferente de zero:"; cin>>b; a = ( b>0) ? b : -b; /* lê-se: o b é maior que 0? se sim retorna b : se não retorna -b */ cout<<"O modulo de "<<b<<" é "<<a; cin.get(); } Instrução Switch Penso que o switch é fácil de compreender e penso também que a melhor maneira de explicar é através de um exemplo prático: #include <iostream.h> int main() { char c; cout<<"Introduza uma vogal minúscula:"<<endl; cin>>c; switch(c) { case 'a': cout<<"Introduziu um a!"<<endl; break; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 15 de 27 case 'e': cout<<"Introduziu um e!"<<endl; break; case 'i': cout<<"Introduziuum i!"<<endl; break; case 'o': cout<<"Introduziu um o!"<<endl; break; case 'u': cout<<"Introduziu um u!"<<endl; break; default: // se a variável do switch não for nenhuma das anteriores cout<<"Não introduziu uma vogal!"<<endl; break; } cin.get(); } O switch vai ver qual a variável, caso seja uma das opções de que dispõe, faz as instruções necessárias. O break faz com que se saia imediatamente do switch e não é obrigatório em cada case. #include <iostream.h> // programa que diz se um número introduzido é maior, igual ou menor que 3 int main() { int a; cout<<"Introduza um número entre 0 e 5:"<<endl; cin>>a; switch(a) { case 0: case 1: case 2: cout<<"O número "<<a<<" é menor que 3!"; break; case 3: cout<<"O número "<<a<<" é igual a 3!"; break; case 4: Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 16 de 27 case 5: cout<<"O número "<<a<<" é maior que 3!"; break; default: cout<<"Não introduziu um número entre 0 e 5..."; break; } cin.get(); } Instrução While A sintaxe do while é a seguinte: while( <teste> ) <instrução> Para este programa de exemplo, devo fazer uma introdução. O cin.get() que usávamos para esperar por um ENTER, na verdade lê qualquer caracter, e podemos inclusive fazer char a=cin.get(); Mais, há vários caracteres especiais (dos quais falaremos mais à frente). O que vamos usar no próximo programa é o '\n', que tem a função de mudar de linha. Fazer cout<<"Olá"<<endl; é o mesmo que fazer cout<<"Olá \n"; Quando o usuário aperta a tecla ENTER o cin.get() retorna o caractér '\n'. #include <iostream.h> // programa que pede que o usuário escreva uma linha de texto e conta os caracteres int main() { unsigned charCount = 0; // inteiro sem sinal, >= 0 cout<<"Introduza uma linha de texto:"<<endl; while( cin.get() != '\n' ) // enquanto o usuário não teclar ENTER ++charCount; // conta o caractér cout<<"\nDigitou "<< charCount <<" caracter" << ( charCount != 1 ? "es." : "." ) <<endl; cin.get(); return 0; } Este programa já é mais complicado, mas temos de começar a evoluir... Enquanto a condição de teste dentro do while for true, ou seja, enquanto o usuário não digitar ENTER, realizar-se-á a instrução charCount. Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 17 de 27 Exemplo: Tutorial de c++ <ENTER> O programa irá ler todos os caracteres até encontrar <ENTER> e por cada caracter que ler incrementará o charCount. Parece ser complicado entender isto, mas tem de testar o programa e ver como ele funciona, só assim compreenderá. Depois de contar o número de caracteres aparece um cout um pouco esquisito... Penso que ninguém tem dúvidas que o operador ternário está lá para completar a frase com "." ou com "ers.", consoante o número de caracteres. No cout, em vez de fazer cout<<"Atirei o pau ao gato"<<endl; cout<<"Mas o gato assustou-se..."<<endl; Pode-se fazer: cout<<"Atirei o pau ao gato"<<endl <<"Mas o gato assustou-se..."<<endl; Que é o mesmo que cout<<"Atirei o pau ao gato"<<endl<<"Mas o gato assustou-se..."<<endl; Instrução do-while Na instrução while, primeiro testa-se a condição e somente depois se prossegue com as instruções. No entanto poderá haver casos em que se queira fazer primeiro a instrução e só depois testar a condição. #include <iostreamh> // programa que soma números até o usuário escolher -1 int main() { int soma = 0, num=0; cout<<"Introduza vários números. -1 para acabar"<<endl; do{ soma += num; cin>>num; } while( num != -1 ); cout<<"Soma: "<<soma; cin.get(); } Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 18 de 27 Penso que é com exemplos que se aprende. Parece-me que é um bom método tentar descobrir o que cada programa faz sozinho! Lembre-se que acompanhando um programa que está explicado e percebê-lo, não tem nada a ver com saber programar! uma coisa é perceber quando explicam, outra é criar as coisas sozinho! Instrução For A sintaxe do for é a seguinte: for( <inicialização> ; <teste> ; <incremento> ) <instrução> Programa de exemplo: #include <iostream.h> // programa que escreve o alfabeto int main() { for( char c = 'A'; c <= 'Z' ; ++c ) { cout<<' '<< c; if( (c - 'A' + 1) % 4 == 0 ) cout<<endl; /* esta parte serve para mudar de linha de 4 em 4 caractéres */ } return 0; } É claro que em vez de um char podia-se ter um utilizado um int, ou qualquer outra coisa. Usei o char neste exemplo para mostrar esta potencialidade do C++. O for funciona assim: 1. Primeiro, faz o que se pede na iniciação: char c = 'A'; 2. faz o teste, se for true, realiza as instruções, se for false sai do for: cout<<' '<< c; if( (c - 'A' + 1) % 4 == 0 ) cout<<endl; 3. Realiza o incremento: ++c; 4. Volta ao ponto 2 Sublinho que só se sai do for quando o teste for false! Ou seja, quando a variável c for 'Z'. De seguida estão vários exemplos do for. #include <iostream.h> // programa que pede um caracter e um numero(n) e escreve esse caracter n vezes int main() { Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 19 de 27 int num; char c; cout<<"introduza um numero:"; cin>>num; cout<<"introduza um caracter:"; cin>>c; cout<<endl; int i; // não é obrigatório declarar a variável dentro do for for( i = 0; i < num; ++i ) cout<<c; cout<<endl; i = 2; num += 2; // não são obrigatórios os campos do for for( ; i < num; ++i ) cout<<c; cin.get(); } Por vezes utiliza-se mesmo um for forever: // não experimentar este programa int main() { for( ; ; ) // forever! ; /* pode-se dar o caso de se ter um for sem nenhuma instrução específica nesse caso utiliza-se o ';' como se mostra no exemplo. Põe-se na linha seguinte para mostrar que é mesmo essa a intenção do for */ } Não sei que mais dizer sobre o for, penso que com o que foi escrito se pode apreender o conceito do for. Aproveito para deixar um pequeno reparo: // programa de exemplo sobre o scopo do for int main() { for( int a = 0 ; ... ; ... ) { // os pontos significam qualquer coisa .... } a = 2; // já está fora do scopo do for, dará erro? } Pois, isso irá depender do compilador. O Visual C++, por exemplo, faz com que aquela variável a esteja acessível no resto do scopo da função main, não dando erro a instrução a=2; Mas em compiladores como o gcc a coisa já não é assim... Nesses, o scopo da variável é o do for! O que por acaso até é standard C++... Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 20 de 27 Arrays em C++ Para introduzir o conceito dearray, vou começar por apresentar um programa simples, que não contém nada de novo e depois, mostro a utilidade dos arrays. O seguinte exemplo pede 3 números ao usuário e em seguida os mostra pela ordem inversa de inserção: #include <iostream.h> // programa que lê 3 números e os escreve de ordem inversa void main() { // declarar as variáveis int a, b, c; // pedir as variáveis cout<<"Introduza 3 inteiros:"<<endl; cin >> a >> b >> c; // escrever cout<<"Os numeros de ordem inversa:"<<endl <<c<<b<<a; cin.get(); } Este programa cumpre a sua função sem qualquer problema. Mas imaginemos que queríamos fazer o mesmo com... 100 números! Teríamos de declarar 100 variáveis distintas e para lê-las... imaginem o código! Um array é um gênero de uma tabela, e podem ser de qualquer tipo. A sintaxe de um array é a seguinte: tipo nome_variavel[n_elementos]; e cria uma tabela de 0 a n_elementos-1. Vejamos agora o programa utilizando arrays. #include <iostream.h> // programa que lê n números e os escreve de ordem inversa void main() { // declarar as variáveis const int n_elementos = 3; int i; int a[n_elementos]; /* a variável a fica com 3 "casas". a[0], a[1] e a[2] e podemos trabalhar com cada uma delas como sendo variáveis distintas */ // pedir as variáveis for( i=0; i<n_elementos; ++i ) { cout<<"introduza o "<< i <<" Numero: "; cin>>a[ i ]; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 21 de 27 cout<<endl; } // escrever for( i=n_elementos-1; i>=0; --i ) cout<<a[ i ]<<endl; cin.get(); } /* na inicialização de um array também se pode fazer o seguinte: int a[2] = { 1,2 }; o que faria com que a[0]=1 e a[1]=2 */ Em C++ não se pode inicializar arrays com variáveis comuns, só o é possível fazer com constantes. Mais à frente quando falar em apontadores veremos como ultrapassar esta "característica". Chamo à atenção que a0 é diferente de a[0]. São os colchetes que indicam que se trata de um array. a0 é uma variável como qualquer outra. Mais uma vez, a melhor maneira de apreender o conceito de array, é realizar o programa e testá-lo. Ver como funciona! #include <iostream.h> ; // programa que encontra o maior de 10 números lidos void main() { const int n_elementos = 10; int i, e[n_elementos]; cout<<"Introduza 10 números: "<<endl; for( i = 0 ; i < n_elementos ; ++i ) cin>> e[ i ]; int max = 0; // variável que irá conter o índice do valor máximo for( i = 0; i < n_elementos; ++i ) if( e[ i ] > e[ max ] ) max = i; cout<<"O maior número foi o "<< e[ max ] <<" e foi o "<< max <<"º Número a ser introduzido."; cin.get(); } Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 22 de 27 Arrays de caracteres Até agora praticamente só tratamos números. Com arrays de caracteres temos a possibilidade de tratar também strings. Um array de caracteres é um array normal, só que tem letras em cada índice. #include <iostream.h> void main() { // maneiras de inicializar arrays de caracteres char s1[ 5 ] = "Olá\0"; char s2[ 6 ] = { 'A', 'd', 'e', 'u', 's', '\0' }; char nome[10]; cout<<"Introduza o seu nome: (max 10 letras)"<<endl; cin >> nome; cout<< s1 << nome << endl; cout<< s2; cin.get(); } Este exemplo mostra como se pode pedir uma string ao usuário e depois escrevê-la na saída padrão novamente. Note que todas as strings que foram inicializadas têm '\0' como último caractér. Todas as cadeias de caracteres em C++ têm de terminar com '\0', o caractere terminador. Não se podem atribuir arrays; não se poderia fazer nome = "Pedro"; O que se teria de fazer era aribuir cada casa do array com a letra correspondente. Em princípio eu devia neste Tutorial mostrar uma série de algoritmos para tratamento de strings, como concatenar, substituir letras... etc. Não o faço porque o C++ fornece ao usuário um objeto string que já faz essas coisas todas e onde se pode fazer string p,r; p="Pedro"; p += r; Este objeto será tratado mais à frente. Seja como for aconselho aos interessados que procurem noutro lado toda essa matéria relacionada com arrays de caracteres. Tabela de Caracteres Especiais Caracter Descrição \a bell, emite um som \b retrocesso ( backspace ) \0 caractér terminador \f início de página \n mudança de linha Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 23 de 27 \r início de linha \t tab horizontal \v tab vertical \\ backslash \' plica \" aspas \ooo caractér cujo código em octal é ooo \xhh caractér cujo código em hexadecimal é hh Funções em C++ Já tinha dito que a função main é a primeira a ser chamada, é como se fosse o corpo do programa. Mas o C++ não vive só da função main e podemos criar quantas funções quisermos como quisermos a fazer aquilo que quisermos! #include <iostream.h> // programa que introduz as funções void ola_mundo() // declaração + definição { cout<<"OlA Mundo!"<<endl; } void f1() // declaração + definição { cout<<"Estou na funcao f1!"<<endl; } void main() { ola_mundo(); f1(); cin.get(); } O programa entra em main(), quando chega à instrução ola_mundo(); vai à procura dessa função e faz tudo o que ela mandar antes de prosseguir. Sempre usamos a palavra chave void antes da função main. O que ela indicava é que a função não retornava nada. Estas funções são denominadas de procedimentos. Se quisermos que uma função retorne qualquer coisa, mudamos o tipo de retorno. O exemplo seguinte mostra uma função que retorna o maior de 2 valores. #include <iostream.h> // programa que introduz as funções Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 24 de 27 int max( int a, int b ); // declaração void main() { int v1, v2; cout<<"introduza dois inteiros: "<<endl; cin>> v1>> v2; cout<<endl<<"O maior é "<< max(v1,v2) << endl; cin.get(); } int max( int a, int b ) // definição { return a>=b ? a : b; } A função max recebe dois valores como parâmetro, o que se vai fazer é que o compilador irá criar duas variáveis a e b e irá atribui-las com os valores de v1 e v2 respectivamente. É como se fossem criadas cópias dos valores originais. Todas as funções que retornam alguma coisa têm obrigatoriamente de ter a palavra return. No caso da função max o operador ternário irá ver qual o maior e retorna esse valor. Sempre que o return é chamado a função acaba, e pode ser chamado em qualquer lugar do programa. Aproveito para lançar também o conceito de variável global. Se houvesse uma variável declarada fora da função main ela estaria acessível em todas as funções do programa. Exemplo: #include <iostream.h> //variável global int v1; int max( int a, int b ); // declaração void main() { int a; v1 = 2; // correcto, v1 está acessível pois é global } void f1() // definição { v1 = 5; // correto, v1 está acessível pois é global a = 2; // ERRO! variável declaradana função main e portanto só está acessível em // main! teria de haver também uma declaração int a; nesta função para que // não desse erro Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 25 de 27 } Mais uma coisa, é standard C++ que o tipo de retorno da função main seja inteiro. Há mesmo compiladores que não aceitam void main(). Por norma usa-se int main() { /.. / return 0; } A partir de agora não usarei mais void main(). Para solidificar o conceito de função e fazer uma revisão em tudo o que já foi falado, vou deixar aqui um jogo simples. O objetivo será o usuário adivinhar uma palavra que só o programa saberá. Não passo aqui o código pois iria ocupar muito espaço. Todas as funções e variáveis estão comentadas e explicadas. Tente fazer uma evolução do jogo, incluir alguns temas, mais palavras, por mais opções! Enumerações e Estruturas As enumerações são uma alternativa a definir constantes e, visto que em C++ são mesmo um tipo, são mesmo muito úteis. Exemplo: enum { GREEN, YELLOW, RED }; era o mesmo que criar três constantes com os valores 0, 1 e 2. Por padrão o primeiro valor de uma enum é zero. Exemplos: enum Mes { JAN = 1, FEV, MAR, ABR, MAI, JUN, JUL, AGO, SET, NOV, DEZ }; // o valor de FEV = 2, MAR = 3... por ai adiante Mes mes; // ... switch( mes ) { case JAN: //... break; case FEV: //... break; } As enums ajudam muito em termos de raciocínio pois podemos usar palavras para descrever o que quisermos. Por norma as constantes são escritas com letras maiúsculas. Estruturas Uma estrutura em C servia para agrupar diferentes variáveis. Em C++ é muito mais poderosa dando para incluir construtores e métodos, mas destes assuntos só falarei no capítulo das classes. Aqui veremos as estruturas como agrupamentos de variáveis. #include <iostream.h> enum Especialidade { VENDAS, PUBLICIDADE }; struct Empregado { int num; int idade; Especialidade esp; }; Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 26 de 27 void main() { // diferentes maneiras de inicalizar estruturas Empregado emp1 = { 1, 35, VENDAS }; Empregado emp2; // utiliza-se o ponto '.' para se referenciar a cada atributo da variavel emp2 emp2.num = 2; emp2.idade = 19; emp2.esp = PUBLICIDADE; cout<<"Empregados:" <<endl<< emp1.num <<", "<< emp1.idade <<" anos. Especialidade: "<< emp1.esp <<endl<< emp2.num <<", "<< emp2.idade <<" anos. Especialidade: "<< emp2.esp; cin.get(); } Quando se faz cout<<emp1.esp; não aparecerá escrito VENDAS, mas sim 0, que é o valor da constante lógica. Objeto String Como já tinha referido, o tratamento de cadeias de caracteres exigia certos algoritmos e conhecimento de variadas funções. Em C++ foi criado um objeto string que facilita muito a tarefa do programador. Este já não precisa de se preocupar com os arrays dinâmicos de caracteres e ganha inclusive em eficiência. #include <string.h> // necessário para se ter acesso ao objeto string #include <iostream> // demonstração do uso de strings int main() { string nome, sobrenome; cout<<"Introduza o seu nome:"<<endl; cin >> nome; cout<<"Então " + nome + ", que tal este Tutorial? :) "<<endl; cout<<"Qual o seu último nome?"<<endl; cin >> sobrenome; sobrenome = " " + sobrenome; // para ficar " Sobrenome" nome += sobrenome; // para ficar "Nome Sobrenome" Curso de Rede de Comutadores Algoritmo e Estrutura de Dados Apostila de C++ Página 27 de 27 cout<<"O seu nome completo é: "<< nome; cin.get(); return 0; } Penso que este exemplo demonstra algumas das facilidades dadas pelo objeto string. De fato, tratar strings como um objeto em vez de como um array de caracteres é mesmo muito prático. Acesso Arquivos A sintaxe de escrita e leitura num Arquivo de texto é igual àquela usada no cout e no cin, só que desta vez somos nós que declaramos as variáveis, com o Arquivo pretendido. Para se ler de um Arquivo usa-se um objecto ifstream( de input file stream ) e para escrita usa-se o ofstream ( de output file stream ). Vejamos o seguinte exemplo: #include <fstream.h> // necessário para se ter acesso a Arquivos #include <iostream.h> // demonstração de escrita e leitura em Arquivos int main() { char aux[10]; // criar o Arquivo ofstream out("output_file.txt"); // agora irá escrever no Arquivo out << "Arquivo criado recorrendo à biblioteca fstream do C++"<<endl; // fechar o Arquivo out.close(); // abrir novamente o Arquivo,mas agora para leitura ifstream in("output_file.txt"); // ler e escrever no standard input while( in >> aux ) // enquanto houver alguma coisa para ler cout<<aux<<" "; cout<<endl; cin.get(); return 0; } Não é necessário fechar o Arquivo in porque ele é fechado automaticamente quando a função em que está acaba. Falando de acesso a Arquivos em modo texto, não há muito mais para dizer, mas deixo só mais um exemplo, que por ser um pouco grande, não passo aqui. Esse programa irá pedir um caractere ao usuário e irá mostrar o seu número de ocorrências num determinado Arquivo.
Compartilhar