Jump to content

Programa crasha quando introduzo letras num integer


Recommended Posts

Posted (edited)

Estou a fazer um programa em pascal para a escola e tenho uma duvida acerca de fazer com que o programa nao crash quando introduzo letras num integer.

 

aqui esta o parte onde crasha!
 

repeat 
  writeln('Qual é o valor do produto?');
  Readln(ap^.preco);
until (ap^.preco>=1);
Edited by nunopicado
Syntax Highlight, correcção de título demasiado longo
Posted (edited)

O problema está no nome da variável. Acho que nao pode conter acento circunflexo.
Esse é o programa todo??
Se sim, falta declarar as variaveis.
Eu recomendava assim:
 

Program saber_o_valor_produto;

var: preco:integer;

begin

 repeat 
  writeln ('Qual é o valor do produto?');
  Readln(preco);
 until (preco>=1) ;

end
Edited by nunopicado
Syntax Highlight
Posted (edited)

@Joao2002

Uma variável Integer não pode nunca receber valores não numéricos, como já percebeste. Ao leres com o ReadLn directamente para a variável Integer, estás a responsabilizar o utilizador com a tarefa de inserir os dados correctos na variável, mas o utilizador, como todos sabemos, não tem capacidade mental para ser responsabilizado com coisas importantes 😛, pelo que cabe ao programador, neste caso tu, controlar o que vai para a variável. 

Para isto, o que tens de fazer, é fazer o ReadLn não para a variável Integer directamente, mas para uma variável temporária do tipo String (que aceita qualquer caracter). Desta forma o programa não crasha ao fazer a leitura. 

De seguida, tens de verificar se o valor que está nessa variável String é um valor numérico válido, e se sim, passá-lo então para dentro da variável Integer

Para isto deves usar, por exemplo, a função Val, que funciona da seguinte forma:

Var
  Valor: Integer;
  Erro: Integer;
  ValorInserido: string;

begin
  repeat 
    ReadLn(ValorInserido);
    Val(ValorInserido, Valor, Erro);
    if Erro <> 0
      then WriteLn('Insira um valor numérico!');
  until Erro = 0;
end. 

Desta forma, a função Val irá colocar na variável Valor aquilo que o utilizador escreveu apenas se for um Integer válido (e nesse caso, a variável Erro ficará com o valor 0).

Se o que o utilizador inseriu forem letras ou outro qualquer símbolo não numérico, a variável Erro irá ficar com um valor diferente de 0, e o programa não irá crashar, dando-te a possibilidade de testares e até avisares o utilizador do seu erro. 

E estando assim dentro de um ciclo Repeat Until, ele irá repetir o processo até que o utilizador insira o valor correcto. 

 

Se aplicares isto ao teu programa, poderás usar o mesmo ciclo se lhe puseres as duas condições, o controlo da variável Erro (primeira condição) e se a Valor é maior ou igual a 1 (segunda condição). 

 

 

@joao_o grande

A tua sugestão irá sofrer dos mesmos problemas, porque continuas a ler directamente para uma variável Integer

Outra coisa:

Se o problema fosse o nome da variável, o programa não crashava, porque simplesmente nem compilava. Aqui entra a diferença entre erros de compilação e erros de execução

No caso, o nome da variável está correcto, porque o @Joao2002 está a usar ponteiros. As variáveis do tipo ponteiro têm de ser referenciadas (quando se quer aceder ao seu valor e não ao seu endereço de memória) com o circunflexo no fim do identificador. 

Edited by nunopicado

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

Posted

Ainda tenho muitos erros e ainda estou a aperfeiçoar tudo mas o programa é o seguinte:

Program mercado ;
type
produto=record
  nome:string[20];
  preco:real;
  codigo:string[30];
  restantes:integer;
  prox:^produto;
end;
var opcao :char;
primeiro:^produto;

//inserir
Procedure inserir;
VAR ap:^produto;
Begin
  clrscr;
  new(ap);
  writeln ('Qual é o nome do produto?');
  Readln(ap^.nome);
  repeat
    writeln ('Qual é o valor do produto?');
    Readln(ap^.preco);

  until (ap^.preco>=1) ;
  writeln ('Qual é o codigo do produto?');
  Readln(ap^.codigo);
  repeat
    writeln('Qual a quantidade existente do produto?');
    readln(ap^.restantes);
  until(ap^.restantes)>=0;
  
  
  ap^.prox:=primeiro;
  primeiro:=ap;
end;


//vizualizar
procedure vizualizar;
var ap:^produto;
linha:integer;
begin
  clrscr;
  if primeiro=nil then
  writeln('Não há nada para listar...')
  else
  begin
    ap:=primeiro;
    linha:=4;
    gotoxy(10,1); write('** Nome **');
    gotoxy(10,2); write('_____________________________________________________________________________________________');
    gotoxy(30,1); write('** Preço **');
    gotoxy(50,1); write('** Codigo **');
    gotoxy(70,1); write('**Restantes**');
    
    
    
    while ap<>nil do
    begin
      gotoxy(13,linha);
      write(ap^.nome);
      gotoxy(33,linha);
      write (ap^.preco);
      gotoxy(53,linha);
      write(ap^.codigo);
      gotoxy(73,linha);
      write(ap^.restantes);
      ap:=ap^.prox;
      linha:=linha+1;
    end;
  end;
  writeln;
  writeln('Qualquer tecla para voltar');
  readkey;
end;

//procurar
procedure procurar;
var prod:string[30];
ap:^produto;
begin
  clrscr;
  if primeiro=nil then
  writeln('Nao existem produtos')
  else
  begin
    write('Qual é o nome do produto a procurar? ');
    Readln(prod);
    ap:=primeiro;
    while ap<> nil do
    begin
      if ap^.nome=prod then
      begin
        writeln('Produto : ',ap^.nome);
        writeln('Valor : ' ,ap^.preco);
        writeln('Código : ' ,ap^.codigo);
        writeln('Quantidade : ' ,ap^.restantes);
      end;
      ap:=ap^.prox;
    end;
  end;
  write('Qualquer tecla para voltar');
  readkey;
end;

//editar
procedure alterar;
var pp:string[10];
linha:integer;
ap:^produto;
begin
  clrscr;
  if primeiro=nil then
  writeln('Não existem produtos')
  else
  begin
    ap:=primeiro;
    linha:=4;
    gotoxy(10,1); write('** Nome **');
    gotoxy(10,2); write('_______________________________________________________________________');
    gotoxy(30,1); write('** Preço **');
    gotoxy(50,1); write('** Codigo **');
    gotoxy(70,1); write('**Restantes**');
    
    
    
    while ap<>nil do
    begin
      gotoxy(13,linha);
      write(ap^.nome);
      gotoxy(33,linha);
      write (ap^.preco);
      gotoxy(53,linha);
      write(ap^.codigo);
      gotoxy(73,linha);
      write(ap^.restantes);
      ap:=ap^.prox;
      linha:=linha+1;
    end;
    begin
      Writeln('');
      writeln('Qual é o nome do produto a editar?');
      Readln(pp);
      ap:=primeiro;
      while ap<> nil do
      begin
        if ap^.nome<>pp then
        writeln('Nao encontrado')
        else
        begin
          writeln ('Qual é o nome do produto?');
          Readln(ap^.nome);
          repeat
            writeln ('Qual é o valor do produto?');
            Readln(ap^.preco);
          until (ap^.preco>=1) ;
          writeln ('Qual é o codigo do produto?');
          Readln(ap^.codigo);
          repeat
            writeln('Qual a quantidade existente do produto?');
            readln(ap^.restantes);
          until(ap^.restantes)>=0;
          writeln();
        end;
        ap:=ap^.prox;
      end;
      
    end;
    write('Qualquer tecla para voltar');
    readkey;
  end;
end;


//apagar
procedure apagar;
var ap,ap1,ap2:^produto;
app:string[30];

begin
  clrscr;
  if primeiro=nil then
  Begin
    writeln('Não existem produtos');
    writeln;
    writeln('Prima qualquer tecla para voltar ao menu.');
    readkey;
    exit;
  End;
  
  writeln('Qual é o nome do produto a remover?');
  readln(app);
  
  if app=primeiro^.nome then
  Begin
    ap1:=primeiro;
    primeiro:=primeiro^.prox;
    writeln('Foi removido o produto ',ap1^.nome);
    dispose(ap1);
    writeln('Qualquer tecla para voltar ao menú...');
    readkey;
    exit;
  end;
  
  ap1:=primeiro;
  ap2:=primeiro^.prox;
  Repeat
    if upcase(ap2^.nome)=upcase(app) then
      begin
        ap:=ap2;
        ap1^.prox:=ap2^.prox;
        writeln('Foi removido o produto: ',ap2^.nome);
        dispose(ap2);
        writeln('Qualquer tecla para voltar ');
        readkey;
        exit;
      end;
      ap1:=ap2;
      ap2:=ap2^.prox;
    until ap2=nil;
  end;
  
  
  
  
  
  
  //carrinho
  procedure carrinho;
  var ap:^produto;
  x:integer;
  preco,carrinho:real;
  nome:string[30];
  
  linha:integer;
  begin
    clrscr;
    if primeiro=nil then
    writeln('Não há nada para comprar!')
    else
    begin
      ap:=primeiro;
      linha:=4;
      gotoxy(10,1); write('** Nome **');
      gotoxy(10,2); write('_______________________________________________________________________');
      gotoxy(30,1); write('** Preço **');
      gotoxy(50,1); write('** Codigo **');
      gotoxy(70,1); write('**Restantes**');
    end;
    
    
    while ap<>nil do
    begin
      gotoxy(13,linha);
      write(ap^.nome);
      gotoxy(33,linha);
      write (ap^.preco);
      gotoxy(53,linha);
      write(ap^.codigo);
      gotoxy(73,linha);
      write(ap^.restantes);
      
      ap:=ap^.prox;
      linha:=linha+1;
    end;
     writeln('');
     writeln('Qual é o nome do produto a comprar: ');
     Readln(nome);
     ap:=primeiro;
     while ap<> nil do
     begin
     begin     
     if ap^.nome=nome then
     if ap^.restantes<=0 then
       writeln('Sem stock neste produto.');
     if ap^.restantes>0 then
       writeln('Existe ',ap^.restantes,' produtos restantes');
       Writeln('Qual a quantidade de produtos que quer comprar?');
     readln(x);
    
    ap^.restantes:=ap^.restantes - x ;
    preco:=(ap^.preco)*x;
    carrinho:=(preco + carrinho);
    writeln('Valor a pagar: ',carrinho,' Euros.');
    end;    
   ap:=ap^.prox;
   end;   
   write('Qualquer tecla para voltar');
   readkey;
  end;

//Programa
begin
  primeiro:=nil;
  repeat
    textcolor(white);
    
    clrscr;
    writeln('                                  **********************');
    writeln('                                  *        Menu        *');
    writeln('                                  **********************');
    writeln('');
    writeln('');
    writeln('                            **********************************');
    writeln('                            *1-Introduzir produto            *');
    writeln('                            *--------------------------------*');
    writeln('                            *2-vizualizar tabela de produtos *');
    writeln('                            *--------------------------------*');
    writeln('                            *3-procurar um produto           *');
    writeln('                            *--------------------------------*');
    writeln('                            *4-alterar tabela de produtos    *');
    writeln('                            *--------------------------------*');
    writeln('                            *5-remover produto da tabela     *');
    Writeln('                            *--------------------------------*');
    writeln('                            *6-Adicionar ao carrinho         *');
    writeln('                            *--------------------------------*');
    writeln('                            *9-sair                          *');
    writeln('                            **********************************');
    
    opcao:=readkey;
    if opcao='1' then inserir;
    if opcao='2' then vizualizar;
    if opcao='3' then procurar ;
    if opcao='4' then alterar;
    if opcao='5' then apagar;
    if opcao='6' then carrinho;
  until opcao='9';
  clrscr;
end.
Posted (edited)

Procure organizar mais o seu código... Está difícil de compreender... E da próxima vez, coloque seu código no lugar indicado:

Program mercado ;
type
produto=record
  nome:string[20];
  preco:real;
  codigo:string[30];
  restantes:integer;
  prox:^produto;
end;
var opcao :char;
primeiro:^produto;


//inserir
Procedure inserir;
VAR ap:^produto;
Begin
  clrscr;
  new(ap);
  writeln ('Qual é o nome do produto?');
  Readln(ap^.nome);
  repeat
    writeln ('Qual é o valor do produto?');
    Readln(ap^.preco);

  until (ap^.preco>=1) ;
  writeln ('Qual é o codigo do produto?');
  Readln(ap^.codigo);
  repeat
    writeln('Qual a quantidade existente do produto?');
    readln(ap^.restantes);
  until(ap^.restantes)>=0;
  
  
  ap^.prox:=primeiro;
  primeiro:=ap;
end;


//vizualizar
procedure vizualizar;
var ap:^produto;
linha:integer;
begin
  clrscr;
  if primeiro=nil then
  writeln('Não há nada para listar...')
  else
  begin
    ap:=primeiro;
    linha:=4;
    gotoxy(10,1); write('** Nome **');
    gotoxy(10,2); write('_____________________________________________________________________________________________');
    gotoxy(30,1); write('** Preço **');
    gotoxy(50,1); write('** Codigo **');
    gotoxy(70,1); write('**Restantes**');
    
    
    
    while ap<>nil do
    begin
      gotoxy(13,linha);
      write(ap^.nome);
      gotoxy(33,linha);
      write (ap^.preco);
      gotoxy(53,linha);
      write(ap^.codigo);
      gotoxy(73,linha);
      write(ap^.restantes);
      ap:=ap^.prox;
      linha:=linha+1;
    end;
  end;
  writeln;
  writeln('Qualquer tecla para voltar');
  readkey;
end;

//procurar
procedure procurar;
var prod:string[30];
ap:^produto;
begin
  clrscr;
  if primeiro=nil then
  writeln('Nao existem produtos')
  else
  begin
    write('Qual é o nome do produto a procurar? ');
    Readln(prod);
    ap:=primeiro;
    while ap<> nil do
    begin
      if ap^.nome=prod then
      begin
        writeln('Produto : ',ap^.nome);
        writeln('Valor : ' ,ap^.preco);
        writeln('Código : ' ,ap^.codigo);
        writeln('Quantidade : ' ,ap^.restantes);
      end;
      ap:=ap^.prox;
    end;
  end;
  write('Qualquer tecla para voltar');
  readkey;
end;

//editar
procedure alterar;
var pp:string[10];
linha:integer;
ap:^produto;
begin
  clrscr;
  if primeiro=nil then
  writeln('Não existem produtos')
  else
  begin
    ap:=primeiro;
    linha:=4;
    gotoxy(10,1); write('** Nome **');
    gotoxy(10,2); write('_______________________________________________________________________');
    gotoxy(30,1); write('** Preço **');
    gotoxy(50,1); write('** Codigo **');
    gotoxy(70,1); write('**Restantes**');
    
    
    
    while ap<>nil do
    begin
      gotoxy(13,linha);
      write(ap^.nome);
      gotoxy(33,linha);
      write (ap^.preco);
      gotoxy(53,linha);
      write(ap^.codigo);
      gotoxy(73,linha);
      write(ap^.restantes);
      ap:=ap^.prox;
      linha:=linha+1;
    end;
    begin
      Writeln('');
      writeln('Qual é o nome do produto a editar?');
      Readln(pp);
      ap:=primeiro;
      while ap<> nil do
      begin
        if ap^.nome<>pp then
        writeln('Nao encontrado')
        else
        begin
          writeln ('Qual é o nome do produto?');
          Readln(ap^.nome);
          repeat
            writeln ('Qual é o valor do produto?');
            Readln(ap^.preco);
          until (ap^.preco>=1) ;
          writeln ('Qual é o codigo do produto?');
          Readln(ap^.codigo);
          repeat
            writeln('Qual a quantidade existente do produto?');
            readln(ap^.restantes);
          until(ap^.restantes)>=0;
          writeln();
        end;
        ap:=ap^.prox;
      end;
      
    end;
    write('Qualquer tecla para voltar');
    readkey;
  end;
end;


//apagar
procedure apagar;
var ap,ap1,ap2:^produto;
app:string[30];

begin
  clrscr;
  if primeiro=nil then
  Begin
    writeln('Não existem produtos');
    writeln;
    writeln('Prima qualquer tecla para voltar ao menu.');
    readkey;
    exit;
  End;
  
  writeln('Qual é o nome do produto a remover?');
  readln(app);
  
  if app=primeiro^.nome then
  Begin
    ap1:=primeiro;
    primeiro:=primeiro^.prox;
    writeln('Foi removido o produto ',ap1^.nome);
    dispose(ap1);
    writeln('Qualquer tecla para voltar ao menú...');
    readkey;
    exit;
  end;
  
  ap1:=primeiro;
  ap2:=primeiro^.prox;
  Repeat
    if upcase(ap2^.nome)=upcase(app) then
      begin
        ap:=ap2;
        ap1^.prox:=ap2^.prox;
        writeln('Foi removido o produto: ',ap2^.nome);
        dispose(ap2);
        writeln('Qualquer tecla para voltar ');
        readkey;
        exit;
      end;
      ap1:=ap2;
      ap2:=ap2^.prox;
    until ap2=nil;
  end;
  
  
  
  
  
  
  //carrinho
  procedure carrinho;
  var ap:^produto;
  x:integer;
  preco,carrinho:real;
  nome:string[30];
  
  linha:integer;
  begin
    clrscr;
    if primeiro=nil then
    writeln('Não há nada para comprar!')
    else
    begin
      ap:=primeiro;
      linha:=4;
      gotoxy(10,1); write('** Nome **');
      gotoxy(10,2); write('_______________________________________________________________________');
      gotoxy(30,1); write('** Preço **');
      gotoxy(50,1); write('** Codigo **');
      gotoxy(70,1); write('**Restantes**');
    end;
    
    
    while ap<>nil do
    begin
      gotoxy(13,linha);
      write(ap^.nome);
      gotoxy(33,linha);
      write (ap^.preco);
      gotoxy(53,linha);
      write(ap^.codigo);
      gotoxy(73,linha);
      write(ap^.restantes);
      
      ap:=ap^.prox;
      linha:=linha+1;
    end;
     writeln('');
     writeln('Qual é o nome do produto a comprar: ');
     Readln(nome);
     ap:=primeiro;
     while ap<> nil do
     begin
     begin     
     if ap^.nome=nome then
     if ap^.restantes<=0 then
       writeln('Sem stock neste produto.');
     if ap^.restantes>0 then
       writeln('Existe ',ap^.restantes,' produtos restantes');
       Writeln('Qual a quantidade de produtos que quer comprar?');
     readln(x);
    
    ap^.restantes:=ap^.restantes - x ;
    preco:=(ap^.preco)*x;
    carrinho:=(preco + carrinho);
    writeln('Valor a pagar: ',carrinho,' Euros.');
    end;    
   ap:=ap^.prox;
   end;   
   write('Qualquer tecla para voltar');
   readkey;
  end;

//Programa
begin
  primeiro:=nil;
  repeat
    textcolor(white);
    
    clrscr;
    writeln('                                  **********************');
    writeln('                                  *        Menu        *');
    writeln('                                  **********************');
    writeln('');
    writeln('');
    writeln('                            **********************************');
    writeln('                            *1-Introduzir produto            *');
    writeln('                            *--------------------------------*');
    writeln('                            *2-vizualizar tabela de produtos *');
    writeln('                            *--------------------------------*');
    writeln('                            *3-procurar um produto           *');
    writeln('                            *--------------------------------*');
    writeln('                            *4-alterar tabela de produtos    *');
    writeln('                            *--------------------------------*');
    writeln('                            *5-remover produto da tabela     *');
    Writeln('                            *--------------------------------*');
    writeln('                            *6-Adicionar ao carrinho         *');
    writeln('                            *--------------------------------*');
    writeln('                            *9-sair                          *');
    writeln('                            **********************************');
    
    opcao:=readkey;
    if opcao='1' then inserir;
    if opcao='2' then vizualizar;
    if opcao='3' then procurar ;
    if opcao='4' then alterar;
    if opcao='5' then apagar;
    if opcao='6' then carrinho;
  until opcao='9';
  clrscr;
end.

Isto irá ajudar. Como o nosso amigo @nunopicado já resolveu o problema, não tenho mais o que falar. :)_
 

Edited by BHAMF

Brenio Hallison A.M. Filho

 

Posted
1 hora atrás, Joao2002 disse:

Ainda tenho muitos erros e ainda estou a aperfeiçoar tudo mas o programa é o seguinte:

Não vale a pena colocares o código todo aqui, até porque ninguém vai ler 331 linhas de código por causa de uma dúvida que já tinhas explicado correctamente no primeiro post (e que por sinal, já tens resposta para ela). 😉

  • Vote 1

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

  • 4 weeks later...
Posted (edited)
Em 04/11/2018 às 10:38, nunopicado disse:

@Joao2002

Uma variável Integer não pode nunca receber valores não numéricos, como já percebeste. Ao leres com o ReadLn directamente para a variável Integer, estás a responsabilizar o utilizador com a tarefa de inserir os dados correctos na variável, mas o utilizador, como todos sabemos, não tem capacidade mental para ser responsabilizado com coisas importantes 😛, pelo que cabe ao programador, neste caso tu, controlar o que vai para a variável. 

Para isto, o que tens de fazer, é fazer o ReadLn não para a variável Integer directamente, mas para uma variável temporária do tipo String (que aceita qualquer caracter). Desta forma o programa não crasha ao fazer a leitura. 

De seguida, tens de verificar se o valor que está nessa variável String é um valor numérico válido, e se sim, passá-lo então para dentro da variável Integer

Para isto deves usar, por exemplo, a função Val, que funciona da seguinte forma:


Var
  Valor: Integer;
  Erro: Integer;
  ValorInserido: string;

begin
  repeat 
    ReadLn(ValorInserido);
    Val(ValorInserido, Valor, Erro);
    if Erro <> 0
      then WriteLn('Insira um valor numérico!');
  until Erro = 0;
end. 

Desta forma, a função Val irá colocar na variável Valor aquilo que o utilizador escreveu apenas se for um Integer válido (e nesse caso, a variável Erro ficará com o valor 0).

Se o que o utilizador inseriu forem letras ou outro qualquer símbolo não numérico, a variável Erro irá ficar com um valor diferente de 0, e o programa não irá crashar, dando-te a possibilidade de testares e até avisares o utilizador do seu erro. 

E estando assim dentro de um ciclo Repeat Until, ele irá repetir o processo até que o utilizador insira o valor correcto. 

 

Se aplicares isto ao teu programa, poderás usar o mesmo ciclo se lhe puseres as duas condições, o controlo da variável Erro (primeira condição) e se a Valor é maior ou igual a 1 (segunda condição). 

 

 

@joao_o grande

A tua sugestão irá sofrer dos mesmos problemas, porque continuas a ler directamente para uma variável Integer

Outra coisa:

Se o problema fosse o nome da variável, o programa não crashava, porque simplesmente nem compilava. Aqui entra a diferença entre erros de compilação e erros de execução

No caso, o nome da variável está correcto, porque o @Joao2002 está a usar ponteiros. As variáveis do tipo ponteiro têm de ser referenciadas (quando se quer aceder ao seu valor e não ao seu endereço de memória) com o circunflexo no fim do identificador. 

Eu pensei em utilizar de seu código para resolver alguns problemas com a mesma finalidade, o problema é que quando executo o programa ele repete a mensagem "Digite um valor numérico!" até quando eu digito um valor numérico, você poderia me ajudar com esse problema? Acho que entendi o código de maneira errada.

Obs: Primeira vez que uso a função "Val".

Edited by Marcos Vinícius
Posted
4 minutos atrás, Marcos Vinícius disse:

(...) o problema é que quando executo o programa ele repete a mensagem "Digite um valor numérico!" até quando eu digito um valor numérico, (...)

Se assim é, não é um problema... 😄 Era essa a ideia desse código.

A função Val irá colocar na variável Erro (3º parâmetro) o valor 0 se a variável ValorInserido (1º parâmetro) tiver uma string convertível em valor numérico.
Se não é esse o comportamento que precisas, então terás de adaptar o que queres, ou no mínimo, explicar aqui o que é.

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

Posted
20 minutos atrás, nunopicado disse:

Se assim é, não é um problema... 😄 Era essa a ideia desse código.

A função Val irá colocar na variável Erro (3º parâmetro) o valor 0 se a variável ValorInserido (1º parâmetro) tiver uma string convertível em valor numérico.
Se não é esse o comportamento que precisas, então terás de adaptar o que queres, ou no mínimo, explicar aqui o que é.

Ok, deixarei uma explicação:

Desejo que qualquer programa que eu crie aceite uma variável string como base para que não ocorra mais o erro "...non-numeric...".

Então, desejo que quando o usuário digitar qualquer carácter que não seja um número, que ele receba a mensagem "Digite um valor numérico!" até que um valor numérico seja digitado. Se o usuário insistir em digitar uma letra ou um símbolo, o programa permanecerá em um loop até que o usuário escolha um número.

Posted
23 horas atrás, Marcos Vinícius disse:

Desejo que qualquer programa que eu crie aceite uma variável string como base para que não ocorra mais o erro "...non-numeric...".

Conforme o @nunopicado referiu:

23 horas atrás, nunopicado disse:

A função Val irá colocar na variável Erro (3º parâmetro) o valor 0 se a variável ValorInserido (1º parâmetro) tiver uma string convertível em valor numérico.

Portanto, precisas de analisar o valor devolvido para o 3º argumento para saber se o valor lido é numérico ou não.

program exemplo;
var
  s : string;
  i : integer;
  e : word;
begin
  repeat
    write('Insira numero inteiro: ');
    readln(s);
    val(s, i, e);
    if (e = 0) then
      writeln('Isso não é um inteiro! Erro na posição ', e);
  until (e = 0);
  writeln('Valor inserido foi: ', i);
end;

Cumprimentos.

Knowledge is free!

Posted

@thoga31

Só uma pequena errata:
 

if (e = 0) then

Acho que querias dizer:

if (e <> 0) then

😉

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

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.