UNDB ESTRUTURAS DE DADOS Prof. Alessandro Gonçalves [email protected] Revisão de C Exercícios – individual (5 min) 1) Crie um programa em C que aguarde a digitação de três variáveis e exiba seus valores de forma concatenada Ex: usuário digitou '1', 'a', 'x' e a saída a ser exibida é 1ax Função getchar() Lê o teclado até que se pressione ENTER #include <stdio.h> #include <stdlib.h> main() { char ch; ch=getchar(); printf("%c\n",ch); system("PAUSE"); return 0; } Função putchar() Exibe um caractere #include <stdio.h> #include <stdlib.h> main() { char ch; printf("digite uma letra minúscula : "); ch=getchar(); putchar(toupper(ch)); putchar('\n'); system("PAUSE"); return 0; } Operadores incremento e decremento [variável] ++ [variável] - - Incrementa 1 unidade após a operação Decrementa 1 unidade após a operação #include <stdio.h> #include <stdlib.h> main() { int i; printf ("Digite um número\n"); scanf("%i", &i); printf("i = %i\n", i); printf("i++ = %i\n", i++); printf("i-- = %i\n", i- -); system("PAUSE"); return 0; } Operadores incremento e decremento ++[variável] --[variável] Incrementa 1 unidade antes da operação Decrementa 1 unidade antes da operação #include <stdio.h> #include <stdlib.h> main() { int i; printf ("Digite um número\n"); scanf("%i", &i); printf("i = %i\n", i); printf("++i = %i\n", ++i); printf("--i = %i\n", --i); system("PAUSE"); return 0; } Estruturas de condição - if If [condicao] { [comandos se verdadeiro] } else { [comandos se falso] } Operadores relacionais > >= < <= == != maior que maior ou igual menor menor ou igual igual diferente Operadores lógicos && || ! e ou não Exercícios Exercícios – individual (5 min) 1) Crie um programa em C que aguarde a digitação de duas variáveis e exiba qual delas é maior #include <stdio.h> #include <stdlib.h> main() { int x,y; printf("digite numero 1: "); fflush(stdin); scanf("%i",&x); printf("digite numero 2: "); fflush(stdin); scanf("%i",&y); if ( x > y) { printf("1 eh maior\n"); } else if ( x < y) { printf("2 eh maior\n"); } else printf("são iguais\n"); system("PAUSE"); return 0; } Operador ternário Maneira simples de implantar testes com duas possibilidades: sim/não, > ou <=, 0 ou 1... main(){ int x,y,max; printf("Entre com dois números: "); scanf(“%d%d”,&x,&y); max=(x>y)?1:2; printf("max= %d\n",max); } Qual será o resultado ? Estruturas de condição - switch switch(variável) { case constante1: seqüência de comandos break; case constante2: seqüência de comandos break; default: seqüência de comandos } Estruturas de condição - switch main() { char x; printf("1. inclusão\n"); printf("2. alteração\n"); printf(" Digite sua opção:"); x=getchar(); switch(x) { case '1': printf("escolheu inclusão\n"); break; case '2': printf("escolheu alteração\n"); break; default: printf("opção inválida\n"); } } Video Programador x Webdesigner Array Vetor unidimensional Matriz de 1 linha Ex: int x[9]; É um vetor com 10 posições, cada uma cabendo um inteiro Pilha – implantação em C Definição das variáveis Adicionar 1 elemento – Push Extrair 1 elemento – Pop Listar a pilha Destruir a pilha Pilha – Definição das variáveis #include <stdio.h> #include <stdlib.h> #define MAX 5 char *pilha[MAX]; int qt = 0; Pilha – Exibe pilha Exibe_pilha() { int i; printf("\n\npilha atual"); printf("\n-----------\n"); if (qt == 0) { printf("\nPilha vazia."); } else { for (i = qt-1; i >=0 ; i-- ) { printf("---\n”); printf("|%s|\n",pilha[i]); } printf("---\n“); } printf("total de elementos: %i\n",qt); printf("------------------------------------------------\n",qt); } Pilha – Inclui elemento Push (char *elemento){ if (qt >= MAX){ printf("Estouro de pilha. Impossivel incluir"); exit; } else { printf("\nOperacao PUSH no elemento %s", elemento); pilha[qt] = elemento; qt++; } } Pilha – Exclui elemento Pop (){ if (qt == 0){ printf(“Pilha vazia. Impossivel excluir"); exit; } else { printf("\nOperacao POP no elemento %s", pilha[qt-1]); qt--; } } Pilha – Programa Principal main () { exibe_pilha(); push(‘a’); push(‘b’) push(‘c’); exibe_pilha(); pop(); exibe_pilha(); pop(); exibe_pilha(); pop(); exibe_pilha(); } Desafio – inversão de pilha Crie uma pilha em C. Inverta a pilha e exiba seus resultados. Pilha invertida – Definição das variáveis #include <stdio.h> #include <stdlib.h> #define MAX 5 char *pilha[MAX]; char *pilhainv[MAX]; int qt = 0; Int qtinv = 0; Pilha – Exclui elemento char *Pop (){ char *r; if (qt == 0){ printf(“Pilha vazia. Impossivel excluir"); exit; } else { printf("\nOperacao POP no elemento %s", pilha[qt1]); r = pilha[qt-1]; qt--; } return r; } Estrutura de repetição em C Sintaxe: while(condição) { comando; } Ex: main() { char ch; while(ch!='a') ch=getchar(); } Estrutura de repetição em C Sintaxe: do { comando; } while(condição) Ex: main() { char ch; do {ch=getchar();} while(ch!='a'); } Estrutura de repetição em C char ch; printf("1. inclusão\n 2. alteração\n 3. sair\n"); printf(" Digite sua opção:"); do { ch=getchar(); switch(ch) { case '1': break; case '2': break; case ‘3': printf("sair\n"); } } while(ch!='1' && ch!='2' && ch!='3'); Lista Pode-se inserir um elemento em qualquer posição Pode-se excluir qualquer elemento Serial início Fim Lista encadeada Elemento 1 aponta para elemento 2 que aponta para elemento 3... Último elemento aponta para “vazio” 1 2 3 null Lista encadeada - inclusão Descobre em qual posição deve entrar NOVO ELEMENTO aponta para onde o elemento apontava Elemento anterior aponta para o NOVO ELEMENTO 1 2 novo 3 Lista encadeada - exclusão Varre a lista e descobre o elemento Elemento anterior aponta para onde o elemento excluído aponta 1 2 Elemento excluído 3 Lista encadeada - problemas Como saber o início da lista ? Ponteiros perdidos Alocação dinâmica de memória 1 início 2 3 Estruturas Tipo de dado que define nova estrutura de dados, agrupando com tipos primitivos ou complexos. Exemplo: struct lapis { int dureza; char fabricante; int numero; }; Estruturas main() { struct lapis p[3]; p[0].dureza=2; p[0].fabricante='F'; p[0].numero=482; p[1].dureza=0; p[1].fabricante='G'; p[1].numero=33; p[2].dureza=3; printf("dureza = %i\n",p[1].dureza); printf("fabricante = %c\n",p[1].fabricante); printf("numero = %i\n",p[1].numero); system("PAUSE"); } Estruturas Exercício (15 min): Crie uma estrutura para guardar dados de até 100 alunos: Nome, Série, Email Ponteiros Tipo de dado que “aponta” para outro dado Sintaxe: tipo *nomevar; *nomevar = &variável2; Como se comporta na memória ? Ponteiros - exemplo main(){ int x,*px,*py; x=5; px=&x; py=px; printf("x= %d\n",x); printf("&x= %d\n",&x); printf("px= %d\n",px); printf("*px= %d\n",*px); printf("*py= %d\n",*py); x = 7; printf("*px= %d\n",*px); printf("*py= %d\n",*py); } Ponteiros – operações ++ - aponta para a próxima posição de memória - - aponta para a posição de memória anterior Sintaxe: *p++ *p— Diferenciar *p++ # (*p)++ *p- - # (*p) - - Ponteiros – operações main(){ int x[5],*px,*py; px = &x[0]; x[0] = 2; x[1] = 5; x[2] = 9; x[3] = 15; x[4] = 21; printf("x[0] = %i\n",x[0]); printf("*px = %i\n",*px); *px++; printf("*px = %i\n",*px); printf(“\n”); } Manipular o código acima com “px” e observar resultados. Ponteiros – exercícios Exercício – individual (20 min) Criar um programa em C que aguarde 5 números e armazene em um vetor. Exiba estes números através de ponteiros, de forma descendente. Função Malloc Reserva espaço de memória para alocação dinâmica de variáveis Sintaxe: Variável = malloc(sizeof (tipo)); Ex: v = malloc(100* sizeof(tipo)); Que é o mesmo que a alocação estática int v[100]; Função Free Libera espaço de memória alocado dinamicamente por alguma variável, destruindo seu conteúdo Sintaxe: free(variável); Ex: v = malloc(100* sizeof(tipo)); free(V); Ponteiros de estruturas Como gerar uma lista assim ? 5 0 1 3 NULL Ponteiros de estruturas Ver exemplo em C Lista duplamente encadeada Elemento 1 aponta para elemento 2 que aponta para elemento 3... e vice-versa Existe o “ponteiro” de fim, além do início Último elemento aponta para o ponteiro fim 1 2 Início 3 Fim Lista duplamente encadeada A lista pode ser lida em qualquer ordem facilmente Se torna um pouco mais difícil para implementar Muito mais maleável 1 2 Início 3 Fim UNDB ESTRUTURAS DE DADOS Prof. Alessandro Gonçalves [email protected]