Консольная программа-тест - C#

Узнай цену своей работы

Формулировка задачи:

Доборого времени суток! Есть задача создать программу тест.
Напишите универсальную программу тестирования. Тест, последовательность вопросов и варианты ответов должны находиться в текстовом файле. Имя файла теста программа должна получать из командной строки запуска программы. Количество вопросов теста неограничено. Вместе с тем, предлагается ввести следующее ограничение: текст вопроса и альтернативных ответов не должен занимать более одной строки экрана. Программа должна выставлять оценку по следующему правилу: ОТЛИЧНО — за правильные ответы на все вопросы, ХОРОШО — если испытуемый правильно ответил не менее чем на 80% вопросов, УДОВЛЕТВОРИТЕЛЬНО — если правильных ответов более 60%, и ПЛОХО — если правильных ответов меньше 60%. Ниже приведена рекомендуемая структура файла вопросов теста (Ni — количество альтернативных ответов к i-ому вопросу, Ki, — номер правильного ответа), пример файла теста и вид экрана во время работы программы (номера ответов, введенные пользователем, выделены полужирным шрифтом).
Вопрос1 N1 M1 Ответ ... Ответ Вопрос2 N2 М2 Ответ ... Ответ ...... Вопроc(k) Nk Мk Ответ ... Ответ
Архитектор Исаакиевского собора 3 2 1.Доменико Трезини 2.Огюст Монферран 3.Карл Росси Архитектор Зимнего дворца 2 2 1.Франческо Бартоломее 2.Огюст Монферран Невский проспект получил свое название 3 2 1.По имени реки, на которой стоит Санкт-Петербург. 2.По имени близко расположенного монастыря, Александро-Невской лавры. 3.В память о знаменитом полководце — Александре Невском.
Сейчас Вам будет предложен тест. К каждому вопросу дается несколько вариантов ответов. Вы должны ввести номер правильного ответа и нажать клавишу <Enter> Архитектор Исаакиевского собора: 1. Доменико Трезини 2. Огюст Монферран 3. Карл Росси ->

2

Архитектор Зимнего дворца: 1. Франческо Бартоломее 2. Карл Росси ->

2

Невский проспект получил свое название: 1. По имени реки, на которой стоит Санкт-Петербург. 2. По имени близко расположенного монастыря, Александро- Невской лавры. З. В память о знаменитом полководце — Александре Невском. ->

2

Ваша оценка ОТЛИЧНО! Для завершения работы программы нажмите <Enter>
Далее следует код написанный мною. Суть проблем: 1. По непонятным мне причинам выскакивает NullReferenceException(следовательно, как обработать тоже не понимаю) 2. Нужно еще обработать FormatExeption и FileNotFoundExeption
Console.WriteLine("Введите путь к файлу теста:");
            string s = Console.ReadLine();
            StreamReader sr = new StreamReader(@s, Encoding.Default);
            int count = File.ReadAllLines(@s).Length / 2;
            Console.WriteLine("Сейчас Вам будет предложен тест.\nК каждому вопросу дается несколько вариантов ответов.\nВы должны ввести номер правильного ответа и нажать клавишу <Enter>");
            Console.WriteLine("Для продолжения нажмите любую клавишу");
            Console.ReadKey();
            Console.WriteLine();
            string line;
            int kst_varantiv = 0;
            int nPrav = 0;//номер правильного ответа
            int vybor = 0;
            double vidpov = 0;
            double kst_pitan = 0;
            double result = 0;
            for (int i = 1; i < count; )
            {
                line = sr.ReadLine();
                if (line.Length == 3)
                {
                    kst_pitan++;
                    kst_varantiv = int.Parse(line[0].ToString());   //обработка числовых указаний
                    nPrav = int.Parse(line[2].ToString());
                    for (int l = 1; l <= kst_varantiv; l++)//вывод вариантов ответов
                    {
                        Console.WriteLine(sr.ReadLine());
                        if (l == kst_varantiv)//перед завершением цикла считываем выбор пользователя
                        {
                            vybor = Convert.ToInt32(Console.ReadLine());
                           if (vybor > kst_varantiv && vybor < 1)
                            {
                                while (vybor > kst_varantiv && vybor < 1)
                                {
                                    Console.WriteLine("Ошибка ввода. Вводите только числа от 1 до {0}", kst_varantiv);
                                    vybor = Convert.ToInt32(Console.ReadLine());
                                }
                            }
                            if (vybor == nPrav)
                            {
                                vidpov++;
                                i++;
                            }
                        }
                    }
                    continue;//пропускает вывод на экран числовых указаний
                }
                else//выводит вопрос
                {
                    Console.WriteLine(line);
                    i++;
                }
            }
            result = vidpov / kst_pitan;
            Console.WriteLine("Ваша оценка:");
            if (result == 1)
                Console.WriteLine("Отлично");
            else if (result >= 0.8 && result != 1)
                Console.WriteLine("Хорошо");
            else if (result >= 0.6 && result != 1 && result < 0.8)
                Console.WriteLine("Удовлетворительно");
            else if (result < 0.6)
                Console.WriteLine("Плохо");
            Console.ReadKey();
Заранее спасибо за помощь!

Решение задачи: «Консольная программа-тест»

textual
Листинг программы
try
            {
                string s = "test.txt";
                StreamReader sr = new StreamReader(@s, Encoding.Default);
                int count = File.ReadAllLines(@s).Length / 2;
                Console.WriteLine("Сейчас Вам будет предложен тест.\nК каждому вопросу дается несколько вариантов ответов.\nВы должны ввести номер правильного ответа и нажать клавишу <Enter>");
                Console.WriteLine("Для продолжения нажмите любую клавишу");
                Console.ReadKey();
                string line;
                int kst_varantiv = 0;
                int nPrav = 0;//номер правильного ответа
                int vybor = 0;
                double vidpov = 0;
                double kst_pitan = 0;
                double result = 0;
                for (int i = 1; i < count; )
                {
                    line = sr.ReadLine();
                    if (line!=null && line.Length == 3)
                    {
                        kst_pitan++;
                        kst_varantiv = int.Parse(line[0].ToString());   //обработка числовых указаний
                        nPrav = int.Parse(line[2].ToString());
                        for (int l = 1; l <= kst_varantiv; l++)//вывод вариантов ответов
                        {
                            Console.WriteLine(sr.ReadLine());
                            if (l == kst_varantiv)//перед завершением цикла считываем выбор пользователя
                            {
                                vybor = Convert.ToInt32(Console.ReadLine());
                                if (vybor > kst_varantiv && vybor < 1)
                                {
                                    while (vybor > kst_varantiv && vybor < 1)
                                    {
                                        Console.WriteLine("Ошибка ввода. Вводите только числа от 1 до {0}", kst_varantiv);
                                        vybor = Convert.ToInt32(Console.ReadLine());
                                    }
                                }
                                if (vybor == nPrav)
                                {
                                    vidpov++;
                                    i++;
                                }
                            }
                        }
                        continue;//пропускает вывод на экран числовых указаний
                    }
                    else//выводит вопрос
                    {
                        Console.Clear();
                        Console.WriteLine(line);
                        
                        i++;
                    }
                }
                result = vidpov / kst_pitan;
                Console.WriteLine("Ваша оценка:");
                if (result == 1)
                    Console.WriteLine("Отлично");
                else if (result >= 0.8 && result != 1)
                    Console.WriteLine("Хорошо");
                else if (result >= 0.6 && result != 1 && result < 0.8)
                    Console.WriteLine("Удовлетворительно");
                else if (result < 0.6)
                    Console.WriteLine("Плохо");
                Console.ReadKey();
            }
            catch (Exception)
            {
                Console.WriteLine("Произошла ошибка!");
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы