while não funciona [RESOLVIDO]

1. while não funciona [RESOLVIDO]

JD
HERO_JD

(usa Ubuntu)

Enviado em 22/03/2016 - 13:59h

Olá a todos. estou precisando de ajuda em um código em pascal. Uso o linux mint com o geany e o compilador fpc.
O problema é o seguinte. Eu fiz um código simples para o cálculo da média em que o programa pede uma nota e pergunta se vou inserir mais alguma nota se sim, então o programa pede outra nota e assim por diante. Só que quando digito a primeira nota e aperto ENTER, o while finaliza. Alguma idéia do que seja? segue o código:

Program media_de_notas;
uses crt;

var j: integer;
nota, nota1, media:real;
finalizar, nota2, nota3:string;
Begin
finalizar:='i';
j:=0;
nota:=0;
nota3:='';
while(finalizar='i')or(finalizar='I') do
begin
writeln;
writeln(' Cálculo da média de notas !!!');
writeln;
write(' nota: ');
read(nota1);
writeln;
write(' Confirme a nota: ');
read(nota2);
writeln;
j:=j+1;
nota:=nota+nota1;
nota3:= nota3 + nota2 + ', ';
writeln(' (i) Inserir nota');
writeln(' (f) Finalizar e exibir Média');
write(' Opção: ');
read(finalizar); clrscr;
end;
media:=nota/j;
writeln;
writeln(' Cálculo da média de notas !!!');
writeln;
writeln(' Foram digitadas ',j,' notas: ',nota3);
writeln;
writeln(' Média = ',media:2:2);
writeln;
write(' Tecle para sair ');
readkey;
End.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/03/2016 - 11:34h

Você deve usar readln() para leituras. Se não o fizer, o caráter correspondente ao final da linha não é removido do buffer de entrada. Se a operação de leitura seguinte for de leitura de caracteres ou de strings, a marca de fim de linha vai ser interpretada como parte dessa leitura.

Se tem dúvidas, faça o teste com o seguinte programa.

program teste;

var
i: integer;
s: string;

begin
write('Entre com um inteiro: ');
read(i); { Troque depois por “readln”. }
writeln('O número digitado foi ', i, '.');
write('Entre com um texto: ');
read(s);
writeln('O comprimento do texto digitado é ', length(s), '.')
end.


Compile, e depois execute do seguinte modo:

cat <<EOM | ./lixo
42
Teste
EOM


Provavelmente, você vai receber como saída na versão com read que o comprimento do texto digitado é zero. Se você trocar o primeiro read (não o segundo, embora seja saudável trocá-lo também) por readln, e recompilá-lo e rodar o mesmo comando, aí sim terá que o comprimento do texto é igual a 5.

3. Funciona sim.Erro seu

Almir Bispo dos Santos Filho
gibroh@hotmail.c

(usa Lubuntu)

Enviado em 22/03/2016 - 14:18h

O While funciona perfeitamente.Você que está errando no codigo.
Note que você atribuiu 'i' para a variável finalizar logo depois de begin do inicio do programa.Dessa forma o while é satisfeito no primeiro ciclo,indo direto para o termino do programa.



4. Re: while não funciona

JD
HERO_JD

(usa Ubuntu)

Enviado em 22/03/2016 - 14:38h

ta deixa eu ver se entendi sua explicação:
vc diz essa parte...
finalizar:='i';
j:=0;
nota:=0;
nota3:='';
while(finalizar='i')or(finalizar='I') do
begin ...
mas com [finalizar:='i'] e fazendo um [while(finalizar='i')] ele não deveria repetir até eu digitar um comando diferente em
writeln(' (i) Inserir nota');
writeln(' (f) Finalizar e exibir Média');
write(' Opção: ');
read(finalizar);


5. Re: while não funciona

Almir Bispo dos Santos Filho
gibroh@hotmail.c

(usa Lubuntu)

Enviado em 22/03/2016 - 14:46h

Realmente foi um equivoco meu.
Se você atribuiu 'i' ao finalizar o laço deve realmente rodar enquanto finalizar é "i".
Vou copiar seu codigo e debugar aqui


6. Re: while não funciona [RESOLVIDO]

JD
HERO_JD

(usa Ubuntu)

Enviado em 22/03/2016 - 14:52h

mudei o código, agora fiz o finalizar como real
finalizar:=0;
j:=0;
nota:=0;
nota3:='';
while(finalizar=0) do
begin...

e no final

writeln(' [0] Inserir nota');
writeln(' [1] Finalizar e exibir Média');
write(' Opção: ');
read(finalizar);

agora o while funciona mas o programa pula a parte
write(' Confirme a nota: ');
read(nota2);
acho que o problema é com string pois a (nota2) é string
veja como ficou

Program media_de_notas;
uses crt;

var j: integer;
finalizar, nota, nota1, media:real;
nota2, nota3:string;
Begin
finalizar:=0;
j:=0;
nota:=0;
nota3:='';
while(finalizar=0) do
begin
writeln;
writeln(' Cálculo da média de notas !!!');
writeln;
write(' nota: ');
read(nota1);
writeln;
write(' Confirme a nota: ');
read(nota2);
writeln;
j:=j+1;
nota:=nota+nota1;
nota3:= nota3 + nota2 + ', ';
writeln(' [0] Inserir nota');
writeln(' [1] Finalizar e exibir Média');
write(' Opção: ');
read(finalizar);
clrscr;
end;
media:=nota/j;
writeln;
writeln(' Cálculo da média de notas !!!');
writeln;
writeln(' Foram digitadas ',j,' notas: ',nota3);
writeln;
writeln(' Média = ',media:2:2);
writeln;
write(' Tecle para sair ');
readkey;
End.




7. Re: while não funciona

Almir Bispo dos Santos Filho
gibroh@hotmail.c

(usa Lubuntu)

Enviado em 22/03/2016 - 15:12h

Achei o erro:
Quando pede entrada de variavel para "finalizar" então o while deixa de ser "I" saindo do laço.
writeln(' Opção: ');
readln(finalizar);


Crie mais uma variavel para opção e substitua:
writeln(' Opção: ');
readln(opcao);



8. Re: while não funciona

JD
HERO_JD

(usa Ubuntu)

Enviado em 22/03/2016 - 15:21h

problema persiste. acho que deve ser um problema com meu compilador
da uma olhada neste código teste
program teste;

var nome:string;
repetir:integer;
Begin
repetir:=0;

while(repetir=0)do
begin
write('Digite seu nome: ');
read(nome);

write('Seu nome é: ',nome);
writeln;
writeln('digitar outro nome: 0');
writeln('finalizar: 1');
write('opção: ');
read(repetir);
end;
End.
ele pede um nome e quando solicita para digitar outro nome ele passa direto pelo [digite seu nome] e para nas opções de digitar outro nome ou finalizar.


9. Re: while não funciona [RESOLVIDO]

Guilherme
guipsp

(usa Ubuntu)

Enviado em 22/03/2016 - 16:55h

Tente usar o readln. O read parece estar mantendo o buffer do teclado.


10. Re: while não funciona [RESOLVIDO]

JD
HERO_JD

(usa Ubuntu)

Enviado em 04/04/2016 - 18:41h

Realmente é preciso usar readln(). Funcionou!!!
Gostaria de agradecer a ajuda de todos.
realmente guipsp tem que usar assim mesmo.
paulo1205, Muito obrigado pela explicação, não tinha me tocado da questão do buffer. Esse problema do buffer também acontece em C, mas não sabia que ocorria com PASCAL. MUITO OBRIGADO A TODOS GENTE!!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts