Файл: Курсовая работа по дисциплине Программирование Тема Студент Преподаватель.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;
}