CES10 INTRODUO COMPUTAO Captulo VI Variveis Indexadas Captulo

  • Slides: 47
Download presentation
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VI Variáveis Indexadas

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

Capítulo VI – Variáveis Indexadas 6. 1 – A necessidade de variáveis indexadas 6.

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

6. 1 – A Necessidade de Variáveis Indexadas 6. 1. 1 – Classificação das

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

6. 1. 2 – Contabilização de votos usando só variáveis escalares n O programa

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

#include <stdio. h> #include <stdlib. h> int main () { /* Declaracoes E se

#include <stdio. h> #include <stdlib. h> int main () { /* Declaracoes E se o número de candidatos fosse maior que 100? */ int n, cand 1, cand 2, cand 3, cand 4, cand 5, cand 6, cand 7, cand 8, nulos, voto, i; /* Leitura do numero de votos */ printf ("Apuracao de eleicao: nnt. Numero de votos: "); scanf ("%d", &n); printf ("n");

/* Inicializacao dos contadores de votos com zero */ cand 1 = cand 2

/* Inicializacao dos contadores de votos com zero */ cand 1 = cand 2 = cand 3 = cand 4 = cand 5 = cand 6 = cand 7 = cand 8 = nulos = 0; E se o número de /* Leitura e contabilizacao dos votos */ candidatos fosse maior que 100? for (i = 1; i <= n; i++) { printf ("tt. Voto: "); scanf ("%d", &voto); switch (voto) { case 1: cand 1++; break; case 2: cand 2++; break; case 3: cand 3++; break; case 4: cand 4++; break; case 5: cand 5++; break; case 6: cand 6++; break; case 7: cand 7++; break; case 8: cand 8++; break; default: nulos++; E se o número de candidatos fosse } maior que 100? }

/* Escrita do resultado */ printf ("nn. Resultado: nntcand 1: %d; cand 2: %d",

/* Escrita do resultado */ printf ("nn. Resultado: nntcand 1: %d; cand 2: %d", cand 1, cand 2); printf ("ntcand 3: %d; cand 4: %d", cand 3, cand 4); printf ("ntcand 5: %d; cand 6: %d", cand 5, cand 6); printf ("ntcand 7: %d; cand 8: %d", cand 7, cand 8); printf ("ntnulos: %d", nulos); E se o número de candidatos fosse /* Fechamento da tela */ maior que 100? printf ("nn"); system ("pause"); return 0; }

6. 1. 3 – Contabilização usando variáveis indexadas n Variável indexada: destinada a guardar

6. 1. 3 – Contabilização usando variáveis indexadas n Variável indexada: destinada a guardar simultaneamente diversos valores de mesmo tipo n 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 Cand[1], Cand[2], Cand[3], por um conjunto de índices usado para diferenciá-lo Cand[4], Cand[5], Cand[6], dos demais elementos Conjuntos com apenas 1 índice cada – n há variáveis com mais de 1 índice Cand[7], Cand[8]

#include <stdio. h> #include <stdlib. h> int main () { Em C, o primeiro

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

/* Leitura e contabilizacao dos votos */ for (i = 1; i <= n;

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

/* Escrita do resultado */ printf ("nn. Resultado: n"); for (i = 1; i

/* Escrita do resultado */ printf ("nn. Resultado: n"); for (i = 1; i <= 8; i++) printf ("nt. Candidato[%d]: %d", i, Cand[i]); printf ("nntnulos: %d", Cand[0]); /* Fechamento da tela */ printf ("nn"); system ("pause"); return 0; }

n A declaração em C int Cand[9]; reserva na memória espaço contíguo de 9

n 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[0], Cand[1], Cand[2], Cand[3], Cand[4], Cand[5], Cand[6], Cand[7], Cand[8] n Então, Cand é uma variável indexada de 9 elementos do tipo int n Em C, os índices de toda variável indexada são numerados a partir de 0 (zero)

n O número de elementos da variável Cand poderia ser bem maior (int Cand[101];

n O número de elementos da variável Cand poderia ser bem maior (int Cand[101]; - por exemplo) n 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) n O número de elementos poderia ser estabelecido durante a execução, depois que o operador digitasse o número de elementos n Isso só é possível com variáveis do tipo ponteiro (a serem vistas em capítulo posterior)

n Nos comandos, um elemento de variável indexada é referenciado pelo nome seguido de

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

n São válidos os subscritos dos seguintes elementos: Cand[2*i + 5] e Cand[voto -

n São válidos os subscritos dos seguintes elementos: Cand[2*i + 5] e Cand[voto - 5] n É 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 n Neste exemplo, o conjunto de subscritos também é unitário n Semelhantemente aos índices, há variáveis cujo número de subscritos de seus elementos é maior que 1

Capítulo VI – Variáveis Indexadas 6. 1 – A necessidade de variáveis indexadas 6.

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

6. 2 – Vetores e Matrizes 6. 2. 1 – Dimensionamento de variáveis indexadas

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

n Supondo que o conteúdo dos elementos da variável Cand seja: Cand[0] = 35

n 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 n Então, esta variável pode ter a seguinte representação gráfica:

n Variáveis indexadas podem ser multidimensionais n Por exemplo, pelas declarações em C int

n Variáveis indexadas podem ser multidimensionais n 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

n Seja a seguinte representação gráfica da matriz A (7 x 10) de elementos

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

Exemplo: mapa de acidentes nos cruzamentos de ruas ortogonais n O programa a seguir

Exemplo: mapa de acidentes nos cruzamentos de ruas ortogonais n 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) n Supõe-se que não haja acidentes fora dos cruzamentos n 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

n Uma matriz 10 x 10 de nome Cruza deve guardar os números de

n Uma matriz 10 x 10 de nome Cruza deve guardar os números de acidentes nesses cruzamentos n O elemento Cruza[i][j] guarda esse número para o cruzamento da rua horizontal i com a vertical j n 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 n Esse operador deverá digitar os dados de cada papeleta, na execução do programa

#include <stdio. h> #include <stdlib. h> int main () { /* Declaracoes */ int

#include <stdio. h> #include <stdlib. h> int main () { /* Declaracoes */ int i, j, n, rh, rv, Cruza[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: nnt. Numero de acidentes: "); scanf ("%d", &n); printf ("n");

/* Leitura e contabilizacao dos acidentes de cada cruzamento */ for (i = 1;

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

/* Fechamento da tela */ printf ("nn"); system ("pause"); return 0; } 30 cruzamentos

/* Fechamento da tela */ printf ("nn"); system ("pause"); return 0; } 30 cruzamentos digitados Mapa dos acidentes

printf ("nn"); printf (" "); for (j=0; j<=9; printf ("__%d", j), j++); printf ("_");

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

6. 2. 2 – Inicialização de variáveis indexadas nas declarações n Variáveis escalares podem

6. 2. 2 – Inicialização de variáveis indexadas nas declarações n Variáveis escalares podem ser inicializadas nas declarações: int i = 12; float x = 40. 7; char b = ‘#’; n Vetores e matrizes também podem ser inicializadas nas declarações

A) Vetores: n Na declaração: int A[7] = {2, 5, -4, 7, 15, -20,

A) Vetores: n 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

n Na declaração: int B[5] = {0}; os valores dos elementos de B serão

n 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

n Na declaração: float C[10] = {3. 2, 0. 7, -1. 2}; os valores

n Na declaração: 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

n Na declaração: float D[ ] = {0. 13, -5. 23, 4. 1, -2.

n Na declaração: 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;

B) Matrizes: várias formas de inicializar n Usando um só par de chaves, como

B) Matrizes: várias formas de inicializar n Usando um só par de chaves, como na declaração: 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[1][0] = 5 A[2][0] = 0 A[0][1] = 2 A[1][1] = 6 A[2][1] = 0 A[0][2] = 3 A[1][2] = 7 A[2][2] = 0 A[0][3] = 4 A[1][3] = 0 A[2][3] = 0 O preenchimento desses elementos com os valores da declaração é feito linha por linha

n Usando um par de chaves interno para cada linha, como na declaração: int

n Usando um par de chaves interno para cada linha, como na declaração: 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[1][0] = 4 A[2][0] = 0 A[0][1] = 2 A[1][1] = 5 A[2][1] = 0 A[0][2] = 3 A[0][3] = 0 A[1][2] = 6 A[1][3] = 7 A[2][2] = 0 A[2][3] = 0

n Seja a declaração: int A[][4] = {{1, 2, 3}, {4, 5, 6, 7},

n Seja a declaração: 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 n Para zerar todos os elementos: int A[3][4] = {0};

6. 2. 3 – Atribuições com todos os elementos de uma variável indexada n

6. 2. 3 – Atribuições com todos os elementos de uma variável indexada n Seja a declaração int A[10][7], B[10][7]; n A atribuição A = B; não é permitida em C n 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

Outra proibição: n As declarações float C[3] = {3. 2, 0. 7, -1. 2};

Outra proibição: n 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};

6. 2. 4 – Leitura e escrita de variáveis indexadas por arquivo em disco

6. 2. 4 – Leitura e escrita de variáveis indexadas por arquivo em disco n 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

#include <stdio. h> #include <stdlib. h> int main () { int A[10], m, n,

#include <stdio. h> #include <stdlib. h> int main () { int A[10], m, n, i, j; printf ("Leitura e escrita de matriznn"); do { printf ("n. Dimensoes m e n (<= 10): "); scanf ("%d%d", &m, &n); } while (m < 1 || m > 10 || n < 1 || n > 10); printf ("nn"); 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 ("nn. Matriz A: nn"); for (i = 0; i <= m-1; i++) { for (j = 0; j <= n-1; j++) printf ("%4 d", A[i][j]); printf ("nn"); } printf ("nn"); system ("pause"); return 0; } Leitura e escrita de matriz por teclado e vídeo

#include <stdio. h> #include <stdlib. h> Leitura de matriz int main () { por

#include <stdio. h> #include <stdlib. h> Leitura de matriz int main () { por arquivo int A[10], m, n, i, j; FILE *File. In; File. In = fopen ("Matriz. A", "r"); Conteúdo do arquivo fscanf (File. In, "%d%d", &m, &n); “Matriz. A” : for (i = 0; i <= m-1; i++) for (j = 0; j <= n-1; j++) 3 4 fscanf (File. In, "%d", &A[i][j]); 23 65 -2 0 printf ("Matriz A: nn"); 45 13 390 -54 for (i = 0; i <= m-1; i++) { 9 -1 -23 7 for (j = 0; j <= n-1; j++) printf ("%4 d", A[i][j]); Obs. : A entrada de printf ("nn"); dados não precisa } ser amigável printf ("nn"); system ("pause"); return 0; }

#include <stdio. h> int main () { Leitura e escrita de int A[10], m,

#include <stdio. h> int main () { Leitura e escrita de int A[10], m, n, i, j; matriz por arquivo FILE *File. In, *File. Out; File. In = fopen ("Matriz. A", "r"); File. Out = fopen ("Matriz. ASaida", "w"); Conteúdo do arquivo fscanf (File. In, "%d%d", &m, &n); “Matriz. A” : for (i = 0; i <= m-1; i++) for (j = 0; j <= n-1; j++) 3 4 fscanf (File. In, "%d", &A[i][j]); 23 65 -2 0 fprintf (File. Out, "Matriz A: nn"); 45 13 390 -54 for (i = 0; i <= m-1; i++) { 9 -1 -23 7 for (j = 0; j <= n-1; j++) fprintf (File. Out, "%4 d", A[i][j]); fprintf (File. Out, "nn"); Matriz A: } 23 65 -2 0 return 0; Conteúdo do } Obs. : Não é preciso arquivo 45 13 390 -54 controlar o fechamento da tela “Matriz. ASaida” 9 -1 -23 7

6. 2. 4 – Declaração dos tipos vetor e matriz n Sejam as seguintes

6. 2. 4 – Declaração dos tipos vetor e matriz n Sejam as seguintes declarações de tipos: typedef float vetor[10]; typedef vetor matriz[10] n Variáveis do tipo vetor são indexadas unidimensionais com 10 elementos do tipo float n Variáveis do tipo matriz são indexadas bidimensionais com 10 x 10 elementos do tipo float

typedef float vetor[10]; typedef vetor matriz[10] n O tipo matriz também poderia ser declarado

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

Exemplo: Multiplicação de matrizes n Duas matrizes podem ser multiplicadas quando o número de

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

Método para a multiplicação de A(m x n) por B(n x p) n O

Método para a multiplicação de A(m x n) por B(n x p) n O resultado é uma matriz C(m x p) A 0, 0 A 0, 1 . . . A 0, k . . . A 0, n-1 C 0, 0 C 0, 1 . . . C 0, j . . . C 0, p-1 A 1, 0 A 1, 1 . . . A 1, k . . . A 0, n-1 C 1, 0 C 1, 1 . . . C 1, j . . . C 1, p-1 ⁞ ⁞ ⁞ Ai, 0 Ai, 1 Ai, n-1 Ci, 0 Ci, 1 ⁞ ⁞ ⁞ Am-1, 1 Am-1, n-1 Cm-1, 1 . . . Cm-1, j . . . Cm-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 ⁞ ⁞ Bk, 0 Bk, 1 ⁞ ⁞ Bn-1, 0 Bn-1, 1 1, 0 ⁞. . . Ai, k . . . ⁞. . . Am-1, k . . . ⁞. . . Ci, j ⁞. . . ⁞ Ci, p-1 ⁞ 1, 0 ⁞. . . Bk, j ⁞. . . Bn-1, j Bk, p-1 ⁞ . . . Bn-1, p-1

#include <stdio. h> #include <stdlib. h> typedef int vetor[10]; typedef vetor matriz[10]; int main

#include <stdio. h> #include <stdlib. h> typedef int vetor[10]; typedef vetor matriz[10]; int main () { matriz A, B, C; int m, n, p, i, j, k, aux; /* Leitura das duas matrizes operandos */ printf ("Leitura da matriz A: nn"); 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 ("n. Leitura da matriz B: nn"); 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]); }

/* Calculo da matriz produto */ Usa-se a variável escalar ‘aux’ para reduzir o

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

/* Fechamento da tela */ printf ("nn "); system ("pause"); return 0; } Resultado

/* Fechamento da tela */ printf ("nn "); system ("pause"); return 0; } Resultado de uma execução