Skip to content

Instantly share code, notes, and snippets.

@Lerbytech
Last active March 21, 2018 22:59
Show Gist options
  • Save Lerbytech/ea58a8274fa4688e53d14d6e391172fd to your computer and use it in GitHub Desktop.
Save Lerbytech/ea58a8274fa4688e53d14d6e391172fd to your computer and use it in GitHub Desktop.
Опорная задача по структурам
2
Ivan fnbic 7101 3
matanec -1
dolgopa 8
muzika 3
Petr fnbic 7102 1
pivovarenie 10
#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;
}
@Lerbytech
Copy link
Author

Lerbytech commented Mar 13, 2018

Опорная задача по структурам.
Даны структура Student и Marks

  1. считать из входящего файла данные в массив указателей
  2. вывести на экран
  3. вывести в файл.

Всю теорию смотрите здесь (вся 6 глава): https://metanit.com/cpp/c/6.1.php

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment