A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem.

Apresentações semelhantes


Apresentação em tema: "Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem."— Transcrição da apresentação:

1 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

2 Introdução a algoritmos, programação, e estruturas de dados Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

3 Ementa  Algoritmos  Programas de computador  Introdução ao C++  Expressões  Passagem de argumentos a funções  Estruturas de seleção  Estruturas de repetição  Arranjos  Manipulação de textos  Tipos de dados definidos pelo programador  Arquivos  Estruturas de dados (listas, filas e pilhas) Material: www.infocefetnf.pro.br/rodrigoreisgomes/

4 Algoritmos Palavra estranha Comum no cotidiano Definição:  Sequência ordenada, finita e não ambígua de passos que levam à solução de um dado problema

5 Algoritmos Palavra estranha Comum no cotidiano Definição:  Sequência ordenada, finita e não ambígua de passos que levam à solução de um dado problema  Têm a capacidade de receber dado(s) do mundo exterior fornecer um resultado ao mundo exterior  Todos os passos especificados no algoritmo precisam ser alcançáveis em um tempo finito

6 Algoritmos Exemplos:  Instruções para utilizar um aparelho eletrodoméstico  Receita de preparo de algum prato  Informações para alguém chegar em algum destino

7 Algoritmos Exemplo – Como trocar uma lâmpada queimada (fria e no teto)  Pegar uma escada  Posicionar a escada sob a lâmpada queimada  Pegar uma lâmpada nova  Subir na escada com a lâmpada nova  Retirar a lâmpada queimada  Colocar a lâmpada nova  Descer da escada com a lâmpada queimada  Guardar a escada  Desfazer-se da lâmpada queimada

8 Algoritmos Exemplo – Como trocar uma lâmpada queimada (fria e no teto) Dados de entrada do mundo exterior:  Escada  Lâmpada Resultado fornecido ao mundo exterior:  Lâmpada funcionando perfeitamente

9 Programas de computador Escreva “oi”. 00110101 01000111 11100001 11111001 ??? Linguagens de programação

10 Programas de computador Linguagens de programação  Suposição Código para escrever algo na tela: 00001111 Código do caractere ‘o’: 10010110 Código do caractere ‘i’: 01101001 Comando para escrever oi na tela: 000011111001011001101001  Dificuldade de programação Memorização dos códigos  Linguagens de programação – C++ Compilação Execução

11 Programas de computador Exercícios 1 – O que é uma linguagem de programação? 2 – Por que uma linguagem de programação é importante para quem cria programas de computador? 3 – Cite um exemplo de uma linguagem de programação. 4 – O que significa compilar um programa? 5 – O que significa executar um programa?

12 Introdução ao C++ Linguagem C++  Ano de criação: 1983  Criador: Bjarne Stroustrup  Tornou-se LP de propósito geral  Há compiladores C++ para quase todas arquiteturas de computadores Material: http://www.codeblocks.org/downloads/26

13 Introdução ao C++ LP (Linguagem de Programação) tipada  Cada estrutura está associada a um tipo

14 Introdução ao C++ LP (Linguagem de Programação) tipada  Cada estrutura está associada a um tipo Tipos da LP TipoTamanhoValores char08 bits‘a’, ‘Z’, ‘ ’, ‘+’, etc. short int16 bits-32767 a 32767 unsigned short int16 bits0 a 65535 int (ou long int)32 bits-2147483647 a 2147483647 unsigned long int32 bits0 a 4294967295 float32 bitsSeis dígitos de precisão double64 bitsDez dígitos de precisão long double96 bitsDez dígitos de precisão bool32 bitstrue false

15 Introdução ao C++ LP (Linguagem de Programação) tipada  Cada estrutura está associada a um tipo Tipos da LP TipoTamanhoValores char08 bits‘a’, ‘Z’, ‘ ’, ‘+’, etc. short int16 bits-32767 a 32767 unsigned short int16 bits0 a 65535 int (ou long int)32 bits-214483647 a 2147483647 unsigned long int32 bits0 a 4294967295 float32 bitsSeis dígitos de precisão double64 bitsDez dígitos de precisão long double96 bitsDez dígitos de precisão bool32 bitstrue false Caracteres são representados entre aspas.

16 Introdução ao C++ LP (Linguagem de Programação) tipada  Cada estrutura está associada a um tipo Tipos da LP TipoTamanhoValores char08 bits‘a’, ‘Z’, ‘ ’, ‘+’, etc. short int16 bits-32767 a 32767 unsigned short int16 bits0 a 65535 int (ou long int)32 bits-214483647 a 2147483647 unsigned long int32 bits0 a 4294967295 float32 bitsSeis dígitos de precisão double64 bitsDez dígitos de precisão long double96 bitsDez dígitos de precisão bool32 bitstrue false Caracteres são representados entre aspas. Parte inteira e parte fracionária separadas por ponto.

17 Introdução ao C++ LP compilada para programas modularizados Módulos

18 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos }

19 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } int

20 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } float int

21 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } char float int

22 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } bool char float int

23 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } void bool char float int

24 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } tipoP1 nomeP1, tipoP2 nomeP2,... void bool char float int

25 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } tipoP1 nomeP1, tipoP2 nomeP2,... void bool char float int return (expressão);

26 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } tipoP1 nomeP1, tipoP2 nomeP2,... void bool char float int return (expressão); Os nomes do módulo e dos seus parâmetros devem ser identificadores.

27 Introdução ao C++ Identificadores  Primeiro caractere: letra ou sublinha  Demais caracteres: letra ou sublinha ou algarismo  Não pode ser uma palavra reservada  Uma letra não pode ter acento nem cedilha break case char const continue default do double else enum extern float for goto if include int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

28 Introdução ao C++ Identificadores  Exemplos A1BC

29 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d

30 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d

31 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno

32 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno

33 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto

34 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto

35 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto float

36 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto float

37 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto float média_final

38 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto float média_final

39 Introdução ao C++ Identificadores  Exemplos A1BC XA,1d NomeDoAluno nome_do_aluno 198_Aberto float média_final media_final

40 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) { // bloco de comandos } tipoP1 nomeP1, tipoP2 nomeP2,... void bool char float int return (expressão); Os nomes do módulo e dos seus parâmetros devem ser identificadores.

41 Introdução ao C++ LP compilada para programas modularizados Módulos tipoDeRetorno nome (listaDeParâmetros) int main( ) { /*************************************************** main() é o módulo principal do C main() é projetado para retornar int alguns compiladores aceitam o retorno void ***************************************************/ } tipo de retorno nome parâmetros

42 Introdução ao C++ Saída de dados  cout Escreve um texto na tela Sintaxe cout << texto a ser escrito; Exemplo #include using namespace std; main() { cout << "oi"; // "oi" é enviado ao objeto padrão de saída, a tela } Textos são escritos entre aspas. cout está programado no escopo std do arquivo iostream

43 Introdução ao C++ Entrada de dados  getch Lê um caractere do teclado Sintaxe getch(); Exemplo #include using namespace std; main() { cout << "oi"; getch(); } getch serve para provocar um atraso na execução do programa. getch está programado no arquivo conio.h.

44 Introdução ao C++ Variáveis  Posição de memória cujo conteúdo pode ser modificado no decorrer da execução do programa  Declaração tipo identificador; tipo identificador1, identificador2,..., identificadorN;  Exemplos int dia, mes, ano; char sexo; float salario;

45 Introdução ao C++ Constantes  Posição de memória cujo conteúdo NÃO pode ser modificado no decorrer da execução do programa  Declaração const tipo identificador = valor;  Exemplos const float pi = 3.1415; const float salarioMinimo = 724.00;

46 Introdução ao C++ E/S com cout e cin #include using namespace std; main() { int dia, mes, ano; cout << "Digite o dia de seu nascimento: "; cin >> dia; cout << "Digite o mes de seu nascimento: "; cin >> mes; cout << "Digite o ano de seu nascimento: "; cin >> ano; cout << "Voce nasceu em " << dia << "/" << mes << "/" << ano << "."); getch(); } Na construção de um texto, separamos constantes e variáveis com <<.

47 Introdução ao C++ Comentários  Exemplos  de mais de uma linha /* comentário */  de uma única linha // comentário #include using namespace std; main() { int numero; cout << "Escreva um numero inteiro: "; cin >> numero; // E se for fornecido um número real? /* Se o usuário inserir um número real (com casas decimais), somente a parte inteira deste número será considerada. */ cout << "Voce escolheu o numero " << numero << “."; getch(); }

48 Introdução ao C++ Formatação de saída numérica #include using namespace std; main() { float numero; cout << "Escreva um numero qualquer: "; cin >> numero; // A saída não está formatada. cout << "Voce escolheu o numero " << numero << "."; getch(); }

49 Introdução ao C++ Formatação de saída numérica #include using namespace std; main() { float numero; cout << "Escreva um numero qualquer: "; cin >> numero; // A saída não está formatada. cout << "Voce escolheu o numero " << numero << "."; getch(); }

50 Introdução ao C++ Formatação de saída numérica #include using namespace std; main() { float numero; cout << "Escreva um numero qualquer: "; cin >> numero; // A saída não está formatada. cout << "Voce escolheu o numero " << numero << "."; getch(); }

51 Introdução ao C++ Formatação de saída numérica #include using namespace std; main() { float numero; cout << "Escreva um numero qualquer: "; cin << numero; cout << "Voce escolheu o numero " << setprecision(3) << numero << "."; getch(); }

52 Introdução ao C++ Caracteres de barra invertida #include using namespace std; main() { int posicao; char letra; cout << "Escreva um número de 1 a 26:\n"; cin >> posicao; cout << "Qual a letra que ocupa esta posição no alfabeto?\n"; cin >> letra; cout << "A letra “ << letra << " esta na posicao " << posicao << “ no alfabeto."; getch(); }

53 Introdução ao C++ Caracteres de barra invertida CaractereSignificado \bRetrocesso (BS) \fAlimentação de formulário (FF) \rRetorno de carro (CR) \tTabulação horizontal (HT) \”Aspas \’Apóstrofo \0Nulo \\Barra invertida \vTabulação vertical \aAlerta (beep)

54 Introdução ao C++ Textos como tipos de dados  Declaração da variável string identificador; string programado no arquivo string.

55 Introdução ao C++ Textos como tipos de dados #include using namespace std; main() { string nome; cout << "Digite seu nome: "; cin >> nome; /* Inconveniente: O objeto “cin" entende o caractere espaço como o final de um valor. */ cout << "Bem vindo ao mundo da computacao, " << nome << “.”); getch(); }

56 Introdução ao C++ Textos como tipos de dados #include using namespace std; main() { string nome; cout << "Digite seu nome: "; cin >> nome; /* Inconveniente: O objeto “cin" entende o caractere espaço como o final de um valor. */ cout << "Bem vindo ao mundo da computacao, " << nome << “.”); getch(); }

57 Introdução ao C++ Textos como tipos de dados #include using namespace std; main() { string nome; cout << "Digite seu nome: "; getline(cin, nome); /* Inconveniente: O objeto “cin" entende o caractere espaço como o final de um valor. */ cout << "Bem vindo ao mundo da computacao, " << nome << “.”); getch(); }

58 Introdução ao C++ Exercícios do capítulo 1

59 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

60 Expressões Combinação de operadores que atuam sobre constantes, variáveis e funções

61 Expressões Combinação de operadores que atuam sobre constantes, variáveis e funções  Operadores: atribuição aritméticos relacionais lógicos

62 Expressões Atribuição identificador = expressão

63 Expressões Atribuição identificador = expressão  Exemplos A = 2; NOTA = 10; SEXO = ‘M’; Estado = “RJ”; X = 2.5; B = A;

64 Expressões Atribuição identificador = expressão  Exemplos A = 2; NOTA = 10; SEXO = ‘M’; Estado = “RJ”; X = 2.5; B = A;  Identificador e expressões com mesmo tipo

65 Expressões Operadores aritméticos

66 Expressões Operadores aritméticos

67 Expressões Operadores aritméticos x = 2; y = 5.0;

68 Expressões Funções numéricas predefinidas É preciso incluir o arquivo de cabeçalho math.h #include

69 Expressões Operadores relacionais  Binários (dois operandos)  Operandos caracteres e números  Resultado bool

70 Expressões Operadores relacionais e o tipo char  Tabela ASCII (American Standard Code for Information Interchange)

71 Expressões Operadores relacionais e o tipo char *  Comparação caractere por caractere “JOAO” < “JOSE” (ASCII(‘J’) = 74) = (ASCII(‘J’) = 74) (ASCII(‘O’) = 79) = (ASCII(‘O’) = 79) (ASCII(‘A’) = 65) < (ASCII(‘S’) = 83)

72 Expressões Operadores lógicos  Binários ( && e ||)  Unário ( !)  Operandos (bool)  Resultado (bool) && retorna true quando ambos os operandos forem true || retorna false quando ambos os operandos forem false ! inverte o valor lógico do seu operando

73 Expressões Prioridade dos operadores

74 Expressões Exercícios do capítulo 2

75 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

76 Passagem de argumentos a funções Passagem de argumentos por valor 01 #include 02 using namespace std; 03 void troca(int x, int y) 04 { 05 int aux; 06 aux = x; 07 x = y; 08 y = aux; 09 } 10 main() 11 { 12 int a, b; 13 cout "; 14 cin >> a; 15 cout "; 16 cin >> b; 17 troca(a, b); 18 cout << "Os valores finais para A e B sao “ << a << “e" << b << “."; 19 getchar(); 20 }

77 Passagem de argumentos a funções Passagem de argumentos por valor 01 #include 02 using namespace std; 03 void troca(int x, int y) 04 { 05 int aux; 06 aux = x; 07 x = y; 08 y = aux; 09 } 10 main() 11 { 12 int a, b; 13 cout "; 14 cin >> a; 15 cout "; 16 cin >> b; 17 troca(a, b); 18 cout << "Os valores finais para A e B sao “ << a << “e" << b << “."; 19 getchar(); 20 } Funciona?

78 Passagem de argumentos a funções Passagem de argumentos por valor Funcionamento da memória: execução: 1, 2, 10, 11, 12, 13, 14, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 18, 19, 20 01 #include 02 using namespace std; 03 void troca(int x, int y) 04 { 05 int aux; 06 aux = x; 07 x = y; 08 y = aux; 09 } 10 main() 11 { 12 int a, b; 13 cout "; 14 cin >> a; 15 cout "; 16 cin >> b; 17 troca(a, b); 18 cout << "Os valores finais para A e B sao “ << a << “e" << b << “."; 19 getchar(); 20 } Identificador Posição Valor a 528 b 524 x 520 y 516 aux 512 5 10 5 5 5

79 Passagem de argumentos a funções Argumentos valor X argumentos referência 01 #include 02 using namespace std; 03 void troca(int x, int y) 04 { 05 int aux; 06 aux = x; 07 x = y; 08 y = aux; 09 } 10 main() 11 { 12 int a, b; 13 cout "; 14 cin >> a; 15 cout "; 16 cin >> b; 17 troca(a, b); 18 cout << "Os valores finais para A e B sao “<< a << “e" << b << “."; 19 getchar(); 20 } 01 #include 02 using namespace std; 03 void troca(int &x, int &y) 04 { 05 int aux; 06 aux = x; 07 x = y; 08 y = aux; 09 } 10 main() 11 { 12 int a, b; 13 cout "; 14 cin >> a; 15 cout "; 16 cin >> b; 17 troca(a, b); 18 cout << "Os valores finais para A e B sao “<< a << “e" << b << “."; 19 getchar(); 20 } Os parâmetros x e y referem-se aos endereços das variáveis originais.

80 Passagem de argumentos a funções Exercícios do capítulo 3

81 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

82 Estruturas de seleção Comando if  Fluxograma / sintaxe  A condição deve retornar um valor BOOLEANO //comandos sequenciais if (condição) { //comando 1 //comando 2 //comando 3 //... //comando N } //comandos sequenciais condição 1 0 Comando 1 Comando 2 Comando 3. Comando N Comandos sequenciais Comandos sequenciais

83 Estruturas de seleção Comando if  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << “Programa que le um inteiro e o exibe se for positivo\n\n"; 07 cout << "Escreva um numero inteiro: "; 08 cin >> N; 09 if (N > 0) 10 { 11 cout << N; 12 } 13 getchar(); 14 } 10 11 12 1 13 14 01 02 03 04 05 06 07 08 09 0

84 Estruturas de seleção Comando if  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << “Programa que le um inteiro e o exibe se for positivo\n\n"; 07 cout << "Escreva um numero inteiro: "; 08 cin >> N; 09 if (N > 0) 10 { 11 cout << N; 12 } 13 getchar(); 14 } 10 11 12 1 13 14 01 02 03 04 05 06 07 08 09 0

85 Estruturas de seleção Comando if com cláusula else  Sempre desviamos o processamento  Resta saber por qual caminho

86 Estruturas de seleção Comando if com cláusula else  Sempre desviamos o processamento  Resta saber por qual caminho

87 Estruturas de seleção Comando if com cláusula else  Sempre desviamos o processamento  Resta saber por qual caminho

88 Estruturas de seleção Comando if com cláusula else  Fluxograma / sintaxe  A condição deve retornar um valor BOOLEANO //comandos sequenciais if (condição) { //comando I1 //comando I2 //comando I3 //... //comando IN } else { //comando E1 //comando E2 //comando E3 //... //comando EM } //comandos sequenciais Comandos sequenciais Comando I1 Comando I2 Comando I3... Comando IN 1 0 condição Comando E1 Comando E2 Comando E3... Comando EM

89 Estruturas de seleção Comando if com cláusula else  Exemplo 1 0 09 10 11 12 13 14 15 01 02 03 04 05 06 07 08 16 17 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << "Programa que le um inteiro e diz se e ou nao maior que zero\n\n"; 07 cout << "Escreva um numero inteiro: "; 08 cin >> N; 09 if (N > 0) 10 { 11 cout << N << " e maior que zero"; 12 } 13 else { 14 cout << N << " NAO e maior que zero"; 15 } 16 getchar(); 17 }

90 Estruturas de seleção Aninhamento de comandos if  if dentro de um if ou de um else 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << "Programa que ve se um inteiro e maior, menor ou igual a zero\n\n"; 07 cout << "Escreva um numero inteiro: "; 08 cin >> N; 09 if (N > 0) 10 cout << N << " e maior que zero"; 11 else { 12 if (N < 0) 13 cout << N << “ e menor que zero"; 14 else 15 cout << N << " e igual a zero"; 16 } 17 getchar(); 18 } 1 0 01 02 03 04 05 06 07 08 09 10 1 0 16 11 13 14 15 12 17 18

91 Estruturas de seleção O comando switch  Exemplo 01 #include 02 using amespace std; 03 main() 04 { 05 float X, Y; 06 char OP; 07 const string cabecalho = "Simulador de uma calculadora basica de numeros reais\n\n " ; 08 cout << cabecalho; 09 cout << "Digite o primeiro operando: "; 10 cin >> X; 11 cout << "Digite o segundo operando: "; 12 cin >> Y; 13 cout << "Digite o operador: "; 14 cin >> OP;

92 Estruturas de seleção O comando switch  Exemplo 15 switch(OP) 16 { 17 case '+' : cout << "Resultado: " << X+Y; 18 break; 19 case '-' : cout << "Resultado: " << X-Y; 20 break; 21 case '*' : 22 case 'x' : 23 case 'X' : cout << "Resultado: " << X*Y; 24 break; 25 case '/' : cout << "Resultado: " << X/Y; 26 break; 27 default : cout << "\nOperador invalido (" << OP << ")."; 28 } 29 getchar(); 30 }

93 Estruturas de seleção O comando switch  Sintaxe A expressão é um escalar ( int ou char) O break é opcional faz o processamento seguir para fora do switch O default é opcional switch (expressão) { case constante1 : comando1DaConstante1; comando2DaConstante1;... comandoWDaConstante1; break; case constante2 : comando1DaConstante2; comando2DaConstante2;... comandoXDaConstante2; break;... case constanteN : comando1DaConstanteN; comando2DaConstanteN;... comandoYDaConstanteN; break; default : comando1DoDefault; comando2DoDefault;... comandoZDoDefault; }

94 Estruturas de seleção O comando switch  switch X aninhamanto de comandos if switch(OP) { case '+' : cout << "Resultado: " << X+Y; break; case '-' : cout << "Resultado: " << X-Y; break; case '*' : case 'x' : case 'X' : cout << "Resultado: " << X*Y; break; case '/' : cout << "Resultado: " << X/Y; break; default : cout << "\nOperador invalido (" << OP ")."; }

95 Estruturas de seleção O comando switch  switch X aninhamanto de comandos if if (OP == '+') cout << "Resultado: " << X+Y; else if (OP == '-') cout << "Resultado: " << X-Y; else if ((OP == '*') || (OP == 'x') || (OP == 'X')) cout << "Resultado: " << X*Y; else if (OP == '/') cout << "Resultado: " << X+Y; else cout << "\nOperador invalido (" << OP << ").";

96 Estruturas de seleção Exercícios do capítulo 4

97 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

98 Estruturas de repetição O comando while  Fluxograma / sintaxe //comandos sequenciais while (condição) { //comando 1 //comando 2 //comando 3 //... //comando N } //comandos sequenciais Comandos sequenciais condição 1 0 Comando 1 Comando 2 Comando 3. Comando N

99 Estruturas de repetição O comando while  Fluxograma / sintaxe A condição deve envolver variável(is) de controle e retornar um valor booleano //comandos sequenciais while (condição) { //comando 1 //comando 2 //comando 3 //... //comando N } //comandos sequenciais Comandos sequenciais condição 1 0 Comando 1 Comando 2 Comando 3. Comando N

100 Estruturas de repetição O comando while  Fluxograma / sintaxe A(s) variável(is) de controle da condição deve(m) ser iniciada(s) antes do laço //comandos sequenciais while (condição) { //comando 1 //comando 2 //comando 3 //... //comando N } //comandos sequenciais Comandos sequenciais condição 1 0 Comando 1 Comando 2 Comando 3. Comando N

101 Estruturas de repetição O comando while  Fluxograma / sintaxe No corpo do laço, a(s) variável(is) de controle da condição deve(m) ser atualizada(s) //comandos sequenciais while (condição) { //comando 1 //comando 2 //comando 3 //... //comando N } //comandos sequenciais Comandos sequenciais condição 1 0 Comando 1 Comando 2 Comando 3. Comando N

102 Estruturas de repetição O comando while  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << “Impressão de CEFET 10 vezes:\n\n"; 07 N = 1; 08 while (N <= 10) 09 { 10 cout << “CEFET\n"; 11 N = N + 1; //++N; 12 } 13 getchar(); 14 } 08 09 10 11 12 1 13 14 0 01 02 03 04 05 06 07

103 Estruturas de repetição O comando while  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << “Lista dos numeros entre 1 e 100:\n\n"; 07 N = 1; 08 while (N <= 100) 09 { 10 cout << N << "\n" ; 11 N = N + 1; //++N; 12 } 13 getchar(); 14 } 08 09 10 11 12 1 13 14 0 01 02 03 04 05 06 07

104 Estruturas de repetição O comando while  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 char C; 06 cout << “Impressao do alfabeto:\n\n"; 07 C = ‘A’; 08 while (C <= ‘Z’) 09 { 10 cout << C << "\n"; 11 C = C + 1; //++C; 12 } 13 getchar(); 14 } 08 09 10 11 12 1 13 14 0 01 02 03 04 05 06 07

105 Estruturas de repetição O comando for  Substitui o comando while  Sintaxe menor variávelDeControle = vi; while (condição) { // comandos variávelDeControle = novoValor; } for (variávelDeControle = vi; condição; variávelDeControle = novoValor) { // comandos }

106 Estruturas de repetição O comando for  Substitui o comando while  Sintaxe menor variávelDeControle = vi; while (condição) { // comandos variávelDeControle = novoValor; } for (variávelDeControle = vi; condição; variávelDeControle = novoValor) { // comandos }

107 Estruturas de repetição O comando for  Substitui o comando while  Sintaxe menor variávelDeControle = vi; while (condição) { // comandos variávelDeControle = novoValor; } for (variávelDeControle = vi; condição; variávelDeControle = novoValor) { // comandos }

108 Estruturas de repetição O comando for  Substitui o comando while  Sintaxe menor variávelDeControle = vi; while (condição) { // comandos variávelDeControle = novoValor; } for (variávelDeControle = vi; condição; variávelDeControle = novoValor) { // comandos }

109 Estruturas de repetição O comando for  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << “Lista dos numeros entre 1 e 100\n\n"; 07 N = 1; 08 while (N <= 100) 09 { 10 cout << N << “\n"; 11 N = N + 1; 12 } 13 getchar(); 14 } 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 cout << “Lista dos números entre 1 e 100\n\n"; 07 for (N = 1; N <= 100; N = N +1) 08 { 09 cout << N << “\n"; 10} 11 getchar(); 12 } com “for” com “while”

110 Estruturas de repetição Saída forçada (break)  Recomendado apenas dentro de loops infinitos

111 Estruturas de repetição Saída forçada (break)  Recomendado apenas dentro de loops infinitos  Exemplo # include using namespace std; main() { char opcao; while (1) //loop infinito { system(“cls”); //comandos do programa cout << “Deseja repetir o programa: [S|N]: ”; cin >> opcao; if (opcao == ‘n’ || opcao == ‘N’) break; } system(“pause”); }

112 Estruturas de repetição Saída forçada (break)  Recomendado apenas dentro de loops infinitos  Exemplo O comando system, do arquivo de cabeçalho stdlib.h recebe um texto como parâmetro, o qual é entendido como um comando do sistema operacional no qual o programa será executado. # include using namespace std; main() { char opcao; while (1) //loop infinito { system(“cls”); //comandos do programa cout << “Deseja repetir o programa: [S|N]: ”; cin >> opcao; if (opcao == ‘n’ || opcao == ‘N’) break; } system(“pause”); }

113 Estruturas de repetição Saída forçada (break)  Recomendado apenas dentro de loops infinitos  Exemplo 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 N = 1; 07 while (N <= 100) 08 { 09 cout << N << “\n"; 10 N = N + 1; 11 } 12 getchar(); 13 } 01 #include 02 using namespace std; 03 main() 04 { 05 int N; 06 N = 1; 07 while (1) 08 { 09 cout << N << “\n"; 10 if (N == 100) break; 11 N = N + 1; 12 } 13 getchar(); 14 } com saída forçada com “while” comum

114 Estruturas de repetição O comando do while  Fluxograma / sintaxe A condição deve retornar um valor booleano //comandos sequenciais do { //comando 1 //comando 2 //comando 3 //... //comando N } while (condição); //comandos sequenciais Comandos sequenciais 0 1 Comando 1 Comando 2 Comando 3. Comando N condição

115 Estruturas de repetição O comando do while  Exemplo 01 #include 02 #include 03 using namespace std; 04 main() 05 { 06 float N1, N2, MEDIA; 07 char RESP; 08 do 09 { 10 system("cls"); 11 cout << "Programa para calcular a media entre dois numeros:\n\n"; 12 cout >> "Digite os dois numeros separados por ENTER: "; 13 cin >> N1 >> N2; 14 MEDIA = (N1+N2)/2; 15 cout << "A media entre “ << N1 << “ e “ << N2 << “ e “ << MEDIA << “.\n\n"; 16 cout << "Deseja repetir o programa? Entre [S] para sim ou outra tecla para nao: "; 17 cin >> RESP; 18 } 19 while ((RESP =='S') || (RESP == 's')); 20 } 0 1 01 02 03 04 05 06 07 08 09 10 11 12 13 15 16 17 18 19 20

116 Estruturas de repetição Exercícios 1 a 13 do capítulo 5

117 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

118 Arranjos Vetor  Estrutura

119 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5];

120 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5]; Declaração de vários vetores de um mesmo tipo: tipo nome1[tam1],..., nomeN[tamN]; Exemplo: int X[5], Y[10], Z[15];

121 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5]; Declaração de vários vetores de um mesmo tipo: tipo nome1[tam1],..., nomeN[tamN]; Exemplo: int X[5], Y[10], Z[15];

122 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5]; Declaração de vários vetores de um mesmo tipo: tipo nome1[tam1],..., nomeN[tamN]; Exemplo: int X[5], Y[10], Z[15];

123 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5];  Acesso nomeDaVariável[coluna]; V[0] = 4; V[1] = 7; V[2] = 2; V[3] = 5; V[4] = 3;

124 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5];  Acesso nomeDaVariável[coluna]; V[0] = 4; V[1] = 7; V[2] = 2; V[3] = 5; V[4] = 3; 0 1 2 3 4

125 Arranjos Vetor  Estrutura  Declaração de variável vetor tipo nomeDaVariável[númeroDeColunas]; int V[5];  Acesso nomeDaVariável[coluna]; V[0] = 4; V[1] = 7; V[2] = 2; V[3] = 5; V[4] = 3;

126 Arranjos Vetor (Exemplo) 01 #include 02 using namespace std; 03 main() 04 { 05 const int N = 30; 06 int A[N]; 07 int I, POS, MAIOR; 08 for (I = 0; I < N; I = I + 1) 09 { 10 cout << "Forneca o elemento da posicao " << I << " do vetor: "; 11 cin >> A[I]; 12 } 13 MAIOR = A[0]; 14 POS = 0; 15 for (I = 1; I < N; I = I + 1) 16 if (A[I] > MAIOR) 17 { 18 MAIOR = A[I]; 19 POS = I; 20 } 21 cout << "O maior elemento do vetor e " << MAIOR << " e ele esta na posicao " << POS << "."; 22 getchar(); 23 }

127 Arranjos Vetor como argumento de um módulo int somaElementosDeVetor(int vetor[ ], int colunas) { int i, soma = 0; for (i = 0; i < colunas; i = i+1) soma = soma + vetor[i]; return soma; }

128 Arranjos Vetor como argumento de um módulo int somaElementosDeVetor(int vetor[ ], int colunas) { int i, soma = 0; for (i = 0; i < colunas; i = i+1) soma = soma + vetor[i]; return soma; } A quantidade de colchetes determina a dimensão do arranjo.

129 Arranjos Vetor como argumento de um módulo int somaElementosDeVetor(int vetor[ ], int colunas) { int i, soma = 0; for (i = 0; i < colunas; i = i+1) soma = soma + vetor[i]; return soma; } A quantidade de colchetes determina a dimensão do arranjo. Os colchetes ficam vazios na implementação do módulo.

130 Arranjos Vetor como argumento de um módulo int somaElementosDeVetor(int vetor[ ], int colunas) { int i, soma = 0; for (i = 0; i < colunas; i = i+1) soma = soma + vetor[i]; return soma; } main() { const int N = 4; int v[N], i; for (i = 0; i < N; i = i+1) v[i] = i; cout << "Soma dos elementos do vetor: “ << somaElementosDeVetor(v, N); }

131 Arranjos Vetor como argumento de um módulo int somaElementosDeVetor(int vetor[ ], int colunas) { int i, soma = 0; for (i = 0; i < colunas; i = i+1) soma = soma + vetor[i]; return soma; } main() { const int N = 4; int v[N], i; for (i = 0; i < N; i = i+1) v[i] = i; cout << "Soma dos elementos do vetor: “ << somaElementosDeVetor(v, N); } Os colchetes não aparecem na chamada ao módulo.

132 Arranjos Vetor como argumento de um módulo int somaElementosDeVetor(int vetor[ ], int colunas) { int i, soma = 0; for (i = 0; i < colunas; i = i+1) soma = soma + vetor[i]; return soma; } main() { const int N = 4; int v[N], i; for (i = 0; i < N; i = i+1) v[i] = i; cout << "Soma dos elementos do vetor: “ << somaElementosDeVetor(v, N); } Os colchetes não aparecem na chamada ao módulo. Em C++, os arranjos, quando argumentos de módulos, são automaticamente passados por referência.

133 Arranjos Matriz  Estrutura

134 Arranjos Matriz  Estrutura  Declaração de variável matriz tipo nomeDaVariável[númeroDeLinhas] [númeroDeColunas]; Exemplo int M[3][4];

135 Arranjos Matriz  Estrutura  Declaração de variável matriz tipo nomeDaVariável[númeroDeLinhas] [númeroDeColunas]; int M[3][4]; Declaração de vários vetores de um mesmo tipo: tipo nome1[linhas1][colunas1],..., nomeN[linhasN][colunasN]; Exemplo: int X[2][5], Y[2][3], Z[6][3];

136 Arranjos Matriz  Estrutura  Declaração de variável matriz tipo nomeDaVariável[númeroDeLinhas] [númeroDeColunas]; int M[3][4]; Declaração de vários vetores de um mesmo tipo: tipo nome1[linhas1][colunas1],..., nomeN[linhasN][colunasN]; Exemplo: int X[2][5], Y[2][3], Z[6][3];

137 Arranjos Matriz  Estrutura  Declaração de variável matriz tipo nomeDaVariável[númeroDeLinhas] [númeroDeColunas]; int M[3][4]; Declaração de vários vetores de um mesmo tipo: tipo nome1[linhas1][colunas1],..., nomeN[linhasN][colunasN]; Exemplo: int X[2][5], Y[2][3], Z[6][3];

138 Arranjos Matriz  Estrutura  Declaração de variável matriz tipo nomeDaVariável[númeroDeLinhas] [númeroDeColunas]; int M[3][4];  Acesso nomeDaVariável[Linha][Coluna] M[0][0] = 3;M[0][1] = 8;M[0][2] = 1;M[0][3] = 5; M[1][0] = 0;M[1][1] = 2;M[1][2] = 4;M[1][3] = 7; M[2][0] = 2;M[2][1] = 5;M[2][2] = 9;M[2][3] = 3; 0 1 2 3 012012

139 Arranjos Matriz  Estrutura  Declaração de variável matriz tipo nomeDaVariável[númeroDeLinhas] [númeroDeColunas]; int M[3][4];  Acesso nomeDaVariável[Linha][Coluna] M[0][0] = 3;M[0][1] = 8;M[0][2] = 1;M[0][3] = 5; M[1][0] = 0;M[1][1] = 2;M[1][2] = 4;M[1][3] = 7; M[2][0] = 2;M[2][1] = 5;M[2][2] = 9;M[2][3] = 3; 0 1 2 3 012012

140 Arranjos Matriz (Exemplo) 01 #include 02 using namespace std; 03 main() 04 { 05 const int NL = 3; // número de linhas 06 const int NC = 5; // número de colunas 07 const int K = 2; // fator para multiplicação 08 int M[NL][NC], I, J; 09 for (I = 0; I < NL; I = I + 1) 10 for (J = 0; J < NC; J = J + 1) 11 { 12 cout << "Forneca o elemento da linha " << I << " e coluna " << J << "."; 13 cin >> M[I][J]; 14 } 15 for (I = 0; I < NL; I = I + 1) 16 for (J = 0; J < NC J = J + 1) 17 M[I][J] = M[I][J] * K; 18 cout << "\nResultado:\n\n"; 19 for (I = 0; I < NL; I = I + 1) 20 { 21 for (J = 0; J < NC; J = J + 1) 22 cout << M[I][J] << "\n"; 23 cout << "\n"; 24 } 25 getchar(); 26 }

141 Arranjos Matrizes como argumentos de módulos  É necessário informar a quantidade de colunas no argumento que representa a matriz no módulo.  Para um módulo genérico, isto é inviável.  Não usaremos matrizes como argumentos de módulos

142 Arranjos Exercícios 1 a 13 do capítulo 6

143 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

144 Manipulação de textos Declaração string nome; Atribuição = Comparação == != > >= < <=

145 Manipulação de textos Concatenação + Acesso a um determinado caractere [ ] Comprimento length() As posições de uma string seguem o mesmo padrão das posições de um vetor. nome.length()

146 Manipulação de textos Exemplo 01 #include 02 #include 03 using namespace std; 04 main() 05 { 06 char c = '/'; 07 string nome1, nome2; 08 nome1 = "CEFET"; 09 nome2 = "RJ"; 10 nome1 = nome1 + c + nome2; 11 cout << nome1 << "\n"; 12 cout << nome1.length() << "\n"; 13 cout << nome1[5] << "\n"; 14 getch(); 15 }

147 Manipulação de textos Funções para caracteres  toupper(caractere);  tolower(caractere);  Em C++, se atribuirmos um caractere a uma variável inteira, esta variável passará a conter o valor ASCII deste caractere. Como contraposto, se atribuirmos um número inteiro de 0 a 255 a uma variável caractere, esta variável passará a conter o caractere associado ao valor ASCII deste caractere. tolower e toupper estão definidas no arquivo de cabeçalho ctype.h.

148 Manipulação de textos Exemplo 01 #include 02 #include 03 #include 04 using namespace std; 05 main() 06 { 07 int i; 08 string entrada, saida; 09 cout << "Escreva um texto qualquer: "; 10 getline(cin, entrada); 11 i = 0; 12 while (i <= entrada.length()) 13 { 14 saida[i] = toupper(entrada[i]); //saida[i] = tolower(entrada[i]); 15 i = i + 1; 16 } 17 cout << saida; 18 getch(); 19 }

149 Manipulação de textos Exemplos 01 #include 02 #include 03 #include 04 using namespace std; 05 main() 06 { 07 int inteiro; 08 inteiro = 'A'; 09 cout << inteiro; 10 getch(); 11 } 01 #include 02 #include 03 #include 04 using namespace std; 05 main() 06 { 07 char caractere; 08 caractere = 122; 09 cout << caractere; 10 getch(); 11 }

150 Manipulação de textos Exemplos 01 #include 02 #include 03 #include 04 using namespace std; 05 main() 06 { 07 int inteiro; 08 inteiro = 'A'; 09 cout << inteiro; 10 getch(); 11 } 01 #include 02 #include 03 #include 04 using namespace std; 05 main() 06 { 07 char caractere; 08 caractere = 122; 09 cout << caractere; 10 getch(); 11 } O resultado de cada programa será, respectivamente: escrever o inteiro 65 na tela, já que 65 é o código ASCII do caractere ‘A’; escrever o caractere ‘z’ na tela, uma vez que ‘z’ é o caractere cujo código ASCII é dado por 122.

151 Manipulação de textos Exercícios do capítulo 7

152 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

153 Tipos definidos pelo programador Tipos primitivos  char  int  float

154 Tipos definidos pelo programador Tipos primitivos  char  int  float Outros tipos  Tipos enumerados  Tipos de registro

155 Tipos definidos pelo programador Tipos enumerados  Enumera os valores do novo tipo  Sintaxe enum tipoEnumerado { decricao1, descricao2,..., descricaoN };

156 Tipos definidos pelo programador Tipos enumerados  Enumera os valores do novo tipo  Sintaxe enum tipoEnumerado { decricao1, descricao2,..., descricaoN };  Exemplos: valores sinônimos: 0 1 2 3 a) enum TNaipe {paus, ouros, copas, espadas};

157 Tipos definidos pelo programador Tipos enumerados  Enumera os valores do novo tipo  Sintaxe enum tipoEnumerado { decricao1, descricao2,..., descricaoN };  Exemplos: valores sinônimos: 0 1 2 3 a) enum TNaipe {paus, ouros, copas, espadas}; valores sinônimos: 1 2 3 4 5 6 7 b) enum TDiaDaSemana {domingo=1, segunda, terça, quarta, quinta, sexta, sabado};

158 Tipos definidos pelo programador Tipos enumerados  Enumera os valores do novo tipo  Sintaxe enum tipoEnumerado { decricao1, descricao2,..., descricaoN };  Exemplos: valores sinônimos: 0 1 2 3 a) enum TNaipe {paus, ouros, copas, espadas}; valores sinônimos: 1 2 3 4 5 6 7 b) enum TDiaDaSemana {domingo=1, segunda, terça, quarta, quinta, sexta, sabado}; Operadores lógicos são válidos para as descrições de um tipo enumerado.

159 Tipos definidos pelo programador Tipos enumerados  Declaração Junto com a declaração do tipo Depois da declaração do tipo

160 Tipos definidos pelo programador Tipos enumerados  Declaração Junto com a declaração do tipo Depois da declaração do tipo enum tipoEnumerado {valor1, valor2,...} identificador1 [, identificador2,..., identificadorN];

161 Tipos definidos pelo programador Tipos enumerados  Declaração Junto com a declaração do tipo Depois da declaração do tipo enum tipoEnumerado {valor1, valor2,...} identificador1 [, identificador2,..., identificadorN]; enum TNaipe {paus, ouros, espadas, copas} naipeDaMesa, naipeDoJogador;

162 Tipos definidos pelo programador Tipos enumerados  Declaração Junto com a declaração do tipo Depois da declaração do tipo enum tipoEnumerado {valor1, valor2,...} identificador1 [, identificador2,..., identificadorN]; enum TNaipe {paus, ouros, espadas, copas} naipeDaMesa, naipeDoJogador; enum tipoEnumerado identificador1 [, identificador2,..., identificadorN];

163 Tipos definidos pelo programador Tipos enumerados  Declaração Junto com a declaração do tipo Depois da declaração do tipo enum tipoEnumerado {valor1, valor2,...} identificador1 [, identificador2,..., identificadorN]; enum TNaipe {paus, ouros, espadas, copas} naipeDaMesa, naipeDoJogador; enum tipoEnumerado identificador1 [, identificador2,..., identificadorN]; enum TNaipe naipeDaMesa, naipeDoJogador;

164 Tipos definidos pelo programador Tipos de registro  Registram mais de um componente

165 Tipos definidos pelo programador Tipos de registro  Registram mais de um componente  Sintaxe struct nomeDoRegistro { tipo1 nomeDoCampo1_1 [, nomeDoCampo1_2,..., nomeDoCampo1_W]; tipo2 nomeDoCampo2_1 [, nomeDoCampo2_2,..., nomeDoCampo2_X];... tipoN nomeDoCampoN_1 [, nomeDoCampoN_2,..., nomeDoCampoN_Y]; };

166 Tipos definidos pelo programador Tipos de registro  Registram mais de um componente  Sintaxe  Exemplos struct nomeDoRegistro { tipo1 nomeDoCampo1_1 [, nomeDoCampo1_2,..., nomeDoCampo1_W]; tipo2 nomeDoCampo2_1 [, nomeDoCampo2_2,..., nomeDoCampo2_X];... tipoN nomeDoCampoN_1 [, nomeDoCampoN_2,..., nomeDoCampoN_Y]; }; struct TData { int dia, ano; string mes; }; struct TData { int dia; string mes; int ano; };

167 Tipos definidos pelo programador Tipos de registro  Declaração Junto com a declaração do tipo Depois da declaração do tipo

168 Tipos definidos pelo programador Tipos de registro  Declaração Junto com a declaração do tipo Depois da declaração do tipo struct tipoDeRegistro {...} identificador1 [, identificador2,..., identificadorN];

169 Tipos definidos pelo programador Tipos de registro  Declaração Junto com a declaração do tipo Depois da declaração do tipo struct tipoDeRegistro {...} identificador1 [, identificador2,..., identificadorN]; struct TData TNaipe { int dia, ano; string mes; } hoje, nascimento;

170 Tipos definidos pelo programador Tipos de registro  Declaração Junto com a declaração do tipo Depois da declaração do tipo struct tipoDeRegistro {...} identificador1 [, identificador2,..., identificadorN]; struct TData TNaipe { int dia, ano; string mes; } hoje, nascimento; struct tipoDeRegistro identificador1 [, identificador2,..., identificadorN];

171 Tipos definidos pelo programador Tipos de registro  Declaração Junto com a declaração do tipo Depois da declaração do tipo struct tipoDeRegistro {...} identificador1 [, identificador2,..., identificadorN]; struct TData TNaipe { int dia, ano; string mes; } hoje, nascimento; struct tipoDeRegistro identificador1 [, identificador2,..., identificadorN]; struct TData hoje, nascimento;

172 Tipos definidos pelo programador Tipos de registro  Manipulação do registro inteiro struct1 = struct2;

173 Tipos definidos pelo programador Tipos de registro  Manipulação do registro inteiro struct1 = struct2; nascimento = hoje;

174 Tipos definidos pelo programador Tipos de registro  Manipulação do registro inteiro struct1 = struct2;  Manipulação de um campo do registro Designador de campo ‘.’ nascimento = hoje;

175 Tipos definidos pelo programador Tipos de registro  Manipulação do registro inteiro struct1 = struct2;  Manipulação de um campo do registro Designador de campo ‘.’ nomeDaVariável. nomeDoCampo cin >> hoje. ano); nascimento.ano = hoje. ano; cout << nascimento. ano; nascimento = hoje;

176 Tipos definidos pelo programador Tipos de registro  Estruturas mistas O campo de um tipo de registro é outro tipo de registro

177 Tipos definidos pelo programador Tipos de registro  Estruturas mistas O campo de um tipo de registro é outro tipo de registro  Exemplo struct TData { int dia, mes, ano; }; struct TPessoa { string nome; struct TData dataDeNascimento; }; struct TPessoa pessoa;

178 Tipos definidos pelo programador Tipos de registro  Estruturas mistas O campo de um tipo de registro é outro tipo de registro  Exemplo  Acesso cin >> pessoa. dataDeNascimento. dia); struct TData { int dia, mes, ano; }; struct TPessoa { string nome; struct TData dataDeNascimento; }; struct TPessoa pessoa;

179 Tipos definidos pelo programador Estruturas locais X estruturas globais Um tipo declarado dentro de um módulo só existe dentro do módulo. Módulos

180 Tipos definidos pelo programador Estruturas locais X estruturas globais Um tipo declarado fora de qualquer módulo existe dentro de todos os módulos. Módulos

181 Tipos definidos pelo programador Exemplo completo 01 #include 02 using namespace std; 03 enum TMes {Janeiro=1, Fevereiro, Marco, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro}; 04 struct TData 05 { 06 int dia; 07 TMes mes; 08 int ano; 09 }; 10 int AnoBissexto (int ano) 11 { 12 if (ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0) 13 return(1); 14 else return(0); 15 } 16 string TMesParaTexto (TMes mes) 17 { 18 switch (mes) 19 { 20 case Janeiro : return("Janeiro"); 21 break; 22 case Fevereiro: return("Fevereiro"); 23 break; 24 case Marco : return("Marco"); 25 break;... 42 case Dezembro : return("Dezembro"); 43 break; 44 } 45 }

182 Tipos definidos pelo programador Exemplo completo 60 case Abril: 61 case Junho: 62 case Setembro: 63 case Novembro: if (data.dia <= 30) 64 return(1); 65 else return(0); 66 break; 67 case Fevereiro: if (AnoBissexto(data.ano)) 68 { 69 if (data.dia <= 29) 70 return(1); 71 else return(0); 72 } 73 else { 74 if (data.dia <= 28) 75 return(1); 76 else return(0); 77 } 78 default : return(0); 79 } 80 } 46 int ValidaData (struct TData data) 47 { 48 switch (data.mes) 49 { 50 case Janeiro: 51 case Marco: 52 case Maio: 53 case Julho: 54 case Agosto: 55 case Outubro: 56 case Dezembro: if (data.dia <= 31) 57 return(1); 58 else return(0); 59 break;

183 Tipos definidos pelo programador Exemplo completo 81 main() 82 { 83 struct TPessoa 84 { 85 string nome; 86 struct TData dataDeNascimento; 87} 88 struct TPessoa pessoa; 89 cout << "Informe seu nome: "; 90 getline(cin, pessoa.nome); 91 cout << pessoa.nome << “, informe dia, mes e ano de nascimento, separados por ENTER: "; 92cin >> pessoa.dataDeNascimento.dia; 93cin >> pessoa.dataDeNascimento.mes, 94 cin >> pessoa.dataDeNascimento.ano; 95 if (ValidaData(pessoa.dataDeNascimento)) 96 cout << "Voce nasceu em “<< pessoa.dataDeNascimento.dia << “ de “ << TMesParaTexto(pessoa.dataDeNascimento.mes) << “ de “ << pessoa.dataDeNascimento.ano); 97 else cout << "A data fornecida e invalida. O programa sera fechado."; 98 getchar(); 99 }

184 Tipos definidos pelo programador Exercícios do capítulo 8

185 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

186 Arquivos Meio não volátil  Dados não são perdidos ao término do programa Biblioteca fstream oferece os tipos  ifstream, para leitura de dados em arquivo  ofstream, para escrita de dados em arquivo Declaração de um arquivo ifstream nomeDoArquivoUsadoParaEntrada; ofstream nomeDoArquivoUsadoParaSaida;

187 Arquivos Entrada e saída >> << Abertura - open() Fechamento - close() Indicador de fim de arquivo - eof() nome.open() nome.close() nome.eof()

188 Arquivos Exemplo #include using namespace std; main() { //Declaração de variáveis string linha; ifstream entrada; ofstream saida; int i; //Abertura do arquivo em modo de escrita saida.open("Dados.txt"); //Escrita no arquivo for(i = 1; i <= 10; i = i + 1) saida << "\n" << i << "\t" << i*i ; //Fechamento do arquivo em modo de escrita saida.close();... //Abertura do arquivo em modo de leitura entrada.open("Dados.txt"); //Leitura dos dados armazenados no arquivo getline(entrada, linha); //Consumir a primeira linha do arquivo while (!entrada.eof()) { entrada >> i; cout << i << "\t"; entrada >> i; cout << i << "\n"; } //Fechamento do arquivo em modo de leitura entrada.close(); }

189 Arquivos Exercícios 1. Escreva um programa para ler dados de vários alunos e escrever estes dados em um arquivo. Cada aluno possui matrícula, nome e duas notas. O programa deve também ler estes dados do arquivo e escrevê-los de volta na tela. 2. Modifique o programa anterior para agora, após ler os dados gravados no arquivo, também escrever na tela qual foi a maior média e quantos alunos atingiram a maior média.

190 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com

191 Estruturas de dados Registros dinâmicos  Nós de armazenamento são alocados mediante necessidade  Ponteiros fazem: O encadeamento dos nós A sinalização de fim dos nós

192 Estruturas de dados Registros dinâmicos  Nós de armazenamento são alocados mediante necessidade  Ponteiros fazem: O encadeamento dos nós A sinalização de fim dos nós  É fundamental utilizar um ponteiro para indicar o início da lista

193 Estruturas de dados Registros dinâmicos  Nós de armazenamento são alocados mediante necessidade  Ponteiros fazem: O encadeamento dos nós A sinalização de fim dos nós  É fundamental utilizar um ponteiro para indicar o início da lista  Exemplos: Listas, Filas e Pilhas

194 Estruturas de dados Listas encadeadas  Lista de caracteres  Representação de cada nó da lista struct TNoDeCaractere { char caractere; struct TNoDeCaractere * proximo; };

195 Estruturas de dados Listas encadeadas  Lista de caracteres  Representação de cada nó da lista  Representação do ponteiro para o início da lista (inicialmente vazia) struct TNoDeCaractere { char caractere; struct TNoDeCaractere * proximo; }; struct TNoDeCaractere * inicio; main() {... inicio = NULL;... }

196 Estruturas de dados Listas encadeadas  Lista de caracteres  Representação de cada nó da lista  Representação do ponteiro para o início da lista (inicialmente vazia) struct TNoDeCaractere { char caractere; struct TNoDeCaractere * proximo; }; struct TNoDeCaractere * inicio; main() {... inicio = NULL;... } “NULL” faz um ponteiro apontar para nenhuma posição de memória. O ponteiro fica aterrado.

197 Estruturas de dados Listas encadeadas (criação de novo nó) 01 void armazenar (char valor) 02 { 03 struct TNoDeCaractere *p, *np; 04 //Se a lista está vazia, cria um nó e faz "inicio" apontar para ele. 05 if (inicio == NULL) 06 { 07 np = new(struct TNoDeCaractere); 08 (*np).caractere = valor; 09 (*np).proximo = NULL; 10 inicio = np; 11 } 12 else //Caso contrário, ou seja, se a lista não está vazia... 13 { 14 p = inicio; 15 //varre toda a lista, 16 while ((*p).proximo != NULL) 17 p = (*p).proximo; 18 //cria o novo nó 19 np = new(struct TNoDeCaractere); 20 (*np).caractere = valor; 21 (*np).proximo = NULL; 22 //e liga a lista existente ao novo nó. 23 (*p).proximo = np; 24 } 25 }

198 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura inicial:

199 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura inicial: Alocação do novo nó: 07 np = new(struct TNoDeCaractere); new – reserva um novo espaço de memória (struct TNoDeCaractere) – do tamanho exato de um registro “TNoDeCaractere”, np = – e faz este espaço ser apontado por “np”.

200 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura inicial: Alocação do novo nó: Nova estrutura: 07 np = new(struct TNoDeCaractere); new – reserva um novo espaço de memória (struct TNoDeCaractere) – do tamanho exato de um registro “TNoDeCaractere”, np = – e faz este espaço ser apontado por “np”.

201 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual:

202 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual: Armazenamento do valor ‘O’ no novo nó e aterramento do novo nó: 08 (*np).caractere = valor; //supor que " valor" seja 'O' 09 (*np).proximo = NULL;

203 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual: Armazenamento do valor ‘O’ no novo nó e aterramento do novo nó: Nova estrutura: 08 (*np).caractere = valor; //supor que " valor" seja 'O' 09 (*np).proximo = NULL;

204 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual:

205 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual: Atualização do ponteiro para o início da lista: 10 inicio = np;

206 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual: Atualização do ponteiro para o início da lista: Nova estrutura: 10 inicio = np;

207 Estruturas de dados Listas encadeadas (criação de novo nó)  Em uma lista vazia Estrutura atual: Atualização do ponteiro para o início da lista: Nova estrutura: 10 inicio = np; No encerramento do procedimento, a variável “np” é excluída da memória, pois ela é uma variável local ao procedimento.

208 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual:

209 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Atribuição de valor inicial ao ponteiro p: 14 p = inicio;

210 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Atribuição de valor inicial ao ponteiro p: Nova estrutura: 14 p = inicio;

211 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual:

212 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Varredura de toda a lista: 16 while ((*p).proximo != NULL) 17 p = (*p).proximo; ppp p

213 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Varredura de toda a lista: 16 while ((*p).proximo != NULL) 17 p = (*p).proximo; ppp p Como o campo próximo do nó apontado por p já é o fim da fila, a linha 17 não é executada nenhuma vez.

214 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual:

215 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Alocação do novo nó: 19 np = new(struct TNoDeCaractere);

216 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Alocação do novo nó: Nova estrutura: 19 np = new(struct TNoDeCaractere);

217 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual:

218 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Armazenamento do valor ‘I’ no novo nó e aterramento do novo nó: 20 (*np).caractere = valor; //supor que " valor" seja 'I' 21 (*np).proximo = NULL;

219 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Armazenamento do valor ‘I’ no novo nó e aterramento do novo nó: Nova estrutura: 20 (*np).caractere = valor; //supor que " valor" seja 'I' 21 (*np).proximo = NULL;

220 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual:

221 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Atualização do ponteiro para o início da lista: 23 (*p).proximo = np;

222 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Atualização do ponteiro para o início da lista: Nova estrutura: 23 (*p).proximo = np;

223 Estruturas de dados Listas encadeadas (criação de novo nó)  No final de uma lista Estrutura atual: Atualização do ponteiro para o início da lista: Nova estrutura: 23 (*p).proximo = np; No encerramento do procedimento, as variáveis ”p” e “np” são excluídas da memória, pois elas são variáveis locais ao procedimento.

224 Estruturas de dados Listas encadeadas (exclusão de um nó) 01 void retirar (char valor) 02 { 03 struct TNoDeCaractere * pAnt, *p; 04 //Verifica se a partir do segundo nó, há nó a ser retirado. 05 pAnt = inicio; 06 p = (*inicio).proximo; 07 while (p != NULL) 08 { 09 if ((*p).caractere == valor) 10 { 11 (*pAnt).proximo = (*p).proximo; 12 delete(p); 13 p = (*pAnt).proximo; 14 } 15 else { 16 pAnt = (*pAnt).proximo; 17 p = (*p).proximo; 18 } 19 } 20 //Testa se a lista está com o valor a ser retirado no primeiro nó. 21 if ((*inicio).caractere == valor) 22 { 23 p = (*inicio).proximo; 24 delete(inicio); 25 inicio = p; 26 } 27 }

225 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:

226 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Atualização do ponteiro para o início da lista: 23 p = (*inicio).proximo;

227 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Atualização do ponteiro para o início da lista:  Nova estrutura: 23 p = (*inicio).proximo;

228 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:

229 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Exclusão do nó: 24 delete(inicio); Libere a área de memória apontada por “inicio”.

230 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Exclusão do nó:  Nova estrutura: 24 delete(inicio); Libere a área de memória apontada por “inicio”.

231 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:

232 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Atualização do ponteiro para o início da lista: 25 inicio = p;

233 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Atualização do ponteiro para o início da lista:  Nova estrutura: 25 inicio = p;

234 Estruturas de dados Listas encadeadas (exclusão do primeiro nó)  Estrutura atual:  Atualização do ponteiro para o início da lista:  Nova estrutura: 25 inicio = p; No encerramento do procedimento, a variável “p” é excluída da memória, pois ela é uma variável local ao procedimento.

235 Estruturas de dados Listas encadeadas (exclusão de nó genérico)  Varredura para achar o elemento a ser excluído: 05 pAnt = inicio; 06 p = (*inicio).proximo; 07 while (p != NULL) 08 { 09 if ((*p).caractere == valor) 10 { 11 (*pAnt).proximo = (*p).proximo; 12 delete(p); 13 p = (*pAnt).proximo; 14 } 15 else { 16 pAnt = (*pAnt).proximo; 17 p = (*p).proximo; 18 } 19 } p pAnt

236 Estruturas de dados Listas encadeadas (exclusão de nó genérico)  Estrutura atual: pAnt p

237 Estruturas de dados Listas encadeadas (exclusão de nó genérico)  Estrutura atual:  Exclusão do elemento e redistribuição da lista: 11 (*pAnt).proximo = (*p).proximo; 12 delete(p); 13 p = (*pAnt).proximo; pAnt p

238 Estruturas de dados Listas encadeadas (exclusão de nó genérico)  Estrutura atual:  Exclusão do elemento e redistribuição da lista: 11 (*pAnt).proximo = (*p).proximo; 12 delete(p); 13 p = (*pAnt).proximo; pAnt p No encerramento do procedimento, as variáveis “p” e “pAnt” são excluídas da memória, pois elas são variáveis locais ao procedimento.

239 Estruturas de dados Filas (FIFO – First In, First Out)  O primeiro a entrar é o primeiro a sair  Como uma fila de cinema  Exemplo:

240 Estruturas de dados Filas (FIFO – First In, First Out)  O primeiro a entrar é o primeiro a sair  Como uma fila de cinema  Exemplo:

241 Estruturas de dados Filas (FIFO – First In, First Out)  O primeiro a entrar é o primeiro a sair  Como uma fila de cinema  Exemplo:  No momento, o elemento a ser retirado é o nó que contém o número 3!

242 Estruturas de dados Exercícios  Exercícios 1 e 2 da seção 10.4 da apostila.

243 Estruturas de dados Pilhas (LIFO – Last In, First Out)  O último a entrar é o primeiro a sair  Como uma pilha de rascunhos  Exemplo:

244 Estruturas de dados Pilhas (LIFO – Last In, First Out)  O último a entrar é o primeiro a sair  Como uma pilha de rascunhos  Exemplo:

245 Estruturas de dados Pilhas (LIFO – Last In, First Out)  O último a entrar é o primeiro a sair  Como uma pilha de rascunhos  Exemplo:  O elemento a ser retirado é o nó que contém o número 7!

246 Estruturas de dados Exercícios  Exercícios 3, 4 e 5 da seção 10.4 da apostila.

247 Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem Computacional – UERJ – 2012 rodrigoreisgomes@gmail.com


Carregar ppt "Programação de algoritmos Rodrigo Reis Gomes Bacharel em Informática – UFRJ – 1999 Mestre em Modelagem Computacional – UERJ – 2003 Doutor em Modelagem."

Apresentações semelhantes


Anúncios Google