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

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

CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VI Variáveis Indexadas.

Apresentações semelhantes


Apresentação em tema: "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VI Variáveis Indexadas."— Transcrição da apresentação:

1 CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VI Variáveis Indexadas

2 Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres

3 6.1 – A Necessidade de Variáveis Indexadas – Classificação das variáveis Variáveis Escalares Estruturadas Homogêneas – Variáveis Indexadas (arrays – em inglês) Heterogêneas – Estruturas (structs – em inglês)

4 6.1.2 – Contabilização de votos usando só variáveis escalares O programa a seguir utiliza somente variáveis escalares para contabilizar os votos de uma eleição O programa a seguir utiliza somente variáveis escalares para contabilizar os votos de uma eleição São oito candidatos para uma vaga São oito candidatos para uma vaga Cada eleitor deve colocar numa papeleta o número de seu candidato Cada eleitor deve colocar numa papeleta o número de seu candidato O operador, de posse de todas as papeletas, digitará o número contido em cada uma O operador, de posse de todas as papeletas, digitará o número contido em cada uma

5 #include #include void main () { /*Declaracoes*/ int n, cand1, cand2, cand3, cand4, cand5, cand6, cand7, cand8, nulos, voto, i; /*Leitura do numero de votos*/ printf ("Apuracao de eleicao:\n\n\tNumero de votos: "); scanf ("%d",&n); printf ("\n"); E se o número de candidatos fosse maior que 100?

6 /*Inicializacao dos contadores de votos com zero*/ cand1 = cand2 = cand3 = cand4 = cand5 = cand6 = cand7 = cand8 = nulos = 0; /*Leitura e contabilizacao dos votos */ for (i = 1; i <= n; i++) { printf ("\t\tVoto: "); scanf ("%d", &voto); switch (voto) { case 1: cand1++; break; case 2: cand2++; break; case 3: cand3++; break; case 4: cand4++; break; case 5: cand5++; break; case 6: cand6++; break; case 7: cand7++; break; case 8: cand8++; break; default: nulos++; }} E se o número de candidatos fosse maior que 100?

7 /*Escrita do resultado*/ printf ("\n\nResultado: \n\n\tcand1: %d; cand2: %d", cand1, cand2); printf ("\n\tcand3: %d; cand4: %d", cand3, cand4); printf ("\n\tcand5: %d; cand6: %d", cand5, cand6); printf ("\n\tcand7: %d; cand8: %d", cand7, cand8); printf ("\n\tnulos: %d", nulos); printf ("\n\tnulos: %d", nulos); /*Fechamento da tela*/ printf ("\n\nDigite algo para encerrar: "); printf ("\n\nDigite algo para encerrar: "); getch (); } E se o número de candidatos fosse maior que 100?

8 6.1.3 – Contabilização usando variáveis indexadas Variável indexada: destinada a guardar simultaneamente diversos valores de mesmo tipo Variável indexada: destinada a guardar simultaneamente diversos valores de mesmo tipo Os compartimentos destinados a guardar cada um desses valores são denominados elementos de variável indexada Os compartimentos destinados a guardar cada um desses valores são denominados elementos de variável indexada Cada elemento é identificado pelo nome da variável e por um conjunto de índices usado para diferenciá-lo dos demais elementos Cada elemento é identificado pelo nome da variável e por um conjunto de índices usado para diferenciá-lo dos demais elementos Cand[1], Cand[2], Cand[3], Cand[4], Cand[5], Cand[6], Cand[7], Cand[8] Conjuntos com apenas 1 índice cada – há variáveis com mais de 1 índice

9 #include #include void main () { /*Declaracoes - Cand[0] guardarah o numero de votos nulos */ int n, Cand[9], voto, i; /*Leitura do numero de votos*/ printf ("Apuracao de eleicao:\n\n\tNumero de votos: "); scanf ("%d",&n); printf ("\n"); /*Inicializacao do contadores de votos com zero */ for (i = 0; i <= 8; i++) Cand[i] = 0; Em C, o primeiro índice é sempre o zero

10 /*Leitura e contabilizacao dos votos*/ for (i = 1; i <= n; i++) { printf ("\t\tVoto: "); scanf ("%d", &voto); if (voto >= 1 && voto = 1 && voto <= 8)Cand[voto]++; else elseCand[0]++;}

11 /*Escrita do resultado*/ printf ("\n\nResultado: \n"); for (i = 1; i <= 8; i++) printf ("\n\tCandidato[%d]: %d", i, Cand[i]); printf ("\n\n\tnulos: %d", Cand[0]); printf ("\n\n\tnulos: %d", Cand[0]); /*Fechamento da tela*/ printf ("\n\nDigite algo para encerrar: "); printf ("\n\nDigite algo para encerrar: "); getch (); }

12 A declaração em C A declaração em C int Cand[9]; reserva na memória espaço contíguo de 9 inteiros para os 9 elementos da variável Cand Então, Cand é uma variável indexada de 9 elementos do tipo int Então, Cand é uma variável indexada de 9 elementos do tipo int Em C, os índices de toda variável indexada são numerados a partir de 0 (zero) Em C, os índices de toda variável indexada são numerados a partir de 0 (zero) Cand[0], Cand[1], Cand[2], Cand[3], Cand[4], Cand[5], Cand[6], Cand[7], Cand[8]

13 O número de elementos da variável Cand poderia ser bem maior (int Cand[101]; - por exemplo) O número de elementos da variável Cand poderia ser bem maior (int Cand[101]; - por exemplo) O programa poderia prever um número variável de candidatos a cada execução, desde de que não excedesse tal número de elementos (101) O programa poderia prever um número variável de candidatos a cada execução, desde de que não excedesse tal número de elementos (101) O número de elementos poderia ser estabelecido durante a execução, depois que o operador digitasse o número de elementos O número de elementos poderia ser estabelecido durante a execução, depois que o operador digitasse o número de elementos Isso só é possível com variáveis do tipo ponteiro (a serem vistas em capítulo posterior) Isso só é possível com variáveis do tipo ponteiro (a serem vistas em capítulo posterior)

14 Nos comandos, um elemento de variável indexada é referenciado pelo nome seguido de um conjunto de subscritos Nos comandos, um elemento de variável indexada é referenciado pelo nome seguido de um conjunto de subscritos Um subscrito pode ser uma expressão inteira contendo constantes e variáveis Um subscrito pode ser uma expressão inteira contendo constantes e variáveis O índice correspondente a tal subscrito é o valor da expressão O índice correspondente a tal subscrito é o valor da expressão Por exemplo, no programa anterior, os elementos da variável Cand são referenciados por Por exemplo, no programa anterior, os elementos da variável Cand são referenciados por Cand[i] e Cand[voto]

15 São válidos os subscritos dos seguintes elementos: São válidos os subscritos dos seguintes elementos: Cand[2*i + 5] e Cand[voto - 5] É preciso cuidar para que, em tempo de execução, o valor dos subscritos não sejam negativos e não ultrapassem o valor máximo dos índices É preciso cuidar para que, em tempo de execução, o valor dos subscritos não sejam negativos e não ultrapassem o valor máximo dos índices Neste exemplo, o conjunto de subscritos também é unitário Neste exemplo, o conjunto de subscritos também é unitário Semelhantemente aos índices, há variáveis cujo número de subscritos de seus elementos é maior que 1 Semelhantemente aos índices, há variáveis cujo número de subscritos de seus elementos é maior que 1

16 Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações com matrizes numéricas 6.5 – Cadeias de caracteres 6.6 – Aplicações com vetores de cadeias de caracteres

17 6.2 – Vetores e Matrizes – Dimensionamento de variáveis indexadas A variável Cand do programa anterior tem apenas um índice A variável Cand do programa anterior tem apenas um índice Por essa razão ela é denominada variável indexada unidimensional ou matriz unidimensional ou simplesmente vetor Por essa razão ela é denominada variável indexada unidimensional ou matriz unidimensional ou simplesmente vetor

18 Supondo que o conteúdo dos elementos da variável Cand seja: Supondo que o conteúdo dos elementos da variável Cand seja: Cand[0] = 35 Cand[1] = 14 Cand[2] = 7 Cand[3] = 87 Cand[4] = 2 Cand[5] = 21 Cand[6] = 14 Cand[7] = 63 Cand[8] = 16 Então, esta variável pode ter a seguinte representação gráfica: Então, esta variável pode ter a seguinte representação gráfica:

19 Variáveis indexadas podem ser multidimensionais Variáveis indexadas podem ser multidimensionais Por exemplo, pelas declarações em C Por exemplo, pelas declarações em C int A[7][10]; float X[4][8][5]; A é uma variável indexada bidimensional ou matriz bidimensional ou simplesmente matriz de 7 linhas por 10 colunas de elementos do tipo int X é uma matriz tridimensional de 4 x 8 x 5 elementos do tipo float

20 Seja a seguinte representação gráfica da matriz A (7x10) de elementos do tipo int: Seja a seguinte representação gráfica da matriz A (7x10) de elementos do tipo int: Nesta representação, por exemplo, Nesta representação, por exemplo, A[0][9] = 81; A[3][5] = -108; A[1][8] = -83;

21 Exemplo: mapa de acidentes nos cruzamentos de ruas ortogonais O programa a seguir contabiliza os acidentes nos cruzamentos de 10 ruas na direção norte-sul (N-S) com 10 ruas na direção leste-oeste (L-O) O programa a seguir contabiliza os acidentes nos cruzamentos de 10 ruas na direção norte-sul (N-S) com 10 ruas na direção leste-oeste (L-O) Supõe-se que não haja acidentes fora dos cruzamentos Supõe-se que não haja acidentes fora dos cruzamentos No final, ele escreve no vídeo um mapa desses acidentes, no qual as ruas N-S são verticais e as ruas L-O são horizontais No final, ele escreve no vídeo um mapa desses acidentes, no qual as ruas N-S são verticais e as ruas L-O são horizontais Tanto as ruas N-S quanto as L-O são numeradas de 0 a 9 Tanto as ruas N-S quanto as L-O são numeradas de 0 a 9

22 Uma matriz 10x10 de nome Cruza deve guardar os números de acidentes nesses cruzamentos Uma matriz 10x10 de nome Cruza deve guardar os números de acidentes nesses cruzamentos O elemento Cruza[i][j] guarda esse número para o cruzamento da rua horizontal i com a vertical j O elemento Cruza[i][j] guarda esse número para o cruzamento da rua horizontal i com a vertical j O operador recebe várias papeletas, cada uma contendo dois números: o número da rua horizontal e o da rua vertical onde ocorreu um acidente O operador recebe várias papeletas, cada uma contendo dois números: o número da rua horizontal e o da rua vertical onde ocorreu um acidente Esse operador deverá digitar os dados de cada papeleta, na execução do programa Esse operador deverá digitar os dados de cada papeleta, na execução do programa

23 #include #include void main () { /*Declaracoes*/ int i, j, n, rh, rv, Cruza[10][10]; /*Inicializacao da matriz de acidentes com zero*/ for (i=0; i<=9; i++) for (j=0; j<=9; j++) Cruza[i][j] = 0; /*Leitura do numero de acidentes*/ printf ("Mapa de acidentes:\n\n\tNumero de acidentes: "); scanf ("%d", &n); printf ("\n");

24 /*Leitura e contabilizacao dos acidentes de cada cruzamento*/ for (i = 1; i<= n; i++) { printf ("\tCruzamento: "); scanf ("%d%d", &rh, &rv); if (rh >= 0 && rh = 0 && rv = 0 && rh = 0 && rv <= 9)Cruza[rh][rv]++;} /*Escrita do mapa de acidentes no video*/ printf ("\n\n"); for (i = 0; i <= 9; i++) { for (j = 0; j <= 9; j++) printf ("%3d", Cruza[i][j]); printf ("\n"); } Este trecho pode ser mais bem trabalhado

25 /*Fechamento da tela*/ printf ("\n\nDigite algo para encerrar: "); getch (); printf ("\n\nDigite algo para encerrar: "); getch ();} 30 cruzamentos digitados Mapa dos acidentes

26 printf ("\n\n"); printf (" "); for (j=0; j<=9; printf ("__%d", j), j++); printf ("_"); for (i=0; i<=9; i++) { printf ("\n %d|",i); for (j=0; j<=9; j++) { if (Cruza[i][j]) printf ("%3d", Cruza[i][j]); else printf (" "); } printf (" |\n |%32c", '|'); } printf ("\n -"); for (j=0; j<=9; printf ("---"), j++); printf ("--"); Escrita mais trabalhada do mapa de acidentes Mapa dos acidentes

27 6.2.2 – Inicialização de variáveis indexadas nas declarações Variáveis escalares podem ser inicializadas nas declarações: Variáveis escalares podem ser inicializadas nas declarações: int i = 12; float x = 40.7; char b = #; Vetores e matrizes também podem ser inicializadas nas declarações Vetores e matrizes também podem ser inicializadas nas declarações

28 A) Vetores: Na declaração: Na declaração: int A[7] = {2, 5, -4, 7, 15, -20, 6}; os valores dos elementos de A serão os seguintes: A[0] = 2 A[1] = 5 A[2] = -4 A[3] = 7 A[4] = 15 A[5] = -20 A[6] = 6

29 Na declaração: Na declaração: int B[5] = {0}; os valores dos elementos de B serão os seguintes: B[0] = B[1] = B[2] = B[3] = B[4] = 0 É uma forma simples de inicializar com zero todos os elementos de um vetor

30 Na declaração: Na declaração: float C[10] = {3.2, 0.7, -1.2}; float C[10] = {3.2, 0.7, -1.2}; os valores dos elementos de C serão: C[0] = 3.2 C[1] = 0.7 C[2] = -1.2 C[3] = C[4] = C[5] = C[6] = C[7] = C[8] = C[9] = 0 Os elementos C[3] e seguintes, para os quais não há valores entre as chaves { e }, serão zerados

31 Na declaração: Na declaração: float D[ ] = {0.13, -5.23, 4.1, -2.8}; float D[ ] = {0.13, -5.23, 4.1, -2.8}; o número de elementos de D, que não aparece explícito, é igual ao número de constantes entre as chaves, ou seja, 4 Os valores deles serão: D[0] = 0.13; D[1] = -5.23; D[2] = 4.1; D[3] = -2.8;

32 B) Matrizes: várias formas de inicializar Usando um só par de chaves, como na declaração: Usando um só par de chaves, como na declaração: int A[3][4] = {1, 2, 3, 4, 5, 6, 7}; int A[3][4] = {1, 2, 3, 4, 5, 6, 7}; O conteúdo dos elementos da matriz A deve ser A[0][0] = 1 A[0][1] = 2 A[0][2] = 3 A[0][3] = 4 A[1][0] = 5 A[1][1] = 6 A[1][2] = 7 A[1][3] = 0 A[2][0] = 0 A[2][1] = 0 A[2][2] = 0 A[2][3] = 0 O preenchimento desses elementos com os valores da declaração é feito linha por linha

33 Usando um par de chaves interno para cada linha, como na declaração: Usando um par de chaves interno para cada linha, como na declaração: int A[3][4] = {{1, 2, 3}, {4, 5, 6, 7}}; int A[3][4] = {{1, 2, 3}, {4, 5, 6, 7}}; O conteúdo dos elementos da matriz A deve ser A[0][0] = 1 A[0][1] = 2 A[0][2] = 3 A[0][3] = 0 A[1][0] = 4 A[1][1] = 5 A[1][2] = 6 A[1][3] = 7 A[2][0] = 0 A[2][1] = 0 A[2][2] = 0 A[2][3] = 0

34 Seja a declaração: Seja a declaração: int A[][4] = {{1, 2, 3}, {4, 5, 6, 7}, {8, 9}}; int A[][4] = {{1, 2, 3}, {4, 5, 6, 7}, {8, 9}}; Eis o conteúdo dos elementos de A: A[0][0] = 1 A[0][1] = 2 A[0][2] = 3 A[0][3] = 0 A[1][0] = 4 A[1][1] = 5 A[1][2] = 6 A[1][3] = 7 A[2][0] = 8 A[2][1] = 9 A[2][2] = 0 A[2][3] = 0 A falta do número de linhas na declaração é suprida pelo número de pares de chaves internas, que é igual a 3 Para zerar todos os elementos: int A[3][4] = {0}; Para zerar todos os elementos: int A[3][4] = {0};

35 6.2.3 – Atribuições com todos os elementos de uma variável indexada Seja a declaração Seja a declaração int A[10][7], B[10][7]; A atribuição A = B; não é permitida em C A atribuição A = B; não é permitida em C Para copiar todos elementos de B em A: Para copiar todos elementos de B em A: for (i = 0; i < 10; i++) for (j = 0; j < 7; j++) A[i][j] = B[i][j]; No capítulo sobre estruturas, essa proibição pode ser contornada

36 Outra proibição: As declarações As declarações float C[3] = {3.2, 0.7, -1.2}; int A[3][4] = {0}; são permitidas, porém não os comandos float C[3]; int A[3][4]; C = {3.2, 0.7, -1.2}; A = {0};

37 6.2.4 – Leitura e escrita de variáveis indexadas por arquivo em disco A seguir programas para: A seguir programas para: – Leitura de matriz pelo teclado – Leitura de matriz por arquivo em disco – Leitura e escrita de matriz por arquivo em disco

38 #include #include void main () { int A[10][10], m, n, i, j; printf ("Leitura e escrita de matriz\n\n"); do { do { printf ("\nDimensoes m e n (<= 10): "); printf ("\nDimensoes m e n (<= 10): "); scanf ("%d%d", &m, &n); scanf ("%d%d", &m, &n); } while (m 10 || n 10); } while (m 10 || n 10); printf ("\n\n"); printf ("\n\n"); for (i = 0; i <= m-1; i++) { printf ("%d elementos da linha %d: ", n, i); for (j = 0; j <= n-1; j++) scanf ("%d", &A[i][j]); } printf ("\n\nMatriz A:\n\n"); for (i = 0; i <= m-1; i++) { for (j = 0; j <= n-1; j++) printf ("%4d", A[i][j]); printf ("\n\n"); } printf ("\n\nDigite algo para encerrar: "); getch (); } Leitura e escrita de matriz por teclado e vídeo

39 #include #include void main () { int A[10][10], m, n, i, j; FILE *FileIn; FILE *FileIn; FileIn = fopen ("MatrizA", "r"); FileIn = fopen ("MatrizA", "r"); fscanf (FileIn, "%d%d", &m, &n); fscanf (FileIn, "%d%d", &m, &n); for (i = 0; i <= m-1; i++) for (j = 0; j <= n-1; j++) fscanf (FileIn, "%d", &A[i][j]); fscanf (FileIn, "%d", &A[i][j]); printf ("Matriz A:\n\n"); for (i = 0; i <= m-1; i++) { for (j = 0; j <= n-1; j++) printf ("%4d", A[i][j]); printf ("\n\n"); } printf ("\n\nDigite algo para encerrar: "); getch (); } Leitura de matriz por arquivo Conteúdo do arquivo MatrizA : Obs.: A entrada de dados não precisa ser amigável

40 #include #include void main () { int A[10][10], m, n, i, j; FILE *FileIn, *FileOut; FILE *FileIn, *FileOut; FileIn = fopen ("MatrizA", "r"); FileIn = fopen ("MatrizA", "r"); FileOut = fopen ("MatrizASaida", "w"); FileOut = fopen ("MatrizASaida", "w"); fscanf (FileIn, "%d%d", &m, &n); fscanf (FileIn, "%d%d", &m, &n); for (i = 0; i <= m-1; i++) for (j = 0; j <= n-1; j++) fscanf (FileIn, "%d", &A[i][j]); fscanf (FileIn, "%d", &A[i][j]); fprintf (FileOut, "Matriz A:\n\n"); for (i = 0; i <= m-1; i++) { for (j = 0; j <= n-1; j++) fprintf (FileOut, "%4d", A[i][j]); fprintf (FileOut, "%4d", A[i][j]); fprintf (FileOut, "\n\n"); }} Leitura e escrita de matriz por arquivo Obs.: Não é preciso controlar o fechamento da tela Conteúdo do arquivo MatrizASaida Matriz A:

42 typedef float vetor[10]; typedef vetor matriz[10] O tipo matriz também poderia ser declarado por: O tipo matriz também poderia ser declarado por: typedef float matriz[10][10]; Com estes tipos, pode-se declarar: Com estes tipos, pode-se declarar: vetor A, B, C; ao invés de float A[10], B[10], C[10]; matriz M, N, P; ao invés de float M[10][10], N[10][10], P[10][10];

43 Exemplo: Multiplicação de matrizes Duas matrizes podem ser multiplicadas quando o número de colunas da primeira for igual ao número de linhas da segunda Duas matrizes podem ser multiplicadas quando o número de colunas da primeira for igual ao número de linhas da segunda O resultado será uma matriz cujo número de linhas é igual ao da primeira matriz e o de colunas igual ao da segunda O resultado será uma matriz cujo número de linhas é igual ao da primeira matriz e o de colunas igual ao da segunda Essa operação não é comutativa, ou seja, sendo A e B duas matrizes, não necessariamente Essa operação não é comutativa, ou seja, sendo A e B duas matrizes, não necessariamente A * B = B * A Caso A * B seja realizável, B * A só o será também se ambas forem quadradas e de mesmo número de elementos Caso A * B seja realizável, B * A só o será também se ambas forem quadradas e de mesmo número de elementos

44 Método para a multiplicação de A(m x n) por B(n x p) O resultado é uma matriz C(m x p) O resultado é uma matriz C(m x p) A 0,0 A 0,1...A 0,k...A 0,n-1 A 1,0 A 1,1...A 1,k...A 0,n-1 A i,0 A i,1...A i,k...A i,n-1 A m-1,0 A m-1,1...A m-1,k...A m-1,n-1 C 0,0 C 0,1...C 0,j...C 0,p-1 C 1,0 C 1,1...C 1,j...C 1,p-1 C i,0 C i,1...C i,j...C i,p-1 C m-1,0 C m-1,1...C m-1,j...C m-1,p-1 B 0,0 B 0,1...B 0,j...B 0,p-1 B 1,0 B 1,1...B 1,j...B 1,p-1 B k,0 B k,1...B k,j...B k,p-1 B n-1,0 B n-1,1...B n-1,j...B n-1,p-1

45 #include #include typedef int vetor[10]; typedef vetor matriz[10]; void main () { matriz A, B, C; int m, n, p, i, j, k, aux; /* Leitura das duas matrizes operandos */ printf ("Leitura da matriz A:\n\n"); printf ("Numero de linhas e de colunas: "); scanf ("%d%d", &m, &n); printf ("\n"); for (i = 0; i < m; i++) { printf ("Linha %d: ", i); for (j = 0; j < n; j++) scanf ("%d", &A[i][j]); } printf ("\nLeitura da matriz B:\n\n"); printf ("Numero de colunas: "); scanf ("%d", &p); printf ("\n"); for (i = 0; i < n; i++) { printf ("Linha %d: ", i); for (j = 0; j < p; j++) scanf ("%d", &B[i][j]); }

46 /* Calculo da matriz produto */ for (i = 0; i < m; i++) for (j = 0; j < p; j++) { aux = 0; for (k = 0; k < n; k++) aux += A[i][k] * B[k][j]; C[i][j] = aux; } /* Escrita da matriz produto */ printf ("\nMatriz C:\n\n"); for (i = 0; i < m; i++) { for (j = 0; j < p; j++) printf ("%4d", C[i][j]); printf ("\n"); } Usa-se a variável escalar aux para reduzir o número de referências a C[i][j] Cada uma dessas referências requer um cálculo extra para localizar tal elemento na matriz

47 /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch (); } Resultado de uma execução


Carregar ppt "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VI Variáveis Indexadas."

Apresentações semelhantes


Anúncios Google