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.

#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".

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

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:

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.

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

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

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

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

#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.0)
   salario = 2.0 * salario_hora * (horas - 160.0) + salario_hora * 160.0;
 else
   salario = salario_hora * horas;
 printf("O seu salário vai ser: %.2f", salario);
}