Jump to content
Sign in to follow this  
Gurzi

Adivinhem lá onde está o bug

Recommended Posts

Gurzi

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.

 

Share this post


Link to post
Share on other sites
deathseeker25

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

Share this post


Link to post
Share on other sites
Gurzi

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

:\

Share this post


Link to post
Share on other sites
deathseeker25
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

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
deathseeker25
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..... :?

Share this post


Link to post
Share on other sites
Overrun™

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

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
Gurzi
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...

Share this post


Link to post
Share on other sites
Kabong
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,


Existem 10 tipos de pessoas no mundo: As que entendem o código binário e as que não o entendem.

Share this post


Link to post
Share on other sites
Gurzi

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

Share this post


Link to post
Share on other sites
Kabong

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,


Existem 10 tipos de pessoas no mundo: As que entendem o código binário e as que não o entendem.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.