Last active
March 21, 2018 22:59
-
-
Save Lerbytech/ea58a8274fa4688e53d14d6e391172fd to your computer and use it in GitHub Desktop.
Опорная задача по структурам
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 | |
Ivan fnbic 7101 3 | |
matanec -1 | |
dolgopa 8 | |
muzika 3 | |
Petr fnbic 7102 1 | |
pivovarenie 10 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <conio.h> | |
typedef struct Marks | |
{ | |
char subject_name[10]; | |
int mark; | |
} MARKS; | |
typedef struct Stud | |
{ | |
char Name[80]; | |
char faculty[10]; | |
int group_id; | |
int num_of_subjects; | |
MARKS *subjects; | |
} STUD; | |
void PrintOnScreen(STUD* Arr, int N) | |
{ | |
printf("PrintOnScreen func \n"); | |
int i = 0; | |
MARKS* m; | |
STUD* cur; | |
for (cur = Arr; cur < Arr + N; cur++) | |
{ | |
printf("Student #%d \n", i); | |
printf(" name> %s\n", cur->Name); | |
printf(" faculty> %s\n", cur->faculty); | |
printf(" group_id> %d\n", cur->group_id); | |
for (m =cur->subjects; m < cur->subjects + cur->num_of_subjects; m++) | |
{ | |
printf("subject_name> %s\n", m->subject_name); | |
printf(" mark> %d\n", m->mark); | |
} | |
printf("----------------------------\n"); | |
i++; | |
} | |
} | |
void WriteToFile(struct Stud* Arr, int N, char* filename) | |
{ | |
printf("WriteToFile func \n"); | |
FILE *fp; | |
fp = fopen(filename, "w"); | |
fprintf(fp, "%d\n", N); | |
// Ivan fnbic 7101 3 | |
// matanec -1 dolgopa 8 muzika 3 | |
MARKS* m; | |
STUD* cur; | |
for (cur = Arr; cur < Arr + N; cur++) | |
{ | |
fprintf(fp, "%s %s %d %d\n", cur->Name, cur->faculty, cur->group_id, cur->num_of_subjects); | |
for (m = cur->subjects; m < cur->subjects + cur->num_of_subjects; m++) | |
fprintf(fp, "%s %d\n", m->subject_name, m->mark); | |
} | |
fclose(fp); | |
} | |
STUD *ReadFromFile(int *N, char *filename) | |
{ | |
//Открытие и чтение файлов | |
FILE* fp; | |
fp = fopen(filename, "r"); | |
if (fp == NULL) | |
{ | |
printf("ERROR: Problems with input.txt"); | |
return 0; | |
} | |
// | |
char line[256]; // массив для хранения строчки | |
// нужно считать первую строчку из файла. в ней хранится кол-во студентов | |
fgets(line, sizeof(line), fp); | |
if (line[strlen(line) - 1] == '\n') | |
line[strlen(line) - 1] = '\0'; // нужен слеш-ноль чтобы atoi отработал | |
*N = atoi(line); // так как переменнаяф N - входящий параметр переданный по ссылке, то увеличим её значение через звездочку. | |
// И вообще - посмотрите на тип в объявлении функции | |
// выделим под массив Arr сколько нужно | |
STUD *Arr = (STUD*)calloc(sizeof(STUD), *N); | |
//---- | |
int stud_shift = 0; // счетчик по студентам | |
MARKS *s = NULL; // счетчик по предметам | |
STUD *curStud; // указатель на текущего студента, чисто для удобства работы и лаконичности | |
char *word = NULL; | |
while (fgets(line, sizeof(line), fp)) | |
{ | |
curStud = Arr + stud_shift; // переключаемся на нужного студентам и заполняем поля | |
strcpy(curStud->Name, strtok(line, " ")); //имя | |
strcpy(curStud->faculty, strtok(NULL, " ")); //факультет | |
//номер группы | |
word = strtok(NULL, " "); | |
curStud->group_id = atoi(word); | |
//число предметов | |
word = strtok(NULL, " "); | |
curStud->num_of_subjects = atoi(word); | |
// отсюда и дальше - у нас Х=curStud->num_of_subjects строк, описывающих предмет. | |
// каждая строка содержит название предмета и балл по нему. | |
// мы считаем несколько строк и каждую разобъем на слова, заполнив поля структуры | |
// такой подход универсален чтобы использовать его и в других заданиях | |
// зная число предметов, выделим память под массив предметов | |
curStud->subjects = (MARKS*)malloc(sizeof(MARKS) * curStud->num_of_subjects); | |
// по циклу пройдемся по массиву | |
for (s = curStud->subjects; s < curStud->subjects + curStud->num_of_subjects; s++) | |
{ | |
fgets(line, sizeof(line), fp); | |
// обязательно нужная строчка. Нужно удалить символ переноса строки, иначе позже он может оказаться в тех словах, что вы вытаскиваете из строки | |
if (line[strlen(line) - 1] == '\n') | |
line[strlen(line) - 1] = '\0'; | |
strcpy(s->subject_name, strtok(line, " ")); //возьмем название предмета | |
//и оценку по нему | |
word = strtok(NULL, " "); | |
s->mark = atoi(word); | |
} | |
stud_shift++; // закончили работу с строкой, сместим увеличим счетчик студентов и продолжим работу | |
} | |
fclose(fp); // не забываем закрыть файл | |
return Arr; // возвращаем | |
} | |
int main(void) | |
{ | |
int menu; | |
STUD *Arr = NULL; | |
int N = 0; | |
int trigger = 1; | |
while (trigger) | |
{ | |
printf("\n"); | |
printf("------------------------------\n"); | |
printf(" MENU\n"); | |
printf(" 1 - Load Students From File\n"); | |
printf(" 2 - Print to screen\n"); | |
printf(" 3 - Export to File\n"); | |
printf(" 4 - Exit\n"); | |
printf("------------------------------\n"); | |
scanf("%d", &menu); | |
switch (menu) | |
{ | |
case 1: { | |
Arr = ReadFromFile(&N, "input.txt"); | |
printf("Found %d students \n", N); | |
getchar(); | |
break; | |
} | |
case 2: PrintOnScreen(Arr, N); break; | |
case 3: WriteToFile(Arr, N, "output.txt"); break; | |
case 0: trigger = 0; return 0; | |
default: continue; | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Опорная задача по структурам.
Даны структура Student и Marks
Всю теорию смотрите здесь (вся 6 глава): https://metanit.com/cpp/c/6.1.php