Ir ao conteúdo
  • Cadastre-se

dúvida


orlando.ls

Posts recomendados

fiz o seguinte programa em pascal(turbo pascal 7.0,borland), quando mando compilar, aparece o seguinte erro: Error 87: "," expected. Não entendi o motivo disso, olhei de novo e nao achei nenhum erro, alguem pode me ajudar?( ignorem as functions/procedures que nao sejam a "push","pop" e "iniciap") :confused:

program teste_pilha;
uses crt;
const max = 10;
type pilha = record
topo: integer;
item: array [1..max] of integer;
end;

procedure iniciap (var p: pilha);
begin
p.topo:=0;
end;

function vaziap (var p: pilha): boolean;
begin
vaziap := (p.topo = 0);
end;

function cheiap (var p:pilha): boolean;
begin
cheiap := (p.topo = max);
end;

function topo (var p: pilha): integer;
begin
if vaziap(p) then writeln ('a pilha esta vazia');
topo:= p.item[p.topo];
end;

function pop (var p: pilha): integer;
var aux:integer;
begin
if vaziap(p) then
begin
writeln ('underflow');
halt;
end
else
begin
aux:=p.item[p.topo];
p.topo:=p.topo-1;
pop:=aux;
end
end;

procedure push (var x: integer; var p: pilha);
begin
if cheiap(p) then
begin
writeln('a pilha esta cheia');
halt;
end
else
begin
p.topo:=p.topo+1;
p.item[p.topo]:= x;
end
end;

var p1: pilha;
n: integer;
begin
iniciap(p1);
writeln('digite um numero natural');
readln(n);

repeat
push(n mod 2, p1);
n:=n div 2;
until n=0;

writeln('correspondente em binario');
while not vaziap(p1) do
writeln(pop(p1));
readln;


end.

quando eu clico no .exe o programa funciona normalmente, mas na parte push (n mod 2, p1) é como c fosse ignorado o "mod 2", dae o resultado é esse: (n,p1), se eu digito 100 por exemplo a saída é: 1 3 6 12 25 50 100

Link para o comentário
Compartilhar em outros sites

Experimente alterar de:


procedure push (var x: integer; var p: pilha);

para:


procedure push (x: integer; var p: pilha);

Como o valor passado para x na procedure push não é uma variável (é o resultado de n mod 2),

e o valor de x não é modificado dentro da procedure, você deve retirar o var.

Espero que isso ajude.

Link para o comentário
Compartilhar em outros sites

Não achei aonde pode estar ocorrendo o "division by zero".

Só estou vendo operação de divisão dentro do repeat, e o divisor é 2.

Tente localizar em qual linha está ocorrendo este erro (talvez seja melhor

colocar um writeln(n) / readln dentro do repeat só para analisar a rotina).

A única observação que tenho sobre o código é que você não colocou um ;

após o end do bloco else do if (não sei se o compilador que você está usando

aceita desta forma).

Ex:


if ... then
begin

end
else
begin

end;

Link para o comentário
Compartilhar em outros sites

imex, no seguinte trecho:


procedure push (x: integer; var p: pilha);
begin
if cheiap(p) then
begin
writeln('a pilha esta cheia');
halt;
end
else
begin
p.topo:=p.topo+1;
p.item[p.topo]:= x;
end
end;

eu coloquei ";" apos o penultimo end, nao alterou nada (acredito que seja opcional o ";" pois ja tem um ";" no ultimo end) e continou dando o mesmo erro de antes "Error 200: Division by zero.", eu pensei da mesma forma que voce, pois so tem divisão por 2 no "repeat-until", nao tenho ideia :confused:, parece tudo certo, qual compilador você usa? uso o turbo pascal 7.0 da borland.

Link para o comentário
Compartilhar em outros sites

Testei sua rotina agora com o pascalzim.

você pode apagar a function topo. Ela não esta sendo utilizada.

De uma conferida também na declaração da function cheiap, que antes da edição estava diferente:


function cheiap (var p: pilha): boolean;

De resto rodou normal.

Link para o comentário
Compartilhar em outros sites

imex, eu tirei a function topo e funcionou, baixei o pascalzim tb e funcionou nele tb, tb tirei todos os "halts", ficou assim com tudo funcionando:


program teste_pilha;
const max = 10;
type pilha = record
topo: integer;
item: array [1..max] of integer;
end;

procedure iniciap (var p: pilha);
begin
p.topo:=0;
end;

function vaziap (var p: pilha): boolean;
begin
vaziap := (p.topo = 0);
end;

function cheiap (var p: pilha): boolean;
begin
cheiap := (p.topo = max);
end;

function pop (var p: pilha): integer;
var aux:integer;
begin
if vaziap(p) then
begin
writeln ('underflow');
end
else
begin
aux:=p.item[p.topo];
p.topo:=p.topo-1;
pop:=aux;
end
end;

procedure push (x: integer; var p: pilha);
begin
if cheiap(p) then
begin
writeln('a pilha esta cheia');
end
else
begin
p.topo:=p.topo+1;
p.item[p.topo]:= x;
end
end;

var p1: pilha;
n: integer;

begin
writeln('digite um numero natural');
readln(n);
iniciap(p1);

repeat
push(n mod 2, p1);
n:=n div 2;
until n=0;

writeln('correspondente em binario');
while not vaziap(p1) do
write(pop(p1));
readln;

end.

valeu pela ajuda cara :D

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

imex, eu tirei a function topo e funcionou, baixei o pascalzim tb e funcionou nele tb, tb tirei todos os "halts", ficou assim com tudo funcionando:


program teste_pilha;
const max = 10;
type pilha = record
topo: integer;
item: array [1..max] of integer;
end;

procedure iniciap (var p: pilha);
begin
p.topo:=0;
end;

function vaziap (var p: pilha): boolean;
begin
vaziap := (p.topo = 0);
end;

function cheiap (var p: pilha): boolean;
begin
cheiap := (p.topo = max);
end;

function pop (var p: pilha): integer;
var aux:integer;
begin
if vaziap(p) then
begin
writeln ('underflow');
end
else
begin
aux:=p.item[p.topo];
p.topo:=p.topo-1;
pop:=aux;
end
end;

procedure push (x: integer; var p: pilha);
begin
if cheiap(p) then
begin
writeln('a pilha esta cheia');
end
else
begin
p.topo:=p.topo+1;
p.item[p.topo]:= x;
end
end;

var p1: pilha;
n: integer;

begin
writeln('digite um numero natural');
readln(n);
iniciap(p1);

repeat
push(n mod 2, p1);
n:=n div 2;
until n=0;

writeln('correspondente em binario');
while not vaziap(p1) do
write(pop(p1));
readln;

end.

valeu pela ajuda cara :D

Olá,

Só precisa de pequenas correções:

As funções vaziaP, cheiaP não precisam de var.

E precisa traduzir o trecho

[color=#000000]writeln[/color] [color=#000000]([/color][color=#a31515]'underflow'[/color][color=#000000]);[/color]

Falou

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!