Páginas

11 de jul. de 2011

Sistema de Biblioteca

O program tem erros de tratamento e validação de alguns dados

/*
Universidade Federal de Santa Catarina

Prof: Anderson Luiz Perez

Trabalho para Controle de acervos e emprestimos de biblioteca

Desenvolvido por: Joildo Schueroff e Silvana Pires da Silva

Trabalho de Programação I

*/
#include // inclusao da biblioteca stdio.h
#include // inclusao da biblioteca string.h
#include //inclusao da biblioteca time.h

#define TAMANHO_USUARIO 5 // define o tamanho do usuario em 5
#define TAMANHO_ACERVO 5 // define o tamanho do acervo em 5
#define TOTAL_EMPRESTIMO 4 // define o total de emprestimo em 4
#define DIAS_EMPRESTIMO 7 //define os dias de emprestimos em 7

/*
Criação de novos tipos de dados
*/

typedef char nome[50];
typedef char local_nascimento[50];
typedef char endereco[50];
typedef char nome_acervo[50];

typedef struct{
int dia, mes, ano;
}data;
struct nome_acervo{
nome_acervo titulo, editora, local, autor;
int tipo_arquivo, isbn_isbn, codigo, ano_publicacao, qtd_exemplares, volume;

};
struct endereco{
endereco rua, bairro, cidade, estado, rua_endereco, bairro_endereco, cidade_endereco,
estado_endereco;
};

struct dados_pessoa{
int codigo;
nome nome_pessoa;
data dta_nascimento;
local_nascimento cidade_nasc, estado_nasc;
struct endereco endereco;
int celular, fixo;
int qtd_emprestimo;
int emprestimo[TOTAL_EMPRESTIMO];
data diadehoje;
data previsaodevolucao;

};

struct dados_biblioteca{
struct nome_acervo nome_do_acervo;
int codigo;
int aux_emprestimo;
int emprestado;
int pendente;
int contador;
};
//Prototipo das funcoes auxiliares

int menu_biblioteca();

void inserir_usuario(struct dados_pessoa *dad_usuario);
int localizar_usuario(nome nome_usuario, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO]);
void alterar_usuario(struct dados_pessoa *dados, int pos);
void listar_usuarios(struct dados_pessoa *novo_usuario);
int excluir_usuario(int pos, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO]);

void inserir_no_acervo(struct dados_biblioteca *dad_acervo);
void listar_acervo(struct dados_biblioteca *listar);
void alterar_acervo(struct dados_biblioteca *dad_acer);
int pesquisar_acervo(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int pesquisar_acervo_autor(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int pesquisar_acervo_editora(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int excluir_acervo(int pos, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
void locacaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer);
void devolucaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer);
void listar_acervo_pendete(struct dados_biblioteca bibli[TAMANHO_ACERVO], int qtd);
void maiusculas(nome str);

data data_atual();
data data_prevista_devolucao(data data_a);

/*============================== Função Principal=========================================*/
int main()
{
int opc, d_usu; // Variaveis Locais
struct dados_pessoa dad_usuario[TAMANHO_USUARIO];
int opcao_usuario, qtd_usuario = 0, posicao, i, pesquisa_codigo, pesquisa_numero;
int telefone_fixo, telefone_celular;
nome nome_pessoa, nome_pesquisa;
char confirma;
//======================
struct dados_biblioteca dad_acervo[TAMANHO_ACERVO];
int opcao_acervo, qtd_acervo = 0, localiza;
data diadehoje;
data devolucao;



do{
opc = menu_biblioteca(); // opc recebe a função menu biblioteca

switch(opc)
{
case 1: printf("Dados Usuários \n\n");
do{
printf("1.Cadastro de Usuario \n");
printf("2.Pesquisa de Usuario \n");
printf("3.Listar todos os Usuarios Cadastrados\n");
printf("4.Alteracao de dados do cadastro \n");
printf("5.Emprestimos do Usuario \n");
printf("6.Devolucao do Usuario \n");
printf("7.Exclusao de Usuario \n");
printf("8.Voltar ao Menu Anterior\n");
scanf("%i",&opcao_usuario);
switch(opcao_usuario) {
case 1:printf("CADASTRO DE UM USUARIO \n\n");
if(qtd_usuario < TAMANHO_USUARIO){ // condicao para cadastrar inserir_usuario(&dad_usuario[qtd_usuario]); qtd_usuario++; dad_usuario[qtd_usuario -1].codigo = qtd_usuario; }else{ printf("Nao foi possivel cadastrar o usuario \n"); } break; case 2: printf("PESQUISA USUARIO \n\n"); int pesquisa; printf("Selecione o modo de pesquisa \n\n"); printf("1.Por Codigo \n"); printf("2.Por Nome \n"); printf("3.Por telefone \n"); scanf("%i",&pesquisa); getchar(); if(pesquisa == 1){ // pesquisa por codigo printf("Digite o codigo do usuario a ser pesquisado \n"); scanf("%i",&pesquisa_codigo); for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].codigo == pesquisa_codigo){ listar_usuarios(&dad_usuario[i]); } } } if(pesquisa == 2){ //pesquisa por nome printf("Digite o nome do usuario a ser pesquisado \n"); gets(nome_pessoa); maiusculas(nome_pessoa); posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario); if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
}else{
printf("O usuario %s não esta cadastrado \n",nome_pessoa);
}
}
if(pesquisa == 3){ //pesquisa por telefone
do{
printf("Digite o tipo de telefone \n");
printf("1.Telefone Fixo \n");
printf("2.Telefone Celular \n");
printf("3.Sair da Procura \n");
scanf("%i",&pesquisa_numero);
switch(pesquisa_numero){
case 1: printf("Digite o numero do telefone fixo \n");
scanf("%i",&telefone_fixo);
for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].fixo == telefone_fixo){ listar_usuarios(&dad_usuario[i]); } } break; case 2: printf("Digite o numero do telefone celular \n"); scanf("%i",&telefone_celular); for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].celular == telefone_celular){ listar_usuarios(&dad_usuario[i]); } } break; case 3: printf("Voltando ao menu principal \n\n"); break; default:printf("Opcao Invalida \n"); } }while(pesquisa_numero != 3); } break; case 3: printf("LISTAGEM DE USUARIOS CADASTRADOS\n\n"); for(i = 0; i < qtd_usuario; i++){ listar_usuarios(&dad_usuario[i]); } break; case 4: printf("ALTERACAO DE DADOS CADASTRAIS DOS USUARIOS \n\n"); getchar(); printf("Digite o nome do usuario a ser Alterado \n"); gets(nome_pessoa); maiusculas(nome_pessoa); posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario); if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
alterar_usuario(dad_usuario, posicao);

}else{
printf("O usuario %s nao esta cadastrado(a) \n\n",nome_pessoa);
}

break;
/*Emprestimo ao Usuario */
case 5: printf("EMPRESTIMOS NO ACERVO PARA O USUARIO \n\n");

locacaodeacervo(dad_usuario, dad_acervo, qtd_usuario, qtd_acervo);

break;
case 6: printf("DEVOLUCAO DE ACERVO DO USUARIO\n\n");
devolucaodeacervo(dad_usuario, dad_acervo, qtd_usuario, qtd_acervo);
break;
case 7: printf("EXCLUIR USUARIO \n\n");
getchar();
printf("Digite o nome do Usuario para ser excluido \n");
gets(nome_pessoa);
maiusculas(nome_pessoa);
posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario);
if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
printf("Deseja excluir o Usuario Acima (s/n)\n");
scanf("%c",&confirma);

if((confirma == 'S'|| confirma == 's') && (dad_usuario[posicao].qtd_emprestimo == 0)){
qtd_usuario = excluir_usuario(posicao, qtd_usuario, dad_usuario);
printf("Usuario excluido com sucesso \n\n");

}else{
printf("Nao foi possivel excluir usuario, letra errada ou pendente Acervo \n\n");}
}else{
printf("O usuario %s nao esta cadastrado(a) \n\n",nome_pessoa);
}

break;
case 8: printf("\n\n");
break;

default:printf("OPCAO INVALIDA, TENTE NOVAMENTE \n\n");
}
}while(opcao_usuario != 8);
break;
case 2: printf("Dados do Acervo \n\n");
do{
printf("1.Cadastro no Acervo \n");
printf("2.Pesquisa no Acervo \n");
printf("3.Listar todos os Itens Cadastrados\n");
printf("4.Alteracao de dados no Acervo \n");
printf("5.Exclusao de Acervo\n");
printf("6.Listar todos os emprestimos por mes \n");
printf("7.Listar emprestimos pendentes de devolução \n");
printf("8.Voltar ao Menu Anterior\n");
scanf("%i",&opcao_acervo);
switch(opcao_acervo){
case 1: printf("**CADASTRO DE ITENS NO ACERVO**\n\n");
if(qtd_acervo < TAMANHO_ACERVO){ //condicao para cadastrar inserir_no_acervo(&dad_acervo[qtd_acervo]); qtd_acervo++; dad_acervo[qtd_acervo -1].codigo = qtd_acervo; }else{ printf("Não foi possivel cadastrar o item no acervo \n"); } break; case 2: printf("***PESQUISAR DADOS NO ACERVO ***\n\n"); int pesquisa; printf("Selecione o modo de pesquisa \n\n"); printf("1.Por Codigo \n"); printf("2.Por Nome (titulo) \n"); printf("3.Por Autor \n"); printf("4.Por Editora \n"); printf("5.Por Tipo \n"); scanf("%i",&pesquisa); getchar(); if(pesquisa == 1){ printf("Digite o codigo do acervo a ser pesquisado \n"); scanf("%i",&pesquisa_codigo); for(i = 0; i < qtd_acervo; i++){ if(pesquisa_codigo == dad_acervo[i].codigo){ listar_acervo(&dad_acervo[i]); } } } if(pesquisa == 2){ printf("Digite do titulo do acervo \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo); if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 3){
printf("Digite o nome do autor da obra \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo_autor(nome_pesquisa, qtd_acervo, dad_acervo);
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 4){
printf("Digite o nome da editora do acervo \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo_editora(nome_pesquisa, qtd_acervo, dad_acervo);
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 5){
do{
printf("Digite o tipo de Acervo \n");
printf("1.Livro \n");
printf("2.Revista \n");
printf("3.Jornal \n");
printf("4.CD \n");
printf("5.DVD \n");
printf("6.Outros \n");
printf("7.Sai da Pesquisa por tipo \n");
scanf("%i",&pesquisa_codigo);
for(i = 0; i < qtd_acervo; i++){ if(pesquisa_codigo == dad_acervo[i].nome_do_acervo.tipo_arquivo){ listar_acervo(&dad_acervo[i]); } } }while(pesquisa_codigo != 7); } break; case 3: printf("***LISTAR TODOS OS DADOS CADASTRADOS NO ACERVO ***\n\n"); for(i = 0; i < qtd_acervo; i++){ listar_acervo(&dad_acervo[i]); } break; case 4: printf("**ALTERAÇÃO DE DADOS NO ACERVO**\n\n"); getchar(); printf("Digite o nome a ser alterado \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo); printf("\n"); if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
alterar_acervo(&dad_acervo[localiza]);

}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
break;

case 5: printf("** EXCLUSAO DE OBRA DO ACERVO **\n\n");
getchar();
printf("Digite o nome a ser excluido \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo);
printf("\n");
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
if(dad_acervo[localiza].aux_emprestimo == dad_acervo[localiza].nome_do_acervo.qtd_exemplares){
printf("Deseja excluir a obra acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
qtd_acervo = excluir_acervo(localiza, qtd_acervo, dad_acervo);
printf("O acervo acima foi excluido com sucesso \n\n");
}
}else{
printf("Nao foi possivel excluir o acervo devido estar emprestado ao usuario \n\n");
}
}else{
printf("Acervo nao encontrado \n\n") ;
}
break;
case 6: printf(" LISTAR TODOS OS EMPRESTIMOS POR MES\n\n");
int mes_lista;
data data_teste;
printf("Digite o mes que deseja listar os emprestimos \n");
scanf("%i",&mes_lista);
for(i = 0; i < qtd_usuario; i++){ if(mes_lista == dad_usuario[i].diadehoje.mes){ listar_usuarios(&dad_usuario[i]); } } break; case 7: printf("LISTAR EMPRESTIMOS PENDENTES DE DEVOLUCAO\n\n"); listar_acervo_pendete(dad_acervo,qtd_acervo); break; case 8: printf("\n\n"); break; default:printf("OPCAO INVALIDA, TENTE NOVAMENTE \n\n"); } }while(opcao_acervo != 8); break; case 3: printf("Sair do Sistema Biblioteca \n\n Saindo !!!\n"); break; default:printf("Opcao Invalida, Tente Novamente \n"); } }while(opc != 3); return 0; } /*============================== Menu da Biblioteca ============================*/ int menu_biblioteca() { int opcao; printf("Sistema Biblioteca \n\n"); printf("1. Dados Usuarios Biblioteca \n"); printf("2. Dados do Acervo da Biblioteca \n"); printf("3. Sair do Sistema \n"); scanf("%i",&opcao); return opcao; } /*======================= Funcao para converter maiusculas =====================*/ void maiusculas(nome str) { int i; for (i = 0; i < strlen(str); i++) str[i] = toupper(str[i]); } /*======================= Funcao de Inserir Usuario ============================*/ void inserir_usuario(struct dados_pessoa *dad_usuario) { int aux, dia, mes, ano, flag; // variaveis locais getchar(); // limpa o buffer do teclado pois vem de um leitura de inteiro printf("Nome completo: "); gets(dad_usuario->nome_pessoa);

maiusculas(dad_usuario->nome_pessoa);

printf ("\nData de nascimento\nAno: ");
scanf ("%d",&ano);

do{
printf ("Mes: ");
scanf ("%d",&mes);
if (mes < 1 || mes > 12)
printf ("Mes invalido, digite corretamente.\n");
}
while (mes <1 || mes >12);
do {
flag = 0;
do {
printf ("Dia: ");
scanf ("%d",&dia);
}while(dia < 1 || dia > 31);
if (mes == 2){
if ( ano % 400 == 0 || ano % 4 == 0 && ano % 100 == 0){
if ( dia > 29){
printf ("dia invalido, ano bissexto. Digite novamente.\n");
flag = 1;
}
}
else {
if (dia > 28) {
printf ("dia invalido, mes ate 28. Digite novamente.\n");
flag = 1;
}
}
}
else{
if (mes == 4 || mes == 6 || mes == 9 || mes == 11){
if (dia > 30){
printf("Dia invalido, mes de 1 ate 30. Digite novamente\n");
flag = 1;
}
}
else{
if (dia < 1 || dia > 31 && mes != 2){
printf("Dia invalido, mes vai ate 31. Digite novamente\n");
flag = 1;
}
}
}
}
while (flag == 1);
dad_usuario->dta_nascimento.mes = mes;
dad_usuario->dta_nascimento.dia = dia;
dad_usuario->dta_nascimento.ano = ano;
getchar(); //limpa o buffer do tecladon pois vem de um inteiro
printf("Cidade onde nasceu:");
gets(dad_usuario->cidade_nasc);
printf("Estado onde nasceu(Sigla):");
gets(dad_usuario->estado_nasc);
printf("**Endereco Residencial**\n");
printf("Rua:");
gets(dad_usuario->endereco.rua);
printf("Bairro:");
gets(dad_usuario->endereco.bairro);
printf("Cidade:");
gets(dad_usuario->endereco.cidade);
printf("Estado (Sigla):");
gets(dad_usuario->endereco.estado);
printf("**Endereco Comercial**\n");
printf("Rua:");
gets(dad_usuario->endereco.rua_endereco);
printf("Bairro:");
gets(dad_usuario->endereco.bairro_endereco);
printf("Cidade:");
gets(dad_usuario->endereco.cidade_endereco);
printf("Estado (Sigla):");
gets(dad_usuario->endereco.estado_endereco);
printf("Telefone Fixo:");
scanf("%i",&dad_usuario->fixo);
printf("Telefone Celular:");
scanf("%i",&dad_usuario->celular);
printf("\n");


}
/*======================= Funcao de Localizar Usuario ============================*/
int localizar_usuario(nome nome_usuario, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO])
{
int i;
for(i = 0; i < qtd; i++){ if(strcmp(nome_usuario, usua[i].nome_pessoa)== 0){ return i; } } return -1; } /*======================= Funcao de Listar Usuarios ============================*/ void listar_usuarios(struct dados_pessoa *novo_usuario) { int i; printf("Codigo do Usuario: %d\n",novo_usuario->codigo);
printf("Nome do Usuario: %s\n",novo_usuario->nome_pessoa);
printf("Dia de nascimento: %i\n",novo_usuario->dta_nascimento.dia);
printf("Mes de nascimento: %i\n",novo_usuario->dta_nascimento.mes);
printf("Ano de nascimento: %i\n",novo_usuario->dta_nascimento.ano);
printf("Cidade onde nasceu: %s\n",novo_usuario->cidade_nasc);
printf("Estado onde nasceu: %s\n",novo_usuario->estado_nasc);
printf("**Endereco Residencial**\n\n");
printf("Rua residencial: %s\n",novo_usuario->endereco.rua);
printf("Bairro residencial: %s\n",novo_usuario->endereco.bairro);
printf("Cidade residencial: %s\n",novo_usuario->endereco.cidade);
printf("Estado residencial: %s\n",novo_usuario->endereco.estado);
printf("**Endereco Comercial**\n\n");
printf("Rua Comercial: %s\n",novo_usuario->endereco.rua_endereco);
printf("Bairro Comercial: %s\n",novo_usuario->endereco.bairro_endereco);
printf("Cidade Comercial: %s\n",novo_usuario->endereco.cidade_endereco);
printf("Estado Comercial: %s\n\n",novo_usuario->endereco.estado_endereco);
printf("Telefone Fixo: %i\n",novo_usuario->fixo);
printf("Telefone Celular: %i\n",novo_usuario->celular);
printf("Os acervos emprestado(s) \n");
if(novo_usuario->qtd_emprestimo >= 0){
for(i = 0; i < novo_usuario->qtd_emprestimo; i++){ //laço de repetição
if(novo_usuario->emprestimo[i] > 0){
printf("O codigo da obra eh %i\n",novo_usuario->emprestimo[i]);
}
}
}
printf("\n\n");

}
/*======================= Funcao de Excluir Usuario ============================*/
void alterar_usuario(struct dados_pessoa *dados, int pos)
{
int tel_fixo,tel_cel,data_dia,data_mes,data_ano; // variaveis locais
char confirma,local_cid[50],local_est[50],end_rua[50],end_bairr[50],end_cid[50],end_est[50],endc_rua[50];
char nome_alter[50],endc_bairr[50],endc_cid[50],endc_est[50];

printf("Nome: \n");
gets(nome_alter);
maiusculas(nome_alter);
do{
printf("Dia de nascimento:");
scanf("%i",&data_dia);
}while(data_dia < 1 || data_dia > 31);
do{
printf("Mes de nascimento:");
scanf("%i",&data_mes);
}while(data_mes < 1 || data_mes > 12);
do{
printf("Ano de nascimento:");
scanf("%i",&data_ano);
}while(data_ano < 1900 || data_ano > 2011);
getchar();
printf("Cidade onde nasceu:");
gets(local_cid);
maiusculas(local_cid);
printf("Estado onde nasceu (Sigla):");
gets(local_est);
maiusculas(local_est);
printf("**Endereco Residencial**\n\n");
printf("Rua:");
gets(end_rua);
maiusculas(end_rua);
printf("Bairro:");
gets(end_bairr);
maiusculas(end_bairr);
printf("Cidade:");
gets(end_cid);
maiusculas(end_cid);
printf("Estado (Sigla):");
gets(end_est);
maiusculas(end_est);
printf("**Endereco Comercial**\n\n");
printf("Rua:");
gets(endc_rua);
maiusculas(endc_rua);
printf("Bairro:");
gets(endc_bairr);
maiusculas(endc_bairr);
printf("Cidade:");
gets(endc_cid);
maiusculas(endc_cid);
printf("Estado (Sigla):");
gets(endc_est);
maiusculas(endc_est);
printf("\n\n");
printf("Telefone fixo:");
scanf("%i",&tel_fixo);
printf("Telefone celular:");
scanf("%i",&tel_cel);
getchar();

printf("Confirmar os dados acima (s/n):\n");
scanf("%c",&confirma);
if(confirma == 'S'|| confirma == 's'){
strcpy(dados->nome_pessoa, nome_alter); //copia o nome alterado para a variavel nome_pessoa
dados->dta_nascimento.dia = data_dia; // nova data_dia é atribuido para dta_nascimento.dia
dados->dta_nascimento.mes = data_mes;
dados->dta_nascimento.ano = data_ano;
strcpy(dados->cidade_nasc, local_cid);
strcpy(dados->estado_nasc, local_est);
strcpy(dados->endereco.rua, end_rua);
strcpy(dados->endereco.bairro, end_bairr);
strcpy(dados->endereco.cidade, end_cid);
strcpy(dados->endereco.estado, end_est);
strcpy(dados->endereco.rua_endereco, endc_rua);
strcpy(dados->endereco.bairro_endereco, endc_bairr);
strcpy(dados->endereco.cidade_endereco, endc_cid);
strcpy(dados->endereco.estado_endereco, endc_est);
dados->fixo = tel_fixo;
dados->celular = tel_cel;
}
printf("Dados Alterados com sucesso \n\n");
}

int excluir_usuario(int pos, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO])
{ int aux;
aux = usua[pos].codigo;
usua[pos] = usua[qtd -1];
usua[pos].codigo = aux;
return qtd -1;
}
/*======================= Funcao de Inserir no Acervo ============================*/
void inserir_no_acervo(struct dados_biblioteca *dad_acervo)
{

getchar();
printf("Digite o titulo da obra\n");
gets(dad_acervo->nome_do_acervo.titulo);
maiusculas(dad_acervo->nome_do_acervo.titulo);
do{
printf("Digite o tipo da obra de 1 a 6 \n\n");
printf("1.Livro \n");
printf("2.Revista \n");
printf("3.Jornal \n");
printf("4.CD \n");
printf("5.DVD \n");
printf("6.Outros \n");
scanf("%i",&dad_acervo->nome_do_acervo.tipo_arquivo);
}while(dad_acervo->nome_do_acervo.tipo_arquivo >= 7);
getchar();
printf("Digite o nome da Editora do Acervo \n");
gets(dad_acervo->nome_do_acervo.editora);
maiusculas(dad_acervo->nome_do_acervo.editora);
printf("Digite o ano de publicacao do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.ano_publicacao);
getchar();
printf("Digite o local de publicacao \n");
gets(dad_acervo->nome_do_acervo.local);
maiusculas(dad_acervo->nome_do_acervo.local);
printf("Digite o(s) autor(es) do Acervo \n");
gets(dad_acervo->nome_do_acervo.autor);
maiusculas(dad_acervo->nome_do_acervo.autor);
printf("Digite o ISBN do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.isbn_isbn);
printf("Digite o volume do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.volume);
printf("Digite a quantidade a ser cadastrada \n");
scanf("%i",&dad_acervo->nome_do_acervo.qtd_exemplares);

printf("\n\n");

}
/*======================= Funcao de Listar Acervo ============================*/
void listar_acervo(struct dados_biblioteca *listar)
{
printf("O codigo no Acervo eh %i\n",listar->codigo);
printf("O titulo da obra eh %s\n",listar->nome_do_acervo.titulo);
if(listar->nome_do_acervo.tipo_arquivo == 1){
printf("O tipo: Livro\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 2){
printf("O tipo: Revista\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 3){
printf("O tipo: Jornal\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 4){
printf("O tipo: CD\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 5){
printf("O tipo: DVD\n");
}else{
printf("O tipo da obra eh outro Tipo de Acervo\n");
}
}
}
}
}
printf("A editora do acervo eh %s \n",listar->nome_do_acervo.editora);
printf("O ano de publicacao do acervo eh %i \n",listar->nome_do_acervo.ano_publicacao);
printf("O local de publicacao eh %s\n",listar->nome_do_acervo.local);
printf("O(s) autor(es) eh %s \n",listar->nome_do_acervo.autor);
printf("O ISBN do acervo eh %i\n",listar->nome_do_acervo.isbn_isbn);
printf("O volume do acervo eh %i \n",listar->nome_do_acervo.volume);
printf("A quantidade de exemplares eh %i\n",listar->nome_do_acervo.qtd_exemplares);
printf("\n\n");

}
/*======================= Funcao de Pesquisar Acervo por Nome ============================*/
int pesquisar_acervo(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO])
{
int i;
for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.titulo) == 0) { return i; } } return -1; } /*======================= Funcao de Pesquisar Acervo Autor ============================*/ int pesquisar_acervo_autor(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int i; for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.autor) == 0){ return i; } } return -1; } /*======================= Funcao de Pesquisar Acervo Editora ============================*/ int pesquisar_acervo_editora(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int i; for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.editora) == 0){ return i; } } return -1; } /*======================= Funcao de Excluir Item do Acervo =======================*/ int excluir_acervo(int pos, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int aux; aux = acerv[pos].codigo; acerv[pos] = acerv[qtd -1]; acerv[pos].codigo = aux; return qtd -1; } void alterar_acervo(struct dados_biblioteca *dad_acer) { char confirma,nome_titulo[50],nome_editora[50],nome_local[50],nome_autores[50]; // variaveis locais int novo_ano, novo_tipo, novo_isbn, novo_vol, novo_qtd; printf("\n"); do{ printf("Digite o tipo de Acervo \n"); printf("1.Livro \n"); printf("2.Revista \n"); printf("3.Jornal \n"); printf("4.CD \n"); printf("5.DVD \n"); printf("6.Outros \n"); scanf("%i",&novo_tipo); }while(novo_tipo < 1 || novo_tipo > 6);
getchar();
printf("Titulo da obra:");
gets(nome_titulo);
printf("Editora:");
gets(nome_editora);
printf("Ano de publicacao:");
scanf("%i",&novo_ano);
getchar();
printf("Local:");
gets(nome_local);
printf("Autores:");
gets(nome_autores);
printf("ISBN:");
scanf("%i",&novo_isbn);
printf("Volume:");
scanf("%i",&novo_vol);
printf("Quantidade de exemplares:");
scanf("%i",&novo_qtd);
getchar();
printf("Confirma os dados acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
dad_acer->nome_do_acervo.tipo_arquivo = novo_tipo; //novo tipo é atribuido para a variavel nome_do_acervo.tipo_arquivo
strcpy(dad_acer->nome_do_acervo.titulo, nome_titulo);
strcpy(dad_acer->nome_do_acervo.editora, nome_editora);
dad_acer->nome_do_acervo.ano_publicacao = novo_ano;
strcpy(dad_acer->nome_do_acervo.local, nome_local);
strcpy(dad_acer->nome_do_acervo.autor, nome_autores);
dad_acer->nome_do_acervo.isbn_isbn = novo_isbn;
dad_acer->nome_do_acervo.volume = novo_vol;
dad_acer->nome_do_acervo.qtd_exemplares = novo_qtd;
}
}
void locacaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer)
{
char nome_pesquisa[50], nome_pessoa[50];
int pos_usu, pos_acer;
data diadehoje;
data prevista;
char confirma;
int i;
getchar();
printf("Digite o nome do usuario \n");
gets(nome_pessoa);
maiusculas(nome_pessoa);
pos_usu = localizar_usuario(nome_pessoa, qtd_usu, dad_usu);
if(pos_usu >= 0){
listar_usuarios(&dad_usu[pos_usu]);
if(dad_usu[pos_usu].qtd_emprestimo < TOTAL_EMPRESTIMO){ printf("Digite o nome do acervo a ser emprestado \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); pos_acer = pesquisar_acervo(nome_pesquisa, qtd_acer, dad_acer); for(i = 0; i < dad_usu[pos_usu].qtd_emprestimo; i++){ if(dad_acer[pos_acer].codigo == dad_usu[pos_usu].emprestimo[i]){ pos_acer = -1; printf("o acervo acima ja esta emprestado para o usuario\n\n"); } } if(pos_acer >= 0){
listar_acervo(&dad_acer[pos_acer]);

printf("Confirma o emprestimo acima ao usuario (s/n) \n");
scanf("%c",&confirma);

if((confirma == 'S' || confirma == 's')&&(dad_acer[pos_acer].nome_do_acervo.qtd_exemplares) > 0){

//Coloca a data do emprestimo atual !!!!
diadehoje = data_atual();
dad_usu[pos_usu].diadehoje = diadehoje;
printf("Data Atual \n\n");
printf("Dia......: %d\n", diadehoje.dia);
printf("Mes......: %d\n", diadehoje.mes);
printf("Ano......: %d\n\n", diadehoje.ano);

printf("Data de previsao para a devolucao \n\n");
prevista = data_prevista_devolucao(diadehoje);
dad_usu[pos_usu].previsaodevolucao = prevista;
printf("Dia......: %d\n", prevista.dia);
printf("Mes......: %d\n", prevista.mes);
printf("Ano......: %d\n", prevista.ano);

//Faz o emprestimo para o usuario

dad_acer[pos_acer].emprestado = dad_usu[pos_usu].codigo;
dad_usu[pos_usu].emprestimo[dad_usu[pos_usu].qtd_emprestimo] = dad_acer[pos_acer].codigo;
dad_usu[pos_usu].qtd_emprestimo++;
dad_acer[pos_acer].nome_do_acervo.qtd_exemplares--;

//Pegar o acervo e colocar em pendente

dad_acer[pos_acer].pendente = dad_acer[pos_acer].codigo;

printf("Acervo emprestado com sucesso \n\n");
printf("Quantidade de acervo pendete %i\n",dad_acer[pos_acer].contador);

}else{
printf("Nao foi possivel emprestar o acervo \n");
}
}
}else{
printf("Limite maximo de emprestimo no acervo por usuario maior que o estabelecido \n");
}
}
}

void devolucaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer)
{
char nome_pesquisa[50], nome_pessoa[50];
int pos_usu, pos_acer, flag = 0, d,m,a;
char confirma;
int i;
getchar();
printf("Informe a data da devolucao \n\n");
do{
printf("Dia:\n");
scanf("%i",&d);
}while(d < 1 || d > 31);
do{
printf("Mes:\n");
scanf("%i",&m);
}while(m < 1 || m > 12);
do{
printf("Ano:\n");
scanf("%i",&a);
}while(a < 2011); getchar(); printf("Digite o nome do usuario \n"); gets(nome_pessoa); maiusculas(nome_pessoa); pos_usu = localizar_usuario(nome_pessoa, qtd_usu, dad_usu); if(pos_usu >= 0){
listar_usuarios(&dad_usu[pos_usu]);
printf("\n");
if(dad_usu[pos_usu].qtd_emprestimo > 0){
printf("Digite o nome do acervo a ser devolvido \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
pos_acer = pesquisar_acervo(nome_pesquisa, qtd_acer, dad_acer);
if(pos_acer >= 0){
listar_acervo(&dad_acer[pos_acer]);
printf("Confirmar a devolucao do acervo acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
dad_acer[pos_acer].emprestado = 0;
for(i = 0; i < dad_usu[pos_usu].qtd_emprestimo; i++){ if(dad_acer[pos_acer].codigo == dad_usu[pos_usu].emprestimo[i]){ dad_usu[pos_usu].emprestimo[i] = dad_usu[pos_usu -1].emprestimo[i]; dad_acer[pos_acer].nome_do_acervo.qtd_exemplares++; flag = 1; printf("Dia previsto para a devolucao \n\n"); printf("Dia......: %d\n", dad_usu[pos_usu].previsaodevolucao.dia); printf("Mes......: %d\n", dad_usu[pos_usu].previsaodevolucao.mes); printf("Ano......: %d\n", dad_usu[pos_usu].previsaodevolucao.ano); a = a - dad_usu[pos_usu].previsaodevolucao.ano; m = m - dad_usu[pos_usu].previsaodevolucao.mes; d = d - dad_usu[pos_usu].previsaodevolucao.dia; //Devolvendo o acervo pendete dad_acer[pos_acer].pendente = -1; if(a > dad_usu[pos_usu].previsaodevolucao.ano){
printf("Acervo atrasado para a entrega em ano\n");

}
if(m > 0){
printf("Acervo atrasado para a entrega em mes\n");
}
if(d > 0){
printf("Acervo atrasado para a entrega em dia\n");
}
printf("Acervo devolvido com sucesso \n");
}

}

}else{
printf("O acervo nao pode ser devolvido \n");
}
if(flag == 0){
printf("O acervo digitado acima nao esta emprestado ao usuario, nao foi possivel devolver !!! \n\n");
}
}else{
printf("Acervo nao encontrado para a devolucao \n");}
}else{
printf("O usuario acima nao possui emprestimos na biblioteca \n\n");
}
}else{
printf("O usuario %s nao esta cadastrado \n",nome_pessoa);
}
}

void listar_acervo_pendete(struct dados_biblioteca bibli[TAMANHO_ACERVO], int qtd)
{
int i;
for(i = 0; i < qtd;i++) { if(bibli[i].codigo == bibli[i].pendente){ if(bibli[i].pendente > 0){
printf("O codigo %i tem item pendente ao Acervo \n\n",bibli[i].codigo);
}
}
}
}

data data_atual()
{
struct tm *data_sistema; // struct tm esta em time.h
time_t t;
data datadiadehoje;


t = time(NULL); // Retorno a hora do sistema
data_sistema = localtime(&t); // Recupera a data atual do sistema

datadiadehoje.dia = data_sistema->tm_mday;
datadiadehoje.mes = data_sistema->tm_mon+1;
datadiadehoje.ano = data_sistema->tm_year+1900;

return datadiadehoje;
}
data data_prevista_devolucao(data data_a)
{
data prevista = data_a;

if (data_a.mes == 1 ||
data_a.mes == 3 ||
data_a.mes == 5 ||
data_a.mes == 7 ||
data_a.mes == 8 ||
data_a.mes == 10 ||
data_a.mes == 12) {

if (data_a.dia + DIAS_EMPRESTIMO > 31) {
prevista.dia = (data_a.dia + DIAS_EMPRESTIMO) - 31;
if (data_a.mes + 1 > 12) {
prevista.ano = data_a.ano + 1;
prevista.mes = 1;
}
else {
prevista.mes = data_a.mes + 1;
}
}
else {
prevista.dia = data_a.dia + DIAS_EMPRESTIMO;
}
} else if (data_a.mes == 4 ||
data_a.mes == 6 ||
data_a.mes == 9 ||
data_a.mes == 11) {
if (data_a.dia + DIAS_EMPRESTIMO > 30) {
prevista.dia = (data_a.dia + DIAS_EMPRESTIMO) - 30;
prevista.mes = data_a.mes + 1;
}
else {
prevista.dia = data_a.dia + DIAS_EMPRESTIMO;
}
}
else {
if (prevista.ano % 4 == 0) {
if (prevista.dia + DIAS_EMPRESTIMO > 29) {
prevista.dia = (prevista.dia + DIAS_EMPRESTIMO) - 29;
prevista.mes += 1;
}
else {
prevista.dia += DIAS_EMPRESTIMO;
}
}
else {
if (prevista.dia + DIAS_EMPRESTIMO > 28) {
prevista.dia = (prevista.dia + DIAS_EMPRESTIMO) - 28;
prevista.mes += 1;
}
else {
prevista.dia += DIAS_EMPRESTIMO;
}
}
}

return prevista;
}
/*
Universidade Federal de Santa Catarina

Prof: Anderson Luiz Perez

Trabalho para Controle de acervos e emprestimos de biblioteca

Desenvolvido por: Joildo Schueroff e Silvana Pires da Silva

Trabalho de Programação I

*/
#include // inclusao da biblioteca stdio.h
#include // inclusao da biblioteca string.h
#include //inclusao da biblioteca time.h

#define TAMANHO_USUARIO 5 // define o tamanho do usuario em 5
#define TAMANHO_ACERVO 5 // define o tamanho do acervo em 5
#define TOTAL_EMPRESTIMO 4 // define o total de emprestimo em 4
#define DIAS_EMPRESTIMO 7 //define os dias de emprestimos em 7

/*
Criação de novos tipos de dados
*/

typedef char nome[50];
typedef char local_nascimento[50];
typedef char endereco[50];
typedef char nome_acervo[50];

typedef struct{
int dia, mes, ano;
}data;
struct nome_acervo{
nome_acervo titulo, editora, local, autor;
int tipo_arquivo, isbn_isbn, codigo, ano_publicacao, qtd_exemplares, volume;

};
struct endereco{
endereco rua, bairro, cidade, estado, rua_endereco, bairro_endereco, cidade_endereco,
estado_endereco;
};

struct dados_pessoa{
int codigo;
nome nome_pessoa;
data dta_nascimento;
local_nascimento cidade_nasc, estado_nasc;
struct endereco endereco;
int celular, fixo;
int qtd_emprestimo;
int emprestimo[TOTAL_EMPRESTIMO];
data diadehoje;
data previsaodevolucao;

};

struct dados_biblioteca{
struct nome_acervo nome_do_acervo;
int codigo;
int aux_emprestimo;
int emprestado;
int pendente;
int contador;
};
//Prototipo das funcoes auxiliares

int menu_biblioteca();

void inserir_usuario(struct dados_pessoa *dad_usuario);
int localizar_usuario(nome nome_usuario, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO]);
void alterar_usuario(struct dados_pessoa *dados, int pos);
void listar_usuarios(struct dados_pessoa *novo_usuario);
int excluir_usuario(int pos, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO]);

void inserir_no_acervo(struct dados_biblioteca *dad_acervo);
void listar_acervo(struct dados_biblioteca *listar);
void alterar_acervo(struct dados_biblioteca *dad_acer);
int pesquisar_acervo(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int pesquisar_acervo_autor(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int pesquisar_acervo_editora(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int excluir_acervo(int pos, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
void locacaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer);
void devolucaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer);
void listar_acervo_pendete(struct dados_biblioteca bibli[TAMANHO_ACERVO], int qtd);
void maiusculas(nome str);

data data_atual();
data data_prevista_devolucao(data data_a);

/*============================== Função Principal=========================================*/
int main()
{
int opc, d_usu; // Variaveis Locais
struct dados_pessoa dad_usuario[TAMANHO_USUARIO];
int opcao_usuario, qtd_usuario = 0, posicao, i, pesquisa_codigo, pesquisa_numero;
int telefone_fixo, telefone_celular;
nome nome_pessoa, nome_pesquisa;
char confirma;
//======================
struct dados_biblioteca dad_acervo[TAMANHO_ACERVO];
int opcao_acervo, qtd_acervo = 0, localiza;
data diadehoje;
data devolucao;



do{
opc = menu_biblioteca(); // opc recebe a função menu biblioteca

switch(opc)
{
case 1: printf("Dados Usuários \n\n");
do{
printf("1.Cadastro de Usuario \n");
printf("2.Pesquisa de Usuario \n");
printf("3.Listar todos os Usuarios Cadastrados\n");
printf("4.Alteracao de dados do cadastro \n");
printf("5.Emprestimos do Usuario \n");
printf("6.Devolucao do Usuario \n");
printf("7.Exclusao de Usuario \n");
printf("8.Voltar ao Menu Anterior\n");
scanf("%i",&opcao_usuario);
switch(opcao_usuario) {
case 1:printf("CADASTRO DE UM USUARIO \n\n");
if(qtd_usuario < TAMANHO_USUARIO){ // condicao para cadastrar inserir_usuario(&dad_usuario[qtd_usuario]); qtd_usuario++; dad_usuario[qtd_usuario -1].codigo = qtd_usuario; }else{ printf("Nao foi possivel cadastrar o usuario \n"); } break; case 2: printf("PESQUISA USUARIO \n\n"); int pesquisa; printf("Selecione o modo de pesquisa \n\n"); printf("1.Por Codigo \n"); printf("2.Por Nome \n"); printf("3.Por telefone \n"); scanf("%i",&pesquisa); getchar(); if(pesquisa == 1){ // pesquisa por codigo printf("Digite o codigo do usuario a ser pesquisado \n"); scanf("%i",&pesquisa_codigo); for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].codigo == pesquisa_codigo){ listar_usuarios(&dad_usuario[i]); } } } if(pesquisa == 2){ //pesquisa por nome printf("Digite o nome do usuario a ser pesquisado \n"); gets(nome_pessoa); maiusculas(nome_pessoa); posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario); if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
}else{
printf("O usuario %s não esta cadastrado \n",nome_pessoa);
}
}
if(pesquisa == 3){ //pesquisa por telefone
do{
printf("Digite o tipo de telefone \n");
printf("1.Telefone Fixo \n");
printf("2.Telefone Celular \n");
printf("3.Sair da Procura \n");
scanf("%i",&pesquisa_numero);
switch(pesquisa_numero){
case 1: printf("Digite o numero do telefone fixo \n");
scanf("%i",&telefone_fixo);
for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].fixo == telefone_fixo){ listar_usuarios(&dad_usuario[i]); } } break; case 2: printf("Digite o numero do telefone celular \n"); scanf("%i",&telefone_celular); for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].celular == telefone_celular){ listar_usuarios(&dad_usuario[i]); } } break; case 3: printf("Voltando ao menu principal \n\n"); break; default:printf("Opcao Invalida \n"); } }while(pesquisa_numero != 3); } break; case 3: printf("LISTAGEM DE USUARIOS CADASTRADOS\n\n"); for(i = 0; i < qtd_usuario; i++){ listar_usuarios(&dad_usuario[i]); } break; case 4: printf("ALTERACAO DE DADOS CADASTRAIS DOS USUARIOS \n\n"); getchar(); printf("Digite o nome do usuario a ser Alterado \n"); gets(nome_pessoa); maiusculas(nome_pessoa); posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario); if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
alterar_usuario(dad_usuario, posicao);

}else{
printf("O usuario %s nao esta cadastrado(a) \n\n",nome_pessoa);
}

break;
/*Emprestimo ao Usuario */
case 5: printf("EMPRESTIMOS NO ACERVO PARA O USUARIO \n\n");

locacaodeacervo(dad_usuario, dad_acervo, qtd_usuario, qtd_acervo);

break;
case 6: printf("DEVOLUCAO DE ACERVO DO USUARIO\n\n");
devolucaodeacervo(dad_usuario, dad_acervo, qtd_usuario, qtd_acervo);
break;
case 7: printf("EXCLUIR USUARIO \n\n");
getchar();
printf("Digite o nome do Usuario para ser excluido \n");
gets(nome_pessoa);
maiusculas(nome_pessoa);
posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario);
if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
printf("Deseja excluir o Usuario Acima (s/n)\n");
scanf("%c",&confirma);

if((confirma == 'S'|| confirma == 's') && (dad_usuario[posicao].qtd_emprestimo == 0)){
qtd_usuario = excluir_usuario(posicao, qtd_usuario, dad_usuario);
printf("Usuario excluido com sucesso \n\n");

}else{
printf("Nao foi possivel excluir usuario, letra errada ou pendente Acervo \n\n");}
}else{
printf("O usuario %s nao esta cadastrado(a) \n\n",nome_pessoa);
}

break;
case 8: printf("\n\n");
break;

default:printf("OPCAO INVALIDA, TENTE NOVAMENTE \n\n");
}
}while(opcao_usuario != 8);
break;
case 2: printf("Dados do Acervo \n\n");
do{
printf("1.Cadastro no Acervo \n");
printf("2.Pesquisa no Acervo \n");
printf("3.Listar todos os Itens Cadastrados\n");
printf("4.Alteracao de dados no Acervo \n");
printf("5.Exclusao de Acervo\n");
printf("6.Listar todos os emprestimos por mes \n");
printf("7.Listar emprestimos pendentes de devolução \n");
printf("8.Voltar ao Menu Anterior\n");
scanf("%i",&opcao_acervo);
switch(opcao_acervo){
case 1: printf("**CADASTRO DE ITENS NO ACERVO**\n\n");
if(qtd_acervo < TAMANHO_ACERVO){ //condicao para cadastrar inserir_no_acervo(&dad_acervo[qtd_acervo]); qtd_acervo++; dad_acervo[qtd_acervo -1].codigo = qtd_acervo; }else{ printf("Não foi possivel cadastrar o item no acervo \n"); } break; case 2: printf("***PESQUISAR DADOS NO ACERVO ***\n\n"); int pesquisa; printf("Selecione o modo de pesquisa \n\n"); printf("1.Por Codigo \n"); printf("2.Por Nome (titulo) \n"); printf("3.Por Autor \n"); printf("4.Por Editora \n"); printf("5.Por Tipo \n"); scanf("%i",&pesquisa); getchar(); if(pesquisa == 1){ printf("Digite o codigo do acervo a ser pesquisado \n"); scanf("%i",&pesquisa_codigo); for(i = 0; i < qtd_acervo; i++){ if(pesquisa_codigo == dad_acervo[i].codigo){ listar_acervo(&dad_acervo[i]); } } } if(pesquisa == 2){ printf("Digite do titulo do acervo \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo); if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 3){
printf("Digite o nome do autor da obra \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo_autor(nome_pesquisa, qtd_acervo, dad_acervo);
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 4){
printf("Digite o nome da editora do acervo \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo_editora(nome_pesquisa, qtd_acervo, dad_acervo);
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 5){
do{
printf("Digite o tipo de Acervo \n");
printf("1.Livro \n");
printf("2.Revista \n");
printf("3.Jornal \n");
printf("4.CD \n");
printf("5.DVD \n");
printf("6.Outros \n");
printf("7.Sai da Pesquisa por tipo \n");
scanf("%i",&pesquisa_codigo);
for(i = 0; i < qtd_acervo; i++){ if(pesquisa_codigo == dad_acervo[i].nome_do_acervo.tipo_arquivo){ listar_acervo(&dad_acervo[i]); } } }while(pesquisa_codigo != 7); } break; case 3: printf("***LISTAR TODOS OS DADOS CADASTRADOS NO ACERVO ***\n\n"); for(i = 0; i < qtd_acervo; i++){ listar_acervo(&dad_acervo[i]); } break; case 4: printf("**ALTERAÇÃO DE DADOS NO ACERVO**\n\n"); getchar(); printf("Digite o nome a ser alterado \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo); printf("\n"); if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
alterar_acervo(&dad_acervo[localiza]);

}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
break;

case 5: printf("** EXCLUSAO DE OBRA DO ACERVO **\n\n");
getchar();
printf("Digite o nome a ser excluido \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo);
printf("\n");
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
if(dad_acervo[localiza].aux_emprestimo == dad_acervo[localiza].nome_do_acervo.qtd_exemplares){
printf("Deseja excluir a obra acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
qtd_acervo = excluir_acervo(localiza, qtd_acervo, dad_acervo);
printf("O acervo acima foi excluido com sucesso \n\n");
}
}else{
printf("Nao foi possivel excluir o acervo devido estar emprestado ao usuario \n\n");
}
}else{
printf("Acervo nao encontrado \n\n") ;
}
break;
case 6: printf(" LISTAR TODOS OS EMPRESTIMOS POR MES\n\n");
int mes_lista;
data data_teste;
printf("Digite o mes que deseja listar os emprestimos \n");
scanf("%i",&mes_lista);
for(i = 0; i < qtd_usuario; i++){ if(mes_lista == dad_usuario[i].diadehoje.mes){ listar_usuarios(&dad_usuario[i]); } } break; case 7: printf("LISTAR EMPRESTIMOS PENDENTES DE DEVOLUCAO\n\n"); listar_acervo_pendete(dad_acervo,qtd_acervo); break; case 8: printf("\n\n"); break; default:printf("OPCAO INVALIDA, TENTE NOVAMENTE \n\n"); } }while(opcao_acervo != 8); break; case 3: printf("Sair do Sistema Biblioteca \n\n Saindo !!!\n"); break; default:printf("Opcao Invalida, Tente Novamente \n"); } }while(opc != 3); return 0; } /*============================== Menu da Biblioteca ============================*/ int menu_biblioteca() { int opcao; printf("Sistema Biblioteca \n\n"); printf("1. Dados Usuarios Biblioteca \n"); printf("2. Dados do Acervo da Biblioteca \n"); printf("3. Sair do Sistema \n"); scanf("%i",&opcao); return opcao; } /*======================= Funcao para converter maiusculas =====================*/ void maiusculas(nome str) { int i; for (i = 0; i < strlen(str); i++) str[i] = toupper(str[i]); } /*======================= Funcao de Inserir Usuario ============================*/ void inserir_usuario(struct dados_pessoa *dad_usuario) { int aux, dia, mes, ano, flag; // variaveis locais getchar(); // limpa o buffer do teclado pois vem de um leitura de inteiro printf("Nome completo: "); gets(dad_usuario->nome_pessoa);

maiusculas(dad_usuario->nome_pessoa);

printf ("\nData de nascimento\nAno: ");
scanf ("%d",&ano);

do{
printf ("Mes: ");
scanf ("%d",&mes);
if (mes < 1 || mes > 12)
printf ("Mes invalido, digite corretamente.\n");
}
while (mes <1 || mes >12);
do {
flag = 0;
do {
printf ("Dia: ");
scanf ("%d",&dia);
}while(dia < 1 || dia > 31);
if (mes == 2){
if ( ano % 400 == 0 || ano % 4 == 0 && ano % 100 == 0){
if ( dia > 29){
printf ("dia invalido, ano bissexto. Digite novamente.\n");
flag = 1;
}
}
else {
if (dia > 28) {
printf ("dia invalido, mes ate 28. Digite novamente.\n");
flag = 1;
}
}
}
else{
if (mes == 4 || mes == 6 || mes == 9 || mes == 11){
if (dia > 30){
printf("Dia invalido, mes de 1 ate 30. Digite novamente\n");
flag = 1;
}
}
else{
if (dia < 1 || dia > 31 && mes != 2){
printf("Dia invalido, mes vai ate 31. Digite novamente\n");
flag = 1;
}
}
}
}
while (flag == 1);
dad_usuario->dta_nascimento.mes = mes;
dad_usuario->dta_nascimento.dia = dia;
dad_usuario->dta_nascimento.ano = ano;
getchar(); //limpa o buffer do tecladon pois vem de um inteiro
printf("Cidade onde nasceu:");
gets(dad_usuario->cidade_nasc);
printf("Estado onde nasceu(Sigla):");
gets(dad_usuario->estado_nasc);
printf("**Endereco Residencial**\n");
printf("Rua:");
gets(dad_usuario->endereco.rua);
printf("Bairro:");
gets(dad_usuario->endereco.bairro);
printf("Cidade:");
gets(dad_usuario->endereco.cidade);
printf("Estado (Sigla):");
gets(dad_usuario->endereco.estado);
printf("**Endereco Comercial**\n");
printf("Rua:");
gets(dad_usuario->endereco.rua_endereco);
printf("Bairro:");
gets(dad_usuario->endereco.bairro_endereco);
printf("Cidade:");
gets(dad_usuario->endereco.cidade_endereco);
printf("Estado (Sigla):");
gets(dad_usuario->endereco.estado_endereco);
printf("Telefone Fixo:");
scanf("%i",&dad_usuario->fixo);
printf("Telefone Celular:");
scanf("%i",&dad_usuario->celular);
printf("\n");


}
/*======================= Funcao de Localizar Usuario ============================*/
int localizar_usuario(nome nome_usuario, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO])
{
int i;
for(i = 0; i < qtd; i++){ if(strcmp(nome_usuario, usua[i].nome_pessoa)== 0){ return i; } } return -1; } /*======================= Funcao de Listar Usuarios ============================*/ void listar_usuarios(struct dados_pessoa *novo_usuario) { int i; printf("Codigo do Usuario: %d\n",novo_usuario->codigo);
printf("Nome do Usuario: %s\n",novo_usuario->nome_pessoa);
printf("Dia de nascimento: %i\n",novo_usuario->dta_nascimento.dia);
printf("Mes de nascimento: %i\n",novo_usuario->dta_nascimento.mes);
printf("Ano de nascimento: %i\n",novo_usuario->dta_nascimento.ano);
printf("Cidade onde nasceu: %s\n",novo_usuario->cidade_nasc);
printf("Estado onde nasceu: %s\n",novo_usuario->estado_nasc);
printf("**Endereco Residencial**\n\n");
printf("Rua residencial: %s\n",novo_usuario->endereco.rua);
printf("Bairro residencial: %s\n",novo_usuario->endereco.bairro);
printf("Cidade residencial: %s\n",novo_usuario->endereco.cidade);
printf("Estado residencial: %s\n",novo_usuario->endereco.estado);
printf("**Endereco Comercial**\n\n");
printf("Rua Comercial: %s\n",novo_usuario->endereco.rua_endereco);
printf("Bairro Comercial: %s\n",novo_usuario->endereco.bairro_endereco);
printf("Cidade Comercial: %s\n",novo_usuario->endereco.cidade_endereco);
printf("Estado Comercial: %s\n\n",novo_usuario->endereco.estado_endereco);
printf("Telefone Fixo: %i\n",novo_usuario->fixo);
printf("Telefone Celular: %i\n",novo_usuario->celular);
printf("Os acervos emprestado(s) \n");
if(novo_usuario->qtd_emprestimo >= 0){
for(i = 0; i < novo_usuario->qtd_emprestimo; i++){ //laço de repetição
if(novo_usuario->emprestimo[i] > 0){
printf("O codigo da obra eh %i\n",novo_usuario->emprestimo[i]);
}
}
}
printf("\n\n");

}
/*======================= Funcao de Excluir Usuario ============================*/
void alterar_usuario(struct dados_pessoa *dados, int pos)
{
int tel_fixo,tel_cel,data_dia,data_mes,data_ano; // variaveis locais
char confirma,local_cid[50],local_est[50],end_rua[50],end_bairr[50],end_cid[50],end_est[50],endc_rua[50];
char nome_alter[50],endc_bairr[50],endc_cid[50],endc_est[50];

printf("Nome: \n");
gets(nome_alter);
maiusculas(nome_alter);
do{
printf("Dia de nascimento:");
scanf("%i",&data_dia);
}while(data_dia < 1 || data_dia > 31);
do{
printf("Mes de nascimento:");
scanf("%i",&data_mes);
}while(data_mes < 1 || data_mes > 12);
do{
printf("Ano de nascimento:");
scanf("%i",&data_ano);
}while(data_ano < 1900 || data_ano > 2011);
getchar();
printf("Cidade onde nasceu:");
gets(local_cid);
maiusculas(local_cid);
printf("Estado onde nasceu (Sigla):");
gets(local_est);
maiusculas(local_est);
printf("**Endereco Residencial**\n\n");
printf("Rua:");
gets(end_rua);
maiusculas(end_rua);
printf("Bairro:");
gets(end_bairr);
maiusculas(end_bairr);
printf("Cidade:");
gets(end_cid);
maiusculas(end_cid);
printf("Estado (Sigla):");
gets(end_est);
maiusculas(end_est);
printf("**Endereco Comercial**\n\n");
printf("Rua:");
gets(endc_rua);
maiusculas(endc_rua);
printf("Bairro:");
gets(endc_bairr);
maiusculas(endc_bairr);
printf("Cidade:");
gets(endc_cid);
maiusculas(endc_cid);
printf("Estado (Sigla):");
gets(endc_est);
maiusculas(endc_est);
printf("\n\n");
printf("Telefone fixo:");
scanf("%i",&tel_fixo);
printf("Telefone celular:");
scanf("%i",&tel_cel);
getchar();

printf("Confirmar os dados acima (s/n):\n");
scanf("%c",&confirma);
if(confirma == 'S'|| confirma == 's'){
strcpy(dados->nome_pessoa, nome_alter); //copia o nome alterado para a variavel nome_pessoa
dados->dta_nascimento.dia = data_dia; // nova data_dia é atribuido para dta_nascimento.dia
dados->dta_nascimento.mes = data_mes;
dados->dta_nascimento.ano = data_ano;
strcpy(dados->cidade_nasc, local_cid);
strcpy(dados->estado_nasc, local_est);
strcpy(dados->endereco.rua, end_rua);
strcpy(dados->endereco.bairro, end_bairr);
strcpy(dados->endereco.cidade, end_cid);
strcpy(dados->endereco.estado, end_est);
strcpy(dados->endereco.rua_endereco, endc_rua);
strcpy(dados->endereco.bairro_endereco, endc_bairr);
strcpy(dados->endereco.cidade_endereco, endc_cid);
strcpy(dados->endereco.estado_endereco, endc_est);
dados->fixo = tel_fixo;
dados->celular = tel_cel;
}
printf("Dados Alterados com sucesso \n\n");
}

int excluir_usuario(int pos, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO])
{ int aux;
aux = usua[pos].codigo;
usua[pos] = usua[qtd -1];
usua[pos].codigo = aux;
return qtd -1;
}
/*======================= Funcao de Inserir no Acervo ============================*/
void inserir_no_acervo(struct dados_biblioteca *dad_acervo)
{

getchar();
printf("Digite o titulo da obra\n");
gets(dad_acervo->nome_do_acervo.titulo);
maiusculas(dad_acervo->nome_do_acervo.titulo);
do{
printf("Digite o tipo da obra de 1 a 6 \n\n");
printf("1.Livro \n");
printf("2.Revista \n");
printf("3.Jornal \n");
printf("4.CD \n");
printf("5.DVD \n");
printf("6.Outros \n");
scanf("%i",&dad_acervo->nome_do_acervo.tipo_arquivo);
}while(dad_acervo->nome_do_acervo.tipo_arquivo >= 7);
getchar();
printf("Digite o nome da Editora do Acervo \n");
gets(dad_acervo->nome_do_acervo.editora);
maiusculas(dad_acervo->nome_do_acervo.editora);
printf("Digite o ano de publicacao do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.ano_publicacao);
getchar();
printf("Digite o local de publicacao \n");
gets(dad_acervo->nome_do_acervo.local);
maiusculas(dad_acervo->nome_do_acervo.local);
printf("Digite o(s) autor(es) do Acervo \n");
gets(dad_acervo->nome_do_acervo.autor);
maiusculas(dad_acervo->nome_do_acervo.autor);
printf("Digite o ISBN do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.isbn_isbn);
printf("Digite o volume do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.volume);
printf("Digite a quantidade a ser cadastrada \n");
scanf("%i",&dad_acervo->nome_do_acervo.qtd_exemplares);

printf("\n\n");

}
/*======================= Funcao de Listar Acervo ============================*/
void listar_acervo(struct dados_biblioteca *listar)
{
printf("O codigo no Acervo eh %i\n",listar->codigo);
printf("O titulo da obra eh %s\n",listar->nome_do_acervo.titulo);
if(listar->nome_do_acervo.tipo_arquivo == 1){
printf("O tipo: Livro\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 2){
printf("O tipo: Revista\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 3){
printf("O tipo: Jornal\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 4){
printf("O tipo: CD\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 5){
printf("O tipo: DVD\n");
}else{
printf("O tipo da obra eh outro Tipo de Acervo\n");
}
}
}
}
}
printf("A editora do acervo eh %s \n",listar->nome_do_acervo.editora);
printf("O ano de publicacao do acervo eh %i \n",listar->nome_do_acervo.ano_publicacao);
printf("O local de publicacao eh %s\n",listar->nome_do_acervo.local);
printf("O(s) autor(es) eh %s \n",listar->nome_do_acervo.autor);
printf("O ISBN do acervo eh %i\n",listar->nome_do_acervo.isbn_isbn);
printf("O volume do acervo eh %i \n",listar->nome_do_acervo.volume);
printf("A quantidade de exemplares eh %i\n",listar->nome_do_acervo.qtd_exemplares);
printf("\n\n");

}
/*======================= Funcao de Pesquisar Acervo por Nome ============================*/
int pesquisar_acervo(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO])
{
int i;
for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.titulo) == 0) { return i; } } return -1; } /*======================= Funcao de Pesquisar Acervo Autor ============================*/ int pesquisar_acervo_autor(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int i; for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.autor) == 0){ return i; } } return -1; } /*======================= Funcao de Pesquisar Acervo Editora ============================*/ int pesquisar_acervo_editora(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int i; for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.editora) == 0){ return i; } } return -1; } /*======================= Funcao de Excluir Item do Acervo =======================*/ int excluir_acervo(int pos, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int aux; aux = acerv[pos].codigo; acerv[pos] = acerv[qtd -1]; acerv[pos].codigo = aux; return qtd -1; } void alterar_acervo(struct dados_biblioteca *dad_acer) { char confirma,nome_titulo[50],nome_editora[50],nome_local[50],nome_autores[50]; // variaveis locais int novo_ano, novo_tipo, novo_isbn, novo_vol, novo_qtd; printf("\n"); do{ printf("Digite o tipo de Acervo \n"); printf("1.Livro \n"); printf("2.Revista \n"); printf("3.Jornal \n"); printf("4.CD \n"); printf("5.DVD \n"); printf("6.Outros \n"); scanf("%i",&novo_tipo); }while(novo_tipo < 1 || novo_tipo > 6);
getchar();
printf("Titulo da obra:");
gets(nome_titulo);
printf("Editora:");
gets(nome_editora);
printf("Ano de publicacao:");
scanf("%i",&novo_ano);
getchar();
printf("Local:");
gets(nome_local);
printf("Autores:");
gets(nome_autores);
printf("ISBN:");
scanf("%i",&novo_isbn);
printf("Volume:");
scanf("%i",&novo_vol);
printf("Quantidade de exemplares:");
scanf("%i",&novo_qtd);
getchar();
printf("Confirma os dados acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
dad_acer->nome_do_acervo.tipo_arquivo = novo_tipo; //novo tipo é atribuido para a variavel nome_do_acervo.tipo_arquivo
strcpy(dad_acer->nome_do_acervo.titulo, nome_titulo);
strcpy(dad_acer->nome_do_acervo.editora, nome_editora);
dad_acer->nome_do_acervo.ano_publicacao = novo_ano;
strcpy(dad_acer->nome_do_acervo.local, nome_local);
strcpy(dad_acer->nome_do_acervo.autor, nome_autores);
dad_acer->nome_do_acervo.isbn_isbn = novo_isbn;
dad_acer->nome_do_acervo.volume = novo_vol;
dad_acer->nome_do_acervo.qtd_exemplares = novo_qtd;
}
}
void locacaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer)
{
char nome_pesquisa[50], nome_pessoa[50];
int pos_usu, pos_acer;
data diadehoje;
data prevista;
char confirma;
int i;
getchar();
printf("Digite o nome do usuario \n");
gets(nome_pessoa);
maiusculas(nome_pessoa);
pos_usu = localizar_usuario(nome_pessoa, qtd_usu, dad_usu);
if(pos_usu >= 0){
listar_usuarios(&dad_usu[pos_usu]);
if(dad_usu[pos_usu].qtd_emprestimo < TOTAL_EMPRESTIMO){ printf("Digite o nome do acervo a ser emprestado \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); pos_acer = pesquisar_acervo(nome_pesquisa, qtd_acer, dad_acer); for(i = 0; i < dad_usu[pos_usu].qtd_emprestimo; i++){ if(dad_acer[pos_acer].codigo == dad_usu[pos_usu].emprestimo[i]){ pos_acer = -1; printf("o acervo acima ja esta emprestado para o usuario\n\n"); } } if(pos_acer >= 0){
listar_acervo(&dad_acer[pos_acer]);

printf("Confirma o emprestimo acima ao usuario (s/n) \n");
scanf("%c",&confirma);

if((confirma == 'S' || confirma == 's')&&(dad_acer[pos_acer].nome_do_acervo.qtd_exemplares) > 0){

//Coloca a data do emprestimo atual !!!!
diadehoje = data_atual();
dad_usu[pos_usu].diadehoje = diadehoje;
printf("Data Atual \n\n");
printf("Dia......: %d\n", diadehoje.dia);
printf("Mes......: %d\n", diadehoje.mes);
printf("Ano......: %d\n\n", diadehoje.ano);

printf("Data de previsao para a devolucao \n\n");
prevista = data_prevista_devolucao(diadehoje);
dad_usu[pos_usu].previsaodevolucao = prevista;
printf("Dia......: %d\n", prevista.dia);
printf("Mes......: %d\n", prevista.mes);
printf("Ano......: %d\n", prevista.ano);

//Faz o emprestimo para o usuario

dad_acer[pos_acer].emprestado = dad_usu[pos_usu].codigo;
dad_usu[pos_usu].emprestimo[dad_usu[pos_usu].qtd_emprestimo] = dad_acer[pos_acer].codigo;
dad_usu[pos_usu].qtd_emprestimo++;
dad_acer[pos_acer].nome_do_acervo.qtd_exemplares--;

//Pegar o acervo e colocar em pendente

dad_acer[pos_acer].pendente = dad_acer[pos_acer].codigo;

printf("Acervo emprestado com sucesso \n\n");
printf("Quantidade de acervo pendete %i\n",dad_acer[pos_acer].contador);

}else{
printf("Nao foi possivel emprestar o acervo \n");
}
}
}else{
printf("Limite maximo de emprestimo no acervo por usuario maior que o estabelecido \n");
}
}
}

void devolucaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer)
{
char nome_pesquisa[50], nome_pessoa[50];
int pos_usu, pos_acer, flag = 0, d,m,a;
char confirma;
int i;
getchar();
printf("Informe a data da devolucao \n\n");
do{
printf("Dia:\n");
scanf("%i",&d);
}while(d < 1 || d > 31);
do{
printf("Mes:\n");
scanf("%i",&m);
}while(m < 1 || m > 12);
do{
printf("Ano:\n");
scanf("%i",&a);
}while(a < 2011); getchar(); printf("Digite o nome do usuario \n"); gets(nome_pessoa); maiusculas(nome_pessoa); pos_usu = localizar_usuario(nome_pessoa, qtd_usu, dad_usu); if(pos_usu >= 0){
listar_usuarios(&dad_usu[pos_usu]);
printf("\n");
if(dad_usu[pos_usu].qtd_emprestimo > 0){
printf("Digite o nome do acervo a ser devolvido \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
pos_acer = pesquisar_acervo(nome_pesquisa, qtd_acer, dad_acer);
if(pos_acer >= 0){
listar_acervo(&dad_acer[pos_acer]);
printf("Confirmar a devolucao do acervo acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
dad_acer[pos_acer].emprestado = 0;
for(i = 0; i < dad_usu[pos_usu].qtd_emprestimo; i++){ if(dad_acer[pos_acer].codigo == dad_usu[pos_usu].emprestimo[i]){ dad_usu[pos_usu].emprestimo[i] = dad_usu[pos_usu -1].emprestimo[i]; dad_acer[pos_acer].nome_do_acervo.qtd_exemplares++; flag = 1; printf("Dia previsto para a devolucao \n\n"); printf("Dia......: %d\n", dad_usu[pos_usu].previsaodevolucao.dia); printf("Mes......: %d\n", dad_usu[pos_usu].previsaodevolucao.mes); printf("Ano......: %d\n", dad_usu[pos_usu].previsaodevolucao.ano); a = a - dad_usu[pos_usu].previsaodevolucao.ano; m = m - dad_usu[pos_usu].previsaodevolucao.mes; d = d - dad_usu[pos_usu].previsaodevolucao.dia; //Devolvendo o acervo pendete dad_acer[pos_acer].pendente = -1; if(a > dad_usu[pos_usu].previsaodevolucao.ano){
printf("Acervo atrasado para a entrega em ano\n");

}
if(m > 0){
printf("Acervo atrasado para a entrega em mes\n");
}
if(d > 0){
printf("Acervo atrasado para a entrega em dia\n");
}
printf("Acervo devolvido com sucesso \n");
}

}

}else{
printf("O acervo nao pode ser devolvido \n");
}
if(flag == 0){
printf("O acervo digitado acima nao esta emprestado ao usuario, nao foi possivel devolver !!! \n\n");
}
}else{
printf("Acervo nao encontrado para a devolucao \n");}
}else{
printf("O usuario acima nao possui emprestimos na biblioteca \n\n");
}
}else{
printf("O usuario %s nao esta cadastrado \n",nome_pessoa);
}
}

void listar_acervo_pendete(struct dados_biblioteca bibli[TAMANHO_ACERVO], int qtd)
{
int i;
for(i = 0; i < qtd;i++) { if(bibli[i].codigo == bibli[i].pendente){ if(bibli[i].pendente > 0){
printf("O codigo %i tem item pendente ao Acervo \n\n",bibli[i].codigo);
}
}
}
}

data data_atual()
{
struct tm *data_sistema; // struct tm esta em time.h
time_t t;
data datadiadehoje;


t = time(NULL); // Retorno a hora do sistema
data_sistema = localtime(&t); // Recupera a data atual do sistema

datadiadehoje.dia = data_sistema->tm_mday;
datadiadehoje.mes = data_sistema->tm_mon+1;
datadiadehoje.ano = data_sistema->tm_year+1900;

return datadiadehoje;
}
data data_prevista_devolucao(data data_a)
{
data prevista = data_a;

if (data_a.mes == 1 ||
data_a.mes == 3 ||
data_a.mes == 5 ||
data_a.mes == 7 ||
data_a.mes == 8 ||
data_a.mes == 10 ||
data_a.mes == 12) {

if (data_a.dia + DIAS_EMPRESTIMO > 31) {
prevista.dia = (data_a.dia + DIAS_EMPRESTIMO) - 31;
if (data_a.mes + 1 > 12) {
prevista.ano = data_a.ano + 1;
prevista.mes = 1;
}
else {
prevista.mes = data_a.mes + 1;
}
}
else {
prevista.dia = data_a.dia + DIAS_EMPRESTIMO;
}
} else if (data_a.mes == 4 ||
data_a.mes == 6 ||
data_a.mes == 9 ||
data_a.mes == 11) {
if (data_a.dia + DIAS_EMPRESTIMO > 30) {
prevista.dia = (data_a.dia + DIAS_EMPRESTIMO) - 30;
prevista.mes = data_a.mes + 1;
}
else {
prevista.dia = data_a.dia + DIAS_EMPRESTIMO;
}
}
else {
if (prevista.ano % 4 == 0) {
if (prevista.dia + DIAS_EMPRESTIMO > 29) {
prevista.dia = (prevista.dia + DIAS_EMPRESTIMO) - 29;
prevista.mes += 1;
}
else {
prevista.dia += DIAS_EMPRESTIMO;
}
}
else {
if (prevista.dia + DIAS_EMPRESTIMO > 28) {
prevista.dia = (prevista.dia + DIAS_EMPRESTIMO) - 28;
prevista.mes += 1;
}
else {
prevista.dia += DIAS_EMPRESTIMO;
}
}
}

return prevista;
}
/*
Universidade Federal de Santa Catarina

Prof: Anderson Luiz Perez

Trabalho para Controle de acervos e emprestimos de biblioteca

Desenvolvido por: Joildo Schueroff e Silvana Pires da Silva

Trabalho de Programação I

*/
#include // inclusao da biblioteca stdio.h
#include // inclusao da biblioteca string.h
#include //inclusao da biblioteca time.h

#define TAMANHO_USUARIO 5 // define o tamanho do usuario em 5
#define TAMANHO_ACERVO 5 // define o tamanho do acervo em 5
#define TOTAL_EMPRESTIMO 4 // define o total de emprestimo em 4
#define DIAS_EMPRESTIMO 7 //define os dias de emprestimos em 7

/*
Criação de novos tipos de dados
*/

typedef char nome[50];
typedef char local_nascimento[50];
typedef char endereco[50];
typedef char nome_acervo[50];

typedef struct{
int dia, mes, ano;
}data;
struct nome_acervo{
nome_acervo titulo, editora, local, autor;
int tipo_arquivo, isbn_isbn, codigo, ano_publicacao, qtd_exemplares, volume;

};
struct endereco{
endereco rua, bairro, cidade, estado, rua_endereco, bairro_endereco, cidade_endereco,
estado_endereco;
};

struct dados_pessoa{
int codigo;
nome nome_pessoa;
data dta_nascimento;
local_nascimento cidade_nasc, estado_nasc;
struct endereco endereco;
int celular, fixo;
int qtd_emprestimo;
int emprestimo[TOTAL_EMPRESTIMO];
data diadehoje;
data previsaodevolucao;

};

struct dados_biblioteca{
struct nome_acervo nome_do_acervo;
int codigo;
int aux_emprestimo;
int emprestado;
int pendente;
int contador;
};
//Prototipo das funcoes auxiliares

int menu_biblioteca();

void inserir_usuario(struct dados_pessoa *dad_usuario);
int localizar_usuario(nome nome_usuario, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO]);
void alterar_usuario(struct dados_pessoa *dados, int pos);
void listar_usuarios(struct dados_pessoa *novo_usuario);
int excluir_usuario(int pos, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO]);

void inserir_no_acervo(struct dados_biblioteca *dad_acervo);
void listar_acervo(struct dados_biblioteca *listar);
void alterar_acervo(struct dados_biblioteca *dad_acer);
int pesquisar_acervo(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int pesquisar_acervo_autor(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int pesquisar_acervo_editora(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
int excluir_acervo(int pos, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]);
void locacaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer);
void devolucaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer);
void listar_acervo_pendete(struct dados_biblioteca bibli[TAMANHO_ACERVO], int qtd);
void maiusculas(nome str);

data data_atual();
data data_prevista_devolucao(data data_a);

/*============================== Função Principal=========================================*/
int main()
{
int opc, d_usu; // Variaveis Locais
struct dados_pessoa dad_usuario[TAMANHO_USUARIO];
int opcao_usuario, qtd_usuario = 0, posicao, i, pesquisa_codigo, pesquisa_numero;
int telefone_fixo, telefone_celular;
nome nome_pessoa, nome_pesquisa;
char confirma;
//======================
struct dados_biblioteca dad_acervo[TAMANHO_ACERVO];
int opcao_acervo, qtd_acervo = 0, localiza;
data diadehoje;
data devolucao;



do{
opc = menu_biblioteca(); // opc recebe a função menu biblioteca

switch(opc)
{
case 1: printf("Dados Usuários \n\n");
do{
printf("1.Cadastro de Usuario \n");
printf("2.Pesquisa de Usuario \n");
printf("3.Listar todos os Usuarios Cadastrados\n");
printf("4.Alteracao de dados do cadastro \n");
printf("5.Emprestimos do Usuario \n");
printf("6.Devolucao do Usuario \n");
printf("7.Exclusao de Usuario \n");
printf("8.Voltar ao Menu Anterior\n");
scanf("%i",&opcao_usuario);
switch(opcao_usuario) {
case 1:printf("CADASTRO DE UM USUARIO \n\n");
if(qtd_usuario < TAMANHO_USUARIO){ // condicao para cadastrar inserir_usuario(&dad_usuario[qtd_usuario]); qtd_usuario++; dad_usuario[qtd_usuario -1].codigo = qtd_usuario; }else{ printf("Nao foi possivel cadastrar o usuario \n"); } break; case 2: printf("PESQUISA USUARIO \n\n"); int pesquisa; printf("Selecione o modo de pesquisa \n\n"); printf("1.Por Codigo \n"); printf("2.Por Nome \n"); printf("3.Por telefone \n"); scanf("%i",&pesquisa); getchar(); if(pesquisa == 1){ // pesquisa por codigo printf("Digite o codigo do usuario a ser pesquisado \n"); scanf("%i",&pesquisa_codigo); for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].codigo == pesquisa_codigo){ listar_usuarios(&dad_usuario[i]); } } } if(pesquisa == 2){ //pesquisa por nome printf("Digite o nome do usuario a ser pesquisado \n"); gets(nome_pessoa); maiusculas(nome_pessoa); posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario); if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
}else{
printf("O usuario %s não esta cadastrado \n",nome_pessoa);
}
}
if(pesquisa == 3){ //pesquisa por telefone
do{
printf("Digite o tipo de telefone \n");
printf("1.Telefone Fixo \n");
printf("2.Telefone Celular \n");
printf("3.Sair da Procura \n");
scanf("%i",&pesquisa_numero);
switch(pesquisa_numero){
case 1: printf("Digite o numero do telefone fixo \n");
scanf("%i",&telefone_fixo);
for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].fixo == telefone_fixo){ listar_usuarios(&dad_usuario[i]); } } break; case 2: printf("Digite o numero do telefone celular \n"); scanf("%i",&telefone_celular); for(i = 0; i < qtd_usuario; i++){ if(dad_usuario[i].celular == telefone_celular){ listar_usuarios(&dad_usuario[i]); } } break; case 3: printf("Voltando ao menu principal \n\n"); break; default:printf("Opcao Invalida \n"); } }while(pesquisa_numero != 3); } break; case 3: printf("LISTAGEM DE USUARIOS CADASTRADOS\n\n"); for(i = 0; i < qtd_usuario; i++){ listar_usuarios(&dad_usuario[i]); } break; case 4: printf("ALTERACAO DE DADOS CADASTRAIS DOS USUARIOS \n\n"); getchar(); printf("Digite o nome do usuario a ser Alterado \n"); gets(nome_pessoa); maiusculas(nome_pessoa); posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario); if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
alterar_usuario(dad_usuario, posicao);

}else{
printf("O usuario %s nao esta cadastrado(a) \n\n",nome_pessoa);
}

break;
/*Emprestimo ao Usuario */
case 5: printf("EMPRESTIMOS NO ACERVO PARA O USUARIO \n\n");

locacaodeacervo(dad_usuario, dad_acervo, qtd_usuario, qtd_acervo);

break;
case 6: printf("DEVOLUCAO DE ACERVO DO USUARIO\n\n");
devolucaodeacervo(dad_usuario, dad_acervo, qtd_usuario, qtd_acervo);
break;
case 7: printf("EXCLUIR USUARIO \n\n");
getchar();
printf("Digite o nome do Usuario para ser excluido \n");
gets(nome_pessoa);
maiusculas(nome_pessoa);
posicao = localizar_usuario(nome_pessoa, qtd_usuario, dad_usuario);
if(posicao >= 0){
listar_usuarios(&dad_usuario[posicao]);
printf("Deseja excluir o Usuario Acima (s/n)\n");
scanf("%c",&confirma);

if((confirma == 'S'|| confirma == 's') && (dad_usuario[posicao].qtd_emprestimo == 0)){
qtd_usuario = excluir_usuario(posicao, qtd_usuario, dad_usuario);
printf("Usuario excluido com sucesso \n\n");

}else{
printf("Nao foi possivel excluir usuario, letra errada ou pendente Acervo \n\n");}
}else{
printf("O usuario %s nao esta cadastrado(a) \n\n",nome_pessoa);
}

break;
case 8: printf("\n\n");
break;

default:printf("OPCAO INVALIDA, TENTE NOVAMENTE \n\n");
}
}while(opcao_usuario != 8);
break;
case 2: printf("Dados do Acervo \n\n");
do{
printf("1.Cadastro no Acervo \n");
printf("2.Pesquisa no Acervo \n");
printf("3.Listar todos os Itens Cadastrados\n");
printf("4.Alteracao de dados no Acervo \n");
printf("5.Exclusao de Acervo\n");
printf("6.Listar todos os emprestimos por mes \n");
printf("7.Listar emprestimos pendentes de devolução \n");
printf("8.Voltar ao Menu Anterior\n");
scanf("%i",&opcao_acervo);
switch(opcao_acervo){
case 1: printf("**CADASTRO DE ITENS NO ACERVO**\n\n");
if(qtd_acervo < TAMANHO_ACERVO){ //condicao para cadastrar inserir_no_acervo(&dad_acervo[qtd_acervo]); qtd_acervo++; dad_acervo[qtd_acervo -1].codigo = qtd_acervo; }else{ printf("Não foi possivel cadastrar o item no acervo \n"); } break; case 2: printf("***PESQUISAR DADOS NO ACERVO ***\n\n"); int pesquisa; printf("Selecione o modo de pesquisa \n\n"); printf("1.Por Codigo \n"); printf("2.Por Nome (titulo) \n"); printf("3.Por Autor \n"); printf("4.Por Editora \n"); printf("5.Por Tipo \n"); scanf("%i",&pesquisa); getchar(); if(pesquisa == 1){ printf("Digite o codigo do acervo a ser pesquisado \n"); scanf("%i",&pesquisa_codigo); for(i = 0; i < qtd_acervo; i++){ if(pesquisa_codigo == dad_acervo[i].codigo){ listar_acervo(&dad_acervo[i]); } } } if(pesquisa == 2){ printf("Digite do titulo do acervo \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo); if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 3){
printf("Digite o nome do autor da obra \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo_autor(nome_pesquisa, qtd_acervo, dad_acervo);
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 4){
printf("Digite o nome da editora do acervo \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo_editora(nome_pesquisa, qtd_acervo, dad_acervo);
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
}
if(pesquisa == 5){
do{
printf("Digite o tipo de Acervo \n");
printf("1.Livro \n");
printf("2.Revista \n");
printf("3.Jornal \n");
printf("4.CD \n");
printf("5.DVD \n");
printf("6.Outros \n");
printf("7.Sai da Pesquisa por tipo \n");
scanf("%i",&pesquisa_codigo);
for(i = 0; i < qtd_acervo; i++){ if(pesquisa_codigo == dad_acervo[i].nome_do_acervo.tipo_arquivo){ listar_acervo(&dad_acervo[i]); } } }while(pesquisa_codigo != 7); } break; case 3: printf("***LISTAR TODOS OS DADOS CADASTRADOS NO ACERVO ***\n\n"); for(i = 0; i < qtd_acervo; i++){ listar_acervo(&dad_acervo[i]); } break; case 4: printf("**ALTERAÇÃO DE DADOS NO ACERVO**\n\n"); getchar(); printf("Digite o nome a ser alterado \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo); printf("\n"); if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
alterar_acervo(&dad_acervo[localiza]);

}else{
printf("A obra %s pesquisada nao foi encontrada \n\n",nome_pesquisa);
}
break;

case 5: printf("** EXCLUSAO DE OBRA DO ACERVO **\n\n");
getchar();
printf("Digite o nome a ser excluido \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
localiza = pesquisar_acervo(nome_pesquisa, qtd_acervo, dad_acervo);
printf("\n");
if(localiza >= 0){
listar_acervo(&dad_acervo[localiza]);
if(dad_acervo[localiza].aux_emprestimo == dad_acervo[localiza].nome_do_acervo.qtd_exemplares){
printf("Deseja excluir a obra acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
qtd_acervo = excluir_acervo(localiza, qtd_acervo, dad_acervo);
printf("O acervo acima foi excluido com sucesso \n\n");
}
}else{
printf("Nao foi possivel excluir o acervo devido estar emprestado ao usuario \n\n");
}
}else{
printf("Acervo nao encontrado \n\n") ;
}
break;
case 6: printf(" LISTAR TODOS OS EMPRESTIMOS POR MES\n\n");
int mes_lista;
data data_teste;
printf("Digite o mes que deseja listar os emprestimos \n");
scanf("%i",&mes_lista);
for(i = 0; i < qtd_usuario; i++){ if(mes_lista == dad_usuario[i].diadehoje.mes){ listar_usuarios(&dad_usuario[i]); } } break; case 7: printf("LISTAR EMPRESTIMOS PENDENTES DE DEVOLUCAO\n\n"); listar_acervo_pendete(dad_acervo,qtd_acervo); break; case 8: printf("\n\n"); break; default:printf("OPCAO INVALIDA, TENTE NOVAMENTE \n\n"); } }while(opcao_acervo != 8); break; case 3: printf("Sair do Sistema Biblioteca \n\n Saindo !!!\n"); break; default:printf("Opcao Invalida, Tente Novamente \n"); } }while(opc != 3); return 0; } /*============================== Menu da Biblioteca ============================*/ int menu_biblioteca() { int opcao; printf("Sistema Biblioteca \n\n"); printf("1. Dados Usuarios Biblioteca \n"); printf("2. Dados do Acervo da Biblioteca \n"); printf("3. Sair do Sistema \n"); scanf("%i",&opcao); return opcao; } /*======================= Funcao para converter maiusculas =====================*/ void maiusculas(nome str) { int i; for (i = 0; i < strlen(str); i++) str[i] = toupper(str[i]); } /*======================= Funcao de Inserir Usuario ============================*/ void inserir_usuario(struct dados_pessoa *dad_usuario) { int aux, dia, mes, ano, flag; // variaveis locais getchar(); // limpa o buffer do teclado pois vem de um leitura de inteiro printf("Nome completo: "); gets(dad_usuario->nome_pessoa);

maiusculas(dad_usuario->nome_pessoa);

printf ("\nData de nascimento\nAno: ");
scanf ("%d",&ano);

do{
printf ("Mes: ");
scanf ("%d",&mes);
if (mes < 1 || mes > 12)
printf ("Mes invalido, digite corretamente.\n");
}
while (mes <1 || mes >12);
do {
flag = 0;
do {
printf ("Dia: ");
scanf ("%d",&dia);
}while(dia < 1 || dia > 31);
if (mes == 2){
if ( ano % 400 == 0 || ano % 4 == 0 && ano % 100 == 0){
if ( dia > 29){
printf ("dia invalido, ano bissexto. Digite novamente.\n");
flag = 1;
}
}
else {
if (dia > 28) {
printf ("dia invalido, mes ate 28. Digite novamente.\n");
flag = 1;
}
}
}
else{
if (mes == 4 || mes == 6 || mes == 9 || mes == 11){
if (dia > 30){
printf("Dia invalido, mes de 1 ate 30. Digite novamente\n");
flag = 1;
}
}
else{
if (dia < 1 || dia > 31 && mes != 2){
printf("Dia invalido, mes vai ate 31. Digite novamente\n");
flag = 1;
}
}
}
}
while (flag == 1);
dad_usuario->dta_nascimento.mes = mes;
dad_usuario->dta_nascimento.dia = dia;
dad_usuario->dta_nascimento.ano = ano;
getchar(); //limpa o buffer do tecladon pois vem de um inteiro
printf("Cidade onde nasceu:");
gets(dad_usuario->cidade_nasc);
printf("Estado onde nasceu(Sigla):");
gets(dad_usuario->estado_nasc);
printf("**Endereco Residencial**\n");
printf("Rua:");
gets(dad_usuario->endereco.rua);
printf("Bairro:");
gets(dad_usuario->endereco.bairro);
printf("Cidade:");
gets(dad_usuario->endereco.cidade);
printf("Estado (Sigla):");
gets(dad_usuario->endereco.estado);
printf("**Endereco Comercial**\n");
printf("Rua:");
gets(dad_usuario->endereco.rua_endereco);
printf("Bairro:");
gets(dad_usuario->endereco.bairro_endereco);
printf("Cidade:");
gets(dad_usuario->endereco.cidade_endereco);
printf("Estado (Sigla):");
gets(dad_usuario->endereco.estado_endereco);
printf("Telefone Fixo:");
scanf("%i",&dad_usuario->fixo);
printf("Telefone Celular:");
scanf("%i",&dad_usuario->celular);
printf("\n");


}
/*======================= Funcao de Localizar Usuario ============================*/
int localizar_usuario(nome nome_usuario, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO])
{
int i;
for(i = 0; i < qtd; i++){ if(strcmp(nome_usuario, usua[i].nome_pessoa)== 0){ return i; } } return -1; } /*======================= Funcao de Listar Usuarios ============================*/ void listar_usuarios(struct dados_pessoa *novo_usuario) { int i; printf("Codigo do Usuario: %d\n",novo_usuario->codigo);
printf("Nome do Usuario: %s\n",novo_usuario->nome_pessoa);
printf("Dia de nascimento: %i\n",novo_usuario->dta_nascimento.dia);
printf("Mes de nascimento: %i\n",novo_usuario->dta_nascimento.mes);
printf("Ano de nascimento: %i\n",novo_usuario->dta_nascimento.ano);
printf("Cidade onde nasceu: %s\n",novo_usuario->cidade_nasc);
printf("Estado onde nasceu: %s\n",novo_usuario->estado_nasc);
printf("**Endereco Residencial**\n\n");
printf("Rua residencial: %s\n",novo_usuario->endereco.rua);
printf("Bairro residencial: %s\n",novo_usuario->endereco.bairro);
printf("Cidade residencial: %s\n",novo_usuario->endereco.cidade);
printf("Estado residencial: %s\n",novo_usuario->endereco.estado);
printf("**Endereco Comercial**\n\n");
printf("Rua Comercial: %s\n",novo_usuario->endereco.rua_endereco);
printf("Bairro Comercial: %s\n",novo_usuario->endereco.bairro_endereco);
printf("Cidade Comercial: %s\n",novo_usuario->endereco.cidade_endereco);
printf("Estado Comercial: %s\n\n",novo_usuario->endereco.estado_endereco);
printf("Telefone Fixo: %i\n",novo_usuario->fixo);
printf("Telefone Celular: %i\n",novo_usuario->celular);
printf("Os acervos emprestado(s) \n");
if(novo_usuario->qtd_emprestimo >= 0){
for(i = 0; i < novo_usuario->qtd_emprestimo; i++){ //laço de repetição
if(novo_usuario->emprestimo[i] > 0){
printf("O codigo da obra eh %i\n",novo_usuario->emprestimo[i]);
}
}
}
printf("\n\n");

}
/*======================= Funcao de Excluir Usuario ============================*/
void alterar_usuario(struct dados_pessoa *dados, int pos)
{
int tel_fixo,tel_cel,data_dia,data_mes,data_ano; // variaveis locais
char confirma,local_cid[50],local_est[50],end_rua[50],end_bairr[50],end_cid[50],end_est[50],endc_rua[50];
char nome_alter[50],endc_bairr[50],endc_cid[50],endc_est[50];

printf("Nome: \n");
gets(nome_alter);
maiusculas(nome_alter);
do{
printf("Dia de nascimento:");
scanf("%i",&data_dia);
}while(data_dia < 1 || data_dia > 31);
do{
printf("Mes de nascimento:");
scanf("%i",&data_mes);
}while(data_mes < 1 || data_mes > 12);
do{
printf("Ano de nascimento:");
scanf("%i",&data_ano);
}while(data_ano < 1900 || data_ano > 2011);
getchar();
printf("Cidade onde nasceu:");
gets(local_cid);
maiusculas(local_cid);
printf("Estado onde nasceu (Sigla):");
gets(local_est);
maiusculas(local_est);
printf("**Endereco Residencial**\n\n");
printf("Rua:");
gets(end_rua);
maiusculas(end_rua);
printf("Bairro:");
gets(end_bairr);
maiusculas(end_bairr);
printf("Cidade:");
gets(end_cid);
maiusculas(end_cid);
printf("Estado (Sigla):");
gets(end_est);
maiusculas(end_est);
printf("**Endereco Comercial**\n\n");
printf("Rua:");
gets(endc_rua);
maiusculas(endc_rua);
printf("Bairro:");
gets(endc_bairr);
maiusculas(endc_bairr);
printf("Cidade:");
gets(endc_cid);
maiusculas(endc_cid);
printf("Estado (Sigla):");
gets(endc_est);
maiusculas(endc_est);
printf("\n\n");
printf("Telefone fixo:");
scanf("%i",&tel_fixo);
printf("Telefone celular:");
scanf("%i",&tel_cel);
getchar();

printf("Confirmar os dados acima (s/n):\n");
scanf("%c",&confirma);
if(confirma == 'S'|| confirma == 's'){
strcpy(dados->nome_pessoa, nome_alter); //copia o nome alterado para a variavel nome_pessoa
dados->dta_nascimento.dia = data_dia; // nova data_dia é atribuido para dta_nascimento.dia
dados->dta_nascimento.mes = data_mes;
dados->dta_nascimento.ano = data_ano;
strcpy(dados->cidade_nasc, local_cid);
strcpy(dados->estado_nasc, local_est);
strcpy(dados->endereco.rua, end_rua);
strcpy(dados->endereco.bairro, end_bairr);
strcpy(dados->endereco.cidade, end_cid);
strcpy(dados->endereco.estado, end_est);
strcpy(dados->endereco.rua_endereco, endc_rua);
strcpy(dados->endereco.bairro_endereco, endc_bairr);
strcpy(dados->endereco.cidade_endereco, endc_cid);
strcpy(dados->endereco.estado_endereco, endc_est);
dados->fixo = tel_fixo;
dados->celular = tel_cel;
}
printf("Dados Alterados com sucesso \n\n");
}

int excluir_usuario(int pos, int qtd, struct dados_pessoa usua[TAMANHO_USUARIO])
{ int aux;
aux = usua[pos].codigo;
usua[pos] = usua[qtd -1];
usua[pos].codigo = aux;
return qtd -1;
}
/*======================= Funcao de Inserir no Acervo ============================*/
void inserir_no_acervo(struct dados_biblioteca *dad_acervo)
{

getchar();
printf("Digite o titulo da obra\n");
gets(dad_acervo->nome_do_acervo.titulo);
maiusculas(dad_acervo->nome_do_acervo.titulo);
do{
printf("Digite o tipo da obra de 1 a 6 \n\n");
printf("1.Livro \n");
printf("2.Revista \n");
printf("3.Jornal \n");
printf("4.CD \n");
printf("5.DVD \n");
printf("6.Outros \n");
scanf("%i",&dad_acervo->nome_do_acervo.tipo_arquivo);
}while(dad_acervo->nome_do_acervo.tipo_arquivo >= 7);
getchar();
printf("Digite o nome da Editora do Acervo \n");
gets(dad_acervo->nome_do_acervo.editora);
maiusculas(dad_acervo->nome_do_acervo.editora);
printf("Digite o ano de publicacao do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.ano_publicacao);
getchar();
printf("Digite o local de publicacao \n");
gets(dad_acervo->nome_do_acervo.local);
maiusculas(dad_acervo->nome_do_acervo.local);
printf("Digite o(s) autor(es) do Acervo \n");
gets(dad_acervo->nome_do_acervo.autor);
maiusculas(dad_acervo->nome_do_acervo.autor);
printf("Digite o ISBN do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.isbn_isbn);
printf("Digite o volume do Acervo \n");
scanf("%i",&dad_acervo->nome_do_acervo.volume);
printf("Digite a quantidade a ser cadastrada \n");
scanf("%i",&dad_acervo->nome_do_acervo.qtd_exemplares);

printf("\n\n");

}
/*======================= Funcao de Listar Acervo ============================*/
void listar_acervo(struct dados_biblioteca *listar)
{
printf("O codigo no Acervo eh %i\n",listar->codigo);
printf("O titulo da obra eh %s\n",listar->nome_do_acervo.titulo);
if(listar->nome_do_acervo.tipo_arquivo == 1){
printf("O tipo: Livro\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 2){
printf("O tipo: Revista\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 3){
printf("O tipo: Jornal\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 4){
printf("O tipo: CD\n");
}else{
if(listar->nome_do_acervo.tipo_arquivo == 5){
printf("O tipo: DVD\n");
}else{
printf("O tipo da obra eh outro Tipo de Acervo\n");
}
}
}
}
}
printf("A editora do acervo eh %s \n",listar->nome_do_acervo.editora);
printf("O ano de publicacao do acervo eh %i \n",listar->nome_do_acervo.ano_publicacao);
printf("O local de publicacao eh %s\n",listar->nome_do_acervo.local);
printf("O(s) autor(es) eh %s \n",listar->nome_do_acervo.autor);
printf("O ISBN do acervo eh %i\n",listar->nome_do_acervo.isbn_isbn);
printf("O volume do acervo eh %i \n",listar->nome_do_acervo.volume);
printf("A quantidade de exemplares eh %i\n",listar->nome_do_acervo.qtd_exemplares);
printf("\n\n");

}
/*======================= Funcao de Pesquisar Acervo por Nome ============================*/
int pesquisar_acervo(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO])
{
int i;
for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.titulo) == 0) { return i; } } return -1; } /*======================= Funcao de Pesquisar Acervo Autor ============================*/ int pesquisar_acervo_autor(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int i; for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.autor) == 0){ return i; } } return -1; } /*======================= Funcao de Pesquisar Acervo Editora ============================*/ int pesquisar_acervo_editora(nome_acervo no_acervo, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int i; for(i = 0; i < qtd; i++){ if(strcmp(no_acervo, acerv[i].nome_do_acervo.editora) == 0){ return i; } } return -1; } /*======================= Funcao de Excluir Item do Acervo =======================*/ int excluir_acervo(int pos, int qtd, struct dados_biblioteca acerv[TAMANHO_ACERVO]) { int aux; aux = acerv[pos].codigo; acerv[pos] = acerv[qtd -1]; acerv[pos].codigo = aux; return qtd -1; } void alterar_acervo(struct dados_biblioteca *dad_acer) { char confirma,nome_titulo[50],nome_editora[50],nome_local[50],nome_autores[50]; // variaveis locais int novo_ano, novo_tipo, novo_isbn, novo_vol, novo_qtd; printf("\n"); do{ printf("Digite o tipo de Acervo \n"); printf("1.Livro \n"); printf("2.Revista \n"); printf("3.Jornal \n"); printf("4.CD \n"); printf("5.DVD \n"); printf("6.Outros \n"); scanf("%i",&novo_tipo); }while(novo_tipo < 1 || novo_tipo > 6);
getchar();
printf("Titulo da obra:");
gets(nome_titulo);
printf("Editora:");
gets(nome_editora);
printf("Ano de publicacao:");
scanf("%i",&novo_ano);
getchar();
printf("Local:");
gets(nome_local);
printf("Autores:");
gets(nome_autores);
printf("ISBN:");
scanf("%i",&novo_isbn);
printf("Volume:");
scanf("%i",&novo_vol);
printf("Quantidade de exemplares:");
scanf("%i",&novo_qtd);
getchar();
printf("Confirma os dados acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
dad_acer->nome_do_acervo.tipo_arquivo = novo_tipo; //novo tipo é atribuido para a variavel nome_do_acervo.tipo_arquivo
strcpy(dad_acer->nome_do_acervo.titulo, nome_titulo);
strcpy(dad_acer->nome_do_acervo.editora, nome_editora);
dad_acer->nome_do_acervo.ano_publicacao = novo_ano;
strcpy(dad_acer->nome_do_acervo.local, nome_local);
strcpy(dad_acer->nome_do_acervo.autor, nome_autores);
dad_acer->nome_do_acervo.isbn_isbn = novo_isbn;
dad_acer->nome_do_acervo.volume = novo_vol;
dad_acer->nome_do_acervo.qtd_exemplares = novo_qtd;
}
}
void locacaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer)
{
char nome_pesquisa[50], nome_pessoa[50];
int pos_usu, pos_acer;
data diadehoje;
data prevista;
char confirma;
int i;
getchar();
printf("Digite o nome do usuario \n");
gets(nome_pessoa);
maiusculas(nome_pessoa);
pos_usu = localizar_usuario(nome_pessoa, qtd_usu, dad_usu);
if(pos_usu >= 0){
listar_usuarios(&dad_usu[pos_usu]);
if(dad_usu[pos_usu].qtd_emprestimo < TOTAL_EMPRESTIMO){ printf("Digite o nome do acervo a ser emprestado \n"); gets(nome_pesquisa); maiusculas(nome_pesquisa); pos_acer = pesquisar_acervo(nome_pesquisa, qtd_acer, dad_acer); for(i = 0; i < dad_usu[pos_usu].qtd_emprestimo; i++){ if(dad_acer[pos_acer].codigo == dad_usu[pos_usu].emprestimo[i]){ pos_acer = -1; printf("o acervo acima ja esta emprestado para o usuario\n\n"); } } if(pos_acer >= 0){
listar_acervo(&dad_acer[pos_acer]);

printf("Confirma o emprestimo acima ao usuario (s/n) \n");
scanf("%c",&confirma);

if((confirma == 'S' || confirma == 's')&&(dad_acer[pos_acer].nome_do_acervo.qtd_exemplares) > 0){

//Coloca a data do emprestimo atual !!!!
diadehoje = data_atual();
dad_usu[pos_usu].diadehoje = diadehoje;
printf("Data Atual \n\n");
printf("Dia......: %d\n", diadehoje.dia);
printf("Mes......: %d\n", diadehoje.mes);
printf("Ano......: %d\n\n", diadehoje.ano);

printf("Data de previsao para a devolucao \n\n");
prevista = data_prevista_devolucao(diadehoje);
dad_usu[pos_usu].previsaodevolucao = prevista;
printf("Dia......: %d\n", prevista.dia);
printf("Mes......: %d\n", prevista.mes);
printf("Ano......: %d\n", prevista.ano);

//Faz o emprestimo para o usuario

dad_acer[pos_acer].emprestado = dad_usu[pos_usu].codigo;
dad_usu[pos_usu].emprestimo[dad_usu[pos_usu].qtd_emprestimo] = dad_acer[pos_acer].codigo;
dad_usu[pos_usu].qtd_emprestimo++;
dad_acer[pos_acer].nome_do_acervo.qtd_exemplares--;

//Pegar o acervo e colocar em pendente

dad_acer[pos_acer].pendente = dad_acer[pos_acer].codigo;

printf("Acervo emprestado com sucesso \n\n");
printf("Quantidade de acervo pendete %i\n",dad_acer[pos_acer].contador);

}else{
printf("Nao foi possivel emprestar o acervo \n");
}
}
}else{
printf("Limite maximo de emprestimo no acervo por usuario maior que o estabelecido \n");
}
}
}

void devolucaodeacervo(struct dados_pessoa dad_usu[TAMANHO_USUARIO], struct dados_biblioteca dad_acer[TAMANHO_ACERVO], int qtd_usu, int qtd_acer)
{
char nome_pesquisa[50], nome_pessoa[50];
int pos_usu, pos_acer, flag = 0, d,m,a;
char confirma;
int i;
getchar();
printf("Informe a data da devolucao \n\n");
do{
printf("Dia:\n");
scanf("%i",&d);
}while(d < 1 || d > 31);
do{
printf("Mes:\n");
scanf("%i",&m);
}while(m < 1 || m > 12);
do{
printf("Ano:\n");
scanf("%i",&a);
}while(a < 2011); getchar(); printf("Digite o nome do usuario \n"); gets(nome_pessoa); maiusculas(nome_pessoa); pos_usu = localizar_usuario(nome_pessoa, qtd_usu, dad_usu); if(pos_usu >= 0){
listar_usuarios(&dad_usu[pos_usu]);
printf("\n");
if(dad_usu[pos_usu].qtd_emprestimo > 0){
printf("Digite o nome do acervo a ser devolvido \n");
gets(nome_pesquisa);
maiusculas(nome_pesquisa);
pos_acer = pesquisar_acervo(nome_pesquisa, qtd_acer, dad_acer);
if(pos_acer >= 0){
listar_acervo(&dad_acer[pos_acer]);
printf("Confirmar a devolucao do acervo acima (s/n)\n");
scanf("%c",&confirma);
if(confirma == 'S' || confirma == 's'){
dad_acer[pos_acer].emprestado = 0;
for(i = 0; i < dad_usu[pos_usu].qtd_emprestimo; i++){ if(dad_acer[pos_acer].codigo == dad_usu[pos_usu].emprestimo[i]){ dad_usu[pos_usu].emprestimo[i] = dad_usu[pos_usu -1].emprestimo[i]; dad_acer[pos_acer].nome_do_acervo.qtd_exemplares++; flag = 1; printf("Dia previsto para a devolucao \n\n"); printf("Dia......: %d\n", dad_usu[pos_usu].previsaodevolucao.dia); printf("Mes......: %d\n", dad_usu[pos_usu].previsaodevolucao.mes); printf("Ano......: %d\n", dad_usu[pos_usu].previsaodevolucao.ano); a = a - dad_usu[pos_usu].previsaodevolucao.ano; m = m - dad_usu[pos_usu].previsaodevolucao.mes; d = d - dad_usu[pos_usu].previsaodevolucao.dia; //Devolvendo o acervo pendete dad_acer[pos_acer].pendente = -1; if(a > dad_usu[pos_usu].previsaodevolucao.ano){
printf("Acervo atrasado para a entrega em ano\n");

}
if(m > 0){
printf("Acervo atrasado para a entrega em mes\n");
}
if(d > 0){
printf("Acervo atrasado para a entrega em dia\n");
}
printf("Acervo devolvido com sucesso \n");
}

}

}else{
printf("O acervo nao pode ser devolvido \n");
}
if(flag == 0){
printf("O acervo digitado acima nao esta emprestado ao usuario, nao foi possivel devolver !!! \n\n");
}
}else{
printf("Acervo nao encontrado para a devolucao \n");}
}else{
printf("O usuario acima nao possui emprestimos na biblioteca \n\n");
}
}else{
printf("O usuario %s nao esta cadastrado \n",nome_pessoa);
}
}

void listar_acervo_pendete(struct dados_biblioteca bibli[TAMANHO_ACERVO], int qtd)
{
int i;
for(i = 0; i < qtd;i++) { if(bibli[i].codigo == bibli[i].pendente){ if(bibli[i].pendente > 0){
printf("O codigo %i tem item pendente ao Acervo \n\n",bibli[i].codigo);
}
}
}
}

data data_atual()
{
struct tm *data_sistema; // struct tm esta em time.h
time_t t;
data datadiadehoje;


t = time(NULL); // Retorno a hora do sistema
data_sistema = localtime(&t); // Recupera a data atual do sistema

datadiadehoje.dia = data_sistema->tm_mday;
datadiadehoje.mes = data_sistema->tm_mon+1;
datadiadehoje.ano = data_sistema->tm_year+1900;

return datadiadehoje;
}
data data_prevista_devolucao(data data_a)
{
data prevista = data_a;

if (data_a.mes == 1 ||
data_a.mes == 3 ||
data_a.mes == 5 ||
data_a.mes == 7 ||
data_a.mes == 8 ||
data_a.mes == 10 ||
data_a.mes == 12) {

if (data_a.dia + DIAS_EMPRESTIMO > 31) {
prevista.dia = (data_a.dia + DIAS_EMPRESTIMO) - 31;
if (data_a.mes + 1 > 12) {
prevista.ano = data_a.ano + 1;
prevista.mes = 1;
}
else {
prevista.mes = data_a.mes + 1;
}
}
else {
prevista.dia = data_a.dia + DIAS_EMPRESTIMO;
}
} else if (data_a.mes == 4 ||
data_a.mes == 6 ||
data_a.mes == 9 ||
data_a.mes == 11) {
if (data_a.dia + DIAS_EMPRESTIMO > 30) {
prevista.dia = (data_a.dia + DIAS_EMPRESTIMO) - 30;
prevista.mes = data_a.mes + 1;
}
else {
prevista.dia = data_a.dia + DIAS_EMPRESTIMO;
}
}
else {
if (prevista.ano % 4 == 0) {
if (prevista.dia + DIAS_EMPRESTIMO > 29) {
prevista.dia = (prevista.dia + DIAS_EMPRESTIMO) - 29;
prevista.mes += 1;
}
else {
prevista.dia += DIAS_EMPRESTIMO;
}
}
else {
if (prevista.dia + DIAS_EMPRESTIMO > 28) {
prevista.dia = (prevista.dia + DIAS_EMPRESTIMO) - 28;
prevista.mes += 1;
}
else {
prevista.dia += DIAS_EMPRESTIMO;
}
}
}

return prevista;
}