1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Trabalho final em C

Discussão em 'Programação' iniciada por iNf0_n00b, 8 de Maio de 2007. (Respostas: 12; Visualizações: 1787)

  1. 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
     
  2. jtcgomes

    jtcgomes Power Member

    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....
     
  3. Já sabia que isto ía suscitar este tipo de comentário, por isso frisei:
    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:
     
  4. joao.miguel

    joao.miguel Power Member

    Podes sempre ir espreitar sites de alojamento de ficheiros free tipo imageshack que só serve para imagens e tirares dai uma ideia.
     
  5. Warrior

    Warrior Power Member

    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.
     
  6. mr_zener

    mr_zener Power Member

    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.
     
  7. snis

    snis Power Member

    so agr vi isto, por acaso , chegas.te a fazer alguma coisa?
    pareceu-me um trabalho interessante...
     
  8. |[Kaos]|

    |[Kaos]| Power Member

    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.
     
  9. IcePicK

    IcePicK Power Member

    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:
     
  10. |[Kaos]|

    |[Kaos]| Power Member

    ahah a culpa eh do snis :D
     
  11. IComeFromBehind

    IComeFromBehind Power Member

    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.
     
  12. CoolMaster

    CoolMaster Power Member

    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!
     
  13. IcePicK

    IcePicK Power Member

    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!
     

Partilhar esta Página