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

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

Capítulo VI – Variáveis Indexadas

Apresentações semelhantes


Apresentação em tema: "Capítulo VI – Variáveis Indexadas"— Transcrição da apresentação:

1 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

2 6.4 – Aplicações com Matrizes Numéricas
6.4.1 – Transformar uma matriz quadrada em sua transposta Matriz transposta de uma matriz quadrada é aquela cujas linhas são as colunas da matriz original e cujas colunas são as linhas da mesma

3 Matriz quadrada 5 x 5 original Matriz transposta da original
Exemplo: Se o objetivo fosse apenas obter o resultado na tela: for (i = 0; i < n; i++) { for (j = 0; i < n; j++) printf (“%5d”, A[j][i]); printf (“\n”); } Mas deseja-se transformar a original na transposta 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 A Matriz quadrada 5 x 5 original Matriz transposta da original Escrevendo cada coluna numa linha da tela

4 A Operação básica para a transformação: Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A

5 A Operação básica para a transformação: Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A aux 14

6 A Operação básica para a transformação: Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 18 15 16 17 19 20 21 22 23 24 25 A aux 14

7 A Operação básica para a transformação: Trocar A[i][j] com A[j][i]
Exemplo: se i = 2 e j = 3, Trocar A[2][3] com A[3][2] 1 2 3 4 5 6 7 8 9 10 11 12 13 18 15 16 17 14 19 20 21 22 23 24 25 A Trocar (A[i][j], A[j][i]): aux = A[i][j]; A[i][j] = A[j][i]; A[j][i] = aux; aux 14

8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Para transformar toda a matriz: Percorrê-la com 2 cursores ‘i’ e ‘j’ e Trocar (A[i][j], A[j][i]) O percurso não pode abranger toda a matriz!!! Porquê??? A Sejam os comandos: for (i = 0; i < n; i++) for (j = 0; j < n; j++) Trocar (A[i][j], A[j][i]); que percorrem toda a matriz Quando (i, j) = (1, 3) Trocar (A[1][3], A[3][1]) Mais adiante, quando (i, j) = (3, 1) Trocar (A[3][1], A[1][3]) A troca anterior é desfeita

9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Deve-se planejar o percurso de ‘i’ e de ‘j’ Para começar, a diagonal principal não precisa ser percorrida A parte acima dessa diagonal deve ser trocada com a parte abaixo dela A

10 Variação de j 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 i vai de 0 até n-2 j vai de i+1 até n-1 Variação de i A Os comandos: for (i = 0; i <= n-2; i++) for (j = i+1; j <= n-1; j++) Trocar (A[i][j], A[j][i]); percorrem a parte acima da diagonal principal e fazem a troca desejada A seguir um programa completo

11 #include <stdio.h>
#include <conio.h> void main () { int A[10][10], i, j, n, aux; /* Leitura e escrita da matriz */ printf ("Dimensao da matriz quadrada: "); scanf ("%d",&n); printf ("\nElementos da matriz: \n"); for (i = 0; i <= n-1; i++) for (j = 0; j <= n-1; j++) scanf ("%d", &A[i][j]); printf ("\nMatriz original:\n\n"); for (i = 0; i <= n-1; i++) { for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]); printf ("\n"); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A

12 /* Transformacao da matriz em sua transposta e sua escrita */
for (i = 0; i <= n-2; i++) { for (j = i+1; j <= n-1; j++) { aux = A[i][j]; A[i][j] = A[j][i]; A[j][i] = aux; } printf ("\nMatriz transposta:\n\n"); for (i = 0; i <= n-1; i++) { for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]); printf ("\n"); printf ("\n\nDigite algo para encerrar: "); getch (); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 A

13 6.4.2 – Síntese de sub-matrizes
Muito usada em processamento de imagens – p. ex., para o controle de desmatamento numa região Dados captados pela câmera de um satélite são armazenados numa imensa matriz bidimensional, para serem usados na confecção de fotografias Tipicamente uma foto é constituída de uma matriz de pontos, de dimensões bem menores que as da matriz preenchida pela câmera Então cada ponto da foto deve conter uma síntese das informações contidas numa sub-matriz da primeira matriz

14 A seguir, o desenvolvimento de um programa para sintetizar o conteúdo das sub-matrizes de uma grande matriz B em elementos de outra matriz A bem menor que a primeira Dimensões: B(20 x 20) e A(5 x 5) A síntese consiste na média aritmética dos elementos de cada sub-matriz de B Sendo inteiros os elementos de B, então os de A devem ser reais A seguir, um conteúdo possível para a matriz B e o conteúdo correspondente da matriz A

15

16 Cada linha de A corresponde a 4 linhas de B
Cada coluna de A corresponde a 4 colunas de B A linha ‘i’ de A corresponde às linhas de 4i a 4i+3 de B A coluna ‘j’ de A corresponde às colunas de 4j a 4j+3 de B

17 A linha ‘i’ de A corresponde às linhas de 4i a 4i+3 de B
A coluna ‘j’ de A corresponde às colunas de 4j a 4j+3 de B Cálculo de A[i][j]: aux = 0; for (x = 4*i; x <= 4*i + 3; x++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; A[i][j] = aux/16;

18 Cálculo de toda a matriz A:
Cálculo de A[i][j]: aux = 0; for (x = 4*i; x <= 4*i + 3; x++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; A[i][j] = aux/16; Cálculo de toda a matriz A: for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) Cálculo de A[i][j]; A seguir um programa completo

19 #include <stdio.h>
#include <conio.h> void main () { /* Declaracoes das variaveis */ float A[5][5]; int B[20][20]; int i, j, k, x, y, z; float aux; char c; /* Formacao da matriz B (20 x 20) */ for (i = k = 0; i < 20; i++) for (j = 0; j < 20; j++) B[i][j] = ++k;

20 /* Escrita da matriz B (20 x 20) no video */
printf ("Matriz principal? (s/n): "); c = getche (); if (c == 's' || c == 'S') { printf ("\n\n"); for (i = 0; i < 20; i++) for (j = 0; j < 20; j++) printf ("%4d", B[i][j]); } Os 20 elementos preenchem uma linha inteira do vídeo Não é preciso o ‘\n’ no final de cada linha

21 /* Sintetizacao da Matriz B na matriz A */
for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) { aux = 0; for (x = 4*i; x <= 4*i + 3; x++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; A[i][j] = aux/16; }

22 /* Escrita da matriz A(5 x 5) no video */
printf ("\n\nMatriz reduzida? (s/n): "); c = getche (); if (c == 's' || c == 'S') { printf ("\n\n"); for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) printf ("%8.2f", A[i][j]); printf ("\n"); } /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch ();

23 Exercícios 6.4: Escrever um programa para ler os elementos de uma matriz A e quatro inteiros i, j, k, l, formando em seguida outra matriz B, contendo uma submatriz de A composta de suas linhas de i a j e de suas colunas de k a l; no final, o programa deve escrever a matriz B A seguinte matriz tem o apelido de matriz ziguezague de dimensões 5 x 8: Fazer um programa que leia 2 inteiros positivos m e n e em seguida construa e escreva no vídeo uma matriz ziguezague de dimensões m x n

24 As seguintes matrizes têm o apelido de matrizes-cebolas de dimensões (6 x 7) e (8 x 5):
Fazer um programa para ler m e n e construir uma matriz-cebola de dimensões m e n

25 As seguintes matrizes têm o apelido de matrizes-espirais de dimensões 5 e 6:
Fazer um programa para ler n e construir uma matriz-espiral de dimensão n e

26 Fazer um programa para ler o valor de uma variável inteira n, os valores dos elementos reais de uma matriz A triangular superior de dimensões (n x n) e de um vetor B de dimensão n, e resolver o seguinte sistema:

27 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

28 6.5 – Cadeias de Caracteres
6.5.1 – Cadeias de caracteres como variáveis e constantes Vetores de caracteres são denominados cadeias de caracteres (strings, em Inglês) Podem ser manipulados de forma diferenciada em relação aos vetores numéricos, pela maioria das linguagens de programação Tudo começa pela existência de constantes do tipo cadeia de caracteres, mas não de constantes vetores numéricos

29 ‘a’, ‘b’, ‘c’, ‘ ’, ‘D’, ‘E’, ‘F’ e ‘\0’
Constante cadeia de caracteres é uma sequência de caracteres delimitada por aspas (“”), como por exemplo: “abc DEF” Os componentes dessa constante são os caracteres da sequência, sem as aspas, e mais o caractere ‘\0’, que é o finalizador da cadeia Então, os caracteres componentes da constante anterior são: ‘a’, ‘b’, ‘c’, ‘ ’, ‘D’, ‘E’, ‘F’ e ‘\0’

30 Mas a declaração com inicialização pode ser feita da seguinte maneira:
A declaração sem inicialização de uma variável cadeia de caracteres pode ser feita da mesma forma que a de vetores numéricos Exemplo: char cad[30]; Mas a declaração com inicialização pode ser feita da seguinte maneira: char cad[] = “ABCDE”; que é equivalente às seguintes: char cad[] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’}; char cad[6] = “ABCDE”; char cad[6] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’};

31 cad[0], cad[1], cad[2], cad[3], cad[4] e cad[5]
char cad[] = “ABCDE”; Esta declaração reserva espaço na memória para os elementos cad[0], cad[1], cad[2], cad[3], cad[4] e cad[5] e coloca neles os caracteres ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’ Representação gráfica: ‘A’ ‘B’ 1 ‘C’ 2 ‘D’ 3 ‘E’ 4 ‘\0’ 5 cad

32 Exemplos: cad[3] = ‘b’; y = cad[i+1];
Tal como em vetores numéricos, os elementos de uma cadeia de caracteres podem ser referenciados individualmente Exemplos: cad[3] = ‘b’; y = cad[i+1]; A seguinte atribuição não é permitida: cad = “xyzwt”; Porém, se cad for declarada como sendo do tipo ponteiro para caracteres, isso será permitido

33 6.5.2 – Leitura e escrita de cadeias de caracteres
O formato “%s” pode ser usado nas funções printf e scanf para fazer escrita e leitura de valores de variáveis do tipo cadeia de caracteres Função printf: O formato “%s” faz com que os caracteres da variável sejam escritos na tela até que o caractere ‘\0’ seja encontrado, não sendo ele escrito Por exemplo, os comandos: char cad[10] = “ABCDE”; printf (“%s”, cad); escreverão na tela: ABCDE

34 Se a variável cad não contiver o caractere ‘\0’:
printf continuará escrevendo todos os caracteres encontrados pela frente, invadindo locais reservados para outras finalidades, até encontrar um byte que contenha ‘\0’ ‘A’ ‘B’ 1 ‘C’ 2 ‘D’ 3 ‘E’ 4 ‘F’ 5 cad

35 Função scanf : O formato “%s” procura no buffer do teclado o primeiro caractere diferente do espaço em branco, do ‘enter’ e da tabulação Ao encontrá-lo, scanf passa a transportar para a variável alvo da leitura todos os caracteres do buffer, até encontrar um caractere espaço em branco, um ‘enter’ ou uma tabulação Daí, ao invés de transportar o espaço em branco, a tabulação ou o ‘enter’, scanf coloca na variável o finalizador ‘\0’, encerrando a leitura para essa variável

36 Exemplo: seja o seguinte trecho de programa: char cad[20], c;
scanf ("%s%c", cad, &c); printf ("\ncadeia lida:%s; caractere lido:%d", cad, c); Se o operador digitar Não usar &cad O nome de uma variável indexada é por si só um endereço (cf. ponteiros) Se o operador digitar 4 espaços e o ‘enter’: o buffer se esvaziará e o computador ficará esperando nova digitação encerrada por ‘enter’ ‘A’‘B’‘C’‘D’‘E’‘\0’ cad ABCDE FGH<enter> ‘ ’ c FGH<enter> Sobra do buffer do teclado ABCDE FGH cadeia lida:ABCDE; caractere lido:32 No vídeo ASCII (‘ ’) = 32

37 Exemplo experimental: seja o seguinte trecho de programa:
Cuidado: na leitura de uma variável cadeia de caracteres, o número de caracteres digitados não deve exceder o espaço reservado para ela Exemplo experimental: seja o seguinte trecho de programa: char a, b, c, d, cad[5]; int i; printf ("Digite uma cadeia de caracteres:\n\n"); scanf ("%s", cad); printf ("\ncadeia lida:%s", cad); printf ("\n\na=%d; b=%c; c=%c; d=%c;\n", a, b, c, d); for (i = 0; i <= 4; i++) printf ("\n\tcad[%d] = %c", i, cad[i]); abcdefghi<enter> Cadeia digitada

38 Cadeia digitada Resultado no vídeo erro de execução!!!
char a, b, c, d, cad[5]; int i; printf ("Digite uma cadeia de caracteres:\n\n"); scanf ("%s", cad); printf ("\ncadeia lida:%s", cad); printf ("\n\na=%d; b=%c; c=%c; d=%c;", a, b, c, d); for (i = 0; i <= 4; i++) printf ("\n\tcad[%d] = %c", i, cad[i]); abcdefghi<enter> Cadeia digitada ‘b’ ‘c’ ‘d’ ‘e’ ‘i’ ‘a’ cad ‘f’ d ‘g’ c ‘h’ b ‘\0’ a Digite uma cadeia de caracteres: abcdefghi cadeia lida:abcdefghi a=0; b=h; c=g; d=f; cad[0] = a cad[1] = b cad[2] = c cad[3] = d cad[4] = e Resultado no vídeo Alocação das variáveis na memória, pelo compilador Digitando uma sequência maior de caracteres: erro de execução!!!

39 Função gets : A função scanf usando o formato %s encerra a leitura de uma cadeia quando encontra um espaço em branco Então, cadeias contendo espaços em branco não podem ser lidas por ela No entanto, o arquivo stdio.h da biblioteca de C tem a função gets que resolve esse problema Ela recebe como argumento a variável do tipo cadeia para a qual se deseja fazer a leitura Seu retorno, que no momento não tem relevância, é um ponteiro (assunto a ser estudado em capítulo específico)

40 Exemplo: um programa com gets
#include <stdio.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, n; cadeia frases [10]; printf ("Numero de frases (ate 10): "); scanf ("%d", &n); printf ("\n"); for (i = 0; i <= n-1; i++) { printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]); } printf ("\nListagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("%d) %s\n", i+1, frases[i]); printf ("\n\nDigite algo para encerrar"); getch (); Exemplo: um programa com gets Tipo cadeia: para variáveis cadeias de 50 caracteres Variável ‘frases’: vetor de cadeias ou matriz de caracteres A função ‘fflush’ esvazia o buffer do teclado antes da chamada de ‘gets’ Numeração na tela a partir de 1

41 #include <stdio.h> #include <conio.h>
typedef char cadeia[50]; void main ( ) { int i, n; cadeia frases [10]; printf ("Numero de frases (ate 10): "); scanf ("%d", &n); printf ("\n"); for (i = 0; i <= n-1; i++) { printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]); } printf ("\nListagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("%d) %s\n", i+1, frases[i]); printf ("\n\nDigite algo para encerrar"); getch (); Resultado de uma execução: Numero de frases (ate 10): 4 Digite a 1a frase: Gosto muito de Computacao! Digite a 2a frase: A Linguagem C eh fantastica! Digite a 3a frase: Programar eh Engenharia! Digite a 4a frase: Engenheiros devem saber algoritmos! Listagem das frases: 1) Gosto muito de Computacao! 2) A Linguagem C eh fantastica! 3) Programar eh Engenharia! 4) Engenheiros devem saber algoritmos! Digite algo para encerrar

42 fgets (cad, expr, filein);
Função fgets : É uma versão da função gets, só que para leitura em arquivos Pertence ao arquivo stdio.h da biblioteca de C Chamada de fgets: fgets (cad, expr, filein); cad: variável cadeia para a qual se deseja fazer a leitura filein: variável FILE de onde fazer a leitura expr: a função para de ler quando interar expr-1 caracteres lidos ou quando encontrar ‘enter’ Quando lido o ‘enter’, ele é colocado em cad antes do ‘\0’

43 Exemplo: um programa com fgets
#include <stdio.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[i]); fgets (frases[i], 49, filein); } printf ("Listagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("\n%d %s\n\tComprimento: %d\n", Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); Exemplo: um programa com fgets No arquivo, há um número a ser lido, antes de cada frase Serão lidos no máximo 48 caracteres Para conferir o número de caracteres lidos

44 #include <stdio.h>
#include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[i]); fgets (frases[i], 50, filein); } printf ("Listagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("\n%d %s\n\tComprimento: %d\n", Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); 4 1Gosto muito de Computacao! 2A Linguagem C eh fantastica! 3Programar eh Engenharia! 4Engenheiros devem saber algoritmos! Conteúdo do arquivo ‘filefrases’ Não há espaço entre o número inicial e a frase Se houvesse, ele seria lido para a frase

45 #include <stdio.h> #include <string.h>
#include <conio.h> typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[i]); fgets (frases[i], 50, filein); } printf ("Listagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("\n%d %s\n\tComprimento: %d\n", Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); Listagem das frases: 1 Gosto muito de Computacao! Comprimento: 27 2 A Linguagem C eh fantastica! Comprimento: 29 3 Programar eh Engenharia! Comprimento: 25 4 Engenheiros devem saber algoritmos! Comprimento: 36 Digite algo para encerrar Resultado no vídeo O ‘enter’ no final é escrito e contado pelo strlen

46 6.5.3 – Funções para conversão de cadeias de caracteres
Função atoi (ASCII to int): converte uma cadeia de caracteres no inteiro correspondente Função atof (ASCII to float): converte uma cadeia de caracteres no real correspondente Função itoa (int to ASCII): converte um inteiro numa cadeia de caracteres correspondente, especificada a base numérica para a escrita

47 Função atoi: converte uma cadeia de caracteres no inteiro correspondente:
#include <stdio.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i; char c; cadeia cad; printf ("Converter cadeia em inteiro? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\n\tDigite a cadeia: "); scanf ("%s", cad); i = atoi (cad); printf ("\tatoi (\"%s\") = %d", cad, i); printf ("\n\nConverter cadeia em inteiro? (s/n): "); c = getche (); } Converter cadeia em inteiro? (s/n): s Digite a cadeia: atoi ("728391") = Digite a cadeia: pe182 atoi ("pe182") = 0 Digite a cadeia: 625xyz atoi ("625xyz") = 625 Converter cadeia em inteiro? (s/n): n Resultado de uma execução Exemplo: seja o seguinte programa

48 Função atof: converte uma cadeia de caracteres no real correspondente:
#include <stdio.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { float x; char c; cadeia cad; printf ("Converter cadeia em real? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\n\tDigite a cadeia: "); scanf ("%s", cad); x = atof (cad); printf ("\tatof (\"%s\") = %g", cad, x); printf ("\n\nConverter cadeia em real? (s/n): "); c = getche (); } Converter cadeia em real? (s/n): s Digite a cadeia: atof (" ") = Digite a cadeia: e32 atof ("167.23e32") = e+34 Digite a cadeia: e-15 atof ("0.0012e-15") = 1.2e-18 Converter cadeia em real? (s/n): n Resultado de uma execução Exemplo: seja o seguinte programa

49 Função itoa: converte um inteiro numa cadeia de caracteres correspondente, especificada a base numérica para a escrita: #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, base; char c; cadeia cad; printf ("Converter inteiro em cadeia? (s/n): "); c = getche (); while (c == 's' || c == 'S') { printf ("\n\n\tDigite o int e a base: "); scanf ("%d%d", &i, &base); itoa(i, cad, base); printf ("\t(%d)10 = (\"%s\")%d", i, cad, base); printf ("\n\nConverter inteiro em cadeia? (s/n): "); c = getche (); } Converter inteiro em cadeia? (s/n): s Digite o int e a base: (2561)10 = ("2561")10 Digite o int e a base: 87 8 (87)10 = ("127")8 Digite o int e a base: ( )10 = ("2bd280")16 Converter inteiro em cadeia? (s/n): n Resultado de uma execução Exemplo: seja o seguinte programa

50 6.5.4 – Funções para manipulação de cadeias de caracteres
Função strlen (string length): número de caracteres de uma cadeia Função strcat (string concatenation): concatena 2 cadeias de caracteres Função strcmp (string comparision): compara lexicograficamente 2 cadeias de caracteres Função strcpy (string copy): copia o conteúdo de uma cadeia de caracteres em outra As 4 funções pertencem ao arquivo string.h da biblioteca

51 Função strlen: Seu argumento é uma cadeia de caracteres Retorna o número de caracteres de seu argumento, sem contabilizar o finalizador ‘\0’ A seguir, modificação do programa das frases digitadas, com a contagem dos caracteres de cada uma

52 #include <stdio.h> #include <stdlib.h>
#include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { int i, n; cadeia frases [10]; printf ("Numero de frases (ate 10): "); scanf ("%d", &n); printf ("\n"); for (i = 0; i <= n-1; i++) { printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]); } printf ("\nListagem das frases:\n\n"); for (i = 0; i <= n-1; i++) printf ("%d) %s\n\t%d caracteres\n", i+1, frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); Listagem das frases: 1) Gosto muito de Computação! 26 caracteres 2) A Linguagem C eh fantastica! 28 caracteres 3) Programar eh Engenharia! 24 caracteres 4) Engenheiros devem saber algoritmos! 35 caracteres

53 Faz a concatenação de 2 cadeias recebidas como argumentos
Função strcat: Faz a concatenação de 2 cadeias recebidas como argumentos Ela concatena o segundo argumento no primeiro O primeiro argumento deve ser uma variável cadeia de caracteres O segundo argumento deve ser uma variável ou uma constante do mesmo tipo Depois de executada a função, o primeiro argumento guardará a concatenação e o segundo permanecerá inalterado Ver o programa a seguir

54 #include <stdio.h> #include <stdlib.h>
#include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { cadeia cad1, cad2; printf ("Digite uma cadeia: "); gets (cad1); printf ("Digite outra cadeia: "); gets (cad2); printf ("\nAntes da Concatenacao:"); printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2); strcat (cad1, cad2); printf ("\n\nDepois de strcat (cad1, cad2):"); strcat (cad1, "ijk"); printf ("\n\nDepois de strcat (cad1, \"ijk\"):"); printf ("\n\nDigite algo para encerrar: "); getch (); } Digite uma cadeia: abcde Digite outra cadeia: fgh Antes da Concatenacao: cad1: abcde cad2: fgh Depois de strcat (cad1, cad2): cad1: abcdefgh Depois de strcat (cad1, "ijk"): cad1: abcdefghijk Digite algo para encerrar:

55 Compara lexicograficamente 2 cadeias recebidas como argumentos
Função strcmp: Compara lexicograficamente 2 cadeias recebidas como argumentos Os 2 argumentos podem ser variáveis ou constantes do tipo cadeia de caracteres ‘strcmp’ retorna um valor inteiro menor, igual ou maior que zero, dependendo do primeiro argumento ser menor, igual ou maior que o segundo Ver o programa a seguir

56 A seguir, o resultado de uma execução
#include <stdio.h> #include <string.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { cadeia cad1, cad2; char c; printf ("Comparar cadeias? (s/n): "); do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N'); while (c == 's' || c == 'S') { printf ("\n\nDigite as cadeias: "); scanf ("%s%s", cad1, cad2); if (strcmp (cad1, cad2) < 0) printf ("\n\t%s eh lexicograficamente menor que %s", cad1, cad2); else if (strcmp (cad1, cad2) == 0) printf ("\n\t%s eh lexicograficamente igual a %s", cad1, cad2); else printf ("\n\t%s eh lexicograficamente maior que %s", cad1, cad2); printf ("\n\nComparar mais cadeias? (s/n): "); } A seguir, o resultado de uma execução

57 Comparar cadeias? (s/n): s
Digite as cadeias: Alfredo Maria Alfredo eh lexicograficamente menor que Maria Comparar mais cadeias? (s/n): s Digite as cadeias: Carlos Carlos Carlos eh lexicograficamente igual a Carlos Digite as cadeias: Fausto Bianca Fausto eh lexicograficamente maior que Bianca Digite as cadeias: Nivaldo nivaldo Nivaldo eh lexicograficamente menor que nivaldo Comparar mais cadeias? (s/n): n

58 O primeiro argumento deve ser uma variável cadeia de caracteres
Função strcpy: Recebendo duas cadeias como argumentos, strcpy copia a segunda para a primeira O primeiro argumento deve ser uma variável cadeia de caracteres O segundo argumento deve ser uma variável ou uma constante do mesmo tipo Depois de executada a função, o primeiro argumento guardará uma cópia do segundo e esse último permanecerá inalterado Ver o programa a seguir

59 Resultado de uma execução
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> typedef char cadeia[50]; void main ( ) { cadeia cad1, cad2; printf ("Digite uma cadeia para cad2: "); gets (cad2); strcpy (cad1, cad2); printf ("\nDepois da Copia de cad2 para cad1:"); printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2); strcpy (cad2, "xyz"); printf ("\n\nDepois da Copia de \"xyz\" para cad2:"); printf ("\n\nDigite algo para encerrar"); getch (); } Digite uma cadeia para cad2: abcde Depois da Copia de cad2 para cad1: cad1: abcde cad2: abcde Depois da Copia de "xyz" para cad2: cad2: xyz Digite algo para encerrar Resultado de uma execução

60 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

61 6.6 – Aplicações com Vetores de Cadeias de Caracteres
6.6.1 – Bubble-sort para vetores de nomes O programa do Bubble-Sort para vetores numéricos pode ser adaptado para ordenar vetores de cadeias de caracteres Os elementos do vetor devem ser nomes (cadeias de caracteres) A leitura e a escrita dos elementos utilizam o formato %s A comparação de dois nomes é feita com a função strcmp e as atribuições entre elementos são feitas pela função strcpy

62 Programa do Bubble-Sort para nomes
#include <stdio.h> #include <string.h> #include <conio.h> /* Criacao do tipo logic e suas constantes */ typedef char logic; const logic false = 0, true = 1; /* Criacao do tipo nome */ typedef char nome[15]; /* Cabecalho e declarações locais */ void main () { int n, i, p; logic trocou; nome V[50], aux; Programa do Bubble-Sort para nomes

63 /* Leitura do vetor de nomes a ser ordenado */
printf ("Ordenacao de nomes pelo Bubble-Sort\n\n"); printf ("\tNumero de nomes do vetor: "); scanf ("%d",&n); printf ("\n\tNomes: "); for (i = 0; i < n; i++) scanf("%s", V[i]); /* Escrita do vetor desordenado */ printf ("\n\nVetor desordenado:\n"); for (i = 0; i < n; i++) printf("\n%s", V[i]);

64 /* Aplicação do metodo bubble-sort */
for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) { for (trocou = false, i = 0; i <= p; i++) if (strcmp(V[i], V[i+1]) > 0) { strcpy(aux, V[i]); strcpy(V[i], V[i+1]); strcpy(V[i+1], aux); trocou = true; } /* Escrita do vetor ordenado */ printf ("\n\nVetor ordenado:\n"); for (i = 0; i < n; i++) printf("\n%s", V[i]); /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch ();

65 6.6.2 – Procura binária em vetores de nomes
O programa da Procura Binária para vetores numéricos pode ser adaptado para procurar nomes em vetores de nomes Os elementos do vetor devem ser nomes (cadeias de caracteres) O elemento a ser procurado deve ser um nome A comparação do nome procurado com os elementos do vetor é feita com a função strcmp A seguir, um programa da procura binária para nomes

66 /* Diretivas de preprocessamanto e declaracoes */
#include <stdio.h> #include <conio.h> #include <string.h> typedef char logic; const logic false = 0, true = 1; typedef char nome[15]; void main () { int n, i, inf, sup, med; nome V[50], nome; logic achou, erro; char c;

67 /* Leitura dos elementos do vetor */
printf ("PROCURA BINARIA EM VETORES DE NOMES\n\n"); printf ("Numero de nomes do vetor: "); scanf ("%d", &n); printf ("\nNomes: "); for (i = 0; i < n; i++) scanf ("%s", V[i]); /* Verificacao da ordenacao do vetor */ for (i = 0, erro = false; i < n-1 && erro == false; i++) if (strcmp(V[i], V[i+1]) > 0) erro = true; if (erro == true) printf ("\n\tRelacao desordenada: nao havera procuras\n");

68 /* Secao de procuras */ else { clrscr (); printf ("Secao de Procuras:\n\n"); printf ("Procurar nome (s/n)?: "); do c = getche(); while (c != 's' && c != 'n' && c != 's' && c != 'n'); while (c == 's' || c == 'S') { printf ("\n\n\tNome: "); scanf ("%s", nome);

69 /* Procura de um numero no vetor */
achou = false; inf = 0; sup = n - 1; do { med = (inf + sup) / 2; if (strcmp(nome, V[med]) == 0) achou = true; else if (strcmp(nome, V[med]) < 0) sup = med - 1; else inf = med + 1; } while (!achou && inf <= sup);

70 /* Emissao do resultado da procura */
if (achou) printf ("\n\t%s estah na posicao %d da relacao\n\n", nome, med); else printf ("\n\t%s nao estah na relacao\n\n",nome); printf ("Procurar outro numero (s/n)?: "); do c = getche(); while (c != 's' && c != 'n' && c != 's' && c != 'n'); } /* Fechamento da tela */ printf ("\n\nDigite algo para encerrar: "); getch ();

71 6.6.3 – Limpeza de textos Seja um arquivo-texto contendo cadeias de caracteres imprimíveis separadas umas das outras por um ou vários espaços em brancos e/ou ‘enter’s O programa a seguir produz outro arquivo contendo uma cópia de cada cadeia do primeiro que for uma sequência somente de letras ou somente de dígitos decimais Cadeias contendo simultaneamente letras e dígitos decimais não devem fazer parte do novo arquivo Entre as cadeias do novo arquivo deve haver apenas um espaço

72 %&() bxnDJk 953481 B 1 123h asdf8 ; ABCDEfg
Exemplo: Se o conteúdo do arquivo original textoin.dat for: %&() bxnDJk B h asdf8 ; ABCDEfg Então o novo arquivo textout.dat deverá conter: bxnDJk B 1 ABCDEfg

73 #include <stdio.h>
#include <string.h> #include <ctype.h> /* Declaracao dos tipos e constantes logicas e do tipo cadeia */ typedef char logic; const logic TRUE = 1, FALSE = 0; typedef char cadeia[50]; /* Cabecalho e declaracoes locais */ void main () { int n, i; logic erro; cadeia cad; FILE *fin, *fout;

74 /* Abertura dos arquivos de entrada e de saida */
fin = fopen ("textoin.dat", "r"); fout = fopen ("textout.dat", "w"); /* Leitura de uma cadeia do arquivo de entrada e teste de fim de arquivo */ while (fscanf(fin, "%s", cad) == 1) { erro = FALSE; /* Se o primeiro caractere da cadeia for letra, os outros tambem devem ser */ if (isalpha (cad[0])) { for (i = 1, n = strlen (cad); i < n && !erro; i++) if (! isalpha (cad[i])) erro = TRUE; }

75 /* Se o primeiro caractere da cadeia for digito, os outros tambem devem ser */
else if (isdigit (cad[0])) { for (i = 1, n = strlen (cad); i < n && !erro; i++) if (! isdigit (cad[i])) erro = TRUE; } /* Se o primeiro caractere da cadeia nao for letra nem digito: erro */ else erro = TRUE; /* Se nao ha erro na cadeia, escreve-la no arquivo de saida */ if (! erro) fprintf (fout, "%s ", cad);

76 Exercícios 6.6: Escrever um programa para ler várias cadeias de 16 caracteres encerradas por um enter; para cada cadeia: Encará-la como a representação binária em complemento de 2 de um número inteiro no intervalo [ ] Verificar se ela é realmente uma tal representação; se for, encontrar e escrever o número correspondente na base 10 (não esquecer que o número pode ser negativo); senão, emitir uma mensagem de erro Calcular e escrever, na base 10, a somatória dos números encontrados Obs.: A cadeia de caracteres estará errada se não tiver exatamente 16 caracteres ou se tiver algum caractere diferente de ‘0’ e de ‘1’.


Carregar ppt "Capítulo VI – Variáveis Indexadas"

Apresentações semelhantes


Anúncios Google