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

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

CES-10 INTRODUÇÃO À COMPUTAÇÃO

Apresentações semelhantes


Apresentação em tema: "CES-10 INTRODUÇÃO À COMPUTAÇÃO"— 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
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)

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 São oito candidatos para uma vaga 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

5 #include <stdio.h>
#include <conio.h> 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? 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); /* Fechamento da tela */ 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 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 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 <stdio.h>
#include <conio.h> 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 <= 8) Cand[voto]++; else Cand[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]); /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch (); }

12 Então, Cand é uma variável indexada de 9 elementos do tipo int
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 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 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 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 Um subscrito pode ser uma expressão inteira contendo constantes e variáveis 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 Cand[i] e Cand[voto]

15 Cand[2*i + 5] e Cand[voto - 5]
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 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

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 6.2.1 – Dimensionamento de variáveis indexadas 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

18 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:

19 int A[7][10]; float X[4][8][5];
Variáveis indexadas podem ser multidimensionais 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 A[0][9] = 81; A[3][5] = -108; A[1][8] = -83;
Seja a seguinte representação gráfica da matriz A (7x10) de elementos do tipo int: 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) 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 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
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 Esse operador deverá digitar os dados de cada papeleta, na execução do programa

23 #include <stdio.h>
#include <conio.h> 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 <= 9 && rv >= 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 (); } 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 int i = 12; float x = 40.7; char b = ‘#’;
6.2.2 – Inicialização de variáveis indexadas 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

28 A) Vetores: 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] = A[3] = 7 A[4] = A[5] = A[6] = 6

29 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 C[3] = C[4] = C[5] = C[6] = C[7] = C[8] = C[9] = 0
Na declaração: float C[10] = {3.2, 0.7, -1.2}; os valores dos elementos de C serão: C[0] = C[1] = 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: 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: 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:
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: 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};

35 6.2.3 – Atribuições com todos os elementos de uma variável indexada
Seja a declaração int A[10][7], B[10][7]; A atribuição A = B; não é permitida em C 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 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: Leitura de matriz pelo teclado Leitura de matriz por arquivo em disco Leitura e escrita de matriz por arquivo em disco

38 Leitura e escrita de matriz por teclado e vídeo
#include <stdio.h> #include <conio.h> void main () { int A[10][10], m, n, i, j; printf ("Leitura e escrita de matriz\n\n"); do { printf ("\nDimensoes m e n (<= 10): "); scanf ("%d%d", &m, &n); } while (m < 1 || m > 10 || n < 1 || n > 10); 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 (j = 0; j <= n-1; j++) printf ("%4d", A[i][j]); printf ("\n\nDigite algo para encerrar: "); getch (); Leitura e escrita de matriz por teclado e vídeo

39 Leitura de matriz por arquivo
#include <stdio.h> #include <conio.h> void main () { int A[10][10], m, n, i, j; FILE *FileIn; FileIn = fopen ("MatrizA", "r"); 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]); printf ("Matriz A:\n\n"); for (i = 0; i <= m-1; i++) { 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” : 3 4 Obs.: A entrada de dados não precisa ser amigável

40 Leitura e escrita de matriz por arquivo
#include <stdio.h> void main () { int A[10][10], m, n, i, j; FILE *FileIn, *FileOut; FileIn = fopen ("MatrizA", "r"); FileOut = fopen ("MatrizASaida", "w"); 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]); fprintf (FileOut, "Matriz A:\n\n"); for (i = 0; i <= m-1; i++) { 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 Matriz A: Conteúdo do arquivo “MatrizASaida”

41 typedef float vetor[10]; typedef vetor matriz[10]
6.2.4 – Declaração dos tipos vetor e matriz Sejam as seguintes declarações de tipos: typedef float vetor[10]; typedef vetor matriz[10] Variáveis do tipo vetor são indexadas unidimensionais com 10 elementos do tipo float Variáveis do tipo matriz são indexadas bidimensionais com 10x10 elementos do tipo float

42 typedef float matriz[10][10];
typedef float vetor[10]; typedef vetor matriz[10] O tipo matriz também poderia ser declarado por: typedef float matriz[10][10]; 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 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 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

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) A0,0 A0,1 ... A0,k A0,n-1 A1,0 A1,1 A1,k Ai,0 Ai,1 Ai,k Ai,n-1 Am-1,0 Am-1,1 Am-1,k Am-1,n-1 C0,0 C0,1 ... C0,j C0,p-1 C1,0 C1,1 C1,j C1,p-1 Ci,0 Ci,1 Ci,j Ci,p-1 Cm-1,0 Cm-1,1 Cm-1,j Cm-1,p-1 B0,0 B0,1 ... B0,j B0,p-1 B1,0 B1,1 B1,j B1,p-1 Bk,0 Bk,1 Bk,j Bk,p-1 Bn-1,0 Bn-1,1 Bn-1,j Bn-1,p-1

45 #include <stdio.h>
#include <conio.h> 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++) { 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 Resultado de uma execução
/* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch (); } Resultado de uma execução


Carregar ppt "CES-10 INTRODUÇÃO À COMPUTAÇÃO"

Apresentações semelhantes


Anúncios Google