• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

Adivinhem lá onde está o bug

14 mensagens neste tópico

where is the bug ?

Program dias_ano;

USES DOS ;

VAR I,N,ANO,MES,MESACTUAL,REDUCAOMES,MESESPASSADOS,MESESCORRIDOS,DIASANO,CONTADORANO,DIASJAVIVIDOS,MESDOANO : INTEGER;

a, m, d, ds : word;

ANU : INTEGER;

BEGIN

GETDATE (A, M, D,DS);

ANU := A;

WRITELN('DATA DE HOJE :',D,'/',M,'/',A);

WRITELN('EM QUE ANO NASCEU ? ');

READLN(ANO);

mesdoano := 0;

if ANU MOD 4 = 0 THEN

IF ANU MOD 100 <> 100 THEN

ANO := 366

ELSE

BEGIN

ANO := 365;

END;

CASE M OF

1,3,5,7,8,10,12 : MES := 31;

IF ANU MOD 4 = 0 THEN

IF ANU MOD 100 <> 0 THEN

2 : MES := 29

ELSE

2: MES := 28;

4,6,9,11 : MES := 30;

END

MESACTUAL := MES ;

FOR I:= 1 TO M DO

REDUCAOMES := M - 1

CASE REDUCAOMES OF

1,3,5,7,8,10,12 : MESESPASSADOS := 31;

IF ANU MOD 4 = 0 THEN

IF ANU MOD 100 <> 0 THEN

2 : MESESPASSADOS := 29

ELSE

2: MESESPASSADOS := 28;

4,6,9,11 : MESESPASSADOS := 30;

END

MESDOANO := MESDOANO + MESESPASSADOS;

MESESCORRIDOS := MESDOANO + D ;

FOR N := ANO TO ANU DO

IF ANU MOD 4 = 0 THEN

IF ANU MOD 100 <> 0 THEN

DIASANO := 366;

ELSE

DIASANO := 365;

ANO := ANO + 1;

CONTADORANO := CONTADORANO + DIASANO:

END;

DIASJAVIVIDOS := CONTADORANO + MESESCORRIDOS;

WRITELN('VOCE JA VIVEU',DIASJAVIVIDOS,'DIAS');

READLN;

END.

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Faltam alguns ";" nos ends a meio do programa.... ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vou passar a colocar aqui uns erros que me dá :

help;)

23 / 9 ah_qua~1.pas

Error: Illegal expression

23 / 9 ah_qua~1.pas

Error: Ordinal expression expected

:\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Citação
vou passar a colocar aqui uns erros que me dá :

help;)

23 / 9 ah_qua~1.pas

Error: Illegal expression

23 / 9 ah_qua~1.pas

Error: Ordinal expression expected

:\

Hmm....a linha 23/9 é isto:

IF ANU MOD 4 = 0 THEN

Acho que é esta a linha....agora eu não conheço o comando MOD, mas penso que aparece ilegall expression por estar 4=0....

Mas explica-me o que faz o comando MOD e pode ser que eu consiga decifrar...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o comando MOD é o resto da divisao inteira

o A é o valor que o Getdate vai buscar ou seja o ANO

entao se ANO a dividir por 4 (A MOD 4 ) for igual a 0 entao o ano é bissexto

ou seja if A MOD 4 = 0 then

blablalba

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
o comando MOD é o resto da divisao inteira

o A é o valor que o Getdate vai buscar ou seja o ANO

entao se ANO a dividir por 4 (A MOD 4 ) for igual a 0 entao o ano é bissexto

ou seja if A MOD 4 = 0 then

blablalba

Pois mas então eu não vejo onde está o erro..... :?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

yo ppl tb n tou a ver kal é o prob e k tb me da error in expression na linha 23 enkuanto na 14 k é exactamente igual n da erro nenhum, será do "contexto" alguem mais experiente em Pascal k nos possa ajudar??? já agora ke k isto faz (é k eu só sei depois de compilar XD).... é pra verem kmo eu sou bom nisto :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isto calcula os dias que uma pessoa ja viveu...

so k tipo se nasceste em 1930 até 2005 ha mtos anos bissextos ou seja tem sempre mais um dia... tive k axar kuais os anos bissextos e por esse ano com 366..

depois fevereiro se o ano for bissexto tem 29 dias se nao tem 28...

mt complicado ou n

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ja pus parentesis ➔ if (ANU MOD 4 ) = 0 then

mas nao dá...

pode haver statements IF dentro de estreturass case certo ?

nao vejo onde está o bug.. enfim

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Program dias_ano;

USES DOS ;

VAR I,N,ANO,MES,MESACTUAL,REDUCAOMES,MESESPASSADOS,MESESCORRIDOS,DIASANO,CONTADORANO,DIASJAVIVIDOS,MESDOANO : INTEGER;

a, m, d, ds : word;

BEGIN

GETDATE (A, M, D,DS);

WRITELN('DATA DE HOJE :',D,'/',M,'/',A);

WRITELN('EM QUE ANO NASCEU ? ');

READLN(ANO);

MESDOANO := 0;

IF (A MOD 4) = 0 THEN { calcula se o ano actual é bissexto ou nao}

IF ( A MOD 100) <> 100 THEN

ANO := 366

ELSE

BEGIN

ANO := 365;

END;

CASE M OF {ve os dias do mes actual e ve quantos dias tem }

1,3,5,7,8,10,12 : MES := 31;

4,6,9,11 : MES := 30;

2 : IF (A MOD 4) = 0 THEN

IF (A MOD 100) <> 0 THEN

MES := 29;

ELSE

MES := 28

END;

MESACTUAL := MES ;

FOR I:= 1 TO M DO { CALCULA OS DIAS JA PASSADOS ESTE ANO , TIRANDO UM MES AO MES ACTUAL}

BEGIN

REDUCAOMES := M - 1;

CASE REDUCAOMES OF

1,3,5,7,8,10,12 : MESESPASSADOS := 31;

4,6,9,11 : MESESPASSADOS := 30;

2 : IF (A MOD 4) = 0 THEN

IF (A MOD 100) <> 0 THEN

MESESPASSADOS := 29

ELSE

MESESPASSADOS := 28;

END;

MESDOANO := MESDOANO + MESESPASSADOS;

MESESCORRIDOS := MESDOANO + D + MESACTUAL ;

END;

FOR N := ANO TO A DO {DESDE O ANO K NASCEU ATÉ AO ANO ACTUAL}

BEGIN

IF (A MOD 4) = 0 THEN

IF (A MOD 100) <> 0 THEN

DIASANO := 366

ELSE

BEGIN

DIASANO := 365;

END;

ANO := ANO + 1;

CONTADORANO := CONTADORANO + DIASANO;

END;

DIASJAVIVIDOS := CONTADORANO + MESESCORRIDOS;

WRITELN('VOCE JA VIVEU',DIASJAVIVIDOS,'DIAS');

READLN;

END.

Prontos já não dá bugs mas a parte lógica está mal desenvolvida porque eu ao por 2005 ele diz que já vivi 231 dias.. coisa impossível...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Program dias_ano;

USES DOS ;

VAR

I,N,ANO,MES,MESACTUAL,REDUCAOMES,MESESPASSADOS,

MESESCORRIDOS,DIASANO,CONTADORANO,DIASJAVIVIDOS,

MESDOANO : INTEGER;

a, m, d, ds : word;

BEGIN

GETDATE (A, M, D,DS);

WRITELN('DATA DE HOJE :',D,'/',M,'/',A);

WRITELN('EM QUE ANO NASCEU ? ');

READLN(ANO);

MESDOANO := 0;

IF (A MOD 4) = 0 THEN { calcula se o ano actual é bissexto ou nao}

IF ( A MOD 100) <> 100 THEN

ANO := 366

ELSE

ANO := 365

ELSE // AQUI

ANO := 365 // AQUI

CASE M OF {ve os dias do mes actual e ve quantos dias tem }

1,3,5,7,8,10,12 : MES := 31;

4,6,9,11 : MES := 30;

2 : BEGIN // AQUI

IF (A MOD 4) = 0 THEN

IF (A MOD 100) <> 0 THEN

MES := 29;

ELSE

MES := 28

ELSE // AQUI

MES := 28; // AQUI

END; // AQUI

MESACTUAL := MES ;

FOR I:= 1 TO M DO { CALCULA OS DIAS JA PASSADOS ESTE ANO , TIRANDO UM MES AO MES ACTUAL}

BEGIN

REDUCAOMES := M - 1;

CASE REDUCAOMES OF

1,3,5,7,8,10,12 : MESESPASSADOS := 31;

4,6,9,11 : MESESPASSADOS := 30;

2 : BEGIN // AQUI

IF (A MOD 4) = 0 THEN

IF (A MOD 100) <> 0 THEN

MESESPASSADOS := 29

ELSE

MESESPASSADOS := 28

ELSE // AQUI

MESESPASSADOS := 28; // AQUI

END; // AQUI

MESDOANO := MESDOANO + MESESPASSADOS;

MESESCORRIDOS := MESDOANO + D + MESACTUAL ;

END;

FOR N := ANO TO A DO {DESDE O ANO K NASCEU ATÉ AO ANO ACTUAL}

BEGIN

IF (A MOD 4) = 0 THEN

IF (A MOD 100) <> 0 THEN

DIASANO := 366

ELSE

DIASANO := 365

ELSE // AQUI

DIASANO := 365; // AQUI

ANO := ANO + 1;

CONTADORANO := CONTADORANO + DIASANO;

END;

DIASJAVIVIDOS := CONTADORANO + MESESCORRIDOS;

WRITELN('VOCE JA VIVEU',DIASJAVIVIDOS,'DIAS');

READLN;

END.

[/syntax]

Acho que o problema está nos IF e ELSE dos anos bissextos.

[syntax=Pascal]

IF (A MOD 4) = 0 THEN { calcula se o ano actual é bissexto ou nao}

IF ( A MOD 100) <> 100 THEN

ANO := 366

ELSE // do segundo IF

ANO := 365

ELSE // do 1º IF (este faltava e se o ano actual não fosse bissexto

// não punha valor no ANO

ANO := 365

Correcções estão marcadas com comentário AQUI à frente.

Vê lá se isso já dá certo.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

IF (A MOD 4) = 0 THEN   { calcula se o ano actual é bissexto ou nao}
    IF ( A  MOD 100) <> 100 THEN
    ANO := 366
    ELSE
    BEGIN
    ANO := 365;
    END;

tenho assim..

Se A mod 4 for igual a 0 e se o A mod 100 for diferente de 100 entao ANo fica com 366 dias se nao tem 365

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O único ELSE que tens nesse bocado de código é aplicado ao 2º IF.

A condição do 2º IF só é avaliada se a condição do 1º IF for verdadeira.

Assim, caso não se verifique a condição do 1º IF, com que valor fica a variável ANO ?

Podes alterar a 1ª condição para:

IF ((A mod 100) = 0) and ((A mod 100) <> 100) then ...

retiras o 2º IF e fica tudo OK.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora