Jump to content

Archived

This topic is now archived and is closed to further replies.

.FanTaZy

Kalendarz

Recommended Posts

Witam mam w miarę błachy problem ale przerasta mnie... nauzyłem się już komend w pascalu na poziomie podstawowym i chciałbym rozpocząć programowanie bardziej zaawansowane... wybrałem pascala bo jest jak na sam początek prosty i pomoże mi zrozumieć programowanie... a teraz do sedna sprawy...

 

Siedząc we free pascalu i nie wiedząc co mam ze sobą zrbić spojrzałem na zegarek i pomyślałem fajnie by było napisać własny kalendarz... wiec niewiele myślać chciałem zobaczyć jak takowy wygląda... znalazłem w internecie na stronie plik pas, który zawiera kod jakiegostam kalendarza ale za chiny nie moge go rozgryźć bo zmienne i procedury pisane są w języku bodajrze niemieckim a napewno nawet w języku polskim sprawiłyby mi nielada kłopot... bardzo byłbym wdzięczny gdyby ktoś objaśnił mi to wszystko a wprosty sposób... prosze o to bo nie chcę się zniechęcać do programowania na starcie....

 

 

 

Oto link do pliku pas:

KODhttp://www.speedyshare.com/562945827.html

 

Kod:

program calender;

 

program calender;

uses Crt,Dos;

{ Jos dickmann Software © 1997 for public domain  }
{ More Turbo pascal sources on the internet page....}
{ http://www.universal.nl/users/dickmann/pascal.htm }
{ E-mail address....... j.w.j.dickmann@universal.nl }

const
 mnd : array[1..12] of string[9] = ('Januari','Februari','Maart','April',
'Mei','Juni','Juli','Augustus','September','Oktober','November','December');

var
 jaar,maand,dag,weekdag : word;
 x,y,p,pp,p1,u,q        : integer;
 s0                     : string;
 ch                     : char;
 regs                   : registers;


Function NumbofDaysInMth(y1,m : Word): Byte;

begin
 Case m of
   1,3,5,7,8,10,12: NumbofDaysInMth := 31;
   4,6,9,11       : NumbofDaysInMth := 30;
   2              : NumbofDaysInMth := 28 +
                    ord((y1 mod 4) = 0);
 end;
end;

procedure Qtext(x1,y1 :byte;str :string;kleur,achtergrondkleur : Byte);

begin
 textbackground(achtergrondkleur);
 textcolor(kleur);
 gotoxy(x1,y1);write(str);
 textbackground(0);
end;

procedure qhor(x1,y1,aantal,teken,kleur :byte);

begin
 for p1 :=1 to aantal do qtext(x1+p1-1,y1,chr(teken),kleur,0);
end;

procedure qver(x1,y1,aantal,teken,kleur :byte);

begin
 for p1 :=1 to aantal do qtext(x1,y1+p1-1,chr(teken),kleur,0);
end;

procedure Qfill_screen(char,color :byte);

begin
 regs.ah :=9;
 regs.al :=char;
 regs.bh :=0;
 regs.bl :=color;
 regs.ch :=7;
 regs.cl :=208;
 intr(16,regs);
 textbackground(0);
end;


begin
 clrscr;
 Qfill_screen(178,8);
 Qtext(10,21,' Arrow-keys --> <-- is scroll months / escape is exit ',15,4);
 Qhor(11,22,54,176,8);
 Qtext(28,5,'czesc ramki której forum nie wyswietla poprawnie',3,0);
 Qver(28,6,11,179,3);Qver(66,6,11,179,3);
 Qtext(28,17,'czesc ramki której forum nie wyswietla poprawnie',3,0);
 Qhor(30,18,39,176,8);Qver(67,6,12,176,8);Qver(68,6,12,176,8);
 window(29,6,65,16);clrscr;
 Qhor(2,2,34,196,5);
 Qtext(2,3,'Zon  Maa  Din  Woe  Don  Vry  Zat',9,0);
 getdate(jaar,maand,dag,weekdag);

 x :=3+(weekdag*5); { X coordinaten  van de weekdag }
 for p :=dag-1 downto 1 do begin
   dec(x,5);
   if x <0 then x :=33;
 end;

 repeat
   Qtext(2,1,mnd[maand]+'     ',11,0);
   str(jaar,s0);Qtext(32,1,s0,11,0);
   pp :=NumbofDaysInMth(jaar,maand);  { telt het aantal dagen in een maand }

   u :=x;
   y :=5;
   for p :=5 to 10 do Qhor(2,p,34,32,7);               { maakt veld schoon }
   for p :=1 to pp do begin
     if p <10 then q :=1 else q :=0;
     str(p,s0);Qtext(x+q,y,s0,7,0);
     if p = dag then Qtext(x+q,y,s0,14,4);
     inc(x,5);if x >33 then begin x :=3;inc(y,1);end;
   end;

   repeat
     ch :=readkey;
   until ch in[#75,#77,#27];

   case ch of
     #75:begin
           dec(maand);sound(200);delay(5);nosound;
           pp :=NumbofDaysInMth(jaar,maand);
           x :=u;
           for p :=pp downto 1 do begin
             dec(x,5);if x <0 then x :=33;
           end;
         end;
     #77:begin inc(maand);sound(300);delay(5);nosound;end;
   end;

   if Maand<1 then begin
     Maand:=12; Dec(jaar);
     pp :=NumbofDaysInMth(jaar,maand);
     x :=u;
     for p :=pp downto 1 do begin
       dec(x,5);if x <0 then x :=33;
     end;
   end;
   if Maand>12 then begin Maand:=1;Inc(jaar);end;
   if jaar<1 then jaar:=1; if jaar>9999 then jaar:=9999;
 until ch in[#27];
 halt;
End.

 

 

 

PS: Przepraszam ze 1 post to prośba ale wierzę w to że jeśli będę dalej programował napewno nie zrezygnuje z tego forum a wręcz przeciwnie będę służył radą dla wszystkich jeśli tylko będę potrafił...

 

Z góry bardzo dziękuje :)

Share this post


Link to post
Share on other sites

Ale co chcesz uzyskać w tym kalendarzu? co ma pokazywać. I pominę fakt, że źle obliczają kiedy rok jest przystępny

Share this post


Link to post
Share on other sites

Ale co chcesz uzyskać w tym kalendarzu? co ma pokazywać. I pominę fakt, że źle obliczają kiedy rok jest przystępny

 

Ma być to kalendarz gregoriański w którym można przesówać strzałkami miesiące... (lewo prawo); żeby uwzględniał rok przestępny oraz żeby wyświetlanie nr dnia pasowało do dnia podanego słownie na górze bądź z boku....( chodzi o coś takeigo ze przykładowo na górze mam wypisane dni (od pon do niedz) i przykłądowo pozycja (string) -> "pon" to (1,1)

ale skoro mamy dzień przykładowo środę 1 czerwca to żeby data (1) była pod środą( pozycja (5,1) nie poniedziałkiem(pozycja (1,1)) no i żeby podświetlał aktualną datę którą pobierze z modułu Dos i wyświetli ją jako start kalendarza ( po właczeniu wyświetli kalendarz z aktualną kartką i podświetloną odpowienio datą ( dokładnie taki jaki umieściłem bez zbędnych elementów graficznych)

Share this post


Link to post
Share on other sites

aaa, czaje, to wpierw zobacz jakie są warunki aby rok był przystępny, poszukaj jak najwcześniejszego roku który: 1 stycznia to poniedziałek, poprzedni rok był podzielny przez 4, znając to i wiedząc, że rok ma 365 dni, w tym 52*7=364, czyli ma o dzień za dużo, a przystępny o dwa, to z każdym rokiem dodajesz do swego przesunięcia 1 lub 2 (na początku wynosi ono 0), dodajesz modulo7, aż dojdziesz do swego roku wtedy już wiesz jakim dniem jest pierwszy stycznia Twego roku, to pozostałe dni łatwo obliczyć.

Share this post


Link to post
Share on other sites

aaa, czaje, to wpierw zobacz jakie są warunki aby rok był przystępny, poszukaj jak najwcześniejszego roku który: 1 stycznia to poniedziałek, poprzedni rok był podzielny przez 4, znając to i wiedząc, że rok ma 365 dni, w tym 52*7=364, czyli ma o dzień za dużo, a przystępny o dwa, to z każdym rokiem dodajesz do swego przesunięcia 1 lub 2 (na początku wynosi ono 0), dodajesz modulo7, aż dojdziesz do swego roku wtedy już wiesz jakim dniem jest pierwszy stycznia Twego roku, to pozostałe dni łatwo obliczyć.

 

 

Z tego co wyczytałem przed chwilą to rok jest przystępny pod takim warunkiem regułu matematycznej która mówi, że...

 

"Jeśli rok dzieli się przez 4, a nie dzieli przez 100, to jest on przestępny"

 

Wiec warunek w pascalu to:

 if (rok mod 4=0) and (rok mod 100<>0) then

 

Czy to jest prawidłowe w 100%?? A jeśli jest to co dalej?? Jak go użyć i co w jakiej kolejności pisać ??

Share this post


Link to post
Share on other sites

nie, pełna to: rok jest podzielny przez 4, ale nie jest podzielny przez 100 chyba, że jest podzielny przez 400. A co dalej to powiedziałem już

Share this post


Link to post
Share on other sites

nie, pełna to: rok jest podzielny przez 4, ale nie jest podzielny przez 100 chyba, że jest podzielny przez 400. A co dalej to powiedziałem już

 

 

Ok zrozumiałem wiec warunkiem pełnym jest:

 

(rok mod 4 = 0) and (rok mod 100 <> 0) ) or ( rok mod 400 = 0 );

 

Teraz przede mną znaleźć poniedziałek 1 stycznia w jak najmłodszym roku sprawdzając od roku 0 ?? Bo troszke nie rozumiem i jeśli juz go znajde to do niego mam dodawać 1 dzien przesunięcia czyli modulo7 ?!

Share this post


Link to post
Share on other sites

Nie od roku 0, ale od daty gdy wprowadzono kalendarz gregoriański. Poza tym ja walnąłem sobie hasło "wieczny kalendarz" kliknął Wikipedię i dostałem gotowy algorytm dla lat 1-9999, a nie szukałem w hiszpańskojęzycznych rzeczach: link

Share this post


Link to post
Share on other sites

Nie od roku 0, ale od daty gdy wprowadzono kalendarz gregoriański. Poza tym ja walnąłem sobie hasło "wieczny kalendarz" kliknął Wikipedię i dostałem gotowy algorytm dla lat 1-9999, a nie szukałem w hiszpańskojęzycznych rzeczach: link

 

 

Teraz to mi już kompletnie się namieszało... <_<

 

Na wiki nie ma kompletnego objaśnienia i przez to nie czaje ile jest w tym kodzie już zawarte... niby mam własną

funkcję która liczy mi liczbę dni w miesiacu... następnie z wiki mam funkcję która liczy dni tygodnia ale problem tkwi w tym ze

mimo to że jest ona częściowo wytłumaczona nie wiem nic o zmiennych z funkcji ( M,C,D,N)... Juz sam nie wiem ile mi ta funkcja

liczy... mógłbyś mi to wyjaśnić na "chłopski rozum" jak to się mówi... ??

 

Dla przypomnienia:

 function dzien_tygodnia(Year,Month,Day:word):string;
var M,C,D,N:integer;
const week:array[0..6]of string[12]=('Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota');
begin
       M := 1 + (Month + 9) mod 12 ; if M>10 then Dec(Year) ;
       C := Year div 100 ; D := Year mod 100 ;
       N := ((13*M-1) div 5 + D + D div 4 + C div 4 + 5*C + Day) mod 7 ;
       dzien_tygodnia:=week[N];
end;

Share this post


Link to post
Share on other sites

No podajesz jej datę, a ono mówi co to za dzień. Na wiki jest wytłumaczone, ale Ty od razu polazałeś do "implementacja w pascalu" a wcześnie było opis algorytmu

Share this post


Link to post
Share on other sites

No podajesz jej datę, a ono mówi co to za dzień. Na wiki jest wytłumaczone, ale Ty od razu polazałeś do "implementacja w pascalu" a wcześnie było opis algorytmu

 

siedzę nad tym pół dnia i dalej nie moge... problem zaczyna się przy działaniach matematycznych...

 

M := 1 + (Month + 9) mod 12 ; if M>10 then Dec(Year) ;

 

z tego co mi wychdozi to nr miesiaca (M) równa się 1 dodac miesiac + 9 mod 12 po co robimy takie równanie?

dalej pętla.. której też nie rozumiem...

 

w pozostałych 3 linijkach mam ten sam problem... nie ma wyjaśnionych wszystkich parametrów :(

 

Przeczytałem tamto wyżej również kilka razy i dalej mi nic z tego nie wynika...

:(

 

 

 

kurcze... chodzi mi o coś takiego

wiem ze M := 1 + (Month + 9) mod 12 czyli M to miesiac +9 dodac 1 dzielac przez 12

dalej wiem ze jezeli M>10 to "dec(rok)" i teraz skad się wzięło te dec? nie mamy tego w zmiennych czy jest to jakaś wcześniejsza procedura odnośnie ilości dni w miesiacu? bo domyślam się że jest to coś zwiazane z przeskoczeniem roku np 2007/2008 lecąc dalej

 

C := Year div 100 ; D := Year mod 100 ; czyli C to rok dzielony bez reszty na sto

 

D równa się rok dzielony z resztą przez 100

 

dalej....

 

N := ((13*M-1) div 5 + D + D div 4 + C div 4 + 5*C + Day) mod 7 ;

dzien_tygodnia:=week[N];

 

N to 13* zmienna m-1 i teraz pytanie co nam ona przechowuje? następnie dzieląc przez 5

bez reszty i dodając D które przechowuje nam i znów pytanie co to jest ??

i D dzielone przez 4 bez reszty następnie dodajemy 5*C i znów pytanie czym we wzorze jest C ?? potem dodajemy dzien i dzielimy przez siedem z resztą... i co do mod7 to pewnie chdozi o ilosć dni w tygodniu... ale nie wiem pewnie się mylę... wtedy wiemy nasza funkcja jest równa tydzien[n]

 

Mógłbyś mi to wyjaśnić?? Bo tego właśnie nie rozumiem w kodzie a na wiki jest zbyt słabo to opisane... reszta pewnie już jakoś pójdzie jak to bede wiedział na jakiej zasadzie działa...

Share this post


Link to post
Share on other sites
link. Poza tym ja Cię nie rozumie, chcesz po prostu gotowy kod wraz z wytłumaczeniem wszystkiego? Algorytm tak działa bo wystarczy przeanalizować jak się przesuwa początek roku jak bierzemy od razu cały wiek i się tyle dodaje ile mamy pełnych wieków, potem się bada który dzień w roku i tyle, trzeba po prostu przeanalizować kalendarz.

Share this post


Link to post
Share on other sites

link. Poza tym ja Cię nie rozumie, chcesz po prostu gotowy kod wraz z wytłumaczeniem wszystkiego? Algorytm tak działa bo wystarczy przeanalizować jak się przesuwa początek roku jak bierzemy od razu cały wiek i się tyle dodaje ile mamy pełnych wieków, potem się bada który dzień w roku i tyle, trzeba po prostu przeanalizować kalendarz.

 

No dobra... może to było głupie o co wcześniej pytałem :P Po prostu chcę wiedzieć co on dokładnie oblicza i jak się używa tej funkcji, co ona wykonuje, jak to wygląda :P

Tzn chodzi mi jak wygląda wartość którą zwraca? czy jest to tylko napis czy od razu wypisuje mi odpowiednie dni pod spodem czy co^^:P

Share this post


Link to post
Share on other sites

No dobra.... pomęczyłem się troszkę i wyszło mi coś takiego....

 

zostało zrobić tylko klawisze lewo prawo podświetlenie aktualnego dnia i wyświetlanie dni w odpowiednich miejscach...

 

 program kalendarz;

uses Crt,Dos;



const

nazw_mies : array[1..12] of string[9] = ('Styczeń','Luty','Marzec',
  'Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik',
  'Listopad','Grudzień');


tydzien : array[0..6]of string[12] = ('Nie','Pon','Wto','Śro',
 'Czw','Pią','Sob');


var

rok,miesiac,dzien,tyg : word;
a,b,c,d,x,y           : integer;


{
Function miesiac_dni (rok,a : word) : Byte;

begin

 Case a of

     1,3,5,7,8,19,12: miesiac_dni := 31;
    4,6,9,11       : miesiac_dni := 30;
    2              : miesiac_dni := 28 +
                   ord( ((rok mod 4) = 0) and
                   (rok mod 100 <> 0) )  or
                   ( rok mod 400 = 0));


 end;
end;          }

Function ilosc_dni (rok,miesiac,dzien:word) : string;

var
 m,c,d,n : integer;

begin

       m := 1 +(miesiac + 9) mod 12;

         if m>10 then Dec(rok);

       c := rok div 100; d := rok mod 100;

       n := ((13*m-1) div 5 + d + d div 4 + C div 4 + 5*c + dzien) mod 7;
       ilosc_dni := tydzien[n];

end;


BEGIN
ClrScr;

       getdate(rok,miesiac,dzien,tyg);

      gotoxy(9,10);
writeln(dzien,'       ',nazw_mies[miesiac],'        ',rok);
                            {wyswietlenie dni}

      gotoxy(9,11);
writeln('=============================');
      gotoxy(9,12);


a := 0;
repeat

 writeln (tydzien[a]);
 a := a+1;
 if a = 1 then
   gotoxy(14,12);
  if a = 2 then
   gotoxy(19,12);
  if a = 3 then
   gotoxy(24,12);
  if a = 4 then
   gotoxy(29,12);
  if a = 5 then
   gotoxy(34,12);
  if a = 6 then
   gotoxy(39,12);


until a = 6;

gotoxy(9,13);
writeln('=============================');




readln;
end.

 

Tylko mam problem teraz z funkcją " miesiac_dni"... coś nie działa mi... zwraca że coś ze średnikiem nie tak... a nie czaje tego...

 

Dodam ze nie wiem w sumie po co mi była ta funkcja (ilosc_dni):P bo jak narazie nie przydała się:) sprawdziłem i zwraca nazwę dnia w postaci const z tabeli tydzien[n]...:PP

 

Prosiłbym o malą podpowiedz co teraz zrobić i czego użyć do tego(jakiej funkcji) :PP hehehe... :)

Share this post


Link to post
Share on other sites

Źle zrobiłeś nawiasowanie przy lutym

 

Właśnie nie wiem czemu nie idzie... jak to mozna zrobić poprawnie?

ord ma w nawiasie cały warunek a kazde coś mod coś powinno też być w nawiasie... wiec nie wiem ocb...;/

Share this post


Link to post
Share on other sites

No policz sobie nawiasy, zobacz który co zamyka, tu: "rok mod 100 0) )" pewnie masz o jeden zamykający za dużo, ale nie wiem, ale to podejrzane jest

Share this post


Link to post
Share on other sites

No policz sobie nawiasy, zobacz który co zamyka, tu: "rok mod 100 <> 0) )" pewnie masz o jeden zamykający za dużo, ale nie wiem, ale to podejrzane jest

 

tak równeż nie idzie... na 10000 różnych sposobów dedukowałem ułożenie nawiasów i dalej nie wiem jak...

Share this post


Link to post
Share on other sites

Jacie, masz tam o jeden zamykający nawias za dużo, trzeba je zliczyć idąc od lewej

Share this post


Link to post
Share on other sites

Jacie, masz tam o jeden zamykający nawias za dużo, trzeba je zliczyć idąc od lewej

 

OMG ... end; potrzbny do case^^ skasowałem wzorując się na dalszej funkcji a po ponownym przepisaniu nawiasy dobrze były:P hehe... przepraszam:D głupoty się w ogóle nie czuje^^ :D

 

A mógłbyś mi powiedzieć co teraz musze zrobić i czego do tego użyć?? zeby to ładnie mi pod spodem wyświetlało dni odpowiednio pod nazwami dni??

Oczywiście zeby się dało potem zrobić podświetlenie i aktywne kursory lewo prawo... ;P

Share this post


Link to post
Share on other sites

że co? wytłumacz jaśniej, a i ja ci kodu nie bedę tłumaczyć, zrób swój a jak będzie błąd to wtedy

Share this post


Link to post
Share on other sites

że co? wytłumacz jaśniej, a i ja ci kodu nie bedę tłumaczyć, zrób swój a jak będzie błąd to wtedy

Tzn chodzi mi o to na jakiej zasadzie ma się opierać przesówanie dni ... tzn przykładowo skoro dziś jest pt to zeby

dzisiejsza data byla pod piatkiem i jeszcze chodzi mi o to ze np jesli jest 1 dzien miesiaca dajmy przykladowo czwartek

to zeby on byl od razu pod czwartkiem... i teraz pytanie ... na jakiej zasadzie ma to mi przesówać te dni i umieszczać je pod sobą zeby było poprawnie...?!

no co do umieszczenia o linijke niżej to musze w

gotoxy(x,Inc(y));

ale jak zrobić to żeby miesiac zaczynal sie od odpowiedniego miejsca

dla jedynki(nr dnia) w kalendarzu i przy niedizeli przechodzil w dół... chaotycznie strasznie napisałem ale mam nadzieje ze juz wiesz o co mi chodzi^^:D

Share this post


Link to post
Share on other sites

to wyświetlasz dni w repeat until wyświetlanie, zwieszając w dobrym miejscu x-a i zerując. Poza tym Inc to procedura (przynajmniej w Delphi) to tak jej nie użyjesz

Share this post


Link to post
Share on other sites

Kurcze... siedze już 3 godzine z kolei i nie mogę zrobić tego... mógłbyś mi podpowiedzieć jak zrobić te przesuwanie 1 dnia miesiaca pod odpowiedni dzień? i jak zapętlić

ażeby dni wypisywało mi w odpowiednich miejsach?? tzn nie chodzi mi o kod tylko o słowne wytłumaczenie czego użyć i na jakiej zasadzie to ma przeskakiwać...

 

Ja robilem coś takiego że funkcja ilosc_dni:

 

Function ilosc_dni (rok,miesiac,dzien:word) : byte;

var
 m,c,d,n : integer;

begin

       m := 1 +(miesiac + 9) mod 12;

         if m>10 then Dec(rok);

       c := rok div 100; d := rok mod 100;

       n := ((13*m-1) div 5 + d + d div 4 + C div 4 + 5*c + dzien) mod 7;
       ilosc_dni := {tydzien[}n{]};

end;

zwracała mi nr dnia.. czyli :

Niedz to 0

Pon to 1

i tak do soboty (6)

 

teraz nie wiem jak to wykorzystac zeby wypisało mi wszystkie dni ( np: luty od 1 do 28 czy 29)

pod odpowiednimi skrótami dnia ( np: pod poniedziałkiem numerki 2,9,16,23,30 (mówiac na przykładzie obecnego miesiaca))

 

EDIT:

 

Trochę się spóźniłem z 2 postem bo dałeś odp ale kasować juz chyba nie bede...:)

Share this post


Link to post
Share on other sites

Siedzę i robie kolejne pętle i nic...:( mógbyś mi zradzic na jakiej to zasadzie ma się wypisywać?? Bo ja już tu od tego szaleje^^ :)

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...