Transcript
Page 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

Capítulo VI – Variáveis Capítulo VI – Variáveis IndexadasIndexadas

6.1 – A necessidade de variáveis indexadas6.1 – A necessidade de variáveis indexadas

6.2 – Vetores e matrizes6.2 – Vetores e matrizes

6.3 – Aplicações com vetores numéricos6.3 – Aplicações com vetores numéricos

6.4 – Aplicações com matrizes numéricas6.4 – Aplicações com matrizes numéricas

6.5 – Cadeias de caracteres6.5 – Cadeias de caracteres

6.6 – Aplicações com vetores de cadeias de 6.6 – Aplicações com vetores de cadeias de caracterescaracteres

Page 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

6.4 – Aplicações com 6.4 – Aplicações com Matrizes NuméricasMatrizes Numéricas

6.4.1 – Transformar uma matriz 6.4.1 – Transformar uma matriz quadrada em sua transpostaquadrada em sua transposta

Matriz transpostaMatriz transposta de uma matriz quadrada é de uma matriz quadrada é aquela cujas aquela cujas linhaslinhas são as são as colunascolunas da matriz da matriz original e cujas original e cujas colunascolunas são as linhas da são as linhas da mesmamesma

Page 3: 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

Exemplo:Exemplo:

Se o objetivo fosse apenas Se o objetivo fosse apenas obter o resultado na obter o resultado na telatela::

for (i = 0; i < n; i++) for (i = 0; i < n; i++) {{

for (j = 0; i < n; j++) for (j = 0; i < n; j++)

printf (“%5d”, A[j][i]); printf (“%5d”, A[j][i]);

printf (“\n”);printf (“\n”); }}

Mas deseja-se Mas deseja-se transformartransformar a original na a original na transpostatransposta

Matriz quadrada 5 x 5 original

Matriz transposta da original

Escrevendo cada coluna numa linha da tela

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2

1 6 11

16

212 7 1

217

223 8 1

318

234 9 1

419

245 1

015

20

25

0 1 2 3 4

0

1

4

3

2A

Page 4: 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

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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]

Page 5: 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

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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

Page 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

1 2 3 4 5

6 7 8 9 101

112

13

18

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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

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

1 2 3 4 5

6 7 8 9 101

112

13

18

151

617

14

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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;

Page 8: 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

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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

Page 9: 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

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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

Page 10: 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

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 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

Page 11: 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

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

void main () {void main () {

int A[10][10], i, j, n, aux;int A[10][10], i, j, n, aux;

/*/* Leitura e escrita da matrizLeitura e escrita da matriz */*/

printf ("Dimensao da matriz quadrada: "); printf ("Dimensao da matriz quadrada: ");

scanf ("%d",&n);scanf ("%d",&n);

printf ("\nElementos da matriz: \n");printf ("\nElementos da matriz: \n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

for (j = 0; j <= n-1; j++) scanf ("%d", &A[i][j]);for (j = 0; j <= n-1; j++) scanf ("%d", &A[i][j]);

printf ("\nMatriz original:\n\n");printf ("\nMatriz original:\n\n");

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]);for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]);

printf ("\n");printf ("\n");

}}

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 A

Page 12: 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

/*/* Transformacao da matriz em sua transposta e sua Transformacao da matriz em sua transposta e sua escritaescrita */*/

for (i = 0; i <= n-2; i++) {for (i = 0; i <= n-2; i++) {

for (j = i+1; j <= n-1; j++) {for (j = i+1; j <= n-1; j++) {

aux = A[i][j]; aux = A[i][j];

A[i][j] = A[j][i]; A[i][j] = A[j][i];

A[j][i] = aux;A[j][i] = aux;

}}

}}

printf ("\nMatriz transposta:\n\n");printf ("\nMatriz transposta:\n\n");

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]);for (j = 0; j <= n-1; j++) printf ("%5d", A[i][j]);

printf ("\n");printf ("\n");

}}

printf ("\n\nDigite algo para encerrar: "); getch ();printf ("\n\nDigite algo para encerrar: "); getch ();

}}

1 2 3 4 5

6 7 8 9 101

112

13

14

151

617

18

19

202

122

23

24

25

0 1 2 3 4

0

1

4

3

2 A

Page 13: 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

6.4.2 – Síntese de sub-matrizes6.4.2 – Síntese de sub-matrizes

Muito usada em Muito usada em processamento de imagensprocessamento de imagens – p. – p. ex., para o controle de ex., para o controle de desmatamentodesmatamento numa numa regiãoregião

DadosDados captados pela captados pela câmeracâmera de um satélite são de um satélite são armazenados numa armazenados numa imensa matrizimensa matriz bidimensional, bidimensional, para serem usados na confecção de para serem usados na confecção de fotografiasfotografias

Tipicamente uma Tipicamente uma fotofoto é constituída de uma é constituída de uma matriz de pontosmatriz de pontos, de dimensões , de dimensões bem menoresbem menores que as da matriz preenchida pela que as da matriz preenchida pela câmeracâmera

Então cada Então cada ponto da fotoponto da foto deve conter uma deve conter uma síntesesíntese das informações contidas numa das informações contidas numa sub-sub-matrizmatriz da primeira matriz da primeira matriz

Page 14: 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

A seguir, o desenvolvimento de um programa A seguir, o desenvolvimento de um programa para para sintetizarsintetizar o conteúdo das o conteúdo das sub-matrizessub-matrizes de uma grande matriz de uma grande matriz BB em em elementoselementos de de outra matriz outra matriz AA bem bem menormenor que a primeira que a primeira

Dimensões: Dimensões: B(20 x 20)B(20 x 20) e e A(5 x 5)A(5 x 5)

A A síntesesíntese consiste na consiste na média aritméticamédia aritmética dos dos elementos de cada sub-matriz de elementos de cada sub-matriz de BB

Sendo inteiros os elementos de Sendo inteiros os elementos de BB, então os de , então os de AA devem ser reais devem ser reais

A seguir, um conteúdo possível para a matriz A seguir, um conteúdo possível para a matriz B B e o conteúdo correspondente da matriz e o conteúdo correspondente da matriz AA

Page 15: 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
Page 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

Cada linha de Cada linha de A corresponde A corresponde a 4 linhas de Ba 4 linhas de B

Cada coluna de Cada coluna de A corresponde A corresponde a 4 colunas de a 4 colunas de BB

A linha ‘i’ de A A linha ‘i’ de A corresponde às corresponde às linhas de 4i a linhas de 4i a 4i+3 de B4i+3 de B

A coluna ‘j’ de A coluna ‘j’ de A corresponde A corresponde às colunas de às colunas de 4j a 4j+3 de B 4j a 4j+3 de B

Page 17: 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

A linha ‘i’ de A A linha ‘i’ de A corresponde corresponde às linhas de 4i às linhas de 4i a 4i+3 de Ba 4i+3 de B

A coluna ‘j’ de A coluna ‘j’ de A corresponde A corresponde às colunas de às colunas de 4j a 4j+3 de B4j a 4j+3 de B

Cálculo de Cálculo de A[i][j]: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;

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

Cálculo de A[i][j]:Cálculo de A[i][j]:

aux = 0;aux = 0;

for (x = 4*i; x <= 4*i + 3; x++)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;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 (i = 0; i < 5; i++)

for (j = 0; j < 5; j++)for (j = 0; j < 5; j++)

Cálculo de A[i][j];Cálculo de A[i][j];

A seguir um programa completo

Page 19: 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

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

void main () {void main () {

/*/* Declaracoes das variaveisDeclaracoes das variaveis */*/

float A[5][5]; int B[20][20];float A[5][5]; int B[20][20];

int i, j, k, x, y, z; float aux; char c;int i, j, k, x, y, z; float aux; char c;

/*/* Formacao da matriz B (20 x 20)Formacao da matriz B (20 x 20) */*/

for (i = k = 0; i < 20; i++)for (i = k = 0; i < 20; i++)

for (j = 0; j < 20; j++)for (j = 0; j < 20; j++)

B[i][j] = ++k;B[i][j] = ++k;

Page 20: 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

/*/* Escrita da matriz B (20 x 20) no videoEscrita da matriz B (20 x 20) no video */*/

printf ("Matriz principal? (s/n): ");printf ("Matriz principal? (s/n): ");

c = getche ();c = getche ();

if (c == 's' || c == 'S') {if (c == 's' || c == 'S') {

printf ("\n\n");printf ("\n\n");

for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)

for (j = 0; j < 20; j++) for (j = 0; j < 20; j++)

printf ("%4d", B[i][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

Page 21: 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

/*/* Sintetizacao da Matriz B na matriz ASintetizacao da Matriz B na matriz A */*/

for (i = 0; i < 5; i++)for (i = 0; i < 5; i++)

for (j = 0; j < 5; j++) {for (j = 0; j < 5; j++) {

aux = 0;aux = 0;

for (x = 4*i; x <= 4*i + 3; x++)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;A[i][j] = aux/16;

}}

Page 22: 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

/*/* Escrita da matriz A(5 x 5) no videoEscrita da matriz A(5 x 5) no video */*/

printf ("\n\nMatriz reduzida? (s/n): ");printf ("\n\nMatriz reduzida? (s/n): ");

c = getche ();c = getche ();

if (c == 's' || c == 'S') {if (c == 's' || c == 'S') {

printf ("\n\n");printf ("\n\n");

for (i = 0; i < 5; i++) {for (i = 0; i < 5; i++) {

for (j = 0; j < 5; j++) printf ("%8.2f", for (j = 0; j < 5; j++) printf ("%8.2f", A[i][j]);A[i][j]);

printf ("\n");printf ("\n");

}}

}}

/*/* Fechamento da telaFechamento da tela */*/

printf ("\n\nDigite algo para encerrar: "); getch ();printf ("\n\nDigite algo para encerrar: "); getch ();

}}

Page 23: 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

Exercícios 6.4:Exercícios 6.4:

1.1. Escrever um programa para ler os elementos Escrever um programa para ler os elementos de uma matriz de uma matriz AA e quatro inteiros e quatro inteiros ii, , jj, , kk, , ll, , formando em seguida outra matriz formando em seguida outra matriz BB, , contendo uma submatriz de contendo uma submatriz de AA composta de composta de suas linhas de suas linhas de i i a a jj e de suas colunas de e de suas colunas de kk a a ll; ; no final, o programa deve escrever a matriz no final, o programa deve escrever a matriz BB

2.2. A seguinte matriz tem o apelido de A seguinte matriz tem o apelido de matriz matriz ziguezagueziguezague de dimensões 5 x 8: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

Page 24: 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

3.3. As seguintes matrizes têm o apelido de As seguintes matrizes têm o apelido de matrizes-cebolasmatrizes-cebolas de dimensões de dimensões (6 x 7)(6 x 7) e e (8 (8 x 5)x 5)::

Fazer um programa para ler Fazer um programa para ler m m ee n n e construir e construir uma matriz-cebola de dimensões uma matriz-cebola de dimensões m m e e nn

Page 25: 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

4.4. As seguintes matrizes têm o apelido de As seguintes matrizes têm o apelido de matrizes-espiraismatrizes-espirais de dimensões de dimensões 5 5 e e 66::

Fazer um programa para ler Fazer um programa para ler nn e construir e construir uma matriz-espiral de dimensão uma matriz-espiral de dimensão nn

e

Page 26: 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

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

Page 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

Capítulo VI – Variáveis Capítulo VI – Variáveis IndexadasIndexadas

6.1 – A necessidade de variáveis indexadas6.1 – A necessidade de variáveis indexadas

6.2 – Vetores e matrizes6.2 – Vetores e matrizes

6.3 – Aplicações com vetores numéricos6.3 – Aplicações com vetores numéricos

6.4 – Aplicações com matrizes numéricas6.4 – Aplicações com matrizes numéricas

6.5 – Cadeias de caracteres6.5 – Cadeias de caracteres

6.6 – Aplicações com vetores de cadeias de 6.6 – Aplicações com vetores de cadeias de caracterescaracteres

Page 28: 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

6.5 – Cadeias de Caracteres6.5 – Cadeias de Caracteres

6.5.1 – Cadeias de caracteres como 6.5.1 – Cadeias de caracteres como variáveis e constantesvariáveis e constantes

VetoresVetores dede caracterescaracteres são denominados são denominados cadeias de caracterescadeias de caracteres ( (stringsstrings, em Inglês) , em Inglês)

Podem ser manipulados de forma Podem ser manipulados de forma diferenciadadiferenciada em relação aos em relação aos vetores numéricosvetores numéricos, pela , pela maioria das linguagens de programaçãomaioria das linguagens de programação

Tudo começa pela existência de Tudo começa pela existência de constantesconstantes do do tipo tipo cadeia de caracterescadeia de caracteres, mas não de , mas não de constantes vetores numéricosconstantes vetores numéricos

Page 29: 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

Constante cadeia de caracteresConstante cadeia de caracteres é uma é uma sequência de caracteres delimitada por sequência de caracteres delimitada por aspas aspas (“”)(“”), como por exemplo:, como por exemplo:

““abc DEF”abc DEF”

Os Os componentescomponentes dessa constante são os dessa constante são os caracteres da sequênciacaracteres da sequência, sem as aspas, e , sem as aspas, e mais o caractere mais o caractere ‘\0’‘\0’, que é o , que é o finalizadorfinalizador da da cadeiacadeia

Então, os Então, os caracterescaracteres componentes da componentes da constante anterior são: constante anterior são:

‘‘a’, ‘b’, ‘c’, ‘ ’, ‘D’, ‘E’, ‘F’ a’, ‘b’, ‘c’, ‘ ’, ‘D’, ‘E’, ‘F’ ee ‘\0’ ‘\0’

Page 30: 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

A A declaraçãodeclaração sem inicialização de uma sem inicialização de uma variável cadeia de caracteresvariável cadeia de caracteres pode ser feita pode ser feita da mesma forma que a de vetores numéricosda mesma forma que a de vetores numéricos

Exemplo: Exemplo: char cad[30];char cad[30];

Mas a Mas a declaração com inicializaçãodeclaração com inicialização pode ser pode ser feita da seguinte maneira:feita da seguinte maneira:

char cad[] = “ABCDE”;char cad[] = “ABCDE”;

que é equivalente às seguintes:que é equivalente às seguintes:

char cad[] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’};char cad[] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’};

char cad[6] = “ABCDE”;char cad[6] = “ABCDE”;

char cad[6] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’};char cad[6] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘\0’};

Page 31: 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

char cad[] = “ABCDE”;char cad[] = “ABCDE”;

Esta declaração reserva espaço na memória Esta declaração reserva espaço na memória para os elementospara os elementos

cad[0]cad[0], , cad[1]cad[1], , cad[2]cad[2], , cad[3]cad[3], , cad[4]cad[4] e e cad[5]cad[5]

e coloca neles os caracteres e coloca neles os caracteres ‘A’‘A’, , ‘B’‘B’, , ‘C’‘C’, , ‘D’‘D’, , ‘E’‘E’, , ‘\0’‘\0’

Representação gráfica:Representação gráfica:‘A’

0

‘B’

1

‘C’

2

‘D’

3

‘E’

4

‘\0’

5

cad

Page 32: 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

Tal como em vetores numéricos, os Tal como em vetores numéricos, os elementoselementos de uma cadeia de caracteres podem ser de uma cadeia de caracteres podem ser referenciados individualmentereferenciados individualmente

Exemplos:Exemplos: cad[3] = ‘b’; y = cad[i+1];cad[3] = ‘b’; y = cad[i+1];

A seguinte atribuição A seguinte atribuição não é permitidanão é permitida::

cad = “xyzwt”;cad = “xyzwt”;

Porém, se Porém, se cadcad for declarada como sendo do for declarada como sendo do tipo tipo ponteiroponteiro para caracteres, isso será para caracteres, isso será permitidopermitido

Page 33: 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

6.5.2 – Leitura e escrita de cadeias de 6.5.2 – Leitura e escrita de cadeias de caracterescaracteres

O formato O formato “%s”“%s” pode ser usado nas funções pode ser usado nas funções printf printf e e scanf scanf para fazer para fazer escrita e leituraescrita e leitura de valores de variáveis do tipo de valores de variáveis do tipo cadeia de cadeia de caracterescaracteres

Função printf:Função printf:

O formato O formato “%s”“%s” faz com que os caracteres da faz com que os caracteres da variável sejam variável sejam escritosescritos na tela até que o na tela até que o caractere caractere ‘\0’‘\0’ seja encontrado, não sendo ele seja encontrado, não sendo ele escritoescrito

Por exemplo, os comandos:Por exemplo, os comandos:

char cad[10] = “ABCDE”;printf (“%s”, cad);

escreverão na tela:

ABCDE

Page 34: 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

Se a variável Se a variável cadcad não contiver o caractere não contiver o caractere ‘\0’‘\0’::

printfprintf continuará escrevendo todos os continuará escrevendo todos os caracteres encontrados pela frente, caracteres encontrados pela frente, invadindoinvadindo locais reservados para outras finalidades, até locais reservados para outras finalidades, até encontrar um encontrar um bytebyte que contenha que contenha ‘\0’‘\0’

‘A’

0

‘B’

1

‘C’

2

‘D’

3

‘E’

4

‘F’

5

cad

Page 35: 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

Função scanf :Função scanf :

O formato O formato “%s”“%s” procura no procura no buffer do tecladobuffer do teclado o primeiro caractere diferente do espaço em o primeiro caractere diferente do espaço em branco, do branco, do ‘enter’ ‘enter’ e da tabulaçãoe da tabulação

Ao encontrá-lo, Ao encontrá-lo, scanfscanf passa a transportar para passa a transportar para a a variávelvariável alvo da leitura todos os caracteres alvo da leitura todos os caracteres do do bufferbuffer, até encontrar um caractere espaço , até encontrar um caractere espaço em branco, um em branco, um ‘enter’‘enter’ ou uma tabulação ou uma tabulação

Daí, ao invés de transportar o espaço em Daí, ao invés de transportar o espaço em branco, a tabulação ou o branco, a tabulação ou o ‘enter’‘enter’, , scanfscanf coloca coloca na variável o finalizador na variável o finalizador ‘\0’‘\0’, encerrando a , encerrando a leitura para essa variávelleitura para essa variável

Page 36: 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

Exemplo: Exemplo: seja o seguinte trecho de programa:seja o seguinte trecho de programa:

char cad[20], c;char cad[20], c;

scanf ("%s%c", cad, &c);scanf ("%s%c", cad, &c);

printf ("\ncadeia lida:printf ("\ncadeia lida:%s%s; caractere lido:; caractere lido:%d%d", cad, ", cad, c);c);

Se o operador digitarSe o operador digitar ABCDE FGH<enter>

ABCDE FGH

cadeia lida:ABCDE; caractere lido:32

No vídeoFGH<enter>Sobra do buffer do teclado

ASCII (‘ ’) = 32

‘A’‘B’‘C’‘D’‘E’‘\0’ . . . . .

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)

Page 37: 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

Cuidado:Cuidado: na na leituraleitura de uma variável de uma variável cadeia cadeia de caracteresde caracteres, o número de caracteres , o número de caracteres digitados digitados não deve exceder o espaço não deve exceder o espaço reservadoreservado para ela para ela

Exemplo experimental: Exemplo experimental: seja o seguinte seja o seguinte trecho de programa: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

Page 38: 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

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

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!!!

Page 39: 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

Função gets :Função gets :

A função A função scanfscanf usando o formato usando o formato %s%s encerra a encerra a leitura de uma cadeia quando encontra um leitura de uma cadeia quando encontra um espaço em brancoespaço em branco

Então, cadeias contendo Então, cadeias contendo espaços em brancoespaços em branco não podem ser lidas por elanão podem ser lidas por ela

No entanto, o arquivo No entanto, o arquivo stdio.hstdio.h da biblioteca de C da biblioteca de C tem a função tem a função getsgets que resolve esse problema que resolve esse problema

Ela recebe como Ela recebe como argumentoargumento a variável do tipo a variável do tipo cadeiacadeia para a qual se deseja fazer a leitura para a qual se deseja fazer a leitura

Seu Seu retornoretorno, que no momento não tem , que no momento não tem relevância, é um relevância, é um ponteiroponteiro (assunto a ser (assunto a ser estudado em capítulo específico)estudado em capítulo específico)

Page 40: 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

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, n; int i, n; cadeia frases [10];cadeia frases [10];

printf ("Numero de frases (ate 10): ");printf ("Numero de frases (ate 10): ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\n");printf ("\n");

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

printf ("Digite a %da frase: ", i+1);printf ("Digite a %da frase: ", i+1);

fflush (stdin); gets (frases[i]);fflush (stdin); gets (frases[i]);

}}

printf ("\nListagem das frases:\n\n");printf ("\nListagem das frases:\n\n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

printf ("%d) %s\n", i+1, frases[i]);printf ("%d) %s\n", i+1, frases[i]);

printf ("\n\nDigite algo para encerrar"); getch ();printf ("\n\nDigite algo para encerrar"); getch ();

}}

Exemplo: um programa com getsTipo cadeia: para

variáveis cadeias de 50 caracteresVariá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

Page 41: 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

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, n; cadeia frases [10];int i, n; cadeia frases [10];

printf ("Numero de frases (ate 10): ");printf ("Numero de frases (ate 10): ");

scanf ("%d", &n);scanf ("%d", &n);

printf ("\n");printf ("\n");

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

printf ("Digite a %da frase: ", i+1);printf ("Digite a %da frase: ", i+1);

fflush (stdin); gets (frases[i]);fflush (stdin); gets (frases[i]);

}}

printf ("\nListagem das frases:\n\n");printf ("\nListagem das frases:\n\n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

printf ("%d) %s\n", i+1, frases[i]);printf ("%d) %s\n", i+1, frases[i]);

printf ("\n\nDigite algo para encerrar"); getch ();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

Page 42: 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

Função fgets :Função fgets :

É uma versão da função É uma versão da função getsgets, só que para leitura em , só que para leitura em arquivosarquivos

Pertence ao arquivo Pertence ao arquivo stdio.hstdio.h da biblioteca de C da biblioteca de C

Chamada de Chamada de fgetsfgets::

fgets (cad, expr, filein);fgets (cad, expr, filein);

cad: cad: variável cadeia para a qual se deseja fazer a variável cadeia para a qual se deseja fazer a leituraleitura

filein:filein: variável variável FILEFILE de onde fazer a leitura de onde fazer a leitura

expr: expr: a função para de ler quando interar a função para de ler quando interar expr-1 expr-1 caracteres caracteres lidos ou quando encontrar lidos ou quando encontrar ‘enter’‘enter’

Quando lido o Quando lido o ‘enter’‘enter’, ele é colocado em , ele é colocado em cadcad antes antes do do ‘\0’‘\0’

Page 43: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, j, n, int i, j, n, Num[10]Num[10]; cadeia frases [10]; FILE *filein;; cadeia frases [10]; FILE *filein;

filein = fopen ("filefrases", "r");filein = fopen ("filefrases", "r");

fscanf (filein, "%d", &n);fscanf (filein, "%d", &n);

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

fscanf (filein, "%d", &Num[i]);fscanf (filein, "%d", &Num[i]);

fgets (frases[i], 49, filein);fgets (frases[i], 49, filein);

}}

printf ("Listagem das frases:\n\n");printf ("Listagem das frases:\n\n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

printf ("\n%d %s\n\tComprimento: %d\n",printf ("\n%d %s\n\tComprimento: %d\n",

Num[i], frases[i], Num[i], frases[i], strlen (frases[i])strlen (frases[i])););

printf ("\n\nDigite algo para encerrar"); getch ();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

Page 44: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, j, n, Num[10]; cadeia frases [10]; FILE *filein;int i, j, n, Num[10]; cadeia frases [10]; FILE *filein;

filein = fopen ("filefrases", "r");filein = fopen ("filefrases", "r");

fscanf (filein, "%d", &n);fscanf (filein, "%d", &n);

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

fscanf (filein, "%d", &Num[i]);fscanf (filein, "%d", &Num[i]);

fgets (frases[i], 50, filein);fgets (frases[i], 50, filein);

}}

printf ("Listagem das frases:\n\n");printf ("Listagem das frases:\n\n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

printf ("\n%d %s\n\tComprimento: %d\n",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 ();printf ("\n\nDigite algo para encerrar"); getch ();

}}

Conteúdo do arquivo ‘filefrases’

41Gosto 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

Page 45: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, j, n, Num[10]; cadeia frases [10]; FILE *filein;int i, j, n, Num[10]; cadeia frases [10]; FILE *filein;

filein = fopen ("filefrases", "r");filein = fopen ("filefrases", "r");

fscanf (filein, "%d", &n);fscanf (filein, "%d", &n);

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

fscanf (filein, "%d", &Num[i]);fscanf (filein, "%d", &Num[i]);

fgets (frases[i], 50, filein);fgets (frases[i], 50, filein);

}}

printf ("Listagem das frases:\n\n");printf ("Listagem das frases:\n\n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

printf ("\n%d %s\n\tComprimento: %d\n",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 ();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

Page 46: 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

6.5.3 – Funções para conversão de 6.5.3 – Funções para conversão de cadeias de caracterescadeias de caracteres

Função atoi (ASCII to int): Função atoi (ASCII to int): converte uma converte uma cadeia de caracterescadeia de caracteres no no inteirointeiro correspondentecorrespondente

Função atof (ASCII to float): Função atof (ASCII to float): converte uma converte uma cadeia de caracterescadeia de caracteres no no realreal correspondente correspondente

Função itoa (int to ASCII): Função itoa (int to ASCII): converte um converte um inteirointeiro numa numa cadeia de caracterescadeia de caracteres correspondente, especificada a correspondente, especificada a basebase numérica numérica para a escritapara a escrita

Page 47: 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

Função atoi: Função atoi: converte uma converte uma cadeia de caracterescadeia de caracteres no no inteirointeiro correspondente correspondente::

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i; char c; cadeia cad;int i; char c; cadeia cad;

printf ("Converter cadeia em inteiro? (s/n): "); c = getche ();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); printf ("\n\n\tDigite a cadeia: "); scanf ("%s", cad); i = i = atoi (cad);atoi (cad);

printf ("\tatoi (\"%s\") = %d", cad, i);printf ("\tatoi (\"%s\") = %d", cad, i);

printf ("\n\nConverter cadeia em inteiro? (s/n): "); c = printf ("\n\nConverter cadeia em inteiro? (s/n): "); c = getche ();getche ();

}}

}}

Exemplo: seja o seguinte programa

Converter cadeia em inteiro? (s/n): s

Digite a cadeia: 728391 atoi ("728391") = 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

Page 48: 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

Função atof: Função atof: converte uma converte uma cadeia de cadeia de caracterescaracteres no no realreal correspondente correspondente::

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

float x; char c; cadeia cad;float x; char c; cadeia cad;

printf ("Converter cadeia em real? (s/n): "); c = getche ();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); printf ("\n\n\tDigite a cadeia: "); scanf ("%s", cad); x = x = atof (cad);atof (cad);

printf ("\tatof (\"%s\") = %g", cad, x);printf ("\tatof (\"%s\") = %g", cad, x);

printf ("\n\nConverter cadeia em real? (s/n): "); c = printf ("\n\nConverter cadeia em real? (s/n): "); c = getche ();getche ();

}}

}}

Exemplo: seja o seguinte programa

Converter cadeia em real? (s/n): s

Digite a cadeia: 52.1753 atof ("52.1753") = 52.1753

Converter cadeia em real? (s/n): s

Digite a cadeia: 167.23e32 atof ("167.23e32") = 1.6723e+34

Converter cadeia em real? (s/n): s

Digite a cadeia: 0.0012e-15 atof ("0.0012e-15") = 1.2e-18

Converter cadeia em real? (s/n): n

Resultado de uma execução

Page 49: 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

Função itoa: Função itoa: converte um converte um inteirointeiro numa numa cadeia de cadeia de caracterescaracteres correspondente, especificada a correspondente, especificada a basebase numérica para a escrita:numérica para a escrita:

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, base; char c; cadeia cad;int i, base; char c; cadeia cad;

printf ("Converter inteiro em cadeia? (s/n): "); c = getche ();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); scanf ("%d%d", &i, &base); itoa(i, cad, base);itoa(i, cad, base);

printf ("\t(%d)10 = (\"%s\")%d", i, cad, base);printf ("\t(%d)10 = (\"%s\")%d", i, cad, base);

printf ("\n\nConverter inteiro em cadeia? (s/n): "); c = printf ("\n\nConverter inteiro em cadeia? (s/n): "); c = getche ();getche ();

}}

}}

Exemplo: seja o seguinte programa

Converter inteiro em cadeia? (s/n): s

Digite o int e a base: 2561 10 (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: 2871936 16 (2871936)10 = ("2bd280")16

Converter inteiro em cadeia? (s/n): n

Resultado de uma execução

Page 50: 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

6.5.4 – Funções para manipulação de 6.5.4 – Funções para manipulação de cadeias de caracterescadeias de caracteres

Função strlen (string length): Função strlen (string length): número de número de caracteres de uma cadeia caracteres de uma cadeia

Função strcat (string concatenation): Função strcat (string concatenation): concatena 2 cadeias de caracteresconcatena 2 cadeias de caracteres

Função strcmp (string comparision): Função strcmp (string comparision): compara compara lexicograficamente 2 cadeias de caractereslexicograficamente 2 cadeias de caracteres

Função strcpy (string copy): Função strcpy (string copy): copia o conteúdo copia o conteúdo de uma cadeia de caracteres em outrade uma cadeia de caracteres em outra

As As 4 funções4 funções pertencem ao arquivo pertencem ao arquivo string.hstring.h da da bibliotecabiblioteca

Page 51: 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

Função strlen:Função strlen:

Seu Seu argumentoargumento é uma é uma cadeia de caracterescadeia de caracteres

Retorna o Retorna o número de caracteresnúmero de caracteres de seu de seu argumento, sem contabilizar o finalizador argumento, sem contabilizar o finalizador ‘\0’‘\0’

A seguir, modificação do programa das A seguir, modificação do programa das frases frases digitadasdigitadas, com a , com a contagem dos caracterescontagem dos caracteres de cada umade cada uma

Page 52: 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

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

int i, n; cadeia frases [10];int i, n; cadeia frases [10];

printf ("Numero de frases (ate 10): "); scanf ("%d", &n);printf ("Numero de frases (ate 10): "); scanf ("%d", &n);

printf ("\n");printf ("\n");

for (i = 0; i <= n-1; i++) {for (i = 0; i <= n-1; i++) {

printf ("Digite a %da frase: ", i+1); fflush (stdin); gets printf ("Digite a %da frase: ", i+1); fflush (stdin); gets (frases[i]);(frases[i]);

}}

printf ("\nListagem das frases:\n\n");printf ("\nListagem das frases:\n\n");

for (i = 0; i <= n-1; i++)for (i = 0; i <= n-1; i++)

printf ("%d) %s\n\t%d caracteres\n",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 ();printf ("\n\nDigite algo para encerrar"); getch ();

}}

Listagem das frases:

1) Gosto muito de Computação! 26 caracteres2) A Linguagem C eh fantastica! 28 caracteres3) Programar eh Engenharia! 24 caracteres4) Engenheiros devem saber algoritmos! 35 caracteres

Page 53: 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

Função strcat:Função strcat:

Faz a Faz a concatenação de 2 cadeiasconcatenação de 2 cadeias recebidas recebidas como argumentoscomo argumentos

Ela concatena o Ela concatena o segundo argumento no segundo argumento no primeiroprimeiro

O O primeiroprimeiro argumento deve ser uma argumento deve ser uma variávelvariável cadeia de caracterescadeia de caracteres

O O segundosegundo argumento deve ser uma argumento deve ser uma variávelvariável ou uma ou uma constanteconstante do mesmo tipo do mesmo tipo

Depois de executada a função, o Depois de executada a função, o primeiroprimeiro argumento guardará a argumento guardará a concatenaçãoconcatenação e o e o segundosegundo permanecerá permanecerá inalteradoinalterado

Ver o programa a seguir

Page 54: 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

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

cadeia cad1, cad2;cadeia cad1, cad2;

printf ("Digite uma cadeia: "); gets (cad1);printf ("Digite uma cadeia: "); gets (cad1);

printf ("Digite outra cadeia: "); gets (cad2);printf ("Digite outra cadeia: "); gets (cad2);

printf ("\nAntes da Concatenacao:");printf ("\nAntes da Concatenacao:");

printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);

strcat (cad1, cad2); strcat (cad1, cad2);

printf ("\n\nDepois de strcat (cad1, cad2):");printf ("\n\nDepois de strcat (cad1, cad2):");

printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);

strcat (cad1, "ijk"); strcat (cad1, "ijk"); printf ("\n\nDepois de strcat printf ("\n\nDepois de strcat (cad1, \"ijk\"):");(cad1, \"ijk\"):");

printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2); printf ("\n\n\tcad1: %s\n\tcad2: %s", cad1, cad2);

printf ("\n\nDigite algo para encerrar: "); getch ();printf ("\n\nDigite algo para encerrar: "); getch ();

}}

Digite uma cadeia: abcdeDigite 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:

Page 55: 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

Função strcmp:Função strcmp:

ComparaCompara lexicograficamente lexicograficamente 2 cadeias 2 cadeias recebidas como recebidas como argumentosargumentos

Os Os 22 argumentosargumentos podem ser podem ser variáveisvariáveis ou ou constantesconstantes do tipo do tipo cadeia de caracterescadeia de caracteres

‘‘strcmp’strcmp’ retorna um valor inteiro retorna um valor inteiro menormenor, , igualigual ou ou maiormaior que que zerozero, dependendo do , dependendo do primeiro argumentoprimeiro argumento ser menor, igual ou ser menor, igual ou maior que o maior que o segundosegundo

Ver o programa a seguir

Page 56: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

cadeia cad1, cad2; char c;cadeia cad1, cad2; char c;

printf ("Comparar cadeias? (s/n): ");printf ("Comparar cadeias? (s/n): ");

do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N');do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N');

while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {

printf ("\n\nDigite as cadeias: "); scanf ("%s%s", cad1, cad2);printf ("\n\nDigite as cadeias: "); scanf ("%s%s", cad1, cad2);

if (strcmp (cad1, cad2) < 0)if (strcmp (cad1, cad2) < 0)

printf ("\n\t%s eh lexicograficamente menor que %s", cad1, cad2);printf ("\n\t%s eh lexicograficamente menor que %s", cad1, cad2);

else if (strcmp (cad1, cad2) == 0)else if (strcmp (cad1, cad2) == 0)

printf ("\n\t%s eh lexicograficamente igual a %s", cad1, cad2);printf ("\n\t%s eh lexicograficamente igual a %s", cad1, cad2);

else else

printf ("\n\t%s eh lexicograficamente maior que %s", cad1, cad2);printf ("\n\t%s eh lexicograficamente maior que %s", cad1, cad2);

printf ("\n\nComparar mais cadeias? (s/n): ");printf ("\n\nComparar mais cadeias? (s/n): ");

do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N');do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N');

}}

}}

A seguir, o resultado de uma execução

Page 57: 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

Comparar cadeias? (s/n): sComparar cadeias? (s/n): s

Digite as cadeias: Digite as cadeias: Alfredo MariaAlfredo Maria

Alfredo eh lexicograficamente menor que MariaAlfredo eh lexicograficamente menor que Maria

Comparar mais cadeias? (s/n): sComparar mais cadeias? (s/n): s

Digite as cadeias: Digite as cadeias: Carlos CarlosCarlos Carlos

Carlos eh lexicograficamente igual a CarlosCarlos eh lexicograficamente igual a Carlos

Comparar mais cadeias? (s/n): sComparar mais cadeias? (s/n): s

Digite as cadeias: Digite as cadeias: Fausto BiancaFausto Bianca

Fausto eh lexicograficamente maior que BiancaFausto eh lexicograficamente maior que Bianca

Comparar mais cadeias? (s/n): sComparar mais cadeias? (s/n): s

Digite as cadeias: Digite as cadeias: Nivaldo nivaldoNivaldo nivaldo

Nivaldo eh lexicograficamente menor que nivaldoNivaldo eh lexicograficamente menor que nivaldo

Comparar mais cadeias? (s/n): nComparar mais cadeias? (s/n): n

Page 58: 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

Função strcpy:Função strcpy:

Recebendo Recebendo duas cadeiasduas cadeias como argumentos, como argumentos, strcpystrcpy copia a copia a segunda para a primeirasegunda para a primeira

O O primeiroprimeiro argumento deve ser uma argumento deve ser uma variávelvariável cadeia de caracterescadeia de caracteres

O O segundosegundo argumento deve ser uma argumento deve ser uma variávelvariável ou uma ou uma constanteconstante do mesmo tipo do mesmo tipo

Depois de executada a função, o Depois de executada a função, o primeiroprimeiro argumento guardará uma cópia do segundo e argumento guardará uma cópia do segundo e esse último permanecerá esse último permanecerá inalteradoinalterado

Ver o programa a seguir

Page 59: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef char cadeia[50];typedef char cadeia[50];

void main ( ) {void main ( ) {

cadeia cad1, cad2;cadeia cad1, cad2;

printf ("Digite uma cadeia para cad2: "); printf ("Digite uma cadeia para cad2: ");

gets (cad2);gets (cad2);

strcpy (cad1, cad2);strcpy (cad1, cad2);

printf ("\nDepois da Copia de cad2 para cad1:");printf ("\nDepois da Copia de cad2 para cad1:");

printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2);printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2);

strcpy (cad2, "xyz");strcpy (cad2, "xyz");

printf ("\n\nDepois da Copia de \"xyz\" para cad2:");printf ("\n\nDepois da Copia de \"xyz\" para cad2:");

printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2);printf ("\n\ncad1: %s\ncad2: %s", cad1, cad2);

printf ("\n\nDigite algo para encerrar");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: abcdecad2: abcde

Depois da Copia de "xyz" para cad2:

cad1: abcdecad2: xyz

Digite algo para encerrar

Page 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

Capítulo VI – Variáveis Capítulo VI – Variáveis IndexadasIndexadas

6.1 – A necessidade de variáveis indexadas6.1 – A necessidade de variáveis indexadas

6.2 – Vetores e matrizes6.2 – Vetores e matrizes

6.3 – Aplicações com vetores numéricos6.3 – Aplicações com vetores numéricos

6.4 – Aplicações com matrizes numéricas6.4 – Aplicações com matrizes numéricas

6.5 – Cadeias de caracteres6.5 – Cadeias de caracteres

6.6 – Aplicações com vetores de cadeias de 6.6 – Aplicações com vetores de cadeias de caracterescaracteres

Page 61: 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

6.6 – Aplicações com 6.6 – Aplicações com Vetores de Cadeias de Vetores de Cadeias de

CaracteresCaracteres6.6.1 – Bubble-sort para vetores de nomes6.6.1 – Bubble-sort para vetores de nomes

O programa do O programa do Bubble-SortBubble-Sort para vetores numéricos para vetores numéricos pode ser pode ser adaptadoadaptado para ordenar vetores de para ordenar vetores de cadeias cadeias de caracteresde caracteres

Os Os elementoselementos do vetor devem ser do vetor devem ser nomesnomes (cadeias de (cadeias de caracteres) caracteres)

A A leituraleitura e a e a escritaescrita dos elementos utilizam o formato dos elementos utilizam o formato %s%s

A A comparaçãocomparação de dois nomes é feita com a função de dois nomes é feita com a função strcmpstrcmp e as e as atribuiçõesatribuições entre elementos são feitas entre elementos são feitas pela função pela função strcpystrcpy

Page 62: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <conio.h>#include <conio.h>

/*/* Criacao do tipo logic e suas constantesCriacao do tipo logic e suas constantes */*/

typedef char logic;typedef char logic;

const logic false = 0, true = 1;const logic false = 0, true = 1;

/*/* Criacao do tipo nomeCriacao do tipo nome */*/

typedef char nome[15];typedef char nome[15];

/*/* Cabecalho e declarações locaisCabecalho e declarações locais */*/

void main () {void main () {

int n, i, p; logic trocou;int n, i, p; logic trocou;

nome V[50], aux;nome V[50], aux;

Programa do Bubble-Sort para nomes

Page 63: 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

/*/* Leitura do vetor de nomes a ser ordenadoLeitura do vetor de nomes a ser ordenado */*/

printf ("Ordenacao de nomes pelo Bubble-Sort\n\printf ("Ordenacao de nomes pelo Bubble-Sort\n\n");n");

printf ("\tNumero de nomes do vetor: "); scanf printf ("\tNumero de nomes do vetor: "); scanf ("%d",&n);("%d",&n);

printf ("\n\tNomes: ");printf ("\n\tNomes: ");

for (i = 0; i < n; i++) scanf("%s", V[i]);for (i = 0; i < n; i++) scanf("%s", V[i]);

/*/* Escrita do vetor desordenadoEscrita do vetor desordenado */*/

printf ("\n\nVetor desordenado:\n");printf ("\n\nVetor desordenado:\n");

for (i = 0; i < n; i++) printf("\n%s", V[i]);for (i = 0; i < n; i++) printf("\n%s", V[i]);

Page 64: 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

/*/* Aplicação do metodo bubble-sortAplicação do metodo bubble-sort */*/

for (trocou = true, p = n-2; p >= 0 && trocou == true; for (trocou = true, p = n-2; p >= 0 && trocou == true; p--) {p--) {

for (trocou = false, i = 0; i <= p; i++)for (trocou = false, i = 0; i <= p; i++)

if (strcmp(V[i], V[i+1]) > 0) {if (strcmp(V[i], V[i+1]) > 0) {

strcpy(aux, V[i]); strcpy(V[i], V[i+1]);strcpy(aux, V[i]); strcpy(V[i], V[i+1]);

strcpy(V[i+1], aux); trocou = true;strcpy(V[i+1], aux); trocou = true;

}}

}}

/*/* Escrita do vetor ordenadoEscrita do vetor ordenado */*/

printf ("\n\nVetor ordenado:\n");printf ("\n\nVetor ordenado:\n");

for (i = 0; i < n; i++) printf("\n%s", V[i]);for (i = 0; i < n; i++) printf("\n%s", V[i]);

/*/* Fechamento da telaFechamento da tela */*/

printf ("\n\nDigite algo para encerrar: "); getch ();printf ("\n\nDigite algo para encerrar: "); getch ();

}}

Page 65: 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

6.6.2 – Procura binária em vetores de 6.6.2 – Procura binária em vetores de nomesnomes

O programa da O programa da Procura BináriaProcura Binária para vetores para vetores numéricos pode ser numéricos pode ser adaptadoadaptado para procurar para procurar nomes em vetores de nomesnomes em vetores de nomes

Os Os elementoselementos do vetor devem ser do vetor devem ser nomesnomes (cadeias de caracteres) (cadeias de caracteres)

O O elementoelemento a ser procurado deve ser um a ser procurado deve ser um nomenome

A A comparaçãocomparação do nome procurado com os do nome procurado com os elementos do vetor é feita com a função elementos do vetor é feita com a função strcmpstrcmp

A seguir, um programa da procura binária para A seguir, um programa da procura binária para nomesnomes

Page 66: 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

/*/* Diretivas de preprocessamanto e declaracoesDiretivas de preprocessamanto e declaracoes */*/

#include <stdio.h>#include <stdio.h>

#include <conio.h>#include <conio.h>

#include <string.h>#include <string.h>

typedef char logic;typedef char logic;

const logic false = 0, true = 1;const logic false = 0, true = 1;

typedef char nome[15];typedef char nome[15];

void main () {void main () {

int n, i, inf, sup, med;int n, i, inf, sup, med;

nome V[50], nome;nome V[50], nome;

logic achou, erro;logic achou, erro;

char c;char c;

Page 67: 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

/*/* Leitura dos elementos do vetorLeitura dos elementos do vetor */*/

printf ("PROCURA BINARIA EM VETORES DE NOMES\printf ("PROCURA BINARIA EM VETORES DE NOMES\n\n");n\n");

printf ("Numero de nomes do vetor: "); scanf ("%d", printf ("Numero de nomes do vetor: "); scanf ("%d", &n);&n);

printf ("\nNomes: ");printf ("\nNomes: ");

for (i = 0; i < n; i++) for (i = 0; i < n; i++) scanf ("%s", V[i]);scanf ("%s", V[i]);

/*/* Verificacao da ordenacao do vetorVerificacao da ordenacao do vetor */*/

for (i = 0, erro = false; i < n-1 && erro == false; i++)for (i = 0, erro = false; i < n-1 && erro == false; i++)

if (strcmp(V[i], V[i+1]) > 0)if (strcmp(V[i], V[i+1]) > 0) erro = true; erro = true;

if (erro == true)if (erro == true)

printf ("\n\tRelacao desordenada: nao havera printf ("\n\tRelacao desordenada: nao havera procuras\n");procuras\n");

Page 68: 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

/*/* Secao de procurasSecao de procuras */*/

else {else {

clrscr ();clrscr ();

printf ("Secao de Procuras:\n\n");printf ("Secao de Procuras:\n\n");

printf ("Procurar nome (s/n)?: ");printf ("Procurar nome (s/n)?: ");

do c = getche();do c = getche();

while (c != 's' && c != 'n' && c != 's' && c != while (c != 's' && c != 'n' && c != 's' && c != 'n');'n');

while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {

printf ("\n\n\tNome: "); printf ("\n\n\tNome: "); scanf ("%s", scanf ("%s", nome);nome);

Page 69: 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

/*/* Procura de um numero no vetorProcura de um numero no vetor*/*/

achou = false; inf = 0; sup = n - 1;achou = false; inf = 0; sup = n - 1;

do {do {

med = (inf + sup) / 2;med = (inf + sup) / 2;

if (strcmp(nome, V[med]) == 0)if (strcmp(nome, V[med]) == 0) achou = true;achou = true;

else else if (strcmp(nome, V[med]) < if (strcmp(nome, V[med]) < 0)0)

sup = med - 1;sup = med - 1;

else inf = med + 1;else inf = med + 1;

} while (!achou && inf <= sup);} while (!achou && inf <= sup);

Page 70: 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

/*/* Emissao do resultado da procura */Emissao do resultado da procura */

if (achou)if (achou)

printf ("\n\t%s estah na posicao %d da printf ("\n\t%s estah na posicao %d da relacao\n\n", relacao\n\n",

nome, med);nome, med);

elseelse

printf ("\n\t%s nao estah na relacao\n\printf ("\n\t%s nao estah na relacao\n\n",nome);n",nome);

printf ("Procurar outro numero (s/n)?: ");printf ("Procurar outro numero (s/n)?: ");

do c = getche();do c = getche();

while (c != 's' && c != 'n' && c != 's' && c != 'n');while (c != 's' && c != 'n' && c != 's' && c != 'n');

}}

}}

/*/* Fechamento da telaFechamento da tela */*/

printf ("\n\nDigite algo para encerrar: ");printf ("\n\nDigite algo para encerrar: ");

getch ();getch ();

}}

Page 71: 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

6.6.3 – Limpeza de textos6.6.3 – Limpeza de textos

Seja um Seja um arquivo-textoarquivo-texto contendo contendo cadeias de cadeias de caracterescaracteres imprimíveis separadas umas das imprimíveis separadas umas das outras por um ou vários outras por um ou vários espaçosespaços em brancos e/ou em brancos e/ou ‘enter’‘enter’ss

O O programaprograma a seguir produz a seguir produz outro arquivooutro arquivo contendo uma cópia de cada cadeia do primeiro contendo uma cópia de cada cadeia do primeiro que for uma sequência que for uma sequência somente de letras ou somente de letras ou somente de dígitos decimaissomente de dígitos decimais

Cadeias contendo Cadeias contendo simultaneamentesimultaneamente letras e letras e dígitos decimais dígitos decimais nãonão devem devem fazer partefazer parte do novo do novo arquivoarquivo

Entre as cadeiasEntre as cadeias do novo arquivo deve haver do novo arquivo deve haver apenas um espaçoapenas um espaço

Page 72: 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

Exemplo:Exemplo:

Se o conteúdo do arquivo original Se o conteúdo do arquivo original textoin.dat textoin.dat for:for:

%&() bxnDJk 953481 B 1 123h asdf8 ; %&() bxnDJk 953481 B 1 123h asdf8 ; ABCDEfgABCDEfg

Então o novo arquivo Então o novo arquivo textout.dattextout.dat deverá deverá conter:conter:

bxnDJk 953481 B 1 ABCDEfgbxnDJk 953481 B 1 ABCDEfg

Page 73: 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

#include <stdio.h>#include <stdio.h>

#include <string.h>#include <string.h>

#include <ctype.h>#include <ctype.h>

/*/* Declaracao dos tipos e constantes logicas e do tipo Declaracao dos tipos e constantes logicas e do tipo cadeiacadeia */*/

typedef char logic;typedef char logic;

const logic TRUE = 1, FALSE = 0;const logic TRUE = 1, FALSE = 0;

typedef char cadeia[50];typedef char cadeia[50];

/*/* Cabecalho e declaracoes locaisCabecalho e declaracoes locais */*/

void main () {void main () {

int n, i; logic erro;int n, i; logic erro;

cadeia cad;cadeia cad;

FILE *fin, *fout;FILE *fin, *fout;

Page 74: 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

/*/* Abertura dos arquivos de entrada e de saidaAbertura dos arquivos de entrada e de saida */*/

fin = fopen ("textoin.dat", "r");fin = fopen ("textoin.dat", "r");

fout = fopen ("textout.dat", "w");fout = fopen ("textout.dat", "w");

/*/* Leitura de uma cadeia do arquivo de entrada e teste Leitura de uma cadeia do arquivo de entrada e teste de fim de arquivo */de fim de arquivo */

while (fscanf(fin, "%s", cad) == 1) {while (fscanf(fin, "%s", cad) == 1) {

erro = FALSE;erro = FALSE;

/*/* Se o primeiro caractere da cadeia for letra, os outros Se o primeiro caractere da cadeia for letra, os outros tambem devem ser */tambem devem ser */

if (isalpha (cad[0])) {if (isalpha (cad[0])) {

for (i = 1, n = strlen (cad); i < n && !erro; i++)for (i = 1, n = strlen (cad); i < n && !erro; i++)

if (! isalpha (cad[i])) erro = TRUE;if (! isalpha (cad[i])) erro = TRUE;

}}

Page 75: 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

/*/* Se o primeiro caractere da cadeia for digito, os outros Se o primeiro caractere da cadeia for digito, os outros tambem devem sertambem devem ser */*/

else if (isdigit (cad[0])) {else if (isdigit (cad[0])) {

for (i = 1, n = strlen (cad); i < n && !erro; i++)for (i = 1, n = strlen (cad); i < n && !erro; i++)

if (! isdigit (cad[i])) erro = TRUE;if (! isdigit (cad[i])) erro = TRUE;

}}

/*/* Se o primeiro caractere da cadeia nao for letra nem Se o primeiro caractere da cadeia nao for letra nem digito: errodigito: erro */*/

else erro = TRUE;else erro = TRUE;

/*/* Se nao ha erro na cadeia, escreve-la no arquivo de Se nao ha erro na cadeia, escreve-la no arquivo de saidasaida */*/

if (! erro)if (! erro)

fprintf (fout, "%s ", cad);fprintf (fout, "%s ", cad);

}}

}}

Page 76: 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

Exercícios 6.6:Exercícios 6.6:

1)1) Escrever um programa para ler várias cadeias de 16 Escrever um programa para ler várias cadeias de 16 caracteres encerradas por um caracteres encerradas por um enterenter; para cada ; para cada cadeia:cadeia:

a)a) Encará-la como a representação binária em Encará-la como a representação binária em complemento de 2 de um número inteiro no complemento de 2 de um número inteiro no intervalo intervalo [-32768 .. 32767][-32768 .. 32767]

b)b) Verificar se ela é realmente uma tal representação; Verificar se ela é realmente uma tal representação; se for, encontrar e escrever o número se for, encontrar e escrever o número correspondente na base 10 (não esquecer que o correspondente na base 10 (não esquecer que o número pode ser negativo); senão, emitir uma número pode ser negativo); senão, emitir uma mensagem de erromensagem de erro

Calcular e escrever, na base 10, a somatória dos Calcular e escrever, na base 10, a somatória dos números encontradosnúmeros encontrados

Obs.: Obs.: A cadeia de caracteres estará errada se não A cadeia de caracteres estará errada se não tiver exatamente 16 caracteres ou se tiver algum tiver exatamente 16 caracteres ou se tiver algum caractere diferente de caractere diferente de ‘0’‘0’ e de e de ‘1’‘1’..


Top Related