Jump to content
HelderT

Dúvida de iniciante

Recommended Posts

HelderT

Bom dia, sou um iniciante em programação e então estava aqui a fazer um programa quando me deparei com um problema.

Fiz uma mini-calculadora em pascal mas queria que ela somasse, subtraísse, multiplicasse e dividisse todos os número que o utilizador digite.

O meu problema é que só consigo somar, subtrai, multiplicar e dividir dois números, alguém me pode explicar como é que faço para o programa somar, etc.. todos os números que o utilizador digite?

Fica aqui o meu programita:

Program Ex2(input, output);
USES CRT;
VAR
op:               integer;
n1, n2, s, angulo:   real;
fechar:            char;

//----------------------------------------------------------------------
Procedure calc_tan;                             
   Begin                                          
      write('Introduza o ângulo em radianos: ');      
      readln(angulo);                                                
   End;                                    //    CALCULA A TANGENTE DO ANGULO
                                      
Function tangente(a:real):real;                                       
   Begin                                                                       
      tangente:=SIN(a)/COS(a);                              
   End;                                                                        
//------------------------------------------------------------------- 
Procedure calc_seno;                                
   Begin                                           
      write('Introduza o ângulo em radianos: ');  
      readln(angulo);                            
   End;                                                                         //   CALCULA O SENO DO ANGULO
                                      
Function seno(a:real):real;                        
   Begin                                        
      seno:=SIN(a);                    
   End;                                          
//------------------------------------------------------------------------
Procedure calc_coseno;                           
   Begin                                          
      write('Introduza o ângulo em radianos: ');   
      readln(angulo);                                              
        End;                                                                                     //  CALCULA O CO-SENO DO ANGULO
                                          
Function coseno(a:real):real;                        
   Begin                                           
      coseno:=COS(a);                      
   End;                                           
//-------------------------------------------------------------------------

BEGIN
  repeat
   clrscr;
   writeln('1 - Somar');
   writeln('2 - Subtrair');
   writeln('3 - Multiplicar');
   writeln('4 - Dividir');
   writeln('5 - Calcular Tangente');
   writeln('6 - Calcular Seno');
   writeln('7 - Calcular Co-Seno');
   write('Escolha a operação que deseja realizar: ');
   readln(op);

case op of

   1:                                                                       
     Begin                                                                    
        clrscr;                                                                
      write('Digite o primeiro número: ');                                
      readln(n1);                                                                          //   FAZ A SOMA DE DOIS NÚMEROS E MANDA O RESULTADO PARA O ECRÃ
      write('Digite o segundo número: ');                                    
      readln(n2);                                                           
      s:=n1+n2;                                                             
      writeln('A soma de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);           
   End;                                                                       
    //----------------------------------------------------------------------
   2:                                                                     
   Begin                                                                   
      clrscr;                                                                
      write('Digite o primeiro número: ');                                 
      readln(n1);                                                                               //  FAZ A SUBTRACÇÃO DE DOIS NÚMERO E MANDA O RESULTADO PARA O ECRÃ
      write('Digite o segundo número: ');                                    
      readln(n2);                                                            
      s:=n1-n2;                                                              
      writeln('A subtracção de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);    
   End;                                                                     
   //-------------------------------------------------------------------------------------
   3:                                                                       
   Begin                                                                      
      clrscr;                                                                
      write('Digite o primeiro número: ');                                 
      readln(n1);                                                                                     //  FAZ A MULTIPLICACAO DE DOIS NÚMERO E MANDA O RESULTADO PARA O ECRÃ
      write('Digite o segundo número: ');                              
      readln(n2);                                                           
      s:=n1*n2;                                                             
      writeln('A multiplicação de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);   
   End;                                                                     
   //------------------------------------------------------------------------------
   4:                                                                       
   Begin                                                                    
      clrscr;                                                                
      write('Digite o primeiro número: '); 
                readln(n1);   
      while (n1=0) do                                                        
         Begin                                                              
            writeln('ERRO! Impossivel dividir qualquer número por 0.');  
            write('Digite outro número: ');                              
            readln(n1);                                                    
         End;                                                                                                       //    FAZ A DIVISÃO DE DOIS NÚMERO, CASO O UTILIZADOR DIGITE 0 DÁ ERRO E ENVIA O PROGRAMA PARA O ECRÃ
      write('Digite o segundo número: ');                                  
      readln(n2);                                                           
         while (n2=0) do                                                  
         Begin                                                              
            writeln('ERROR! Impossivel dividir qualquer número por 0.');  
            write('Digite outro número: ');                             
            readln(n2);                                                 
         End;                                                             
      s:=n1/n2;                                                             
      writeln('A divisão de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);         
   End;                                                                     
   //-------------------------------------------------------------------------
   5:                                                                      
   Begin                                                                  
      clrscr;                                                                                                  //   ENVIA O RESULTADO DA TANGENTE PARA O ECRÃ
      calc_tan;                                                             
      writeln('A tangente do ângulo é de: ',tangente(angulo):0:2);
        End;
   //------------------------------------------------------------------------------------------
   6:                                                                         
   Begin                                                                      
      clrscr;                                                                                                   //  ENVIA O RESULTADO DO SENO PARA O ECRÃ
      calc_seno;                                                          
      writeln('O seno do ângulo é de: ',seno(angulo):0:3);                
   End;                                                                      
   //------------------------------------------------------------------------------------------
   7:                                                                     
   Begin                                                                   
      clrscr;                                                                                                  // ENVIA O RESULTADO DO CO-SENO PARA O ECRÃ
      calc_coseno;                                                        
      writeln('O seno do ângulo é de: ',coseno(angulo):0:3);               
   End;                                                                      
   //---------------------------------------------------------------------------------
   Else writeln('Esta opção não existe!');
End;
//---------------------------------------------------------
  write('Deseja realizar um novo cálculo? (S/N)');
  readln(fechar);
  until (fechar<>'S');
//---------------------------------------------------------
END.

Share this post


Link to post
Share on other sites
nunopicado

Boas... Há algumas hipoteses diferentes, mas uma simples é criares um ciclo para ir pedindo numeros até o utilizador pressionar uma tecla qualquer predefinida... Por exemplo:

Program Ex2(input, output);
USES CRT;
VAR
op,Cont,ErrCode:               integer;
n1, n2, s, angulo,
RealValor,ResultValor:   real;
fechar:            char;
StrValor:String;

//----------------------------------------------------------------------
Procedure calc_tan;                             
   Begin                                          
      write('Introduza o ângulo em radianos: ');      
      readln(angulo);                                                
   End;                                    //    CALCULA A TANGENTE DO ANGULO
                                      
Function tangente(a:real):real;                                       
   Begin                                                                       
      tangente:=SIN(a)/COS(a);                              
   End;                                                                        
//------------------------------------------------------------------- 
Procedure calc_seno;                                
   Begin                                           
      write('Introduza o ângulo em radianos: ');  
      readln(angulo);                            
   End;                                                                         //   CALCULA O SENO DO ANGULO
                                      
Function seno(a:real):real;                        
   Begin                                        
      seno:=SIN(a);                    
   End;                                          
//------------------------------------------------------------------------
Procedure calc_coseno;                           
   Begin                                          
      write('Introduza o ângulo em radianos: ');   
      readln(angulo);                                              
        End;                                                                                     //  CALCULA O CO-SENO DO ANGULO
                                          
Function coseno(a:real):real;                        
   Begin                                           
      coseno:=COS(a);                      
   End;                                           
//-------------------------------------------------------------------------

BEGIN
  repeat
   clrscr;
   writeln('1 - Somar');
   writeln('2 - Subtrair');
   writeln('3 - Multiplicar');
   writeln('4 - Dividir');
   writeln('5 - Calcular Tangente');
   writeln('6 - Calcular Seno');
   writeln('7 - Calcular Co-Seno');
   write('Escolha a operação que deseja realizar: ');
   readln(op);

case op of

   1:                                                                       
     Begin                                                                    
        clrscr;     
        ResultValor:=0;    // Esta é uma variável do tipo real, que serve para o programa ir guardando a soma dos valores que lê
        Cont:=0;             // Esta é uma variável do tipo integer, que serve apenas para contar quantos valores são inseridos
                                   // e para ir indicando ao utilizador qual o valor que está a inserir (1º, 2º, 3º, etc)     
        repeat
                 Cont:=Cont+1;
 write('Digite o ',Cont,'o número (ou escreva " = " para calcular): ');                                
 readln(StrValor);    // Esta é uma variável do tipo string. Lendo os valores com strings dá a possibilidade de analizar o que
                                              // o utilizador insere, para evitar erros e, neste caso, para poder aceitar o uso de um sinal não-numérico
                                              // para indicar o fim do ciclo. Se preferires, podes usar uma variavel real, mas aí terás de definir um valor
                                              // numérico para terminar o ciclo
 val(StrValor,RealValor,ErrCode);   // Como o valor lido é numa variável string, é necessário agora converter para real
                                                                    // Caso não conheças o procedimento val, ele converte o que está na primeira variável
                                                                    // (StrValor) para a segunda (RealValor). Caso consiga, guarda na terceira variável
                                                                    // (ErrCode) o valor 0. Se não puder converter, caso a string não tenha um valor 
                                                                    // numérico por exemplo, guarda nesta variável o código de erro.
 if ErrCode=0 then ResultValor:=ResultValor+RealValor    // Se ErrCode for 0 não deu erro, ou seja, soma o valor ao resultado
                     else if StrValor<>'=' then Writeln(StrValor,' não é um valor correcto. Insira um valor numérico!');
                                                                    // Se a conversão de val der erro, e o caracter lido não for o sinal =, avisa o utilizador
        until StrValor='=';     // repete o ciclo até que o utilizador insira o caracter '='. Em vez deste podes escolher outro
       
        writeln('A soma dos valores inseridos é ',ResultValor:0:2);           
   End;                                                                       
    //----------------------------------------------------------------------
   2:                                                                     
   Begin                                                                   
      clrscr;                                                                
      write('Digite o primeiro número: ');                                 
      readln(n1);                                                                               //  FAZ A SUBTRACÇÃO DE DOIS NÚMERO E MANDA O RESULTADO PARA O ECRÃ
      write('Digite o segundo número: ');                                    
      readln(n2);                                                            
      s:=n1-n2;                                                              
      writeln('A subtracção de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);    
   End;                                                                     
   //-------------------------------------------------------------------------------------
   3:                                                                       
   Begin                                                                      
      clrscr;                                                                
      write('Digite o primeiro número: ');                                 
      readln(n1);                                                                                     //  FAZ A MULTIPLICACAO DE DOIS NÚMERO E MANDA O RESULTADO PARA O ECRÃ
      write('Digite o segundo número: ');                              
      readln(n2);                                                           
      s:=n1*n2;                                                             
      writeln('A multiplicação de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);   
   End;                                                                     
   //------------------------------------------------------------------------------
   4:                                                                       
   Begin                                                                    
      clrscr;                                                                
      write('Digite o primeiro número: '); 
                readln(n1);   
      while (n1=0) do                                                        
         Begin                                                              
            writeln('ERRO! Impossivel dividir qualquer número por 0.');  
            write('Digite outro número: ');                              
            readln(n1);                                                    
         End;                                                                                                       //    FAZ A DIVISÃO DE DOIS NÚMERO, CASO O UTILIZADOR DIGITE 0 DÁ ERRO E ENVIA O PROGRAMA PARA O ECRÃ
      write('Digite o segundo número: ');                                  
      readln(n2);                                                           
         while (n2=0) do                                                  
         Begin                                                              
            writeln('ERROR! Impossivel dividir qualquer número por 0.');  
            write('Digite outro número: ');                             
            readln(n2);                                                 
         End;                                                             
      s:=n1/n2;                                                             
      writeln('A divisão de ',n1:0:2,' com ',n2:0:2,' é de ',s:0:2);         
   End;                                                                     
   //-------------------------------------------------------------------------
   5:                                                                      
   Begin                                                                  
      clrscr;                                                                                                  //   ENVIA O RESULTADO DA TANGENTE PARA O ECRÃ
      calc_tan;                                                             
      writeln('A tangente do ângulo é de: ',tangente(angulo):0:2);
        End;
   //------------------------------------------------------------------------------------------
   6:                                                                         
   Begin                                                                      
      clrscr;                                                                                                   //  ENVIA O RESULTADO DO SENO PARA O ECRÃ
      calc_seno;                                                          
      writeln('O seno do ângulo é de: ',seno(angulo):0:3);                
   End;                                                                      
   //------------------------------------------------------------------------------------------
   7:                                                                     
   Begin                                                                   
      clrscr;                                                                                                  // ENVIA O RESULTADO DO CO-SENO PARA O ECRÃ
      calc_coseno;                                                        
      writeln('O seno do ângulo é de: ',coseno(angulo):0:3);               
   End;                                                                      
   //---------------------------------------------------------------------------------
   Else writeln('Esta opção não existe!');
End;
//---------------------------------------------------------
  write('Deseja realizar um novo cálculo? (S/N)');
  readln(fechar);
  until (upcase(fechar)<>'S');                                  // Adicionei o "upcase" para que seja indiferente se o utilizador mete S ou s 
//---------------------------------------------------------
END.

Há outras maneiras... Por exemplo, podes antes de ler o valor perguntar quantos numeros quer somar, e depois repetir o ciclo esse numero de vezes... Isso evita ter de meter um caracter para terminar (neste caso o =) mas limita mais o uso

Podes também adaptar isto ao resto das operações do programa se desejares...

qualquer coisa avisa


"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
HelderT

Obrigado pela ajuda, mas poderias-me explicar melhor isso do "val" é que não consegui perceber muito bem porque eu utilizar isso e não perceber o que estou a utilizar não vale a pena xD.. Mais um vez obrigado pela ajuda que me deste!

Share this post


Link to post
Share on other sites
nunopicado

Claro que sim, e concordo inteiramente contigo... :)

O VAL é um procedimento do pascal, pertencente à unidade system, que é como quem diz, está sempre disponivel sem precisar de colocar nada na secção USES.

Ele serve para converter uma cadeira de caracteres numéricos num valor inteiro ou real.

Aceita obrigatoriamente 3 variáveis:

A primeira é do tipo string, e contem a cadeira de caracteres numericos que queremos converter.

A segunda pode ser real ou integer, dependendo do resultado que queremos... Se a ideia for ficarmos com um valor com casas decimais, usa-se uma variável real. Se não tiver casas decimais, basta ser do tipo integer.

A terceira é uma variável integer. Ela servirá para guardar o código de erro, se houver, durante a conversão.

Uma das vantagens de usar isto é que permite detectar erros e agir de acordo com isso.

Se leres directamente com o readln uma variavel numérica (real, integer, word, byte, etc, etc) e o utilizador meter uma letra ou um simbolo que não o '.', o programa vai crashar com erro, pois tentou ler para uma variável um tipo de dados para os quais ela não está preparada.

NOTA: Existem compiladores que evitam isto, aplicando eles proprios uma correcção do erro. Pessoalmente considero que o teste deve ser feito na mesma pelo programador, pois este comportamento não é standard no pascal, ou seja, se quiseres compilar noutro lado poderás ter erros sem saber de onde vêm.

Outra vantagem é que podes numa mesma leitura da variável, ler numero e/ou letras ou simbolos, e depois agir conforme o que o utilizador inseriu. Foi o caso do teu programa, onde ao ler os valores a somar, o utilizador pode também inserir um simbolo, e o programa saberá o que fazer.

Exemplo:

program teste1;
uses
crt;
var
   ValorStr:String;
   Erro:integer;
   ValorReal,Total:real;
   Operador:char;
begin
   clrscr;
   writeln('Calculadora XPTO:');
   writeln;
   writeln('Insira os valores ou as operações, dando <enter> a cada passo!');
   writeln('Escreva FIM para terminar. . .');
   writeln;
   writeln;
   Total:=0;
   Operador:=' ';
   repeat
        Write(Total:0:2,' ',Operador,' ');
        readln(ValorStr);
        val(ValorStr,ValorReal,Erro);
        if Erro>0 then begin
                                   if (ValorStr='+') or (ValorStr='SOMA') then Operador:='+';
                                   if (ValorStr='-') or (ValorStr='SUBTRAI') then Operador:='-';
                                   if (ValorStr='*') or (ValorStr='MULTIPLICA') then Operador:='*';
                                   if (ValorStr='/') or (ValorStr='DIVIDE') then Operador:='/';
                                   if ValorStr='FIM' then Operador:='F';                          
                                   if (ValorStr='') or (ValorStr=' ') or (ValorStr='LIMPA') then begin
                                                                                                                               Operador:=' ';
                                                                                                                               Total:=0;
			   	                                           end;
                             end
                      else begin
                                  case Operador of
                                        '+':Total:=Total+ValorReal;
                                        '-':Total:=Total-ValorReal;
                                        '*':Total:=Total*ValorReal;
                                        '/':Total:=Total/ValorReal;
                                        ' ':Total:=ValorReal;
                                  end;
                                  Operador:=' ';
                             end;     
    until Operador='F';    
    writeln;
    writeln;
    writeln('Concluido. . .');                
end.

Se quiseres executa este programa.

Como poderás ver, ele usa apenas um readln a uma variavel string. Esse readln está dentro de um ciclo e é lido continuamente até que o utilizador escreva a palavra FIM.

Enquanto ele não o fizer, poderá ir inserindo ora valores, ora operadores, ou até instruções escritas, e se estiverem previstas, o programa irá reagir a elas.

Inclusivamente com o VAL poderias fazer algo mais avançado. Por exemplo, ao ler a string, o utilizador escrevia algo como " 5*2-6+8 " e o programa retornaria o resultado de todas as operações pedidas (neste caso, o valor 12).

Resumindo:

O VAL passa o que está na primeira variável para a segunda variável, caso seja um valor numérico... Se a passagem for bem sucedida, a terceira variável ficará com o valor 0 (zero). Se der erro, porque o utilizador meteu letras, simbolos, etc, a terceira variável ficará com um valor acima de 0.

Não sei se me fiz entender... B) Se tiveres duvida diz o que é que eu tento explicar melhor! :D

NOTA: Há coisas neste programa de teste que não são o que eu faria num programa a serio, nomeadamente aquela serie de if's e o facto de todos os comandos estarem em maiusculas (em minusculas não funcionam como está). Mas achei melhor explicar assim, pois não sei o teu nivel de conhecimento em pascal).


"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

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.