User Rating: 0 / 5

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive
 

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

Шаг 1: Постановка задачи

Создадим еще одно поле формы, в котором будет хранится количество примеров для тестирования. Допустим будем задавать по 50 примеров.

int qolPrimerov=50; // количество примеров

Это же количество будет равняться количеству правильных решений примеров, потому что тестирование будет закончено, когда игрок правильно решит все 50 примеров. Если на это ему потребуется 50 попыток, это будет 100%-ный результат.

Количество неправильных ответов будем хранить в поле

int qolNepravilno;//количество неправильных ответов

Если игрок вводил неправильные ответы, то результат или оценка будет

ocenka= qolPrimerov /( qolPrimerov + qolNepravilno)*100;


Нам также необходимо организовать подсчет количества решенных примеров.

К сожелению невозможно это организовать с помощью циклов, так как переменная-счетчик цикла будет терять свое значение при выходе из процедуры, в которой используется цикл. Поэтому создадим еще одно поле для формы


int numberPrimera;//Количество решенных примеров


Шаг 2: Выбор процедуры для реализации и задачи

В некоторой процедуре будем сравнивать numberPrimera  и qolPravilno для завершения работы программы.

Для этой цели подойдет уже написанная нами процедура обработки нажатия клавиш. Но придется внести некоторые изменения.


Шаг3: Внесение изменеий в код

Посмотрите блок-схему. Желтым выделены блоки которые нам предстоит добавть в процедуру.



Вот как выглядит код:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

{

try

{

//если нажата ентер

if (e.KeyChar == (char)Keys.Enter)

{//проверяем правильность решения

if (a + b == Convert.ToInt32(textBox1.Text))

{//если правильный ответ

numberPrimera ++;

if (numberPrimera < qolPrimerov)

{//очищаем текстовое поле и устанавливаем на него курсор

textBox1.Text = "";

textBox1.Focus();

button1_Click(sender, e);//задаем следующий пример

}

else

{

itogi();//Процедура завершения работы программы

}

}

else

{

MessageBox.Show("Не правильно");

qolNepravilno++;

textBox1.SelectAll();

}

}

}//end try


catch

{

MessageBox.Show("Разрешено вводить только цифры");

textBox1.SelectAll();

}


}


Здесь также желтым подсвечены строки реализующие желтые блоки блок-схемы.


Шаг 3: Операции инремента и декремента.

Оператор qolNepravilno++ представляет собой краткую форму записи qolNepravilno= qolNepravilno+1

Соответственно для qolNepravilno-- краткая форма для qolNepravilno= qolNepravilno-1

Есть также такая форма записи ++ qolNepravilno;

Операторы типа qolNepravilno++ называются постфиксными, а операторы типа ++ qolNepravilnoпрефиксными. Если префиксный оператор встретится в сложном выражении, то сначала переменная изменяется на 1, и далее передается в выражение.

Например, пусть х=1, тогда ++х+10 возвратит 12, а х++ +10 возвратит 11, а сам х в обоих случаях станет равен 2.

Операции увеличивающие значение переменной на 1, называются операциями инкремента, а уменьшающие на 1 – декремента.

Шаг 4: Написание процедуры завершения работы программы.

Процедура завершения работы программы вынесена в метод itogi().

Вынесение блоков кодов в самостоятельные методы – это хорошая идея. Это позволяет не нагромождать код, и легко вносить в него изменения. Например, сейчас мы создадим временный код для метода itogi(). Он будет выводить результат теста в окне MessageBox, и необходим также для тестирования нашего кода. Если мы видим, что в окне MessageBox отображаются ошибочные результаты, значит где-то мы совершили ошибку.

Но в дальнейшем мы планируем записывать результаты в файл. Тогда мы просто изменим код метода itogi(), а процедура textBox1_KeyPress останется без изменений.


Итак, метод itogi():

private void itogi()

{

float ocenka;

ocenka = (float)qolPrimerov / (qolPrimerov + qolNepravilno) * 100;

MessageBox.Show("Неправильных ответов:" + qolNepravilno.ToString () +"." +"\n" +"Оценка:" + ocenka.ToString());

}

Шаг 5: Явное приведение типов

Обратите внимание для переменной ocenka я выбрал тип не int, а float, потому что она будет содержать дробное число. И в самой формуле обратите внимание на float:

ocenka = (float)qolPrimerov / (qolPrimerov + qolNepravilno) * 100;

Попробуйте убрать (float). Вы будете всегда получать оценку 0, если хоть один ответ неправильный. Почему так происходит?

Потому что qolPrimerov и qolNepravilno имеют целый тип. И если выполняется арифметическая операция содержащая операнды определенного типа, то и результат операции будет того же типа. В нашем случае результат выражения qolPrimerov / (qolPrimerov + qolNepravilno) всегда будет находиться в пределах от 0 до 1. А так как результат должен быть целым числом, то будет получен либо 0, либо 1. Дальше умножаем на 100 и получаем либо 0, либо 100, что является не тем результатом, который нам необходим.

Поэтому мы испоьзуем явное приведение к типу float. Достаточно привести один из операндов к типу float и все выражение будет приведено к этому типу.


Шаг 6:Работа со строками

Теперь поговорим о строках. Метод MessageBox.Show использует в качестве параметра строку, которая отображается в текстовом сообщении. Здесь мы использовали несколько способов задания строки:

  • В двойных кавычках
  • Приведением числового типа в строковый с помощью метода ToString
  • Использовали специальные символы форматирования


Специальные символы форматирования начинаются с обратного слеша.
Если компилятор обнаружит в двойных кавычках обратный слеш, то следующий за ним символ он интерпретирует как показано ниже.

\t

Соответствует символу табуляции

\r

Соответствует символу возврата каретки

\n

Соответствует символу новой строки

\e

Соответствует символу escape


Шесть фрагментов строк я объединил в одну с помощью оператора +.


Подведем итоги


  • Узнали об операции инкремента и декремента (шаг3)
  • Узнали о явном приведении типов (шаг 5)
  • Узнали о способах задания строк и спецсимволов форматирования (шаг 6)
  • Узнали как объединять несколько строк в одну (шаг 6)