Файл: Курсовая работа по дисциплине Программирование Тема Студент Преподаватель.docx

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

Категория: Курсовая работа

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

Добавлен: 08.11.2023

Просмотров: 17

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра КТИ


Курсовая РАБОТА

по дисциплине «Программирование»

Тема:


Студент







Преподаватель









Санкт-Петербург

ЗАДАНИЕ

на курсовую работу


Студент

Группа

Тема работы:


Исходные данные:

1) студент потока характеризуется следующими данными:

- ФИО (до 50 символов);

- номер группы;

- набор из пяти оценок за последнюю сессию (без указания предметов);

- размер стипендии.

Необходимо:

1) разработать (и программно реализовать) динамические структуры данных и алгоритмы их обработки, позволяющие поддерживать выполнение следующих функций:

- консольный ввод/вывод данных о всех студентах потока;

- файловый ввод/вывод данных о потоке;

- редактирование данных о студентах и группах потока, включающее операции добавления/удаления групп и студентов;



Содержание пояснительной записки:

«Титульный лист», «Описание задания», «Алгоритм и программы решения задачи», «Описание процесса тестирование и полученных результатов», «Список использованной литературы», «Полный текст программы»








Дата сдачи реферата:

Дата защиты реферата:

Аннотация
В курсовой работе требовалось создать программу с определенными свойствами и задачами. Программа поддерживает ввод и вывод с помощью файлов и консоли. База данных имеет структуру «Связный линейный список».

содержание





Введение

6

1.

Алгоритм решения задачи

7

2.

Примеры работы

8

2.1.

Примеры работы

9

2.2.

Примеры работы

10













Список использованных источников

11




Код программы

12






























введение


Алгорит решения задачи
Используется структура данных «Связный список», для этого создается структура Node, каждый узел будет содержать информацию студентов из структуры Student, такие как: ФИО, номер группы, 5 оценок, размер стипендии.

Далее создается массив groups в которых будут содержаться указатели на номера групп студентов.

Реализованы функции addStudent (позволяет пользователю вести информацию о студенте и добавляет его в связный список) и printStudents (выводит в консоль информацию о всех студентах обычным перебором все группы и узлы списка).

Функция saveToFile сохраняет информацию о студентах в текстовый файл “Students.txt”. Функция loadFromFile загружает информацию о студентах из файла и создает узлы связного списка.

Функция addGroup создает пустую группу.

Функция deleteGroup позволяет удалить указанную группу со студентами.

printGroup выводит информацию о студентах в указанной группе.

С помощью функции editStudent пользователь может изменить информацию о студенте. Для этого потребуется ввести ФИО студента.

Последняя функция IDZ. Она вычисляет количество студентов в каждой группе, у которых нет ни одной оценки 2 и большинство оценок пятерки.

В функции main реализован цикл, который предлагает пользователю выбрать функцию которая будет вызываться.

Примеры работы
Изначальный текстовый документ “Students”.



Был добавлен студент Misha. При вызове функции printStudents выводилась информация только о нем. Далее была вызвана функция loadfromFile. Теперь вывелась информация о всех студентах потока.



Далее выведены в консоль количество студентов у которых нет двоек, и большинство оценок – пятерки. Дальше была удалена группа 2391 и выведены оставшиеся студенты. Эти студенты были сохранены обратно в файл.



Оставшиеся студенты, которые были сохранены в файл.

список использованных источников

stackoverflow.com

cyberforum.ru

learnc.info

habr.com

geeksforgeeks.org

Код программы

#include

#include
using namespace std;
struct Student

{

char FIO[50];

int group;

int grades[5];

int scholarship;

};
struct Node

{

Student data;

Node* next;

Node* prev;

};
const int MAX_GROUPS = 9999;

Node* groups[MAX_GROUPS] = { NULL };

Node* head = NULL;

Node* tail = NULL;
void addStudent() //создание нового студента и добавление его в группу

{

Student newStudent;
cin.ignore();

cout << "Enter student's FIO: ";

cin.getline(newStudent.FIO, 50);
cout << "Enter student's group: ";

cin >> newStudent.group;
cout << "Enter student's grades: ";

for (int i = 0; i < 5; i++)

{

cin >> newStudent.grades[i];

}
cout << "Enter student's scholarship: ";

cin >> newStudent.scholarship;
Node* newNode = new Node;

newNode->data = newStudent;

newNode->next = NULL;

newNode->prev = NULL;
if (groups[newStudent.group] == NULL) //если группы еще нет

{

groups[newStudent.group] = newNode;

}

else //группа есть, добавление

{

Node* current = groups[newStudent.group];

while (current->next != NULL)

{

current = current->next;

}
current->next = newNode;

newNode->prev = current;

}
cout << "Student added successfully." << endl;

}
void printStudents() //вывод информации о всех студентах перебирая все группы и узлы

{

for (int i = 0; i < MAX_GROUPS; i++)

{

Node* current = groups[i];

while (current != NULL)

{
cout << "FIO: " << current->data.FIO << endl;

cout << "Group: " << current->data.group << endl;

cout << "Grades: ";

for (int j = 0; j < 5; j++)

{

cout << current->data.grades[j] << " ";

}

cout << endl;

cout << "scholarship: " << current->data.scholarship << endl;

cout << endl;
current = current->next;

}

}

}
void saveToFile() //сохраняет информацию о студентах в файл

{

ofstream outputFile("Students.txt", ios::out);
if (outputFile.is_open())

{

for (int i = 0; i < MAX_GROUPS; i++)

{

Node* current = groups[i];
while (current != NULL)

{

outputFile << "FIO: " << current->data.FIO << endl;

outputFile << "Group: " << current->data.group << endl;

outputFile << "Grades: ";

for (int j = 0; j < 5; j++)

{

outputFile << current->data.grades[j] << " ";

}

outputFile << endl;

outputFile << "scholarship: " << current->data.scholarship << endl;
outputFile << endl;
current = current->next;

}

}
outputFile.close();

}

else

{

cout << "Failed to open the file." << endl;

}

}
void loadFromFile() //загрузка информацию о студентах и создает узлы списка

{

ifstream inputFile("Students.txt");
if (inputFile.is_open())

{

char line[100];
while (inputFile.getline(line, 100))

{

if (strstr(line, "FIO: ") != NULL) //проверка на вхождение подстроки "FIO: " в строку

{

Student newStudent;

strcpy_s(newStudent.FIO, line + 5); //копирование строки с 5 символа
inputFile.getline(line, 100);

newStudent.group = atoi(line + 7); //пробразование строки в число и присвоение
inputFile.getline(line, 100);

for (int i = 0; i < 5; i++)

{

newStudent.grades[i] = atoi(line + 8 + i * 2);

}
inputFile.getline(line, 100);

newStudent.scholarship = atoi(line + 13);
Node* newNode = new Node;

newNode->data = newStudent;

newNode->next = NULL;

newNode->prev = NULL;
if (groups[newStudent.group] == NULL)

{

groups[newStudent.group] = newNode;

head = newNode;

tail = newNode;

}

else

{

Node* current = groups[newStudent.group];

while (current->next != NULL)

{

current = current->next;

}
current->next = newNode;

newNode->prev = current;

tail = newNode;

}

}

}
inputFile.close();

}

else

{

cout << "Failed to open the file." << endl;

}

}
void addGroup() //добавление пустой группы

{

int group;

cout << "Enter the group number to create: ";

cin >> group;
if (group >= 0 && group < MAX_GROUPS) //проверка числа

{

if (groups[group] == NULL)

{

groups[group] = new Node;

groups[group]->data.group = group;

groups[group]->next = NULL;

groups[group]->prev = NULL;

cout << "Group " << group << " created." << endl;

}

else

{

cout << "Group " << group << " already exists." << endl;

}

}

else

{

cout << "Invalid group number." << endl;

}

}
void deleteGroup() //удаление группы и студентов которые в ней находятся

{

int group;

cout << "Enter the group to delete: ";

cin >> group;
if (group >= 0 && group < MAX_GROUPS) //проверка числа

{

Node* current = groups[group];

while (current != NULL) //удаление по списку

{

Node* nextNode = current->next;

delete current;

current = nextNode;

}

groups[group] = NULL; //присвоение группе NULL

cout << "Group " << group << " have been deleted." << endl;

}

else

{

cout << "Invalid group number." << endl;

}

}
void printGroup() //вывод всех студентов выбранной группы

{

int group;

cout << "Enter the group number to print: ";

cin >> group;
if (group >= 0 && group < MAX_GROUPS)

{

Node* current = groups[group];
if (current == NULL)

{

cout << "Group " << group << " is empty." << endl;

}

else

{

while (current != NULL) //прохождение по всем узлам группы

{

cout << "FIO: " << current->data.FIO << endl;

cout << "Group: " << current->data.group << endl;

cout << "Grades: ";

for (int j = 0; j < 5; j++)

{

cout << current->data.grades[j] << " ";

}

cout << endl;

cout << "scholarship: " << current->data.scholarship << endl;

cout << endl;
current = current->next;

}

}

}

else

{

cout << "Invalid group number." << endl;

}

}
void editStudent() //изменение информации о выбранном студенте

{

char searchFIO[50];

cout << "Enter the FIO of the student to edit: ";

cin.ignore();

cin.getline(searchFIO, 50);
Node* current = head;

bool studentFound = false;

while (current != NULL)

{

if (strcmp(current->data.FIO, searchFIO) == 0) //функция сравнивает две строки

{

studentFound = true;

break;

}

current = current->next;

}
if (!studentFound)

{

cout << "Student " << searchFIO << " not found!" << endl;

return;

}
cout << "Enter the new data:" << endl;
cout << "Enter student's FIO: ";

cin.getline(current->data.FIO, 50);
cout << "Enter student's group: ";

cin >> current->data.group;
cout << "Enter student's grades: ";

for (int i = 0; i < 5; i++)

{

cin >> current->data.grades[i];

}
cout << "Enter student's scholarship: ";

cin >> current->data.scholarship;

}
void IDZ()

{

bool groupFound = false;
for (int i = 0; i < MAX_GROUPS; i++) //прохождение по группам

{

Node* current = groups[i];

int count = 0;
while (current != NULL)

{

bool hasTwo = false;

int countFives = 0;
for (int j = 0; j < 5; j++)

{

if (current->data.grades[j] == 2) //если есть хотя бы одна 2 то break

{

hasTwo = true;

break;

}

else if (current->data.grades[j] == 5)

{

countFives++;

}

}
if (!hasTwo && countFives >= 3) //нет двоек и больше или 3 пятерки

{

count++;

}
current = current->next;

}
if (count > 0)

{

groupFound = true;

cout << "Group " << i << ": " << count << endl;

}

}
if (!groupFound)

{

cout << "No groups with such students found." << endl;

}

}
int main()

{

while (true)

{

cout << "1 - add student, 2 - print all students, 3 - save to file, 4 - load from file, 5 - remove group, 6 - edit student, 7 - print group, 8 - add group, 9 - IDZ 0 - exit" << endl;

int choice;

cin >> choice;
switch (choice)

{

case 0:

return 0;
case 1:

addStudent();

break;
case 2:

printStudents();

break;
case 3:

saveToFile();

break;
case 4:

loadFromFile();

break;
case 5:

deleteGroup();

break;
case 6:

editStudent();

break;
case 7:

printGroup();

break;

case 8:

addGroup();

break;
case 9:

IDZ();

break;
default:

cout << "Invalid choice" << endl;

break;

}

}

return 0;

}