Programação Imperativa

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


Programa 1 - Agenda telefónica.

Resolução:
    #include <stdio.h>
    #include <string.h>
    
    #define N_AMIGOS 5
    
    typedef struct
    {
      char nome[30];
      char telefone[15];
    } pessoa;
    
    pessoa amigo[N_AMIGOS] = {
                               { "alice",           "96-2189289" },
                               { "pedro teixeira", "289-7829933" },
                               { "toze",            "91-3229289" },
                               { "alex",            "93-7822899" },
                               { "susana",          "21-8492238" }
                             };
    
    main()
    {
      char nome[200];
      int i;
    
      printf("Diz um nome: ");
      gets( nome );
      for( i=0; i< N_AMIGOS; i++ )
        if( strcmp( nome, amigo[i].nome ) == 0 )
          break;
      if( i < N_AMIGOS )
        printf("O numero e %s\n", amigo[i].telefone );
      else
        printf("%s nao esta na minha agenda\n", nome );
    }

Programa 2 - Datas

Resolução:
    #include <stdio.h>
    #include <math.h>
    
    typedef struct
    {
      int dia;
      int mes;
      int ano;
    } data;
    
    /* dias_mes é uma tabela que tem os dias de cada mês */
    int dias_mes[2][13] = {
      { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, /* não bissexto */
      { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }  /* bissexto */
    };
    
    /* retorna 1 se o ano é bissexto, retorna 0 se não é bissexto */
    int bissexto( int ano )
    {
       return (ano % 4 == 0) && (ano % 100 != 0 || ano % 400 == 0);
    }
    
    /* calcula o numero de dias entre a 1/1/1900 e a data d.
       assume que a data d é posterior a 1/1/1900
    */
    int dias( data d )
    {
       int i, soma, b;
    
       soma = 0;
       for( i=1900; i< d.ano; i++ )       /* anos completos */
         if( bissexto( i ) )
           soma = soma + 366;
         else
           soma = soma + 365;
       b = bissexto( d.ano );
       for( i=1; i< d.mes; i++ )          /* meses completos */
         soma = soma + dias_mes[b][i];
       soma = soma + d.dia;               /* dias */
       return soma;
    }
    
    /* calcula o numero de dias entre as datas d1 e d2 */
    int dias_entre( data d1, data d2 )
    {
       int dias1, dias2;
       dias1 = dias( d1 );
       dias2 = dias( d2 );
       return abs( dias1-dias2 );
    }
    
    main()
    {
      data d1,d2;
    
      printf("Introduz uma data (dia mês ano): ");
      scanf("%d%d%d", &d1.dia, &d1.mes, &d1.ano );
      printf("Introduz outra data (dia mês ano): ");
      scanf("%d%d%d", &d2.dia, &d2.mes, &d2.ano );
      printf("Entre %d/%d/%d e %d/%d/%d passaram %d dias.\n",
              d1.dia, d1.mes, d1.ano,
              d2.dia, d2.mes, d2.ano,
              dias_entre( d1,d2 ) );
    }

Programa 3 - Pautas de alunos

Resolução:
    #include <stdio.h>
    #include <string.h>
    #include <math.h>

    typedef struct
    {
      int nota_final;
      char resultado[15];
    } classificacao;

    typedef struct
    {
      int numero;
      char curso[5];
      float nota_freq;
      char resultado_freq[15];
      float nota_exame;
      classificacao classifica;
    } discente;

    typedef struct
    {
      char nome[32];
      char ano_lectivo[12];
      int semestre;
      discente aluno[200];
    } disciplina;

    int arredonda (float nota)
    {
      if (nota-0.5 >= (int)nota)
        return (int) ceil ((double)nota);
      else
        return (int) floor ((double)nota);
    }

    float recebe_nota (void)
    {
      float nota;

      do
        {
          scanf("%f",&nota);
        }
      while ((nota < 0) || (nota > 20));
      return nota;
    }

    main()
    {
      disciplina pauta;
      int i,j;
      char c='';

      /* Receber os dados */
      printf("INTRODUZA OS DADOS\n");
      printf("\nDisciplina\n");
      printf("Nome: ");gets(pauta.nome);
      printf("Ano lectivo: ");gets(pauta.ano_lectivo);
      printf("Semestre: ");scanf("%d",&pauta.semestre);
      printf("\n\nAlunos\n");
      for (i=0;c!='0' && i<200;i++)
      {
        printf("-- %d.§ Aluno --\n",i+1);
        printf("Numero:");scanf("%d",&pauta.aluno[i].numero);
        scanf("%c",&c);         /* por causa do enter */
        printf("Curso: ");gets(pauta.aluno[i].curso);
        printf("Nota de Frequencia: ");pauta.aluno[i].nota_freq=recebe_nota();

        if (pauta.aluno[i].nota_freq >= 9.5)
          strcpy(pauta.aluno[i].resultado_freq,"Dispensado");
        else if (pauta.aluno[i].nota_freq >= 6.0)
          {
            strcpy(pauta.aluno[i].resultado_freq,"Admitido");
            printf("Nota de exame: ");pauta.aluno[i].nota_exame=recebe_nota();
          }
        else
          strcpy(pauta.aluno[i].resultado_freq,"Nao Admitido");

        if (strcmp(pauta.aluno[i].resultado_freq,"Dispensado") == 0)
          {
            pauta.aluno[i].nota_exame = 0;
            pauta.aluno[i].classifica.nota_final = arredonda(pauta.aluno[i].nota_freq);
            strcpy(pauta.aluno[i].classifica.resultado, "Aprovado");
          }
        else if ((strcmp(pauta.aluno[i].resultado_freq,"Admitido") == 0) && (pauta.aluno[i].nota_exame >= 9.5))
          {
            pauta.aluno[i].classifica.nota_final = arredonda(pauta.aluno[i].nota_exame);
            strcpy(pauta.aluno[i].classifica.resultado, "Aprovado");
          }
        else if ((strcmp(pauta.aluno[i].resultado_freq, "Admitido") == 0) && (pauta.aluno[i].nota_exame < 9.5))
          {
            pauta.aluno[i].classifica.nota_final = arredonda(pauta.aluno[i].nota_exame);
            strcpy(pauta.aluno[i].classifica.resultado, "Reprovado");
          }
        else
          {
            pauta.aluno[i].nota_exame = 0;
            pauta.aluno[i].classifica.nota_final = 0;
            strcpy(pauta.aluno[i].classifica.resultado, "Reprovado");
          }

        printf("\nPrima 0 para terminar\n");
        scanf("%c",&c);         /* por causa do enter */
        c=getchar();
      }

      /* Escrever a pauta */
      printf("Disciplina: %s \n",pauta.nome);
      printf("Ano: %s \n",pauta.ano_lectivo);
      printf("Semestre: %d.§ \n",pauta.semestre);
      printf("                                                  Classificacao final\n");
      printf("N.§ aluno - Curso | Frequencia - Resultado | Exame | Numerico - Resultado |\n");
      printf("---------------------------------------------------------------------------\n");
      for (j=0;j<i;j++)
        { 
          printf("%d\t",pauta.aluno[j].numero);
          printf("    %s\t",pauta.aluno[j].curso);
          printf("    %4.1f\t",pauta.aluno[j].nota_freq);
          printf("%s\t",pauta.aluno[j].resultado_freq);
          printf("%4.1f",pauta.aluno[j].nota_exame);
          printf("   %3d.0\t",pauta.aluno[j].classifica.nota_final);
          printf("%s\n",pauta.aluno[j].classifica.resultado);
        }
    }