sabing Posted March 16, 2012 Report Share Posted March 16, 2012 me ajuda pessoal Program nota; var nota2,nota1,media:Real; confirmar,sair:String[1]; aluno:String[10]; Begin repeat repeat write('Digite o nome do aluno = '); read(aluno); write('Digite a primeira nota = '); read(nota1); if(nota1 <0) then begin write('Nota invalida'); break; end; write('Digite a segunda nota = '); read(nota2); if(nota2<0) then begin write('Nota invalida'); break; end; write('Os valores estão corretos? S/N : '); read(sair); // verificar se o s ou n maiuscolo se não dar um erro e voltar a na messagem(write('Os valores estão corretos? S/N : ') until sair = 'S'; media:=(nota1+nota2)/2; if(media > 6 ) then begin write('Aprovado ',aluno,' = ',media); end; if(media = 6) then begin write('Aprovado ',aluno,' = ',media); end; if(media < 3) then begin write('Reprovado ',aluno,' = ',media); end; if(media < 3 ) then begin write('O aluno está em exame ',aluno,' = ',media); end; if(media < 6) then begin write('O aluno está em exame ',aluno,' = ',media); end; if(media = 3 ) then begin write('O aluno está em exame ',aluno,' = ' ,media); end; write('Deseja sair do programa ? S/N'); read(confirmar); // verificar se o s ou n maiuscolo se não dar um erro e voltar a na messagem( write('Deseja sair do programa ? S/N') until confirmar = 'S' End. Link to comment Share on other sites More sharing options...
nunopicado Posted March 16, 2012 Report Share Posted March 16, 2012 Se usares a função UpCase, podes sempre testar assumindo que é maiúscula: . . . until UpCase(Confirmar) = 'S'; Assim, mesmo que o utilizador insita minúscula, ele irá testar correctamente. Em alternativa, podes colocar as duas opções: . . . until (Confirmar = 'S') or (Confirmar = 's'); "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. Link to comment Share on other sites More sharing options...
nunopicado Posted March 16, 2012 Report Share Posted March 16, 2012 Desculpa, não tinha reparado que era para dar erro se for minúsculo... Para verificares isso, tens de testar o valor ASCII do caracter lido. Se este valor estiver entre 65 (A máiusculo) e 90 (Z maiusculo) é está em maiusculas. Se estiver entre 97 e 122 é minúsculo. Para veres este valor, precisas da função ORD, que aceita um argumento do tipo char. . . . repeat write('Deseja sair do programa ? S/N'); read(confirmar); if ord(confirmar[1]) in [97..122] then writeln('erro! tem de escrever em maiúculas'); until ord(Confirmar[1]) in [65..90]; // verificar se o s ou n maiuscolo se não dar um erro e voltar a na messagem( write('Deseja sair do programa ? S/N') until confirmar = 'S' Com isto, na hora de ler a pergunta, ele irá tentar ler até que a tecla seja maiúscula, e irá apresentar um erro de cada vez que seja minúscula. "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. Link to comment Share on other sites More sharing options...
sabing Posted March 16, 2012 Author Report Share Posted March 16, 2012 eu estou usando o compiladora pascalzim Program nota; var nota2,nota1,media:Real; confirmar,sair:String[1]; aluno:String[10]; Begin repeat repeat write('Digite o nome do aluno = '); read(aluno); write('Digite a primeira nota = '); read(nota1); if(nota1 <0) then begin write('Nota invalida'); break; end; write('Digite a segunda nota = '); read(nota2); if(nota2<0) then begin write('Nota invalida'); break; end; write('Os valores estão corretos? S/N : '); read(sair); until sair = 'S'; media:=(nota1+nota2)/2; if(media > 6 ) then begin write('Aprovado ',aluno,' = ',media); end; if(media = 6) then begin write('Aprovado ',aluno,' = ',media); end; if(media < 3) then begin write('Reprovado ',aluno,' = ',media); end; if(media < 3 ) then begin write('O aluno está em exame ',aluno,' = ',media); end; if(media < 6) then begin write('O aluno está em exame ',aluno,' = ',media); end; if(media = 3 ) then begin write('O aluno está em exame ',aluno,' = ' ,media); end; write('Deseja sair do programa ? S/N'); read(confirmar); if ord(confirmar[1]) in [97..122] then // ele esta dando erro no in por que será? writeln('erro! tem de escrever em maiúculas'); until ord(Confirmar[1]) in [65..90]; until confirmar = 'S' End. EDIT: GeSHi adicionado. thoga31 Link to comment Share on other sites More sharing options...
nunopicado Posted March 16, 2012 Report Share Posted March 16, 2012 O PascalZim não é um compilador, é um interpretador, e dos bem fracos... 🙂 Só tem um conjunto muito reduzido de funções do pascal. No caso, a palavra-chave IN não é reconhecida. Podes fazer assim: . . . . repeat // o repeat deste teste tem de ficar aqui... Se ficar a seguir ao outro vai repetir todo o programa se o utilizador colocar minuscula write('Deseja sair do programa ? S/N'); read(confirmar); if (ord(confirmar[1])>=97) and (ord(confirmar[1])<=122) then // ele esta dando erro no in por que será? writeln('erro! tem de escrever em maiúculas'); until (ord(confirmar[1])>=65) and (ord(confirmar[1])<=90) until confirmar = 'S' "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. Link to comment Share on other sites More sharing options...
thoga31 Posted March 16, 2012 Report Share Posted March 16, 2012 @nunopicado... é mesmo necessário o ORD? Eu acho que só complica, havendo o operador IN e uma cena maravilhosa chamada Conjuntos... 🙂 E @sabing, isto de verificar em maiúsculas e não dar a chance de ser minúscula complica a história, não só ao programador bem como ao utilizador... ? Uma solução ord-free: const maiusculas : set of char = ['A'..'Z']; opcoes_saida : set of char = ['S','N']; repeat (* PROGRAMA *) repeat (* verificação de saída *) repeat writeln; write('Deseja sair? S/N '); read(confirmar); if not (confirmar in maiusculas) then write('Escreva em maiusculas!'); until (confirmar in maiusculas); // tem de estar em maiúsculas if not (confirmar in opcoes_saida) then write('Moço! Ou S, ou N! Tah? xD'); until (confirmar in opcoes_saida); // deve ser só "S" ou "N" until (confirmar = 'S'); // Se "S", sai do programa. Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted March 16, 2012 Report Share Posted March 16, 2012 Ele não pode usar o IN... É PZim user! 🙂 Mas tens razão, nem precisava usar o ORD (sexta ao fim da tarde, mania de complicar). Bastava fazer: . . . . repeat // o repeat deste teste tem de ficar aqui... Se ficar a seguir ao outro vai repetir todo o programa se o utilizador colocar minuscula write('Deseja sair do programa ? S/N'); read(confirmar); if (confirmar[1]>='a') and (confirmar[1]<='z') then // ele esta dando erro no in por que será? writeln('erro! tem de escrever em maiúculas'); until (confirmar[1]>='A') and (confirmar[1])<='Z') until confirmar = 'S' Como o tipo char também é ordinal, pode ser assim... PS: Para o Sabing, ou o moderador aqui presente, ponham lá as tags de código no ultimo post do Sabing, que aquilo assim fica feio... 🙂 "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. Link to comment Share on other sites More sharing options...
sabing Posted March 16, 2012 Author Report Share Posted March 16, 2012 Funcionou perfeitamente muito obrigado ! mesmo Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now