Revisão para Prova 2 Mirella M. Moro
2 Roteiro 1. Estruturas de decisão 2. Estruturas de repetição 3. Funções 4. Vetores 5. Matrizes 6. Ponteiros 7. Alocação dinâmica
3 1. Estruturas decisão if (condição) comando; else comando; if (condição) { comando1; comando2; else { comando3; comando4;
4 Estruturas decisão: switch switch (var) { case (1): comandos; break; case (2): comandos; break; case (3): comandos; break; default é opcional!
5 2. Estruturas repetição for (var = valor inicial; condição; incremento) comando; while (condição) comando; PRIMEIRO confere condição DEPOIS executa do { comando; while (condição); PRIMEIRO executa DEPOIS confere condição
6 3. Funções e passagem de parâmetro Retorna UM valor Recebe um ou mais como parâmetros Precisa de uma assinatura Determina o tipo do valor retornado Determina o(s) tipo(s) do(s) parâmetro(s) float f = pow (f, 2); f = f^2 assinatura = float pow (float x, float y);
Função 7
8 Vários níveis de chamadas Subprograma Z Função main Subprograma X Execute X; Execute Z; Subprograma Y Execute Y;
9 Funções em C tipo NomeDaFuncao (lista_de_parâmetros) { comandos; return valor_do_tipo; void NomeDaFuncao (lista_de_parâmetros) { comandos; Função do tipo void NÃO TEM COMANDO RETURN
10 Funções em C int SomaDoisNumeros(int A, int B) { return A +B; void ImprimeTexto() { printf( Ola Mundo ); int main() { int r; r= SomaDoisNumeros (30, 50); ImprimeTexto(); return 0; 1 Primeiro define as funções 2 Depois pode usá-las na função main
11 Funções: Passagem de parâmetros Passagem por Valor o parâmetro passado por valor é copiado, ou seja, o valor da variável utilizada como parâmetro não é alterado Passagem por Referência O endereço do parâmetro passado por referência é atribuído à um ponteiro, ou seja, qualquer alteração no conteúdo apontado será refletida no conteúdo da variável utilizada como parâmetro
12 Funções: Passagem de parâmetros void FuncaoQualquer(int A, int* B) { A = 1; *B= 2; main() { int X = 0, Y = 0; printf( %d %d, X, Y); FuncaoQualquer (X, &Y); printf( %d %d, X, Y); system( pause ); A é passado por valor É alterado dentro da função, porém seu valor permanece o mesmo na função main B é passado por referência Qualquer alteração dentro da função é refletida na função main
13 Funções: Passagem de parâmetros void FuncaoQualquer(int* A, int* B) { *A= 1; *B= 2; main() { int X = 0, Y = 0; FuncaoQualquer (& X, &Y); printf( %d %d, X, Y); system( pause ); Como fazer a função retornar MAIS DE UM VALOR
Funções: Escopo de variáveis int teste(int x) { int main() { int y; for(int i=0;i<10;i++) { if(i < 5) { int a; else { int b; Escopo de x 14
Funções: Escopo de variáveis int teste(int x) { int main() { int y; for(int i=0;i<10;i++) { if(i < 5) { int a; else { int b; Escopo de y 15
Funções: Escopo de variáveis int teste(int x) { int main() { int y; for(int i=0;i<10;i++) { if(i < 5) { int a; else { int b; Escopo de i 16
Funções: Escopo de variáveis int teste(int x) { int main() { int y; for(int i=0;i<10;i++) { if(i < 5) { int a; else { int b; Escopo de a 17
Funções: Escopo de variáveis int teste(int x) { int main() { int y; for(int i=0;i<10;i++) { if(i < 5) { int a; else { int b; Escopo de b 18
19 4. Vetores ÍNDICE 0 André 1 Bianca 2 Cleiton 3 Danilo 4 Edson 5 Fernando 6 Glauber 7 Hugo 8 Ivan VALORES
20 Vetores: Memória //declaração: int a[2], b; char c[4]; Inteiro (int): 2 bytes Caractere (char): 1 byte Memória: Endereço Conteúdo ------------------------------ 100 00 101 01 102 00 103 02 104 00 105 10 106 79 ( O ) 107 105 ( i ) 108 33 (! ) 109 63 (? ) Exemplo de uso: a[0] = 1; a[1] = 2; b = 10; c[0] = O ; c[1] = i ; c[2] =! ; c[3] =? ;
21 Vetores: quando usar? Calcular a média da nota de 5 alunos e verificar quantos conseguiram nota acima da média: int i, soma=0; float media, n; for (i=0;i<5;i++){ scanf( %f,&n); soma=soma + n; media = soma/i; Como verificar se a nota de cada aluno é maior que a média?? int acima=0; float media, n1, n2, n3, n4, n5; scanf( %f%f%f%f%f, &n1, &n2, &n3, &n4, &n5); media = (n1+ n2 + n3 + n4 + n5)/5; if (n1>media) acima++; if (n2>media) acima++; if (n3>media) acima++; if (n4>media) acima++; if (n5>media) acima++;
int acima=0; float media, n1, n2, n3, n4, n5; scanf( %f%f%f%f%f, &n1, &n2, &n3, &n4, &n5); media = (n1+ n2 + n3 + n4 + n5)/5; if (n1>media) acima++; if (n2>media) acima++; if (n3>media) acima++; if (n4>media) acima++; if (n5>media) acima++; 22 Lê os 5 valores Calcula média Conta quantos ficaram acima da média
23 Vetores: leitura + impressão int vetor[10], cont; for (cont=0; cont<10; cont++) { printf ("\ndigite um valor inteiro: "); scanf ("%d", &vetor[cont]); for (cont=0; cont<10; cont++) printf ("\no valor em %d = %d\n", cont, vetor[cont]);
Vetores como parâmetro Passa o vetor por referência, sempre! Pois x é um ponteiro x p p+1 p+5 índ val 0 0 1 2 2 4 3 6 4 8 5 10 x é um ponteiro 24
25 5. Matrizes Coluna 0 Coluna 1 Coluna 2 Coluna 3 Linha 0 P[0][0] P[0][1] P[0][2] P[0][3] Linha 1 P[1][0] P[1][1] P[1][2] P[1][3] Linha 2 P[2][0] P[2][1] P[2][2] P[2][3]
26 Matrizes: 1 Declara a matriz L 0 1 2 C 0 1 0 1 1 2 2 3 Define os valores para a matriz Imprime na tela todos os valores Para cada linha, imprime todas as colunas Ao final de cada linha, imprime \n
27 Matrizes: 2 L 0 1 2 C 0 1 1 2 3 4 5 6
Dimensões 28
Dimensões 29
30 Dimensões: Estacionamento São 5 andares de estacionamento Cada andar tem 8 filas de carros Em cada fila cabem 20 carros Qual é a matriz em C? bool estacionamento[5][8][20];
31 Dimensões: Estacionamento Dado o seguinte código, como definir as duas funções? Popula a matriz / atribui valores à cada vaga Imprime X para vagas ocupadas, senão. Chama as funções passando a matriz como parâmetro
32 ( aleatoriamente ) Para cada andar Para cada fila Para cada posição Define um valor para a vaga no estacionamento, entre true ou false
if (true) 33
34 Outros exemplos clássicos Dadas duas matrizes A e B com dimensões x e y, e as seguintes matrizes resultantes: C = A + B D = A B F = A * B H = A t E = B A G = B * A I = B t Implementar as funções para calcular C, D, E, F, G, H, I
35 6. Ponteiros Toda e qualquer variável utilizada por um programa reside em determinado endereço de memória O acesso ao endereço de uma variável pode ser feito simbolicamente através de seu nome. Essa referência é simbólica porque o endereço de memória propriamente dito NÃO é especificado. A declaração: int x =3; produz Variável Valor da Variável Endereço de Memória x 3 AFA1
Ponteiros Variáveis que armazenam endereços de memória 1003 1003 O endereço é a posição de uma outra variável na memória Se uma variável a armazena o endereço de uma variável b, dizemos que a aponta para b. 36
37 Ponteiros int x=10, *p1, *p2; // x é variável do tipo inteiro // p1 e p2 são ponteiros para // variáveis do tipo inteiro p1 = &x; //p1 recebe o endereço de x ( x) p2 = p1; //p2 recebe p1, também printf( %d, *p2); //escreve o valor de x printf( %d, p2); //escreve o endereço de x
38 Ponteiros int i=25; int *p = &i; printf("%d - ", i ); printf("%d - ", *p ); printf("%d - ", &i ); printf("%d - ", p ); 25 25 1004080 1004080
39 7. Alocação Dinâmica int *x = (int *) malloc(sizeof(int)*5); int i; for (i=0; i<5; i++) x[i] = 0; x[1] = 23; printf( %d-%d, x[0], x[1]); free(x);
Alocação, Vetores e Funções 40