Ir ao conteúdo

Posts recomendados

Postado

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
Postado

 

@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
Postado

@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
  • Membro VIP
Postado

Olá.

 

Em relação aos 2 códigos...

No Pascal, de um modo geral, não se usam read(), usam apenas readln(). Este primeiro é usando apenas em casos especiais... (que não é o caso dos códigos postados). Basta trocar um pelo outro.

  • Curtir 1
Postado

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

 

  • Membro VIP
Postado

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
  • Membro VIP
Postado

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

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