Upload
hada
View
50
Download
3
Embed Size (px)
DESCRIPTION
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. - PowerPoint PPT Presentation
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
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
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
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]
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
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
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;
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
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
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
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
int main () {int 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
/*/* 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
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
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
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
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;
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
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
int main () {int 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;
/*/* 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): ");
scanf ("%d", &c);scanf ("%d", &c);
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
/*/* 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;
}}
/*/* 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): ");
scanf ("%d", &c);scanf ("%d", &c);
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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
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
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
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:
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
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
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’
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’};
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
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
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
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
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í, em vez de transportar o espaço em Daí, em vez 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
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)
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
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!!!
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)
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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);
setbuf (stdin, NULL); gets (frases[i]);setbuf (stdin, NULL); 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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 ‘setbuf’ esvazia o buffer do teclado antes da chamada de ‘gets’
Numeração na tela a partir de 1
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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);
setbuf (stdin, NULL); gets (frases[i]);setbuf (stdin, NULL); 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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!
Pressione ...
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’
#include <stdio.h>#include <stdio.h>
#include <string.h>#include <string.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
#include <stdio.h>#include <stdio.h>
#include <string.h>#include <string.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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], 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], strlen (frases[i]));Num[i], frases[i], strlen (frases[i]));
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
#include <stdio.h>#include <stdio.h>
#include <string.h>#include <string.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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], 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], strlen (frases[i]));Num[i], frases[i], strlen (frases[i]));
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
Pressione ...
O ‘enter’ no final é escrito e contado pelo strlen
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
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>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int main ( ) {
int i; char c; cadeia cad;int i; char c; cadeia cad;
printf ("Converter cadeia em inteiro? (s/n): "); scanf ("%c", &c);printf ("Converter cadeia em inteiro? (s/n): "); scanf ("%c", &c);
while (c == 's' || c == 'S') { while (c == 's' || c == 'S') {
printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); i = atoi i = atoi (cad);(cad);
printf ("\tatoi (\"%s\") = %d", cad, i);printf ("\tatoi (\"%s\") = %d", cad, i);
printf ("\n\nConverter cadeia em inteiro? (s/n): "); scanf printf ("\n\nConverter cadeia em inteiro? (s/n): "); scanf (" %c", &c);(" %c", &c);
}}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
Função atof: Função atof: converte uma converte uma cadeia de caracterescadeia de caracteres no no realreal correspondente correspondente::
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int main ( ) {
float x; char c; cadeia cad;float x; char c; cadeia cad;
printf ("Converter cadeia em real? (s/n): "); scanf ("%c", &c);printf ("Converter cadeia em real? (s/n): "); scanf ("%c", &c);
while (c == 's' || c == 'S') { while (c == 's' || c == 'S') {
printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); printf ("\n\tDigite a cadeia: "); scanf ("%s", cad); x = atof x = atof (cad);(cad);
printf ("\tatof (\"%s\") = %lf", cad, x);printf ("\tatof (\"%s\") = %lf", cad, x);
printf ("\n\nConverter cadeia em real? (s/n): "); scanf (" printf ("\n\nConverter cadeia em real? (s/n): "); scanf (" %c", &c);%c", &c);
}}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
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>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int main ( ) {
int i, base; char c; cadeia cad;int i, base; char c; cadeia cad;
printf ("Converter inteiro em cadeia? (s/n): "); scanf ("%c", &c);printf ("Converter inteiro em cadeia? (s/n): "); scanf ("%c", &c);
while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {
printf ("\n\tDigite o int e a base: ");printf ("\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): "); scanf (" printf ("\n\nConverter inteiro em cadeia? (s/n): "); scanf (" %c", &c);}%c", &c);}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
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
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
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
#include <string.h>#include <string.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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); setbuf (stdin, printf ("Digite a %da frase: ", i+1); setbuf (stdin, NULL); gets (frases[i]);NULL); 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\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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
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
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
#include <string.h>#include <string.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
Pressione ...
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 lexicograficamente que o maior lexicograficamente que o segundosegundo
Ver o programa a seguir
#include <stdio.h>#include <stdio.h>
#include <string.h>#include <string.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int main ( ) {
cadeia cad1, cad2; char c;cadeia cad1, cad2; char c;
printf ("Comparar cadeias? (s/n): ");printf ("Comparar cadeias? (s/n): ");
do scanf ("%c", &c); while (c != 's' && c != 'S' && c != 'n' && c != 'N');do scanf ("%c", &c); while (c != 's' && c != 'S' && c != 'n' && c != 'N');
while (c == 's' || c == 'S') {while (c == 's' || c == 'S') {
printf ("\nDigite as cadeias: "); scanf ("%s%s", cad1, cad2);printf ("\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, printf ("\n\t%s eh lexicograficamente menor que %s", cad1, cad2);cad2);
else if (strcmp (cad1, cad2) == 0)else if (strcmp (cad1, cad2) == 0)
printf ("\n\t%s eh lexicograficamente igual a %s", cad1, printf ("\n\t%s eh lexicograficamente igual a %s", cad1, cad2);cad2);
else else
printf ("\n\t%s eh lexicograficamente maior que %s", cad1, printf ("\n\t%s eh lexicograficamente maior que %s", cad1, cad2);cad2);
printf ("\n\nComparar mais cadeias? (s/n): ");printf ("\n\nComparar mais cadeias? (s/n): ");
do scanf ("%c", &c); while (c != 's' && c != 'S' && c != 'n' && c != do scanf ("%c", &c); while (c != 's' && c != 'S' && c != 'n' && c != 'N');'N');
}}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
A seguir, o resultado de uma execução
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
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
#include <stdio.h>#include <stdio.h>
#include <string.h>#include <string.h>
#include <stdlib.h>#include <stdlib.h>
typedef char cadeia[50];typedef char cadeia[50];
int main ( ) {int 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
Pressione ...
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
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
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.h>
#include <string.h>#include <string.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 */*/
int main () {int 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
/*/* 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]);
/*/* 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\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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
/*/* Diretivas de preprocessamanto e declaracoesDiretivas de preprocessamanto e declaracoes */*/
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.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];
int main () {int 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;
/*/* 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");
/*/* 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);
/*/* 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);
/*/* 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\n"); system ("pause");printf ("\n\n"); system ("pause");
return 0;return 0;
}}
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
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
#include <stdio.h>#include <stdio.h>
#include <stdlib.h>#include <stdlib.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 */*/
int main () {int main () {
int n, i; logic erro;int n, i; logic erro;
cadeia cad;cadeia cad;
FILE *fin, *fout;FILE *fin, *fout;
/*/* 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;
}}
/*/* 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) fprintf (fout, "%s ", cad);if (! erro) fprintf (fout, "%s ", cad);
}}
printf ("\n\n"); system ("pause"); return 0;printf ("\n\n"); system ("pause"); return 0;
}}
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’..