Даны оценки N студентов, полученные ими на 4 экзаменах. Определить число студентов, не имеющих “двоек”, и средний экзаменационный балл каждого студента.
АНО ВО "Российский Новый Университет"
Институт Информационных систем и инженерно-компьютерных технологий
Курсовая работа
по дисциплине «Программирование»
на тему: «Даны оценки N студентов, полученные ими на 4 экзаменах. Определить число студентов, не имеющих “двоек”, и средний экзаменационный балл каждого студента.»
Выполнил студент 1-го курса
Озерков Максим Владимирович
Руководитель:
Москва, 2023
ВВЕДЕНИЕ
Целью курсовой работы является разработка оконного приложения для получения статистики результатов экзаменов студентов, получения информации о среднем экзаменационном балле и количестве студентов, не имеющих «двоек».
Актуальность темы обусловлена необходимость следить за успеваемость студентов в рамках учебного процесса. Информация об среднем экзаменационном балле может быть использована, например, при назначении стипендий. Кроме того, полученные в рамках работы навыки по разработки графического интерфейса и его реализации в виде оконного приложения очень важны, так как это требуется при разработке большинства приложений.
Задачи работы:
1. ПОСТАНОВКА ЗАДАЧИ
1.1 Задание
Даны оценки N студентов, полученные ими на 4 экзаменах. Определить число студентов, не имеющих «двоек», и средний экзаменационный балл каждого студента.
1.2 Описание предметной области
Оценивание на экзамене производится по шкале от 2 до 5. В рамках работы положим, что, если студент не появился на экзамене, ему выставляется оценка 2. Средний экзаменационный балл для каждого студента округляется до двух знаков. Количество студентов N должно быть целым положительным числом.
1.3 Функции программы
Программа в своей работе должна поддерживать следующие функции:
1.4 Входные данные
Входными данными для программы является текстовый файл, содержащий список студентов, состоящий из:
1.5 Выходные данные:
Выходными данных, состоит из списка студентов, состоящему из:
Предусматриваются следующие ограничения:
Количество студентов N – целое положительное число, значит N должно быть больше 0. Кроме того, число N должно совпадать с количеством студентов во входных данных.
Фамилия и имя студента должны состоять из одного слова.
Оценки студентов – это целые числа в диапазоне от 2 до 5. Их должно быть ровно 4 для каждого студента.
Программа должна быть реализована в виде оконного приложения в среде программирования Microsoft Visual Studio на языке C++.
2. РАЗРАБОТКА ПРИЛОЖЕНИЯ
2.1 Разработка структуры приложения
При разработке приложения использовался объектный подход. Были созданы два класса Student и Group. Их диаграмма представлена на Рисунке 2.1. Класс Group используется для работы с массивом объектов типа Sudent.
Рисунок 2.1 – Диаграмма классов Student и Group
Описание класса Student
Поля класса (имеют закрытый уровень доступа):
int Grade[4] – массив целых чисел размером 4 для хранения оценок студентов за экзамены.
std::string Surname – строка с фамилией студента.
std::string Name – строка с именем студента.
double AverageGrade – вещественное число, средняя оценка студента.
Методы класса:
Student() – конструктор по умолчанию.
Student(std::string sname, std::string name, int mark[4]) – конструктор с параметрами.
int GetGrade(int i) – функция возвращает оценку студента за i-й экзамен.
std::string GetSurname() – возвращает фамилию студента.
std::string GetName() – возвращает имя студента.
double GetAAverageGrade() – возвращает среднюю оценку студента.
bool HasGoodGrade() – функция возвращает true, если студент не имеет оценок 2, false – в противном случае.
void CalcAverage() – вычисляет среднюю оценку студента.
Описание класса Group
Поля класса (имеют закрытый уровень доступа):
int Size - целое число, размер массива Array.
Student* Array - указатель на массив объектов класса Student.
Методы класса:
Group(int s) - конструктор класса, в нем создается массив объектов Student размера s.
Student& operator [](int i) – индексатор.
void PutStudent(int i, Student& St, int &error) – функция помещает объект типа Student в массив на i позицию. Если i>Size, функция возвращает код ошибки error.
int CalcCountGoodGrade() – вычисляет количество студентов не имеющих "двоек".
void CalcAverageGrade() – вычисляет среднюю оценку для каждого студента в массиве.
int GetSize() – возвращает размер массива Array.
Student& GetStudent(int i) – возвращает i-элемент массива Array.
Кроме того, будет разработана и использована функция:
Group* ReadDataFromTxt(const char* file, int& error) – функция читает данные из файла с именем file. В случае успешного завершения возвращает указатель на объект класса Group, где хранятся данные всех студентов, загруженные из файла. Если возникла ошибка при выполнении функции, возвращается код ошибки в переменной error.
2.2 Разработка блок-схем алгоритмов
Ниже на Рисунке 2.2 – Рисунке 2.6 представлены блок-схемы основных методов программы.
Рисунок 2.2 – Блок-схема функции ReadDataFromTxt
Рисунок 2.3 Блок-схема метода CalcCountGoodGrade
Рисунок 2.4 – Блок-схема метода CalcAverageGrade
Рисунок 2.5 – Блок-схема метода CalcAverage
Рисунок 2.6 – Блок-схема метода HasGoodGrade
2.3 Разработка пользовательского интерфейса
Приложении предназначено, для преподавателей, работников деканата и других ответственных лиц, которым необходимо следить и получать информацию об статистикой результатов сдачи экзаменов студентов, их средними экзаменационными оценками и количеством студентов, сдавших экзамены без «двоек».
Функции пользователя:
В соответствии с функциями пользователя разработана форма приложения (Рисунок 2.7):
Рисунок 2.7 – Пользовательский интерфейс приложения
Компоненты формы:
button1 – кнопка «Загрузите данные из файла», при нажатии должно открываться диалоговое окно для выбора файла, вывод текста из выбранного файла в dataGridView1. Также для каждого входного файла должно очищаться текстовое поле textBox1.
button2 – кнопку «Посчитать среднюю оценку каждого студента», при нажатии должны выполняться вычисления средней оценки для каждого студента, вывод полученных значений в dataGridView1 в советующий столбец.
button3 – кнопка «Вычислить», при нажатии долж
button4 – кнопка «Инструкция», при нажатии должна показываться инструкция по использованию приложения;
label1 – надпись «Количество студентов без двоек», используется для пояснения к textBox1 и button3.
dataGridView1 – настраиваемая таблица для отображения данных, в которую выводятся список студентов и их оценок за каждый экзамен, а также средняя оценка для каждого студента.
Таблица содержит 6 столбцов:
textBox1 – текстовое поле для вывода количества студентов, не имеющих оценку 2 за экзамены.
groupBox1 – элемент управления, отображает рамку вокруг элементов label1, button3, textBox1.
groupBox2 – элемент управления, отображает рамку вокруг элементов button1, button2, button4.
Если пользователь нажмет на кнопку «Инструкция» должно выводится окно, содержащее инструкцию по формату данных во входном файле, как показано на Рисунке 2.8.
Рисунок 2.8 – Инструкция приложения по формату данных входного файла
3. РЕАЛИЗАЦИЯ И ТЕСТИРОВАНИЕ ПРОГРАММНОГО ПРИЛОЖЕНИЯ
3.1 Описание разработанной программы
Приложение разработано на языке программирования C++. Для реализации графического интерфейса пользователя использовалась библиотека «Windows Forms». Эта библиотека содержит графический конструктор для визуального конструирования формы (окна) приложения на основе, которого автоматически генерируется код формы. Программисту необходимо только добавить и определить логику для событийных обработчиков, в нашем случае, нажатие на кнопки «Инструкция», «Загрузить данные из файла», «Подсчитать среднюю оценку каждого студента» и «Вычислить», а также инициализация данных при начальной загрузке формы.
Работа приложения состоит из следующих этапов:
Полный листинг программы приведен в Приложении 1.
3.2 Тестирование программы
Тестирование программы проводилось по ГОСТ 19.301-79.
Объект испытаний – приложение для получения статистики результатов экзаменов студентов.
Цель испытаний – проверка работоспособности приложения.
Средство т испытаний – программа тестировалась на персональном компьютере с операционной системой Windows 10.
Методы испытаний – приложение тестировалась по методу хода и выхода в нормальных и исключительных условиях для различных наборов тестовых данных.
Порядок испытаний (ниже на Рисунках 3.1 – 3.24 приведены результаты тестирования):
На Рисунке 3.1 представлено начальное состояние окна при запуске приложения.
Рисунок 3.1 - Начальное состояние окна при запуске приложения
На Рисунке 3.2 показано состояние окна приложения после нажатии на кнопку «Инструкция».
Рисунок 3.2 - Вывод инструкции для пользователя при нажатии на кнопку «Инструкция»
Если до загрузки входных данных из файла пользователь нажмет на кнопки «Подсчитать среднюю оценку каждого студента» и «Вычислить», выводится сообщение об ошибке, как показано на Рисунке 3.3 – Рисунке 3.4.
Рисунок 3.3 – Вывод сообщения об ошибке при нажатии на кнопку «Подсчитать среднюю оценку каждого студента» до загрузки входных данных из файла
Рисунок 3.4 – Вывод сообщения об ошибке при нажатии на кнопку «Вычислить» до загрузки входных данных из файла
На Рисунке 3.5 показано состояние окна приложения после нажатия на кнопку «Загрузить данные из файла».
Рисунок 3.5 – Выбор файла для загрузки при нажатии на кнопку «Загрузить данные из файла»
Ввод некорректных данных (Рисунок 3.6 - Рисунок):
Рисунок 3.6 – Вывод сообщения об ошибке, если пользователь задал имя несуществующего файла
Рисунок 3.7 – Пример некорректных входных данных, количество студентов 0 или меньше -1
Рисунок 3.8 – Сообщение об ошибке, если количество студентов не положительное целое число
Рисунок 3.9 – Пример некорректных входных данных: число N меньше фактического количества студентов
Рисунок 3.10 – Сообщение об ошибке при некорректных входных данных: число N меньше фактического количества студентов
Рисунок 3.11 – Пример некорректных входных данных: у некоторых студентов оценки вне диапазона от 2 до 5
Рисунок 3.12 – Сообщение об ошибке при некорректных входных данных: у некоторых студентов оценки вне диапазона от 2 до 5
Рисунок 3.13 – Пример некорректных входных данных: встречается разделитель между полями отличный от «пробела»
Рисунок 3.14 – Сообщение об ошибке при некорректных входных данных: встречается разделитель между полями отличный от «пробела»
Рисунок 3.15 – Пример некорректных входных данных: есть оценки в виде вещественного числа
Рисунок 3.16 – Сообщение об ошибке при некорректных входных данных: есть оценки в виде вещественного числа
Рисунок 3.17 – Пример некорректных входных данных: для некоторых студентов отсутствуют данные об имени, оценках
Рисунок 3.18 – Сообщение об ошибке при некорректных входных данных: для некоторых студентов отсутствуют данные об имени, оценках
Рисунок 3.19 – Пример некорректных входных данных: у некоторых студентов больше, чем четыре оценки
Рисунок 3.20 – Сообщение об ошибке при некорректных входных данных: у некоторых студентов больше, чем четыре оценки
Ввод корректных данных:
Вводится список из десяти студентов (Рисунок 3.21) путем нажатия на кнопку «Загрузить данные из файла» (Рисунок 3.22). У каждого студента по 4 оценки в диапазоне от 2 до 5. После нажатия на кнопку «Подсчитать среднюю оценку каждого студента» для каждого студента вычисляется средняя оценка и результаты выводятся в столбце «Средняя оценка» таблицы (Рисунок 3.23). После нажатия на кнопку «Вычислить» вычисляется количество студентов не имеющих оценку 2 за экзамены. Результаты выводится в текстовое поле (Рисунок 3.24).
Рисунок 3.21 – Пример корректных входных данных
Рисунок 3.22 – Результат работы приложения при нажатии на кнопку «Загрузить данные из файла» при корректных входных данных (Рисунок 3.21)
Рисунок 3.23 – Результат работы приложения при нажатии на кнопку «Подсчитать среднюю оценку каждого студента» при корректных входных данных (Рисунок 3.21)
Рисунок 3.24 – Результат работы приложения при нажатии на кнопку «Вычислить» при корректных входных данных (Рисунок 3.21)
ЗАКЛЮЧЕНИЕ
В рамках работы было разработано оконное приложение для получения статистики результатов экзаменов студентов, получения информации о среднем экзаменационном балле и количестве студентов, не имеющих «двоек».
В приложении были реализованы все функции описанные в постановке задачи и соответствующий графический интерфейс. Проведено тестирование приложения на корректных и некорректных входных данных. Показано, что в случае некорректных входных данных пользователю выдается соответствующее сообщение об ошибке.
Были получены навыки разработки графического интерфейса и его реализация в виде оконного приложения на С++ в среде программирования Visual Studio/
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ 1. ЛИСТИНГ ПРИЛОЖЕНИЯ
Файл Student.h
#pragma once
#include <string>
class Student
{
public:
Student(std::string sname, std::string name, int mark[4]); //конструктор с параметрами
Student(); //конструктор по умолчанию
void CalcAverage(); //вычисляет среднюю оценку студента
bool HasGoodGrade(); //функция возвращает true, если студент не имеет оценок 2,
//false – в противном случае
double GetAAverageGrade(); ////возвращает среднюю оценку студента
std::string GetSurname(); //возвращает фамилию студента
std::string GetName(); //возвращает имя студента
int GetGrade(int i); // функция возвращает оценку студента за i-й экзамен
private:
int Grade[4]; //оценки студента за экзамены
std::string Surname; //фамилия студента
std::string Name; //имя студента
double AverageGrade; //средняя оценка студента
};
Файл Student.cpp
#include "Student.h"
//конструктор с параметрами
Student::Student(std::string sname, std::string name, int mark[4])
{
Surname = sname;
Name = name;
for (int i = 0; i < 4; i++)
{
Grade[i] = mark[i];
}
AverageGrade = 0;
}
//конструктор по умолчанию
Student::Student()
{
Surname = "нет значения";
Name = "нет значения";
for (int i = 0; i < 4; i++)
Grade[i] = 2;
AverageGrade = 0;
}
//вычисляет среднюю оценку студента
void Student::CalcAverage()
{
AverageGrade = 0;
for (int i = 0; i < 4; i++)
AverageGrade += Grade[i];
AverageGrade /= 4;
}
//функция возвращает true, если студент не имеет оценок 2,
//false – в противном случае
bool Student::HasGoodGrade()
{
for (int i = 0; i < 4; i++)
if (Grade[i] == 2)
return false;
return true;
}
//возвращает среднюю оценку студента
double Student::GetAAverageGrade()
{
return AverageGrade;
}
//возвращает фамилию студента
std::string Student::GetSurname()
{
return Surname;
}
//возвращает имя студента
std::string Student::GetName()
{
return Name;
}
//функция возвращает оценку студента за i-й экзамен
int Student::GetGrade(int i) { return Grade[i]; }
Файл Group.h
#pragma once
#include "Student.h"
class Group
{
public:
Group(int s); //конструктор класса
~Group(); //деструктор класса
Student& operator [](int i); //индексатор
//помещает объект типа Student в массив на i позицию.
//Если i>Size, возвращает код ошибки error
void PutStudent(int i, Student& St, int &error);
int CalcCountGoodGrade(); //вычисляет количество студентов не имеющих "двоек"
void CalcAverageGrade(); //вычисляет среднюю оценку для каждого студента в массиве
int GetSize(); // возвращает размер массива Array
Student& GetStudent(int i); // возвращает i-элемент массива Array
private:
int Size; //размер массива Array
Student* Array; //указатель на массив объектов класса Student
};
/* Функция читает данные из файла с именем file.
* В случае успешного завершения возвращает указатель на объект класса Group,
* где хранятся данные всех студентов из файла
* Если возникла ошибка при выполнения функции, возвращается код ошибки в error.
*/
Group* ReadDataFromTxt(const char* file, int& error);
Файл Group.cpp
#include "Group.h"
#include <fstream>
Group::Group(int s) //конструктор класса
{
Size = s;
Array = new Student[Size];
}
Group::~Group() //деструктор класса
{
delete[] Array;
}
Student& Group:: operator [](int i) //индексатор
{
return Array[i];
}
//помещает объект типа student в массив на i позицию.
//Если i>Size, возвращает код ошибки error
void Group::PutStudent(int i, Student& St, int&error)
{
if (i >= Size)
error = 3; //код ошибки
else
Array[i] = St;
}
//вычисляет количество студентов не имеющих "двоек"
int Group::CalcCountGoodGrade()
{
int k = 0;
for (int i = 0; i < Size; i++)
{
if (Array[i].HasGoodGrade())
k++;
}
return k;
}
//вычисляет среднюю оценку для каждого студента в массиве
void Group::CalcAverageGrade()
{
for (int i = 0; i < Size; i++)
Array[i].CalcAverage();
}
// возвращает размер массива Array
int Group::GetSize()
{
return Size;
}
// возвращает i-элемент массива Array
Student& Group::GetStudent(int i)
{
return Array[i];
}
/* Функция читает данные из файла с именем file.
* В случае успешного завершения возвращает указатель на объект класса Group,
* где хранятся данные всех студентов из файла
* Если возникла ошибка при выполнения функции, возвращается код ошибки в error.
*/
Group* ReadDataFromTxt(const char* file, int& error)
{
error = 0;
std::string surname, name;
int mark[4], N, k = 0;
std::ifstream in(file);
if (in.is_open())
{
in >> N;
if (N <= 0)
{
error = 2; //ошибка: некорректное значение N
return NULL;
}
else
{
Group* group = new Group(N);
while (!in.eof())
{
in >> surname >> name;
for (int i = 0; i < 4 && !in.fail(); i++) {
in >> mark[i];
if((mark[i]<2 || mark[i]>5) && !in.fail())
{
//ошибка: оценка вне диапозона [2;5]
error = 5;
return NULL;
}
}
if (in.fail()) //ошибка формата данных в файле
{
error = 4;
return NULL;
}
Student St(surname, name, mark);
group->PutStudent(k, St, error);
k++;
}
in.close();
return group;
}
}
else
{ //ошибка при открытии файла
error = 1;
return NULL;
}
}
Файл MyForm.h
pragma once
#include "Group.h"
#include <msclr/marshal_cppstd.h>
namespace Kursach {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
Group* group;
/// <summary>
/// Сводка для MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: добавьте код конструктора
//
}
protected:
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
protected:
private: System::Windows::Forms::DataGridViewTextBoxColumn^ Column1;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::OpenFileDialog^ openFileDialog1;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::DataGridView^ dataGridView1;
private: System::Windows::Forms::GroupBox^ groupBox1;
private: System::Windows::Forms::Button^ button3;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Button^ button4;
private: System::Windows::Forms::GroupBox^ groupBox2;
private:
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->button2 = (gcnew System::Windows::Forms::Button());
this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->dataGridView1 = (gcnew System::Windows::Forms::DataGridView());
this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
this->button3 = (gcnew System::Windows::Forms::Button());
this->label1 = (gcnew System::Windows::Forms::Label());
this->button4 = (gcnew System::Windows::Forms::Button());
this->groupBox2 = (gcnew System::Windows::Forms::GroupBox());
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->dataGridView1))->BeginInit();
this->groupBox1->SuspendLayout();
this->groupBox2->SuspendLayout();
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Drawing::Point(6, 10);
this->button1->Margin = System::Windows::Forms::Padding(4);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(246, 28);
this->button1->TabIndex = 1;
this->button1->Text = L"Загрузить данные из файла";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// button2
//
this->button2->Location = System::Drawing::Point(260, 10);
this->button2->Margin = System::Windows::Forms::Padding(4);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(360, 28);
this->button2->TabIndex = 2;
this->button2->Text = L"Посчитать среднюю оценку каждого студента";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &MyForm::button2_Click);
//
// openFileDialog1
//
this->openFileDialog1->FileName = L"openFileDialog1";
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(296, 28);
this->textBox1->Margin = System::Windows::Forms::Padding(4);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(132, 22);
this->textBox1->TabIndex = 3;
//
// dataGridView1
//
this->dataGridView1->AllowUserToAddRows = false;
this->dataGridView1->AllowUserToDeleteRows = false;
this->dataGridView1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize;
this->dataGridView1->Location = System::Drawing::Point(16, 68);
this->dataGridView1->Margin = System::Windows::Forms::Padding(4);
this->dataGridView1->Name = L"dataGridView1";
this->dataGridView1->ReadOnly = true;
this->dataGridView1->Size = System::Drawing::Size(768, 185);
this->dataGridView1->TabIndex = 4;
//
// groupBox1
//
this->groupBox1->Controls->Add(this->button3);
this->groupBox1->Controls->Add(this->label1);
this->groupBox1->Controls->Add(this->textBox1);
this->groupBox1->Location = System::Drawing::Point(68, 277);
this->groupBox1->Margin = System::Windows::Forms::Padding(4);
this->groupBox1->Name = L"groupBox1";
this->groupBox1->Padding = System::Windows::Forms::Padding(4);
this->groupBox1->Size = System::Drawing::Size(627, 123);
this->groupBox1->TabIndex = 5;
this->groupBox1->TabStop = false;
//
// button3
//
this->button3->Location = System::Drawing::Point(56, 64);
this->button3->Margin = System::Windows::Forms::Padding(4);
this->button3->Name = L"button3";
this->button3->Size = System::Drawing::Size(100, 28);
this->button3->TabIndex = 5;
this->button3->Text = L"Вычислить ";
this->button3->UseVisualStyleBackColor = true;
this->button3->Click += gcnew System::EventHandler(this, &MyForm::button3_Click);
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(52, 32);
this->label1->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(230, 16);
this->label1->TabIndex = 4;
this->label1->Text = L"Количество студентов без двоек ";
//
// button4
//
this->button4->Location = System::Drawing::Point(627, 10);
this->button4->Name = L"button4";
this->button4->Size = System::Drawing::Size(132, 28);
this->button4->TabIndex = 6;
this->button4->Text = L"Инструкция";
this->button4->UseVisualStyleBackColor = true;
this->button4->Click += gcnew System::EventHandler(this, &MyForm::button4_Click);
//
// groupBox2
//
this->groupBox2->Controls->Add(this->button4);
this->groupBox2->Controls->Add(this->button2);
this->groupBox2->Controls->Add(this->button1);
this->groupBox2->Location = System::Drawing::Point(16, 12);
this->groupBox2->Name = L"groupBox2";
this->groupBox2->Size = System::Drawing::Size(768, 49);
this->groupBox2->TabIndex = 7;
this->groupBox2->TabStop = false;
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(800, 460);
this->Controls->Add(this->groupBox2);
this->Controls->Add(this->groupBox1);
this->Controls->Add(this->dataGridView1);
this->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 9.75F));
this->Margin = System::Windows::Forms::Padding(4);
this->MaximizeBox = false;
this->Name = L"MyForm";
this->Text = L"Статистика результатов экзаменов студентов";
this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->dataGridView1))->EndInit();
this->groupBox1->ResumeLayout(false);
this->groupBox1->PerformLayout();
this->groupBox2->ResumeLayout(false);
this->ResumeLayout(false);
}
#pragma endregion
//событийный обработчик при нажатии на кнопку "Посчитать среднюю оценку каждого студента"
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
if (group == NULL) //данные не были загружены из файла
{
//Вывод сообщения об ошибке
MessageBox::Show("Сначала загрузите данные", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error);
//курсов переводится на кнопку "Загрузить данные из файла"
button1->Focus();
return;
}
group->CalcAverageGrade(); //для каждого студента в group посчитать среднюю оценку
for (int i = 0; i < group->GetSize(); i++)
//вывести полученные значения в столбец "Средняя оценка" таблицы dataGridView1
dataGridView1->Rows[i]->Cells["Средняя оценка"]->Value = group->GetStudent(i).GetAAverageGrade();
}
//событийный обработчик при нажатии на кнопку "Загрузить данные из файла"
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
textBox1->Text = ""; // очищается текстовое поле textBox1
openFileDialog1->ShowDialog(); // отрываем диалог для выбора файла
String^ filename = openFileDialog1->FileName; //имя файла которое выбрал пользователь
//конвертируем имя файла из класса String^ Windows Forms в std::string
std::string sfilename = msclr::interop::marshal_as< std::string >(filename);
int error;
//читаем данные из файла
group = ReadDataFromTxt(sfilename.c_str(), error);
if (error > 0) //если возникла ошибка при чтении файла
{
String^ msg;
//в зависимости от кода ошибки, будут разные тексты сообщений об ошибке
switch (error)
{
case 1: msg = "Файл " + filename + " не открывается"; break;
case 2: msg = "Количество студентов , указанное в файле должно быть больше 0"; break;
case 3: msg = "Количество студентов в файле больше, чем " + String::Format("{0:D1}", group->GetSize()); break;
case 4: msg = "Неправильный формат данных."; break;
case 5: msg = "Оценки должны быть в диапозоне от 2 до 5."; break;
};
msg += "\n Смотри инструкцию!";
//Вывод сообщения об ошибке
MessageBox::Show(msg, "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error);
//курсов переводится на кнопку "Инструкция"
button4->Focus();
return;
}
//данные из group выводим в таблицу dataGridView1
DataTable^ table = gcnew DataTable();
table->Columns->Add("Фамилия", String::typeid);
table->Columns->Add("Имя", String::typeid);
table->Columns->Add("Оценка1", Int32::typeid);
table->Columns->Add("Оценка2", Int32::typeid);
table->Columns->Add("Оценка3", Int32::typeid);
table->Columns->Add("Оценка4", Int32::typeid);
table->Columns->Add("Средняя оценка", Double::typeid);
for (int i = 0; i < group->GetSize(); i++)
{
table->Rows->Add(gcnew String(group->GetStudent(i).GetSurname().c_str()),
gcnew String(group->GetStudent(i).GetName().c_str()),
group->GetStudent(i).GetGrade(0), group->GetStudent(i).GetGrade(1),
group->GetStudent(i).GetGrade(2), group->GetStudent(i).GetGrade(3)
);
}
dataGridView1->DataSource = table;
}
//событийный обработчик при нажатии на кнопку "Вычислить"
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
if (group == NULL) //данные не были загружены из файла
{
//Вывод сообщения об ошибке
MessageBox::Show("Сначала загрузите данные", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Error);
//курсов переводится на кнопку "Загрузить данные из файла"
button1->Focus();
return;
}
int count = group->CalcCountGoodGrade();
String^ s = String::Format("{0:D1}", count);
textBox1->Text = s;
}
//событийный обработчик при нажатии на кнопку "Инструкция"
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
String^ s = "Введите данные в файл в формате:\n\n";
s += "N\n";
s += "Фамилия1 Имя1 Оценка1 Оценка2 Оценка3 Оценка4\n";
s += "...\n";
s += "ФамилияN ИмяN Оценка1 Оценка2 Оценка3 Оценка4\n\n";
s += "Разрешенный разделитель между полями только пробел.\n";
s += "Оценки в диапозоне [2;5].\n";
MessageBox::Show(s, "Инструкция", MessageBoxButtons::OK, MessageBoxIcon::Information);
}
//событийный обработчик для начальной загрузки формы
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
textBox1->Text = ""; // очищается текстовое поле textBox1
//добавляется заголовки для таблицы dataGridView1
dataGridView1->AllowUserToAddRows = false;
DataTable^ table = gcnew DataTable();
table->Columns->Add("Фамилия", String::typeid);
table->Columns->Add("Имя", String::typeid);
table->Columns->Add("Оценка1", Int32::typeid);
table->Columns->Add("Оценка2", Int32::typeid);
table->Columns->Add("Оценка3", Int32::typeid);
table->Columns->Add("Оценка4", Int32::typeid);
table->Columns->Add("Средняя оценка", Double::typeid);
dataGridView1->DataSource = table;
}
};
}
Файл MyForm.cpp
#include "MyForm.h"
using namespace System;
using namespace System::Windows::Forms;
using namespace Kursach;
[STAThreadAttribute]
int main() {
//включение визуальных стилей для приложения
Application::EnableVisualStyles();
//устанвливаем значение по умолчанию для свойств UseCompatibleTextRendering
Application::SetCompatibleTextRenderingDefault(false);
//запускаем прилодение для окна MyForm
Application::Run(gcnew MyForm());
return 0;
}