ASPER
UNIBRATEC

Gabarito: lista 4


Aula 7: Vetores, Matrizes e Strings

Exercício 1
Enunciado: Programa original :

#include <stdio.h>
int main ()
{
int num[100]; /* Declara um vetor de inteiros de 100 posicoes */
int count=0;
int totalnums;
do
{
printf ("\nEntre com um numero (-999 p/ terminar): ");
scanf ("%d",&num[count]);
count++;
} while (num[count-1]!=-999);
totalnums=count-1;
printf ("\n\n\n\t Os números que você digitou foram:\n\n");
for (count=0;count<totalnums;count++)
printf (" %d",num[count]);
return 0;
}
Reescreva o exemplo acima, realizando a cada leitura um teste para ver se a
dimensão do vetor não foi ultrapassada. Caso o usuário entre com 100 números, o
programa deverá abortar o loop de leitura automaticamente. O uso do Flag não
deve ser retirado.


Solução:
Basta acrescentar ao teste no final do loop, uma verificação se contador < 100.
#include <stdio.h>
#include <stdio.h>
int main ()
{
int num[100]; /* Declara um vetor de inteiros de 100 posicoes */
int count=0;
int totalnums;
do
{
printf ("\nEntre com um numero (-999 p/ terminar): ");
scanf ("%d",&num[count]);
count++;
/************************ Aqui *************************/

} while ((num[count-1]!=-999)&& (count <100) );

totalnums= (num[count-1]==-999) ? count-1 : count;

printf ("\n\n\n\t Os números que você digitou foram:\n\n");
for (count=0;count<totalnums;count++)
printf (" %d",num[count]);
return 0;
}

Exercício 2
Enunciado:

Faça um programa que leia quatro palavras pelo teclado, e armazene cada palavra
em uma string. Depois, concatene todas as strings lidas numa única string. Por
fim apresente esta como resultado ao final do programa.


Solução:
Aí segue o programa segundo o enunciado requere. Uma string para cada palavra.
Logo em seguida, é apresentada uma solução para o exercício com recursos mais
avançados e código mais compacto.
/* Le 4 strings: Versao 1 ----------------------------*/
#include <stdio.h>
#include <string.h>
#define TAM 15
int main()
{
char str1[TAM], str2[TAM], str3[TAM], str4[TAM];
char str[TAM*4];
int aux;
/* Le todas as strings */
printf("\n\n Digite 4 strings, teclando <ENTER> ao final de cada uma:\n");
gets(str1);
gets(str2);
gets(str3);
gets(str4);
/* Zera (inicializa) a string str, colocando um '\0' logo na
primeira posicao.. Se nao fizermos isto, poderiamos ter um lixo nela que
atrapalharia o resultado */

str[0] = '\0';
/* Concatena as strings */
strcat(str, str1);
strcat(str, str2);
strcat(str, str3);
strcat(str, str4);
/* Apresenta o resultado */
printf("\n\n Resultado: %s\n",str);
return 0;
}
-------------------------------------------------------
/* Le 4 strings: Versao 2 ----------------------------*/
#include <stdio.h>
#include <string.h>
#define TAM 15
#define MAX 4
int main()
{
char palavra[TAM], frase[TAM*MAX];
int i;
/* Inicializa a string frase */
frase[0] = '\0';
printf("\n\n Digite 4 strings, teclando <ENTER> ao final de cada uma:\n");
/* Le todas as strings */
for (i=0; i<MAX; i++)
{
gets(palavra);
strcat(frase, palavra);
}
/* Apresenta o resultado */
printf("\n\n Resultado: %s\n",frase);
return 0;
}


Exercício 3

O que imprime o programa a seguir? Tente entendê-lo e responder. A seguir,
execute-o e comprove o resultado.
# include <stdio.h>
int main()
{
int t, i, M[3][4];
for (t=0; t<3; ++t)
for (i=0; i<4; ++i)
M[t][i] = (t*4)+i+1;
for (t=0; t<3; ++t)
{
for (i=0; i<4; ++i)
printf ("%3d ", M[t][i]);
printf ("\n");
}
return 0;
}


Solução:
Este programa carrega uma matriz bidimensional 3x4 com os números de 1 a 12, e
escreve-os linha por linha. M[0][0]=1, M[0][1]=2, M[0][2]=3, M[0][3]=4,
M[1][0]=5 e assim por diante. O valor de M[2][3], última posição, sera' 12.
Comentários:
Matrizes bidimensionais são armazenadas em uma matriz linha-coluna, onde o
primeiro índice indica a linha e o segundo, a coluna. O índice mais a direita
varia mais rapidamente que o índice mais a esquerda quando acessamos os
elementos da matriz na ordem em que eles estão realmente armazenados na memória.

Exercício adicional:
Exercício 1:

O que o programa a seguir faz? Qual é o resultado obtido se a string fornecida
for
a) "Ah! Eu to maluco!"
b) "5*4+(3^3)+4*5"
#include <stdio.h>
#include <string.h>
#define TAM 20
int main ()
{
char s[TAM];
int c, i, j;
for (i=0, j=strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
return 0;
}


Solução:
A função inverte a string fornecida. Assim, obtém-se:
a) "Ah! Eu to maluco!" => "!oculam ot uE !hA"
b) "5*4+(3^3)+4*5" => "5*4+)3^3(+4*5"
Comentários:
- a função começa com i no início e j no final da string. A medida que i
incrementa e j decrementa, o conteúdo das posições i e j é trocado, resultando
na string invertida.
- repare que a função é válida para strings de comprimento par ou ímpar: Se for
par, existirão 2 elementos medianos, que serão trocados; se for ímpar, ao
atingir o elemento mediano, a string já estará toda invertida.
- toda string é terminada com \0 (caracter nulo), que não é contado pela função
strlen(). Se uma string s possui n caracteres (descontando o \0), strlen(s) = n,
e existirão elementos no string de s[0] ate s[n-1].