Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 10.05.2014
Сообщений: 3

Тест на C# из двух частей: с использованием TextBox и CheckBox

09.01.2015, 10:51. Показов 5809. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Задание было написать модульный тест с выбором многие из многих и ввод ответа. Сразу говорю, с этим языком ранее знакома не была, поэтому, естественно, код не идеален.
Проблема с дозаписью в файл вывода всех ответов + на форме, где необходимо вводить значение, не переключается на следующий вопрос + вопрос как сложить результат.
Прикрепляю файл проекта, надеюсь на вашу помощь.
test2.zip
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2015, 10:51
Ответы с готовыми решениями:

Составить тест по ПДД из 4 частей, с выводом правильных\неправильных ответов по завершению
Кто поможет составить тест по ПДД по этим вопросам, что бы в конце показывал кол-во правильных ответов и ошибки.

Вывод частей строки в разные TextBox
Имеется форма с textbox'ми. При нажатии на кнопку открывается диалоговое окно и выбирается txt файл для загрузки на форму. Каждая строка...

Нужно, чтобы при checkbox.checked=true я мог набирать текст в textbox-е, ну и соответственно при checkbox.checked=false - нет.
есть checkbox и textbox. Нужно, чтобы при checkbox.checked=true я мог набирать текст в textbox-е, ну и соответственно при...

3
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
10.01.2015, 21:00
katrindakatrin, Добрый день. Посмотрел ваш код, и решил все-таки не копаться, т.к. ошибок достаточно, я решил с ноля написать что-то подобное. Я только вопросы перенес в XML файл, так на мой взгляд удобнее и количество вопросов может теперь не ограничено. С таймером не совсем понял, поэтому пока без него, как посчитать оценку не совсем понял, если объясните внесу в программу, вторая часть теста тоже не понятна, получается нужно ввести весь текст ответа, если ошибка в одну букву уже все неправильно. В общем смотрите, задавайте вопросы. Если что не так добавлю.
Запускаете проект их папки Мой тест1 как и было, я просто в Ваш проект добавил и сделал его запускаемым по умолчанию.

Классы для программы вынесены в отдельный файл
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    public class Question
    {
        public int Id { get; set; }
        public string Text { get; set; }
        /* public virtual ICollection<Answer> Answers { get; set; }
           public Question()
           { 
               Answers = new List<Answer>();
           }
           public Question(int i, string q)  // Расскоментируйте этот блок, если в будущем захотите внедрить в приложение базу данных
           {                                 //Это представление "один ко многим" в модели Code First - Entity Framework 6.1.2
               this.Id = i;
               this.Text = q;  
           }*/
    }
 
    public class Answer
    {
        public int Id { get; set; }
        public string answer { get; set; }
        public int rating { get; set; }
        public int rating2 { get; set; }
        public int? QuestionID { get; set; }
        /*  public virtual Question Question { get; set; }
            public Answer() { }
            public Answer(int i, string a, int r, int Qid) 
              {
                  this.Id = i;       // Расскоментируйте этот блок, если в будущем захотите внедрить в приложение базу данных
                  this.answer = a;   //Это представление "один ко многим" в модели Code First - Entity Framework 6.1.2
                  this.rating = r;
                  this.QuestionID = Qid;
              }*/
    }
 
    sealed class Nodes // Представление данных из XML
    {   //Элемент root
        public const string Root = "Root";
        //Элемент Question
        public const string Question = "Question";
        //Атрибуты Question
        public const string IDQ = "id";
        public const string TEXT = "text";
        //Элементы Answer
        public const string Answer = "Answer";
        //Атрибуты Answer
        public const string IDA = "id";
        public const string RATING = "rating";
        public const string RATING2 = "rating-2";
        public const string QiD = "question-id";
    }
 
    static class GlobalList // статический класс доступен в любой ...
    {
        public static List<string> OutputText { get; set; }
 
        static GlobalList() // UPD: это исправит вашу проблему
        {
            OutputText = new List<string>();
        }
    }
    public class Elements
    {
        public Button[] b;
        public CheckBox[] c;
        public Elements(int size, Form form, EventHandler e)
        {
            b = new Button[size]; // Массив кнопочек переключателей снизу
            for (int j = 0; j < b.Length; j++)
            {
                b[j] = new Button();
                b[j].Name = "mybutton" + j;
                b[j].Height = 20;
                b[j].Width = 30;
                b[j].Top = form.ClientSize.Height - 25;
                b[j].Left = 10 + j * 35;
                b[j].Text = Convert.ToString(j + 1);
                b[j].Visible = true;
                b[j].Enabled = false;
                b[j].Click += new System.EventHandler(e);
                form.Controls.Add(b[j]);
            }
        }
 
        public Elements(int size, Form form)
        {
            c = new CheckBox[size];  // массив чекбоксов
            for (int j = 0; j < c.Length; j++)
            {
                c[j] = new CheckBox();
                c[j].Name = "checkBox" + j + 1;
                c[j].AutoSize = true;
                c[j].Top = 89 + j * 40;
                c[j].Left = 13;
                c[j].Visible = true;
                c[j].Text = "Это чекбокс" + j;
                form.Controls.Add(c[j]);
            }
        }
 
    }
Форм теперь 2, а не 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            GlobalList.OutputText.Add("Фамилия: " + textBox1.Text);
            GlobalList.OutputText.Add("Группа: " + textBox2.Text);
          //  GlobalList.OutputText
            this.Hide();
            Form2 f2 = new Form2();
            DialogResult result = f2.ShowDialog(this);
            if (result == DialogResult.Cancel) this.Show();
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
public partial class Form2 : Form
    {
        static string path = "QueAns.xml"; // Путь к файлу XML, в данном случае рядом с exe
        int indexator = 0; //общий индексатор, на нем построена логика программы
        List<Question> questions; // Лист вопросов
        List<Answer> Answers; // лист ответов
        Elements bt; // массив кнопок - переключателей
        Elements ch; // массив чеков
        List<int> rez = new List<int>(); // лист с баллами
        int sumbal = 0, sumbal_temp = 0,  itog=0; // счетчик баллов, счетчик предидущих баллов, итоговый балл
        XDocument xDoc = XDocument.Load(path); // Загружаем данные из XML
 
        public Form2()
        {
            InitializeComponent();
        }
 
        private void Form2_Load(object sender, EventArgs e)
        {
            button1.Visible = false;
            questions = new List<Question>(); //Создаем новый лист вопросов
            Answers = new List<Answer>(); // Создаем новый лист ответов
 
            foreach (XElement it in xDoc.Root.Elements(Nodes.Question)) // получаем вопросы
            {
                if (it.Attribute(Nodes.IDQ).Value == "4") break; // У нас вопросов 4, а нужно для первой части 3
                questions.Add(new Question { Id = Convert.ToInt32(it.Attribute(Nodes.IDQ).Value), 
                                             Text = it.Attribute(Nodes.TEXT).Value 
                                             });
            }
 
            foreach (XElement it in xDoc.Root.Elements(Nodes.Answer)) // получаем ответы
            {
                Answers.Add(new Answer { Id = Convert.ToInt32(it.Attribute(Nodes.IDA).Value), 
                                         rating = Convert.ToInt32(it.Attribute(Nodes.RATING).Value), 
                                         rating2 = Convert.ToInt32(it.Attribute(Nodes.RATING2).Value),
                                         answer = it.Value, 
                                         QuestionID = Convert.ToInt32(it.Attribute(Nodes.QiD).Value) 
                                       });
            }
            // MessageBox.Show("data is load successfully"); // Это для отладки получения данных из XML;
 
            ch = new Elements(3, this); //рисуем чеки
            bt = new Elements(questions.Count, this, Retry); // добавление кнопок переключателй снизу
            reDraw(); // Вызываем метод перерисовки элементов окна
            this.Width = ch.c[0].Width + 50; // Устанавливаем ширину окна по ширине 1-го чекбокса + 50 пикселей.
        }
 
        private void Retry(object sender, EventArgs e) // Метод переключения нижних переключателей
        {
            int button_num = int.Parse((sender as Button).Text); // Считываем какая кнопочка нажата
            indexator = (button_num - 1); // Индексатор ставим в положение нажатой кнопки
            for (int j = indexator; j < questions.Count; j++) // Делаем остальные кнопки не активными
            {bt.b[j].Enabled = false; }
            reDraw(); // Перерисовываем окно 
            if (button_num == 1) sumbal = 0; // если кнопка переключатель самая первая, то баллы обеуляем
            else sumbal = sumbal_temp; // иначе баллу присваиваем предидущий балл
 
        }
 
        private void reDraw() // Метод перерислвки окна
        {
            ch.c[0].Checked = false;
            ch.c[1].Checked = false; // Обнуляем чеки
            ch.c[2].Checked = false;
            label1.Text = questions[indexator].Text; // В лабел следующий вопрос
            var ans = Answers.Where(i => i.QuestionID == questions[indexator].Id).Select(n => n.answer); // Находим в листе отыеты для текущего вопроса
            int ans_i = 0;
            foreach (var item in ans)
            {
                ch.c[ans_i].Text = item; //Заполняем чеки ответами
                ans_i++;
            }
            bt.b[indexator].Enabled = true; // Нижний переключатель по порядку активируем
        }
 
        private void button4_Click(object sender, EventArgs e)
        {   
            sumbal_temp = sumbal; // присваеиваем текущие баллы переменной,чтобы при переключении обратно знать какой бал был до этого
            GlobalList.OutputText.Add("Вопрос: " + questions[indexator].Text); // В общий лист пишем текущий вопрос
            if (ch.c[0].Checked)
            {                           // проверка чеков
                sumbal += Answers.Where(i => i.answer == ch.c[0].Text).Select(i => i.rating).FirstOrDefault();
                GlobalList.OutputText.Add("Ответ: " + ch.c[0].Text); // В общий лист пишем текущий ответ
            }
            if (ch.c[1].Checked)
            {
                sumbal += Answers.Where(i => i.answer == ch.c[1].Text).Select(i => i.rating).FirstOrDefault();
                GlobalList.OutputText.Add("Ответ: " + ch.c[1].Text);
            }
            if (ch.c[2].Checked)
            {
                sumbal += Answers.Where(i => i.answer == ch.c[2].Text).Select(i => i.rating).FirstOrDefault();
                GlobalList.OutputText.Add("Ответ: " + ch.c[2].Text);
            }
            GlobalList.OutputText.Add("Балл: " + sumbal); // В общий лист пишем бал
 
            indexator++; //индексатор увеливиаем наодин
 
            if (indexator > questions.Count-1) // Если впросы кончились
            {
                File.WriteAllLines("test.txt", GlobalList.OutputText, Encoding.Default); // Пишем из общего листа всю информацию в файл
                rez.Add(sumbal); // Добавляем в лист с баллами баллы за первую часть теста
                sumbal = 0; // обнуляем баллы
                sumbal_temp = 0; // обнуляем предидущие баллы
                button1.Visible = true; 
                button4.Visible = false; // Прогрмма построена на двух формах, а не на трех, здесь кнопка далее это две кнопки друг на друге, когда первая часть теста кончается, кнопки меняются местами
                indexator = 0; // обеуялем индексатор для втрого теста
                for (int i = 0; i < questions.Count; i++)
                { 
                    Controls.Remove(bt.b[i]);
                    bt.b[i].Dispose();   // удаляем чеки
                }
                for (int i = 0; i < 3; i++)
                {
                    Controls.Remove(ch.c[i]); // удаляем кнопки
                    ch.c[i].Dispose();
                }
                questions.Clear();
                foreach (XElement it in xDoc.Root.Elements(Nodes.Question)) // получаем вопросы
                {
                    questions.Add(new Question
                    {
                        Id = Convert.ToInt32(it.Attribute(Nodes.IDQ).Value),
                        Text = it.Attribute(Nodes.TEXT).Value
                    });
                }
                label2.Text = "Вопросы второго уровня сложности"; // меняем текст в верхнем лейбл
                bt = new Elements(questions.Count, this, Retry); // создаем новый массив кнопок-переключателей
                textBox1.Visible = true; // отображаем текстбокс
            }
            reDraw(); // перерисовываем окно аод новые данные
            
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            sumbal_temp = sumbal; // получаем предидуший результат, вначале 0
            if (textBox1.Text == Answers.Where(i => i.QuestionID.Value == indexator + 1).
                                         Where(i => i.rating2 == 10).
                                         Select(i => i.answer).
                                         FirstOrDefault()) // находим id вопросf, получаем ответы для этого вопроса, сравниваем текст в ттекстбоксе с правильным ответом
            {
                sumbal += Answers.Where(i => i.QuestionID.Value == indexator + 1).
                                         Where(i => i.rating2 == 10).
                                         Select(i => i.rating2).
                                         FirstOrDefault();  //если такой ответ есть находим баллы для этого ответа и прибалляем к общим баллам
            }
            textBox1.Text = ""; // очизаем текстбокс
            indexator++; // Индекстор увеличиваем на 1
            if (indexator > questions.Count - 1) // Если вопросы кончились
            {
                rez.Add(sumbal);//добавляем в лист баллы за второй этап
                indexator = 0;
                itog = rez.Sum(); // суммируем баллы
                button2.Visible = true; // показываем кнопку результат
                button1.Enabled = false; // скрываем кнопку далее
            } 
            reDraw(); // перерисовка окна под текущие данные
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(string.Format("Тест закончен. Вы получили {0}", itog)); // Показ накопленных баллов
        }
    }
Вложения
Тип файла: rar test2.rar (141.2 Кб, 151 просмотров)
3
0 / 0 / 0
Регистрация: 10.05.2014
Сообщений: 3
11.01.2015, 09:11  [ТС]
Prog_maker, спасибо огромное! Только можно ли сделать в одну папку?
Количество вопросов и было не ограничено, там каждый вопрос отмеряется количеством строк, которые он занимает в текстовике:
C#
1
kol = n / 7;
Оценка у меня считалась сначала в процентах (соотношение максимального балла и полученного), а потом в зависимости от процента отдельно оценка высчитывается. Вот этот кусок:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int sum = 0, summax = 0;
            double rezult, rez1;
            for (int j = 0; j < kol; j++)
            {
                sum += Test[j].rez;
                summax += Test[j].rezmax;
            }
            rez1 = 0;
            rezult = (double)sum / summax * 100;
 
            if (rezult < 30) rez1 = 2;
            else if (rezult < 60) rez1 = 3;
                else if (rezult < 79) rez1 = 4;
                    else if (rezult > 80) rez1 = 5;
 
            MessageBox.Show("Тест закончен. Вы получили " + Convert.ToString(rez1));
На вопросы не следовало обращать внимание, я их планировала переделать. =) В сумме должно быть 19 вопросов. И возможно, вы знаете, можно ли добавить несколько правильных вариантов (с маленькой буквы/с большой, например).
Таймер высчитывает время на задание, у меня стояло 40 минут, кто не успел - тот опоздал, в общем.
И еще не нашла откуда берутся вопросы, поменяла в дебаг вторую часть и вопросы остались те же.
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
11.01.2015, 10:31
Вопросы прописаны XML файле, лежит рядом с exe.

Цитата Сообщение от katrindakatrin Посмотреть сообщение
(с маленькой буквы/с большой, например)
конечно можно, прописать их с большой буквы XML файле и все

Добавлено через 1 минуту
Сегодня если время будет добавлю таймер, оценку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2015, 10:31
Помогаю со студенческими работами здесь

Прошивка из двух частей
Здравствуйте, есть исходники + прошивка одного девайса с камнем STM32F4 (конкретная модель неважна), есть разъем USB подключенный к USB_FS....

Переименование файлов с использованием частей слов, составляющих их старые имена
Прошу подсказать способ (а лучше – программный продукт), позволяющий выполнять в Windows 7 и выше групповое переименование файлов с...

Регистрационная форма из двух частей
Всем привет. Задача, чтобы логин+пасс падали в одну таблицу, остальное инфо падало в другую. Первая часть выполняется, вторая нет. ...

Заголовок товара из двух частей
Здравствуйте! есть ли решение, как можно реализовать возможность задавать заголовок товара в админке в двух полях? Это нужно для того,...

синхронизация двух частей таблицы
Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, есть две связанных между собой таблицы &quot;СТАЖ СОТРУДНИКОВ(ВСЕ)&quot; и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru