Programação I

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


Programa 1


/*
 *  a4_p1: Faz pequenas operacoes aritmeticas
 *
 *  Input: Uma operacao e dois operandos
 * Output: Resultado da operacao
 */

 #include<stdio.h>

 main()
 {
        char operacao;
        double op1, op2;

        printf("Qual a operacao (+ - * /)? ");
        scanf("%c", &operacao);
        printf("Quais os dois operandos? ");
        scanf("%lf%lf", &op1, &op2);

        switch (operacao)
        {
                case '+': /* adicao */
                    printf("%lf + %lf = %lf\n", op1, op2, op1+op2);
                    break;
                case '-': /* subtraccao */
                    printf("%lf - %lf = %lf\n", op1, op2, op1-op2);
                    break;
                case '*': /* multiplicacao */
                    printf("%lf * %lf = %lf\n", op1, op2, op1*op2);
                    break;
                case '/': /* divisao */
                    printf("%lf / %lf = %lf\n", op1, op2, op1/op2);
                    break;
        }
 }


Programa 2

/*
 *  a4_p2: Faz pequenas operacoes aritmeticas
 *         (com base em a4_p1, mas, evita divisao por zero)
 *  Input: Uma operacao e dois operandos
 * Output: Resultado da operacao
 */

 #include<stdio.h>

 main()
 {
        char operacao;
        double op1, op2;

        printf("Qual a operacao (+ - * /)? ");
        scanf("%c", &operacao);
        printf("Quais os dois operandos? ");
        scanf("%lf%lf", &op1, &op2);

        switch (operacao)
        {
                case '+': /* adicao */
                    printf("%lf + %lf = %lf\n", op1, op2, op1+op2);
                    break;
                case '-': /* subtraccao */
                    printf("%lf - %lf = %lf\n", op1, op2, op1-op2);
                    break;
                case '*': /* multiplicacao */
                    printf("%lf * %lf = %lf\n", op1, op2, op1*op2);
                    break;
                case '/': /* divisao */
                    if (op2 == 0.0)
                        printf("Operacao invalida\n");
                    else
                        printf("%lf / %lf = %lf\n", op1, op2, op1/op2);
                    break;
        }
 }

 

Programa 3

/*
 *  a4_p3: Da um parecer qualitativo
 *         a uma classificacao numerica
 *  Input: Nota em valores (numero inteiro de 0 a 20)
 * Output: Parecer qualitativo
 *         (Mau, Medíocre, Suficiente, Bom, Muito Bom)
 */

 #include <stdio.h>

 main()
 {
        int nota;

        printf("Introduz a classificacao: ");
        scanf("%d", &nota);

        switch(nota)
        {
                case  0:
                case  1:
                case  2:
                case  3:
                case  4:
                        printf("Mau\n");
                        break;
                case  5:
                case  6:
                case  7:
                case  8:
                case  9:
                        printf("Mediocre\n");
                        break;
                case 10:
                case 11:
                case 12:
                case 13:
                        printf("Suficiente\n");
                        break;
                case 14:
                case 15:
                case 16:
                case 17:
                        printf("Bom\n");
                        break;
                case 18:
                case 19:
                case 20:
                        printf("Muito Bom\n");
                        break;
        }
 }
Obs: Claro que este programa poderia ter sido feito com instruções if-else. Mas foi feito com a instrução switch-case para perceberes melhor o seu modo de funcionamento. O que aconteceria se não tivesses usado os breaks e introduzisses uma classificação, p/ exemplo, de apenas 3 valores? Pensa no assunto.

Programa 4

/*
 *  a4_p4: UAlg 10x
 *
 *  Input:
 * Output: Escreve a mesma frase 10 vezes
 */

 #include <stdio.h>

 main()
 {
        int n;  /* contador para o numero de vezes */

        for (n= 1; n<=10; i++)
          printf("Universidade do Algarve\n");
 }


Programa 5

/*
 *  a4_p5:  Grande contador
 *
 *  Input:
 * Output: Escreve no ecra os numeros de 1 a 10000
 */

 #include <stdio.h>

 main()
 {
        int n;  /* contador */

        for (n=1; n<=10000; i++)
          printf("%05d\n", n);
 }

Obs: Repara no modo como foi formatado o output. Na instrução printf, em vez do habitual %d aparece %05d. Desta forma os números que mandamos escrever no ecrã surgem alinhados à direita num campo de 5 dígitos preenchido com zeros à esquerda. Se puséssemos apenas %5d acontecia o mesmo mas sem o preenchimento com zeros à esquerda.

Experimenta redireccionar o output para um ficheiro de texto para que possas ver bem as diferenças na forma de apresentar os primeiros números. Para isso, ao executares o programa, deverás fazer o que se chama redireccionamento de saída. Se o programa executável se chamar "a4_p5" e quiseres criar um ficheiro chamado "numeros.txt" faz assim:

a4_p5 > numeros.txt

Agora vê o conteúdo de numeros.txt


Programa 6

/*
 *  a4_p6:  Tabuada
 *
 *  Input: Numero inteiro (o multiplicando)
 * Output: Tabuada desse numero
 */

 #include <stdio.h>

 main()
 {
        int a;          /* multiplicando */
        int b;          /* multiplicador */

        printf("Introduza um numero: ");
        scanf("%d", &a);

        for (b=1; b<=10; b++)
          printf("%d x %d = %d\n", a, b, a*b);
 }
Obs: Como poderias formatar a apresentação dos números no ecrã de modo a surgirem todos alinhadinhos à direita? (Lê as observações do programa 5)

Programa 7

/*
 *  a4_p7: Conta quantos digitos tem um numero inteiro 
 *
 *  Input: Um valor numerico inteiro
 * Output: Numero de digitos que o constitui
 */




    #include <stdio.h>
    
    main()
    {
      int n_inicial;        /* numero a avaliar */
      int n_digitos;        /* contador de digitos */
      int n;                /* variavel de manobra p/ nao perder n_inicial */
    
      printf("Introduza um numero inteiro: ");
      scanf("%d", &n_inicial);
      if( n_inicial == 0 )
        n_digitos = 1;
      else 
       {
         if( n_inicial < 0 )
           n = -n_inicial;
         else
           n = n_inicial;
         n_digitos = 0;
         while (n != 0)
           {
             n = n / 10;
             n_digitos = n_digitos + 1;
           }
       }
      printf("%d tem %d digitos", n_inicial, n_digitos);
    }

 

Programa 8

/*
 *  a4_p8: Conta zeros e uns de um valor binario
 *
 *  Input: Um valor numerico binario
 * Output: Numero de zeros e de uns que ele possui
 */


#include <stdio.h>

main()
{
  unsigned long n_binario;      /* valor a avaliar */
  int uns;                      /* contador de 1s */
  int zeros;                    /* contador de 0s */
  int resto;                    /* resto da divisao */
  int i;                        /* contador p/ o ciclo */

  printf("Introduza um valor binario de oito digitos (so zeros e uns): ");
  scanf("%ld", &n_binario);

  zeros = 0;
  uns = 0;
  i = 8;
  while (i>0)
  {
    resto = n_binario % 10;

    if (resto == 0)
        zeros = zeros + 1;
    if (resto == 1)
        uns = uns + 1;

    n_binario = n_binario / 10;
    i = i-1;                  
  }
  printf("Tem %d zeros e %d uns.\n", zeros, uns);
}

Obs: Podes melhorar este programa para, no caso de o utilizador introduzir um valor não binário, apresentar uma mensagem a indicar "Numero inválido".