\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}
\usepackage{pifont}
\setlength{\textheight}{8.5in}
\setlength{\textwidth}{6.5in}
\setlength{\evensidemargin}{0pt}
\setlength{\oddsidemargin}{0pt}
\setlength{\topmargin}{-30pt}

\def\risonho{{$\bigcirc\!\!\!\!\!\lower.02cm\hbox{\vbox{\offinterlineskip\hbox{$\>\!..$}\vskip.07cm\hbox{$\scriptscriptstyle\smile$}}}$}}
\def\tristonho{{$\bigcirc\!\!\!\!\!\lower.02cm\hbox{\vbox{\offinterlineskip\hbox{$\>\!..$}\vskip.07cm\hbox{$\scriptscriptstyle\frown$}}}$}}


\begin{document}
\noindent
{\footnotesize {\sc MAC--IME--USP}} \hfill {\footnotesize {\sc Carlos Eduardo Ferreira}}

\vspace{-1mm}
\hfill {\footnotesize {\sc Sala 297A Tel.: 818 6140}}

\vspace{-1mm}
\hfill {\footnotesize {\sc e-mail} cef@ime.usp.br}

\vspace{1cm}

\begin{center}
{\large\bf MAC 323 -- Estruturas de Dados}
\end{center}

\begin{center}
{\bf Primeiro semestre de 1998}
\end{center}

\begin{center}
{\large  Exercício-Programa 3 -- Entrega: {\bf 15 de maio}}

\vspace{0.3cm}
SGBV : Sistema de Gerenciamento de Biblioteca Virtual
\end{center}

Uma biblioteca virtual tem o funcionamento muito parecido com uma biblioteca
real. Os autores disponibilizam uma certa quantidade de licenças de suas obras
(como se fossem exemplares do livro) que podem ser emprestadas ao mesmo
tempo. A grande diferença é que os empréstimos serão feitos pela rede, e
portanto o desempenho é imprescindível. Uma consulta a uma base de dados
tornaria o sistema extremamente lento, e portanto inviável. Assim, nesta
biblioteca os catálogos de usuários e obras (que podem ser programas 
executáveis, por exemplo, e não
necessariamente livros) estarão armazenadas na memória. 

Os objetos que trataremos são de dois tipos: usuários e obras. Os usuários
poderão ser inseridos ou removidos do cadastro da biblioteca. Cada usuário tem
um nome, um número de identificação (seu NUSP), e uma qualificação: aluno ou
professor (o segundo tendo muito mais regalias que o primeiro, é 
claro \risonho \ \ ). O mesmo
aluno poderá ficar com até três obras do acervo ao mesmo tempo (regra
absurda, vocês não acham?) e um professor pode ter tantos quantos
quiser. Caso um aluno atrase a devolução de uma obra, deverá ser suspenso por
uma semana. Se for um professor, o sistema deve gerar uma carta simpática que
será enviada ao mesmo para, quando dispuser de algum tempo, visitar o site da
biblioteca, tomar um cafezinho  \risonho \ \ e devolver a obra atrasada, 
ou mesmo renovar seu empréstimo... 
O pessoal da administração deseja que haja rotinas
para verificar quais obras estão em poder de um usuário, se ele está ou não
suspenso, quais estão atrasadas e quando os usuários devem devolvê-las. 
Eles também
querem saber quais usuários estão suspensos e quais estão de posse de obras
cuja devolução está atrasada. 

As obras contêm um nome e código de identificação (ex.: QA 845 F383c) de até
15 caracteres. Considere que várias licenças de uma mesma obra têm
códigos diferentes (diferenciados por uma extensão no código, como por
exemplo, 
``e1''). As
obras poderão ser incluídas no acervo. Além disso os usuários poderão
fazer empréstimos, devoluções ou mesmo fazer reservas (caso a obra requerida
não esteja disponível). Um aluno pode permanecer com uma obra durante uma
semana, enquanto um professor pode ficar durante um mês.  
Lembre que, quando um usuário deseja retirar uma obra
com várias licenças, qualquer uma delas pode ser emprestada. 
É importante para a administração que seja possível
saber se uma obra está ou não disponível, quem é o usuário que está com ela,
se há ou não reservas sobre ela e quando é a próxima data de devolução para o
acervo. Eles também desejam saber quais obras estão reservadas
(algumas podem ter mais de uma reserva!!), quais estão com a devolução
atrasada e quais estão emprestadas. 

Você também deverá implementar rotinas de inicialização de um
dia, a ser executada pelos administradores do sistema no início do
mesmo. Outra rotina importante é a que grava as informações do cadastro em um
arquivo, para posterior leitura (pela rotina de inicialização). 
A operação de inicialização deve também pedir ao
administrador a data corrente (isso poderia ser pego do sistema na aplicação
real) a fim de verificar se há novos usuários a serem suspensos, algumas obras
estão atrasadas, algumas suspensões já devem ser canceladas, etc. 

Sua implementação deve ser a mais econômica possível, com uma única célula da
lista para conter as informações de um usuário e uma única célula com as
informações de uma obra. Você deverá manter diversas 
{\bf listas duplamente ligadas com cabeça de lista} para:
\begin{itemize}
\item os usuários, 
\item os usuários suspensos, 
\item os usuários atrasados, 
\item as obras de posse de um usuário, 
\item as obras do acervo, 
\item as obras emprestadas, 
\item as reservas, 
\item as obras atrasadas. 
\end{itemize}
Note que, da forma descrita acima, a busca de um usuário ou de uma obra 
ficaria muito lenta. Para
resolver este problema, manteremos também um vetor ordenado com os códigos 
das obras e
um vetor ordenado com os NUSP dos usuários, onde poderemos fazer buscas
eficientes. Na posição correspondente a esse objeto temos um ponteiro para a
célula que contém suas informações. 

Como sempre, seu programa deve ser claro, bem documentado e endentado. Todos
esses aspectos serão levado em conta na correção. Para facilitar seus testes
você poderá permitir a entrada de dados por arquivo (usando a rotina de
inicialização). Sugiro que vocês se
organizem para ter um bom número de obras e usuários cadastrados no
sistema. As telas para utilização do sistema devem ser facilmente
utilizáveis. 
\end{document}