Gabarito da Lista 4


Módulo 4:  Aula 5: Matrizes e strings

Exercício: Página c510.html

Enunciado:  Programa original :

#include <stdio.h>
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]);
        }
}

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>
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=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]);
        }
}
 
 

Exercício: Página c520.html

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
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);
}

-------------------------------------------------------
/* Le 4 strings: Versao 2 ----------------------------*/
#include <stdio.h>
#include <string.h>
#define TAM 15
#define MAX 4
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);
}
 
 

Exercício: Página c530.html

 

O que imprime o programa a seguir? Tente entendê-lo e responder. A seguir, execute-o e comprove o resultado.

# include <stdio.h>
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");
}
}

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

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


Curso de C do CPDEE/UFMG - 1996-1999