[ zbokanov @ 25.04.2005. 09:07 ] @
Treba mi pomoć da dovršim ovaj program (ucim za ispit) (Nedostaje sortiranje i ako unesem ocjenu od onog člana kojeg brišem pa nadalje sve mi se briše):

/*Program koji definira strukturu STUDENT sa članovima ime, prezime, broj indeksa, godina studija,datum izlaska na ispit, kolegij i ocjena. Podaci se smještaju u dinamički povezanu listu sortiranu po prezimenu studenta (i imenu ako je prezime isto). Program daje korisniku izbornik u kojem može odabrati: PRIJAVA ISPITA (unosi se broj indeksa i kolegij, ako takav element već postoji u listi korisnik se na to upozorava, a ako ne postoji unose se i ostali podaci i element smješta u listu)(unose se podaci osim ocjene), ODJAVA ISPITA (unosi se broj indeksa i kolegij, element pronalazi u listi i uklanja iz nje), OCJENA ISPITA (unosi se broj indeksa,
kolegij i ocjena, pronalazi element u listi, upisuje mu se ocjena, element se uklanja iz liste i svi podaci nadodaju u datoteku ispiti.txt), ISPIS SVIH PRIJAVA NA EKRAN (samo ime i prezime i kolegij) te IZLAZ IZ PROGRAMA. Nakon svake akcije korisniku se ponovo daje izbornik, sve dok ne odabere izlaz iz programa*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student
{
char ime[15];
char prezime[35];
int index;
int godina;
char datum[50];
char kolegij[50];
int ocjena;

struct Student *next;
}*student, *glava=NULL;

void Prijava();
void Odjava();
void Ocjena();
void Ispis();

void main()
{
int opcija;

do
{
printf("\nUnesi:\n1 za prijavu ispita\n2 za odjavu ispita\n3 za ocjenu ispita\n4 za ispis svih prijava na ekran\n5 za izlaz iz programa\n\n");
scanf ("%d", &opcija);

switch (opcija)
{
case 1:
Prijava();
break;
case 2:
Odjava();
break;
case 3:
Ocjena();
break;
case 4:
Ispis();
break;
case 5:
break;
default:
printf("\nPogresan unos\n");
break;
}
}while (opcija!=5);
}

void Prijava()
{
int index;
char kolegij[50];

printf("\nBroj indexa --> "); scanf("%d", &index);
printf("Kolegij --> "); scanf("%s", &kolegij);

student=glava;

while (student!=NULL)
{
if(student->index==index && strcmp(student->kolegij,kolegij)==0)
{
printf("\nVec postoji!\n");
return;
}
student = student->next;
}

student=(Student*)malloc(sizeof(Student));

student->index=index;
strcpy(student->kolegij,kolegij);
printf("Ime --> "); scanf("%s", &student->ime);
printf("Prezime --> "); scanf("%s", &student->prezime);
printf("Godina studija -->"); scanf("%d", &student->godina);
printf("Datum izlaska -->"); scanf("%s", &student->datum);

student->next=glava;
glava=student;
}
void Odjava()
{
int index;
char kolegij[50];

printf("\nIndex --> "); scanf("%d", &index);
printf("Kolegij --> "); scanf("%s", &kolegij);

student=glava;

while (student!=NULL)
{
if(student->index==index && strcmp(student->kolegij,kolegij)==0)
{
glava=student->next;
free(student);
printf("\nOdjavljen\n");
return;
}
student=student->next;
}
printf("\nNije pronadjen\n");
}

void Ocjena()
{
int index, ocjena;
char kolegij[50];

printf("\nIndex --> "); scanf("%d", &index);
printf("Kolegij --> "); scanf("%s", &kolegij);
printf("Ocjena --> "); scanf("%d", &ocjena);

student=glava;

while (student!=NULL)
{
if(student->index==index && strcmp(student->kolegij,kolegij)==0)
{
student->ocjena=ocjena;
FILE *dat = fopen("ispiti.txt", "a+");

fprintf(dat, "Ime --> %s \n", student->ime);
fprintf(dat, "Prezime --> %s \n", student->prezime);
fprintf(dat, "Index --> %d \n", student->index);
fprintf(dat, "Kolegij --> %s \n", student->kolegij);
fprintf(dat, "Godina --> %d \n", student->godina);
fprintf(dat, "Datum polaganja --> %s \n", student->datum);
fprintf(dat, "Ocjena --> %d \n", student->ocjena);
fprintf(dat, "===================================\n");
fclose(dat);
printf("\nUpisano u datoteku ispiti.txt");
glava=student->next;
free(student);
printf("\nIzbrisan iz liste!");
return;
}
student=student->next;
}
printf("\nNije pronadjen!");
}
void Ispis()
{
student=glava;

while(student!=NULL)
{
printf("Ime --> %s\n", student->ime);
printf("Prezime --> %s\n", student->prezime);
printf("Kolegij --> %s\n", student->kolegij);
printf("==============================\n");
student=student->next;
}
}

/*nema sortiranja i prekidanje liste prilikom brisanja ocjenjenog*/
[ Mihajlo Cvetanović @ 25.04.2005. 12:50 ] @
Citat:
...
printf("Kolegij -- "); scanf("%s", kolegij);
Ne treba kolegij, nego samo kolegij.
Citat:
...
student=(Student*)malloc(sizeof(Student));
Dobra navika je da uvek proveravas povratnu vrednost alokacije. Uvek.
Citat:
student-index=index;
strcpy(student-kolegij,kolegij);
Umesto strcpy bolje je strncpy sa duzinom sizeof(student-kolegij) - 1, i postavljanjem student-kolegij[sizeof(student-kolegij) - 1] na ''. Treba izbegavati strcpy kad god je moguce.
Citat:
...
void Odjava()
....
while (student!=NULL)
{
if(student-index==index strcmp(student-kolegij,kolegij)==0)
{
glava=student-next;
Glava je pocetak liste, ne bi trebalo da se menja, osim kod uklanjanja prvog elementa liste. Isto tako, nisi povezao preostale clanove liste. Pisem napamet, ali ovo bi trebalo ovako nekako (pisem u preformat stilu iz Thunderbirda, valjda ce ispasti u redu):
student = glava; student_prev = NULL; while ( student != NULL ) { if( student-index == index strcmp(student-kolegij,kolegij) == 0 ) { if ( student == glava ) glava = student-next; else { student_prev-next = student-next; } free(student); return; } else student_prev = student; } Isto vazi i kod ocenjivanja.

Nisam razumeo u kome smislu nema sortiranja, tako da to i ne komentarisem.
[ zbokanov @ 25.04.2005. 21:51 ] @
Iz zadatka: Podaci se smještaju u dinamički povezanu listu sortiranu po prezimenu studenta (i imenu ako je prezime isto)
To mi je najveći problem.
[ don_mathew @ 26.04.2005. 11:54 ] @
zbokanov sigurno studiras u mostaru na racunalstvu :P jer je zadatak identican lolchina btw ja sam to polozio davno i imam uradjene sve zadatke pa ti posaljem kad stignem...
[ xxxrugby @ 26.04.2005. 22:33 ] @
Znaci ima ti ovaj rjesene zadatke.

Al da kad saljes drugi put cod.

Daj kodiraj taj cod.

[CODE]
Ovaj code ide malim slovima!
[/CODE]
[ Mihajlo Cvetanović @ 27.04.2005. 08:24 ] @
[CODE]

int main(void)

{

printf("Hello Worldn"); // nadam se da ce da proradi

}

[/CODE]
[ george_w @ 27.04.2005. 18:47 ] @
Ovako:

1. Sortiranje se ne radi u klasicnom smislu sortiranja (bubble, quick...), nego se kod unosa svakog novog clana liste, trazi njegovo mjesto - npr., uneses podatke o studentu u neke lokalne, bezvezne varijable, onda krenes od prvog clana i provjeravas da li je ime, prezime ili sta vec manje od unesenog podatka. Ako nije, ides dalje. Valjda je princip jasan (kao kod pronalaska max ili min clana liste ili niza, svejedno).

2. Ne kontam u cemu je fol sa strcpy (kao da strcpy nije dobar)? Ipak su pocetnici u pitanju... Studenti i tako to...

3. Sto se tice pomjeranja glave, o tom nema ni govora. Tamo u kodu stoji: glava = student->next, a treba student = student->next (jer se upravo student provjerava u while petlji!). Glava se pomjera samo kod brisanja cijele liste (a i ne mora), ili kod brisanja clana na kojeg pokazuje glava. U tom zadnjem sliucaju kod izgleda ovako:

student = glava;
glava = glava->next;
free(student);

Eto.