Skip to content

Программирование_Лабораторная_работа_5 #6

@veskprogrammer

Description

@veskprogrammer

Лабораторная работа №5.


Тема: Сборка C-проектов с использованием GNU Make, Meson и CMake


Постановка задачи

  1. Проект 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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions