Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouThomas Leal Macedo Alterado mais de 8 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.