Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 9
typedef struct{
int dia,mes;
} Data;
typedef struct{
int x,y;
} Coords;
typedef struct{
char nome[50], morada[75], email[40], comida[80], telefone[10], observacoes[120];
Coords coordenadas;
int dia_descanso;
Data inicio_ferias, fim_ferias;
}Restaurante;
typedef struct lnode *List;
typedef struct lnode {
Restaurante info;
List next;
} List_node;
int fputrestaurante(Restaurante *rest)
{
FILE *fp = fopen("data.dat", "wb");
int cnt = -1;
if (fp != NULL)
cnt = fwrite((void *)rest, sizeof(rest), NUM, fp);
fclose(fp);
return cnt; /* número de elementos escritos ou -1 */
}
int testames(int mes) {
int diames;
lab:
switch (mes) {
case 1: diames=31; break;
case 3: diames=31; break;
case 5: diames=31; break;
case 7: diames=31; break;
case 8: diames=31; break;
case 10: diames=31; break;
case 12: diames=31; break;
case 2: diames=28; break;
case 4: diames=30; break;
case 6: diames=30; break;
case 9: diames=30; break;
case 11: diames=30; break;
default: printf("Erro de leitura do mês"); goto lab;
}
return diames;
}
List cria_lista (void){
List aux;
Restaurante rest;
aux = (List) malloc (sizeof (List_node));
if (aux != NULL) {
aux->info = rest;
aux->next = NULL;
}
return aux;
}
Restaurante criarrestaurante(Restaurante *resta) {
int i=1,diames;
printf("Nome do restaurante:");
scanf("%s", &resta->nome);
scanf("%*[^\n]");
printf("Morada do restaurante:");
scanf("%s", &resta->morada);
scanf("%*[^\n]");
printf("E-mail do restaurante:");
scanf("%s", &resta->email);
scanf("%*[^\n]");
printf("Tipo de comida do restaurante:");
scanf("%s", &resta->comida);
scanf("%*[^\n]");
printf("No de telefone do restaurante:");
scanf("%s", &resta->telefone);
scanf("%*[^\n]");
printf("Observacoes sobre o restaurante:");
scanf("%s", &resta->observacoes);
scanf("%*[^\n]");
printf("Coordenada X, seguida de Y do restaurante:");
do {
printf("\nX:");
i=scanf("%d", &resta->coordenadas.x);
scanf("%*[^\n]");
}while (i!=1);
do {
printf("\nY:");
i=scanf("%d", &resta->coordenadas.y);
scanf("%*[^\n]");
}while (i!=1);
printf("Dia de descanso do restaurante:\n");
printf("1=Domingo; 2=Segunda-Feira; 3=Terca-Feira; 4=Quarta-Feira; 5=Quinta-Feira; 6=Sexta-Feira; 7=Sabado.\n");
do {
printf("Dia:");
i=scanf("%d", &resta->dia_descanso);
scanf("%*[^\n]");
}while (i!=1 || resta->dia_descanso<1 || resta->dia_descanso>7);
printf("Ferias do restaurante: (MM/DD)");
printf("\nMes seguido do Dia do ínicio das ferias:");
do {
printf("\nMes:");
i=scanf("%d", &resta->inicio_ferias.mes);
scanf("%*[^\n]");
}while (i!=1 || resta->inicio_ferias.mes<1 || resta->inicio_ferias.mes>12);
diames=testames(resta->inicio_ferias.mes); /*testa se o mes tem 29, 30 ou 31 dias (Consideramos que
fevereiro tem sempre 28, uma vez que nao usamos anos*/
do {
printf("\nDia:");
i=scanf("%d", &resta->inicio_ferias.dia);
scanf("%*[^\n]");
}while (i!=1 || resta->inicio_ferias.dia<1 || resta->inicio_ferias.dia>diames);
printf("Mes seguido do Dia do Fim das ferias:");
do {
printf("\nMes:");
i=scanf("%d", &resta->fim_ferias.mes);
scanf("%*[^\n]");
}while (i!=1 || resta->fim_ferias.mes<1 || resta->fim_ferias.mes>12);
diames=testames(resta->fim_ferias.mes); /*testa se o mes tem 29, 30 ou 31 dias (Consideramos que
fevereiro tem sempre 28, uma vez que nao usamos anos*/
do {
printf("Dia:");
i=scanf("%d", &resta->fim_ferias.dia);
scanf("%*[^\n]");
}while (i!=1 || resta->fim_ferias.dia<1 || resta->fim_ferias.dia>diames);
return resta[1];
}
char imprime_restaurante(Restaurante *rest) {
printf("\nNome: %s", rest->nome);
printf("\nMorada: %s", rest->morada);
printf("\nE-Mail: %s", rest->email);
printf("\nTipo de Comida: %s", rest->comida);
printf("\nNumero de Telefone: %s", rest->telefone);
printf("\nObservações: %s", rest->observacoes);
printf("\nCoordenadas: %d,%d", rest->coordenadas.x, rest->coordenadas.y);
switch (rest->dia_descanso) {
case 1: printf("\nDia de descanso semanal: Domingo"); break;
case 2: printf("\nDia de descanso semanal: Segunda-Feira"); break;
case 3: printf("\nDia de descanso semanal: Terça-Feira"); break;
case 4: printf("\nDia de descanso semanal: Quarta-Feira"); break;
case 5: printf("\nDia de descanso semanal: Quinta-Feira"); break;
case 6: printf("\nDia de descanso semanal: Sexta-Feira"); break;
case 7: printf("\nDia de descanso semanal: Sábado"); break;
default: printf("\n\nErro na leitura do dia de descanso!\n\n"); break;
}
printf("\nInicio das ferias: %d/%d", rest->inicio_ferias.dia, rest->inicio_ferias.mes);
printf("\nFim das ferias: %d/%d\n", rest->fim_ferias.dia, rest->fim_ferias.mes);
}
int main() {
Restaurante rest;
int i=1,k;
Menu:
printf("MENU\n");
printf("1)Adicionar restaurante\n");
printf("2)Ler lista de restaurantes\n");
do {
i=scanf("%d",&k);
scanf("%*[^\n]");
} while(i!=1);
switch (k) {
case 1: {criarrestaurante(&rest); break; }
case 2: break;
default: { printf("Opção inválida!"); goto Menu; }
}
List aux=cria_lista();
fputrestaurante(&rest);
imprime_restaurante(&rest);
system("PAUSE");
}