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

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

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.

Apresentações semelhantes


Apresentação em tema: "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."— 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 – 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 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 Exemplo: Se o objetivo fosse apenas obter o resultado na tela: 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 Mas deseja-se transformar a original na transposta Matriz quadrada 5 x 5 original Matriz transposta da original Escrevendo cada coluna numa linha da tela A

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]

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] 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] 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] aux 14 Trocar (A[i][j], A[j][i]): aux = A[i][j]; A[i][j] = A[j][i]; A[j][i] = aux;

8 A 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ê??? 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 A 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

10 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 Variação de i Variação de j i vai de 0 até n-2 j vai de i+1 até n-1 A seguir um programa completo

11 #include #include 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"); } 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 (); printf ("\n\nDigite algo para encerrar: "); getch ();} 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 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 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 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 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 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) 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 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 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 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 linha de A corresponde a 4 linhas de B Cada coluna de A corresponde a 4 colunas 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 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 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 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 A coluna j de A corresponde às colunas de 4j a 4j+3 de B Cálculo de A[i][j]: 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 A[i][j]: 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++) for (y = 4*j; y <= 4*j + 3; y++) aux += B[x][y]; aux += B[x][y]; A[i][j] = aux/16; Cálculo de toda a matriz A: 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 #include 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"); 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"); 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 (); printf ("\n\nDigite algo para encerrar: "); getch ();}

23 Exercícios 6.4: 1.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 2.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 3.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 4.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 5.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 – Cadeias de caracteres como variáveis e constantes Vetores de caracteres são denominados cadeias de caracteres (strings, em Inglês) 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 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 Tudo começa pela existência de constantes do tipo cadeia de caracteres, mas não de constantes vetores numéricos

29 Constante cadeia de caracteres é uma sequência de caracteres delimitada por aspas (), como por exemplo: 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 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: Então, os caracteres componentes da constante anterior são: a, b, c,, D, E, F e \0

30 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 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]; Exemplo: char cad[30]; Mas a declaração com inicialização pode ser feita da seguinte maneira: 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 char cad[] = ABCDE; Esta declaração reserva espaço na memória para os elementos 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: Representação gráfica: A 0 B 1 C 2 D 3 E 4 \0 5 cad

32 Tal como em vetores numéricos, os elementos de uma cadeia de caracteres podem ser referenciados individualmente 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]; Exemplos: cad[3] = b; y = cad[i+1]; A seguinte atribuição não é permitida: 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 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 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 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: 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: 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 printf continuará escrevendo todos os caracteres encontrados pela frente, invadindo locais reservados para outras finalidades, até encontrar um byte que contenha \0 A 0 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 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 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 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 Se o operador digitar ABCDE FGH cadeia lida:ABCDE; caractere lido:32 No vídeo FGH Sobra do buffer do teclado ASCII ( ) = 32 ABCDE\ cad c 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 Não usar &cad O nome de uma variável indexada é por si só um endereço (cf. ponteiros)

37 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 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: 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 Cadeia digitada

38 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 Cadeia digitada 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 b c d e i a cad f d g c h b \0 a 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 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 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 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 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) Seu retorno, que no momento não tem relevância, é um ponteiro (assunto a ser estudado em capítulo específico)

40 #include #include 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]); 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 #include 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]); 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 Função fgets : É uma versão da função gets, só que para leitura em arquivos É uma versão da função gets, só que para leitura em arquivos Pertence ao arquivo stdio.h da biblioteca de C Pertence ao arquivo stdio.h da biblioteca de C Chamada de fgets: 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 Quando lido o enter, ele é colocado em cad antes do \0

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

45 #include #include typedef char cadeia[50]; void main ( ) { int i, j, n, Num[10]; cadeia frases [10]; FILE *filein; filein = fopen ("filefrases", "r"); filein = fopen ("filefrases", "r"); fscanf (filein, "%d", &n); for (i = 0; i <= n-1; i++) { fscanf (filein, "%d", &Num[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])); Num[i], frases[i], strlen (frases[i])); printf ("\n\nDigite algo para encerrar"); getch (); } Resultado no vídeo 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 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 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 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 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 #include 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') { 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 (); } }} Exemplo: seja o seguinte programa Converter cadeia em inteiro? (s/n): s Digite a cadeia: atoi ("728391") = Converter cadeia em inteiro? (s/n): s Digite a cadeia: pe182 atoi ("pe182") = 0 Converter cadeia em inteiro? (s/n): s Digite a cadeia: 625xyz atoi ("625xyz") = 625 Converter cadeia em inteiro? (s/n): n Resultado de uma execução

48 Função atof: converte uma cadeia de caracteres no real correspondente: #include #include 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') { 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 (); } }} Exemplo: seja o seguinte programa Converter cadeia em real? (s/n): s Digite a cadeia: atof (" ") = Converter cadeia em real? (s/n): s Digite a cadeia: e32 atof ("167.23e32") = e+34 Converter cadeia em real? (s/n): s Digite a cadeia: e-15 atof ("0.0012e-15") = 1.2e-18 Converter cadeia em real? (s/n): n Resultado de uma execução

49 Função itoa: converte um inteiro numa cadeia de caracteres correspondente, especificada a base numérica para a escrita: #include #include 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') { while (c == 's' || c == 'S') { printf ("\n\n\tDigite o int e a base: "); printf ("\n\n\tDigite o int e a base: "); scanf ("%d%d", &i, &base); itoa(i, cad, 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 (); }} Exemplo: seja o seguinte programa Converter inteiro em cadeia? (s/n): s Digite o int e a base: (2561)10 = ("2561")10 Converter inteiro em cadeia? (s/n): s Digite o int e a base: 87 8 (87)10 = ("127")8 Converter inteiro em cadeia? (s/n): s Digite o int e a base: ( )10 = ("2bd280")16 Converter inteiro em cadeia? (s/n): n Resultado de uma execução

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 strlen (string length): número de caracteres de uma cadeia Função strcat (string concatenation): concatena 2 cadeias de caracteres Função strcat (string concatenation): concatena 2 cadeias de caracteres Função strcmp (string comparision): compara lexicograficamente 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 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 As 4 funções pertencem ao arquivo string.h da biblioteca

51 Função strlen: Seu argumento é uma cadeia de caracteres Seu argumento é uma cadeia de caracteres Retorna o número de caracteres de seu argumento, sem contabilizar o finalizador \0 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 A seguir, modificação do programa das frases digitadas, com a contagem dos caracteres de cada uma

52 #include #include 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])); 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 Função strcat: Faz a concatenação de 2 cadeias recebidas como argumentos Faz a concatenação de 2 cadeias recebidas como argumentos Ela concatena o segundo argumento no primeiro Ela concatena o segundo argumento no primeiro O primeiro argumento deve ser uma variável cadeia de caracteres 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 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 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 #include 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):"); printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2); strcat (cad1, "ijk"); printf ("\n\nDepois de strcat (cad1, \"ijk\"):"); printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2); 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 cad2: fgh Depois de strcat (cad1, "ijk"): cad1: abcdefghijk cad2: fgh Digite algo para encerrar:

55 Função strcmp: Compara lexicograficamente 2 cadeias recebidas como argumentos Compara lexicograficamente 2 cadeias recebidas como argumentos Os 2 argumentos podem ser variáveis ou constantes do tipo cadeia de caracteres 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 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 #include #include 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): "); do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != '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 Alfredo eh lexicograficamente menor que Maria Comparar mais cadeias? (s/n): s Digite as cadeias: Carlos Carlos Carlos eh lexicograficamente igual a Carlos Carlos eh lexicograficamente igual a Carlos Comparar mais cadeias? (s/n): s Digite as cadeias: Fausto Bianca Fausto eh lexicograficamente maior que Bianca Fausto eh lexicograficamente maior que Bianca Comparar mais cadeias? (s/n): s Digite as cadeias: Nivaldo nivaldo Nivaldo eh lexicograficamente menor que nivaldo Nivaldo eh lexicograficamente menor que nivaldo Comparar mais cadeias? (s/n): n

58 Função strcpy: Recebendo duas cadeias como argumentos, strcpy copia a segunda para a primeira Recebendo duas cadeias como argumentos, strcpy copia a segunda para a primeira O primeiro argumento deve ser uma variável cadeia de caracteres 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 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 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 #include #include 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\ncad1: %s\ncad2: %s", cad1, cad2); printf ("\n\nDigite algo para encerrar"); getch (); getch ();} Resultado de uma execução Digite uma cadeia para cad2: abcde Depois da Copia de cad2 para cad1: cad1: abcde cad2: abcde Depois da Copia de "xyz" para cad2: cad1: abcde cad2: xyz Digite algo para encerrar

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 – 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 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) Os elementos do vetor devem ser nomes (cadeias de caracteres) A leitura e a escrita dos elementos utilizam o formato %s 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 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 #include #include /*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; 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 (); 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 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) Os elementos do vetor devem ser nomes (cadeias de caracteres) O elemento a ser procurado deve ser um nome 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 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 A seguir, um programa da procura binária para nomes

66 /*Diretivas de preprocessamanto e declaracoes*/ #include #include 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);

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: "); 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 enters 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 enters 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 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 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 Entre as cadeias do novo arquivo deve haver apenas um espaço

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

73 #include #include /*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: 1)Escrever um programa para ler várias cadeias de 16 caracteres encerradas por um enter; para cada cadeia: a)Encará-la como a representação binária em complemento de 2 de um número inteiro no intervalo [ ] b)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. 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 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."

Apresentações semelhantes


Anúncios Google