Resolução de Exercícios de Laboratório (Aula 5) – Algoritmos e Estruturas de Dados

Sugestão de Resolução de Exercícios de Laboratório – Introdução ao Algoritmos e Estruturas de Dados (IAED), Instituto Superior Técnico

Considere os tipos Data e Livro definidos abaixo.

#define NUMEROLIVROS 100
#define MAXTITULO 40
#define MAXNOME 20

typedef struct {
int dia;
int mes;
int ano;
} Data;

typedef struct {
char titulo[MAXTITULO];
char autor[MAXNOME];
long long int isbn;
int anoPublicacao;
int numeroDaCopia;
Data dataEmprestimo;
Data dataRetorno;
} Livro;

Considere ainda que os livros estão guardados num vector com tamanho máximo NUMEROLIVROS.
1. Escreva uma função que imprima o seguinte menu:

****BIBLIOTECA DO IST****
1 – Inserir novo livro
2 – Listar livros
3 – Procurar livro por isbn
4 – Procurar livro por título
5 – Alterar título do livro
6 – Apagar livro pelo isbn
7 – Registar data de empréstimo de um livro pelo isbn
8 – Registar data de retorno de um livro pelo isbn
0 – Sair
*************************
2. Implemente todas as opções do menu (o programa só deverá terminar quando o utilizador seleccionar a opção 0). Para isso escreva funções para:

a) Ler um livro do standard input e inserir na estrutura de dados
b) Mostrar os dados de um livro no standard output
c) Listar todos os livros
d) Procurar um livro através do isbn
e) Procurar um livro através do título
f) Alterar o título de um livro
g) Eliminar um livro dos registos da biblioteca inserindo o isbn
h) Registar a data de empréstimo de um livro
i) Registar a data de retorno de um livro

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUMEROLIVROS 100
#define MAXTITULO 40
#define MAXNOME 20

typedef struct {
int dia;
int mes;
int ano;
} Data;

typedef struct {
char titulo[MAXTITULO];
char autor[MAXNOME];
long long int isbn;
int anoPublicacao;
int numeroDaCopia;
Data dataEmprestimo;
Data dataRetorno;
} Livro;

void imprimeMenu(){
printf("****BIBLOTECA DO IST****n");
printf("1 - Inserir novo livron");
printf("2 - Listar livrosn");
printf("3 - Procurar livro por isbnn");
printf("4 - Procurar livro por títulon");
printf("5 - Alterar título do livron");
printf("6 - Apagar livro pelo isbnn");
printf("7 - Registar data de empréstimo de um livro pelo isbnn");
printf("8 - Registar data de retorno de um livro pelo isbnn");
printf("0 - Sairn");
printf("*************************n");
}

void limparLivro(Livro *l){
strcpy(l->titulo, "");
strcpy(l->autor, "");
l->isbn = 0;
l->anoPublicacao = 0;
l->numeroDaCopia = 0;
l->dataEmprestimo.dia = 0;
l->dataEmprestimo.mes = 0;
l->dataEmprestimo.ano = 0;
l->dataRetorno.dia = 0;
l->dataRetorno.mes = 0;
l->dataRetorno.ano = 0;
}

void initLivros(Livro v[], int tamanho){
int i;
for(i=0; i<tamanho; i++){
limparLivro(&v[i]);
}
}

void novoLivro(Livro v[], int tamanho){
int i;
for(i=0; i<tamanho; i++){
if(!strcmp(v[i].titulo, "")){
printf("Título: ");
scanf("%s", v[i].titulo);
printf("Autor: ");
scanf("%s", v[i].autor);
printf("ISBN: ");
scanf("%ld", &(v[i].isbn));
printf("Ano da Publicação: ");
scanf("%d", &(v[i].anoPublicacao));
printf("Número da Cópia: ");
scanf("%d", &(v[i].numeroDaCopia));
break;
}
}
}

void imprimeLivro(Livro l){
printf("========= DETALHES DO LIVRO ==========n");
printf("Título: %snAutor: %snISBN: %ldn", l.titulo, l.autor, l.isbn);
printf("Ano da Publicação: %dnNúmero da Cópia: %dn", l.anoPublicacao, l.numeroDaCopia);
printf("Data de Empréstimo: %d-%d-%dn", l.dataEmprestimo.dia, l.dataEmprestimo.mes, l.dataEmprestimo.ano);
printf("Data de Retorno: %d-%d-%dn", l.dataRetorno.dia, l.dataRetorno.mes, l.dataRetorno.ano);
}

void listarLivros(Livro v[], int tamanho){
int i;
for(i=0; i<tamanho; i++){
if(!strcmp(v[i].titulo, "")){
return;
}
printf("%s | %s | %ldn", v[i].titulo, v[i].autor, v[i].isbn);
}
}

int procurarISBN(Livro v[], int tamanho, long long int isbn){
int i;
for(i=0; i<tamanho; i++){
if(v[i].isbn == isbn) return i;
}
return -1;
}

int apagarLivro(Livro v[], int tamanho, long long int isbn){
int i;
for(i=0; i<tamanho; i++){
if(v[i].isbn == isbn) {
limparLivro(&v[i]);
}
}
return -1;
}

int procurarTitulo(Livro v[], int tamanho, char titulo[]){
int i;
for(i=0; i<tamanho; i++){
if(!strcmp(v[i].titulo, titulo)) return i;
}
return -1;
}

void alterarTitulo(Livro *l, char* novoTitulo){
strcpy(l->titulo, novoTitulo);
}

void registarEmprestimo(Livro *l, Data d){
l->dataEmprestimo.dia = d.dia;
l->dataEmprestimo.mes = d.mes;
l->dataEmprestimo.ano = d.ano;
}

void registarRetorno(Livro *l, Data d){
l->dataRetorno.dia = d.dia;
l->dataRetorno.mes = d.mes;
l->dataRetorno.ano = d.ano;
}
int main(){
Livro vLivros[NUMEROLIVROS];
char c, titulo[MAXTITULO];
int id;
long long int isbn;
Data d;
initLivros(vLivros, NUMEROLIVROS);
imprimeMenu();
while((c = getchar()) != '0'){
if(c == '1'){
novoLivro(vLivros, NUMEROLIVROS);
} else if(c == '2') {
listarLivros(vLivros, NUMEROLIVROS);
} else if(c == '3') {
printf("ISBN: ");
scanf("%ld", &isbn);
id = procurarISBN(vLivros, NUMEROLIVROS, isbn);
if(id < 0) {
printf("Livro não encontradon");
} else {
imprimeLivro(vLivros[id]);
}
} else if(c == '4') {
printf("Título: ");
scanf("%s", titulo);
id = procurarTitulo(vLivros, NUMEROLIVROS, titulo);
if(id < 0) {
printf("Livro não encontradon");
} else {
imprimeLivro(vLivros[id]);
}

} else if(c == '5') {
printf("ISBN: ");
scanf("%ld", &isbn);
id = procurarISBN(vLivros, NUMEROLIVROS, isbn);
if(id >= 0) {
printf("Título: ");
scanf("%s", titulo);
alterarTitulo(&(vLivros[id]), titulo);
}

} else if(c == '6') {
printf("ISBN: ");
scanf("%ld", &isbn);
apagarLivro(vLivros, NUMEROLIVROS, isbn);
} else if(c == '7') {
printf("ISBN: ");
scanf("%ld", &isbn);
id = procurarISBN(vLivros, NUMEROLIVROS, isbn);
if(id >= 0) {
printf("Data: (dd-mm-aaaa): ");
scanf("%d-%d-%d", &d.dia, &d.mes, &d.ano);
registarEmprestimo(&(vLivros[id]), d);
}

} else if(c == '8') {
printf("ISBN: ");
scanf("%ld", &isbn);
id = procurarISBN(vLivros, NUMEROLIVROS, isbn);
if(id >= 0) {
printf("Data: (dd-mm-aaaa): ");
scanf("%d-%d-%d", &d.dia, &d.mes, &d.ano);
registarRetorno(&(vLivros[id]), d);
}
} else if(c == '0') {
exit(0);
}
}
return 0;
}

Download

aula5.c

You may also like...

Deixe uma resposta

O seu endereço de email não será publicado.