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. |
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; } |
output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.