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}