Jump to content
dtenente

Mini Base de Dados

Recommended Posts

dtenente

Boa noite, eu estou de volta de um programa a uns dias que parece que quando dou um passo para a frente dou dois para trás... Alguém me pode ajudar a organizar os pensamentos para conseguir saber o que tenho de fazer?

Este é o enunciado:

 

Elabore um programa que permita efectuar a gestão de sócios de uma colectividade desportiva. Esta colectividade disponibiliza 3 modalidades para os sócios: natação, ténis e golf. Para cada sócio são necessários os seguintes dados:  Número de sócio;  Nome;  Ano de nascimento;  Sexo;  Telemóvel;  Ano de admissão na coletividade;  Modalidade. A inserção dos sócios deverá ser feita mediante a modalidade, ou seja, terá que haver um ficheiro para cada modalidade. O programa deverá apresentar um menu de opções ao utilizador. Neste programa deverá ser possível efectuar:  Inserção de um novo sócio;  Validação dos dados inseridos para o campo Sexo, ou seja só será possível inserir M ou F;  Acrescentar sócios;  Listar sócios (dar a opção ao utilizador da modalidade que pretende listar);  Actualizar os dados pessoais;  Pesquisar sócios a partir do nome;  Perguntar ao utilizador qual a modalidade que pretende visualizar e mostrar toda a informação no ecrã;  Eliminar um sócio;  Todo o tipo de opções que ajudem ao bom funcionamento do programa!

Obrigado pela atenção! 

Share this post


Link to post
Share on other sites
nunopicado

Não indicas em que parte está a tua dúvida nem o teu nível de conhecimento, pelo que não te consigo ajudar mais do que isto:

1º Divide o problema em vários mini-problemas: Menu, User Interface, Base de Dados, Tipo de Persistência (onde guardar a base de dados, como o disco, ou caso não seja necessária a persistência, na memória)

2º Analisa, de entre esses mini-problemas, quais são os que fazes sem problemas, e quais os que te oferecem dúvidas. Pelo título do teu post, parece-me que a base de dados é o que mais te preocupa

3º Implementa as várias partes, criando a interligação entre elas onde esta for necessária

 

Sobre a BD, se for mesmo esse o teu maior problema, segue a sugestão:

  • Cria um tipo Record com todos os campos que necessites (cada instância desse Record será um registo de um sócio)
  • Se não houver persistência (os dados só existem enquanto estás a executar o programa, sendo eliminados no fim), Crias uma variável do tipo Array para esse tipo Record
  • Se houver persistência, crias uma variável do tipo File para esse tipo Record.
  • No caso de haver persistência, tens de saber trabalhar com ficheiros

 

Um exemplo para o Record:

// Tipo Record para cada registo individual
type
  TSocio = record
    Numero: Word;
    Nome: string[200];
    AnoNasc: Word;
    Sexo: Char;
    Telemovel: string;
    AnoAdmissao: Word;
    Modalidade: string[100];
  end;

 

Um exemplo da BD sem persistência:

// Variável para lista de sócios, sem persistência
var
  Socios: array [1..100] of TSocio; // Neste caso concreto a variável tem espaço para até 100 sócios

Um exemplo da BD com persistência:

// Variável para lista de sócios, com persistência
var
  Socios: file of TSocio; // Neste caso concreto a única limitação de número de sócios é o espaço disponível em disco

 

O que fazer daqui para a frente dependa na prática de qual opção vais seguir.

Se tiveres dúvida concretas, podes é claro expor aqui.

 


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
dtenente

Boa noite, obrigado pelos concelhos! O código está quase completo e está a funcionar, o problema é que estou com alguns Bugs...

Procurar socio só me aparece o ultimo socio que foi introduzido;
Número de telemovel nunca é o correto(listar e consultar);
No listar também só me aparece o ultimo socio que foi introduzido;

Este é o código:

 

Program Pzim ;
Type modalidade=record
  n:integer;
  nom:string;
  dat:string[6];
  sex:char;
  tel:integer;
  aac:integer;
  m:char;
End;
Var opc:char;
        Tenis : File Of modalidade ;
        Natacao:File of modalidade;
        Golf:File of modalidade;
        Socio:modalidade;
Procedure Menu ;
Begin
  Writeln('Menu:');
  Writeln('Introduzir Sócio -->1' );
  Writeln('Acrescentar Sócio -->2');
  Writeln('Procurar/Alterar Sócio -->3');
  Writeln('Listar Sócios  -->4');
  Writeln('Eliminar Sócio -->5');
  Writeln('Fechar programa -->0');
  Write('Digite a sua opção -->');
  Repeat
    Read(opc);
  until (opc='0') or (opc='1') or (opc='2') or (opc='3') or (opc='4') or (opc='5')
End;
Function ExistFileTenis: Boolean ;
Begin
  assign(Tenis, 'MTenis.dat' );
  {$I-};
  Reset (Tenis); Close (Tenis);
  {$I+};
  ExistFileTenis:= (IoResult=0);
End;
Function ExistFileNatacao: Boolean ;
Begin
  assign(Natacao, 'MNatação.dat' );
  {$I-};
  Reset (Natacao); Close (Natacao);
  {$I+};
  ExistFileNatacao:= (IoResult=0);
End;
Function ExistFileGolf: Boolean ;
Begin
  assign(Golf, 'MGolf.dat' );
  {$I-};
  Reset (Golf); Close (Golf);
  {$I+};
  ExistFileGolf:= (IoResult=0);
End;
Procedure gravarsocio;
Begin
  clrscr;
  Writeln('            LISTA DOS SÓCIOS - INSERIR SÓCIO        ');
  Write('Por favor insira o número:');
  Read(Socio.n);
  Write('Por favor insira o nome:');
  Read(Socio.nom);
  Write('Por favor insira o ano de nascimento:');
  Read(Socio.dat);
  repeat
    Write('Por favor insira o sexo:');
    Read(Socio.sex);
  until (Socio.sex='F') or (Socio.sex='f') or (Socio.sex='M') or (Socio.sex='m');
  Write('Por favor insira o número de telefone:');
  Read(Socio.tel);
  Write('Por favor insira o ano de admissão na coletividade:');
  Read(Socio.aac);
  Repeat
      Writeln('          Ténis = t ;    Golf = g ; Natação = n        ');
            Writeln('        Por favor insira a modalidade que deseja:        ');
    Read(socio.m);
  Until (socio.m<>'T')or(socio.m<>'t')or(socio.m<>'G')or(socio.m<>'g')or(socio.m<>'N')or(socio.m<>'n');
  case (Socio.m) of
    'T':Begin
      Rewrite(tenis);
      Write(Tenis,socio);
    End;
    't':Begin
      Rewrite(tenis);
      Write(Tenis,socio);
    End;
    'G':Begin
      Rewrite(golf);
      Write(golf,socio);
    End;
    'g':Begin
      Rewrite(natacao);
      Write(golf,socio);
    End;
    'N':Begin
      Rewrite(natacao);
      Write(natacao,socio);
    End;
    'n':Begin
      Rewrite(natacao);
      Write(natacao,socio);
    End;
    Else
    Writeln('Resposta inválida.');
  End;
  Close(Tenis);
  Close(Natacao);
  Close(Golf);
  clrscr;
End;
Procedure AcrescentarSocio;
Var n,i:integer;
d:char;
Begin
Writeln('Quantos sócios deseja introduzir?');
Readln(n);
For i:=1 to n do
Begin
  Write('Por favor insira o número:');
  Read(Socio.n);
  Write('Por favor insira o nome:');
  Read(Socio.nom);
  Write('Por favor insira o ano de nascimento:');
  Read(Socio.dat);
  repeat
    Write('Por favor insira o sexo:');
    Read(Socio.sex);
  until (Socio.sex='F') or (Socio.sex='f') or (Socio.sex='M') or (Socio.sex='m');
  Write('Por favor insira o número de telefone:');
  Read(Socio.tel);
  Write('Por favor insira o ano de admissão na coletividade:');
  Read(Socio.aac);
  Repeat
  Writeln('          Ténis = t ;    Golf = g ; Natação = n        ');
    Writeln('        Por favor insira a modalidade que deseja:        ');
    Read(socio.m);
  Until (socio.m<>'T')or(socio.m<>'t')or(socio.m<>'G')or(socio.m<>'g')or(socio.m<>'N')or(socio.m<>'n');
  case (Socio.m) of
    'T':Begin
      Rewrite(tenis);
      Write(Tenis,socio);
    End;
    't':Begin
      Rewrite(tenis);
      Write(Tenis,socio);
    End;
    'G':Begin
      Rewrite(golf);
      Write(golf,socio);
    End;
    'g':Begin
      Rewrite(golf);
      Write(golf,socio);
    End;
    'N':Begin
      Rewrite(natacao);
      Write(natacao,socio);
    End;
    'n':Begin
      Rewrite(natacao);
      Write(natacao,socio);
    End;
    Else
    Writeln('Resposta inválida.');
  End;
  Close(Tenis);
  Close(Natacao);
  Close(Golf);
  clrscr;
End;
End;
Procedure procurarSocio ;
var N:integer; Op,Mo:char;
Begin
  ClrScr;
  If not ExistFileTenis then
  Begin
    Writeln('Ficheiro não existente');
    Write('Pressione Enter para voltar ao Menu');
    Readln;
  End
  Else
  If not ExistFileNatacao then
  Begin
    Writeln('Ficheiro não existente');
    Write('Pressione Enter para voltar ao Menu');
    Readln;
  End
  Else
  If not ExistFileGolf then
  Begin
    Writeln('Ficheiro não existente');
    Write('Pressione Enter para voltar ao Menu');
    Readln;
  End
  Else
  Begin
    Writeln('Qual a modalidade que inseriu anteriormente?');
    Read(mo);
    If (mo='T') or (mo='t') then
    Reset (Tenis)
    Else
    If (mo='N') or (mo='n') then
    Reset(Natacao)
    Else
    If (mo='G') or (mo='g') then
    Reset(Golf);
    Writeln('Consultar e alterar o registo');
    If (mo='T') or (mo='t') then
      Begin
    repeat
      Write('Nº do Registo a consultar');
      Writeln('entre 1 e ',Filesize(Tenis));
      Read(N);
    Until(N>0) And (N<=FileSize(Tenis));
    Seek (Tenis, N-1);
    Read(Tenis,Socio)
    End
    Else
      If (mo='N') or (mo='n') then
      Begin
      repeat
      Write('Nº do Registo a consultar');
      Writeln('entre 1 e ',Filesize(Natacao));
      Read(N);
    Until(N>0) And (N<=FileSize(Natacao));
    Seek (Natacao, N-1);
    Read(Natacao,Socio);
    End
        Else
      If (mo='G') or (mo='g') then
      Begin
      repeat
      Write('Nº do Registo a consultar');
      Writeln('entre 1 e ',Filesize(Golf));
      Read(N);
    Until(N>0) And (N<=FileSize(Golf));
    Seek (Golf, N-1);
    Read(Golf,Socio);
    End;
    Begin
    Writeln('Sócio número:',Socio.n,'        Nome:',Socio.nom,'    Genero:',socio.sex,'        Ano de nascimento',socio.dat,'        Número de telefone:',socio.tel,'Praticante de:',socio.m,'        Ano de Admissão:',socio.aac);
    Write('Deseja alterar dados? S-Sim / N-Não -->');
    Repeat
      Readln(Op);
    Until (Op='S') or (Op='s') or (Op='N') or (Op='n');
    Writeln;
    If (Op='S') or (Op='s') then
    Begin                                                                                                                                                                      
      Write('Escreva o novo número:     ');
        Readln(Socio.n);
      Write('Escreva o novo nome:     ');
        Readln(Socio.nom);
      Write ('Escreva o novo genero:    ');
      Readln(Socio.sex);
      Write('Escreva o novo ano de nascimento:     '); 
        Readln(Socio.dat);
      Write('Escreva o novo número de telefone:     ');
        Readln(Socio.tel);
             Write('Escreva o novo ano de admissão:     ');
        Readln(Socio.aac);
        End;
                If (mo='T') or (mo='t') then
                Begin
                Seek (Tenis,N-1);
                Write(Tenis,Socio)
                End
                Else 
                If (mo='N') or (mo='n') then
                Begin
                Seek (Natacao,N-1);
                Write(Natacao,Socio);
                End
                Else
                If (mo='G') or (mo='g') then
                Begin
                Seek (Golf,N-1);
                Write(Golf,Socio);
                End;  
//duvida a stora de como farei caso queriam mudar de modalidade
        End;
        End;
        End;
        Procedure listarmodalidade;
        Var mo:char;
        Begin
          ClrScr;
          Writeln('Qual a modalidade que deseja consultar?');
          Read(mo);
          If (mo='T') or (mo='t') then
          Begin
            If not ExistFileTenis then
            Begin
              Writeln('Ficheiro não existente');
              Write('Pressione Enter para voltar ao Menu');
              Readln;
            End
            Else
            Begin
              Reset(Tenis);
              Writeln('Listar Registos de Tenis');
              Write('Registos no ficheiro: ');
              Writeln(Filesize(Tenis));
              Writeln;
              while not eof(tenis) do
              begin
                Read(Tenis,socio);
                Writeln(Socio.n);
                Writeln(Socio.nom);
                Writeln(socio.sex);
                Writeln(socio.dat);
                Writeln(socio.tel);
                Writeln(socio.m);
                Writeln(socio.aac);
                Writeln
              End;
              Close(Tenis);
              Writeln;
              Writeln('Pressione Enter para voltar ao Menu');
              Readln;
            End;
          End
          Else
          If (mo='N') or (mo='n') then
          Begin
            If not ExistFileNatacao then
            Begin
              Writeln('Ficheiro não existente');
              Write('Pressione Enter para voltar ao Menu');
              Readln;
            End
            Else
            Begin
              Reset(Natacao);
              Writeln('Listar Registos de Tenis');
              Write('Registos no ficheiro: ');
              Writeln(Filesize(Natacao));
              Writeln;
              while not eof(Natacao) do
              begin
                Read(Natacao,socio);
                Writeln(Socio.n);
                Writeln(Socio.nom);
                Writeln(socio.sex);
                Writeln(socio.dat);
                Writeln(socio.tel);
                Writeln(socio.m);
                Writeln(socio.aac);
                Writeln
              End;
              Close(Natacao);
              Writeln;
              Writeln('Pressione Enter para voltar ao Menu');
              Readln;
            End;
          End
          Else
          If (mo='G') or (mo='g') then
          Begin
            If not ExistFileGolf then
            Begin
              Writeln('Ficheiro não existente');
              Write('Pressione Enter para voltar ao Menu');
              Readln;
            End
            Else
            Begin
              Reset(Golf);
              Writeln('Listar Registos de Tenis');
              Write('Registos no ficheiro: ');
              Writeln(Filesize(Golf));
              Writeln;
              while not eof(Golf) do
              begin
                Read(Golf,socio);
                Writeln(Socio.n);
                Writeln(Socio.nom);
                Writeln(socio.sex);
                Writeln(socio.dat);
                Writeln(socio.tel);
                Writeln(socio.m);
                Writeln(socio.aac);
                Writeln
              End;
              Close(Golf);
              Writeln;
              Writeln('Pressione Enter para voltar ao Menu');
              Readln;
            End;
          End;
          End;
Begin
Assign (Tenis, 'MTenis.dat');
  Rewrite (Tenis);
  Assign (Natacao, 'MNatacao.dat');
  Rewrite (Natacao);
  Assign (Golf, 'MGolf.dat');
  Rewrite (Golf);
 Repeat
      Menu;
      case (opc) of
        '0':Exit;
        '1':gravarsocio;
        '2':AcrescentarSocio;
        '3':ProcurarSocio;
        '4':ListarModalidade;
        //'5':eliminarsocio;
        else
        Writeln('Opção inválida');
      End;
    Until Opc = '0'
    End.

 

Edited by nunopicado
Syntax Highlight

Share this post


Link to post
Share on other sites
passarito

Como seria de esperar não vi o teu código todo ao pormenor, mas houve algo que me saltou à vista. Estás a utilizar o ReWrite para escrever no ficheiro e essa função limpa e cria o ficheiro por isso ele mostra só o último registo porque é o único que tem.

Substitui o ReWrite pelo Reset.

  • Vote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.