Páginas

19 de nov. de 2013

Arvore Rubro Negra Codigo em C

/*
Universidade Federal de Santa Catarina
Campus Araranguá
Trabalho de Estruturas de Dados I

Professor : Anderson Luiz Fernandez Perez

Alunos : Joildo Schueroff Thyerri Menezarri

Data :05/07/2012




Regras da Arvore Rubro Negra

Observações:

- nenhum caminho será maior que duas vezes o comprimento de qualquer outro. A árvore vermelho-preto
é aproximadamente balanceada

- altura máxima de 2 log (n+1).

- complexidade logaritmica O(log n)

- as arvore vermelho-preto são utilizados em problemas cuja a altura da árvore é maior, pois
apresentam maior desempenho.

Propriedades:
1 - todo nó é vermelho ou preto
2 - a raíz é preta
3 - todo nó folha (null) é preta
4 - nos vermelhos que não sejam folhas possuem somente filhos pretos
5 - todos os caminhos a partir da raíz da árvore até suas folhas passa pelo mesmo número de nós pretos

Obs: em um caminho da raíz até uma sub-árvore vazia não pode existir dois nós vermelhos consecutivos.



*/

#include
#include
#include


struct noh
{
    int numero_arvore;
    char cor;
    struct noh *pai;
    struct noh *esquerda;
    struct noh *direita;
};

typedef struct noh nohVP;

// Prototipo das funções
nohVP* criaNovoNoh();
void rotacaoEsquerda(nohVP **Arvore_PV, nohVP *noh);
void rotacaoDireita(nohVP **Arvore_PV, nohVP *noh);
nohVP* inserir_Novo_Noh_PV(nohVP **Arvore_PV, nohVP *noh);
void inserirCorVP(nohVP **Arvore_PV, nohVP *noh);
void removerCorVP(nohVP **Arvore_PV, nohVP *noh);
nohVP* sucessorVP(nohVP *noh);
nohVP* maximoVP(nohVP *noh);
nohVP* minimoVP(nohVP *noh);
void visitarEmOrdem(nohVP* Arvore_PV);
void mostraDadosNoh(nohVP* noh);
int menu();
int calcularAlturaPreta(nohVP *noh);
nohVP* localizar_Noh_Arvore(nohVP* noh, int numero_arvore);
nohVP* rotacaoDireitaEsquerda(nohVP* arvore);
nohVP* rotacaoEsquerdaDireita(nohVP*arvore);
nohVP *removerVP(nohVP **Arvore_PV, nohVP *noh);

nohVP *vazio = NULL;



int main()
{
    nohVP *Arvore_PV = NULL;
    nohVP *aux;
    int valor, altura, opc;

    vazio = (nohVP*)malloc(sizeof(nohVP));
    vazio->pai = Arvore_PV;
    vazio->direita = vazio->esquerda = vazio;

    do
    {
        opc = menu();
        switch (opc)
        {

        case 1:
            inserir_Novo_Noh_PV(&Arvore_PV, criaNovoNoh());
            break;
        case 2:
            printf("Listagem dos nohs da Arvore \n\n");
            if(Arvore_PV != NULL)
            {
                visitarEmOrdem(Arvore_PV);
            }
            else
            {
                printf("Sem Elementos na Arvore \n");
            }
            break;
        case 3:
            if(Arvore_PV != NULL)
            {
                altura = calcularAlturaPreta(Arvore_PV);
                printf("Altura preta da arvore: %d\n", altura);
            }
            else
            {
                printf("Sem Elementos na Arvore \n");
            }
            break;
        case 4:
            if(Arvore_PV != NULL)
            {
                printf("Digite o numero da Arvore para Remoção ?   \n");
                scanf("%d", &valor);
                aux = localizar_Noh_Arvore(Arvore_PV, valor);
                if (aux->numero_arvore == valor)
                {
                    mostraDadosNoh(aux);
                    removerVP(&Arvore_PV, aux);
                }
                else
                {
                    printf("\nO numero %d nao encontrada!\n\n", valor);
                }
                if(Arvore_PV == vazio)
                {
                    vazio = (nohVP*)malloc(sizeof(nohVP));
                    vazio->pai = Arvore_PV = NULL;
                    vazio->direita = vazio->esquerda = vazio;
                }
            }
            else
            {
                printf("Sem Elementos na Arvore \n");
            }
            break;
        case 5:
            if(Arvore_PV != NULL)
            {
                printf("Qual noh deseja alterar\n ");
                scanf("%d", &valor);
                aux = localizar_Noh_Arvore(Arvore_PV, valor);
                if (aux->numero_arvore == valor)
                {
                    mostraDadosNoh(aux);
                    inserir_Novo_Noh_PV(&(Arvore_PV),criaNovoNoh());
                    removerVP(&Arvore_PV, aux);

                }
                else
                {
                    printf("O numero %d nao encontrada!\n\n", valor);
                }
            }
            else
            {
                printf("Sem Elementos na Arvore \n");
            }

            break;
        }
    }
    while (opc != 0);

    return 0;
}
// Rotação a Esquerda do Noh

void rotacaoEsquerda(nohVP **Arvore_PV, nohVP *noh)
{
    nohVP *y;

    if(((*Arvore_PV)->pai == vazio) && (noh->direita != vazio))
    {
        y = noh->direita;
        noh->direita = y->esquerda;
        y->esquerda->pai = noh;
        y->pai = noh->pai;

        if(noh->pai == vazio)
        {
            *Arvore_PV = y;
        }
        else if(noh == noh->pai->esquerda)
        {
            noh->pai->esquerda = y;
        }
        else
        {
            noh->pai->direita = y;
        }
    }
    y->esquerda = noh;
    noh->pai = y;
    (*Arvore_PV)->pai = vazio;
}

//Rotação a Direita do no
void rotacaoDireita(nohVP **Arvore_PV, nohVP *noh)
{
    nohVP *y;

    if(((*Arvore_PV)->pai == vazio) && (noh->esquerda != vazio))
    {
        y = noh->esquerda;
        noh->esquerda = y->direita;
        y->direita->pai = noh;
        y->pai = noh->pai;

        if(noh->pai == vazio)
        {
            *Arvore_PV = y;
        }
        else if(noh == noh->pai->direita)
        {
            noh->pai->direita = y;
        }
        else
        {
            noh->pai->esquerda = y;
        }
    }
    y->direita = noh;
    noh->pai = y;
    (*Arvore_PV)->pai = vazio;
}


nohVP* inserir_Novo_Noh_PV(nohVP **Arvore_PV, nohVP *noh)// Insere na arvore
{
    nohVP *y = vazio;
    nohVP *x = *Arvore_PV;

    if((*Arvore_PV)== NULL)// Verifica se a arvore é NULL
    {
        *Arvore_PV = noh;
        (*Arvore_PV)->pai = vazio;
        vazio->pai = *Arvore_PV;
        (*Arvore_PV)->cor = 'P';
        return;
    }

    if((*Arvore_PV)->numero_arvore == noh->numero_arvore)
    {
        printf(" Numero duplicado, Coloque outro numero !!\n\n");
        return;
    }

    while(x != vazio)
    {
        y = x;

        if(noh->numero_arvore < x->numero_arvore)
        {
            x = x->esquerda;
        }
        else
        {
            x = x->direita;
        }
    }

    noh->pai = y;

    if(noh->numero_arvore < y->numero_arvore)
    {
        y->esquerda = noh;
    }
    else if(noh->numero_arvore > y->numero_arvore)
    {
        y->direita = noh;
    }
    else if(noh->numero_arvore == y->numero_arvore)
    {
        printf("Numeros iguais, Tente outro numero !!\n\n");
    }

    noh->esquerda = vazio;
    noh->direita = vazio;
    noh->cor = 'V';

    inserirCorVP(&(*Arvore_PV), noh);
    return noh;
}
// Insere a Cor do nó e faz o balaceamento caso precisar
void inserirCorVP(nohVP **Arvore_PV, nohVP *noh)//
{
    nohVP *y;

    while(noh->pai->cor == 'V')
    {
        if(noh->pai == noh->pai->pai->esquerda)
        {
            y = noh->pai->pai->direita;

            if(y->cor == 'V')
            {
                noh->pai->cor = 'P';
                y->cor = 'P';
                noh->pai->pai->cor = 'V';
                noh = noh->pai->pai;
            }
            else
            {
                if(noh == noh->pai->direita)
                {
                    noh = noh->pai;
                    rotacaoEsquerda(&(*Arvore_PV), noh);
                }

                noh->pai->cor = 'P';
                noh->pai->pai->cor = 'V';
                rotacaoDireita(&(*Arvore_PV), noh->pai->pai);
            }
        }
        else
        {
            y = noh->pai->pai->esquerda;

            if(y->cor == 'V')
            {
                noh->pai->cor = 'P';
                y->cor = 'P';
                noh->pai->pai->cor = 'V';
                noh = noh->pai->pai;
            }
            else
            {
                if(noh == noh->pai->esquerda)
                {
                    noh = noh->pai;
                    rotacaoDireita(&(*Arvore_PV), noh);
                }

                noh->pai->cor = 'P';
                noh->pai->pai->cor = 'V';
                rotacaoEsquerda(&(*Arvore_PV), noh->pai->pai);
            }
        }
    }

    (*Arvore_PV)->cor = 'P';
}

// Remove o noh da Arvore

nohVP *removerVP(nohVP **Arvore_PV, nohVP *noh)
{
    nohVP *y, *x;

    if((noh->esquerda == vazio) || (noh->direita == vazio))
    {
        y = noh;
    }
    else
    {
        y = sucessorVP(noh);
    }

    if(y->esquerda != vazio)
    {
        x = y->esquerda;
    }
    else
    {
        x = y->direita;
    }

    x->pai = y->pai;


    if(y->pai == vazio)
    {
        *Arvore_PV = x;
    }
    else if(y == y->pai->esquerda)
    {
        y->pai->esquerda = x;
    }
    else
    {
        y->pai->direita = x;
    }

    if(y != noh)
    {
        noh->numero_arvore = y->numero_arvore;        //Aqui os dados são transferidos
    }

    if(y->cor == 'P')
    {


        if((*Arvore_PV)->direita == vazio && (*Arvore_PV)->esquerda->direita != vazio)
        {

            rotacaoEsquerda(&(*Arvore_PV), (*Arvore_PV)->esquerda);
            removerCorVP(&(*Arvore_PV), (*Arvore_PV)->esquerda);
            rotacaoDireita(&(*Arvore_PV), (*Arvore_PV));
        }
        else
        {

            if((*Arvore_PV)->esquerda == vazio && (*Arvore_PV)->direita->esquerda != vazio)
            {

                rotacaoDireita(&(*Arvore_PV), (*Arvore_PV)->direita);
                removerCorVP(&(*Arvore_PV), (*Arvore_PV)->direita);
                rotacaoEsquerda(&(*Arvore_PV), (*Arvore_PV));
            }
        }
        removerCorVP(&(*Arvore_PV), x);
    }
    return y;
    free(y);
    free(x);

}
// Faz o balaceamento da cor caso tenha alguma incosistencia

void removerCorVP(nohVP **Arvore_PV, nohVP *noh)
{
    nohVP *aux;

    while(((*Arvore_PV) != noh) && (noh->cor == 'P'))
    {
        if(noh == noh->pai->esquerda)
        {
            aux = noh->pai->direita;

            if(aux->cor == 'V')
            {
                aux->cor = 'P';
                noh->pai->cor = 'V';
                rotacaoEsquerda(&(*Arvore_PV), noh->pai);
                aux = noh->pai->direita;
            }

            if((aux->esquerda->cor == 'P') && (aux->direita->cor == 'P'))
            {
                aux->cor = 'V';
                noh = noh->pai;
            }
            else if(aux->direita->cor == 'P')
            {
                aux->esquerda->cor = 'P';
                aux->cor = 'V';
                rotacaoDireita(&(*Arvore_PV), aux);
                aux = noh->pai->direita;
                aux->cor = noh->pai->cor;
                noh->pai->cor = 'P';
                aux->direita->cor = 'P';
                rotacaoEsquerda(&(*Arvore_PV), noh->pai);
                noh = *Arvore_PV;
            }
        }
        else
        {
            aux = noh->pai->esquerda;

            if(aux->cor == 'V')
            {
                aux->cor = 'P';
                noh->pai->cor = 'V';
                rotacaoDireita(&(*Arvore_PV), noh->pai);
                aux = noh->pai->esquerda;
            }

            if((aux->esquerda->cor == 'P') && (aux->direita->cor == 'P'))
            {
                aux->cor = 'V';
                noh = noh->pai;
            }
            else if(aux->esquerda->cor == 'P')
            {
                aux->direita->cor = 'P';
                aux->cor = 'V';
                rotacaoEsquerda(&(*Arvore_PV), aux);
                aux = noh->pai->esquerda;
                aux->cor = noh->pai->cor;
                noh->pai->cor = 'P';
                aux->esquerda->cor = 'P';
                rotacaoDireita(&(*Arvore_PV), noh->pai);
                noh = *Arvore_PV;
            }
        }
    }
    noh->cor = 'P';
}
// Sucessor do noh para o balaceamento

nohVP* sucessorVP(nohVP *noh)
{
    nohVP *aux;

    if(noh->direita != vazio)
    {
        return minimoVP(noh->direita);
    }

    aux = noh->pai;

    while((aux != vazio) && (noh == aux->direita))
    {
        noh = aux;
        aux = aux->pai;
    }

    return aux;
}
// Maximo da Arvore

nohVP* maximoVP(nohVP *noh)
{
    while(noh->direita != vazio)
    {
        noh = noh->direita;
    }
    return noh;
}
// Minimo da Arvore
nohVP* minimoVP(nohVP *noh)
{
    while(noh->esquerda != vazio)
    {
        noh = noh->esquerda;
    }
    return noh;
}
// Cria o no para a Arvore
nohVP* criaNovoNoh()
{
    nohVP *novo;
    novo = (nohVP*)malloc(sizeof(nohVP));
    printf("Informe um numero para a Arvore...: ");
    scanf("%d", &novo->numero_arvore);
    if(novo->numero_arvore < 0)
    {
        printf("Numero Invalido! Tente Novamente !!!\n");
        return criaNovoNoh();
    }
    novo->cor = 'V'; // todo novo noh é vermelho
    novo->pai = vazio;
    novo->direita = vazio;
    novo->esquerda = vazio;

    return novo;
}
// Função de Listagem dos dados
void visitarEmOrdem(nohVP* Arvore_PV)
{
    if (Arvore_PV != vazio)
    {
        mostraDadosNoh(Arvore_PV);
        visitarEmOrdem(Arvore_PV->esquerda);
        visitarEmOrdem(Arvore_PV->direita);
    }
}
// Mostra os dados da Arvore
void mostraDadosNoh(nohVP* noh)
{
    printf("Endereco do noh....................: %p\n", noh);
    printf("Valor do noh.......................: %d\n", noh->numero_arvore);
    printf("Cor do noh.........................: %c\n\n", noh->cor);
    printf("Pai do noh.........................: %p\n", noh->pai);
    printf("Filho da esquerda..................: %p\n", noh->esquerda);
    printf("Filho da direita...................: %p\n\n", noh->direita);
    printf("\n\n");
}
//Menu do Usuario
int menu()
{
    int opcao;

    printf("1.Inserir noh na arvore...:\n");
    printf("2.Mostrar arvore (RED)....:\n");
    printf("3.Calcular altura preta...:\n");
    printf("4.Remover noh da arvore...:\n");
    printf("5.Alterar noh da arvore...:\n");
    printf("0.Sair do programa........:\n");
    printf("?: ");

    scanf("%d", &opcao);
    return opcao;
}
// Calculo do balaceamento
int calcularAlturaPreta(nohVP *noh)
{
    int alt_esquerda = 0, alt_direita = 0;

    if(!noh)
    {
        return 0;
    }

    if (noh == vazio)
    {
        return 1;
    }

    if (noh->cor == 'P')
    {
        alt_esquerda += calcularAlturaPreta(noh->esquerda);
        alt_direita +=  calcularAlturaPreta(noh->direita);
    }
    else
    {
        calcularAlturaPreta(noh->esquerda);
        calcularAlturaPreta(noh->direita);
    }

    if (alt_esquerda > alt_direita)
    {
        return alt_esquerda + 1;
    }
    else
    {
        return alt_direita + 1;
    }
}
// Localizar o noh da Arvore para devidas alterações ou remoções

nohVP* localizar_Noh_Arvore(nohVP* noh, int numero_arvore)
{
    if ((noh == vazio) || (noh->numero_arvore == numero_arvore))
    {
        return noh;
    }

    if (numero_arvore < noh->numero_arvore)
    {
        return localizar_Noh_Arvore(noh->esquerda, numero_arvore);
    }
    else
    {
        return localizar_Noh_Arvore(noh->direita, numero_arvore);
    }
}

12 de dez. de 2011

Alocação dinamica

Essa e uma versao do professor Carlos UFSC

#include
#include

#define TAMANHO_VETOR 3
#define LINHA 2
#define COLUNA 2

/**
* Prototipos
*/
/**
* Calcula a media aritmetica dos elementos de um vetor
* @param *vetor
* @param tamanho
* @return double
*/
double calcularMediaVetor(int *vetor, int tamanho);

/**
* Funcao main()
*/
int main(){
int ind, cont;
//Vetor dinamico de numeros inteiros
typedef int *vetorInteiros;
typedef vetorInteiros *matrizInteiros;
//Matriz dinamica de numeros inteiros
matrizInteiros matInt;

printf("Trabalhando com vetores dinamicos\n");
vetorInteiros vetInt;
//Alocando o vetor
vetInt = (int *) calloc(TAMANHO_VETOR, sizeof(int));
//Populando o vetor
for(ind = 0; ind < TAMANHO_VETOR; ind++){
vetInt[ind] += ind;
}
//Listando o vetor
for(ind = 0; ind < TAMANHO_VETOR; ind++){
printf("Vetor[%d]: %d\n", ind, vetInt[ind]);
}
//Imprimindo a media
printf("A media eh: %lf", calcularMediaVetor(vetInt, TAMANHO_VETOR));

printf("\n");
printf("Trabalhando com matrizes dinamicas\n\n");

//Alocando a matriz
matInt = (matrizInteiros) calloc(LINHA, sizeof(vetInt));
for(ind = 0; ind < LINHA; ind++){
matInt[ind] = (vetorInteiros)calloc(COLUNA, sizeof(vetorInteiros));
}
//PREENCHENDO A MATRIZ
printf("Digite os valores da matriz \n");
for(ind = 0; ind < LINHA; ind++){
for(cont = 0; cont < COLUNA; cont++){
scanf("%d",&matInt[ind][cont]);

//matInt[ind][cont] += (ind + cont);
}
}
//IMPRIMINDO A MATRIZ
for(ind = 0; ind < LINHA; ind++){
for(cont = 0; cont < COLUNA; cont++){
printf("Matriz[%d][%d]: %d\n", ind, cont, matInt[ind][cont]);
}
}

return 0;
}

/**
* Implementacao
*/
double calcularMediaVetor(int *vetor, int tamanho){
int ind, soma = 0;

for(ind = 0; ind < tamanho; ind++){
soma += vetor[ind];
}

return (soma/tamanho);
}

Biblioteca versao 2

O sistema possui alocação dinamica e salva em arquivo, possui emprestimo, devolucao, reserva, renovação, tratamento de exclusao, alteração, multa por atrazo, ordenação por quicksort e alguns relatorios do sistema.


Peçam por email.

Email: joildoschueroff@gmail.com

13 de set. de 2011

Pega hora Atual do Sistema

#include
#include

/* Pega hora atual do Sistema */
int main(void)
{
struct tm *local;
time_t t;

t = time(NULL);
local = localtime(&t);
printf("Dia da Semana, Mes, Dia, Hora, Ano: %s\n", asctime(local));
local = gmtime(&t);
printf("Dia da Semana, Mes, Dia, Hora, Ano: %s\n", asctime(local));

return 0;
}

11 de jul. de 2011

Programa de tabela Ascii

#include

int main()
{
int i = 32;

while(i < 128)
{
printf("O posicao atual eh %i e o caracter eh %c\n",i,i);
i++;
}

return 0;
}

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;
}