Sei sulla pagina 1di 19

Documentao do Trabalho Prtico 3 - AEDS2

Daniel Borba Paulino Coelho Daniel Nogueira Silva 1. Introduo


O objetivo desse trabalho rever conceitos de programao e explorar os conceitos de mtodos de ordenao juntamente a utilizao de tabelas, como as tabelas Hash usadas no programa. Os comandos devem ser lidos de um arquivo .txt, puxar os dados e outro arquivo .txt e gravadas as sadas em um arquivo de sada, tambm .txt, esses arquivos so passados como parmetros no programa principal, main.

2. Implementao
Biblioteca Para a implementao do trabalho foi criado um Tipo Abstrato de Dado Biblioteca, assim como as arvores estudadas em sala, com um elemento a sua direita e um elemento a sua esquerda. Foi utilizada uma tabela Hash para manipulao no banco de dados do sistema. Funes e Procedimentos Classe Biblioteca: Construtor Biblioteca(): somente o construtor, no realiza nenhuma procedimento. void Particao(int e, int d, int *i, int *j, TabelaLivros *T, int* tabela): Esse mtodo responsvel por fazer a partio que necessria quando precisamos manipulas nossa Tabela, recebe como parametro todos os atributos necessrios para essa manipulao. O mtodo particiona a tabela em duas novas tabelas, os itens menores que o piv ficam sua esquerda e os maiores sua direita. Ele faz isso atravs de comparaes com um do while e um while e comparaes de string. Esse mtodo serve para auxiliar na ordenao. void ordlivros(int Esq, int Dir, TabelaLivros *A, int* tabela): Esse mtodo responsvel pela ordenao das obras. Ele recebe como parametros tabela e seus atributos necessrios para a ordenao. Atravs de e chamadas da funo partiao a ordenao feita. void inslivro(char titulo[100], char autor[100], int cod, int ano): Esse mtodo somente insere uma obra, manipulando a tabela em questo, sem nenhum loop. void retlivro(int cod, FILE* arquivo): J esse mtodo no to simples quanto o mtodo de inserir, nele temos um loop for, e dentro desse loop temos um outro loop

while, que, com algumas comparaes e verificaes retira uma obra sem danificar a estrutura da tabela de dados Hash. void buscarlivro(int cod, FILE* arquivo): Esse mtodo busca uma obra atravs de seu cdigo e do arquivo de dados. A busca feita assim como pesquisas simples, com um for percorrendo todas as obras e um if verificando se a obra a procurada. void listarLivros(bool ordena, FILE* arquivo, int* tabela): O mtodo primeiramente ordena as obras chamando o mtodo de ordenao para assim listar todas as obras com um for percorrendo todas as obras e as imprimindo.

Classe No: void Insere(Biblioteca area, Apontador *p, FILE* arquivo): Para inserir um n na arvore, feito um caminhamento que coloca o n em sua posio correta. A implementao semelhante forma recursiva utilizada no mtodo Pesquisa, com a diferena de que a condio de parada quando chegar em um n folha. void Pesquisa(Biblioteca **area, Apontador p, FILE* arquivo): Esse mtodo pertencente a classe que representa os ns da arvore, faz a pesquisa, em uma rea e em um arquivo de dados por uma chave apontada pelo apontador p. Para essa pesquisa feito um mtodo recursivo, que faz a verificao se a chave menor ou maior que o n em questo, se for maior, chama novamente o mtodo pesquisa porem com o no da esquerda, se for menor chama com o no da direita. A condio de parada quando achar o mtodo. Classe Livro Livro(): somente o construtor, no realiza nenhuma procedimento. Programa Principal void Particao(int Esq, int Dir, int *i, int *j, TabelaAreas *A): Esse mtodo responsvel por fazer a partio que necessria quando precisamos manipular nossa Tabela, recebe como parametro todos os atributos necessrios para essa manipulao. O mtodo particiona a tabela em duas novas tabelas, os itens menores que o piv ficam sua esquerda e os maiores sua direita. Ele faz isso atravs de comparaes com um do while e um while e comparaes de string. Esse mtodo serve para auxiliar na ordenao. void ordareas (int Esq, int Dir, TabelaAreas *A): Esse mtodo responsvel pela ordenao das reas. Ele recebe como parmetros tabela e seus atributos necessrios para a ordenao. Atravs de e chamadas da funo partio a ordenao feita. int index(char* origem, char caracter, int inicio): Tambm um mtodo auxiliar que retorna somente uma posiao de uma string, um char em uma posio especifica da String.

void sub(char* destino, char* origem, int inicio, int tam): Essa uma funo auxiliar que somente acha uma funo dentro da outra utilizando um mtodo da classe String. void ptab (TabelaAreas *areas, int *i, Apontador arvore): Esse mtodo cria a tabela preenchendo-a com as reas. Esse um mtodo recursivo, ou seja, ele chama novamente o PreencheTabela, porm, com o apontador apontando para a direita ou para a esquerda, dependendo do valor da chave da rea. void impareas(Apontador arvore, bool ordena, FILE* arquivo): Esse mtodo chama o PreencheArea, e depois o OrdenaAreas, para em seguida comear a impresso das reas atravs de um loop while at ter impresso toda a rvore. int main(int argcv, char *argv[]): O programa principal cria as variveis necessrias, abre um arquivo de entrada, que recebido como parmetro juntamente com o arquivo de sada, e ento sero atribudos os comandos s variveis atravs de um terceiro arquivo que contm os comandos. Ento entra em um loop que l primeiramente o arquivo de entrada, com todas suas informaes e gerando uma tabela que ser manipulada, a tabela hash. Em seguida entra em outro loop, dessa vez do arquivo de entrada com os comandos o que deve ser feito at que se acabe o arquivo, sendo que a cada linha lida, verificado atravs de uma comparao de string qual comando deve ser executado e com quais parmetros e ento a sua funo correspondente chamada. Organizao do Cdigo, Decises de Implementao e Detalhes Tcnicos O cdigo do programa est dividido em trs arquivos principais: Biblioteca.cpp e Biblioteca.h implementam o Tipo Abstrato de Dados enquanto o arquivo main.cpp implementa o programa principal. Todos os valores so lidos de arquivos de texto (.txt). O compilador utilizado no programa foi o Code::Blocks verso 10.1 no sistema operacional Windows XP. Para execut-lo, basta digitar main seguido dos arquivos de texto de entrada, comando e sada a partir da linha de comando ou utilizar o ambiente do Code::Blocks. Com a criao da classe foi gerado o arquivo .o.

3. Anlise de Complexidade
A anlise de complexidade ser feita em funo da varivel n que representa o nmero de obras ou reas de conhecimento.

Biblioteca:
Mtodo Particao: Esse mtodo conte um loop do while e dentro dele conte outros 2 whiles, separados (no aninhados), dessa forma, como em cada loop ser percorrido n vezes, n*n=n, a ordem de complexidade O(n). Mtodo ordlivros: Ordena obras uma funo recursiva, que, em cada chamada realiza uma operao O(1), mas como recursiva e de acordo com o mtodo so feitas n/2 chamadas, ento o mtodo O(n). Mtodo inslivro: Esse mtodo somente insere uma obra, sem realizar nenhum loop e nem nenhuma verificao ou comparao, dessa forma a ordem de complexidade O(1). Mtodo retlivro: J o mtodo retira obra no simples e precisa de um loop for aninhado com um outro loop for dentro dele, sendo que ambos percorrem a quantidade de obras, ou seja, n vezes. Dessa forma n*n=n, a ordem de complexidade O(n). Mtodo buscarlivro: Nesse mtodo temos um for que percorre todas as obras, ento se n for a quantidade de obras ento a ordem de complexidade ser O(n). Mtodo listarLivros: Nesse mtodo temos um for que percorre todas as obras, ento se n for a quantidade de obras ento a ordem de complexidade ser O(n).

No:
Mtodo Insere: O mtodo Pesquisa uma funo recursiva, que, em cada chamada realiza uma operao O(1), mas como recursiva e de acordo com o mtodo percebemos que so feitas n/2 chamadas, ento o mtodo O(n). Mtodo Pesquisa: um mtodo que bem similar ao mtodo pesquisa, dessa forma sua ordem de complexidade tambm se assemelha ao outro mtodo. Insere uma funo recursiva, que, em cada chamada realiza uma operao O(1), mas como recursiva e de acordo com o mtodo so feitas n/2 chamadas, ento o mtodo O(n). Livro: No possui mtodos

Programa Principal:
Mtodo sub: Esse mtodo somente pega um pedao de uma string uma substring, esse mtodo ento O(1). Mtodo ndex: Esse mtodo somente retorna um caracter de um string em uma posio especifica, ento O(1). Mtodo partio: Esse mtodo conte um loop do while e dentro dele conte outros 2 whiles, separados (no aninhados), dessa forma, como em cada loop ser percorrido n vezes, n*n=n, a ordem de complexidade O(n). Mtodo ordareas: Ordena reas uma funo recursiva, que, em cada chamada realiza uma operao O(1), mas como recursiva e de acordo com o mtodo so feitas n/2 chamadas, ento o mtodo O(n). Mtodo ptab: Assim como o mtodo de ordenao de reas, o mtodo de preencher tabelas tambm uma funo recursiva, que, em cada chamada realiza uma operao O(1), mas como recursiva e de acordo com o mtodo so feitas n/2 chamadas, ento o mtodo O(n). Mtodo impareas: Esse mtodo, responsvel pela impresso, chama os mtodos de ordenao e de preencher tabela, que so O(n). Em seguida, entra em um while que percorre n posies. Conclumos ento que esse mtodo O(n). main: o programa principal realiza alguns procedimentos de ordem O(1), em seguida entra em um while que le os arquivos de entrada para formar a tabela, esse while percorrido w vezes, onde w o nmero de reas de conhecimento. Dentro desse while tem um for que percorrido n vezes, onde n o nmero de obras dessa rea, ento so feitos w*n iteraes. Ento entra em um novo while que depende da entrada, depende no nmero de comandos que tem no arquivo de entrada, consideramos ento k o nmero de comandos, ou seja, o nmero de iteraes desse while, dentro desse loop so chamados alguns mtodos, dependendo do comando. No melhor caso, so chamados mtodos de O(n) no mximo, como o mtodo Pesquisa, ento como j estava em um loop, porm esse loop no dependia da quantidade de obras ou reas e sim da quantidade de comandos, consideraremos um comando por vez para fazermos a anlise de complexidade. Dessa forma, no melhor caso seria O(n) ou O(w*n), por causa do primeiro while. Porm, no pior caso, so chamados alguns mtodos, como o Partio ou o RetiraObra, que so O(n), dessa forma o mtodo teria ordem de complexidade de O(n).

4. Testes
Vrios testes foram realizados com o programa de forma a verificar o seu funcionamento. Os testes foram realizados em um Pentium Dual-Core, com 1 Gb de memria. As figuras abaixo mostram uma possvel entrada e em seguida a sada da execuo para essa entrada. Teste: Execuo a partir de linha de comando Entrada (dados.txt): Cincia da Computao 4 Projeto de Algoritmos Nvio Ziviani 1 2003 Interacao Humano-computador Simone Barbosa 35 2010 C Brian W. Kernighan 87 1989 Bancos de Dados Alberto Laender 26 2000 # Matemtica 1 Clculo I Diferencial e Integral Geraldo vila 22 2009 # Letras 1 ENSINO DE LNGUA PORTUGUESA PARA SURDOS Helosa Maria Moreira Lima Salles 2004 #

Comandos(cmd.txt): Ordtudo Imp <Letras> Busca <Letras> <2> Ord <Matemtica> Imp <Cincia da Computao>

Sada (sada.txt): Cincia da Computao Bancos de Dados C Interacao Humano-computador Projeto de Algoritmos Letras ENSINO DE LNGUA PORTUGUESA PARA SURDOS Matemtica Clculo I Diferencial e Integral Intervalo entre comandos ENSINO DE LNGUA PORTUGUESA PARA SURDOS Intervalo entre comandos Livro no encontrado. Intervalo entre comandos Clculo I Diferencial e Integral Intervalo entre comandos Projeto de Algoritmos Interacao Humano-computador C Bancos de Dados Intervalo entre comandos

Imagem:

5. Concluso
A implementao do trabalho transcorreu sem maiores problemas e os resultados ficaram dentro do esperado, o programa de uma biblioteca foi desenvolvido e no apresenta erros aparentes. A principal dificuldade encontrada foi utilizar de maneira correta a tabela Hash, juntamente com a criao de um cdigo que resolvesse o requerido pelo comando independente de como estivesse os comandos no arquivo de entrada. Outra dvida que surgiu foi a maneira correta para manipular Strings. Porm, as dvidas foram posteriormente solucionadas com a ajuda dos monitores e do Professor Luiz Chaimowicz.

6. Referncias
[1] Ziviani, N., Projeto de Algoritmos com Implementaes em Pascal e C, 2 Edio, Editora Thomson, 2004.

7. Anexos
Listagem dos programas: Biblioteca.cpp Biblioteca.h main.cpp Biblioteca.cpp: /* Biblioteca.cpp Autor: Daniel Borba Paulino Coelho e Daniel Nogueira da Silva Data: 06/12/2010 Trabalho Prtico 3 O objetivo desse trabalho implementar mtodos de ordenao e pesquisa. */ #include "Biblioteca.h" #include <iostream> #include <string> #include <string.h> #include <stdlib.h> #include <stdio.h> /* Funo auxiliar do mtodo de ordenao Quicksort, gera dois vetores a partir de um, sendo que os elementos menores que o piv ficam a esquerda e os maiores a direita. Entrada: int e, int d, int *i, int *j, TabelaLivros *T, int* tabela Sada: nenhuma */ void Biblioteca::Particao(int e, int d, int *i, int *j, TabelaLivros *T, int* tabela){ int temp;

Livro x, w; (*j) = d; (*i) = e; x = (*T)[tabela[(*i + *j)/2]]; //Escolhe o piv while (strcmp(x.titulo, (*T)[tabela[*i]].titulo) > 0){ (*i)++; } while (strcmp(x.titulo, (*T)[tabela[*j]].titulo) < 0){ (*j)--; } if (*i <= *j){ temp = tabela[*i]; tabela[*i] = tabela[*j]; tabela[*j] = temp; (*i)++; (*j)--; } while (*i <= *j){ while (strcmp(x.titulo, (*T)[tabela[*i]].titulo) > 0){ (*i)++; } while (strcmp(x.titulo, (*T)[tabela[*j]].titulo) < 0){ (*j)--; } if (*i <= *j){ temp = tabela[*i]; tabela[*i] = tabela[*j]; tabela[*j] = temp; (*j)--; (*i)++; } } } /* Mtodo para ordenar os livros atravs de Quicksort. Entrada: int Esq, int Dir, TabelaLivros *A, int* tabela Sada: nenhuma */ void Biblioteca::ordlivros(int Esq, int Dir, TabelaLivros *A, int* tabela){ int j, i; Particao(Esq, Dir, &i, &j, A, tabela); if (Esq < j){ ordlivros(Esq, j, A, tabela); } if (i < Dir){ ordlivros(i, Dir, A, tabela); } }

/* Mtodo para inserir um livro em uma determinada rea Entrada: char titulo[100], char autor[100], int cod, int ano Sada: nenhuma */ void Biblioteca::inslivro(char titulo[100], char autor[100], int cod, int ano){ strcpy(livros[qtdLivros].autor, autor); strcpy(livros[qtdLivros].titulo, titulo); livros[qtdLivros].ano = ano; livros[qtdLivros].cod = cod; TabelaOrdenada[qtdLivros] = qtdLivros; qtdLivros++; } /* Mtodo para retirar um livro de uma determinada rea Entrada: int cod, FILE* arquivo Sada: nenhuma */ void Biblioteca::retlivro(int cod, FILE* arquivo){ int i = 0; while(i < qtdLivros){ if (livros[i].cod == cod){ fprintf(arquivo, "Livro Retirado:\n%s\n%s\n%d\n%d\n", livros[i].titulo, livros[i].autor, livros[i].cod, livros[i].ano); int j = i+1; while(j<qtdLivros){ livros[i] = livros[j]; j++; } qtdLivros--; return; } i++; } } /* Mtodo para buscar um livro de uma determinada rea Entrada: int cod, FILE* arquivo Sada: nenhuma */ void Biblioteca::buscarlivro(int cod, FILE* arquivo){ for (int i = 0; i < qtdLivros; i ++){ if (livros[i].cod == cod){ fprintf(arquivo,"%s\n%s\n%d\n%d\n", livros[i].titulo, livros[i].autor, livros[i].cod, livros[i].ano); return; } }

fprintf(arquivo, "Livro no encontrado.\n"); } /* Mtodo para listar todos os livros de uma determinada rea Entrada: bool ordena, FILE* arquivo, int* tabela Sada: nenhuma */ void Biblioteca::listarLivros(bool ordena, FILE* arquivo, int* tabela){ TabelaLivros aux = livros; if (ordena){ ordlivros(0, qtdLivros - 1, &aux, tabela); } int i = 0; while(i < qtdLivros){ fprintf(arquivo, "%s", aux[tabela[i]].titulo); i++; } } /* Mtodo para inserir uma rea na rvore Entrada: int cod, FILE* arquivo Sada: nenhuma */ void No::Insere(Biblioteca area, Apontador *p, FILE* arquivo){ if (*p == 0x0){ (*p) = (Apontador)malloc(sizeof(No)); (*p)->area = area; (*p)->Esq = NULL; (*p)->Dir = NULL; return; } if (strcmp(area.chave, (*p)->area.chave) > 0){ Insere(area, &(*p)->Esq, arquivo); return; } if (strcmp(area.chave, (*p)->area.chave) < 0){ Insere(area, &(*p)->Dir, arquivo); } else{ fprintf(arquivo, "\nrea j existente.\n"); } } /* Mtodo para buscar uma rea na rvore Entrada: int cod, FILE* arquivo Sada: nenhuma */ void No::Pesquisa(Biblioteca **area, Apontador p, FILE* arquivo){

if (p == NULL){ fprintf(arquivo, "\nRegistro no encontrado."); return; } if (strcmp((*area)->chave, p->area.chave) > 0){ Pesquisa(area, p->Esq, arquivo); return; } if (strcmp((*area)->chave, p->area.chave) < 0){ Pesquisa(area, p->Dir, arquivo); } else{ (*area) = &(p->area); } } /* Construtor padro do tipo Biblioteca Entrada: nenhuma Sada: nenhuma */ Biblioteca::Biblioteca(){ } /* Construtor padro do tipo Livro Entrada: nenhuma Sada: nenhuma */ Livro::Livro(){ } Biblioteca.h: /* Biblioteca.h Autor: Daniel Borba Paulino Coelho e Daniel Nogueira da Silva Data: 06/12/2010 Trabalho Prtico 3 O objetivo desse trabalho implementar mtodos de ordenao e pesquisa. */ #ifndef BIBLIOTECA_H #define BIBLIOTECA_H #include <iostream> typedef char Chave[100]; class Livro{

public: Livro(); char titulo[100]; char autor[100]; int cod; int ano; }; typedef Livro TabelaLivros[100]; class Biblioteca{ public: Chave chave; char nome[100]; int qtdLivros; TabelaLivros livros; int TabelaOrdenada[100]; Biblioteca(); void Particao(int, int, int *, int *, TabelaLivros *, int*); void ordlivros(int , int , TabelaLivros *, int*); void listarLivros(bool , FILE* , int*); void buscarlivro(int , FILE*); void inslivro(char[100], char[100], int , int); void retlivro(int , FILE*); }; typedef struct No *Apontador; class No{ public: Biblioteca area; No *Esq, *Dir; void Pesquisa(Biblioteca **, Apontador , FILE*); void Insere(Biblioteca , Apontador *, FILE*); }; #endif main.cpp: /* main.cpp Autor: Daniel Borba Paulino Coelho e Daniel Nogueira da Silva Data: 06/12/2010 Trabalho Prtico 3 O objetivo desse trabalho implementar mtodos de ordenao e pesquisa. */ #include "Biblioteca.h"

#include <iostream> #include <string> #include <string.h> #include <stdlib.h> #include <stdio.h> typedef Biblioteca TabelaAreas[10]; /* Funo auxiliar do mtodo de ordenao Quicksort, gera dois vetores a partir de um, sendo que os elementos menores que o piv ficam a esquerda e os maiores a direita. Entrada: int Esq, int Dir, int *i, int *j, TabelaAreas *A Sada: nenhuma */ void Particao(int Esq, int Dir, int *i, int *j, TabelaAreas *A){ Biblioteca x, w; (*j) = Dir; (*i) = Esq; x = (*A)[(*i + *j)/2]; while (strcmp(x.chave, (*A)[*i].chave) > 0){ (*i)++; } while (strcmp(x.chave, (*A)[*j].chave) < 0){ (*j)--; } if (*i <= *j){ w = (*A)[*i]; (*A)[*i] = (*A)[*j]; (*A)[*j] = w; (*i)++; (*j)--; } while(*i<=*j){ while (strcmp(x.chave, (*A)[*j].chave) < 0){ (*j)--; } while (strcmp(x.chave, (*A)[*i].chave) > 0){ (*i)++; } if (*i <= *j){ w = (*A)[*i]; (*A)[*i] = (*A)[*j]; (*A)[*j] = w; (*j)--; (*i)++; } } } /*

Mtodo para ordenar as reas de conhecimento atravs de Quicksort. Entrada: int Esq, int Dir, TabelaAreas *A Sada: nenhuma */ void ordareas (int Esq, int Dir, TabelaAreas *A){ int i, j; Particao(Esq, Dir, &i, &j, A); if (Esq < j) ordareas(Esq, j, A); if (i < Dir) ordareas(i, Dir, A); } /* Mtodo que retorna a posio de um caractere em uma string Entrada: char* origem, char caracter, int inicio Sada: int indice */ int index(char* origem, char caracter, int inicio){ int indice = strchr(&origem[inicio], caracter) - &origem[inicio]; return indice; } /* Mtodo para pesquisar textos dentro de uma string. Entrada: char* destino, char* origem, int inicio, int tam Sada: nenhuma */ void sub(char* destino, char* origem, int inicio, int tam){ strncpy(destino, &origem[inicio], tam); destino[tam] = '\0'; } /* Mtodo que gera uma tabela de reas. Entrada: TabelaAreas *areas, int *i, Apontador arvore Sada: nenhuma */ void ptab (TabelaAreas *areas, int *i, Apontador arvore){ if (arvore == NULL){ return; } (*areas)[(*i)] = arvore->area; (*i)++; ptab(areas, i, arvore->Esq); ptab(areas, i, arvore->Dir); } /* Mtodo para imprimir as reas de conhecimento e seus respectivos livros Entrada: Apontador arvore, bool ordena, FILE* arquivo Sada: nenhuma

*/ void impareas(Apontador arvore, bool ordena, FILE* arquivo){ int i = 0; TabelaAreas *areas = (TabelaAreas*)malloc(sizeof(TabelaAreas)); ptab(areas, &i, arvore); if (ordena == true){ ordareas(0, i -1, areas); } int j = 0; while(j < i){ fprintf(arquivo, "%s", ((*areas)[j]).nome); (*areas)[j].listarLivros(ordena, arquivo, ((*areas)[j]).TabelaOrdenada); j++; } } /* Funo principal do programa Entrada: int argcv, char *argv[] Sada: 0 */ int main(int argcv, char *argv[]){ int qtdLivros, cod, ano, qtdInsercoes = 0; char opcao[100], aux[5]; char cmd[100], nomBiblioteca[100], titulo[100], autor[100]; No arvore; Apontador *p = (Apontador*)malloc(sizeof(Apontador)); Biblioteca *area = (Biblioteca*)malloc(sizeof(Biblioteca)); *p = NULL; FILE* entrada = fopen(argv[1],"r"); FILE* comandos = fopen(argv[2],"r"); FILE* saida = fopen(argv[3], "w"); strcpy(nomBiblioteca, ""); int j = 0; while( fgets(nomBiblioteca, sizeof(nomBiblioteca), entrada) != NULL){ fscanf(entrada, "%d", &qtdLivros); strcpy(area->nome, nomBiblioteca); area->qtdLivros = 0; strcpy(area->chave, nomBiblioteca); j = 0; while(j<qtdLivros){ fgets(titulo, sizeof(titulo), entrada); fgets(titulo, sizeof(titulo), entrada); fgets(autor, sizeof(autor), entrada); fscanf(entrada, "%d", &cod); fscanf(entrada, "%d", &ano); area->inslivro(titulo, autor, cod, ano); j++; } arvore.Insere((*area), p, saida);

fgets(nomBiblioteca, sizeof(nomBiblioteca), entrada); fgets(nomBiblioteca, sizeof(nomBiblioteca), entrada); strcpy(nomBiblioteca, ""); } int inicio, fim; while(fgets(cmd, sizeof(cmd), comandos) != NULL){ inicio = 0; fim = index(cmd, ' ', inicio); if (fim < 0){ strcpy(opcao, cmd); } else{ sub(opcao, cmd, inicio, fim); } if (strcmp(opcao, "Imp") == 0){ inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(nomBiblioteca, cmd, inicio, fim); strcat(nomBiblioteca, "\n"); //Insere terminador. strcpy(area->chave, nomBiblioteca); arvore.Pesquisa(&area, (*p), saida); area->listarLivros(false, saida, area->TabelaOrdenada); } else if (strcmp(opcao, "Ord") == 0){ inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(nomBiblioteca, cmd, inicio, fim); strcat(nomBiblioteca, "\n"); //Insere terminador. strcpy(area->chave, nomBiblioteca); arvore.Pesquisa(&area, (*p), saida); area->listarLivros(true, saida, area->TabelaOrdenada); } else if (strcmp(opcao, "Imptudo\n") == 0 || strcmp(opcao, "Imptudo") == 0){ impareas((*p), false, saida); } else if (strcmp(opcao, "Ordtudo\n") == 0 || strcmp(opcao, "Ordtudo") == 0){ impareas((*p), true, saida); } else if (strcmp(opcao, "Busca") == 0){ inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(nomBiblioteca, cmd, inicio, fim); strcpy(area->chave, nomBiblioteca); inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(aux, cmd, inicio, fim); cod = atoi(aux); arvore.Pesquisa(&area, (*p), saida); area->buscarlivro(cod, saida); }

else if (strcmp(opcao, "Insere") == 0){ if (qtdInsercoes >= 5){ fprintf(saida, "No possvel inserir mais livros nesta rea."); } else{ qtdInsercoes++; inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(nomBiblioteca, cmd, inicio, fim); strcpy(area->chave, nomBiblioteca); inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, ',', inicio); sub(titulo, cmd, inicio, fim); inicio = inicio + fim + 1; fim = index(cmd, ',', inicio); sub(autor, cmd, inicio, fim); inicio = inicio + fim + 1; fim = index(cmd, ',', inicio); sub(aux, cmd, inicio, fim); cod = atoi(aux); inicio = inicio + fim + 1; fim = index(cmd, '>', inicio); sub(aux, cmd, inicio, fim); ano = atoi(aux); arvore.Pesquisa(&area, (*p), saida); area->inslivro(titulo, autor, cod, ano); fprintf(saida, "Livro inserido:\n%s\n%s\n%d\n%d\n", titulo, autor, cod, ano); } } else if (strcmp(opcao, "Retira") == 0){ inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(nomBiblioteca, cmd, inicio, fim); strcpy(area->chave, nomBiblioteca); inicio = index(cmd, '<', fim) + fim + 1; fim = index(cmd, '>', inicio); sub(aux, cmd, inicio, fim); cod = atoi(aux); arvore.Pesquisa(&area, (*p), saida); area->retlivro(cod, saida); } fprintf(saida, "\nIntervalo entre comandos\n\n"); } printf("\nArquivo saida.txt gerado com sucesso!\n"); fclose(comandos); fclose(entrada); fclose(saida); return 0; }

Potrebbero piacerti anche