Curso de C

Gabarito de Lista de Exercícios

 Aula 2: Variáveis, Constantes, Operadores e Expressões

Clique aqui para acessar a Lista 2

Exercício 1: página c330.html

Enunciado
Escreva um programa que leia uma string (use gets()) e retire todos os caracteres 'c' da string lida. Informe na tela quantos caracteres foram retirados.

Solução:

#define TAMANHO 50
#define OUTRO ' '
#include <stdio.h>
   /* Retira todas as letras 'c' de uma frase e substitui por um espaço em branco */
main()
{
  char original[TAMANHO];
  int i;
  printf("\n\nDigite uma frase: ");
  gets(original);
  printf("\n\nFrase digitada:\n%s", original);
  for (i=0; original[i] != '\0'; i++)
  {
    if ((original[i] == 'c')||(original[i] == 'C'))  /* Se for letra
    'c' */
       original[i] = OUTRO;            /* Substitui por outro
       caracter..*/
  }
  printf("\n\nFrase alterada:\n%s\n", original);
}
  #define TAMANHO 50
#include <stdio.h>
/* RETIRA todas as letras 'c' de uma string */
main()
{
  char original[TAMANHO];
  int i, j;
  printf("\n\nDigite uma frase: ");
  gets(original);
  printf("\n\nFrase digitada:\n%s", original);
  for (i=0; original[i] != '\0'; i++)
    {
    if ((original[i] == 'c')||(original[i] == 'C'))
       {
       for (j=i; original[j]!='\0'; j++)
         original[j] = original[j+1];
       i--;
       }
    }
  printf("\n\nFrase alterada:\n%s\n", original);
}
 
 

Exercício 2: página c350.html

Enunciado:
Diga o resultado das variáveis x, y e z depois da seguinte sequência de operações:

        int x,y,z;
        x=y=10;
        z=++x;
        x=-x;
        y++;
        x=x+y-(z--);

Solução:
x = -11
y = 11
z = 10

Comentários:
- Em z = ++x, x é incrementado e então o seu valor e atribuído a z
- Em x = x+y-(z--), z e atribuído a x e então acontece o decremento
 
 

Exercício 3: página c360.html

Enunciado:
Diga se as seguintes expressões serão verdadeiras ou falsas:

->      ((10>5)||(5>10))
->      (!(5==6)&&(5!=6)&&((2>1)||(5<=4)))

Solução:
->    ((10>5)||(5>10))                      => Verdadeira
        TRUE || FALSE = TRUE

->    (!(5==6)&&(5!=6)&&((2>1)||(5<=4)))    => Verdadeira
      !(FALSE)&&(TRUE)&&(TRUE)
 
 

Exercício 4: pagina c380.html

Enunciado:
Compile o exemplo da página sem usar o modelador, e verifique os resultados. Compile-o novamente usando o modelador e compare a saída com os resultados anteriores.

Solução:
Quando se usa o modelador (float) o resultado impresso na tela é 1.428571, que é o valor exato de 10 dividido por sete. Quando não se usa o modelador o resultado apresentado é 1.0000, que é o valor do inteiro resultante da operação 10/7 (=1) transformado depois para float.
 
 

Exercícios de Fixação

Exercício 1:
Faça um programa que apresente na tela a tabela de conversão de graus Celsius para Fahrenheit, de -100 C a 100 C. Use um incremento de 20 C. Defina constantes com os limites usando a diretiva #define. Exemplo:
#define INCREMENTO 20

Solução:
#define LIMITE_INF -100
#define LIMITE_SUP 100
#define INCREMENTO 20
#include <stdio.h>
main()
{
int tempC;
float tempF;
printf("\n\nTemperatura Celsius  Temperatura Farenheit\n");
for (tempC = LIMITE_INF; tempC<=LIMITE_SUP; tempC += INCREMENTO)
  {
  tempF = 9*(float)(tempC+32)/5;  /* Float = (9/5)*(Celsius+32) */
  printf("\t%.3d\t\t  %f\n", tempC, tempF);
  }
printf("\n\n");
}

Obs: A maior vantagem de se usar as constantes está na portabilidade estabelecida no programa. Veja, e fácil modificar os limites da tabela ou mesmo o incremento. Se os valores fossem usados outras vezes no programa você não precisaria ficar procurando onde eles estavam para mudar, bastaria mudar as constantes.
 

Exercício 2:
Faça um programa em C para ler números em ponto flutuante (representando ângulos em radianos) e imprima o seno do número. Ao ler o número zero, o programa deverá terminar. Teste seu programa para verificar seu funcionamento.

Solução:
#include <stdio.h>
#include <math.h>
/* Este programa recebe um angulo inteiro e apresenta o valor de seu
seno. */
main()
{
int i, angulo = -1;  /* angulo inicializado para evitar erro de
                 lógica caso o lixo inicial na variável fosse zero */
float seno;
for (i=0; angulo != 0; i++)
{
  printf("\n\nEntre com o angulo: ");
  scanf("%d", &angulo);
  seno = sin(angulo);
  printf("\n Seno de %d: %f\n", angulo, seno);
  }
}
 

DESAFIO:

Enunciado:
Este exercício é tratado como desafio por considerar-se sua elaboração mais complexa. Considera-se desafio às pessoas que não tem prática com a linguagem C.
i) Faça um programa que determine as faixas das variáveis char e int, por cálculo direto. Em sua máquina, quantos bits cada um destes tipos ocupa?
ii) Existe uma outra forma de se obter esta resposta que não seja por cálculo direto. Veja se você descobre.

Solução:
i)
/* Este programa determina as faixas de valores para variáveis  */
/* int e char por calculo direto                                */

/* Incrementos iniciais: --------------------------------------- */
/* Obs: Estes valores precisam ser do tipo 10^x, sendo x inteiro */
#define INCR_C 10
#define INCR_I 1000000  /* Um milhao */

#include <stdio.h>

main()
{
int i =1, antigo_i =0, incr_i =INCR_I;
char c =1, antigo_c =0, incr_c =INCR_C;
/* Todas as variáveis foram inicializadas para estarem
   compativeis a lógica do programa */

printf("\n\n ----------- Primeiro para os char: \n");
while (incr_c > 0)
    {
    antigo_c = c;
    c += incr_c;
    if (antigo_c > c)
      {
      if (incr_c == 1) incr_c = 0;  /*Seta incr_c=0
                                      para sair do while*/
         else  incr_c /= 10;
      c = antigo_c;
      }
    printf("%d\n",c);
    }

printf("\n\nLimites: %d\te\t%d\n\n", antigo_c, ++c);
printf("\n\n ----------- Agora para os int: \n");
scanf("%c", &c);
while (incr_i > 0)
  {
    antigo_i = i;
    i += incr_i;
    if (antigo_i > i)
      {
      if (incr_i == 1) incr_i = 0;  /* Seta incr_i = 0 para sair do
                                       while */
         else  incr_i /= 10;
      i = antigo_i;
      }
    printf("%d\n",i);
  }
printf("\n\nLimites: %d\te\t%d\n\n", antigo_i, ++i);
printf("\n\n\n");
}
 

ii) O arquivo limits.h, fornece os limites definidos pela implementação. As constantes CHAR_MAX e CHAR_MIN fornecem os limites para o tipo char e as constantes INT_MAX e INT_MIN, os limites para int. Você pode tentar abrir e olhar o arquivo ( :-(( não é muito legal..) ou pode escrever um programa que inclua a biblioteca e apresente os valores na tela.

Observações:
O programa vai incrementar a variável c ou i (dependendo se é para o tipo char ou int) até que ocorra um overflow. Quando ocorre o overflow, a variável é atribuída de seu último valor, e se o incremento for > 1 o é dividido por 10. Se o incremento for = 1, isto significa que alcançou-se o menor incremento possível para um inteiro (ou char) e que aquele número e o maior número possível para aquele tipo. O incremento é zerado, para que o loop possa ser abandonado. Abandonando o loop, o programa imprime o número atual (o limite superior) e o número atual incrementado de 1 (que será o limite inferior).
Isto acontece porque quando ocorre o overflow em uma variável signed (leia-se: não unsigned), a variável passa do seu limite superior para o seu limite inferior. (I.E de 127 a -128 para char). No sistema onde este programa foi originalmente rodado, as variáveis char trabalham com 8 bits, e as variáveis inteiras, com 32 bits.
É importante ressaltar que a grandeza dos incrementos vai ser responsável pela velocidade com que você vai alcançar o limite. Se os incrementos forem muito pequenos, o seu computador pode passar o resto do dia fazendo contas, e não chegar ao resultado. Compete a você determinar o incremento certo para a sua máquina e compilador.
As pessoas que tiverem dificuldades em entender o programa acima, deverão reportar as suas dúvidas para a lista, indicando as partes de difícil compreensão.
 

  Sumário

Dúvidas? Dê uma olhadinha em nosso FAQ

Perguntas para a lista do Curso de C
Curso de C do CPDEE/UFMG - 1996-1998