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",¬a);
}
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);
}
}