Профессиональное образовательное учреждение «Челябинский юридический колледж» (НОУ СПО ЧЮК) Предметно-цикловая комиссия математики информатики и вычислительной техники ДОПУЩЕН К ЗАЩИТЕ Председатель ПЦК _____________/____________/ «_____»_____________20___г. ОТЧЕТ о производственной практике Специальность «09.02.07 Информационные системы и программирование» Студент группы ИС-3-18, отделение права и информационных технологий Е.П.Пьянова ______________________ «_____»__________20___г. Руководитель практики от организации _______________________ и. о. директора «_____»___________20___г. О.А.Гусева Руководитель практики от колледжа ______________________ «_____»__________20___ г. Ю.С.Власова Преподаватель ______________________ «_____»__________20___ г. П.В.Криворотов Челябинск 2021 Оглавление Введение …. 3 Глава 1 Ознакомление с объектом практики …. 4 Глава 2 Техническое задание …. 5 2.1 Эксплуатационное и функциональное назначение …. 6 2.2 Требования к надёжности серверу СУБД …. 7 Глава 3 Разработка программного обеспечения …. 8 Глава 4 Разработка инструкции пользователя …. 11 Заключение …. 45 Список использованных источников и литературы …. 46 2 Введение Производственная практика является важным этапом подготовки квалифицированных специалистов. Она является видом учебно- вспомогательного процесса, в ходе которого закрепляется теоретические знания на производстве. Практика является завершающим этапом в процессе подготовки специалиста к самостоятельной производственной деятельности. Задачами прохождения производственной практики является: 1. развить навыки и умения, полученные в период прохождения учебной практики; 2. закрепить и углубить знания, полученные в образовательном учреждении; 3. проверить возможность применения знаний, полученных в колледже, на практике, при непосредственной работе по осваиваемой профессии; 4. приобрести навыки работы в коллективе. 3 Глава 1 Ознакомление с объектом практики Муниципальное бюджетное общеобразовательное учреждение «Средняя общеобразовательная школа № 110» сокращенное наименование: МБОУ «СОШ № 110». Юридический адрес: 456080, Челябинская область, Трехгорный, ул.50 лет Победы, д. 20. Учредитель образовательной организации: Трехгорный городской округ в лице администрации города Трехгорный. Дата создания образовательной организации 01.09.1989. Языки образования: русский. Информация о местах осуществления образовательной деятельности: МБОУ "СОШ №110" г. Трехгорный, ул. 50 лет Победы, д. 20. Руководитель образовательной организации О.А. Гусева. 4 Глава 2 Техническое задание Наше поколение живет в таком времени, в котором почти все люди владеют той или иной информацией. Поэтому роль информационных технологий огромна в жизни каждого из нас и порой невозможно представить нашу жизнь без этих технологий. На сегодняшний день, с помощью всех современных устройств наша жизнь стала намного проще, а главное – удобнее! Ведь всего пару десятков лет назад человечество и мечтать не могло о том, что может позволить себе сейчас. Одной из сфер деятельности, в которой информационные технологии получили широкое распространение, является сфера образования. В образовательно учреждение были проблемы с проверкой знаний по английскому языку у учеников. В школе огромное количество учащихся и, к сожалению, не такое большое количество педагогов иностранного языка, у них часто уходит слишком много времени на проверку заданий, что затрудняет процесс обучения, в следствии чего иногда не усевается выдаваться весь учебный материал. При сдаче письменных работ учеников, были замечены случаи потери работ учителем, такие случаи наносят ученику дискомфорт и не желание учить этот предмет, так как ему приходиться переписывать все заново, многие ученики попросту отказываются от этой возможности и предпочитаю низку оценку свих знаний. После таких случаев падает посещаемость и знания английского языка, соответственно у учреждения падает рейтинг. Посовещавшись с коллективом, было принято решение о разработке программы, которая бы помогала проводить качественную проверку знаний учащихся с минимальной затратой времени. Областью применения данного программного продукта является решение тестов, которые составляют педагоги и проходят их ученики. 5 В наше время образование очень важно он затрачивает много времени ну изучение, выполнение теста и т.д. Программа для оценки знаний по английскому языку студентов– это возможность проводить тестирование у студентов не затрачивая на это много времени. Эта программа хранит в себе данные о тестирование и студентах, которые можно редактировать. Она позволяет сократить время на проверке и организации теста, тем самым даёт больше времени на обучение. -система сама проверяет тест и хранит в себе данные; -вы можете создавать новые тесты добавляя их в базу, которая находиться в самой программе. - Программа для оценки знаний по английскому языку существенно повысит качество и скорость обучения. В этой производственной практике рассматриваются задачи, выполняемые учебной частью образовательного учреждения. Данный программный продукт обеспечивает: хранение информации о студентах, вопросах ответов к тесту. Учащийся в данном учебном учреждении заносятся в программу. Это способствует удобству обработки данных, уменьшению времени поиска определенных данных. Тестирование являются одним из главных этапов обучения, которое имеет цель проверить знания студентов по предмету. Данная программа помогает быстро и качественно провести тестирование студента. Студент заходит в программу выбирает сове имя, фамилию и тест, который ему надо пройти, после прохождения тестирования вводиться результат. 2.1 Эксплуатационное и функциональное назначение Программа должна использоваться в образовательном учреждении для тестирования студентов. Конечными пользователями программы могут являться преподаватель (полное право доступа к информации). 6 Система должна обеспечивать возможность выполнения следующих функций: -ввод и вывод данных; -хранение данных; -редактирование данных; -прохождение тестирования; 2.2 Требования к надёжности серверу СУБД Требования к надёжности - Интуитивно надёжность объектов связывают с недопустимостью отказов в работе. Это есть понимание надёжности в «узком» смысле — свойство объекта сохранять работоспособное состояние в течение некоторого времени или некоторой наработки. Иначе говоря, надёжность объекта заключается в отсутствии непредвиденных эксплуатации недопустимых (при его изменений использовании, его качества обслуживании, на стадии хранении, транспортировании). Это составные инструкции по обеспечению резервного копирования, которое подразумевает ежедневное резервное копирование СУБД ответственным сотрудником. СУБД должна: – позволять осуществлять ввод основной массы данных посредством считывания (записи) массива данных, подготовленного подпрограммой ППРД; – обеспечить контроль достоверности вводимых данных в каждом поле таблиц БД (обязательное поле, умолчание, шаблон и т.д.); – позволять записывать, хранить, находить, редактировать и считывать данные; – обеспечивать пользователю возможность создавать новые БД с идентичной логической структурой данных (деление по изучаемым темам); – обеспечивать модификацию БД; 7 Глава 3 Разработка программного обеспечения Рассмотрев несколько языков программирования, мы пришли к выводу что лучше всего подойдет язык программирования C# так как его функционал и легкость в использование нас полностью устроил. Разработка программы началась с создания бaза данных в HeidiSQL. Что же такое база данных? База данных — это информационная модель, позволяющая в упорядоченном виде хранить данных о группе объектов, обладающих одинаковым набором свойств. С помощью заранее созданных учетных записей, происходит вход. Рисунок 1 – вход в HeidiSQL Далее мы создаем таблицу Рисунок 2 – создание таблицы 8 После этих несложных действий мы можем спокойно заполнять нашу базу данных в HeidiSQL.и заполнить в ней необходимые нам данные. В данной СУБД имеется четыре таблицы: - Таблица Man в ней хранится краткая информация о студентах; - Таблица Otvet здесь хранятся ответы с номерами вопросов, номером варианта и правильными ответом; - Таблица Voprosi в ней находятся все вопросы с их Id; -Таблица Tem тут располагаются варианты тестирований. На рисунке 3 можно подробно посмотреть содержание этих таблиц. Рисунок 3 – СУБД Так же, должно быть уделено внимание среде разработке. Для создадим новый проект в Visual Studio. Чтобы работать с информацией из базы данных в создаваемой программе, нужно эту базу данных подключить к C#, реализовать это возможно с помощью добавления ссылки MySql.Data и подключимся к нашей базе данных. Рисунок 4 – подключение Далее создадим экземпляр класса, который восстанавливает соединение с базой данных, класс называется MySqlConnection. 9 MySqlDataAdapter представляет собой объект Command, получающий данные из источника данных. MySqlCommand объект, представляющий собой команду, которую можно выполнить, и она будет отправлена на сервер и соответственно исполнит эту команду. Теперь создадим формы, в которых будем прописывать далее нашу программу. Всего будет одиннадцать их иерархию можно увидеть на рисунке 5. Рисунок 5 – иерархическая структура форм После приступаем к написанию кода у нашей программы. Было прописаны функции на добавление, удаление, редактирование данных, переход с одной формы на другую. 10 Глава 4 Разработка инструкции пользователя Основой программы является главная форма Windows Form, показанной на рисунке 6. Рисунок 6 – главная форма На данной форме находиться 3 кнопки кнопка «Закрыть» закрывает программу. Кнопка «База» ведет нас к базе данных, изображенной на рисунке 7. На этой форме DG расположены кнопки «Студенты», которая ведет нас к базе студентов изображенной на рисунке 8, кнопка «Ответ», переносит нас в редактор и добавление вопросов и ответов на них это можно увидить на рисунке 12, кнопка «Вопрос» показывает нам все вопросы хранящиеся в базе данных это показано на рисунке 13, кнопка «Закрыть» переносит нас на главную страницу. Пример кода: public partial class glavna : Form { //Строка подключения к БД static string connStr = "server=osp74.ru;port=33333;user=st_3_18;database=st_3_18;password=5280947 3"; //Переменная соединения MySqlConnection conn = new MySqlConnection(connStr); public glavna() 11 { InitializeComponent(); } public void GetListtema() { //Формирование списка статусов DataTable list_dolg_table = new DataTable(); MySqlCommand list_dolg_command = new MySqlCommand(); //Открываем соединение conn.Open(); //Формируем столбцы для комбобокса списка отделов list_dolg_table.Columns.Add(new DataColumn("id", System.Type.GetType("System.Int32"))); list_dolg_table.Columns.Add(new DataColumn("title", System.Type.GetType("System.String"))); //Настройка видимости полей комбобокса comboBox1.DataSource = list_dolg_table; comboBox1.DisplayMember = "title"; comboBox1.ValueMember = "id"; //Формируем строку запроса на отображение списка статусов прав пользователя string sql_list_users = "SELECT id,title FROM tem"; list_dolg_command.CommandText = sql_list_users; list_dolg_command.Connection = conn; //Формирование списка отделов для combobox'a MySqlDataReader reader_list_otdel; try { reader_list_otdel = list_dolg_command.ExecuteReader(); while (reader_list_otdel.Read()) { DataRow rowToAdd = list_dolg_table.NewRow(); rowToAdd["id"] = Convert.ToInt32(reader_list_otdel[0]); rowToAdd["title"] = reader_list_otdel[1].ToString(); list_dolg_table.Rows.Add(rowToAdd); } reader_list_otdel.Close(); conn.Close(); } catch (Exception ex) { MessageBox.Show("Ошибка чтения списка статусов \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); 12 Application.Exit(); } finally { conn.Close(); } } public void GetListFio() { //Формирование списка статусов DataTable list_status_table = new DataTable(); MySqlCommand list_status_command = new MySqlCommand(); //Открываем соединение conn.Open(); //Формируем столбцы для комбобокса списка отделов list_status_table.Columns.Add(new DataColumn("id", System.Type.GetType("System.Int32"))); list_status_table.Columns.Add(new DataColumn("fio", System.Type.GetType("System.String"))); //Настройка видимости полей комбобокса comboBox2.DataSource = list_status_table; comboBox2.DisplayMember = "fio"; comboBox2.ValueMember = "id"; //Формируем строку запроса на отображение списка статусов прав пользователя string sql_list_users = "SELECT id, fio FROM man"; list_status_command.CommandText = sql_list_users; list_status_command.Connection = conn; //Формирование списка отделов для combobox'a MySqlDataReader reader_list_otdel; try { reader_list_otdel = list_status_command.ExecuteReader(); while (reader_list_otdel.Read()) { DataRow rowToAdd = list_status_table.NewRow(); rowToAdd["id"] = Convert.ToInt32(reader_list_otdel[0]); rowToAdd["fio"] = reader_list_otdel[1].ToString(); list_status_table.Rows.Add(rowToAdd); } reader_list_otdel.Close(); conn.Close(); } 13 catch (Exception ex) { MessageBox.Show("Ошибка чтения списка статусов \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } finally { conn.Close(); } } private void button1_Click(object sender, EventArgs e) //переход по кнопке на другую форму { DG DG = new DG(); this.Hide(); DG.ShowDialog(); } private void button3_Click(object sender, EventArgs e) { MessageBox.Show(Convert.ToString(comboBox1.SelectedValue)); class_edit_user.id = Convert.ToString(comboBox1.SelectedValue); test1 test1 = new test1(); this.Hide(); test1.ShowDialog(); int new_tem = Convert.ToInt32(comboBox1.SelectedValue); int new_fio = Convert.ToInt32(comboBox2.SelectedValue); } private void button2_Click(object sender, EventArgs e) { this.Close(); } private void glavna_Load(object sender, EventArgs e) { GetListtema(); GetListFio(); } } 14 Рисунок 7 – главное окно базы данных Пример кода: public partial class DG : Form { public DG() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { stud stud = new stud(); this.Hide(); stud.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { otvet_izmena otvet_izmena = new otvet_izmena(); this.Hide(); otvet_izmena.ShowDialog(); } private void button3_Click(object sender, EventArgs e) { glavna op = new glavna(); op.Show(); 15 this.Close(); } private void button4_Click(object sender, EventArgs e) { voprosi vopros = new voprosi(); this.Hide(); vopros.ShowDialog(); } На рисунке 8 мы показана форма stud. Тут можно добавлять, изменять, удалять учеников или же закрыть данную страницу. Рисунок 8 – студенты public partial class stud : Form { //подкюченик MySqlConnection conn = new MySqlConnection("server=osp74.ru;port=33333;user=st_3_18;database=st_3_18;p assword=52809473"); DataTable dt = new DataTable(); BindingSource bs = new BindingSource(); private DataTable table = new DataTable(); private MySqlDataAdapter MyDA = new MySqlDataAdapter(); 16 private BindingSource bSource = new BindingSource(); private DataSet ds = new DataSet(); string index_selected_rows; string id_selected_rows; public stud() { InitializeComponent(); } // public void GetSelectedIDString() { string index_selected_rows; index_selected_rows = dataGridView1.SelectedCells[0].RowIndex.ToString(); id_selected_rows = dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[0].Value.ToSt ring(); } public void GetListUsers() { string commandStr = "SElect id AS 'ID', fio AS 'ФИО' from man "; MySqlDataAdapter adapter = new MySqlDataAdapter(commandStr, conn); bs.DataSource = dt; adapter.Fill(dt); MyDA.SelectCommand = new MySqlCommand(commandStr, conn); MyDA.Fill(table); bSource.DataSource = table; dataGridView1.DataSource = bSource; int count_rows = dataGridView1.RowCount - 1; } //Выделение всей строки по ЛКМ private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { GetSelectedIDString(); } //Выделение всей строки по ПКМ private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (!e.RowIndex.Equals(-1) && !e.ColumnIndex.Equals(-1) && e.Button.Equals(MouseButtons.Right)) 17 { dataGridView1.CurrentCell = dataGridView1[e.ColumnIndex, e.RowIndex]; //dataGridView1.CurrentRow.Selected = true; dataGridView1.CurrentCell.Selected = true; //Метод получения ID выделенной строки в глобальную переменную GetSelectedIDString(); } } public void Reload_list() { table.Clear(); GetListUsers(); } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { //Метод получения ID выделенной строки в глобальную переменную GetSelectedIDString(); } //Кнопка открытия формы для добавления private void stud_Load(object sender, EventArgs e) { conn.Open(); GetListUsers(); dataGridView1.DataSource = bs; dataGridView1.Columns[0].Visible = true; dataGridView1.Columns[1].Visible = true; dataGridView1.Columns[0].FillWeight = 5; dataGridView1.Columns[1].FillWeight = 30; dataGridView1.RowHeadersVisible = false; dataGridView1.ColumnHeadersVisible = true; conn.Close(); } //вызов формы со студентами private void button1_Click(object sender, EventArgs e) { dobav dobav = new dobav(); dobav.ShowDialog(); Reload_list(); 18 } private void button4_Click(object sender, EventArgs e) { DG op = new DG(); op.Show(); this.Close(); Reload_list(); } private void button2_Click(object sender, EventArgs e) { index_selected_rows = dataGridView1.SelectedCells[0].RowIndex.ToString(); id_selected_rows = dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[0].Value.ToSt ring(); class_edit_user.id = id_selected_rows; izmena edit = new izmena(); edit.ShowDialog(); Reload_list(); } public void delete_user(int id) { string connStr = "server = osp74.ru;port=33333;user=33333;database=st_3_18;password=52809473;"; MySqlConnection conn = new MySqlConnection(connStr); string sql = "DELETE FROM man WHERE id = " + id; //удаление строки по выбраному id MySqlCommand del = new MySqlCommand(sql, conn); try { conn.Open(); del.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show("Ошибки удаления пользователя \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { conn.Close(); } } private void button3_Click(object sender, EventArgs e) 19 { index_selected_rows = dataGridView1.SelectedCells[0].RowIndex.ToString(); id_selected_rows = dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[0].Value.ToSt ring(); DialogResult result = MessageBox.Show("Вы действительно хотите удалить клиента: " + dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[1].Value.ToSt ring(), "Сообщение", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); if (result == DialogResult.Yes) { delete_user(Convert.ToInt32(id_selected_rows)); Reload_list(); } } На рисунке 9 показано добавление ученика. В поле рядом с Ф.И.О надо прописать нужного нам ученика и в конце нажать на Добавить. Рисунок 9 – добавление студента public partial class dobav : Form { public dobav() { 20 InitializeComponent(); } private void Add() { string connStr = "server = osp74.ru;port=33333;user=st_3_18;database=st_3_18;password=52809473;"; MySqlConnection conn = new MySqlConnection(connStr); string sql = "INSERT INTO man (fio) VALUES ('" + textBox1.Text + "');"; //процедура добавления данных в БД, введенных в textBox2 MySqlCommand up = new MySqlCommand(sql, conn); try { conn.Open(); up.ExecuteNonQuery(); } catch (Exception ex) //тож хз, чет там для того, чтобы если возникнет ошибка, прога не закрывалась каждый раз с указом на ошибку в коде { MessageBox.Show("Ошибки добавления строки пользователя \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { conn.Close(); } } private void button2_Click(object sender, EventArgs e) { 21 DialogResult vibor2 = MessageBox.Show("Закрыть форму без добавления новой записи?", "Сообщение", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk); if (vibor2 == DialogResult.Yes) { this.Close(); } if (vibor2 == DialogResult.No) { } } private void button1_Click(object sender, EventArgs e) { Add(); this.Close(); } Но бывают ситуации, кода совершаешь ошибку в фамилии или имени ученика. Для этого надо просто выбрать нужное нам поле с учеником и нажать на кнопку Изменить. После всплывет окошко с редактором, которое представлено на рисунке 10, исправляем ошибку и нажимаем Добавить. Рисунок 10 – редактирование студента public partial class izmena : Form 22 { string id_user_for_edit; static readonly string connStr = "server=osp74.ru;port=33333;user=st_3_18;database=st_3_18;password=5280947 3;"; MySqlConnection conn_db = new MySqlConnection(connStr); public izmena() { InitializeComponent(); } private void izmena_Load(object sender, EventArgs e) { GetCurrentString(); } public void GetCurrentString() { id_user_for_edit = class_edit_user.id; string get_current_string_sql = "SELECT fio FROM man WHERE id = " + id_user_for_edit; MySqlCommand current_user_command = new MySqlCommand(get_current_string_sql, conn_db); conn_db.Open(); MySqlDataReader current_user_reader = current_user_command.ExecuteReader(); while (current_user_reader.Read()) { textBox1.Text = current_user_reader[0].ToString(); } conn_db.Close(); 23 } public void UpdateCurrentString(string fio) { string sql_update_user = "UPDATE man SET fio ='" + textBox1.Text + "' WHERE id = " + id_user_for_edit; MySqlCommand update_user = new MySqlCommand(sql_update_user, conn_db); try { conn_db.Open(); update_user.ExecuteNonQuery(); this.Close(); } catch (Exception ex) { MessageBox.Show("Ошибка изменения строки \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } finally { conn_db.Close(); } } private void button1_Click(object sender, EventArgs e) { UpdateCurrentString(textBox1.Text); } private void button2_Click(object sender, EventArgs e) 24 { DialogResult vibor2 = MessageBox.Show("Закрыть форму без сохранения изменений?", "Сообщение", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk); if (vibor2 == DialogResult.Yes) { this.Close(); } if (vibor2 == DialogResult.No) { } } } Если нам надо удалить ученика, то мы проделываем те же самые действия, что и с изменение, но после нажимаем на кнопку Удалить. После этого будет уведомление, показанное на рисунке 11 о подтверждение удаления ученика, нажимаем Да и после этого ученик будет удален. Рисунок 11 – удаление студента 25 Рисунок 12 – добавление ответа с вопрос На данной форме вводиться вопрос и выбирается к какому тесту он будет принадлежать, так же вводиться ответ и выбирается правильность его (1 – верный ответ, 0 – неправильный). public partial class otvet_izmena : Form { //Строка подключения к БД static string connStr = "server=osp74.ru;port=33333;user=st_3_18;database=st_3_18;password=5280947 3"; //Переменная соединения MySqlConnection conn = new MySqlConnection(connStr); public otvet_izmena() { InitializeComponent(); } private void otvet_izmena_Load(object sender, EventArgs e) 26 { comboBox1.SelectedIndex = 0; comboBox2.SelectedIndex = 0; comboBox3.SelectedIndex = 0; comboBox4.SelectedIndex = 0; comboBox5.SelectedIndex = 0; } public int add_quest() { string title_quest = textBox1.Text; //Формирование запроса на добавления. НО этот запрос возвращает ID последней вставленной записи, что бы //связать добавление вариантов ответа через него. string sql_insert_quest = "INSERT INTO voprosi (vopros,id_tem) VALUES ('" + textBox1.Text + "','" + comboBox5.Text + "'); SELECT @@IDENTITY AS id"; //Объявление переменной для ID вопроса int last_ins_id = 0; //Посылаем запрос на добавление данных MySqlCommand insert_quest = new MySqlCommand(sql_insert_quest, conn); try { conn.Open(); last_ins_id = Convert.ToInt32(insert_quest.ExecuteScalar()); MessageBox.Show("Добавление вопроса прошло успешно", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } 27 catch (Exception ex) { MessageBox.Show("Ошибка добавления вопроса \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } finally { conn.Close(); } return last_ins_id; } public void insert_answ(int id_quest) { //Объявление массивов ответов и признаков правильности ответа string[] answ = new string[] { textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text }; string[] priznak_ans = new string[] { comboBox1.Text, comboBox2.Text, comboBox3.Text, comboBox4.Text, }; //Цикл перебора ответов и внесение их в БД for (int i = 0; i < 4; i++) { //Формирование запроса на добавления. string sql_insert_quest = "INSERT INTO otvet (id_vopros, otvetic, pravel_otvet) " + "VALUES ('" + id_quest + "', '" + answ[i] + "', '" + priznak_ans[i] + "')"; //Посылаем запрос на добавление данных MySqlCommand insert_user = new MySqlCommand(sql_insert_quest, conn); 28 try { conn.Open(); insert_user.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show("Ошибка добавления ответа \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } finally { conn.Close(); } } } private void button1_Click(object sender, EventArgs e) { //Выполняем метод и заодно заносим значение ID добавленного запроса в переменную. int id_quest = add_quest(); insert_answ(id_quest); textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; textBox4.Text = ""; textBox5.Text = ""; comboBox1.SelectedIndex = 0; 29 comboBox2.SelectedIndex = 0; comboBox3.SelectedIndex = 0; comboBox4.SelectedIndex = 0; comboBox5.SelectedIndex = 0; } private void button2_Click(object sender, EventArgs e) { DG op = new DG(); op.Show(); this.Close(); } Рисунок 13– вопрос На 13 рисунке представлена страница с вопросами, здесь можно добавлять, изменять, удалять вопрос или же закрыть данную страницу. public partial class vopros : Form { MySqlConnection conn = new MySqlConnection("server=osp74.ru;port=33333;user=st_3_18;database=st_3_18;p assword=52809473"); 30 DataTable dt = new DataTable(); BindingSource bs = new BindingSource(); private DataTable table = new DataTable(); private MySqlDataAdapter MyDA = new MySqlDataAdapter(); private BindingSource bSource = new BindingSource(); private DataSet ds = new DataSet(); string index_selected_rows; string id_selected_rows; public vopros() { InitializeComponent(); } public void GetSelectedIDString() { string index_selected_rows; index_selected_rows = dataGridView1.SelectedCells[0].RowIndex.ToString(); id_selected_rows = dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[0].Value.ToSt ring(); } public void GetListUsers() { string commandStr = "SElect id AS 'ID', vopros AS 'вопрос' from voprosi ORDER BY id"; MySqlDataAdapter adapter = new MySqlDataAdapter(commandStr, conn); bs.DataSource = dt; adapter.Fill(dt); MyDA.SelectCommand = new MySqlCommand(commandStr, conn); MyDA.Fill(table); bSource.DataSource = table; dataGridView1.DataSource = bSource; int count_rows = dataGridView1.RowCount - 1; } //Выделение всей строки по ЛКМ private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { GetSelectedIDString(); } //Выделение всей строки по ПКМ 31 private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (!e.RowIndex.Equals(-1) && !e.ColumnIndex.Equals(-1) && e.Button.Equals(MouseButtons.Right)) { dataGridView1.CurrentCell = dataGridView1[e.ColumnIndex, e.RowIndex]; //dataGridView1.CurrentRow.Selected = true; dataGridView1.CurrentCell.Selected = true; //Метод получения ID выделенной строки в глобальную переменную GetSelectedIDString(); } } public void Reload_list() { table.Clear(); GetListUsers(); } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { //Метод получения ID выделенной строки в глобальную переменную GetSelectedIDString(); } //Кнопка открытия формы для добавления записе private void voprosi_Load(object sender, EventArgs e) { conn.Open(); GetListUsers(); dataGridView1.DataSource = bs; dataGridView1.Columns[0].Visible = true; dataGridView1.Columns[1].Visible = true; dataGridView1.Columns[0].FillWeight = 5; dataGridView1.Columns[1].FillWeight = 30; dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; dataGridView1.RowHeadersVisible = false; dataGridView1.ColumnHeadersVisible = true; conn.Close(); 32 } private void button1_Click(object sender, EventArgs e) { voprosi_dobav voprosi_dobav = new voprosi_dobav(); voprosi_dobav.ShowDialog(); Reload_list(); } private void button4_Click(object sender, EventArgs e) { DG op = new DG(); op.Show(); this.Close(); Reload_list(); } private void button2_Click(object sender, EventArgs e) { index_selected_rows = dataGridView1.SelectedCells[0].RowIndex.ToString(); id_selected_rows = dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[0].Value.ToSt ring(); class_edit_user.id = id_selected_rows; voprosi_izmena edit = new voprosi_izmena (); edit.ShowDialog(); Reload_list(); } public void delete_user(int id) { string connStr = "server = osp74.ru;port=33333;user=st_3_18;database=st_3_18;password=52809473;"; MySqlConnection conn = new MySqlConnection(connStr); string sql = "DELETE FROM voprosi WHERE id = " + id; //удаление строки по выбраному id MySqlCommand del = new MySqlCommand(sql, conn); try { conn.Open(); del.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show("Ошибки удаления пользователя \n\n" + ex, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } 33 finally { conn.Close(); } } private void button3_Click(object sender, EventArgs e) { index_selected_rows = dataGridView1.SelectedCells[0].RowIndex.ToString(); id_selected_rows = dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[0].Value.ToSt ring(); DialogResult result = MessageBox.Show("Вы действительно хотите удалить клиента: " + dataGridView1.Rows[Convert.ToInt32(index_selected_rows)].Cells[1].Value.ToSt ring(), "Сообщение", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); if (result == DialogResult.Yes) { delete_user(Convert.ToInt32(id_selected_rows)); Reload_list(); } } } Чтобы добавить вопрос надо сделать надо нажать кнопку Добавить и надо прописать нужный вопрос и в конце нажать на Добавить. 34 Рисунок 14 – добавление вопроса Для того чтобы изменить надо просто выбрать нужное нам поле с вопросом и нажать на кнопку Изменить. После всплывет окошко с редактором, которое представлено на рисунке 15, исправляем ошибку и нажимаем Добавить. Рисунок 15 – изменение вопроса Если нам надо удалить вопрос, то мы проделываем те же самые действия, что и с изменение, но после нажимаем на кнопку Удалить. После этого будет уведомление, показанное на рисунке 16 о подтверждение удаления ученика, нажимаем Да и после этого ученик будет удален. Рисунок 16 – удаление вопроса Для того чтобы ученик мог войти в само тестирование необходимо на главной странице прописать своё Ф.И.О. и выбрать категорию тестирование, если ученик сделает все правильно, то ему всплывет окошко с номером его тестирование, на рисунке 17 показан процесс входа в тестирование. 35 Рисунок 17 – выбор тестирования После успешного входа в тестирование ученик приступает к тестированию. Под каждым вопросом расположено окошко, в котором можно выбрать вариант ответ. По завершению тестирования ученик должен нажать на кнопку Завершить и программа перейдет к подсчету правильных и не правильных ответов. Это показано на рисунке 18. Рисунок 18 – тестирование public partial class test1 : Form 36 { //Строка подключения к БД static string connStr = "server=osp74.ru;port=33333;user=st_3_18;database=st_3_18;password=5280947 3"; //Переменная соединения MySqlConnection conn = new MySqlConnection(connStr); //Объявление массива Combobox ComboBox[] cb = null; //Объявление массива Label-вопросов Label[] lb_q = null; //Объявление массива Label-подсказок Label[] lb_pod = null; //Количество вопросов int count_questions_from_db = 0; string id_selected_rows; string id; public test1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { this.Close(); } private void test1_Load(object sender, EventArgs e) { //Запрос на получение количества критериев id = class_edit_user.id; 37 string count_questions = "SELECT COUNT(*) FROM voprosi WHERE id_tem = " + id; //Создаём команду MySqlCommand list_criterias_comm = new MySqlCommand(); list_criterias_comm.Connection = conn; //Получение количества критериев conn.Open(); list_criterias_comm.CommandText = count_questions; count_questions_from_db = Convert.ToInt32(list_criterias_comm.ExecuteScalar()); //Объявление массива Label'ов lb_q = new Label[count_questions_from_db]; //Объявление массива ComboBox'ов cb = new ComboBox[count_questions_from_db]; //Настройка label'ов for (int i = 0; i < lb_q.Length; i++) { lb_q[i] = new Label(); lb_q[i].Location = new System.Drawing.Point(5, 5 + i * 50); lb_q[i].Name = "Label" + i.ToString(); lb_q[i].Text = "Label" + i.ToString(); lb_q[i].AutoSize = true; lb_q[i].Parent = this; } //Настройка combobox'ов for (int i = 0; i < cb.Length; i++) { cb[i] = new ComboBox(); cb[i].Location = new System.Drawing.Point(5, 28 + i * 50); 38 cb[i].Name = "cb" + i.ToString(); cb[i].Parent = this; } //Наполнение Label'ов с вопросами //обьяв глобал класс id = class_edit_user.id; string sql_select_all_questions = "SELECT * FROM voprosi WHERE id_tem = " + id; MySqlCommand command_select_all_questions = new MySqlCommand(sql_select_all_questions, conn); MySqlDataReader select_all_quest = command_select_all_questions.ExecuteReader(); int index_element = 0; while (select_all_quest.Read()) { lb_q[index_element].Text = select_all_quest[1].ToString(); cb[index_element].Tag = Convert.ToInt32(select_all_quest[0]); index_element++; } //Закрыли reader select_all_quest.Close(); //Заполнение динамически созданного combobox'a в цикле for (int i = 0; i < cb.Length; i++) { string sql_get_answers = "SELECT otvetic, pravel_otvet FROM otvet WHERE id_vopros = " + cb[i].Tag; using (MySqlDataAdapter get_answers_adapter = new MySqlDataAdapter(sql_get_answers, conn)) { 39 DataSet get_answers_dt = new DataSet(); get_answers_adapter.Fill(get_answers_dt); cb[i].DataSource = get_answers_dt.Tables[0]; cb[i].ValueMember = "pravel_otvet"; cb[i].DisplayMember = "otvetic"; } } conn.Close(); } private void button3_Click(object sender, EventArgs e) { int ocenka = 0; for (int i = 0; i < cb.Length; i++) { //Запрос на выборку критерия правильности у выбранного ответа string sql_get_answers = "SELECT id_vopros from otvet WHERE id = " + cb[i].Tag + " AND pravel_otvet =" + cb[i].SelectedValue; // MessageBox.Show(sql_get_answers); //Создаём команду MySqlCommand list_criterias_comm = new MySqlCommand(); list_criterias_comm.Connection = conn; //Получение признака правильности ответа conn.Open(); list_criterias_comm.CommandText = sql_get_answers; int priznak_true = Convert.ToInt32(list_criterias_comm.ExecuteScalar()); // MessageBox.Show("На " + cb[i].Tag.ToString() + " вопрос вы ответили " + priznak_true); 40 //Если из базы данных вернулась истина для выбранного ответа if (priznak_true == 1) { //То увеличиваем счётчик правильных ответов ocenka++; } conn.Close(); } MessageBox.Show("Вы набрали " + ocenka.ToString() + " правильных ответа"); //Обнуяем переменную ocenka = 0; } В конце программа выдаст в отдельном окне результат тестирования. Рисунок 19 – результат тестирования. В последний момент было принято решение добавить делегаты. Что такое делегаты? Делегаты представляют такие объекты, которые указывают на методы. То есть делегаты - это указатели на методы и с помощью делегатов мы можем вызвать данные методы. Наиболее сильная сторона делегатов состоит в том, что они позволяют делегировать выполнение некоторому коду извне. И на момент написания программы мы можем не знать, что за код будет выполняться. Мы просто вызываем делегат. А какой метод будет непосредственно выполняться при 41 вызове делегата, будет решаться потом. Например, наши классы будут распространяться в виде отдельной библиотеки классов, которая будет подключаться к проекту другого разработчика. И этот разработчик захочет определить какую-то свою логику обработки, но изменить исходный код нашей библиотеки классов он не может. И делегаты как раз предоставляют возможность вызвать некое действие, которое задается извне и которое на момент написания кода может быть неизвестно. Делегаты тесно связаны с другими элементами языка: 1) На них реализованы операторы сложения и вычитания; 2) Они работают с методами, анонимными методами и лямбдавыражениями; 3) Привязываются к событиям. Все это можно при желании реализовать самому через классы и интерфейсы, но этот функционал расширяет возможности языка, позволяет писать более короткий код. Для объявления делегата используется ключевое слово delegate, после которого идет возвращаемый тип, название и параметры. Делегаты необязательно могут указывать только на методы, которые определены в том же классе, где определена переменная делегата. Это могут быть также методы из других классов и структур. Выше сказанное переменной делегаты напрямую присваивался метод. Есть еще один способ - создание объекта делегата с помощью конструктора, в который передается нужный метод: Как было написано выше, методы соответствуют делегату, если они имеют один и тот же возвращаемый тип и один и тот же набор параметров. Но надо учитывать, что во внимание также принимаются модификаторы ref и out. В выше сказанном переменная делегата указывала на один метод. В реальности же делегат может указывать на множество методов, которые имеют ту же сигнатуру и возвращаемые тип. Все методы в делегате попадают в специальный список - список вызова или 42 invocation list. И при вызове делегата все методы из этого списка последовательно вызываются. И мы можем добавлять в этот список не один, а несколько методов. Для добавления делегатов применяется операция +=. Однако стоит отметить, что в реальности будет происходить создание нового объекта делегата, который получит методы старой копии делегата и новый метод, и новый созданный объект делегата будет присвоен переменной. При добавлении делегатов следует учитывать, что мы можем добавить ссылку на один и тот же метод несколько раз, и в списке вызова делегата тогда будет несколько ссылок на один и то же метод. Соответственно при вызове делегата добавленный метод будет вызываться столько раз, сколько он был добавлен. Подобным образом мы можем удалять методы из делегата с помощью операции -=. При удалении методов из делегата фактически будет создаваться новый делегат, который в списке вызова методов будет содержать на один метод меньше. При удалении следует учитывать, что если делегат содержит несколько ссылок на один и тот же метод, то операция -= начинает поиск с конца списка вызова делегата и удаляет только первое найденное вхождение. Если подобного метода в списке вызова делегата нет, то операция -= не имеет никакого эффекта. На рисунке 20 мы можем увидеть как делегат, так и его переменную, которая указывает на метод add_qwest. Рисунок 20 – делегат Далее на рисунке 8 мы видим метод add_quest. Теперь, вызов данной переменной делегата будет вызывать данный метод. 43 Рисунок 21 - метод add_quest. Наше поколение живет в таком времени, в котором почти все люди владеют той или иной информацией. Поэтому роль информационных технологий огромна в жизни каждого из нас и порой невозможно представить нашу жизнь без этих технологий. На сегодняшний день, с помощью всех современных устройств наша жизнь стала намного проще, а главное – удобнее! Ведь всего пару десятков лет назад человечество и мечтать не могло о том, что может позволить себе сейчас. Одной из сфер деятельности, в которой информационные технологии получили широкое распространение, является сфера образования. Программа для оценки знаний по английскому языку существенно повысит качество и скорость обучения. 44 Заключение В процессе прохождения практики я ознакомилась с деятельностью МБОУ «СОШ № 110». Во время прохождения практики подкрепила полученные знания и теоретические навыки практическими. Познакомилась с организацией, структурой и принципами функционирования образовательной организации. Развила коммуникативные навыки. Получила опыт работы в коллективе. При прохождение практики показала себя, как способного и ответственного сотрудника. Справлялась с поставленными задачами. Так же расширила свои знания в области информационных систем, антивирусных программ, компьютерных сетей. Считаю, что необходимо и дальше расширять свои знания в области прикладного программного обеспечения. Полученный мною опыт бесценен и надеюсь, что полученные мною знания при прохождении практики пригодятся мне в будущем. 45 Список использованных источников и литературы Электронные ресурсы 1. Справочник по С# [Электронный ресурс]: сайт – Режим доступа: https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/class 2.Visual Studio [Электронный ресурс]: сайт – Режим доступа: https://visualstudio.microsoft.com/ru/downloads/ 3. HeidiSQL [Электронный ресурс]: сайт – Режим доступа: https://www.heidisql.com/ 4. Подключение HeidiSQL [Электронный ресурс]: сайт – Режим доступа: https://spravochnick.ru/bazy_dannyh/yazyk_sql_osnovy_raboty_s_relyacionnymi/ 5. METANIT.COM [Электронный ресурс]: сайт – Режим доступа: https://metanit.com/ 6. Microsoft Windows 10 Professiona [Электронный ресурс]: сайт – Режим доступа: https://www.microsoft.com/ru-ru/software-download/windows10 7. Разработка программного обеспечения [Электронный ресурс]: сайт – Режим доступа: https://habr.com/ru/post/255991/ 8. ТЗ [Электронный ресурс]: сайт – Режим доступа: https://kontur.ru/articles/5945 46 47