pascal a příkazy

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
Fox8
Level 4.5
Level 4.5
Příspěvky: 1703
Registrován: listopad 07
Bydliště: Uherský Brod
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod Fox8 » 06 led 2011 16:31

funguje mi to ,ale u roku 2000 - 2001 mi to spočítá 732 dní to same rok 2010 a 2011
Intel Xeon E5-1650v3, 64GB RAM, GTX970, 1TB SSD, 2TB plotna

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 06 led 2011 21:45

No, v Céčku mi to dává 731 a 730, takže bude problém někde jinde, jak je to u Pascalu s prioritou vyhodnocování u té podmínky? Zkus to takhle:

Kód: Vybrat vše

if (not(not(i mod 4) and (i mod 100)) and (i mod 400))

Ono je možné že and se vyhodnotí dřív než spočítá mod! Kdyby to pořád nešlo, zkus tam místo toho dát ten druhý kód, s tím větvením.

Vyzkoušej i jednotlivé roky, když zadáš třeba 2001 2001 tak to musí spočítat 365. A když je zadáš opačně, tak se nestane nic, vyjde nula.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 08 led 2011 09:46

Tak jsem rozchodil TP pod DOSBoxem (protože Linux) a nebylo to úplně jednoduché, některé funkce mi ho shodí, třeba dost užitečné Ctrl+F9 :huh: To mi řekni jak jsi to vůbec zkompiloval? S takovou hromadou chyb co jsem tam nasázel! Číslo není logický výraz, před else nesmí být středník, zato mi tam chyběl then... Tos' mi to nemohl říct? Je vidět že za ty roky jsem toho fakt hodně zapomněl, v C je to trochu jednodušší (a jednotnější). Nakonec mě dostal šestnáctibitový integer, nevešel se tam ani součet celého století, takže jsem musel moc vzpomínat jak se zrovna v Pascalu jmenuje ten dvaatřicetibitový typ - až na třetí pokus jsem se trefil :idea:

Kód: Vybrat vše

program pocetdnu;
    uses crt;
    var prvrok, druhrok, i:integer;
    var pocdnu:longint;

begin
    clrscr;

    {zadani vstupnich dat}
    pocdnu:=0;
    write('Zadej pocatecni rok: ');
    readln(prvrok);
    write('Zadej koncovy rok:   ');
    readln(druhrok);

    {vypocet}
    for i:=prvrok to druhrok do
        begin
            if i mod 4 > 0 then
                pocdnu:=pocdnu+365
            else
                if i mod 100 > 0 then
                    pocdnu:=pocdnu+366
                else
                    if i mod 400 > 0 then
                        pocdnu:=pocdnu+365
                    else
                        pocdnu:=pocdnu+366;
        end;

    {zobrazeni vysledku}
    writeln('Pocet dnu:           ',pocdnu);
    readln;
end.


Nebo zkráceně, ale méně přehledně:

Kód: Vybrat vše

    for i:=prvrok to druhrok do
        begin
            if not(not(i mod 4 > 0)and(i mod 100 > 0))and(i mod 400 > 0) then
                pocdnu:=pocdnu+365
            else
                pocdnu:=pocdnu+366;
        end;


Ještě by tam neuškodila kontrola vstupních dat, protože se zápornými roky to bude počítat nesmysly a rok nula vůbec není, navíc by se dalo počítat až od roku 1600, protože gregoriánský kalendář byl zavedený v roce 1582, ale aby to nebylo tak jednoduché, tak spoustě zemí trvalo dost let než na něj přešly, třeba Řecko až v roce 1923! I tak to bylo ale o dost dřív než v Anglii dostaly ženy volební právo :lol:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Fox8
Level 4.5
Level 4.5
Příspěvky: 1703
Registrován: listopad 07
Bydliště: Uherský Brod
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod Fox8 » 08 led 2011 09:48

Kód: Vybrat vše

begin
    clrscr;

    {zadani vstupnich dat}
    pocdnu:=0;
    write('Zadej pocatecni rok:' );
    readln(prvrok);
    write('Zadej koncovy rok:' );
    readln(druhrok);


    {vypocet}


for i:=prvrok to druhrok do
    begin
1: 
        if not((i mod 4=0) and (i mod 100=0) and (i mod 400=0)) then
                  pocdnu:=pocdnu+365;
goto 3;
         
2:
          if (i mod 4 =0)then
            pocdnu:=pocdnu+0
        else
            if (i mod 100=0)then
                pocdnu:=pocdnu+366
            else
                if (i mod 400=0)then
                    pocdnu:=pocdnu+365
            else
                    pocdnu:=pocdnu+366;
        end;
3:
    {zobrazeni vysledku}
    writeln('Pocet dni: ',pocdnu);
writeln('pro ukonceni programu stisknete K:');
readkey;
end.


Ja to mam nějak takto ale pořád mi to nefunguje. zkoušel jsem i přepisovat těch 365 nebo 366 a furt to počítá blbě.
Intel Xeon E5-1650v3, 64GB RAM, GTX970, 1TB SSD, 2TB plotna

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 08 led 2011 10:13

Tyhle řádky úplně vyházej:

Kód: Vybrat vše

1:
        if not((i mod 4=0) and (i mod 100=0) and (i mod 400=0)) then
                  pocdnu:=pocdnu+365;
goto 3;
         
2:


3:

Sem doplň 365:
pocdnu:=pocdnu+0

A místo =0 do těch podmínek dej >0.

Používání GOTO se úplně vyhni, dokud nebudeš psát programy které mají aspoň pět tisíc řádků :wink: Jestli chceš takhle otestovat dva různé kousky kódu, je lepší jeden z nich zakomentovat pomocí dvou prázdných řádků s { a }, aspoň na první pohled podle jiné barvy písma poznáš který z nich je zrovna vypnutý.

--- Doplnění předchozího příspěvku (08 Led 2011 21:58) ---

Ještě něco na závěr, pokud ti není jasné proč v těch podmínkách musí být > a ne =, tak z tohohle to uvidíš.

pocetdnu.jpg
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů