Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 04
diff options
context:
space:
mode:
2 files changed, 156 insertions, 0 deletions
-rw-r--r--Sem. 04/README.md0
-rw-r--r--Sem. 04/uni_task(not finished).cpp156
diff --git a/Sem. 04/README.md b/Sem. 04/README.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Sem. 04/README.md
diff --git a/Sem. 04/uni_task(not finished).cpp b/Sem. 04/uni_task(not finished).cpp
new file mode 100644
index 0000000..bd15a2b
--- /dev/null
+++ b/Sem. 04/uni_task(not finished).cpp
@@ -0,0 +1,156 @@
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+
+struct Student
+{
+ char* name;
+ int fn;
+ int gradesCount;
+ double averageGrade;
+};
+void print(const Student& st)
+{
+ cout << st.name << " " << st.fn << " " << st.gradesCount << " " << st.averageGrade << endl;
+}
+Student CreateStudent(const char* name, int fn, int gradesCount, double avGrade)
+{
+ Student obj;
+
+ size_t nameLen = strlen(name);
+
+ obj.name = new char[nameLen + 1];
+ strcpy(obj.name, name);
+
+ obj.fn = fn;
+ obj.gradesCount = gradesCount;
+ obj.averageGrade = avGrade;
+
+ return obj;
+}
+void saveStudentToFile(ofstream& f, const Student& st)
+{
+ size_t nameLen = strlen(st.name);
+ f.write((const char*)&nameLen, sizeof(nameLen));
+ f.write(st.name, nameLen);
+ f.write((const char*)&st.fn, sizeof(st.fn));
+ f.write((const char*)&st.gradesCount, sizeof(st.gradesCount));
+ f.write((const char*)&st.averageGrade, sizeof(st.averageGrade));
+
+}
+Student readStudentFromFile(ifstream& f)
+{
+ Student res;
+
+ size_t nameLen;
+
+ f.read((char *)&nameLen, sizeof(nameLen));
+
+ res.name = new char[nameLen + 1];
+ f.read(res.name, nameLen);
+ res.name[nameLen] = '\0';
+
+ f.read((char *)&res.fn, sizeof(res.fn));
+ f.read((char*)&res.gradesCount, sizeof(res.gradesCount));
+ f.read((char*)&res.averageGrade, sizeof(res.averageGrade));
+
+ return res;
+}
+void freeStudent(Student& s)
+{
+ delete[] s.name;
+
+ s.averageGrade = s.fn = s.gradesCount = 0;
+
+}
+
+const int UNI_NAME_MAX = 32;
+struct Uni
+{
+ char name[UNI_NAME_MAX];
+ size_t studentsCount;
+ Student* students;
+};
+
+void saveUniToFile(ofstream& f, const Uni& uni)
+{
+
+ f.write(uni.name, sizeof(uni.name));
+ f.write((const char*)&uni.studentsCount, sizeof(uni.studentsCount));
+
+ for (int i = 0; i < uni.studentsCount; i++)
+ saveStudentToFile(f, uni.students[i]);
+}
+
+void readUniFromFile(ifstream& f, Uni& uni)
+{
+ f.read(uni.name, sizeof(uni.name));
+ f.read((char*) &uni.studentsCount, sizeof(uni.studentsCount));
+
+ uni.students = new Student[uni.studentsCount];
+
+ for (int i = 0; i < uni.studentsCount; i++)
+ uni.students[i] = readStudentFromFile(f);
+}
+void freeUni(Uni& uni)
+{
+ for (int i = 0; i < uni.studentsCount; i++)
+ freeStudent(uni.students[i]);
+ strcpy(uni.name, "");
+ uni.studentsCount = 0;
+}
+void print(const Uni& u)
+{
+ cout << u.name << " " << u.studentsCount << endl;
+ for (int i = 0; i < u.studentsCount; i++)
+ print(u.students[i]);
+}
+int main()
+{
+ { //Creating an university and saving to file
+ Uni u;
+ strcpy(u.name, "FMI");
+ u.studentsCount = 3;
+
+ u.students = new Student[u.studentsCount];
+ u.students[0] = CreateStudent("Ivan", 81234, 3, 4.5);
+ u.students[1] = CreateStudent("Angel", 12345, 4, 5);
+ u.students[2] = CreateStudent("Mariq", 81234, 5, 5.5);
+
+
+ ofstream f("uni.dat", ios::binary);
+
+ if (!f.is_open())
+ {
+ cout << "Error" << endl;
+ return -1;
+ }
+
+ saveUniToFile(f, u);
+ freeUni(u);
+ }
+
+ { //Reading an university from file
+
+ Uni myUni;
+ ifstream f("uni.dat", ios::binary);
+
+ if (!f.is_open())
+ {
+ cout << "Error" << endl;
+ return -1;
+ }
+
+ readUniFromFile(f, myUni);
+
+ print(myUni);
+
+ f.close();
+
+ freeUni(myUni);
+
+ }
+}
+ \ No newline at end of file