Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Datum koji slijedi N dana nakon ucitanog datuma

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma

[ Pregleda: 3798 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dalmasica
Slučajna prolaznica
Croatia

Član broj: 107777
Poruke: 35
*.sava.sczg.hr.



Profil

icon [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma04.11.2009. u 15:56 - pre 147 meseci
Napisite program koji ce ucitati jedan datum (3 prirodna broja, redom dan, mjesec i godina) i prirodni broj n, te ispisati
datum koji slijedi n dana nakon ucitanog datuma.
Napomene: Datumi ce bit iz segmenta od 1.1.1950. (nedjelja) do 31.12.2050. Treba pripaziti da je ucitani datum postojeci,
a u protivnom vratiti poruku “Greska!”. Svaka cetvrta godina je prijestupna (npr. jedna od takvih je i 2008), sto znaci da
veljaca tada ima 29, a ne 28 dana. Sijecanj, ozujak, svibanj, srpanj, kolovoz, listopad i prosinac imaju po 31 dan, a ostali
mjeseci, osim veljace, po 30 dana.
Ispis treba biti u formatu “d.m.g.”. Na primjer, ako su uˇcitani brojevi 14, 3, 2008 i 1, program treba ispisati “15.3.2008.”
(bez navodnika).
Blago onome ko zna da ne zna, a hoće da zna
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma04.11.2009. u 16:30 - pre 147 meseci
Zadatak se najelegantnije rešava tako što se naprave funkcije koje pretvaraju datum u broj dana od početnog datuma (1. januar 1.), kao i inverzna koja pretvara broj dana u datum. Kada imamo broj dana od početnog datuma onda je dodavanje i oduzimanje dana prosto sabiranje i oduzimanje. Svaki drugi pristup je komplikovaniji.

Evo na prvu loptu, pretraga u Guglu nudi sledeće: http://alcor.concordia.ca/~gpkatch/gdate-algorithm.html

Tu je dato čak i kako proveriti da li je neki datum ispravan. Ako je upotrebom obe funkcije izlazni datum istovetan ulaznom onda je datum ispravan.
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
91.150.123.*



+4 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma13.11.2009. u 02:23 - pre 146 meseci
Ili oni algoritmi nisu dobri, ili ih ja nisam lepo srocio za C...
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma13.11.2009. u 09:42 - pre 146 meseci
Stavi ovde to što si sročio, ne zaboravi [code ] tagove, pa da vidimo...
 
Odgovor na temu

dalmasica
Slučajna prolaznica
Croatia

Član broj: 107777
Poruke: 35
*.adsl.net.t-com.hr.



Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma13.11.2009. u 22:49 - pre 146 meseci
ovo mi se i ne čini baš lijepo riješenje, ako netko zna malo bolje i ljepše, bila bih vam zahvalana!!

Blago onome ko zna da ne zna, a hoće da zna
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
93.87.179.*



+4 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma15.11.2009. u 16:58 - pre 146 meseci
Evo ja sam odradio ovako, i izbacuje neki nebulozan datum...
Code:

#include<stdio.h>
int g(y,m,d){
    m = (m + 9) % 12;
    y = y - m/10;
    return 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + d - 1; }
int d(int g,int *y,int *mm,int *dd){
    int ddd,mi;
    (*y) = (10000*g + 14780)/3652425;
    ddd = g - (365*(*y) + (*y)/4 - (*y)/100 + (*y)/400);
    if (dd < 0){
     (*y) = (*y) - 1;
     ddd = g - (365*(*y) + (*y)/4 - (*y)/100 + (*y)/400);}
    mi = (100*ddd + 52)/3060;
    (*mm) = (mi + 2)%12 + 1;
    (*y) = (*y) + (mi + 2)/12;
    (*dd) = ddd - (mi*306 + 5)/10 + 1; }
void unos(int *y,int *m,int *d){
    printf("Unesi dan:");
    scanf("%d",&*d);
    printf("Unesi mesec:");
    scanf("%d",&*m);
    printf("Unesi godinu:");
    scanf("%d",&*y);}
main(){
    int y,m,d,n,y1,m1,d1;
    unos(&y,&m,&d);
    printf("Unesi broj dana:");
    scanf("%d",&n);
    d(g(y,m,d)+n,&y1,&m1,&d1);
    printf("%d %d %d",d1,m1,y1);
    getchar();getchar();
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma15.11.2009. u 18:23 - pre 146 meseci
Neće da mi kompajlira jer ima greške.

1. Izostavio si tipove argumenata funkcije d (pretpostavljam int)
2. Izostavio si return na kraju funkcije d (pretpostavljam da funkcija zapravo nema povratnu vrednost)
3. Izostavio si povratnu vrednost funkcije main (ovo jeste int)
4. Imaš promenljivu d u funkciji main koja sakriva funkciju d, jedno od ta dva mora da se preimenuje.

Kako je to tebi uopšte prolazilo?

Inače, otkrio sam posle debagovanja zašto neće da radi. 32-bitni int nije dovoljno veliki da primi rezultat 10000*g+14780 i dolazi do prelivanja bitova i pogrešnog rezultata. Umesto 10000 stavi 10000I64 (tako je kod VC++, a za druge kompajlere ne znam). To će naterati kompajler da na tom mestu operiše 64-bitnim integerima.
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
93.87.138.*



+4 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma16.11.2009. u 20:14 - pre 146 meseci
Citat:


1. Izostavio si tipove argumenata funkcije d (pretpostavljam int)

Ovde ne znam o cemu pricas, koliko vidim ima argumente...
Citat:


2. Izostavio si return na kraju funkcije d (pretpostavljam da funkcija zapravo nema povratnu vrednost)

Pa po onom sajtu treba da vraca vise vrednosti, u C-u je to nemoguce, tako da sam preko pokazivaca vratio te vrednosti...
Citat:


3. Izostavio si povratnu vrednost funkcije main (ovo jeste int)

Ako mislis na
Code:
return 0;
, nama u skoli nikada nije pomenuto da to treba da stavljamo, ako bi mogao da mi objasnis zasto treba da se stavlja...
Citat:


4. Imaš promenljivu d u funkciji main koja sakriva funkciju d, jedno od ta dva mora da se preimenuje.

Preimenovao...
Citat:

Umesto 10000 stavi 10000I64

Koristim Ubuntu, gedit(text editor), tako da koliko vidim to ne moze da se izvede...


[Ovu poruku je menjao proka_92 dana 16.11.2009. u 23:35 GMT+1]
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma17.11.2009. u 07:08 - pre 146 meseci
Pokledaj onda na internetu kako se pišu 64-bitni literali za GCC. Mora da postoji. Možda broj može da se kastuje u long long, ili nešto slično.

Uzgred za prvu tačku mislio sam da umesto "int g(y,m,d)" stoji "int g(int y, int m, int d)", a za drugu tačku umesto "int d(...)" da stoji "void d(...)". Treća tačka proističe iz standarda, main mora da vraća int, i mora da ima ili nula parametara, ili dva (int argc, const char* argv[]).
 
Odgovor na temu

Picsel
Beograd

Član broj: 39817
Poruke: 440
95.180.74.*



+7 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma17.11.2009. u 08:40 - pre 146 meseci
Za long long stavi 10000ll (dva slova L)
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
93.86.247.*



+4 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma17.11.2009. u 17:59 - pre 146 meseci
Hvala na pomoci i sugestijama... Koliko vidim ovaj kod radi:
Code:
#include<stdio.h>
int g(int y,int m,int d){
    m = (m + 9) % 12;
    y = y - m/10;
    return 365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + d - 1; }
void k(int g,int *y,int *mm,int *dd){
    int ddd,mi;
    (*y) = (10000ll*g + 14780)/3652425;
    ddd = g - (365*(*y) + (*y)/4 - (*y)/100 + (*y)/400);
    if (dd < 0){
     (*y) = (*y) - 1;
     ddd = g - (365*(*y) + (*y)/4 - (*y)/100 + (*y)/400);}
    mi = (100*ddd + 52)/3060;
    (*mm) = (mi + 2)%12 + 1;
    (*y) = (*y) + (mi + 2)/12;
    (*dd) = ddd - (mi*306 + 5)/10 + 1; }
void unos(int *y,int *m,int *d){
    printf("Unesi dan:");
    scanf("%d",&*d);
    printf("Unesi mesec:");
    scanf("%d",&*m);
    printf("Unesi godinu:");
    scanf("%d",&*y);}
main(){
    int y,m,d,n,y1,m1,d1;
    unos(&y,&m,&d);
    printf("Unesi broj dana:");
    scanf("%d",&n);
    k(g(y,m,d)+n,&y1,&m1,&d1);
    printf("\n%d %d %d",d1,m1,y1);
    getchar();getchar();
    return 0;}

EDIT:
Ne radi lepo za prestupne godine, za 25.2.2000. posle 4 dana izbaci 0.3.2000.

[Ovu poruku je menjao proka_92 dana 17.11.2009. u 19:41 GMT+1]
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma18.11.2009. u 15:21 - pre 146 meseci
Da li si razmisljao da koristis "C Time Library" (time.h), ili to zadatkom nije dozvoljeno?
 
Odgovor na temu

proka_92
proka_92
Smederevo

Član broj: 153372
Poruke: 69
93.87.137.*



+4 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma19.11.2009. u 12:28 - pre 146 meseci
Nije dozvoljeno...
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 300
*.adsl-a-1.sezampro.yu.



+17 Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma19.11.2009. u 15:22 - pre 146 meseci
Ovde izgleda nije niko čuo za računare i Dejana Ristanovića :)

Na ovoj adrsi ima pascal kod koji se može prevesti:

O kalendaru...


 
Odgovor na temu

dalmasica
Slučajna prolaznica
Croatia

Član broj: 107777
Poruke: 35
*.sava.sczg.hr.



Profil

icon Re: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma22.11.2009. u 15:25 - pre 146 meseci
Napiˇsite program koji ´ce uˇcitati dva datuma (svaki se sastoji od po 3 prirodna broja, redom dan, mjesec i godina), te ispisati
koliko razliˇcitih dana ima u segmentu izmedu ta dva datuma (ukljuˇcivo i njih).
Napomene: Datumi ce bit iz segmenta od 1.1.1950. (nedjelja) do 31.12.2050. Treba pripaziti da je uˇcitani datum postoje´ci,
a u protivnom vratiti poruku “Greska!”. Svaka ˇcetvrta godina je prijestupna (npr. jedna od takvih je i 2008), ˇsto znaci da
veljaˇca tada ima 29, a ne 28 dana. Sijeˇcanj, oˇzujak, svibanj, srpanj, kolovoz, listopad i prosinac imaju po 31 dan, a ostali
mjeseci, osim veljaˇce, po 30 dana.
Datum ispiˇsite u formatu “d.m.g.”.

Kako da usporedim datume??

Napiˇsite program koji ´ce uˇcitati tri datuma (svaki se sastoji od po 3 prirodna broja, redom dan, mjesec i godina), te ispisati
datum kojem je dan preuzet iz najranijeg datuma, mjesec iz srednjeg datuma, a godina iz najkasnijeg.
Napomene: Datumi ce bit iz segmenta od 1.1.1950. (nedjelja) do 31.12.2050. Treba pripaziti da je uˇcitani datum postoje´ci,
a u protivnom vratiti poruku “Greska!”. Svaka ˇcetvrta godina je prijestupna (npr. jedna od takvih je i 2008), ˇsto znaci da
veljaˇca tada ima 29, a ne 28 dana. Sijeˇcanj, oˇzujak, svibanj, srpanj, kolovoz, listopad i prosinac imaju po 31 dan, a ostali
mjeseci, osim veljaˇce, po 30 dana.
Datum ispiˇsite u formatu “d.m.g.”.

Ako tko riješi, nek mi napiše kod!!!


Unaprijed HVALA!


Blago onome ko zna da ne zna, a hoće da zna
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Datum koji slijedi N dana nakon ucitanog datuma

[ Pregleda: 3798 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.