[ fanfare @ 15.09.2009. 19:28 ] @
Počeo sam da pišem kod za sledeći zadatak,ali ono najbitnije ne znam da uradim tj. da sortiram elemente neke datoteke.Pokušao sam nešto sa strukturama ali neide.Može li neko da mi pomogne.
Ovo je moj pokušaj:

Code:
/*Pretpostavimo da su u nesortiranoj datoteci upisani rezultati nekog ispita, u svakom redu
su podaci o uspijehu jednog studenta u obliku:     PREZIME  IME  BODOVI
Napisati program koji sortira takvu datoteku(prvi argument komandne linije) u opadajućem
redosljedu po broju bodova i rezultat sortiranja upisuje u drugu datoteku(drugi argument
komandne linije).U svaki red treba upisati: RB.  PREZIME  IME  BODOVI
gdje RB predstavlja redni broj.Svi studenti sa istim brojem bodova dijele isto mjesto.
Npr.  1. Markovic  Marko  100
      1. Jankovic  Janko  100
      3. Nikolic   Janko   90
Rezultat treba ispisati i na standardnom izlazu. */

#include <stdio.h>
#include <stdlib.h>
main()
{
    FILE *ul,*izl;
    struct osoba {
                  char prezime[15];
                  char ime[15];
                  int  rb;
                  int  bodovi[3];
                 }student;
    char imedat[100];
    int i=1,j;
    student.rb=0;
    if( (  ul=fopen("D:/zad 5.txt","r") )!= NULL)
    {
        printf("Ime datoteke u koju upisujemo je:\t");
        scanf("%s",imedat);
        if( ( izl=fopen(imedat,"w") )!=NULL)
        {
            while(!feof(ul))
            {
                fscanf(ul,"%s  %s  %s",student.prezime,student.ime,student.bodovi);
                student.rb=student.rb+1;
                fprintf(izl,"%d.  %s   %s   %s\n",student.rb,student.prezime,student.ime,student.bodovi);
            }
        fclose(izl);
        }
        else
          printf("greska pri otvaranju dat. za upisivanje\n");
        fclose(ul);
    }
    else
      printf("greska pri otvaranju dat. za citanje\n",imedat);
    system("pause");
}



[ Mihajlo Cvetanović @ 15.09.2009. 22:16 ] @
Postojeći kod učitava sve studente u jedan isti objekat. U svakoj iteraciji prethodni student se briše jer je preko njega prepisan novi student. Moraš da imaš nekakav kontejner (ili klasični niz, ili listu). Sa nizom je lakše, ali lista omogućava proizvoljno veliki broj elemenata. Recimo da moraš da imaš nekakav niz pointera na strukture osoba:

osoba *niz[1000];

Nadam se da se ovako piše, ne znam te stvari napamet nego se oslanjam na kompajler. Ti, pošto učiš C, moraš to da znaš. Dalje, kad učitavaš podatke moraš da imaš objekat stvoren dinamički (to se u C-u valjda radi sa malloc, i to sam zaboravio, jbg, ja radim u C++). Učitane podatke onda upišeš u novostvoreni objekat, a objekat ukačiš na sledeće slobodno mesto u nizu. Tokom učitavanja inkrementiraš i veličinu niza n.

Kad radiš sortiranje lepo radiš klasično sortiranje niza (u dvostrukoj petlji), ali ne porediš vrednosti niza (koji su jelte pointeri), nego polje "bodovi", na koje pointeri ukazuju:

Code:

for (i = 0; i < n - 1; i++)
  for (j = i + 1; j < n; j++)
    if (niz[i]->bodovi < niz[j]->bodovi) /* sortiramo po opadajucem nizu, zato je < */
    {
      temp = niz[i];
      niz[i] = niz[j];
      niz[j] = temp;
    }


Polje "rb" u strukturi je višak, a evo i zašto. Sad kad treba da ispišeš sortirane studente to radiš u petlji [i=0,n-1]. Dok ih ispituješ vodiš evidenciju o dva podatka: poslednji ispisan broj bodova, i njegov redni broj. Ako je novi broj bodova različit od ovog trenutnog onda rb=i. To onda lepo ispišeš, i zapamtiš novi broj bodova.

I to mu je to.