Programação I

Soluções dos exercícios da aula prática 3

Programa 1

Faz um programa que calcule o máximo de 2 números reias. Os 2 números devem ser introduzidos pelo utilizador.

Resolução

  #include <stdio.h>

  main()
  {
    float a, b;

    printf("Introduza um número:\n");
    scanf("%f", &a );
    printf("Introduza outro número:\n");
    scanf("%f", &b );
    if( a > b )
      printf("O máximo é %f.\n", a );
    else
      printf("O máximo é %f.\n", b );
  }

Programa 2

Imgina que a uma dada cadeira, a nota de frequência é obtida da seguinte forma: o trabalho tem peso 25% e o teste tem peso 75%. Faz um programa que calcula a vossa nota de frequência a essa cadeira. Se a nota de frequência for inferior a 9.5, o computador deve imprimir a mensagem: "tem de ir a exame". Caso contrário, imprime a mensagem: "Passaste com x valores".

Resolução

  #include <stdio.h>

  main()
  {
    float trabalho;  /* nota do trabalho */
    float teste;     /* nota do teste */
    float freq;      /* nota da frequência */ 

    printf("Nota do trabalho:\n");
    scanf("%f", &trabalho );
    printf("Nota do teste:\n");
    scanf("%f", &teste );
    freq = trabalho*0.25 + teste*0.75; 
    if( freq >= 9.5 )
      printf("Passaste com %f valores.\n", freq );
    else
      printf("Tens de ir a exame.\n");
  }

Programa 3

Modifica o programa que calcula as raízes de uma equação do segundo grau (dado na aula teórica) de modo a que apresente raízes complexas se for caso disso.

Resolução

A chave deste problema é testar se o valor que aparece dentro da raíz quadrada é negativo ou não. Se for negativo vai dar raízes complexas, senão vai dar raízes reais.

  delta = b*b - 4ac
  se delta < 0
    Raízes Complexas
  senão
    Raízes Reais

O caso das raízes reais já tinha sido feito na aula teórica. No caso de dar raízes complexas, as soluções vão ser do tipo a+bi e a-bi, em que a e b são números reais. Moral da história: precisamos de variáveis para os valores de a e b. Para não se confundir com o a e b dos coeficientes do polinómio ax^2 + bx + c, é melhor chamar outros nomes. Por exemplo, p e q. Assim, se delta < 0 as raízes complexas serão p+qi e p-qi. O esqueleto do programa é:

  delta = b*b - 4ac
  se delta < 0
    /* Raízes Complexas */
    p = -b / (2a)
    q = sqrt( -delta ) / (2a)
    ...
  senão
    /* Raízes Reais */
    ...

O programa completo em C é:

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

  main()
  {
    float a,b,c,   /* coeficientes do polinómio de grau 2 */
          delta,   /* b^2-4ac */
          raiz1, 
          raiz2,   /* raízes no caso de serem soluções reais */
          p,       /* parte real da raiz no caso de ser complexa */   
          q;       /* valor absoluto da parte imaginária */
           
    printf("Introduza os coeficientes de um polinómio de grau 2\n");
    printf("a = "); scanf("%f", &a );
    printf("b = "); scanf("%f", &b );
    printf("c = "); scanf("%f", &c );
    delta = b*b - 4*a*c;
    if( delta < 0 )
     {
       /* Raízes complexas */
       p = -b / (2*a); 
       q = sqrt(-delta) / (2*a);
       printf("As raízes são %f+%fi e %f-%fi\n", p, q, p, q );
     }
    else
     {
       /* Raízes reais */
       raiz1 = (-b + sqrt(delta)) / (2*a);
       raiz2 = (-b - sqrt(delta)) / (2*a);
       printf("As raízes são %f e %f \n", raiz1, raiz2 );
     }
  }   

Programa 4

Faz um programa que pede ao utilizador 3 números e escrevo-os no ecrã por ordem crescente:

Resolução

Dados 3 números a, b, c, há 6 (3 factorial) ordens possíveis:

   a b c
   a c b
   b a c
   b c a
   c a b
   c b a

Há muitas maneiras de fazer este programa. Aqui vai uma delas. (NOTA: é preciso ter cuidado com os números repetidos. Por exemplo, se a pessoa introduzir os números 5, 3, 5, o computador deverá escrever 3 5 5).

  #include <stdio.h>

  main()
  {
    int a,b,c; 

    printf("a = "); scanf("%d", &a );
    printf("b = "); scanf("%d", &b );
    printf("c = "); scanf("%d", &c );
 
    if( a <= b && b <= c )
      printf("Ordem crescente: %d %d %d\n", a, b, c );
    else if( a <= c && c <= b )
      printf("Ordem crescente: %d %d %d\n", a, c, b );
    else if( b <= a && a <= c )
      printf("Ordem crescente: %d %d %d\n", b, a, c );
    else if( b <= c && c <= a )
      printf("Ordem crescente: %d %d %d\n", b, c, a );
    else if( c <= a && a <= b )
      printf("Ordem crescente: %d %d %d\n", c, a, b );
    else
      printf("Ordem crescente: %d %d %d\n", c, b, a );
  }
  

Aqui vai outra maneira de resolver o problema:

  #include <stdio.h>

  main()
  {
    int a,b,c; 

    printf("a = "); scanf("%d", &a );
    printf("b = "); scanf("%d", &b );
    printf("c = "); scanf("%d", &c );
 
    if( a <= b )
     {
       if( c <= a )
         printf("Ordem crescente: %d %d %d\n", c, a, b );
       else if( c >= b )
         printf("Ordem crescente: %d %d %d\n", a, b, c );
       else 
         printf("Ordem crescente: %d %d %d\n", a, c, b );
     }
    else /*  b < a  */
     {
       if( c <= b )
         printf("Ordem crescente: %d %d %d\n", c, b, a );
       else if( c >= a )
         printf("Ordem crescente: %d %d %d\n", b, a, c );
       else 
         printf("Ordem crescente: %d %d %d\n", b, c, a );
     }
  }
  

Ainda uma terceira solução para o problema:

Aqui, a ideia é primeiro ordenar os números e fazer um único printf no final. Ao ordenar garante-se que a variável a fica com o menor dos valores, b fica com o valor do meio e c fica com o maior valor. Para ordenar compara-se o valor de a com o de b e com o de c, trocando-se os valores se a for maior. Faz-se o mesmo para o b em relação a c. Para fazer a troca de valores entre duas variáveis é sempre necessário usar uma terceira variável que guarde temporariamente um dos valores.

Por exemplo: Se a=5 e b=3, vamos querer trocar os seus valores. Se se fizer directamente a=b, perde-se o valor que a tinha anteriormente (5). Bem como se perderia o valor de b (3) se fizessemos b=a; Por isso temos que ter a variável de troca. Assim, fazendo:

    troca = b;   /* troca fica com o valor 3 */
    b = a;       /* b passa a valer 5 e a vale também 5 */
    a = troca;   /* a passa a valer 3 */

Está a troca de valores feita.

O programa completo em C é:

  #include <stdio.h>

  main()
  {
    int a,b,c,troca; 

    printf("a = "); scanf("%d", &a );
    printf("b = "); scanf("%d", &b );
    printf("c = "); scanf("%d", &c );
 
    if( a > b )
     {       
    troca = b;
    b = a;
    a = troca;
     }
    if( a > c )
     {     
    troca = c;
    c = a;
    a = troca;
     }  
    if( b > c )
     {      
    troca = c;
    c = b;
    b = troca;
     }

    printf("Ordem crescente: %d %d %d\n", a, b, c );     
  }


Programa 5

Faz um programa em C que calcula o valor absoluto (módulo) de um número.

Resolução

  #include <stdio.h>

  main()
  {
    int x, absx;

    printf("Introduz um número: ");
    scanf("%d", &x );
    if( x < 0 )
      absx = -x;
    else
      absx = x;
    printf("O valor absoluto é %d\n", absx); 
  }

Programa 6

Faz um programa que, ao receber o valor da largura e do comprimento de uma figura geométrica, detecta se esta é um quadrado ou um rectângulo.

Resolução

  #include <stdio.h>

  main()
  {
    float largura, comprimento;
    printf("Diz a largura: "); scanf("%f", &largura );
    printf("Diz o comprimento: "); scanf("%f", &comprimento );

    if (largura == comprimento)
      printf("A figura é um quadrado ");
    else
      printf("A figura é um rectângulo ");
  }

Programa 7

Faz um programa em C que receba uma data de nascimento e que calcule que idade a pessoa terá em 01/01/2010.

Resolução

#include <stdio.h>

#define ANO 2010
#define MES 1
#define DIA 1

main()
{
  int dia, mes, ano;

  printf("Diz o dia de nascimento: ");
  scanf("%d",&dia);
  printf("Diz o mes de nascimento: ");
  scanf("%d",&mes);
  printf("Diz o ano de nascimento: ");
  scanf("%d",&ano);

  if ((ano > ANO) || (ano == ANO && (dia >= DIA || mes >= MES)))
    printf("Data invalida");
  else if (ano < ANO && dia == DIA && mes == MES)
    printf("Terás %d anos no dia 01/01/2010, e estarás de Parabéns!",ANO-ano);
  else
    printf("Terás %d anos no dia 01/01/2010",ANO-ano-1);
}

Programa 8

Faz um programa em C que receba 10 valores inteiros e que indique: Quantos são pares, quantos são ímpares, quantos são positivos e quantos são negativos.

Resolução

#include <stdio.h>

main()
{
   int n1, n2, n3, n4, n5, n6, n7, n8, n9, n10;
   int n_pares=0, n_impares=0, n_pos=0, n_neg=0;

   printf("Diz o 1..º número inteiro");scanf("%d",&n1);
   if (n1 % 2 == 0) n_pares++;
   else n_impares++;
   if (n1 > 0) n_pos++;
   else n_neg++;

   printf("Diz o 2.º número inteiro");scanf("%d",&n2);
   if (n2 % 2 == 0) n_pares++;
   else n_impares++;
   if (n2 > 0) n_pos++;
   else n_neg++;

   printf("Diz o 3.º número inteiro");scanf("%d",&n3);
   if (n3 % 2 == 0) n_pares++;
   else n_impares++;
   if (n3 > 0) n_pos++;
   else n_neg++;

   /* ... repetindo sempre o mesmo para os restantes números */

   printf("Resultados\n");
   printf(" %d números pares\n",n_pares);
   printf(" %d números impares\n",n_impares);
   printf(" %d números positivos\n",n_pos);
   printf(" %d números negativos\n",n_neg);
}

Repara que desta forma a escrita do programa torna-se repetitiva. Mais tarde, irás aprender uma outra maneira muito mais elegante e eficaz de resolver este exercício.


Programa 9

Faz um programa em C que calcule o salário de um empregado baseado no n.º de horas que trabalhou, e no seu salário por hora. Notas: As horas extrordinárias (> 40) são pagas a dobrar.

Resolução

#include <stdio.h>

#define extras 160  /* contam como horas extras as superiores a 160 */
            /* 40 horas por semana * 4 semanas por mes = 160 */

main()
{
 float horas, salario_hora, salario;

 printf("Indique o n.º de horas que trabalhou este mes: ");
 scanf("%f",&horas);
 printf("Indique quanto ganha por hora (em escudos): ");
 scanf("%f",&salario_hora);
 if (horas > 160)
   salario = 2 * salario_hora * (horas - 160) + salario_hora * 160;
 else
   salario = salario_hora * horas;
 printf("O seu salário vai ser: %.2f",salario);
}