Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
anabanana Forumaš(ica)
Pridružen/a: 05. 11. 2012. (21:54:05) Postovi: (17)16
|
|
[Vrh] |
|
delilah01. Forumaš(ica)
Pridružen/a: 10. 11. 2011. (22:50:23) Postovi: (39)16
|
|
[Vrh] |
|
Kilerica Forumaš(ica)
Pridružen/a: 31. 01. 2012. (13:05:09) Postovi: (3)16
|
|
[Vrh] |
|
zaruljica Forumaš(ica)
Pridružen/a: 23. 09. 2011. (13:15:25) Postovi: (41)16
Spol:
Lokacija: Split/Zagreb
|
|
[Vrh] |
|
Llama Forumaš(ica)
Pridružen/a: 18. 10. 2012. (09:50:53) Postovi: (14)16
Spol:
|
|
[Vrh] |
|
Vishykc Forumaš(ica)
Pridružen/a: 23. 10. 2010. (14:38:08) Postovi: (6A)16
Spol:
Lokacija: Zagreb
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
white_butterfly Forumaš(ica)
Pridružen/a: 14. 10. 2011. (17:44:57) Postovi: (40)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
dodgin_lions Forumaš(ica)
Pridružen/a: 24. 07. 2012. (14:49:47) Postovi: (22)16
Spol:
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 22:30 sub, 8. 6. 2013 Naslov: |
|
|
[quote="frutabella"]da li je moguce da se stave i rjesenja ovog kolokvija i proslogodisnjeg popravnog?[/quote]
Evo rješenja prvog zadatka iz ovogodišnjeg drugog kolokvija (za sve četiri grupe).
Prvo ide "školsko rješenje", gdje se razlika datuma broji "na prste" inkrementirajući datume od manjeg do većeg.
[code:1]
#include <stdio.h>
/* deklaracija strukture */
struct Datum {
int dan;
int mjesec;
int godina;
};
typedef Datum datum;
/* funkcije za unošenje datuma za sve 4 grupe */
datum unesi_datum_A(void){
datum d;
scanf("%d-%d-%d", &d.godina, &d.mjesec, &d.dan);
return d;
}
datum unesi_datum_B(void){
datum d;
scanf("%d.%d.%d.", &d.dan, &d.mjesec, &d.godina);
return d;
}
datum unesi_datum_C(void){
datum d;
scanf("%d/%d/%d.", &d.dan, &d.mjesec, &d.godina);
return d;
}
datum unesi_datum_D(void){
datum d;
scanf("%d/%d/%d", &d.mjesec, &d.dan, &d.godina);
return d;
}
/* pomocne funkcije */
int datecmp(datum d1, datum d2){ /* usporedjivanje se obavlja analogno funkciji strcmp */
if(d1.godina != d2.godina) return d1.godina - d2.godina;
if(d1.mjesec != d2.mjesec) return d1.mjesec - d2.mjesec;
return d1.dan - d2.dan;
}
int prijestupna(int godina){
if(godina % 400 == 0 || (godina % 4 == 0 && godina % 100 != 0)) return 1;
else return 0;
}
int dana_u_mjesecu(int mjesec, int godina){
switch(mjesec){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
return 28 + prijestupna(mjesec, godina);
default:
return 0; /* ovo se ne bi smjelo dogoditi :) */
}
}
void increment(date* d){
if(d->dan < dana_u_mjesecu(d->mjesec, d->godina)) ++d->dan;
else {
d->dan = 1;
if(d->mjesec < 12) ++d->mjesec;
else {
d->mjesec = 1;
++d->godina;
}
}
}
/* Funckije iz (c) dijela zadatka. */
int razlika(datum d1, datum d2){
int broj_dana = 0;
if(datecmp(d1, d2) > 0){
datum tmp = d1;
d1 = d2;
d2 = tmp;
}
while(datecmp(d1, d2) < 0){
++broj_dana;
increment(&d1);
}
return broj_dana;
}
void dan(datum d) { /* koristimo da je 31. svibnja 2013. petak */
datum dx;
int dan = 5; /* 0 = ned; 1 = pon; 2 = uto; 3 = sri; 4 = cet; 5 = pet; 6 = sub */
dx.dan = 31;
dx.mjesec = 5;
dx.godina = 2013;
if(datecmp(d, dx) > 0){
datum tmp = d;
d = dx;
dx = tmp;
}
while(datecmp(d, dx) < 0){
++dan;
increment(&d);
}
switch(dan % 7){
case 0:
printf("nedjelja\n");
break;
case 1:
printf("ponedjeljak\n");
break;
case 2:
printf("utorak\n");
break;
case 3:
printf("srijeda\n");
break;
case 4:
printf("cetvrtak\n");
break;
case 5:
printf("petak\n");
break;
case 6:
printf("subota\n");
break;
default:
break;
}
}
void voyager(datum d){
datum dx;
int broj_dana = 0, predznak;
dx.dan = 5;
dx.mjesec = 9;
dx.godina = 1977;
if(datecmp(dx, d) > 0){
datum tmp = d;
d = dx;
dx = tmp;
predznak = -1
} else {
predznak = 1;
}
while(datecmp(dx, d) < 0){
++broj_dana;
increment(&dx);
}
return predznak * broj_dana;
}
datum pluton(unsigned n){
unsigned ukupno_dana = n * 89866u;
date d;
d.dan = 18;
date.mjesec = 2;
date.godina = 1930;
while(ukupno_dana > 0){
increment(&d);
--ukupno_dana;
}
return d;
}
[/code:1]
Evo sada i malo sofisticiranijeg rješenja:
[code:1]
#include <stdio.h>
#include <stdlib.h>
struct Datum {
int days_from_111; /* dani protekli od 0001-01-01 */
};
typedef Datum datum;
datum to_date(int year, int month, int day){
Datum d;
int y = year - 1;
d.days_from_111 = y * 365 + y / 4 - y / 100 + y / 400;
switch(month - 1){
case 11:
d.days_from_111 += 30;
case 10:
d.days_from_111 += 31;
case 9:
d.days_from_111 += 30;
case 8:
d.days_from_111 += 31;
case 7:
d.days_from_111 += 31;
case 6:
d.days_from_111 += 30;
case 5:
d.days_from_111 += 31;
case 4:
d.days_from_111 += 30;
case 3:
d.days_from_111 += 31;
case 2:
d.days_from_111 += 28;
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) d.days_from_111 += 1;
case 1:
d.days_from_111 += 31;
default:
break;
}
d.days_from_111 += day;
return d;
}
/* funkcije za unošenje datuma za sve 4 grupe */
datum unesi_datum_A(void){
int godina, mjesec, dan;
scanf("%d-%d-%d", &d.godina, &d.mjesec, &d.dan);
return to_date(godina, mjesec, dan);
}
datum unesi_datum_B(void){
int godina, mjesec, dan;
scanf("%d.%d.%d.", &d.dan, &d.mjesec, &d.godina);
return to_date(godina, mjesec, dan);
}
datum unesi_datum_C(void){
int godina, mjesec, dan;
scanf("%d/%d/%d.", &d.dan, &d.mjesec, &d.godina);
return to_date(godina, mjesec, dan);
}
datum unesi_datum_D(void){
int godina, mjesec, dan;
scanf("%d/%d/%d", &d.mjesec, &d.dan, &d.godina);
return to_date(godina, mjesec, dan);
}
int razlika(datum d1, datum d2){
return abs(d1.days_from_111 - d2.days_from_111);
}
void dan(datum d) {
datum petak = to_date(2013, 5, 31);
switch((d.days_from_111 - petak.days_from_111) % 7){
case 0:
printf("nedjelja\n");
break;
case 1:
case -6:
printf("ponedjeljak\n");
break;
case 2:
case -5:
printf("utorak\n");
break;
case 3:
case -4:
printf("srijeda\n");
break;
case 4:
case -3:
printf("cetvrtak\n");
break;
case 5:
case -2:
printf("petak\n");
break;
case 6:
case -1:
printf("subota\n");
break;
default:
break;
}
}
void voyager(datum d){
datum voyager = to_date(1977, 9, 5);
return d.days_from_111 - voyager.days_from_111;
}
datum pluton(unsigned n){
datum p = to_date(1930, 2, 18);
p.days_from_111 += n * 89866u;
return p;
}
[/code:1]
frutabella (napisa): | da li je moguce da se stave i rjesenja ovog kolokvija i proslogodisnjeg popravnog? |
Evo rješenja prvog zadatka iz ovogodišnjeg drugog kolokvija (za sve četiri grupe).
Prvo ide "školsko rješenje", gdje se razlika datuma broji "na prste" inkrementirajući datume od manjeg do većeg.
Kod: |
#include <stdio.h>
/* deklaracija strukture */
struct Datum {
int dan;
int mjesec;
int godina;
};
typedef Datum datum;
/* funkcije za unošenje datuma za sve 4 grupe */
datum unesi_datum_A(void){
datum d;
scanf("%d-%d-%d", &d.godina, &d.mjesec, &d.dan);
return d;
}
datum unesi_datum_B(void){
datum d;
scanf("%d.%d.%d.", &d.dan, &d.mjesec, &d.godina);
return d;
}
datum unesi_datum_C(void){
datum d;
scanf("%d/%d/%d.", &d.dan, &d.mjesec, &d.godina);
return d;
}
datum unesi_datum_D(void){
datum d;
scanf("%d/%d/%d", &d.mjesec, &d.dan, &d.godina);
return d;
}
/* pomocne funkcije */
int datecmp(datum d1, datum d2){ /* usporedjivanje se obavlja analogno funkciji strcmp */
if(d1.godina != d2.godina) return d1.godina - d2.godina;
if(d1.mjesec != d2.mjesec) return d1.mjesec - d2.mjesec;
return d1.dan - d2.dan;
}
int prijestupna(int godina){
if(godina % 400 == 0 || (godina % 4 == 0 && godina % 100 != 0)) return 1;
else return 0;
}
int dana_u_mjesecu(int mjesec, int godina){
switch(mjesec){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
return 28 + prijestupna(mjesec, godina);
default:
return 0; /* ovo se ne bi smjelo dogoditi :) */
}
}
void increment(date* d){
if(d->dan < dana_u_mjesecu(d->mjesec, d->godina)) ++d->dan;
else {
d->dan = 1;
if(d->mjesec < 12) ++d->mjesec;
else {
d->mjesec = 1;
++d->godina;
}
}
}
/* Funckije iz (c) dijela zadatka. */
int razlika(datum d1, datum d2){
int broj_dana = 0;
if(datecmp(d1, d2) > 0){
datum tmp = d1;
d1 = d2;
d2 = tmp;
}
while(datecmp(d1, d2) < 0){
++broj_dana;
increment(&d1);
}
return broj_dana;
}
void dan(datum d) { /* koristimo da je 31. svibnja 2013. petak */
datum dx;
int dan = 5; /* 0 = ned; 1 = pon; 2 = uto; 3 = sri; 4 = cet; 5 = pet; 6 = sub */
dx.dan = 31;
dx.mjesec = 5;
dx.godina = 2013;
if(datecmp(d, dx) > 0){
datum tmp = d;
d = dx;
dx = tmp;
}
while(datecmp(d, dx) < 0){
++dan;
increment(&d);
}
switch(dan % 7){
case 0:
printf("nedjelja\n");
break;
case 1:
printf("ponedjeljak\n");
break;
case 2:
printf("utorak\n");
break;
case 3:
printf("srijeda\n");
break;
case 4:
printf("cetvrtak\n");
break;
case 5:
printf("petak\n");
break;
case 6:
printf("subota\n");
break;
default:
break;
}
}
void voyager(datum d){
datum dx;
int broj_dana = 0, predznak;
dx.dan = 5;
dx.mjesec = 9;
dx.godina = 1977;
if(datecmp(dx, d) > 0){
datum tmp = d;
d = dx;
dx = tmp;
predznak = -1
} else {
predznak = 1;
}
while(datecmp(dx, d) < 0){
++broj_dana;
increment(&dx);
}
return predznak * broj_dana;
}
datum pluton(unsigned n){
unsigned ukupno_dana = n * 89866u;
date d;
d.dan = 18;
date.mjesec = 2;
date.godina = 1930;
while(ukupno_dana > 0){
increment(&d);
--ukupno_dana;
}
return d;
}
|
Evo sada i malo sofisticiranijeg rješenja:
Kod: |
#include <stdio.h>
#include <stdlib.h>
struct Datum {
int days_from_111; /* dani protekli od 0001-01-01 */
};
typedef Datum datum;
datum to_date(int year, int month, int day){
Datum d;
int y = year - 1;
d.days_from_111 = y * 365 + y / 4 - y / 100 + y / 400;
switch(month - 1){
case 11:
d.days_from_111 += 30;
case 10:
d.days_from_111 += 31;
case 9:
d.days_from_111 += 30;
case 8:
d.days_from_111 += 31;
case 7:
d.days_from_111 += 31;
case 6:
d.days_from_111 += 30;
case 5:
d.days_from_111 += 31;
case 4:
d.days_from_111 += 30;
case 3:
d.days_from_111 += 31;
case 2:
d.days_from_111 += 28;
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) d.days_from_111 += 1;
case 1:
d.days_from_111 += 31;
default:
break;
}
d.days_from_111 += day;
return d;
}
/* funkcije za unošenje datuma za sve 4 grupe */
datum unesi_datum_A(void){
int godina, mjesec, dan;
scanf("%d-%d-%d", &d.godina, &d.mjesec, &d.dan);
return to_date(godina, mjesec, dan);
}
datum unesi_datum_B(void){
int godina, mjesec, dan;
scanf("%d.%d.%d.", &d.dan, &d.mjesec, &d.godina);
return to_date(godina, mjesec, dan);
}
datum unesi_datum_C(void){
int godina, mjesec, dan;
scanf("%d/%d/%d.", &d.dan, &d.mjesec, &d.godina);
return to_date(godina, mjesec, dan);
}
datum unesi_datum_D(void){
int godina, mjesec, dan;
scanf("%d/%d/%d", &d.mjesec, &d.dan, &d.godina);
return to_date(godina, mjesec, dan);
}
int razlika(datum d1, datum d2){
return abs(d1.days_from_111 - d2.days_from_111);
}
void dan(datum d) {
datum petak = to_date(2013, 5, 31);
switch((d.days_from_111 - petak.days_from_111) % 7){
case 0:
printf("nedjelja\n");
break;
case 1:
case -6:
printf("ponedjeljak\n");
break;
case 2:
case -5:
printf("utorak\n");
break;
case 3:
case -4:
printf("srijeda\n");
break;
case 4:
case -3:
printf("cetvrtak\n");
break;
case 5:
case -2:
printf("petak\n");
break;
case 6:
case -1:
printf("subota\n");
break;
default:
break;
}
}
void voyager(datum d){
datum voyager = to_date(1977, 9, 5);
return d.days_from_111 - voyager.days_from_111;
}
datum pluton(unsigned n){
datum p = to_date(1930, 2, 18);
p.days_from_111 += n * 89866u;
return p;
}
|
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
briemann0 Forumaš(ica)
Pridružen/a: 12. 10. 2012. (18:45:05) Postovi: (5)16
Spol:
|
Postano: 12:56 ned, 9. 6. 2013 Naslov: |
|
|
Jel bi se priznalo rješenje pomoću strukture [tt]tm[/tt] definirane u [tt]time.h[/tt]?
[code:1]#include <stdio.h>
#include <time.h>
#define DATUM "12.4.1701"
int main(void){
char dani[7][15] = {"nedjelja", "ponedjeljak", "utorak", "srijeda", "cetvrtak", "petak", "subota"};
struct tm tm;
strptime(DATUM, "%d.%m.%Y", &tm);
printf("%s\n", dani[tm.tm_wday]);
return 0;
}[/code:1]
Jel bi se priznalo rješenje pomoću strukture tm definirane u time.h?
Kod: | #include <stdio.h>
#include <time.h>
#define DATUM "12.4.1701"
int main(void){
char dani[7][15] = {"nedjelja", "ponedjeljak", "utorak", "srijeda", "cetvrtak", "petak", "subota"};
struct tm tm;
strptime(DATUM, "%d.%m.%Y", &tm);
printf("%s\n", dani[tm.tm_wday]);
return 0;
} |
|
|
[Vrh] |
|
hellokitty Forumaš(ica)
Pridružen/a: 23. 11. 2012. (21:12:11) Postovi: (7)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
white_butterfly Forumaš(ica)
Pridružen/a: 14. 10. 2011. (17:44:57) Postovi: (40)16
Spol:
|
|
[Vrh] |
|
piccola Forumaš(ica)
Pridružen/a: 30. 11. 2009. (15:39:50) Postovi: (D7)16
|
|
[Vrh] |
|
|