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

pascal a příkazy

Příspěvekod Fox8 » 05 led 2011 17:00

Zdravím. Za ukol jsem dostal udělat program, co mi vypočítám kolik dní je to od zadaných datumů (asi stačí roky)


Zaklad programu samozřejmě mam příkazy celkem ovládam, jen nevím, co mam zadat do "proměnných" (k var).
přece nebudu sam počítat dny atd. i s přechodnýma rokama a pak to budu postupně zapisovat do pascalu ne?
1 by to učitel poznal
2 by ses sa s tim ... dlouho

Potřebudu nějakou proměnnou, co ma v sobě zadane všecna čísla ( něco jako real) ale k tomu potřebuju zadat, aby to každé 4 roky odečetlo z roku jeden den

díky
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: 7365
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 05 led 2011 18:56

Nazdar, obávám se že tě to počítání nemine, ale neviděl bych to jako nějakou hrůzu, na to spočítání roků ti stačí jeden cyklus FOR a jestli je rok přestupný nebo ne se dá také poznat velmi snadno, podle pravidel Gregoriánského kalendáře:

1. rok JE přestupný když je dělitelný 4
2. rok NENÍ přestupný když je dělitelný 100
3. rok JE přestupný když je dělitelný 400

Takže například:

Kód: Vybrat vše

readln(rok);

if( not( not(rok mod 4) and rok mod 100) and rok mod 400)
    dni=365;
else
    dni=366;

writeln(rok,dni);


V Pascalu už jsem pár let nedělal, tak doufám že jsem tam přepisem z C nestvořil nějakou hrůzu ;-) Zkus to pochopit nebo si napiš vlastní, jestli tu podmínku nedokážeš učiteli vlastními slovy vysvětlit, a hlavně zjisti přesně zadání, třeba to nějak dáme společně dohromady.
JInak na výpočet počtu dní mezi dvěma libovolnými daty existuje nějaký geniální vzorec, ale nenapadá mě kde by se dal najít, je to něco podobného jako Gaussův výpočet data velikonočního pondělí, prostě to funguje a nikdo netuší jak :evil:
"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 » 05 led 2011 19:11

program dnipocet (input,output);
uses
crt;
const
mesic:array[1..12] of integer =
(31,29,31,30,31,30,31,31,30,31,30,31);
label
1,2,3,4;
var
rokpoc,mespoc,denpoc,rokkon,meskon,denkon:integer;
pocdnu:real;
r1,r2,r,konec:string;
i:integer;

begin
2: clrscr;
write('Pocatecni rok = ');
readln(rokpoc);
write('Pocatecni mesic = ');
readln(mespoc);
3: write('Pocatecni den = ');
readln(denpoc);
r2:='n';
if rokpoc/4=int(rokpoc/4) then r2:='a';
if rokpoc/100=int(rokpoc/100) then r2:='n';
if rokpoc/400=int(rokpoc/400) then r2:='a';
if ((denpoc=29) and (mespoc=2) and (r2='n')) then
begin
writeln('MŘsˇc m jen 28 dnˇ');
goto 3;
end;
writeln;
write('Konecny rok = ');
readln(rokkon);
write('Konecny mesic = ');
readln(meskon);
4: write('Konecny den = ');
readln(denkon);
r2:='n';
if rokkon/4=int(rokkon/4) then r2:='a';
if rokkon/100=int(rokkon/100) then r2:='n';
if rokkon/400=int(rokkon/400) then r2:='a';
if (denkon=29) and (meskon=2) and (r2='n') then
begin
writeln('MŘsˇc m jen 28 dnˇ');
goto 4;
end;
pocdnu:=0;
if (rokkon=rokpoc) and (mespoc=meskon) then
begin
pocdnu:=pocdnu+(denkon-denpoc+1);
goto 1;
end;
if rokkon=rokpoc then
begin
for i:=mespoc+1 to meskon-1 do
begin
pocdnu:=pocdnu+mesic[i];
if i=2 then
begin
r1:='n';
if rokpoc/4=int(rokpoc/4) then r1:='a';
if rokpoc/100=int(rokpoc/100) then r1:='n';
if rokpoc/400=int(rokpoc/400) then r1:='a';
if r1='n' then pocdnu:=pocdnu-1;
end;
end;
end;
if rokpoc<rokkon then
begin
for i:=mespoc+1 to 12 do
begin
pocdnu:=pocdnu+mesic[i];
if i=2 then
begin
r1:='n';
if rokpoc/4=int(rokpoc/4) then r1:='a';
if rokpoc/100=int(rokpoc/100) then r1:='n';
if rokpoc/400=int(rokpoc/400) then r1:='a';
if r1='n' then pocdnu:=pocdnu-1;
end;
end;
for i:=1 to meskon-1 do
begin
pocdnu:=pocdnu+mesic[i];
if i=2 then
begin
r1:='n';
if rokkon/4=int(rokkon/4) then r1:='a';
if rokkon/100=int(rokkon/100) then r1:='n';
if rokkon/400=int(rokkon/400) then r1:='a';
if r1='n' then pocdnu:=pocdnu-1;
end;
end;
end;
if rokkon-rokpoc>=2 then
begin
for i:=rokpoc+1 to rokkon-1 do
begin
r1:='n';
if i/4=int(i/4) then r1:='a';
if i/100=int(i/100) then r1:='n';
if i/400=int(i/400) then r1:='a';
if r1='n' then pocdnu:=pocdnu+365;
if r1='a' then pocdnu:=pocdnu+366;
end;
end;
pocdnu:=pocdnu+(mesic[mespoc]-denpoc+1);
r1:='n';
if rokpoc/4=int(rokpoc/4) then r1:='a';
if rokpoc/100=int(rokpoc/100) then r1:='n';
if rokpoc/400=int(rokpoc/400) then r1:='a';
if (r1='n') and (mespoc=2) then pocdnu:=pocdnu-1;
pocdnu:=pocdnu+denkon;
1: writeln;
writeln('Pocet dnu = ',pocdnu:18:0);
write('Konec (a/n) ');
readln(konec);
if konec = 'n' then goto 2;
end.




toto je asi ono jen sem moc nepochopil, jak to tam ma s tim rmesic ma 28 dni. Me stačí, když bych to nějak sesmolil jen rokpoc rokkon. taky u toho nechapu ten posledni krok 1 asi by se dal vynechat. jen nevim, jak to jednodušej upravit.
moc mi pomužeš, když se na to mrkneš, ne že bych byl uplny idiot na pascal, ale nějak nechapu matiku :D

--- Doplnění předchozího příspěvku (Stř Led 05, 2011 7:54 pm) ---

Když odmažu dny a měsice tak mi to už haže error. podle mě ten konec tam byt nemusí. Dny a měsíce taky ne, takže mi vypadne par proměnných no a nemusí tam byt ani ty kroky 1 2 3 a navrat k nim. Pak při měsíci s 28 dny to nechci aby mi to nevypočítalo a napsalo, že ma 28 dni, ale aby mi to prostě i s tim spočítalo
Kdyř z toho dostanu 2 nebo 3 budu štastný člověk :lol: taky mu mužu něco nakecat, že mi to trochu blblo on to opraví a mezi tim zapomene, že to nešlo a da mi dvojku :lol:
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: 7365
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 05 led 2011 20:09

Ježkovy woka, to je příšernost, dlouhé jak zdroják Windows a navíc čtyři GOTO* v pascalském programu! To snad někdo přepsal z BASICu, ne? To je sice můj oblíbený jazyk, ale tohle mě fakt rozhodilo šťávy :twisted: Ten poslední krok od labelu 1 je tam jen jako dotaz jestli chceš skončit nebo počítat nové zadání, takže tím se fakt nemusíš zabývat. To hlášení že měsíc má jen 28 dní tam je proto, kdybys zadal 29. února v nepřestupném roce, to by se dalo krásně a jednoduše řešit přes DO...

Takže jestli to dobře chápu, máš zadat jen počáteční a konečný rok, a spočítat kolik má to období dní. Takže například:

rokpoc=2008;
rokkon=2010;
(takže roky 2008+2009+2010)
pocdnu=366+365+365.

Je to tak?

* Go To Statement Considered Harmful - Edsger Dijkstra 1968
"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 » 05 led 2011 20:12

Přesně tak. Ted si tu v poznamkovem bloku odmazavam ty dny a měsíce, ale pořád s errorem ... :evil:

stačí to smazat a je to ... jo je to přepsané. To go to by se mohlo smazat ale taky mi to dělás errorem ... chce to nějak zacelit asi :x

už to dělam od 3 hodin... ani s mojů si nepíšu chudina mam od ní 5 sms ...
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: 7365
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 05 led 2011 20:38

Ten error, neodmazal jsi s těmi měsíci i některý z těch labelů? Pak ho to při kompilaci nenajde... Ale na to kašli, fakt bude jednodušší napsat to po svém než se tímhle salátem prokousávat.

Takže ty roky v cyklu jak jsem psal nahoře, dokonce bych si tipnul že právě na jeho procvičení je tahle úloha určená, co třeba takhle?

Kód: Vybrat vše

pocdnu:=0;

for i=rokpoc to rokkon do
  begin
    ...zjištění přestupnosti...
    pocdnu:=pocdnu+delkaroku;
  end;


Pokud jsi nepobral tu podmínku na přestupný rok, dá se to udělat i jinak, buďto s větvením, nebo postupnými podmíněnými změnami hodnoty. Zvládneš to z toho už sestavit?

Mimochodem, co máš za Pascal, že to děláš v Poznámkovém bloku? Čekal bych že trápíš TurboPascal nebo Delphi v jeho vlastním editoru.
"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 » 05 led 2011 20:45

Kód: Vybrat vše

...zjištění přestupnosti...
    pocdnu:=pocdnu+delkaroku;


tohle mi nějak nepobrali moje dvě poslední buňky. Ne mam turbopascal, ale otevřených několik verzí a upravim to v bloku (jako pas) a jen přetahnu na ikonu pascalu a spustim ... v pascalu je aj a to mi trvá :D
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: 7365
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 05 led 2011 20:55

Já jsem měl TP7 s počeštěnou nápovědou, ani už nevím jestli menu bylo také česky nebo zůstalo v angličtině.

Tedy uvnitř té smyčky stačí jedna podmínka:

Kód: Vybrat vše

if (rok je přestupný)
    pocdnu:=pocdnu+366;
else
    pocdnu:=pocdnu+365;
"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 » 05 led 2011 21:06

Ne čeština ve psaní by se hodila :)

No tak asi to vzdavam a nějak se mu vykecam a udělam to v průběhu dalších dnů nějak už nemam mozek na psaní v pascalu. Vubec nevim o co jde už :D

mam jen tohle ....

--- Doplnění předchozího příspěvku (Stř Led 05, 2011 9:39 pm) ---

No zatim diky moc asi to tu budu smolit hodně dlouho :D diky
Přílohy
Bez názvu.jpg
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: 7365
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 05 led 2011 21:42

Ale no tak, snaž se trochu, to to mám za tebe udělat celé :-D Všechno co potřebuješ už jsem ti tu napsal, akorát to musíš poskládat do sebe.
Co si vzpomínám, tak v TP už se nepsal k názvu programu (input,output), ale nemusely tam být aspoň ty závorky? Jestli mě teda nemate C, kde musí být u všeho.
Jak je to s inicializací proměnných, je v nich po spuštění programu automaticky nula nebo tam zůstal nějaký bordel, který byl zrovna na tom místě v paměti předtím a musíš jí vynulovat sám?
A ještě trochu zapracuj na úpravě, ať se v tom vyznáš až budeš mít v programu pár vnořených cyklů a strukturovaných podmínek, to odsazování je fakt dobrá věc, třeba v Pythonu je dokonce povinné, nahrazuje tam begin a end.
Takže když použiji ten tvůj začátek, napsal bych to nějak takhle:

Kód: Vybrat vše

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

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 (not(not(i mod 4) and i mod 100) and i mod 400)
                pocdnu:=pocdnu+365;
            else
                pocdnu:=pocdnu+366;
        end;

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


Ještě si nejsem jistý jak je to s těmi středníky v podmínce, zkontroluj to a zkus přeložit, jestli to bude chodit a hlavně správně počítat.
"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 » 05 led 2011 22:09

V pascalu žadne složitosti s vymazavanim. Je to tam v celku jednoduché u textu musí byt zavorky ale jak u čeho no. Stejně nechapu na co to je, když je t ojen učební pomůcka diky za rady toto potřebuju ted už se v tom vyznam.... díííky moc
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: 7365
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: pascal a příkazy

Příspěvekod faraon » 05 led 2011 23:25

Účel je jeden - Pascal byl vymyšlený speciálně pro výuku strukturovaného programování a algoritmizace, má proto pár vlastností, kterými tě donutí napsat program natolik slušně, aby ses z něj za pár let nepozvracel, až ho někde vyhrabeš, a tyhle zásady ti má dostat do krve. Například je strašně ukecaný, všechno musíš deklarovat předem, všude samé begin a end, všechno hlídá a jakmile se někde vyskytne sebemenší problém, tak ti ho hned omlátí o hlavu. Ale to oceníš až někdy za deset let, když si kvůli tomu nenabiješ hubu na nějaké úplně zbytečné ptákovině (a nemusí to být při programování). Na druhou stranu se v něm zase strašně blbě dělají velké projekty, i když i to jde, někdo v Pascalu dokonce napsal operační systém! To je věc na kterou se opravdu nehodí.
Perlička na závěr, víš že celý pascalský program můžeš mít v jednom jediném řádku? Akorát za end. na konci musíš odentrovat. Ale zkus se v takovém programu vyznat a udělat v něm sebemenší opravu :lol:

Ještě alternativní způsob té podmínky, takhle je to pochopitelnější, pokud dostatečně nerozumíš tomu složenému logickému výrazu:

Kód: Vybrat vše

for i=prvrok to druhrok do
    begin
        if i mod 4
            pocdnu:=pocdnu+365;            {je zbytek po dělení 4, např. 2005 - není přestupný}
        else
            if i mod 100                   {sem se dostane jen když je dělitelný 4}
                pocdnu:=pocdnu+366;          {je zbytek po dělení 100, např. 2008 - je přestupný}
            else
                if i mod 400                 {sem se dostane jen když je dělitelný 4 i 100}
                    pocdnu:=pocdnu+365;        {je zbytek po dělení 400. např. 1900 - není přestupný}
                else
                    pocdnu:=pocdnu+366;        {např. 2000 - je přestupný}
    end;

P.S. pořádně ten program otestuj, já jsem sice ty hlavní kousky odladil u mě, ale mohla se vloudit chybička při přepisování z Céčka a pak při jejich skládání. Hodí se například intervaly 1990-2010 a 1890-1910, protože rok 2000 byl přestupný, zatímco rok 1900 nebyl, takže výsledky se musí lišit o jeden den: 7670 a 7669.
"Král Lávra má dlouhé oslí uši, král je ušatec!

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


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Prosím o pomoc s příkazy v Powershell Příloha(y)
    od Peťa » 08 kvě 2024 10:45 » v Windows 11, 10, 8...
    3
    761
    od petr22 Zobrazit poslední příspěvek
    08 kvě 2024 11:26
  • Turbo Pascal (With DOSBox) je pomalý.
    od Kopusek » 01 pro 2023 11:00 » v Programování a tvorba webu
    2
    2704
    od Kopusek Zobrazit poslední příspěvek
    02 pro 2023 10:13

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 19 hostů