Upis u sledeću godinu

Autor zadatka: Olja Anđelovski <andjelovski.olja@uns.ac.rs>

Iz zadate ulazne datoteke učitati podatke u jednostruko spregnutu listu.

Struktura student se sastoji od sledećih polja:

  • broj indeksa studenta (jedna reč, do 10 karaktera)

  • ime studenta (jedna reč, do 15 karaktera)

  • prezime studenta (jedna reč, do 15 karaktera)

  • ocena iz 1. predmeta (pozitivna, celobrojna vrednost)

  • ocena iz 2. predmeta (pozitivna, celobrojna vrednost)

  • ocena iz 3. predmeta (pozitivna, celobrojna vrednost)

  • ocena iz 4. predmeta (pozitivna, celobrojna vrednost)

  • ocena iz 5. predmeta (pozitivna, celobrojna vrednost)

Takođe, struktura student sadrži i polja potrebna za pravilno formiranje jednostruko spregnute liste.

Preko argumenata komandne linije uneti naziv ulazne datoteke i naziv izlazne datoteke.

U izlaznu datoteku ispisati sve studente koji su stekli uslov za prelazak u sledeću godinu. Da bi prešao u sledeću godinu student mora da položi minimalno 4 od 5 predmeta. Predmet je položen ako je ocena veća od 5. Takođe, u izlaznu datoteku ispisati da li je student koji je prešao u sledeću godinu na budžetu ili samofinansiranju, da bi bio na budžetu, student mora da položi sve predmete.

Obratiti pažnju na odgovarajuće rukovanje greškama pri radu sa datotekama (ne ispisivati ništa u datoteku niti standardni izlaz):

  • Ako nije moguće otvoriti ulaznu datoteku: izaći iz programa sa exit(1)

  • Ako nije moguće otvoriti izlaznu datoteku: izaći iz programa sa exit(2)

Primer poziva programa:

./a.out studenti.txt polozili.txt

Zadati ulaz u datoteci studenti.txt:

RA163-2020 Ivan Ivanovic 7 8 9 5 8
RA167-2020 Jovica Matic 5 6 9 5 6
RA123-2020 Luka Lukovic 8 8 9 9 7
RA99-2020 Olivera Milic 9 8 9 8 9
RA105-2020 Milica Kovacevic 6 6 6 5 6
RA190-2020 Teodora Vukovic 7 7 9 8 8
RA110-2020 Kosta Glisic 6 8 7 5 7
RA90-2020 Vuk Vulic 7 9 8 10 9

Izgled izlazne datoteke polozili.txt:

RA163-2020 Ivan Ivanovic 7 8 9 5 8, samofinansiranje
RA123-2020 Luka Lukovic 8 8 9 9 7, budzet
RA99-2020 Olivera Milic 9 8 9 8 9, budzet
RA105-2020 Milica Kovacevic 6 6 6 5 6, samofinansiranje
RA190-2020 Teodora Vukovic 7 7 9 8 8, budzet
RA110-2020 Kosta Glisic 6 8 7 5 7, samofinansiranje
RA90-2020 Vuk Vulic 7 9 8 10 9, budzet

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_INDEX 11
  6#define MAX_IME_PREZIME 16
  7
  8typedef struct student{
  9    char index[MAX_INDEX];
 10    char ime[MAX_IME_PREZIME];
 11    char prezime[MAX_IME_PREZIME];
 12    unsigned o1;
 13    unsigned o2;
 14    unsigned o3;
 15    unsigned o4;
 16    unsigned o5;
 17    struct student *sledeci;
 18} STUDENT;
 19
 20void inicijalizacija(STUDENT **);
 21STUDENT *napraviCvor(char *, char *, char *, unsigned, unsigned, unsigned, unsigned, unsigned);
 22FILE *safeFopen(char *, char *, int);
 23void ucitajStavke(FILE *, STUDENT **);
 24void dodajNaKraj(STUDENT **, STUDENT *);
 25void izracunaj(FILE *, STUDENT *);
 26void obrisiListu(STUDENT **);
 27
 28int main(int argc, char **argv) {
 29    STUDENT *glava;
 30
 31    if(argc != 3) {
 32        printf("Primer poziva: %s studenti.txt polozili.txt\n", argv[0]);
 33        exit(EXIT_FAILURE);
 34    }
 35
 36    inicijalizacija(&glava);
 37    
 38    FILE *in = safeFopen(argv[1], "r", 1);
 39    ucitajStavke(in, &glava);
 40    fclose(in);
 41  
 42    FILE *out = safeFopen(argv[2], "w", 2);
 43    
 44    izracunaj(out, glava);
 45    
 46    fclose(out);
 47    obrisiListu(&glava);
 48  
 49    return EXIT_SUCCESS;
 50   
 51}
 52
 53FILE *safeFopen(char *name, char *mode, int errorCode) {
 54    FILE *fp = fopen(name, mode);
 55
 56    if(fp == NULL) {
 57        printf("Greska prilikom otvaranja fajla %s!\n", name);
 58        exit(errorCode);
 59    }
 60
 61    return fp;
 62}
 63
 64void ucitajStavke(FILE *in, STUDENT **glava) {
 65   	char index[MAX_INDEX];
 66    char ime[MAX_IME_PREZIME];
 67    char prezime[MAX_IME_PREZIME];
 68    unsigned o1;
 69    unsigned o2;
 70    unsigned o3;
 71    unsigned o4;
 72    unsigned o5;
 73    STUDENT *novi;
 74
 75    while(fscanf(in, "%s %s %s %u %u %u %u %u",
 76                 index, ime, prezime, &o1, &o2, &o3, &o4, &o5)
 77    != EOF) {
 78        novi = napraviCvor(
 79                   index, ime, prezime, o1, o2, o3, o4, o5);
 80        dodajNaKraj(glava, novi);
 81    }
 82}
 83
 84void izracunaj(FILE *out, STUDENT *glava) {
 85    STUDENT *tekuci = glava;
 86    int brojPolozenih;
 87    while(tekuci != NULL) {
 88    	brojPolozenih = 0;
 89    	if(tekuci->o1 > 5){
 90    		brojPolozenih++;
 91		}
 92		if(tekuci->o2 > 5){
 93    		brojPolozenih++;
 94		}
 95		if(tekuci->o3 > 5){
 96    		brojPolozenih++;
 97		}
 98		if(tekuci->o4 > 5){
 99    		brojPolozenih++;
100		}
101		if(tekuci->o5 > 5){
102    		brojPolozenih++;
103		}
104		
105		if(brojPolozenih == 5){
106			fprintf(out, "%s %s %s %u %u %u %u %u, budzet\n", tekuci->index, tekuci->ime, tekuci->prezime, tekuci->o1, tekuci->o2, tekuci->o3, tekuci->o4, tekuci->o5);
107		}
108		else if(brojPolozenih == 4){
109			fprintf(out, "%s %s %s %u %u %u %u %u, samofinansiranje\n", tekuci->index, tekuci->ime, tekuci->prezime, tekuci->o1, tekuci->o2, tekuci->o3, tekuci->o4, tekuci->o5);
110		}
111    	
112        tekuci = tekuci->sledeci;
113    }
114}
115
116void inicijalizacija(STUDENT **glava) {
117    *glava = NULL;
118}
119
120STUDENT *napraviCvor(char *index, char *ime, char *prezime, unsigned o1, unsigned o2, unsigned o3, unsigned o4, unsigned o5) {
121    STUDENT *novi = (STUDENT *)malloc(sizeof(STUDENT));
122
123    if(novi == NULL) {
124        printf("Nije moguce zauzeti memoriju!\n");
125        exit(EXIT_FAILURE);
126    }
127   
128    strcpy(novi->index, index);
129    strcpy(novi->ime, ime);
130    strcpy(novi->prezime, prezime);
131    novi->o1 = o1;
132    novi->o2 = o2;
133    novi->o3 = o3;
134    novi->o4 = o4;
135    novi->o5 = o5;
136    novi->sledeci = NULL;
137
138    return novi;
139}
140
141void dodajNaKraj(STUDENT **glava, STUDENT *novi) {
142	if(*glava == NULL) {
143 		*glava = novi;
144 	} else {
145 	
146 		STUDENT *tekuci = *glava;
147 		while(tekuci->sledeci != NULL) {
148 			tekuci = tekuci->sledeci;
149 		}
150 		tekuci->sledeci = novi;
151 	}
152}
153
154void obrisiListu(STUDENT **glava) {
155    STUDENT *tmp;
156
157    while(*glava != NULL) {
158        tmp = *glava;
159        *glava = (*glava)->sledeci;
160        tmp->sledeci = NULL;
161        free(tmp);
162    }
163}