ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2023
Просмотров: 17
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство образования и науки Российской Федерации
Санкт-Петербургский политехнический университет Петра Великого
Институт компьютерных наук и технологий
Высшая школа киберфизических систем и управления
Отчёт по лабораторной работе №6
По курсу: Теория и технология программирования
Тема: Структуры
Работа выполнена 12.12.2022
Группа 3532704/20001
Студент: ____________ А. М. Полетаев
Работа принята
Доцент _________________________________________________________ В. М. Филиповский
Санкт-Петербург
2022
Задание
Выполнить задание из Приложения П 9, используя массив структур в качестве хранилища информации. Файлы с необходимой информацией создать самостоятельно.
Разработка главной программы (main)
Блок-схема
Имя | Назначение | Тип | Вид | Ограничение |
n | Количество учеников | Целое | Локальная | --- |
num[100] | Сведения об учениках | Структура | Локальная | --- |
Код главной программы на языке C
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include "struct.h"
#include "input.h"
#include "usp.h"
#include "remove.h"
#include "sort.h"
#include "export.h"
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
int n;
struct student num[100];
n = input(&num[0]);
usp(&num[0], n);
n = remov(&num[0], n);
sort(&num[0], n);
export(&num[0], n);
return 0;
}
Помимо главного, создаются заголовочные файлы “struct.h”, “input.h”, “usp.h”, “remove.h”, “sort.h”, “export.h”, в которых объявляется структура:
struct student
{
unsigned char surname[20];
char name[20];
int year;
char letter;
int oc[6];
int k;
double usp;
};
А также функции:
int input(struct student* num), void usp(struct student* num, int n), int remov(struct student *num, int n), void sort(struct student* num, int n), void export(struct student* num, int n).
Разработка функции «input» - считывание структуры num из файла, возвращение кол-ва учеников:
int input(struct student* num)
Блок-схема функции «input»
Структура данных
Имя | Назначение | Вид | Тип | Ограничение |
num | Указатель на 1-й элемент массива структур | Выходная | Структура | --- |
input | Указатель на структуру типа FILE | Входная | Целая | --- |
n | Номер ученика | Возвращаемая | Целая | --- |
s[10] | Строка, для считывания оценок | Локальная | Символьная | --- |
i | Индекс элемента строки s | Локальная | Целая | i < 10 |
j | Индекс элемента массива oc | Локальная | Целая | --- |
Код функции на языке C
int input(struct student* num)
{
FILE* input;
input = fopen("input.txt", "r");
int n = 0;
char s[10];
do
{
fscanf(input, "%s %s %d %s ", &(num + n)->surname, &(num + n)->name, &(num + n)->year, &(num + n)->letter);
fgets(&s, 10, input);
int i = 0, j = 0;
while (s[i] != '\n')
{
if (s[i] != ' ')
{
(num + n)->oc[j] = (int)s[i] - ((int)'0');
j++;
}
i++;
}
(num + n)->k = j;
n++;
}while (!feof(input));
fclose(input);
return n - 1;
}
Разработка функции «usp» - подсчет успеваемости учеников num и внесение её в массив структур student num.
void usp(struct student* num, int n)
Блок-схема
Структура данных
Имя | Назначение | Тип | Вид | Ограничение |
num | Указатель на 1-й элемент массива структур | Структура | Выходная | --- |
year[3] | Массив лет обучения | Целая | Локальная | --- |
letter[3] | Массив букв класса | Символьная | Локальная | --- |
sred[3][3] | Двумерный массив средней классовой успеваемости | Вещественная | Локальная | --- |
k[3][3] | Двумерный массив количества учеников в классе | Целая | Локальная | --- |
y | Индекс для элементов массива year | Целая | Локальная | y < 3 |
l | Индекс для элементов массива letter | Целая | Локальная | l < 3 |
i | Индекс для элементов массива структур num | Целая | Локальная | i < n |
j | Индекс элементов массива oc структуры num | Целая | Локальная | j < (num+i)->k |
sr | Подсчет среднеклассового значения успеваемости | Вещественная | Локальная | --- |
Код функции на языке С
void usp(struct student* num, int n)
{
int year[3] = { 9, 10, 11 };
char letter[3] = { 'А', 'Б', 'В'};
double sred[3][3];
int k[3][3];
for (int y = 0; y < 3; y++)
{
for (int l = 0; l < 3; l++)
{
k[y][l] = 0;
sred[y][l] = 0;
}
}
for (int i = 0; i < n; i++)
{
for (int y = 0; y < 3; y++)
{
for (int l = 0; l < 3; l++)
{
if ((year[y] == (num + i)->year) && (letter[l]) == (num + i)->letter)
{
double sr = 0;
for (int j = 0; j < (num + i)->k; j++)
{
sr += (num + i)->oc[j];
}
sred[y][l] += sr / (num + i)->k;
k[y][l] += 1;
}
}
}
}
for (int i = 0; i < n; i++)
{
for (int y = 0; y < 3; y++)
{
for (int l = 0; l < 3; l++)
{
if ((year[y] == (num + i)->year) && (letter[l]) == (num + i)->letter) (num + i)->usp = (sred[y][l] / k[y][l]);
}
}
}
}
Разработка функции «remov» - создание списка num только из отличников и хорошистов, чья фамилия начинается на заданную последовательность букв.
int remov(struct student *num, int n)
Блок-схема
Структура данных
Имя | Назначение | Тип | Вид | Ограничение |
num | Указатель на 1-й элемент массива структур | Структура | Выходная | --- |
n | Количество учеников | Целое | Входная | --- |
s[20] | Считываемая строка | Символьная | Локальная | --- |
flag | Проверка на совпадение | Целое | Локальная | --- |
i | Индекс элемента массива структур | Целое | Локальная | i < n |
j | Индекс элемента строки surname структуры num | Целое | Локальная | j < len |
len | Длина введенной строки | Целое | Локальная | --- |
min | Поиск минимальной оценки ученика | Целое | Локальная | --- |
f | Индекс элемента массива oc структуры num | Целое | Локальная | f < (num+i)->k |
k | Количество отличников и хорошистов | Целое | Локальная, возвращаемая | --- |
Код функции на языке C
int remov(struct student *num, int n)
{
unsigned char s[20];
int flag;
int k = 0;
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < n; i++)
{
flag = 1;
for (int j = 0; j < len; j++)
{
if ((num + i)->surname[j] != s[j]) flag = 0;
}
if (flag == 1)
{
int min = 5;
for (int f = 0; f < (num + i)->k; f++)
{
if (min > (num + i)->oc[f]) min = (num + i)->oc[f];
}
if (min > 3)
{
*(num + k) = *(num + i);
k++;
}
}
}
return k;
}
Разработка функции «sort» - сортировка полученного массива структур num сначала по успеваемости класса, а потом по алфавиту (фамилия, имя).
void sort(struct student* num, int n)
Блок-схема
Структура данных
Имя | Назначение | Тип | Вид | Ограничение |
num | Указатель на 1-й элемент массива структур | Структура | Выходная | --- |
n | Количество учеников | Целая | Входная | --- |
tmp | Структура типа student для замены элементов | Структура | Локальная | --- |
e | Маленькая величина для сравнения элементов типа double | Вещественная | Локальная | --- |
i | Индекс элемента массива структур | Целая | Локальная | --- |
j | Индекс элемента массива структур | Целая | Локальная | --- |
l | Левая граница сортировки | Целая | Локальная | --- |
r | Правая граница сортировки | Целая | Локальная | --- |
k | Индекс элемента массива структур | Целая | Локальная | k < n |
s | Индекс элемента строки surname структуры num | Целая | Локальная | --- |
a | Индекс элемента строки name структуры num | Целая | Локальная | --- |
Код функции на языке C
void sort(struct student* num, int n)
{
struct student tmp;
double e = 0.000001;
for (int i = 1; i < n; i++)
{
for (int j = 0; j < n - i; j++)
{
if ((num + j)->usp < (num + j + 1)->usp - e)
{
tmp = *(num + j);
*(num + j) = *(num + j + 1);
*(num + j + 1) = tmp;
}
}
}
int l = 0, r = n;
for (int k = 0; k < n; k++)
{
if (abs((num + k)->usp - (num + k + 1)->usp) > e)
{
r = k + 1;
for (int i = l + 1; i < r; i++)
{
for (int j = l; j < l + r - i; j++)
{
if (strcmp((num + j)->surname,(num + j + 1)->surname) == 0)
{
int a = 0;
while ((num + j)->name[a] == (num + j + 1)->name[a]) a++;
if ((int)(num + j)->name[a] > (int)(num + j + 1)->name[a])
{
tmp = *(num + j);
*(num + j) = *(num + j + 1);
*(num + j + 1) = tmp;
}
}
else
{
int s = 0;
while ((num + j)->surname[s] == (num + j + 1)->surname[s]) s++;
if ((int)(num + j)->surname[s] > (int)(num + j + 1)->surname[s])
{
tmp = *(num + j);
*(num + j) = *(num + j + 1);
*(num + j + 1) = tmp;
}
}
}
}
l = r;
}
}
}
Разработка функции «export» - вывод элементов массива структур num в консоль.
void export(struct student* num, int n)
Блок-схема
Структура данных
Имя | Назначение | Тип | Вид | Ограничение |
num | Указатель на 1-й элемент массива структур | Структура | Входная | --- |
n | Количество учеников | Целая | Входная | --- |
i | Индекс элемента массива структур num | Целая | Локальная | i < n |
j | Индекс элемента массива oc структуры num | Целая | Локальная | j < (num + i)->k |
Код функции на языке C
void export(struct student* num, int n)
{
for (int i = 0; i < n; i++)
{
printf("%s %s %d%c ", (num + i)->surname, (num + i)->name, (num + i)->year, (num + i)->letter);
for (int j = 0; j < (num + i)->k; j++)
{
printf(" %d", (num + i)->oc[j]);
}
printf(" %f\n", (num + i)->usp);
}
}
Результаты работы
Заключение
В ходе выполнения задания была написана программа для создания списка отличников и хорошистов из входного файла, а также их сортировка по средней успеваемости класса и, при совпадении показателей, алфавиту (фамилия -> имя). Программа представляет собой совокупность 5 вспомогательных функций и главную программу вызова этих функций:
-
Функция задания списка (input) -
Функция нахождения средней успеваемости (usp) -
Функция задания списка отличников и хорошистов (remove) -
Функция сортировки (sort) -
Функция вывода списка в консоль (export)
Программа была протестирована на 3-х случаях.
Пример выполнения программы подтверждает правильность её работы.