/** * File: hw1.c * Author: Rainer Liis * Created: 14.02.2018 * Last edit: 08.03.2018 * * Description: programm, mis loeb sisse ühest failist tudengite andmed * ja teisest ainete andmed ja prindib uude faili eksamipileti. */ #include <stdio.h> // print and scan #include <stdlib.h> // exit #include <string.h> // stringi operatsioonid #include <unistd.h> // faili olemasolu kontroll #include "struktuurid.h" // struktuurid #include "function.h" // universaalsed funktsioonid // loeb sisse tudengi failist F1 void tudengidSisse (Student *tudeng_massiiv, int T); // loeb sisse ained failist F2 void ainedSisse (Subject *aine_massiiv, int A); // seob andmed omavahel kolmandasse massiivi void yhildus (Subject *aine_massiiv, Student *tudeng_massiiv, Pilet *pileti_liige, int A, int T, char choice); // sorterib andmed int sortimine (Pilet *pileti_liige, int A, char choice); // väljastab tulemused faili ja ekraanile void eksamileht (Pilet *pileti_liige, int A, int ainete_hulk); int main (void) { int T = howManyLines ("F1.txt"); // tudengite massiivi suurus int A = howManyLines ("F2.txt"); // ainete massiivi suurus Student tudeng_massiiv[T]; // massiiv tudengite hoidmiseks Subject aine_massiiv[A]; // massiiv ainete hoiustamiseks Pilet pileti_liige[T+A]; // muutuja ainete ja tudengite ühildamiseks int ainete_hulk; // loeb ära mitu erinevat ainet on char choice; // hoiab kasutaja valikut // küsib kasutajalt, kas iga funktsioon prindib oma tulemuse ekraanile printf ("Print all or silent?[p/s]:"); do { choice = getchar (); } while (choice != 'p' && choice != 's'); tudengidSisse (tudeng_massiiv, T); ainedSisse (aine_massiiv, A); yhildus (aine_massiiv, tudeng_massiiv, pileti_liige, A, T, choice); ainete_hulk = sortimine (pileti_liige, A, choice); eksamileht (pileti_liige, A, ainete_hulk); return 0; } void tudengidSisse (Student *tudeng_massiiv, int T) { int i = 0; FILE *tudengid; tudengid = fopen ("F1.txt", "r"); // avab faili tudengid // loeb sisse kogu info failist F1.txt while (fscanf (tudengid, "%s %s %s", tudeng_massiiv[i].eesnimi, tudeng_massiiv[i].perenimi, tudeng_massiiv[i].matrikkel) != EOF) { i++; } fclose (tudengid); // sulgeb faili // väljastab sisse loetud info ekraanile printf ("tudengidSisse tulemus:\n"); for (i = 0; i < T; i++) { printf ("%s, %s, %s\n", tudeng_massiiv[i].eesnimi, tudeng_massiiv[i].perenimi, tudeng_massiiv[i].matrikkel); } printf (" \n"); } void ainedSisse (Subject *aine_massiiv, int A) { int i = 0; FILE *ained; ained = fopen ("F2.txt", "r"); // avab faili andmed // loeb sisse kogu info failist F2.txt while (fscanf (ained, "%s %s %s %d", aine_massiiv[i].nimi, aine_massiiv[i].kood, aine_massiiv[i].matrikkel, &aine_massiiv[i].tulemus) != EOF) { i++; } fclose (ained); // väljastab sisse loetud info ekraanile printf ("ainedSisse tulemus:\n"); for (i = 0; i < A; i++) { printf ("%s, %s, %s, %d\n", aine_massiiv[i].nimi, aine_massiiv[i].kood, aine_massiiv[i].matrikkel, aine_massiiv[i].tulemus); } printf (" \n"); } void yhildus (Subject *aine_massiiv, Student *tudeng_massiiv, Pilet *pileti_liige, int A, int T, char choice) { int i, j; int k = 0; for (i = 0; i < A; i++) { for (j = 0; j < T; j++) { // võrdleb kahe massiivi liikmeid ja kui mõlema matrikkel on võrdne, seob nad kokku kolmandas massiivis if ( strcmp (aine_massiiv[i].matrikkel, tudeng_massiiv[j].matrikkel) == 0) { strcpy (pileti_liige[k].aineNimi, aine_massiiv[i].nimi); strcpy (pileti_liige[k].perenimi, tudeng_massiiv[j].perenimi); strcpy (pileti_liige[k].eesnimi, tudeng_massiiv[j].eesnimi); strcpy (pileti_liige[k].matrikkel, tudeng_massiiv[j].matrikkel); pileti_liige[k].tulemus = aine_massiiv[i].tulemus; k++; } } } // kui kasutaja sisestatud täht oli 'p', väljastab tulemuse ekraanile if (choice == 'p') { printf ("yhildus tulemus:\n"); for (i = 0; i < k; i++) { printf ("%s, %s, %s, %s, %d\n", pileti_liige[i].aineNimi, pileti_liige[i].perenimi, pileti_liige[i].eesnimi, pileti_liige[i].matrikkel, pileti_liige[i].tulemus); } printf (" \n"); } } int sortimine (Pilet *pileti_liige, int A, char choice) { Pilet temp; int i, j; int ainete_hulk = 0; // mullisort, järjestab iga aine siseselt tudengid tähestiku alusel for (i = 0; i < A; i++) { for (j = 0; j < A; j++) { if (strcmp (pileti_liige[j-1].aineNimi, pileti_liige[j].aineNimi) == 0) { if (strcmp (pileti_liige[j-1].perenimi, pileti_liige[j].perenimi) > 0) { temp = pileti_liige[j-1]; pileti_liige[j-1] = pileti_liige[j]; pileti_liige[j] = temp; } } } } // loeb ära mitu erinevat ainet on for (i = 0; i < A; i++) { if (strcmp (pileti_liige[i-1].aineNimi, pileti_liige[i].aineNimi) != 0) { ainete_hulk++; } } // kui kasutaja sisestatud täht on 'p' väljastab tulemuse ekraanile if (choice == 'p') { printf ("sortimine tulemus:\n"); printf ("aineid kokku: %d\n", ainete_hulk); for (i = 0; i < A; i++) { printf ("%s, %s, %s, %s, %d\n", pileti_liige[i].aineNimi, pileti_liige[i].perenimi, pileti_liige[i].eesnimi, pileti_liige[i].matrikkel, pileti_liige[i].tulemus); } printf (" \n"); } return ainete_hulk; } void eksamileht (Pilet *pileti_liige, int A, int ainete_hulk) { int i; int j = 0; Pilet ainete_loend[ainete_hulk]; FILE *output; // faili pointer // loob ainete nimekirja for (i = 0; i < A; i++) { if (strcmp (pileti_liige[i-1].aineNimi, pileti_liige[i].aineNimi) != 0) { strcpy (ainete_loend[j].aineNimi, pileti_liige[i].aineNimi); j++; } } /* kontrollib, kas vastava aine nimeline fail on olemas, * kui ei ole, loob selle */ for (i = 0; i < ainete_hulk; i++) { if (access (ainete_loend[i].aineNimi, F_OK) != 0) { output = fopen (ainete_loend[i].aineNimi, "w"); fclose (output); } } /* pindib iga aine nimelisse faili vastavad tulemused * koos õpilaste andmetega */ for (i = 0; i < ainete_hulk; i++) { output = fopen (ainete_loend[i].aineNimi, "a"); for (j = 0; j < A; j++) { if (strcmp (ainete_loend[i].aineNimi, pileti_liige[j].aineNimi) == 0) { fprintf (output, "%s %s %s %d\n", pileti_liige[j].perenimi, pileti_liige[j].eesnimi, pileti_liige[j].matrikkel, pileti_liige[j].tulemus); printf ("Faili nimega %s prinditi: %s %s %s %d\n", pileti_liige[j].aineNimi, pileti_liige[j].perenimi, pileti_liige[j].eesnimi, pileti_liige[j].matrikkel, pileti_liige[j].tulemus); } } fclose (output); } }