ESTUDO DE CASO I
Um sistema de gestão patrimonial permite relacionar todos os bens de uma organização a fim de garantir sua integridade patrimonial. Esse tipo de sistema tem como finalidade automatizar o controle de todos os bens permanentes de uma organização.
TAREFA
Desenvolver em linguagem C, seguindo estrutura do código fonte do anexo I, um sistema para gerenciar o patrimônio de computadores de uma organização. Além disso, redigir um texto descrevendo sucintamente (máximo de 300 palavras) quais as técnicas das disciplinas do primeiro ano do curso foram utilizadas neste estudo de caso.
ENTRADA
Consiste em um arquivo texto com o nome entrada.txt contendo uma linguagem de marcação textual descrita no anexo II. No anexo III há um exemplo de arquivo de entrada.
SAÍDA
A saída consiste na emissão de relatórios, descritos a seguir:
Relatório 1: arquivo texto com o nome saida1.txt contendo somente o número de patrimônio dos computadores (um por linha) que satisfaçam à condição de memória RAM inferior a um valor informado pelo usuário.
Relatório 2: arquivo texto com o nome saida2.txt contendo somente o número de patrimônio dos computadores (um por linha) que satisfaçam à condição de possuírem um aplicativo com uma determinada versão, dados informados pelo usuário.
ANEXO I
#include<stdio.h> #include<stdlib.h> #include<string.h> #define TAM_STRING 30 FILE *entrada; typedef struct { int dia; int mes; int ano; } data;typedef struct opcionais_hardware {
char nome[TAM_STRING]; char descricao[TAM_STRING*2]; struct opcionais_hardware *proximo; } opcionais_hardware;
typedef struct aplicativos {
char nome[TAM_STRING]; char versao[TAM_STRING/2]; data data_instalacao;
struct aplicativos *proximo; } aplicativos; typedef struct { char fabricante[TAM_STRING/2]; char modelo[TAM_STRING/2]; float clock; } processador; typedef struct { processador cpu; int memoria; int hd; opcionais_hardware *op_hw; } hardware;
typedef struct { char nome[TAM_STRING]; char versao[TAM_STRING/2]; data data_instalacao; char senha[TAM_STRING]; } sistema_operacional; typedef struct { sistema_operacional so; aplicativos *app; } software; typedef struct { char setor[TAM_STRING]; char responsavel[TAM_STRING]; int patrimonio; } logistica;
typedef struct computador {
hardware hw; software sw; logistica logt; } computador;
typedef struct no_computador {
computador *pc;
struct no_computador *proximo; } no_computador;
typedef struct lista {
no_computador *inicio; no_computador *fim; } lista;
lista *lerArquivo(char endereco[]) { lista *l=NULL; //implemente aqui return l; }
void escreverSaida1(lista *l,char endereco[],int memoria) { //implemente aqui }
void escreverSaida2(lista *l,char endereco[],char nome[],char versao[]) { //implemente aqui } void imprimir(lista *l) { no_computador *aux=l->inicio; while (aux!=NULL) { printf("fabricante: %s\n",aux->pc->hw.cpu.fabricante); printf("modelo: %s\n",aux->pc->hw.cpu.modelo); printf("clock: %f\n",aux->pc->hw.cpu.clock); printf("memoria: %d\n",aux->pc->hw.memoria); printf("hd: %d\n",aux->pc->hw.hd); opcionais_hardware *aux1=aux->pc->hw.op_hw; while (aux1!=NULL) { printf("opcional: %s %s\n",aux1->nome,aux1->descricao); aux1=aux1->proximo; } printf("s.o.: %s\n",aux->pc->sw.so.nome); printf("versao: %s\n",aux->pc->sw.so.versao); printf("instalacao: %d/%d/%d\n",aux->pc->sw.so.data_instalacao.dia,aux->pc->sw.so.data_instalacao.mes,aux->pc->sw.so.data_instalacao.ano); printf("senha: %s\n",aux->pc->sw.so.senha); aplicativos *aux2=aux->pc->sw.app; while (aux2!=NULL) { printf("aplicativos: %s %s %d/%d/%d\n",aux2->nome,aux2->versao,aux2->data_instalacao.dia,aux2->data_instalacao.mes,aux2->data_instalacao.ano); aux2=aux2->proximo; } printf("setor: %s\n",aux->pc->logt.setor); printf("responsavel: %s\n",aux->pc->logt.responsavel); printf("patrimonio: %d\n\n",aux->pc->logt.patrimonio); aux=aux->proximo; } }
void menu() {
system("cls");
printf("\n |---|\n"); printf(" | |\n");
printf(" | UNIVERSIDADE DO TOCANTINS |\n"); printf(" | |\n");
printf(" |---|\n"); printf(" | |\n");
printf(" | <1> Abrir \"entrada.txt\" |\n"); printf(" | <2> Imprimir |\n");
printf(" | <3> Relatorio 1 (\"saida1.txt\") |\n"); printf(" | <4> Relatorio 2 (\"saida2.txt\") |\n"); printf(" | <5> Sair |\n"); printf(" | |\n"); printf(" |---|\n\n"); printf("\t\tOpcao: "); } int main() { lista *l=NULL; char opcao; do { menu(); fflush(stdin); opcao=getchar(); switch(opcao) { case '1': l=lerArquivo("entrada.txt"); system("cls");
printf("\n\tArquivo aberto com sucesso!\n\n\n"); system("pause"); break; case '2': system("cls"); if (l!=NULL) imprimir(l); else printf("\n\tLista vazia!\n\n\n"); system("pause"); break; case '3': system("cls"); if (l!=NULL)
{
int memoria;
printf("\n\n\tMemoria menor que : "); scanf("%d",&memoria);
escreverSaida1(l,"saida1.txt",memoria);
printf("\n\tRelatorio 1 emitido com sucesso!\n\n\n"); }
else
printf("\n\tNao foi possivel emitir relatorio 1!\n\n\n"); system("pause"); break; case '4': system("cls"); if (l!=NULL) { char nome[TAM_STRING]; char versao[TAM_STRING/2]; printf("\n\n\tNome : "); fflush(stdin); fgets(nome,TAM_STRING,stdin); nome[strlen(nome)-1]='\0'; printf("\n\tVersao : "); fflush(stdin); fgets(versao,TAM_STRING/2,stdin); versao[strlen(versao)-1]='\0'; escreverSaida2(l,"saida2.txt",nome,versao);
printf("\n\tRelatorio 2 emitido com sucesso!\n\n\n"); }
else
printf("\n\tNao foi possivel emitir relatorio 2!\n\n\n"); system("pause"); break; default: if (opcao!='5') continue; } } while(opcao!='5'); }
ANEXO II
Descrição do arquivo de entrada
O arquivo de entrada organiza os dados com uso de tag de formatação (marcação). Cada tag é delimitada pelos sinais “<” para abertura da tag e “>” para seu fechamento. Para toda tag de abertura obrigatoriamente deve existir uma tag de fechamento. A tag de fechamento é caracterizada com o uso do sinal “/” logo após a abertura da tag como, por exemplo, “</ ... >”.
Entre cada tag de abertura e fechamento há a informação referente ao que representa a tag, como por exemplo, “<TAG>Informacao</TAG>”.
No arquivo de entrada há uma tag principal que representa um computador, ou seja, a tag “<computador>” que é fechada pela marcação “</computador>”. Essa marcação principal possui três informações principais que caracterizam um computador, que são: hardware, software e logística.
A caracterização do hardware do computador é descrita a seguir:
A marcação processador possui os campos para sua caracterização, como fabricante, onde deve delimitar a informação do nome do fabricante do processador do computador em questão (por exemplo: Intel). Também possui a marcação que delimita o modelo do processador (por exemplo: Core 2 Duo). E, por fim, a marcação da informação de freqüência do clock do processador (por exemplo: 2.5).
A tag memoria é destinada à delimitação da informação referente à quantidade de memória RAM em megabytes existente no computador (por exemplo: 2048).
A marcação hd delimita a informação referente à quantidade de memória de armazenamento em gigabytes existente no computador (por exemplo: 250).
A marcação opcionais_hardware possui dois campos, uma tag nome com a função de delimitar o nome de um dispositivo adicional existente no computador (por exemplo: Placa de video) e o campo descricao que contém a descrição do dispositivo (por
exemplo: NVIDIA 9600 GT). Um mesmo computador pode possuir quantas marcações opcionais_hardware forem necessárias, inclusive nenhuma.
A caracterização do software instalado no computador é descrita a seguir:
O campo sistema_operacional possui as marcações nome, que indica o nome do Sistema Operacional instalado no computador (por exemplo: Windows); a tag versao delimita a versão do sistema operacional instalado (por exemplo: Vista), o campo data_instalacao contém o dia/mês/ano da instalação do computador e, por fim, o campo senha que expressa a senha do usuário administrador do sistema operacional instalado.
A marcação aplicativos é destinada para indicar os aplicativos instalados no computador. Um computador pode possuir nenhum, um ou vários aplicativos instalados. Cada aplicativo deve possuir um nome, campo nome (por exemplo: Br.office); a versão do software através do campo versao (por exemplo: 3.0); e a data de instalação do aplicativo, através do campo data_instalacao que representa dia/mês/ano.
A caracterização do local onde o computador está sendo utilizado e seu responsável é realizada através do campo logistica, que por sua vez possui as tag setor, que informa de fato o setor/departamento da organização onde o computador está alocado; o campo responsavel que delimita o nome do responsável pelo equipamento (pessoa física). E, por fim, o campo patrimonio que informa o identificador do patrimônio do computador (um número inteiro).
ANEXO III
<computador> <hardware> <processador> <fabricante>Intel</fabricante> <modelo>Core 2 Duo</modelo> <clock>2.5</clock> </processador> <memoria>2048</memoria> <hd>250</hd> <opcionais> <nome>Placa de video</nome> <descricao>NVIDIA 9600 GT</descricao> </opcionais> <opcionais> <nome>Placa de captura</nome> <descricao>Pinacle</descricao> </opcionais> <opcionais> <nome>Webcam</nome> <descricao>Microsoft 1.3 MP</descricao> </opcionais> </hardware> <software> <sistema_operacional> <nome>Microsoft Windows</nome> <versao>Vista</versao> <data_instalacao> <dia>16</dia> <mes>10</mes> <ano>2008</ano> </data_instalacao> <senha>123mudar</senha> </sistema_operacional> <aplicativos> <nome>Br.office</nome> <versao>3.0</versao> <data_instalacao> <dia>16</dia> <mes>10</mes> <ano>2008</ano></data_instalacao> </aplicativos> <aplicativos> <nome>Adobe Reader</nome> <versao>9.0</versao> <data_instalacao> <dia>17</dia> <mes>10</mes> <ano>2008</ano> </data_instalacao> </aplicativos> </software> <logistica> <setor>DTIC</setor> <responsavel>Joana Maria</responsavel> <patrimonio>20333</patrimonio> </logistica> </computador>