Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
orlando.ls

dúvida

Recommended Posts

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

Editado por gandalfnho
União de posts / use a tag CODE

Compartilhar este post


Link para o post
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.

Editado por gandalfnho
Propaganda

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • imex valeu pela ajuda! entendi o que você disse e modifiquei, o erro: "Error 87: "," expected" sumiu, porém agora aparece outro erro (de execuçao), é o seguinte: Error 200: Division by zero.

    Compartilhar este post


    Link para o post
    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;

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por orlando.ls

    Compartilhar este post


    Link para o post
    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.

    Editado por imex

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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

    Compartilhar este post


    Link para o post
    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

    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

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

    ×