Хочу сделать тест в консоли, но при всех правильных ответах выдает только 4 балла(из 10). В чем заключается ошибка?
Хочу сделать тест в консоли(так как мои навыки в c# не позволяют сделать большего) и при выполнении кода все работает прекрасно за исключением того что засчитываются только 3 вопроса. Как избежать ошибки? else if пробовал. Аж страшно стало 
Вот мой код:
using System;
namespace second
{
class Program
{
static void Main() {
byte i = 0;
System.Console.Write("вопрос на 1 балл. 1 - прав. ответ 2 - неправ. ответ: ");
byte a = Convert.ToByte(System.Console.ReadLine());
if(a == 1){
i++;
System.Console.WriteLine(i);
}
System.Console.Write("вопрос на 2 балла. 1 - прав. ответ 2 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 1){
i+=2;
System.Console.WriteLine(i);
}
System.Console.Write("вопрос на 3 балла. 2 - прав. ответ 1 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 2){
i+=3;
System.Console.WriteLine(i);
}
System.Console.Write("вопрос на 4 балла. 1 - прав. ответ 2 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 1){
i+=4;
System.Console.WriteLine(i);
}
System.Console.Write("вопрос на 5 баллов. 2 - прав. ответ 1 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 2){
i+=5;
System.Console.WriteLine(i);
}
System.Console.Write("вопрос на 6 баллов. 2 - прав. ответ 1 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 2){
i+=6;
System.Console.WriteLine(i);
}
System.Console.Write("вопрос на 7 баллов. 1 - прав. ответ 2 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 1){
i+=7;
}
System.Console.Write("вопрос на 8 баллов. 2 - прав. ответ 1 - неправ. ответ: ");
System.Console.ReadLine();
if(a == 2){
i+=8;
}
byte d = i;
if(d == 36)
System.Console.WriteLine("10 баллов!");
else if(d >=32 && d <= 35)
System.Console.WriteLine("9 баллов");
else if(d >=29 && d <= 31)
System.Console.WriteLine("8 баллов");
else if(d >=25 && d <= 28)
System.Console.WriteLine("7 баллов");
else if(d >=21 && d <= 24)
System.Console.WriteLine("6 баллов");
else if(d >=17 && d <= 20)
System.Console.WriteLine("5 баллов");
else if(d >=13 && d <= 16)
System.Console.WriteLine("4 балла");
else if(d >=9 && d <= 12)
System.Console.WriteLine("3 балла");
else if(d >=5 && d <= 8)
System.Console.WriteLine("2 балла");
else if(d >=3 && d <= 4)
System.Console.WriteLine("1 балл");
else if(d >=0 && d <= 2)
System.Console.WriteLine("0 баллов");
}
}
}
Ответы (1 шт):
В вашем коде, слошком много копируещегося кода, делающего по сути одно и тоже. Советую выделить метод MakeQuestion который выведет вопрос в консоль считает ответ, и в случае если он правильный - начислит баллы. Это сильно поможет избежать ошибок при копировании кода.
Так же лучше использовать содержательные названия для переменных, это поможет тем, кто читает ваш код, быстрее разобраться в нем, да и вам самим в будущем.
И да, иногда есть возможность найти математический смысл того, что вы хотите сделать, не используя кучу ветвлений.(последняя строка в Main)
using System;
namespace second
{
class Program
{
static int score = 0;
static void MakeQuestion(string question, string correctAnswer, int additionScore)
{
Console.Write($"вопрос на {additionScore} балл. ");
Console.Write(question);
string answer = Console.ReadLine();
if (answer == correctAnswer) score += additionScore;
Console.WriteLine(score);
}
static void Main()
{
MakeQuestion("1 - прав. ответ 2 - неправ. ответ: ", "1", 1);
MakeQuestion("1 - прав. ответ 2 - неправ. ответ: ", "1", 2);
MakeQuestion("2 - прав. ответ 1 - неправ. ответ: ", "2", 3);
MakeQuestion("1 - прав. ответ 2 - неправ. ответ: ", "1", 4);
MakeQuestion("2 - прав. ответ 1 - неправ. ответ: ", "2", 5);
MakeQuestion("2 - прав. ответ 1 - неправ. ответ: ", "2", 6);
MakeQuestion("1 - прав. ответ 2 - неправ. ответ: ", "1", 7);
MakeQuestion("2 - прав. ответ 1 - неправ. ответ: ", "2", 8);
Console.WriteLine((int)(score / 3.6));
}
}
}