Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
MarkosM

Pascal Caixa de supermercado em Pascal

Recommended Posts

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.

 

Editado por DiF
Botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

     

    Editado por Simon Viegas
    Inserir tag CODE

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×