Ir ao conteúdo
  • Cadastre-se

Problema com Compilação no Pascal


leonardoLima

Posts recomendados

Galera eu to tentando desenvolver um programa no qual ele me diz a quantidade de alunos: Aprovados, Reprovados e em Recuperação. Porém a copilação do pascal não ta salvando a última compilação executada!

O Codigo é esse:

program project1;

var

Nota1: real;
Nota2: real;
aprovado: integer;
reprovado: integer;
recuperacao: integer;
resultado: real;

Begin

write ('Digite sua Primeira Nota ');
readln(Nota1);
write ('Digite sua Segunda Nota ');
readln(Nota2);
resultado:= Nota1+Nota2/2;

if (resultado)>= 7 then

aprovado:= aprovado + 1;
write ('Temos ', aprovado, ' aluno(s) Aprovados');

if (resultado)= 5 or 6 then

recuperacao:= recuperacao + 1;
write('Temos ', recuperacao, ' aluno(s) em Recuperacao');

if (resultado) <= 4 then

reprovado:= reprovado + 1;
write('Temos ', reprovado, ' aluno(s) Reprovados');

end.

Eu compilo e executo normalmente o programa, só que depois quando eu reabro o programa os dados da ultima compilação não fica salvo!

Alguém poderia me dizer o que eu devo colocar/alterar no codigo para que salve os dados da ultima compilação?

Desde já Agradeço a Todos!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
[..]Porém a copilação do pascal não ta salvando a última copilação executada!]

leonardoLima, isso é normal, pois as variáveis estão armazenadas na memória ram e quando a aplicação é finalizada as variáveis são "descartadas". Quando o programa reinicia, ele realoca outros espaços novos.

Em fim, para persistir os dados você pode utilizar de arquivos de texto ou arquivos binários, entretanto esses recursos são "mais avançados" e dependem de outros recursos que ainda, provavelmente, não foram vistos ainda, como laço repetições por exemplo. Não é que não possa usar ou não deve aprender, basicamente o que quero dizer é que creio que ainda não é o momento.

Não dá para sair correndo, enquanto ainda esta aprendendo a engatilhar

Sugiro pelo menos já dominar os conceitos de:

- Estruturas de seleção (if, if/else e case);

- Estruturas de repetição; (for, repeat e while);

- Vetores (array);

- Registro (record);

Existem outros conceitos importantes com:

- Procedimentos (functions e procedures);

- Bibliotecas (units)

- Gerenciamento de memória (ponteiros)

Por ai vai, daí aproveitar dos recursos de persistência de dados (arquivos).

Veja, até dá para implementar arquivos logo de cara, mais na melhor das hipóteses não vale pena (no mínimo pelo trabalho dado).

Abaixo algumas correções no seu código (comentadas):

program project1;
var
{
Nota1: real;
Nota2: real;
aprovado: integer;
reprovado: integer;
recuperacao: integer;
resultado: real;
}
Nota1,
Nota2 :real;
aprovado,
reprovado,
recuperacao :integer;
resultado: real;

BEGIN
write('Digite sua Primeira Nota ');
readln(Nota1);
write('Digite sua Segunda Nota ');
readln(Nota2);
{resultado:= Nota1+Nota2/2;} {assim está dividindo antes (errado)}
resultado:=(Nota1+Nota2)/2; { "()" tem preferência para "/"}
if (resultado)>= 7 then
aprovado:= aprovado+1;
write ('Temos ', aprovado, ' aluno(s) Aprovados');
{if (resultado)=5 or 6 then} {o mesmo que (resultado)=(5 or 6) - não é o que você quer!}
if (resultado=5) or (resultado=6) then {assim seria mais correto}
recuperacao:=recuperacao+1;
write('Temos ', recuperacao, ' aluno(s) em Recuperacao');
if (resultado)<= 4 then
reprovado:= reprovado + 1;
write('Temos ', reprovado, ' aluno(s) Reprovados');
END.

Precisaria corrigi ainda outras coisas, como:

1) Uso de if/else, e não if simples;

Pois as condições são "mutualmente exclusivas entre si", ou seja, ou vai ser uma ou vai ser outra! (não pode ser mais de uma coisa). (se ainda não conhece if/else ignore esse comentário - ou se aprofunde no assunto ^_^)

2) Faixa de notas

Vou deixar você mesmo analisar: e se o resultado der 5.6 ou 6.2 ou 4.1.. qual seria a situação? nenhuma? ou seja, algumas faixas de valores não estão sendo tratados..

Por ai vai...

No aguardo

Abraços

Link para o comentário
Compartilhar em outros sites

EstilingueAtomico, obrigado por suas citações vou procurar me aprofundar no assuntos citados por você! Eu estudo pascal na escola, teve uma vez que eu fiz um programa e no final coloquei

Write ('Tecle <enter> para Fechar a Janela');

read();

Ai ele mandou eu tirar que era pro programa guarda as informações da ultima copilação, só não lembro como foi que fiz!

Mas vou procurar me aprofundar nos assuntos e Obrigado pelas correções no codigo.

WellingtonTelles, Obrigado por ter refeito o código, eu vou analisar o seu código também.

Obrigado por terem me ajudado!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
EstilingueAtomico, obrigado por suas citações vou procurar me aprofundar no assuntos citados por você! Eu estudo pascal na escola, teve uma vez que eu fiz um programa e no final coloquei

Write ('Tecle <enter> para Fechar a Janela');

read();

Ai ele mandou eu tirar que era pro programa guarda as informações da ultima copilação, só não lembro como foi que fiz!

Olá,

leonardoLima, esse read(); está sendo utilizado "somente para o programa não fechar sem antes de ver o resultado"... no código de WellingtonTelles, inclusive, ele usa!.

Veja essa "lógica" não vai influenciar na questão da "persistência dos dados", será simplesmente um pause mesmo!!! ou seja, como para ler uma variável do console, o read ou readln trava programa (fica aguardando um ENTER), usamos eles para funcionar como esse pause...

PS: Uma forma elegante, seria usar o ReadKey; (precisa declarar a CRT, pelo uses - como visto do código de WellingtonTelles) em vez de ReadLN. Já que este primeiro "destrava" com qualquer¹ tecla.

1-Nem todas as teclas funcionam, como "Shitf", "Ctrl", "Alt", "Print Screean" etc.

PS: Uns comentários (parecem bobos, mas as vezes podem confundir): os comandos em programação são independentes, writeln não vai influência no read ou readln. A ideia é combinar os comandos (em geral) para que o programa se comporte de forma adequada... ex.: Sem esse readln no final, o usuário ou até mesmo o programador pode dizer que o programa "não exibiu o resultado"... tecnicamente isso não seria verdade. O que pode ter acontecido é "ter exibido" e logo depois, ter fechado ou apagado. Mas ele exibiu... ^_^. Completando, no seu caso... o write exibirá a mensagem, e o read ficará aguardando algo ser digitado (ou não) e o ENTER ser pressionado. O comando que vem depois é o END., que por sua vez "finalizará" o programa.

Obs.: Existem comandos que são compostos, como o "if <condição> then", ou seja, o "if" exige o "then".. (faz parte da sintaxe do "if"), o "read", por exemplo não precisaria do "write", esse só é usado para "ajudar o usuário a saber o que deve ser digitado".

PS2:

Você pode usar:

Write para escrever, e cursor ficar no final da frase;

Writeln para escrever, e cursor descer para o início da outra linha (como um ENTER);

Mas no caso do Read x Readln, "SÓ USE" READLN, abaixo um link que fala mais sobre o tema:

Qual a diferença entre READ e READLN ???

***

WellingtonTelles, só um pequeno detalhe no seu código:

if (resultado>=5) and (resultado[COLOR="Red"]<=6[/COLOR]) then
recuperacao := recuperacao+1

if (resultado>=5) and (resultado[COLOR="Blue"]<7[/COLOR]) then
recuperacao := recuperacao+1

Para tratar a faixa de [6<X<7]

Abraços

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Claro que mostra o resultado, mas sem uma pausa só em modo DOS que é possível ver o resultado.

WellingtonTelles, não "só" (cuidado com as delimitações) pelo DOS (ou prompt do MS-DOS), é possível de outras formas.. como:

- Através da "re-visualização da tela" (user screen no TP7);

- Através de execução de outro programa após. (a tela anterior fica salva em alguns compiladores)

- Ou outra forma que eu não lembro ou desconheço...

Se usar READ e depois READLN dará problema no programa. Pode testar.

Não, não dará problema, na verdade o programa se comportará de uma forma não convencional - que é diferente de problema, ou seja, o uso do read (sem ln) tem suas características e usabilidades.. que no caso fogem do senso comum (ler do teclado e jogar numa variável e pronto) , daí a questão é saber usar e aproveitar os recursos corretamente.

Mais aqui: Qual a diferença entre READ e READLN ???

READKEY tem uso mais específico que somente uma pausa, pois irá ler uma tecla e é através dessa função que podemos fazer outros tipos de controle de teclado.

Justamente, o ReadKey não é uma pausa, ele tão tem essa finalidade. Ele serve para "'ler' uma tecla e retornar o valor dela em si mesma". Daí como observaram que ela fica aguardando uma tecla, analogicamente perceberam que o programa "trava" (fica aguardando), se comportando como pause. Logo passou também a ser usado com essa finalidade. (mais ela não foi feita pra isso). Em outras palavras: "ReadKey é um dos armengues para simular um pause".

(Dizer que o ReadKey é um pause, é o mesmo que dizer que o string é um armazenador de nomes. Não é bem sim, o string armazena uma determindada quantidade de caracteres, que por sua vez, essa característica PODE ser usada para armazenar nomes. ^_^)

Abaixo um código que fiz para demonstrar alguns comandos:

program UsandoCRT;
uses
CRT;

Const {frequencia de notas para usar no Sound()}
DO1 = 522; DOx = 533; RE = 585; REs = 610; MI = 655; FA = 693;
faz = 735; SOL = 777; SOLs= 824; LA = 871; LAs = 926; SI = 976;
var
caractere :char;
cor,
i :byte; {se não funcionar, use integer}
BEGIN
TextColor(White); {TextColor=Definir cor da letra, white=constante com valor 15}
TextBackGround(1); {TextBackGround=Definir com de fundo, 1=valor de blue - para cor azul}
ClrScr; {Limpa a tela (toda tela fica limpa e o cursor vai para posição relativa (1,1)}
TextBackGround(Red);
GotoXY(22,5); {posiciona na posição relativa coluna 10, linha 5}
writeln('PASCAL - FORUM Clube do Hardware');
writeln; {pula para linha de baixo}
CursorOff; {oculta o cursor - se nao compilar, remova-o}
{ANIMACAO 1}
TextBackGround(Black); {black=0}
for i:=1 to 26 do
begin
GotoXY(WhereX+1,WhereY);
repeat
cor:=Random(16);
until not (cor in [Black,Blue,LightBlue]); {cores que eu não quero}
TextColor(cor);
write('=>');
Delay(50);{retardo em milisegundo (como um pause com timer)}
end;

writeln;
writeln;
TextColor(White);
TextBackGround(Red);
{ANIMACAO 2}
for i:=1 to 19 do
begin
Delay(50);
DelLine;
end;

{ANIMACAO 3 - talvés o som não sai, ou seja preciso ajustar o tempo
- Aqui foi baseado no Turbo Pascal}
Sound(Do1); Delay(1000);
Sound(Re); Delay(1000);
Sound(Mi); Delay(1000);
Sound(Fa); Delay(2000);
NoSound;

ReadKey; {pause} {"simula um pause"}
END.

No aguardo

Abraços

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

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

×
×
  • Criar novo...