Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Caixa de supermercado em Pascal


Posts recomendados

Boa Tarde pessoal! , estou tentando fazer um sistema tipo um caixa de supermercado, aonde o programa lê os produtos e depois dá um preço final, o problema é que se eu colocar um mesmo produto duas vezes ele não junta o total das duas execuções, ex: Arroz*  2 unidades = 10 reais, se voltar nessa conta ele não coloca os 20 reais.
Gostaria de saber como acumular os valores em uma mesma variável a cada execução do programa. Se alguém puder me ajudar com qualquer dica, agradeço desde já. Olhei várias apostilas e sites mas só consegui fazer desse jeito.

program caixa;
 uses crt, math;

var
produto: array [1..5] of string;
preco1: real;
subtotal: array[1..5] of real;
troco: real;
pagamento: real;
quantidade: integer;
prodescolhido: string;
precototal: real;
totalcompra: real;
finalcompra: string;

begin
produto[1] := 'Arroz';
produto[2] := 'Feijao';
produto[3] := 'Macarrao';
produto[4] := 'Leite';
produto[5] := 'Acucar';

repeat

writeln('Produto Escolhido e Quantidade');
readln(prodescolhido);
readln (quantidade);
if (prodescolhido = produto[1]) then begin
    preco1 := 5;
      subtotal[1] := quantidade*preco1;
    end;
if (prodescolhido = produto[2]) then begin
    preco1 := 2;
    subtotal[2] := quantidade*preco1;
    end; 
    
  if (prodescolhido = produto[3]) then begin
    preco1 := 3.5;
    subtotal[3] := quantidade*preco1;
    end; 
    
    if (prodescolhido = produto[4]) then begin
    preco1 :=1.5;
    subtotal[4] := quantidade*preco1;
    end; 
    
    if (prodescolhido = produto[5]) then begin
    preco1 := 4;
    subtotal[5] := quantidade*preco1;
    end; 
  precototal := subtotal[1] + subtotal[2] + subtotal [3] + subtotal[4] + subtotal[5];
  totalcompra:= precototal;
  writeln ('Finalizar Compra?');
  readln(finalcompra);
  
  until (finalcompra = 'Sim');
  
  
  if (finalcompra = 'Sim') then begin
      
      clrscr;
    writeln('Total da Compra: ', totalcompra:6:2);
    writeln('Pagamento');
    readln(pagamento);
    
    troco:= pagamento-precototal;
    writeln('troco: ', troco:6:2);
    
    writeln('Pressione ENTER para finalizar o programa');
      
  readln;
end;
end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @MarkosM, seja bem vindo ao Fórum do Clube do Hardware.

 

Vamos analisar o que foi passado:

3 horas atrás, MarkosM disse:

Boa Tarde pessoal! , estou tentando fazer um sistema tipo um caixa de supermercado, aonde o programa lê os produtos e depois dá um preço final, o problema é que se eu colocar um mesmo produto duas vezes ele não junta o total das duas execuções, ex: Arroz*  2 unidades = 10 reais, se voltar nessa conta ele não coloca os 20 reais.
Gostaria de saber como acumular os valores em uma mesma variável a cada execução do programa. Se alguém puder me ajudar com qualquer dica, agradeço desde já. Olhei várias apostilas e sites mas só consegui fazer desse jeito.

 

Nesse caso, ao atualizar o preço, você está apenas atribuindo um valor, ex.:

3 horas atrás, MarkosM disse:

subtotal[1]:=quantidade*preco1;

Ou seja, a posição do vetor vai receber "algo vezes outro", que é algo como "valor do total dos itens registrados no momento".

 

Como você quer :

3 horas atrás, MarkosM disse:

[...] acumular os valores em uma mesma variável a cada execução do programa [...]

 

Então você poderia fazer é também deixar o valor atual na conta, algo como:

subtotal[1]:=subtotal[1]+(quantidade*preco1);

obs.: os "()", matematicamente, não são necessário, incluir apenas para destacar que são dois itens: "valor atual"+"valor do subtotal dos itens registrados no momento".

 

 

 

***

 

Sugiro que teste para ver se funcionar. Mas além disso, tem outros pontos que acho que precisam ser verificados, como: use do if/else em vez de só if (ou usar case); a forma de calcular o subtotal, ou seja, você pode simplesmente ir somando o "valor unitário * quantidade". Separar os item num vetor não está tendo utilidade alguma, pelo menos na forma que você está fazendo.

 

Caso queira ir implementando funcionalidades, é só postar.

 

No aguardo.

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

6 horas atrás, Simon Viegas disse:

Então você poderia fazer é também deixar o valor atual na conta, algo como:


subtotal[1]:=subtotal[1]+(quantidade*preco1);

 

 

Muito obrigado Simon, isso resolveu o  problema de voltar no item, só não consegui retirar os vetores ainda pois não achei outro jeito de ir gravando os subtotais por produto, agora vou trabalhar também reduzindo os if

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 12/01/2018 às 21:12, MarkosM disse:

de ir gravando os subtotais por produto

A questão é: para quê guardar esses subtotais por produto? pelo que entendi do seu código, você pode simplesmente ir acumulando o subtotal.

 

O Subtotal será simplesmente:

subTotal:=subTotal+(precoUnitario*quantidade);

 

 

 

Em relação aos if, não é necessariamente sobre a quantidade, mas sobre o "tipo", ou seja, os itens são excludentes entre si... se for um não pode ser mais um outro, logo teria que usar if/else. (vide diferenças em if e if/else)

 

 

No aguardo.

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

Segui suas dicas e realmente código ficou bem mais simples de ler e funciona do mesmo jeito, existe algum jeito de usar um array para criar uma tabela de produtos e preços? Ao invés de ficar substituindo numa mesma variável o tempo todo os produtos ficariam cadastrados no sistema como num caixa de verdade, assim eu poderia criar tipo um estoque de mercadorias.

Aqui está o código de agora:

program caixa;
 uses crt, math;

var
produto: string;
preco1: real;
troco: real;
pagamento: real;
quantidade: integer;
prodescolhido: string;
totalcompra: real;
finalcompra: string;

begin


repeat

writeln('Produto Escolhido e Quantidade');
readln(prodescolhido);
readln (quantidade);

case prodescolhido of

'Arroz': preco1 := 5;
       

'Feijao': preco1 := 2;
          

'Macarrao': preco1 := 3.5;
            

'Leite': preco1 :=1.5;
         

'Açucar': preco1 := 4;
          
 
    end; 
  
totalcompra := totalcompra + quantidade*preco1;  

  writeln ('Finalizar Compra?');
  readln(finalcompra);
  
  until (finalcompra = 'Sim');
  
  
  if (finalcompra = 'Sim') then begin
      
      clrscr;
    writeln('Total da Compra: R$ ', totalcompra:6:2);
    writeln('Pagamento');
    readln(pagamento);
    
    troco:= pagamento-totalcompra;
    writeln('troco: R$ ', troco:6:2);
    
    writeln('Pressione ENTER para finalizar o programa');
      
  readln;
end;
end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1) COMO E PORQUE POSTAR CÓDIGOS

Ao postar um código, é necessário utilizar a tag CODE. Favor ler comunicado contido no topo do fórum: "Poste seus códigos corretamente!"

 

 

 

2) INDENTAÇÃO DE CÓDIGO

Na programação, é essencial que o código sempre esteja indentado. Os padrões são diversos, mas tem que seguir uma lógica. Ex.:

program caixa;
uses
  CRT{, math}; //unit math não utilizada
var
  prodescolhido:string;
  quantidade   :integer;
  preco        :real;
  pagamento    :real;
  troco        :real;
  totalcompra  :real;
  finalcompra  :string;
  {produto      :string;} //variável não utilizada
begin
repeat
  writeln('Produto Escolhido e Quantidade');
  readln(prodescolhido);
  readln(quantidade);
  case prodescolhido of
    'Arroz'   :preco:=5.0;
    'Feijao'  :preco:=2.0;
    'Macarrao':preco:=3.5;
    'Leite'   :preco:=1.5;
    'Açucar'  :preco:=4.0;
  end; 
  totalcompra:=totalcompra + quantidade*preco;  
  writeln ('Finalizar Compra?');
  readln(finalcompra);
until (finalcompra = 'Sim');
if (finalcompra = 'Sim') then
  begin
  ClrScr;
  writeln('Total da Compra: R$ ', totalcompra:6:2);
  writeln('Pagamento');
  readln(pagamento);
  troco:= pagamento-totalcompra;
  writeln('troco: R$ ', troco:6:2);
  writeln('Pressione ENTER para finalizar o programa');
  readln;
  end;
end.

 

 

 

3) CADASTRO DOS PRODUTOS

 

9 minutos atrás, MarkosM disse:

[...] existe algum jeito de usar um array para criar uma tabela de produtos e preços? [...]

Sim. Inclusive existem dois recursos que podem ajudar: record (registros) e file (arquivos). Esse último pode ficar para depois. Então, poderia organizar mais ou menos assim:

 

program caixa;
uses
  CRT{, math}; //unit math não utilizada
type
  t_Produtos = record //definição do tipo "produto"
                 codigo   :string[5];
                 descricao:string[10];
                 preco    :real;
               end;

Ai seria um esboço, os dados necessários vai verificando aos poucos.

 

A variável ficaria mais ou menos assim:

var
  produtos     :array [1..5] of t_Produtos; //lista de produtos cadastrados

Percebe que o type apenas criou um tipo personalizado... Apenas que esse tipo é um record, ou seja, para acessar um produto utiliza a coordenada do vetor normalmente e para acessar um dado deste produto utiliza ".", ex.:

produtos[2].descricao:='Feijao';
produtos[2].preco    :=2.0;

Não tem mistério. No registro, é como se cada variável tivesse outras sub-variáveis. Nesse caso é um vetor de registros. Segue os mesmos princípios de um vetor comum, a diferença que existe esse acesso via "." para dado do registro.

 

 

 

4) ESTOQUE DE MERCADORIAS

9 minutos atrás, MarkosM disse:

[...] Ao invés de ficar substituindo numa mesma variável o tempo todo os produtos ficariam cadastrados no sistema como num caixa de verdade, assim eu poderia criar tipo um estoque de mercadorias.

Não sugiro implementar isso agora. Pode ficar pra depois. Antes devem vir as estruturas do produtos e das vendas.

 

 

 

5) CADASTRO DE ITENS DE VENDA

O ideal é analisar o "mundo real", geralmente os itens são registrados OU pelo código de barras, lidos pelo leitor ou digitados manualmente (mais tradicional); OU pelo nome do produto, que ao digitar vai localizando (comum em mercadinhos , padarias...); OU por um código do item na loja, algo como uma tabela que foi cadastrada de acordo com critérios da loja, tipo 1211 para Arroz X, 2415 para Feijão Z, 3144 para Arroz G, 4724 para Açúcar H..; OU etc....

 

Acho que por enquanto a maneira prática seria utilizando parte dos códigos de barras originais de produtos, algo como os últimos 3 ou 4 dígitos. Ai, na hora de "passar" no caixa, o "operador" digitaria o código, e programa localizaria o produto e apresentaria na tela, após digitaria a quantidade e registraria a venda.

 

Ou seja, a forma como idealizar cadastrar os itens vai impactar na forma de como irá cadastrar o produto lá no item 3.

 

 

***

 

Se for seguir essa linha de raciocínio.. Próximas etapas:

- define a estrutura do type para o produto e o vetor dele;

- cadastra os produtos com os seus respectivos dados (faz isso logo após o begin principal), algo como:

BEGIN
//Cadastro dos produtos
produtos[1].codigo   :='11111'; //vou usar código em sequência para facilitar os testes
produtos[1].descricao:='Arroz Tio Joao 1 KG';
produtos[1].preco    :=5.0;

Isso para cada item...

- quando for passar item, será necessário localizar o produto de através de um dos seus dados (no caso, código ou descrição), ai ao encontrar, usa o .preco do respectivo produto lá na conta. Use um for para percorrer o vetor e encontrar a posição do produto que quer.

 

 

Qualquer dúvida é só perguntar.

 

No aguardo.

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

Não entendi como usar o for para percorrer o vetor, do jeito que consegui o código do produto não tem utilidade alguma. Como eu faço o programa reconhecer o produto por ele?

Segue o código abaixo:

program caixa;
 uses crt;
 
type
t_produtos = record
           
           codigo: string[5];
           descricao: string[10];
           preco: real;
           
end;
                    
var
produto: array [1..5] of t_produtos;
preco1: real;
troco: real;
pagamento: real;
quantidade: integer;
prodescolhido: string;
totalcompra: real;
finalcompra: string;

begin
repeat

produto[1].codigo := '1111';
produto[1].descricao := 'Arroz';
produto[1].preco := 5.00; 

produto[2].codigo := '1112';
produto[2].descricao := 'Feijao';
produto[2].preco := 2.00; 

produto[3].codigo := '1113';
produto[3].descricao := 'Macarrao';
produto[3].preco := 3.50; 

produto[4].codigo := '1114';
produto[4].descricao := 'Leite';
produto[4].preco := 1.50; 

produto[5].codigo := '1115';
produto[5].descricao := 'Acucar';
produto[5].preco := 4.50; 

writeln('Insira o Codigo do Produto');
readln(prodescolhido);
writeln('Insira a Quantidade');
readln (quantidade);

case prodescolhido of

'1111': preco1 := produto[1].preco;
       
'1112': preco1 := produto[2].preco;
          
'1113': preco1 := produto[3].preco;
            
'1114': preco1 := produto[4].preco;
         
'1115': preco1 := produto[5].preco;
          
end; 
  
totalcompra := totalcompra + quantidade*preco1;  

  writeln ('Finalizar Compra?');
  readln(finalcompra);
  
  until (finalcompra = 'Sim');
  
  
  if (finalcompra = 'Sim') then begin
      
      clrscr;
    writeln('Total da Compra: R$ ', totalcompra:6:2);
    writeln('Pagamento');
    readln(pagamento);
    
    troco:= pagamento-totalcompra;
    writeln('troco: R$ ', troco:6:2);
    
    writeln('Pressione ENTER para finalizar o programa');
      
  readln;
end;
end.

 

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

  • Membro VIP

Olá.

 

1) PADRÕES DE INDENTAÇÃO

Reforçando essa questão...

Seu código está relativamente organizado, mas ainda é necessário mais rigor no padrão utilizado. Não existe uma regra única, mas é necessário que identificando/criando a sua e passar a seguir ela.

 

Seguindo mais ou menos a base da sua indentação, seu código poderia ficar assim:

program caixa;
uses
  CRT;
type
  t_produtos = record
                 codigo: string[5];
                 descricao: string[10];
                 preco: real;
               end;
var
  produto      :array [1..5] of t_produtos;
  preco1       :real;
  troco        :real;
  pagamento    :real;
  quantidade   :integer;
  prodescolhido:string;
  totalcompra  :real;
  finalcompra  :string;
begin
repeat
  produto[1].codigo := '1111';
  produto[1].descricao := 'Arroz';
  produto[1].preco := 5.00; 

  produto[2].codigo := '1112';
  produto[2].descricao := 'Feijao';
  produto[2].preco := 2.00; 

  produto[3].codigo := '1113';
  produto[3].descricao := 'Macarrao';
  produto[3].preco := 3.50; 

  produto[4].codigo := '1114';
  produto[4].descricao := 'Leite';
  produto[4].preco := 1.50; 

  produto[5].codigo := '1115';
  produto[5].descricao := 'Acucar';
  produto[5].preco := 4.50; 

  writeln('Insira o Codigo do Produto');
  readln(prodescolhido);
  writeln('Insira a Quantidade');
  readln (quantidade);
  case prodescolhido of
    '1111': preco1 := produto[1].preco;
    '1112': preco1 := produto[2].preco;
    '1113': preco1 := produto[3].preco;
    '1114': preco1 := produto[4].preco;
    '1115': preco1 := produto[5].preco;
    end; //fim case
  totalcompra := totalcompra + quantidade*preco1;  
  writeln ('Finalizar Compra?');
  readln(finalcompra);
until (finalcompra = 'Sim');
  
if (finalcompra = 'Sim') then begin
  clrscr;
  writeln('Total da Compra: R$ ', totalcompra:6:2);
  writeln('Pagamento');
  readln(pagamento);
  troco:= pagamento-totalcompra;
  writeln('troco: R$ ', troco:6:2);
  writeln('Pressione ENTER para finalizar o programa');
  readln;
  end;
end.

Basicamente entrando a questão dos "dentes" no lugar certo e melhor uso do espaçamento entre linhas. Um ponto particular meu está no alinhamento dos tipos ali nas variáveis... isso não é comum, mas acho bem interessante.

 

 

 

 

2) CADASTRO DOS PRODUTOS

O cadastro só precisa ser feito uma vez, ou seja, deve ficar fora do repeat. Algo como:

...
  totalcompra  :real;
  finalcompra  :string;
begin
produto[1].codigo := '1111';
produto[1].descricao := 'Arroz';
...
produto[5].preco := 4.50; 

repeat
  writeln('Insira o Codigo do Produto');
  readln(prodescolhido);
...

 

 

 

3) PESQUISAR DADOS EM VETORES E/OU REGISTROS

15 horas atrás, MarkosM disse:

Não entendi como usar o for para percorrer o vetor, do jeito que consegui o código do produto não tem utilidade alguma. Como eu faço o programa reconhecer o produto por ele?

 

Em relação ao uso do for, a ideia é que percorra o vetor posição por posição e vai comparando o prodescolhido com o codigo do produto. Dessa forma, forma, após ter o prodescolhido, encontrará a posição do produto no vetor (ou não) e usará o preço que está lá... é como está sendo feito no case, só que em vez de enumar, usar um laço de repetição para ir comparando.

 

Da forma que você fez está bom e funciona, apenas que precisará de uma opção do case para cada item. Se forem 20.000 itens, seriam 20.000 opções... fora que a questão para atualizar os código... Os código estão no "código fonte", e não nas "tabelas de produtos" (no vetor).

 

Então, por enquanto deixe como está. Pois acho que precisa antes ajustar outras coisas, como os citarei abaixo. Depois tenta ajustar o código para usar o laço.

 

 

 

4) SUGESTÕES

Observação inicial: cada item é facultativo, mas deve ser feito individualmente, ou seja, só faz um novo item após o item escolhido estiver pronto e funcionando. Não é interessante fazer duas ou mais coisas ao mesmo tempo. Qualquer dúvida sobre um item é só ir perguntando.

 

4.1) Exibir dados do item atual na tela

Ao registrar um produto ou quantidade, não está dando para ver qual foi consta no sistema. Seria interessante exibir esses dados na tela. A medida que cadastra um item, mostra os dados dele.

 

4.2) Mesclar leitura de produto com fechar venda

Ficar perguntando se quer finalizar a compra para cada item fica repetitivo e cansativo, imagine você como um caixa de supermercado e ter que ficar respondendo isso a cada item. Uma boa forma que contornar isso seria utilizar a leitura do código mesmo, ou seja, ou "operador do caixa" digita o código do produto, ou digita, por exemplo, "fechar" ou "sair" etc. Se digitou "fechar" (ou o que seja), fecha a conta e passa para a próxima etapa do pagamento. Senão, continua normalmente localizando o código da venda. Veja, a ideia é que o caixa vai ficar sempre esperando para cadastrar um produto... quando quer sair, insere o respectivo comando.

 

A parte da leitura do código funcionaria como uma leitura de códigos gerais... se for produto, vai simplesmente registrar o produto. Se for outra coisa, vai para a outra coisa, como o "fechar", ou "cancelar item", ou "inserir cpf".. etc.

 

Inclusive a opção de inserir a quantidade também não é para todos os itens, pelo contrário, somente os itens que são identificados como repetidos, que o operador insere a quantidade... outro ponto notável é que a quantidade vem antes do código, ou seja, primeiro insere a quantidade, depois passa o item. Pelo menos vejo isso nos mercados.

 

Resumindo: você poderia fazer algo assim: se o código informado for "x" (ou "*" etc), o programa ler a quantidade; senão se o código for "fechar", o programa fecha a venda e vai para o pagamento"; senão localiza o código e registra o produto.

 

***

 

Exemplo de esboço de como pode ficar a tela:
tela.jpg

 

Lembrado que os ajustes devem ser feitos aos poucos... não tente fazer tudo de uma vez que é mais complicado.

 

PS: para alinhar o texto, eu fiz assim:

  totalcompra := totalcompra + quantidade*pdtTemp.preco;
  writeln(pdtTemp.codigo:4,' ',pdtTemp.descricao:11,' ',quantidade:3,' ',pdtTemp.preco:4:3,' SUB ',totalcompra:3:3);

Essa variável temporária declarei assim:

  pdtTemp      :t_produtos; 

 

 

No aguardo.

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

Consegui colocar essas funções, a primeira usei outro case porque caiu naquele problema de não usar o vetor pra achar produto, então pra não encher o código de if, coloquei mais um case.

Segue o código abaixo:

program caixa;
 uses crt;
 
type
t_produtos = record
           
           codigo: string[5];
           descricao: string[10];
           preco: real;
           
end;
                    
var
 produto:          array [1..5] of t_produtos;
 prodTemp:         t_produtos;
 troco:            real;
 pagamento:        real;
 quantidade:       integer;
 codigo:           string;
 totalcompra:      real;


begin
 
 totalcompra:=0;
 
 produto[1].codigo := '1111';
 produto[1].descricao := 'Arroz';
 produto[1].preco := 5.00; 

 produto[2].codigo := '1112';
 produto[2].descricao := 'Feijao';
 produto[2].preco := 2.00; 

 produto[3].codigo := '1113';
 produto[3].descricao := 'Macarrao';
 produto[3].preco := 3.50; 

 produto[4].codigo := '1114';
 produto[4].descricao := 'Leite';
 produto[4].preco := 1.50; 

 produto[5].codigo := '1115';
 produto[5].descricao := 'Acucar';
 produto[5].preco := 4.50; 


repeat

 writeln('Insira o Codigo do Produto');
 readln(codigo);


 if (codigo) <> 'Fechar' then begin
 
 writeln('Insira a Quantidade');
 readln (quantidade);

  case codigo of

       '1111': prodTemp.preco := produto[1].preco;
            
       '1112': prodTemp.preco := produto[2].preco;
          
       '1113': prodTemp.preco := produto[3].preco;
            
       '1114': prodTemp.preco := produto[4].preco;
         
       '1115': prodTemp.preco := produto[5].preco;
          
  end;  //CASE DO PREÇO
  
  case codigo of

       '1111': prodTemp.descricao := produto[1].descricao;
            
       '1112': prodTemp.descricao := produto[2].descricao;
          
       '1113': prodTemp.descricao := produto[3].descricao;
            
       '1114': prodTemp.descricao := produto[4].descricao;
         
       '1115': prodTemp.descricao := produto[5].descricao;
          
  end;  // CASE DO PRODUTO
  
  totalcompra := totalcompra + quantidade*prodTemp.preco;  
  
  writeln('  ', prodTemp.descricao, ' ', prodTemp.preco:6:2, '   ', quantidade, '  Subtotal', totalcompra:6:2);
   
  
  end; //LISTA DE PRODUTOS
  
  if (codigo = 'Fechar') then begin
      
       clrscr; 
      
       writeln('Total da Compra: R$ ', totalcompra:6:2);
       writeln('Pagamento');
       readln(pagamento);
    
                  if
                  (pagamento) < totalcompra then 
                  writeln('Pagamento Insuficiente')
                  
                  else
                  troco:= pagamento-totalcompra;
                  writeln('troco: R$ ', troco:6:2);
    
    writeln('Pressione ENTER para finalizar o programa');
      
    readln;
 
 end; // PAGAMENTO
     
     until (codigo = 'Fechar'); 

end. 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1) ESTRUTURAS DE SELEÇÃO

14 horas atrás, MarkosM disse:

Consegui colocar essas funções, a primeira usei outro case porque caiu naquele problema de não usar o vetor pra achar produto [...]

Certo... isso mesmo.

 

obs.: um termo melhor seria "comandos", "instruções"... etc. "Funções" é outra coisa.

 

 

 

2) SIMPLIFICAÇÃO DAS ESTRUTURAS DE SELEÇÃO

14 horas atrás, MarkosM disse:

[...] então pra não encher o código de if, coloquei mais um case.

Beleza, mas como é a mesma condição.. usa mesmo case, algo como:

 

case codigo of
       '1111':begin
              prodTemp.preco     := produto[1].preco;
              prodTemp.descricao := produto[1].descricao;
              end;
       ...

ou, tente assim:

case codigo of
       '1111': prodTemp := produto[1];
       '1112': prodTemp := produto[2];
       '1113': prodTemp := produto[3];
       '1114': prodTemp := produto[4];
       '1115': prodTemp := produto[5];         
  end; //fim case

(acho que funciona, tô sem compilador aqui agora...)

 

 

 

3) LOCALIZAR VIA LAÇO DE REPETIÇÃO

Antes qualquer coisa, já ajustes os detalhes anteriores. Não deixe coisa pendente ou tente fazer mais de uma coisa ao mesmo tempo, pois podem se atrapalhar...

 

Então, a proposta é que o operador de caixa digite o código do produto... daí, como os produtos estão cadastros no vetor, em vez de usar um case para selecionar o item, poderá usar um for localizar o produto...  ela vai percorrendo posição por posição e comparando o código informado com o código que consta no vetor. Ou seja, o for vai da primeira posição até a última. Para cada uma delas, compara o código atual com o código que consta no produto... se for igual, então copia o produto no prodTemp.

 

Tente entender a proposta e tente implementar. Caso tenha dúvidas, indique-nos onde.

 

 

No aguardo.

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

Consegui, encurtou muito o código e ficou bem melhor pra trabalhar. agora estou colocando um comando pra dar descontos. Queria saber se tem como colocar o programa pra escrever um doc. como se fosse uma nota fiscal, dessa forma que eu estou fazendo tem como?

Segue o código de como está o programa:

program caixa;
 uses crt;
  
const

MAX = 100;

type
t_produtos = record
           
           codigo: string[5];
           descricao: string[10];
           preco: real;
           
end;
                    
var
 produto:          array [1..5] of t_produtos;
 prodTemp:         t_produtos;
 troco:            real;
 pagamento:        real;
 quantidade:       integer;
 codigo:           string;
 totalcompra:      real;
 loop:             integer;

begin
 
 totalcompra:= 0;
 
 produto[1].codigo := '1111';
 produto[1].descricao := 'Arroz';
 produto[1].preco := 5.00; 

 produto[2].codigo := '1112';
 produto[2].descricao := 'Feijao';
 produto[2].preco := 2.00; 

 produto[3].codigo := '1113';
 produto[3].descricao := 'Macarrao';
 produto[3].preco := 3.50; 

 produto[4].codigo := '1114';
 produto[4].descricao := 'Leite';
 produto[4].preco := 1.50; 

 produto[5].codigo := '1115';
 produto[5].descricao := 'Acucar';
 produto[5].preco := 4.50; 


repeat

 writeln('Insira o Codigo do Produto');
 readln(codigo);

 if (codigo) <> 'Fechar' then begin
 
 writeln('Insira a Quantidade');
 readln (quantidade);

  for loop := 1 to MAX do 
  
       if (codigo = produto[loop].codigo) then begin
             
       prodTemp.preco := produto[loop].preco;
       prodTemp.descricao := produto[loop].descricao;
         
       totalcompra := totalcompra + quantidade*prodTemp.preco;  
  
       writeln('  ', prodTemp.descricao, ' ', prodTemp.preco:6:2, '   ','QTDE',' ', quantidade, '  Subtotal', totalcompra:6:2);
     
     end; // FIM IF COMPARANDO CODIGO 
     
  end; // FIM IF ETAPAS DA COMPRA
  
  if (codigo = 'Fechar') then begin
      
       clrscr; 
      
       writeln('Total da Compra: R$ ', totalcompra:6:2);
       writeln('Pagamento');
       readln(pagamento);
    
                  if
                  (pagamento) < totalcompra then 
                  writeln('Pagamento Insuficiente')
                  
                  else
                  troco:= pagamento-totalcompra;
                  writeln('troco: R$ ', troco:6:2);
    
    writeln('Pressione ENTER para finalizar o programa');
      
    readln;
 
 end; // PAGAMENTO
     
     until (codigo = 'Fechar'); 

end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @MarkosM.

 

1) INDENTAÇÃO

Mantenha código SEMPRE indentado. É um requisito fundamental.

Ex.:

program caixa;
uses
  CRT;
const
  MAX = 100;
type
  t_produtos = record
                 codigo: string[5];
                 descricao: string[10];
                 preco: real;
               end;
var
  produto    :array [1..5] of t_produtos;
  prodTemp   :t_produtos;
  troco      :real;
  pagamento  :real;
  quantidade :integer;
  codigo     :string;
  totalcompra:real;
  loop       :integer;

begin
produto[1].codigo := '1111';
produto[1].descricao := 'Arroz';
produto[1].preco := 5.00; 

produto[2].codigo := '1112';
produto[2].descricao := 'Feijao';
produto[2].preco := 2.00; 

produto[3].codigo := '1113';
produto[3].descricao := 'Macarrao';
produto[3].preco := 3.50; 

produto[4].codigo := '1114';
produto[4].descricao := 'Leite';
produto[4].preco := 1.50; 

produto[5].codigo := '1115';
produto[5].descricao := 'Acucar';
produto[5].preco := 4.50; 

totalcompra:= 0;
repeat
  writeln('Insira o Codigo do Produto');
  readln(codigo);
  if (codigo) <> 'Fechar' then begin
    writeln('Insira a Quantidade');
    readln (quantidade);     
    {for loop := 1 to MAX do} //se só existem 5 produtos, porque ir de 1 a 100?
    for loop := 1 to 5 do
      if (codigo = produto[loop].codigo) then begin
        prodTemp.preco := produto[loop].preco;
        prodTemp.descricao := produto[loop].descricao;
        totalcompra := totalcompra + quantidade*prodTemp.preco;  
        writeln('  ', prodTemp.descricao, ' ', prodTemp.preco:6:2, '   ','QTDE',' ', quantidade, '  Subtotal', totalcompra:6:2);
      end; // FIM IF COMPARANDO CODIGO 
  end; // FIM IF ETAPAS DA COMPRA

  if (codigo = 'Fechar') then begin
    ClrScr; 
    writeln('Total da Compra: R$ ', totalcompra:6:2);
    writeln('Pagamento');
    readln(pagamento);
    if (pagamento) < totalcompra then 
      writeln('Pagamento Insuficiente')
    else
      troco:= pagamento-totalcompra;
    writeln('troco: R$ ', troco:6:2);
    writeln('Pressione ENTER para finalizar o programa');
    readln;
  end; // PAGAMENTO
until (codigo = 'Fechar'); 
end.

Siga esse padrão, ou modifique para o seu e SEMPRE deixe o código indentado. Não tem porque sair do padrão...

 

Um outro exemplo para simplificar mais:

begin
produto[1].codigo:='1111'; produto[1].descricao:='Arroz   '; produto[1].preco:=5.00;
produto[2].codigo:='1112'; produto[2].descricao:='Feijao  '; produto[2].preco:=2.00;
produto[3].codigo:='1113'; produto[3].descricao:='Macarrao'; produto[3].preco:=3.50;
produto[4].codigo:='1114'; produto[4].descricao:='Leite   '; produto[4].preco:=1.50;
produto[5].codigo:='1115'; produto[5].descricao:='Acucar  '; produto[5].preco:=4.50;
totalCompra:=0;
repeat

 

 

 

2) COPIA DE REGISTRO

Como já citado, basta igualizar a posição do vetor, ex.:

prodTemp:=produto[loop];

Fica mais simples

 

 

 

3) TRATAMENTOS DE CÓDIGO NÃO ENCONTRADO

Para complementar o código da pesquisa, abaixo uma sugestão já meio que implementada para "parar de pesquisar quando achar" e "tratar do caso quando não encontrar".

  if (codigo) <> 'Fechar' then begin
    ACHOU:=false; //inicializa como código não encontrado
    for loop := 1 to 5 do
      if (codigo = produto[loop].codigo) then begin
        ACHOU:=true; //marca como encontrado
        writeln('Insira a Quantidade'); //só pergunta a quantidade se encontrar
        readln(quantidade);
        prodTemp:=produto[loop]; //copia o registro
        totalcompra := totalcompra + quantidade*prodTemp.preco;  
        writeln('  ',prodTemp.descricao, ' ',prodTemp.preco:6:2, '   ','QTDE',' ',quantidade,'  Subtotal',totalcompra:6:2);
        break; //para de procurar (interrompe o for)
      end;
  end;
  if not ACHOU then
    writeln('Codigo nao encontrado');

ACHOU é do tipo boolean.

 

 


4) IMPLEMENTAÇÃO DESCONTO

4 horas atrás, MarkosM disse:

agora estou colocando um comando pra dar descontos.

Certo. Qualquer coisa tente inserir também essas modificações citadas nos itens acima.

 

 

 

5) ARQUIVOS DE TEXTO

4 horas atrás, MarkosM disse:

Queria saber se tem como colocar o programa pra escrever um doc. como se fosse uma nota fiscal, dessa forma que eu estou fazendo tem como?

Usar o formato ".doc" especificamente acho que dá, mas no mínimo vai dar um certo trabalho. Um formato mais simples seria o ".txt" mesmo.

 

Creio que arquivos seriam mais úteis para carregar, por exemplo, os produtos, ou seja, fazer o programa alimentar os dados a partir do arquivo. A nota fiscal poderia ficar apenas na tela mesmo. Ou precisar explicar melhor para que seria o arquivo.

 

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Consegui colocar os descontos e as outras modificações, agora estou em dúvida sobre como criar um arquivo .txt para armazenar as informações dos produtos e fazer o programa acessar este arquivo durante a execução.

Poderia também me falar um pouco mais sobre a identação do código?Vejo que estou esbarrando nisso sempre.

E desculpe a demora pra responder, estive resolvendo uns problemas pessoais aí.

Aqui está o código:

program caixa;
 uses crt;
  
type
t_produtos = record
           
           codigo: string[5];
           descricao: string[10];
           preco: real;
           
end;
                    
 var
 produto:          array [1..5] of t_produtos;
 prodTemp:         t_produtos;
 troco:            real;
 pagamento:        real;
 quantidade:       integer;
 codigo:           string;
 totalcompra:      real;
 loop:             integer;
 achou:            boolean;
 desconto:         real; 


 begin
 
 totalcompra:= 0;
 
 produto[1].codigo := '1111';
 produto[1].descricao := 'Arroz';
 produto[1].preco := 5.00; 

 produto[2].codigo := '1112';
 produto[2].descricao := 'Feijao';
 produto[2].preco := 2.00; 

 produto[3].codigo := '1113';
 produto[3].descricao := 'Macarrao';
 produto[3].preco := 3.50; 

 produto[4].codigo := '1114';
 produto[4].descricao := 'Leite';
 produto[4].preco := 1.50; 

 produto[5].codigo := '1115';
 produto[5].descricao := 'Acucar';
 produto[5].preco := 4.50; 

repeat

            writeln('Insira o Codigo do Produto');
            readln(codigo);

 if (codigo) <> 'Fechar' then begin
            achou := false;

        for loop := 1 to 5 do 
  
            if (codigo = produto[loop].codigo) then begin
            
            achou := true;
            
            writeln('Insira a Quantidade');
            readln (quantidade);
            
            prodTemp.preco := produto[loop].preco;
            prodTemp.descricao := produto[loop].descricao;
         
            totalcompra := totalcompra + quantidade*prodTemp.preco;  
  
            writeln('  ', prodTemp.descricao, ' ', prodTemp.preco:6:2, '   ','QTDE',' ', quantidade, '  Subtotal', totalcompra:6:2);
            break;
            
            end; // FIM IF COMPARANDO CODIGO 
     
 end; // FIM IF ETAPAS DA COMPRA
  
            if not achou then // não achou o código
     
            writeln('Codigo nao encontrado');
            
          
  if (codigo = 'Fechar') then begin
      
       clrscr; 
      
           writeln('Total da Compra: R$ ', totalcompra:6:2);
           
           writeln('Valor do Desconto');
           readln(desconto);
           
           totalcompra:= totalcompra - totalcompra/100*desconto;      
           
           writeln('Total da Compra: R$ ', totalcompra:6:2); // total final
           
           writeln('Pagamento');
           readln(pagamento);
                           
                  if
                     (pagamento) < totalcompra then 
                      writeln('Pagamento Insuficiente')
                  
                  else
                      troco:= pagamento-totalcompra;
                      writeln('troco: R$ ', troco:6:2);
           
           writeln('Pressione ENTER para finalizar o programa');
      
           readln;
 
 end; // PAGAMENTO
     
           until (codigo = 'Fechar'); 

 end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @MarkosM.

 

19 horas atrás, MarkosM disse:

Consegui colocar os descontos e as outras modificações, agora estou em dúvida sobre como criar um arquivo .txt para armazenar as informações dos produtos

 

Para isso, você poderia deixar os dados em sequência... um em baixo do outro, ex.:

1111
Arroz
5.00
1112
Feijao
2.00
1113
Macarrao
3.50
1114
Leite
1.50
1115
Acucar
4.50

Ai vai lendo em sequência e atribuindo a cada dado do registro correspondente.

 

 

Para facilitar os testes, faça inicialmente um programa novo e  simples, que vai apenas ler cada linha do arquivo de texto e exibir na tela. Após isso implementa o arquivo de texto no seu código.

 

A missão de descobrir como usar arquivos de texto (text) no Pascal está contigo. Não tem mistério, pesquisa um pouco, ver exemplos e tenta fazer faz.

 

 

 

No aguardo.

 

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