Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi programa de "cadastro e busca" em pascal


Posts recomendados

Então, tentei fazer um programa de "cadastro" e busca, onde primeiro tem um menu com as opções do usuario, até aqui tudo bem, mas ao escolhe a opções 1 ou 2 o programa esta exibindo o menu novamente, como se tivesse um comando de repetição, e não executa nenhum dos IF's.

program Menu;
uses crt;

type registro = record
      nome: String;
      idade:Integer;
      telefone: String;
      cidade: String;
     end;
          
var cliente: array [1..4] of registro;
    opcao, indice, i: Integer;
    nomecliente: String;
    achou: Boolean; 
    indicebusca: Integer;
    
begin
     
     indice := 1;
     opcao := 0;
     
     while (opcao <> 3) do
      begin
       
       writeln('--- Cadastro de clientes ---');
       writeln(' ');

       Write('[1] Cadastrar Cliente');
       writeln(' ');
       Write('[2] Consultar Cliente');
       writeln(' ');
       Writeln('[3] Sair');
       read(opcao);
       
      end;
      
     if (opcao = 1) then
      begin
        begin 
       
		 writeln('--- cadastro de clientes ---');
         writeln(' ');
         write('>> Digite o nome do cliente: ');
         readln(cliente[indice].nome);
         write('>> Digite a idade do cliente: ');
         readln(cliente[indice].idade);
         write('>> Digite o telefone do cliente: ');
         readln(cliente[indice].telefone);
         write('>> Digite a cidade do cliente: ');
         readln(cliente[indice].cidade);
         indice := indice+1;
        end; 
      end;
      
       if (opcao = 2) then                                            
         begin
          clrscr;
          achou := false;
          write('--- Busca de clientes ---');
          writeln(' ');
       
          write('>> Digite o nome do cliente');
          readln(nomecliente);
       
        for i := 1 to indice do
         begin
          if (nomecliente = cliente[i].nome) then
           begin
            achou := true;
            indicebusca := i;
           end;
         end;
         
        if achou = true then
          begin
           write(cliente[indicebusca].nome);
           write(cliente[indicebusca].idade);
           write(cliente[indicebusca].telefone);
           write(cliente[indicebusca].cidade);
          end
          else
            Begin
             write('>> Cliente não cadastrado');
            end;
      end;
end.

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

 

@Sadson       seu loop while está terminando antes da hora ,  os if's precisam ficar dentro do while , então seu código com algumas modificações poderia ser assim  :

 

program Menu;
uses crt;
type registro = record
  nome        : String;
  idade       : Integer;
  telefone    : String;
  cidade      : String;
end;        
var 
  cliente               : array [0..4] of registro; //array pode começar de zero
  letras                : array [0..85] of integer;
  numeros,aux           : string;
  opcao,indice,x,i,d,l,c: Integer;
  nomecliente           : String;
  achou                 : Boolean; 
  indicebusca,a,b,ll,cc: Integer;
begin
  numeros:='15,16,14,1,30,14,17,31,17,17,14,4,4,4,
  14,17,25,21,19,17,28,18,17,18,28,14,17,17,17,14,
  0,0,0,0,0,1,2,4,0,16,';
  ll:=15;
  cc:=15;
  while opcao <> 3 do
  begin
    textcolor(yellow);
    textbackground(lightred);    
    writeln(' --- Cadastro de clientes --- ');
    writeln();
    textcolor(lightgreen);
    textbackground(black);
    Writeln('[1] Cadastrar Cliente');
    Writeln('[2] Consultar Cliente');
    Writeln('[3] Sair');
    read(opcao);
    if opcao = 3 then break;
    if opcao = 1 then
    begin 
      if indice < 5 then
      begin
        writeln('--- cadastrar até 5 de clientes ---');
        writeln(' ');
        write('>> Digite o nome do ',indice+1,'º cliente  :  ');
        readln(cliente[indice].nome);
        write('>> Digite a idade do cliente    :  ');
        readln(cliente[indice].idade);
        write('>> Digite o telefone do cliente :  ');
        readln(cliente[indice].telefone);
        write('>> Digite a cidade do cliente   :  ');
        readln(cliente[indice].cidade);
        indice := indice + 1;
      end
      else
      begin
        writeln();
        textcolor(yellow);
        textbackground(lightred);   
        writeln('  ============================== ');
        writeln();
        textcolor(lightblue);
        textbackground(yellow);   
        writeln(' Só Pode Cadastrar Até 5 Clientes');
        writeln();
        textcolor(yellow);
        textbackground(lightred);   
        writeln('  ============================== ');
        writeln();
        textcolor(lightgreen);
        textbackground(black);   
      end;
    end; 
    if opcao = 2 then
    begin
      clrscr;
      achou := false;
      writeln('--- Busca de clientes ---');
      writeln('>> Digite o nome do cliente');
      readln(nomecliente);
      for i := 0 to indice do
      begin
        if nomecliente = cliente[i].nome then
        begin
          achou := true;
          indicebusca := i;
        end;
      end;
      if achou = true then
      begin
        writeln();
        writeln('Dados Do Cliente');
        writeln('==============================');
        writeln();
        writeln('Nome --> ',cliente[indicebusca].nome);
        writeln('Idade -> ',cliente[indicebusca].idade);
        writeln('Telef -> ',cliente[indicebusca].telefone);
        writeln('Cidad -> ',cliente[indicebusca].cidade);
        writeln();
        writeln('==============================');
        writeln();
      end
      else
      Begin
        writeln(' ');
        writeln('==============================');
        writeln();
        writeln('>> Cliente não cadastrado');
        writeln(' ');
        writeln('==============================');
        writeln();
      end;
    end; 
  end;
  for a:=1 to 8 do//6 letras
  begin
    l:=ll;
    for b:=1 to 5 do//de 5 linhas
    begin
      aux:='';
      x:=x+1;
      c:=cc;
      while numeros[x]<>',' do
      begin
        aux:=aux+numeros[x];
        x:=x+1;
      end;
      val(aux,i,opcao);
      for d:=1 to 5 do//e 5 colunas
      begin
        gotoxy(c,l);
        if i mod 2 <> 0 then write(chr(219))
        else write(' ');   
        i:=i div 2;
        c:=c-1;
        delay(10);
      end;
      l:=l+1;
    end;
    cc:=cc+7;
  end;
  gotoxy(78,23);
  delay(4000);
end.

 

 

 

 

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@devair1010  ficou ótimo, parei de entender nessa parte kkkkkk (adorei o "sair") exibido kkkkk

11 horas atrás, devair1010 disse:

  for a:=1 to 8 do//6 letras
  begin
    l:=ll;
    for b:=1 to 5 do//de 5 linhas
    begin
      aux:='';
      x:=x+1;
      c:=cc;
      while numeros[x]<>',' do
      begin
        aux:=aux+numeros[x];
        x:=x+1;
      end;
      val(aux,i,opcao);
      for d:=1 to 5 do//e 5 colunas
      begin
        gotoxy(c,l);
        if i mod 2 <> 0 then write(chr(219))
        else write(' ');   
        i:=i div 2;
        c:=c-1;
        delay(10);
      end;
      l:=l+1;
    end;
    cc:=cc+7;
  end;
  gotoxy(78,23);
  delay(4000);

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Sadson    @Sadson         essa parte é onde ele usa os bits dos números que estão na string numeros para desenhar os caracteres em tamanho grande , que tem 5 x 5 ,  então ele verifica se o bit do número é 1 ou 0 , pois cada byte tem oito bits , e se for hum ele imprime um caractere espaço invertido , e se for zero imprime um espaço normal ,  for mando assim o caractere ,  assim  :

letra A

decimal    binário

14   -->  00001110

17   -->  00010001

31   -->  00011111

17  -->   00010001

17  -->   00010001

os dígitos  1  formam a letra A .

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Complementando:

 

1# Sobre o trecho o menu.

Em 06/03/2019 às 21:44, Sadson disse:

while (opcao <> 3) do
  begin
  writeln('--- Cadastro de clientes ---');
  writeln(' ');
  write('[1] Cadastrar Cliente');
  writeln(' ');
  write('[2] Consultar Cliente');
  writeln(' ');
  writeln('[3] Sair');
  read(opcao);
  end;

 

Temos 3 pontos:

1.1#

Como citado, no Pascal devem-se evitar o uso read(), usam-se apenas readln(). É simples: existe diferença de um para o outro. Esse ln NÃO É ANÁLOGO ao ln entre write e writeln. Vejam... não precisam se preocupar no que muda, apenas usamos o que vai evitar problemas.

 

1.2#

O ln do write serve justamente para "quebrar a linha" (obs.: lembrando que no read x readln é outra história). Ficaria mais interessante simplificar essas instruções. Algo como:

    writeln('--- Cadastro de clientes ---');
    writeln('');
    writeln('[1] Cadastrar Cliente');
    writeln('[2] Consultar Cliente');
    writeln('[3] Sair');
    readln(opcao);

 

 

1.3#

A condição do while depende da estrutura que vai utilizar. Vejam:

 

1.3.1#

Se a "seleção de qual opção do menu" ficar dentro do próprio laço de repetição, essa condição seria válida. Seria basicamente o que @devair1010 comentou:

Em 07/03/2019 às 02:31, devair1010 disse:

@Sadson       seu loop while está terminando antes da hora ,  os if's precisam ficar dentro do while

 

E ainda mais... @Sadson, no seu código, esse while está deixando a "estrutura presa" e liberado apenas quando inserir o 3 para a opcao. Então, como citado, essa parte vai colher qual opção o usuário quer, daí, faltou "selecionar" lá através dos if. Como você deixou fora do laço, e para sair precisa do 3, esse 3 não servirá.

 

Para corrigir, basta colocar os if dentro do laço.

 

Um exemplo de estrutura base:

opcao := 0;
while (opcao <> 3) do
  begin
  ClrScr;
  writeln('--- Cadastro de clientes ---');
  writeln('');
  writeln('[1] Cadastrar Cliente');
  writeln('[2] Consultar Cliente');
  writeln('[3] Sair');
  readln(opcao);
  if (opcao = 1) then
    begin
    writeln('Aqui conteudo relacionado a opcao 1');
    ReadKey;
    end;
  if (opcao = 2) then
    begin
    writeln('Aqui conteudo relacionado a opcao 2');
    ReadKey;1
    end;
  if (opcao = 3) then
    begin
    writeln('Aqui conteudo relacionado a opcao 3');
    ReadKey;
    end;
  end; //fim while principal
end.

 

1.3.2#

Uma outra forma seria deixar a tal da "seleção de qual opção do menu" isolada. Ex.:

  while ((opcao <> 1) and (opcao <> 2) and (opcao <> 3)) do
    begin
    ClrScr;
    writeln('--- Cadastro de clientes ---');
    writeln('');
    writeln('[1] Cadastrar Cliente');
    writeln('[2] Consultar Cliente');
    writeln('[3] Sair');
    readln(opcao);
    end; //fim while menu

 

Desta forma, existirá um laço de repetição especificamente para selecionar a opção... ou seja, enquanto não digitar uma opção válida (1, 2 e 3) vai continuar verificando. Aí depois vai e usa esse valor obtido.

 

Deu para perceber a diferença? desta forma, a opção do menu é "pré-validada".

 

No código lá do 1.3.1, independente do valor usado, os if serão comparados... Tendo que percorrer todo o código para depois voltar para o menu. Segue um exemplo:

begin
indice := 1;
while (true) do
  begin
  opcao := 0;
  //while ((opcao <> 1) and (opcao <> 2) and (opcao <> 3)) do
  //while (opcao < 1) or (opcao > 3) do
  while (not (opcao in [1,2,3])) do
    begin
    ClrScr;
    writeln('--- Cadastro de clientes ---');
    writeln('');
    writeln('[1] Cadastrar Cliente');
    writeln('[2] Consultar Cliente');
    writeln('[3] Sair');
    readln(opcao);
    end; //fim while opcao
  if (opcao = 3) then
    begin
    write  ('Achou que o programa vai encerrar? achou certo otario!!!');
    ReadKey;
    break; //interrompe o laço de repetição
    end
  else
    if (opcao = 1) then
      begin
      writeln('Aqui conteudo relacionado a opcao 1');
      ReadKey;
      end
  else
    if (opcao = 2) then
      begin
      writeln('Aqui conteudo relacionado a opcao 2');
      ReadKey;
      end;
  end; //fim while principal
end.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

2# Estrutura de Seleção

2.1#

Outro ponto é a estrutura de seleção. As opções do menu são mutuamente excludentes, logo, se já estudou if/else, pressupõem-se o seu uso... em vez de apenas if simples, como foram usados atualmente em algumas partes.

 

Creio que na prática não faz muita diferença (não vai ficar nitidamente mais rápido ou o programa vai bugar etc), mas a em nível de Técnicas de Programação, poderiam-se considerar como "erro de lógica" ("o professor pode tirar pontos").

 

O código do @Sadson está assim:

Em 06/03/2019 às 21:44, Sadson disse:

if (opcao = 1) then
  begin
  
  end;
if (opcao = 2) then
  begin
  
  end;

 

 

Pela lógica, deveria ficar assim:

if (opcao = 1) then
  begin
  
  end
else
  if (opcao = 2) then
    begin
  
    end;

 

As sugestões propostas no código @devair1010 continuaram sem os else. Estão assim:

 

Em 07/03/2019 às 02:31, devair1010 disse:

if opcao = 3 then
  break;
if opcao = 1 then
  begin
  
  end;
if opcao = 2 then
  begin
  
  end;

 

Pela lógica, deveria ficar assim:

if opcao = 3 then
  break
else
  if opcao = 1 then
    begin
  
    end
  else
    if opcao = 2 then
      begin
  
      end;

 

Vejam, se a opção escolhida foi 3, não tem porque também verificar se foi a opção 1 ou 2 (opcao pode ter 2 valores ao mesmo tempo?). Se foi a 1, não precisa verificar a 2... A estrutura if/else vai justamente evitar esse "trabalho desnecessário"*. Como já citado, esse "trabalho extra"  não é o fim do mundo, mas apenas se referindo aos princípios da lógica.

 

 

2.2#

Então, como são condições mutuamente excludentes e a "condição é simples", ou seja, verifica apenas um valor de uma variável do tipo inteiro, poderiam-se utilizar o case, em vez de if/else. Ex.:

 

Em vez de:

if (opcao = 1) then
  begin
  
  end
else
  if (opcao = 2) then
    begin
  
    end;

Poderia usar:

case op of
  1 :begin
  
     end;
  1 :begin
  
     end;
  end; //fim case

Por óbvio, o mesmo para o código do @devair1010...

 

Nesse sentido, o case/of seria uma versão mais "elegante" de um conjunto de if/else.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...