Trabalho final em C

iNf0_n00b

Membro
Viva... Estou aqui com problemas com o meu trabalho final de programação... Não sei por onde lhe hei-de pegar já perdi tempo infindos à volta disto e sempre que vou fazer algo, parece-me que deveria ter feito qualquer coisa antes...

O que eu pedia era um empurrãozito, uma luz, uma direcção, algo a que eu me podesse agarrar para começar a fazer o dito cujo...

Obrigado



1. Descrição Genérica do Problema


O programa a desenvolver consiste num sistema que simule um site web de
armazenamento e partilha de ficheiros. Os utilizadores deste sistema podem ser de
três tipos:

• BETA: usam o sistema de forma gratuita, mas com algumas limitações;
• PRO: pagam pelo serviço, dispondo de mais funcionalidades e espaço para
armazenamento;
• ADMINISTRADORES: são responsáveis pela gestão do sistema. Enquanto os
utilizadores BETA e PRO usam o sistema para criar directorias e fazer o upload
de ficheiros, os ADMINISTRADORES realizam outro tipo de tarefas, como por
exemplo, eliminar utilizadores que não cumpram as regras e criar, alterar ou
apagar grupos temáticos para onde os utilizadores podem enviar os seus
ficheiros tornando-os visíveis a terceiros.

O armazenamento (upload) dos ficheiros faz-se obrigatoriamente para dentro de
directorias previamente criadas.

Os utilizadores BETA têm as seguintes restrições:
  1. número máximo de directorias: MAX_DIR (por exemplo, 3)
  2. número máximo de ficheiros que podem armazenar: MAX_FICH (por exemplo,10)
  3. espaço de armazenamento limitado: MAX_ESPACO (por exemplo, 10 Mb)

Ao fazer upload de um ficheiro, é necessário testar se ainda há espaço disponível para
ele. Ou seja, a restrição 2 pode não ter sido atingida, mas não ser possível armazenar
o ficheiro devido à restrição 3. Quando as restrições 2 ou 3 forem atingidas, um
utilizador BETA pode fazer continuar a fazer o upload de ficheiros. No entanto, o
sistema esconderá os ficheiros mais antigos até que as restrições deixem de ser
violadas. Este princípio não se aplica às directorias. Caso um utilizador BETA decida
pagar a anuidade e passar a PRO, todos os ficheiros escondidos ficarão disponíveis,
passando a funcionar sem restrições enquanto o seu pagamento continuar em dia.
Um utilizador PRO não tem quaisquer limitações de espaço ou número máximo de
ficheiros que pode armazenar. No entanto, se não renovar a sua assinatura, deve ser
transferido automaticamente para BETA, passando a ter as restrições deste tipo de
utilizadores. Os eventuais ficheiros e directorias em excesso não são eliminados.
Devem apenas ficar escondidos e, caso ele decida mais tarde renovar a assinatura,
passarão de novo a estar visíveis e acessíveis.

As tarefas dos ADMINISTRADORES são diferentes: devem gerir os utilizadores BETA e
PRO e administrar GRUPOS. Na gestão dos utilizadores incluem-se tarefas de alteração
ou eliminação de um utilizador (consultar detalhes na secção 3.1).
Relativamente aos grupos: os grupos são espaços (por exemplo temáticos) para onde
os utilizadores BETA e PRO podem enviar os seus ficheiros, partilhando-os assim com
toda a comunidade. Na versão base do programa, todos os utilizadores BETA e PRO
podem ver todos os grupos e respectivos ficheiros. Como extra, pretende-se que os
alunos implementem o acesso aos grupos apenas a um número restrito de utilizadores
(ver mais detalhes na secção 4.).
Um administrador pode criar grupos e visualizar todos os grupos existentes. Só deve
poder alterar, bloquear e apagar grupos que tenham sido criados por si. Bloquear um
grupo consiste em não permitir que sejam enviados mais ficheiros para lá. Caso um
ADMINISTRADOR deixe de existir no sistema, os grupos por ele criados devem ser
apagados automaticamente.



2. Estruturas de dados

Todas as operações do programa são executadas sobre informação armazenada em
memória. Sendo assim, quando o programa é iniciado, toda a informação é carregada
para várias estruturas de dados. Quando o programa termina, os ficheiros de dados
devem ser actualizados.
As estruturas de dados manipuladas pelo programa devem estar organizadas da forma
descritas nas secções seguintes (tenha em atenção que as estruturas que a seguir se
descrevem não estão necessariamente completas. Se considerar necessário pode
acrescentar/alterar alguns campos ou criar estruturas alternativas).

2.1. UTILIZADORES
Os dados referentes aos utilizadores devem ser guardados em estruturas. Os campos
comuns aos três tipos de utilizadores são:
  • nome do utilizador
  • nickname (deve ser único e, caso já exista, deve ser pedido outro diferente)
  • password
  • data de registo no sistema
Para os utilizadores BETA é necessário considerar ainda a seguinte informação:
  • número de directorias que já criou
  • número de ficheiros armazenados
  • número total de bytes já carregados no sistema

Para os utilizadores PRO é necessário considerar ainda a seguinte informação:
  • número de directorias que já criou
  • número de ficheiros armazenados
  • número total de bytes já carregados no sistema
  • o número do cartão de crédito usado para o pagamento
  • o tipo de subscrição: por exemplo 0-MENSAL, 1-SEMESTRAL, 2-ANUAL
Para os utilizadores ADMINISTRADORES é necessário considerar ainda seguinte
informação:
  • número de grupos já criados
Sugere-se que utilize uma union para armazenar a informação relativa aos diferentes
tipos de utilizadores.


2.2 DIRECTORIAS

Os dados referentes a uma directoria devem ser guardados numa estrutura contendo
os seguintes campos:
  1. Nome da directoria
  2. Número de ficheiros contidos na directoria.

2.3 FICHEIROS
Os dados referentes a um ficheiro devem ser guardados numa estrutura contendo os
seguintes campos:
  1. nome
  2. identificador único
  3. descrição
  4. tamanho que ocupa em disco (em bytes)
  5. data em que foi criado
Quando um utilizador selecciona a opção de “Upload ficheiro”, deve-lhe ser pedido o
nome do ficheiro (ou caminho completo, caso necessário). Os campos nome, descrição
e data devem ser preenchidos com a informação gravada no próprio ficheiro. O campo
id deve ser gerado pelo sistema de forma a garantir que não há identificadores
repetidos para o mesmo utilizador. O tamanho do ficheiro deve ser determinado pelo
próprio programa.
São fornecidos em anexo (disponibilizados na pasta TRABALHO_PRATICO/FICHEIROS)
um conjunto de ficheiros binários que devem ser usados no teste e validação desta
funcionalidade. Todos os ficheiros binários disponibilizados armazenam informação de
acordo com a seguinte organização:
  • no início existe 1 estrutura do tipo Ficheiro contendo os dados necessários para a gestão do programa
  • a seguir à estrutura estão armazenados vários bytes com informação irrelevante para o programa (o número de bytes varia de ficheiro para ficheiro).

typedef struct{
int id; //(*)
char nome_ficheiro[100];
char descricao[400];
long int tamanho; (**)
Data criado; //(***)
}Ficheiro;

(*) Este identificador único está colocado a zero em todos os ficheiros
fornecidos. Os alunos devem implementar um sistema que faça a gestão
deste identificador, actualizando-o sempre que o ficheiro é carregado,
garantindo que não há identificadores repetidos.
(**)Nos ficheiros fornecidos, o campo tamanho foi colocado a zero e deve
ser actualizado sempre que se faz o upload do ficheiro, com o número de
bytes que o ficheiro ocupa em disco.
(***) A estrutura Data é uma estrutura contendo três inteiros {dia, mes,
ano} correspondendo ao dia, mês e ano em que foi criado

Um utilizador pode fazer o upload de um ficheiro já existente no sistema. O programa
deve, no entanto, criar um identificador único para cada cópia do ficheiro que sirva
para saber qual o que se pretende eliminar ou enviar para um grupo, por exemplo.


2.4 GRUPOS
Os dados referentes a um grupo devem ser guardados numa estrutura contendo os
seguintes campos:
  1. nome do grupo
  2. nickname do administrador que o criou
  3. data em que foi criado
  4. número de ficheiros que possui

2.5 MEMÓRIA DINÂMICA
Durante a execução do programa a informação deve ser armazenada em estruturas
dinâmicas com a seguinte estrutura:

  1. Os utilizadores devem ser armazenados em 3 listas ligadas referenciadas por 3 ponteiros que estão armazenados num vector de 3 posições:
  • Da primeira posição do vector, sai um ponteiro para uma lista de utilizadores BETA, da segunda posição do vector sai um ponteiro para uma lista de utilizadores PRO e da terceira posição uma lista para ADMINISTRADORES.
  • De cada nó referente aos utilizadores BETA e PRO, sai um ponteiro que guarda o início de uma sub-lista contendo informação sobre as DIRECTORIAS criadas por esse utilizador.
  • De cada nó referente a uma directoria, sai um ponteiro que guarda o início de uma terceira sub-lista contendo informação sobre todos os FICHEIROS colocados na directoria em causa.
  1. 2. Os grupos devem ser armazenados numa lista ligada:
  • Em cada nó desta lista principal, deve existir um ponteiro que aponta para o início de uma lista contendo informação sobre os ficheiros partilhados pelos utilizadores.
  • Quando um grupo é bloqueado pelo administrador que o criou, o último nó da sub-lista de ficheiros deve ser colocado a apontar para o início da lista (i.e., deve formar uma lista circular). Num grupo bloqueado não se podem colocar mais ficheiros.
Imediatamente antes do programa terminar a sua execução, toda a informação deve ser actualizada no(s) ficheiro(s) de dados respectivo(s).



3. Funcionamento do programa


Quando o programa é iniciado toda a informação associada aos utilizadores
(directorias, ficheiros, ...) e aos grupos existentes deve ser transferida dos ficheiros de
dados para as estruturas dinâmicas. Deve ser prevista a possibilidade de ainda não
existir nenhuma informação disponível.
Antes do menu inicial, deve aparecer no monitor um resumo da informação lida:
número de utilizadores (por tipo), número total de ficheiros carregados pelos
utilizadores e o número de grupos já criados.
Depois disso, o programa deverá apresentar um menu inicial com as seguintes
opções:
  1. LOGIN
  2. EFECTUAR REGISTO
  3. SAIR
Na opção 1 são solicitados o login e a password ao utilizador. Enquanto o utilizador
não introduzir dados válidos (login e password correctos) deve voltar-se ao menu
inicial.
A opção 2. permite fazer o registo de um utilizador novo. Consoante o tipo do novo
utilizador, deve ser obtida toda a informação relevante para efectuar o registo:
  • No caso de um utilizador PRO, para além do nome, nickname, password, devem ser pedidos os dados do cartão de crédito e o tipo de pagamento a efectuar (mensal, semestral, …)
  • O registo de um ADMINISTRADOR deve ser validado através de um código alfanumérico.
A opção 3 termina o programa.

Quando se entra no sistema, quer com LOGIN, quer com REGISTO, deve surgir o
menu apropriado ao tipo de utilizador, de acordo com as funcionalidades que possui.
Essas funcionalidades estão detalhadas de seguida.

3.1. Descrição das funcionalidades:

PARA UTILIZADORES BETA E PRO:

1. DADOS PESSOAIS – Mostra um sub-menu com as seguintes opções:
1.1. Mostrar dados actuais – Permite visualizar os dados do utilizador actual.
1.2. Alterar nickname – Permite alterar o nickname.
1.3. Alterar password – Permite alterar a password.
1.4. Apagar conta – permite excluir-se do sistema, apagando toda a sua
informação.
1.5. Alterar tipo – Permite que um utilizador passe de BETA a PRO mediante
o pagamento da respectiva anuidade.

2. DIRECTORIAS – Mostra um sub-menu com as seguintes opções:
2.1 Visualizar directorias – Permite visualizar as directorias do utilizador.
2.2 Criar directoria – Permite criar uma nova directoria (caso possa).
2.3 Eliminar directoria – Permite eliminar uma directoria, bem como todos
os ficheiros nela incluídos.
2.4 Alterar directoria – Permite alterar o nome de uma directoria. Não
deve permitir criar directorias com nomes repetidos.

3. FICHEIROS – Mostra um sub-menu com as seguintes opções:
3.1 Visualizar ficheiros – Permite visualizar os ficheiros de uma
determinada directoria.
3.2 Upload de ficheiro – Permite carregar o ficheiro para dentro de uma
directoria previamente seleccionada.
3.3 Apagar ficheiro - Permite apagar um ficheiro de uma determinada
directoria.
Programação I – 2006/07
Trabalho Prático 8
3.4 Ver grupos - Permite ver todos os grupos existentes, incluindo o nº de
ficheiros que cada um possui e a informação se está bloqueado ou não.
3.5 Enviar ficheiro para grupo - Permite enviar um ficheiro para um
grupo existente. Não é possível enviar ficheiros para grupos bloqueados.

O envio de um ficheiro para um grupo consiste em fazer uma cópia da
estrutura do ficheiro, contendo exactamente a mesma informação, e
inserir essa estrutura na lista ligada dos grupos.


PARA UTILIZADORES ADMINISTRADORES

1. DADOS PESSOAIS – Mostra um sub-menu com as seguintes opções:
1.1 Mostrar dados actuais – Permite visualizar os dados do utilizador
actual.
1.2 Alterar nickname – Permite alterar o nickname. A alteração deve
assegurar que o nickname continua a ser único.
1.3 Alterar password – Permite alterar a password.
1.4 Apagar conta – permite excluir-se do sistema, apagando toda a sua
informação.

2. GERIR UTILIZADORES – Mostra um sub-menu com as seguintes opções:
2.1 Ver todos – Permite visualizar os todos os utilizadores registados, por
tipo.
2.2 Alterar utilizador – Permite alterar os dados de um utilizador BETA ou
PRO.
2.3 Eliminar utilizador – Permite eliminar um utilizador BETA ou PRO,
incluindo todas as suas directorias e ficheiros.
2.4 Promover/despromover utilizador - permite passar manualmente e
devido a uma razão válida, um utilizador PRO a BETA ou um utilizador
BETA a PRO.

3. GRUPOS – Mostra um sub-menu com as seguintes opções:
3.1 Visualizar grupos – Permite visualizar todos os grupos criados,
nomeadamente a seguinte informação: nome do grupo, nº de ficheiros
que possui, quem o criou (nickname).
3.2 Criar grupo – Permite criar um grupo novo, sem ficheiros.
3.3 Apagar grupo - Permite apagar um grupo, incluindo todos os ficheiros
que possui.
3.4 Alterar grupo - Permite mudar o nome de um grupo. Não podem
existir grupos com o mesmo nome
3.5 Bloquear/desbloquear grupo - Permite bloquear um grupo, evitando
que mais ficheiros lhe sejam associados. Pode desbloquear um grupo,
tornando novamente possível o envio de ficheiros.

NOTA: as operações de APAGAR, ALTERAR, BLOQUEAR/DESBLOQUEAR grupos
só são possíveis em grupos que ele próprio criou.


Neste sistema de menus deve estar sempre visível a informação básica do utilizador
activo:
  • Se for BETA: nickname, tipo de utilizador, nº de ficheiros e directorias criadas, percentagem do espaço disponível que já tem ocupado e data de registo no sistema.
  • Se for PRO: nickname, tipo de utilizador, nº de ficheiros e directorias criadas, total de bytes já carregados, quantos dias faltam para terminar a subscrição, data de registo no sistema.
  • Se for ADMIN: nickname, nº de grupos criados e data de registo no sistema.


4. Funcionalidades extras

É deixado ao critério do aluno a implementação de funcionalidades extras. Alguns
exemplos possíveis são:

  • Acesso restrito aos grupos: cada grupo possui um número de utilizadores associado sendo que apenas estes lhe podem aceder, visualizando ou alterando o seu conteúdo.
  • Sistema de sorteio semanal: todas as semanas é sorteado aleatoriamente um utilizador BETA que é premiado com uma subscrição anual, passando automaticamente a PRO, durante 1 ano
 
Não sei por onde lhe hei-de pegar já perdi tempo infindos à volta disto e sempre que vou fazer algo, parece-me que deveria ter feito qualquer coisa antes...

Se já perdeste temppo, já deves ter algo feito, a malta aki não te vai fazer o trabalho, pode sim esclarecer as tuas duvidas...
Não apresentaste duvidas, apresentaste o problema.

Queres o trabalho feito, falas com um programador, e a troco de uns trocos, faz-te isso...
A vida tá dificil pra todos...

As tuas duvidas serão bem vindas....
 
Já sabia que isto ía suscitar este tipo de comentário, por isso frisei:
O que eu pedia era um empurrãozito, uma luz, uma direcção, algo a que eu me podesse agarrar para começar a fazer o dito cujo...
Parece-me que não pedi uma unica linha de código... Só pedi mesmo uma direcção, estilo: "era boa ideia começares por fazer isto"... Uma ponta do fio... O resto eu vou desenrolando sozinho

Mas enfim... Gostava de saber porque é que têm sempre que dar um segundo sentido às palavras... :headsh:

Nem toda a gente neste mundo é parasita:Whatever:
 
Podes sempre ir espreitar sites de alojamento de ficheiros free tipo imageshack que só serve para imagens e tirares dai uma ideia.
 
Li um bocado na diagonal (muito extenso) mas aqui vai:

Uma vez que vais usar vários ficheiros (era o que eu faria, ficheiros de estruturas, porque apesar de pedirem explicitamente as listas ligadas tens sempre que armazenar a informação em algum lado) podes claramente começar a ver uma espécie de "prioridade" neles.
Repara que a coisa inicial, mais importante, são os utilizadores. Depois de teres o sistema de utilizadores formado, com adicionar, remover, etc, disponível para o administrador, podes começar a adicionar as ferramentas para os users.

Aqui, podes virar-te para um de dois lados, talvez o mais fácil seja pelos grupos. (apesar de não ter percebido bem o que são por ter lido aos saltos)
E por último, colocar os ficheiros dentro dos grupos.

Não sei se falta alguma coisa, mas se seguires esta ordem não estou a ver onde te podes enganar.
 
por acaso também ando de volta desse trabalho, e tnho q dizer q foi complicadissimo começá-lo.
mas começa pelas estruturas de datas, users, grupos, directorias,ficheiros.
 
li assim na diagonal e até nao parece ser assim tao complexo.

recomendo-te a primeiro carregares os ficheiros de texto com os dados na memoria, e depois meteres akele ecra inicial e ires implementando as funcoes uma de cada x.
 
|[Kaos]|;1952716 disse:
li assim na diagonal e até nao parece ser assim tao complexo.

recomendo-te a primeiro carregares os ficheiros de texto com os dados na memoria, e depois meteres akele ecra inicial e ires implementando as funcoes uma de cada x.

Leste na diagonal e as tuas dicas foram muito esclarecedoras :-D mas creio que já não vieram a horas...

Já viste a data em que isto começou?? :lol:
 
Parece-me que uma boa ideia é começares a dividir o teu programa em conceitos e adoptares um estilo "OOP" crias um header file em que defines um tipo por exemplo betaUser e depois pensar o que é que um betaUser faz e escreves uns prótotipos de métodos.
 
Parece-me que uma boa ideia é começares a dividir o teu programa em conceitos e adoptares um estilo "OOP" crias um header file em que defines um tipo por exemplo betaUser e depois pensar o que é que um betaUser faz e escreves uns prótotipos de métodos.

E desde quando isso pode ser chamado um estilo OOP? Em linguagens imperativas, principalmente em C sempre se fez isso! Dividir definições de dados num .h e coda-las num .c! Para cada funcionalidade!
 
Parece-me que uma boa ideia é começares a dividir o teu programa em conceitos e adoptares um estilo "OOP" crias um header file em que defines um tipo por exemplo betaUser e depois pensar o que é que um betaUser faz e escreves uns prótotipos de métodos.

E desde quando isso pode ser chamado um estilo OOP? Em linguagens imperativas, principalmente em C sempre se fez isso! Dividir definições de dados num .h e coda-las num .c! Para cada funcionalidade!

Volto a repetir...

As vossas intenções podem ser as melhores, mas agora não serve de nada (pelo menos para quem pediu ajuda)!:lol:

Vejam a data do primeiro post!
 
Back
Topo