Logo Hardware.com.br
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas

Aprendendo pascal: Mais duvidas

#1 Por vini_bill 30/08/2005 - 11:13
Oi pessoal. Beleza? Por favor observem este código
Obs: Ele começa na linha 16! Isso porque tem uma nota da GPL sobre ele.
program bhaskara;
var
{!--Definindo variáveis}
op:integer;
a,b,c,sum,prod,delta,x1,x2:real;
begin
{!--Opções das 3 operações}
writeln ('Escolha umas das operações:');
writeln ('');
writeln ('1.Bhaskara');
writeln ('2.Produto');
writeln ('3.Soma');
writeln ('4.Sair');
writeln ('');
write ('Digite o número da sua opção:');
readln (op);
repeat
case op of
{!--Se for Bhaskara}
1: writeln('Dê-me 3 números...');
write('a:');
readln (a);
write ('b:');
readln (b);
write ('c:');
readln (c);
delta:= (b*b)-(4*(a*c));
{!--Testando delta}
if (delta<0) then
begin
writeln('Delta não existe no universo real.Não posso efetuar o cálculo.')
else
writeln ('O resultado de delta é: ',delta);
{!--Começando Bhaskara Positivo}
writeln('Efetuando Bhaskara Positivo...');
x1:=((-1*b)+sqrt(delta))/2*a;
{!--Começando Bhaskara Negativo}
writeln('Efetuando Bhaskara Negativo...');
x2:=((-1*b)-sqrt(delta))/2*a;
{!--Dando resultado}
writeln ('X positivo é: ',x1);
writeln ('X Negativo é: ',x2);
writeln ('Fim do programa');
end;
{!--Se for Produto}
2: writeln('Dê-me dois números:');
write('a:');
readln (a);
write ('c:');
readln (c);
prod:=c/a;
writeln('O produto entre C e A é: ',prod);
{!--Se for soma}
3: writeln('Dê-me dois números:');
write('a:');
readln (a);
write ('b:');
readln (b);
sum:=(-1*b)/a;
writeln ('O produto entre -B e A é:',sum);
{!--Se num for nenhuma das opções}
else writeln ('Essa opção não existe!');
end;
until op=4;
end.


Até ai tudo bem. O código parece bem legivel e limpo pra mim... dai quando eu coloco o Free Pascal pra compilar vejam o que aparece:

Free Pascal Compiler version 2.0.0 [2005/08/17] for i386
Copyright (c) 1993-2005 by Florian Klaempfl
Target OS: Linux for i386
Compiling bhaskara.pp
bhaskara.pp(36,13) Error: Constant and CASE types do not match
bhaskara.pp(36,13) Error: Constant Expression expected
bhaskara.pp(36,13) Fatal: Syntax error, ":" expected but ";" found
bhaskara.pp(36,13) Error: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specifiy a source file to be compiled)
[vinicius@fedora Bhaskara]$


O que ele tá querendo dizer pra mim? Na linha 36 tem uma variavel e não uma constante, é a leitura da variavel 'a'. E por que o Free Pascal tá esperando dois pontos ao invés do ponto e vírgula?

Valeu.

... Vinicius Menezes ...
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas
#2 Por vini_bill
30/08/2005 - 14:36
Já consegui resolver a dúvida acima mas essa aqui surgiu. No seguinte código que começa na linha 16, também não compila vejam:

program primos;
const
max=50;
var
teste: array [1..4] of real;
primo:real;
begin
writeln('Primos 2005© by waresoft©.');
writeln('');
while (teste[1]<=max) do
begin
primo:=teste[1];
teste[2]:= primo/primo;
teste[3]:= primo div primo;
teste[4]:= primo/1;
if ((teste[2]=1) and (teste[3]=0) and (teste[4]=primo)) then
begin
writeln('Esse número é primo')
else
writeln('Esse número não é primo');
end;
teste[1]=teste[1]+1;
end;
end.

[vinicius@fedora Primos]$ fpc primos.pp
Free Pascal Compiler version 2.0.0 [2005/08/17] for i386
Copyright (c) 1993-2005 by Florian Klaempfl
Target OS: Linux for i386
Compiling primos.pp
primos.pp(27,14) Error: Incompatible types: got "Double" expected "LongInt"
primos.pp(34,3) Fatal: Syntax error, ";" expected but "ELSE" found
primos.pp(34,3) Error: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specifiy a source file to be compiled)
[vinicius@fedora Primos]$


Percebem? Eu ainda não consegui entender.

Obrigado por qualquer ajuda desde já.

... Vinicius Menezes ...

Ok... O objetivo do programa é achar números primos até o número 50 ( que intuitivamente eu bem sei que não é primo ).Agora vejam as mensagens do Free Pascal:

[quote]
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#3 Por jqueiroz
30/08/2005 - 14:44
No segundo caso, eu vou mudar a indentação pra ver se você percebe qual foi o seu erro:

(...)
while (teste[1]<max) do
begin
primo:=teste[1];
teste[2]:= primo/primo;
teste[3]:= primo div primo;
teste[4]:= primo/1;
if ((teste[2]=1) and (teste[3]=0) and (teste[4]=primo)) then
begin
writeln('Esse número é primo')
else
writeln('Esse número não é primo');
end;
teste[1]=teste[1]+1;
end;
(...)


No primeiro caso, o erro não ficou muito evidente pra mim; pode ser que o compilador que você está usando não saiba fazer cases com inteiros. De qq jeito, experimente declarar "op" como

var op : 1..4;
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas
#4 Por vini_bill
30/08/2005 - 15:20
jqueiroz, mesmo com a identação mudada eu não percebi qual foi o meu erro. Tentei colocar o ponto e vírgula nesta linha:

if ((teste[2]=1) and (teste[3]=0) and (teste[4]=primo)) then
begin
writeln('Esse número é primo');
else
writeln('Esse número não é primo');
end;


...mas continua a mesma coisa. O mesmo erro. Quanto a primeira dúvida substitui os Cases ( que aparentemente só aceitam um comando ) por IFs não aninhados em um grande loop While que dá conta certinho. 8O . Queria saber uma coisa Jqueiroz, você sabe como que eu posso fazer o seguinte:

1.Escrever uma fórmula em um arquivo formula.pp
2.Num outro arquivo principal.pp escrever um menu com duas opções: 1) Formula do arquivo formula.pp e 2)Sair.

Eu consigo fazer isso criando arquivos com vários IFs aninhados ou misturando While com IFs em um só arquivo bhaskara.pp, mas eu queria dividir isso em vários arquivos e compilar em um só programa. Tem como eu fazer isso em pascal? No C algo parecido seria os arquivos .c que chamam os arquivos .h.

Valeu.

... Vinicius Menezes ... :?:
Hider
Hider Veterano Registrado
1.4K Mensagens 21 Curtidas
#5 Por Hider
30/08/2005 - 19:36
No if n serai assim n ??

If blablabla then
Begin
<comando>;
<comando>;
end{Acho q vc erro aqui n?}
else
Begin
<comando>;
<maiscomando>;
end;
Acho q sem esse end{sem ;}
Ficaria
If blablabla then
<comando>{sem;}
else
<comando>;
OU
If blablabla then
<comando>
else
Begin
<comando>;
<comando>;
end;
OU
If blablabla then
Begin
<comando>;
<comando>;
end
else
<comando>;


Acho q he isso .... =]
Pascal he divertido hehe
Falow um abraço!!
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#6 Por jqueiroz
30/08/2005 - 19:51
Então vamos lá. Seu erro é o seguinte: você colocou o "ELSE" dentro do bloco "BEGIN-END". Então o compilador está vendo isto aqui:

IF .... THEN BEGIN ... END;

ou seja, um IF completo (e sem ELSE),

e

BEGIN ... ... ... ELSE ... ... ... END;

Ou seja, uma fileira de comandos, e um ELSE perdido, sem IF.

Pela forma que seu código está, fica claro pra mim que são esses "BEGIN" e "END" que estão demais; retire-os que tudo vai se acertar.

Quanto a primeira dúvida substitui os Cases ( que aparentemente só aceitam um comando ) por IFs não aninhados em um grande loop While que dá conta certinho.


Ora, a sintaxe é "case expressão of... expressão: COMANDO; ... end;". Então, pra cada opção, há apenas 1 comando. Como vc faz pra colocar vários comandos onde só cabe um? isso mesmo: BEGIN comando; comando; ... comando END; .

eu queria dividir isso em vários arquivos e compilar em um só programa. Tem como eu fazer isso em pascal? No C algo parecido seria os arquivos .c que chamam os arquivos .h.


Se fosse Borland Pascal, eu te diria pra criar uma Unit.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas
#8 Por vini_bill
30/08/2005 - 22:07
Opa! Jqueiroz e Hider! Era isso mesmo. Valeu pela excelente dica Jqueiroz! Toda vez que eu quise "extender" o uso de qualquer comando eu uso BEGIN..END; certo? Anotado! big_green.png. E quanto as units? Como que eu posso fazê-las e anexa-las nos programas?

Vou programar MUITO big_green.png! Pena que tá quente pra caramba aqui no RJ frown.png, eu torro no meu quarto :/.

... Vinicius Menezes ...
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#9 Por jqueiroz
30/08/2005 - 23:17
Sobe criar units: na época do Borland Pascal, uma unit era igualzinha a um programa, só que no início, em vez de vc escrever "Program nome(input,output);" vc tascava "Unit minha_unit;".

Tinha tb uma seção onde vc declarava as funções que eram exportadas, mas os neurônios que ainda não cozinharam com o calor estão em greve e não querem me lembrar como se fazia isso frown.png

Depois, pra usar, era só colocar no programa principal:

use minha_unit;
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas
#10 Por vini_bill
31/08/2005 - 00:26
Oi jqueiroz. Eu também tô morrendo aqui... quer uma dica? Um balde cheio d'água e se tiver um ventilador já ajuda. Se tiver ar-condicinado liga oras big_green.png.

Quanto ao pascal ( e mais importante ) eis o que eu achei pra refrescar a tua memória:

http://www.learn-programming.za.net/learn_pascal_programming.html

Acabei de copiar e colar em um documento odt e deram 42 páginas. Não vou imprimir... mas estou tentado :P.

... Vinicius Menezes ...
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#11 Por jqueiroz
31/08/2005 - 00:50
Quanto ao pascal ( e mais importante ) eis o que eu achei pra refrescar a tua memória


Hum, um sorvete mnemônico 8O Funcionou, foi só ver o termo "Interface" pra lembrar do "Implementation".
http://www.learn-programming.za.net/programming_pascal_learn12.html
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
vini_bill
vini_bill Super Participante Registrado
592 Mensagens 0 Curtidas
#12 Por vini_bill
02/09/2005 - 23:42
Opa! Voltei, agora com umas dúvidas mais crueis ( e avançadas, hehehe ). Olhem só essa unit ( percebam que o programa de bhaskara tá ficando cada vez mais sinistro ! Hahahahaha )

unit funcoes;
{!--Definições}
interface
procedure bhaskara(a,b,c,x1,x2,delta:real);
procedure soma(a,b,sum:real);
procedure produto(a,c,prod:real);
{!--Execução das interfaces}
implementation {!--Procedures}
{!--Bhaskara}
procedure bhaskara(a,b,c,x1,x2,delta:real);
begin
write('a:');
readln (a);
write ('b:');
readln (b);
write ('c:');
readln (c);
delta:= (b*b)-(4*(a*c));
{!--Testando delta}
if (delta<0) then
writeln('Não posso efetuar o cálculo. Delta não é real.')
else
begin
writeln ('O resultado de delta é: ',delta);
{!--Bhaskara Positivo}
x1:=((-1*b)+sqrt(ABS(delta)))/2*a;
{!--Bhaskara Negativo}
x2:=((-1*b)-sqrt(delta))/2*a;
writeln ('X positivo é: ',ABS(x1));
writeln ('X Negativo é: ',ABS(x2));
end;
end;
{!--Soma}
procedure soma(a,b,sum:real);
begin
write('a:');
readln (a);
write ('b:');
readln (b);
sum:=(-1*b)/a;
writeln ('O produto entre -B e A é:',ABS(sum));
end;
{!--Produto}
procedure produto(a,c,prod:real);
begin
write('a:');
readln (a);
write ('c:');
readln (c);
prod:=c/a;
writeln('O produto entre C e A é: ',ABS(prod));
end;
end.


Tranquilidade. Essa unit compilou sem reclamações. Agora, por favor, vejam este programa ( eu tô amando fazer esse programa de bhaskara em pascal XD - se alguém quiser me manda um MP e eu explico porque o "trauma" da fórmula de bhaskara ):

{*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*}
program bhaskara;
uses
funcoes;
var
{!--Variáveis}
op:integer;
{!--Programa em si}
begin
{!--Escreve o menu}
writeln ('Escolha umas das operações:');
writeln ('');
writeln ('1.Bhaskara');
writeln ('2.Produto');
writeln ('3.Soma');
writeln ('4.Sair');
writeln ('');
write ('Digite o número da sua opção:');
readln (op);
case op of
{!--Se for Bhaskara}
1: begin
writeln('Dê-me 3 números...');
bhaskara;
writeln ('Fim do programa');
end;
{!--Se for Produto}
2: begin
writeln('Dê-me dois números:');
produto;
end;
{!--Se for soma}
3: begin
writeln('Dê-me dois números:');
soma;
end;
{!--Se for saída}
4: begin
writeln('Até mais');
end;
{!--Se num for nenhuma das opções}
else writeln('Essa opção não existe.');
end;
end.


Só que neste segundo código vejam a mensagem do compilador:

[vinicius@fedora Bhaskara]$ fpc bhaskara.pp
Free Pascal Compiler version 2.0.0 [2005/08/17] for i386
Copyright (c) 1993-2005 by Florian Klaempfl
Target OS: Linux for i386
Compiling bhaskara.pp
bhaskara.pp(38,10) Fatal: Syntax error, "." expected but ";" found
bhaskara.pp(38,10) Error: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specifiy a source file to be compiled)
[vinicius@fedora Bhaskara]$


O que é isso? O compilador surtou? Num é só eu definir os procedures de uma lado e do outro usa-los como se fossem comandos? Eu já troquei o ';' por '.' e o compilador acho que o código tinha acaba sem eu passar o comando 'end'. O que é obvio.

obs.: a linha 38 é onde tem escrito 'bhaskara;'. Outra dúvida! Pra que sevem os pointers? Qual a utilidade disso?

... Vinicius Menezes ...
Hider
Hider Veterano Registrado
1.4K Mensagens 21 Curtidas
#13 Por Hider
03/09/2005 - 18:48
koe tranquilo?
N sei direito mas reveja se seu erro n esta aqui

{!--Bhaskara}
procedure bhaskara(a,b,c,x1,x2,delta:real);
begin
write('a:');
readln (a);
write ('b:');
readln (b);
write ('c:');
readln (c);
delta:= (b*b)-(4*(a*c));
{!--Testando delta}

Note q n tem um end; ....
Pode ser isso ai ele passa pela procedure e acha otro end;q ta fora dela no menu principal??

V ai ... passa um debug tb ajuda... nem rodei seu programa aqui mas pode ser isso

Quanto ao ponteiro tb n sei usa se vc souber ou acha algo q exlique bem como usar isso me fala ae...
To querendo aprende a usar pra tentar por imagens no pascal ... n consigo e nem sei onde colocar o caminho da imagem ai n consegui por...
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#15 Por jqueiroz
04/09/2005 - 17:40
Agora pegou pesado... experimenta estas modificações, vê se alguma delas resolve:

1) Mudar de

writeln('O produto entre C e A é: ',ABS(prod));
end;
end.

Para:
writeln('O produto entre C e A é: ',ABS(prod));
end;
begin (* <------ *)
end.


2) Mudar de

   else writeln('Essa opção não existe.');
end;
end.

Para:
else writeln('Essa opção não existe.') (* <---- *)
end;
end.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal