Zadnji zadatak iz aplikacije za zadaće
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Programiranje 1 i 2

#1: Zadnji zadatak iz aplikacije za zadaće Autor/ica: krcko PostPostano: 15:47 čet, 12. 6. 2014
    —
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 Zahvaljujem, postovani kolega!

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;
}



Forum@DeGiorgi -> Programiranje 1 i 2


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin