Na zadnjem predavanju 2013./14. pripremali smo se za kolokvij rjesavajuci zadnji zadatak iz aplikacije za zadace. Rjesenje ilustrira strukture, vezane liste i datoteke, dakle tocno gradivo koje ulazi u drugi kolokvij. Evo teksta zadatka:
[quote]Zadana je datoteka "datumi.in" u kojoj se u prvoj liniji nalazi prirodni broj n, a u idućih n redaka zapisani su datumi u formatu
d.m.g.
(po jedan u svakom retku). Datume treba prepisati u datoteku "datumi.out" u formatu
koliko;d.m.g.
pri čemu je koliko broj pojavljivanja datuma u datoteci, a datumi trebaju biti sortirani od najstarijeg prema najnovijem.
Napomena: Datumi u ulaznoj datoteci bit će ispravni, tj. ne treba provjeravati da su korektni.
Primjer: Ako ulazna datoteka sadrži
5
1.1.1.
2.2.2.
13.1.2010.
1.1.1.
6.6.666.
onda izlazna treba biti
2;1.1.1.
1;2.2.2.
1;6.6.666.
1;13.1.2010.[/quote]
U originalnom zadatku bila je uputa da se rijesi s dinamicki alociranim poljem struct-ova. Moje rjesenje je s vezanom listom u koju se datumi ubacuju "na pravo mjesto", tako da se izbjegne sortiranje. Evo koda skrpanog pred malobrojnom, ali vjernom publikom u 003. Zahvaljujem Dori i ostalima na pomoci pri ispravljanju pogresaka :naklon:
[code:1]#include <stdio.h>
#include <stdlib.h>
typedef struct { int d; int m; int g;} datum;
struct list { datum t; int br; struct list *next; };
void ispisd(datum t, FILE *out)
{ fprintf(out,"%d.%d.%d.\n",t.d,t.m,t.g);
}
void ispisl(struct list *e, FILE *out)
{ if (e==NULL) return ;
fprintf(out,"%d;",e->br);
ispisd(e->t,out);
ispisl(e->next,out);
return ;
}
int usporedi(datum a, datum b)
{ if (a.g!=b.g) return b.g-a.g;
if (a.m!=b.m) return b.m-a.m;
return b.d-a.d;
}
int main()
{ FILE *in, *out;
int n,i,j;
char s[256];
datum a;
struct list *head=NULL, *c, *d;
in = fopen("datumi.in","r");
out = fopen("datumi.out","w");
fgets(s,256,in);
sscanf(s,"%d",&n);
for (i=0; i<n; ++i)
{ fgets(s,256,in);
sscanf(s,"%d",&a.d);
j=0;
while (s[j]!='.') ++j;
++j;
sscanf(&s[j],"%d",&a.m);
while (s[j]!='.') ++j;
++j;
sscanf(&s[j],"%d",&a.g);
if (head==NULL || usporedi(a,head->t)>0)
{ c = (struct list *)malloc(sizeof(struct list));
c->t = a;
c->br = 1;
c->next = head;
head = c;
}
else
{ c = head;
while (c!=NULL)
{ if (usporedi(a,c->t)==0)
{ (c->br)++;
c=NULL;
}
else
{ if (c->next==NULL || usporedi(a,c->next->t)>0)
{ d = (struct list *)malloc(sizeof(struct list));
d->t = a;
d->br = 1;
d->next = c->next;
c->next = d;
c = NULL;
}
else c = c->next;
}
} }
}
ispisl(head,out);
fclose(in);
fclose(out);
return 0;
}
[/code:1]
Na zadnjem predavanju 2013./14. pripremali smo se za kolokvij rjesavajuci zadnji zadatak iz aplikacije za zadace. Rjesenje ilustrira strukture, vezane liste i datoteke, dakle tocno gradivo koje ulazi u drugi kolokvij. Evo teksta zadatka:
Citat: | Zadana je datoteka "datumi.in" u kojoj se u prvoj liniji nalazi prirodni broj n, a u idućih n redaka zapisani su datumi u formatu
d.m.g.
(po jedan u svakom retku). Datume treba prepisati u datoteku "datumi.out" u formatu
koliko;d.m.g.
pri čemu je koliko broj pojavljivanja datuma u datoteci, a datumi trebaju biti sortirani od najstarijeg prema najnovijem.
Napomena: Datumi u ulaznoj datoteci bit će ispravni, tj. ne treba provjeravati da su korektni.
Primjer: Ako ulazna datoteka sadrži
5
1.1.1.
2.2.2.
13.1.2010.
1.1.1.
6.6.666.
onda izlazna treba biti
2;1.1.1.
1;2.2.2.
1;6.6.666.
1;13.1.2010. |
U originalnom zadatku bila je uputa da se rijesi s dinamicki alociranim poljem struct-ova. Moje rjesenje je s vezanom listom u koju se datumi ubacuju "na pravo mjesto", tako da se izbjegne sortiranje. Evo koda skrpanog pred malobrojnom, ali vjernom publikom u 003. Zahvaljujem Dori i ostalima na pomoci pri ispravljanju pogresaka
Kod: | #include <stdio.h>
#include <stdlib.h>
typedef struct { int d; int m; int g;} datum;
struct list { datum t; int br; struct list *next; };
void ispisd(datum t, FILE *out)
{ fprintf(out,"%d.%d.%d.\n",t.d,t.m,t.g);
}
void ispisl(struct list *e, FILE *out)
{ if (e==NULL) return ;
fprintf(out,"%d;",e->br);
ispisd(e->t,out);
ispisl(e->next,out);
return ;
}
int usporedi(datum a, datum b)
{ if (a.g!=b.g) return b.g-a.g;
if (a.m!=b.m) return b.m-a.m;
return b.d-a.d;
}
int main()
{ FILE *in, *out;
int n,i,j;
char s[256];
datum a;
struct list *head=NULL, *c, *d;
in = fopen("datumi.in","r");
out = fopen("datumi.out","w");
fgets(s,256,in);
sscanf(s,"%d",&n);
for (i=0; i<n; ++i)
{ fgets(s,256,in);
sscanf(s,"%d",&a.d);
j=0;
while (s[j]!='.') ++j;
++j;
sscanf(&s[j],"%d",&a.m);
while (s[j]!='.') ++j;
++j;
sscanf(&s[j],"%d",&a.g);
if (head==NULL || usporedi(a,head->t)>0)
{ c = (struct list *)malloc(sizeof(struct list));
c->t = a;
c->br = 1;
c->next = head;
head = c;
}
else
{ c = head;
while (c!=NULL)
{ if (usporedi(a,c->t)==0)
{ (c->br)++;
c=NULL;
}
else
{ if (c->next==NULL || usporedi(a,c->next->t)>0)
{ d = (struct list *)malloc(sizeof(struct list));
d->t = a;
d->br = 1;
d->next = c->next;
c->next = d;
c = NULL;
}
else c = c->next;
}
} }
}
ispisl(head,out);
fclose(in);
fclose(out);
return 0;
}
|
_________________ Vedran Krcadinac
Ljudi su razliciti, a nula je paran broj.
|