-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Лабораторная работа №5.
Тема: Сборка C-проектов с использованием GNU Make, Meson и CMake
Постановка задачи
- Проект 1: Разработать консольное приложение для работы с файлами и структурами данных. Программа должна читать данные из текстового файла (например, список студентов с оценками), загружать их в структуру (например, массив структур
Student), выполнять базовую обработку (сортировку, вычисление среднего значения) и сохранять результаты в новый файл.
Проект 1
Список идентификаторов
| Имя переменной | Тип данных | Описание |
|---|---|---|
students |
Student[] |
Массив структур Student |
count |
int |
Количество студентов в массиве |
filename |
const char* |
Имя файла для чтения/записи |
average |
double |
Средний балл студента |
Код программы
Файл data.h
#ifndef DATA_H
#define DATA_H
#include <stdio.h>
typedef struct {
char name[50];
int scores[5];
double average;
} Student;
int loadStudents(const char *filename, Student *arr, size_t max);
void sortByAverage(Student *arr, size_t count);
void saveReport(const char *filename, Student *arr, size_t count);
#endifФайл data.c
#include "data.h"
#include <string.h>
#include <stdlib.h>
int loadStudents(const char *filename, Student *arr, size_t max) {
FILE *f = fopen(filename, "r");
if (!f) return -1;
size_t count = 0;
while (count < max && fscanf(f, "%49[^,],%d,%d,%d,%d,%d\n",
arr[count].name,
&arr[count].scores[0], &arr[count].scores[1],
&arr[count].scores[2], &arr[count].scores[3],
&arr[count].scores[4]) == 6) {
int sum = 0;
for (int i = 0; i < 5; ++i) sum += arr[count].scores[i];
arr[count].average = sum / 5.0;
count++;
}
fclose(f);
return count;
}
void sortByAverage(Student *arr, size_t count) {
for (size_t i = 0; i < count; ++i) {
for (size_t j = 0; j < count - i - 1; ++j) {
if (arr[j].average < arr[j + 1].average) {
Student tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void saveReport(const char *filename, Student *arr, size_t count) {
FILE *f = fopen(filename, "w");
if (!f) return;
fprintf(f, "Name,Average\n");
for (size_t i = 0; i < count; ++i) {
fprintf(f, "%s,%.2f\n", arr[i].name, arr[i].average);
}
fclose(f);
}Файл main.c
#include "data.h"
#include <stdio.h>
#define MAX_STUDENTS 100
int main(int argc, char *argv[]) {
if (argc < 3) {
fprintf(stderr, "Usage: %s <input_file> <output_file>\n", argv[0]);
return 1;
}
Student students[MAX_STUDENTS];
int count = loadStudents(argv[1], students, MAX_STUDENTS);
if (count < 0) {
perror("Error opening input file");
return 1;
}
sortByAverage(students, count);
saveReport(argv[2], students, count);
printf("Processed %d students. Report saved to %s\n", count, argv[2]);
return 0;
}Файл Makefile
CC := gcc
CFLAGS := -Wall -Wextra -std=c11 -02
LDLIBS := -lm
SRC := main.c data.c
OBJ := $(SRC:.c=.o)
TARGET := proj1
all: $(TARGET)
$(TARGET): $(OBJ)
$(CC) $(LDFLAGS) $(OBJ) -o $@ $(LDLIBS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJ) $(TARGET)Результаты работы программы
Пример вывода программы:
Processed 3 students. Report saved to output.csv
Содержимое файла output.csv:
Name,Average
Alice,85.00
Bob,78.00
Charlie,92.00
Информация о студенте
Киселев Георгий, 1 курс, группа ИВТ-1.1
Metadata
Metadata
Assignees
Labels
No labels