ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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 вспомогательных функций и главную программу вызова этих функций:

  1. Функция задания списка (input)

  2. Функция нахождения средней успеваемости (usp)

  3. Функция задания списка отличников и хорошистов (remove)

  4. Функция сортировки (sort)

  5. Функция вывода списка в консоль (export)

Программа была протестирована на 3-х случаях.

Пример выполнения программы подтверждает правильность её работы.