Создать n наборов тестов - C#

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

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

"Тесты". Преподавателю необходимо создать n наборов тестов. В каждом наборе должны быть представлены вопросы разной тематики, по возможности равномерно. У преподавателя составлен общий список вопросов, упорядоченный по их названиям. Помогите преподавателю распределить вопросы по тестам. Указание: тематику вопросов следует задать перечислением. Следует определить класс Question, среди полей которого будет поле theme, заданное перечислением.

Решение задачи: «Создать n наборов тестов»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace TestCreator
{
    class Program
    {
        private static Random rand = new Random();
        private static List<Question> questions = new List<Question>();
        private static List<Test> tests = new List<Test>();
 
        static void Main(string[] args)
        {
            CreateQuestion(Question.Themes.Логика, "1");
            CreateQuestion(Question.Themes.Логика, "2");
            CreateQuestion(Question.Themes.Логика, "3");
            CreateQuestion(Question.Themes.Логика, "4");
            CreateQuestion(Question.Themes.Логика, "5");
            CreateQuestion(Question.Themes.Логика, "6");
 
            CreateQuestion(Question.Themes.МатАнализ, "1");
            CreateQuestion(Question.Themes.МатАнализ, "2");
            CreateQuestion(Question.Themes.МатАнализ, "3");
            CreateQuestion(Question.Themes.МатАнализ, "4");
            CreateQuestion(Question.Themes.МатАнализ, "5");
            CreateQuestion(Question.Themes.МатАнализ, "6");
 
            CreateQuestion(Question.Themes.ДискретМат, "1");
            CreateQuestion(Question.Themes.ДискретМат, "2");
            CreateQuestion(Question.Themes.ДискретМат, "3");
            CreateQuestion(Question.Themes.ДискретМат, "4");
            CreateQuestion(Question.Themes.ДискретМат, "5");
            CreateQuestion(Question.Themes.ДискретМат, "6");
 
 
            Console.Write("Сколько тестов создать? ");
            int count = int.Parse(Console.ReadLine());
 
            Console.Write("Количество вопросов в тесте: ");
            int qCount = int.Parse(Console.ReadLine());
 
            for (int i = 0; i < count; i++)
                CreateTest(qCount);
 
            int j = 0;
            foreach(var test in tests)
            {
                Console.WriteLine($"======Тест №{++j}=======");
                foreach (var question in test.questions)
                    Console.WriteLine($"Тема вопроса: {question.theme.ToString()}. Вопрос: {question.text}");
            }
 
            Console.ReadKey();
        }
 
        static void CreateQuestion(Question.Themes theme, string text)
        {
            var question = new Question();
            question.theme = theme;
            question.text = text;
 
            questions.Add(question);
        }
 
        static void CreateTest(int qCountInTest)
        {
            int qCount = qCountInTest / (int)Question.Themes.Макс;
            var test = new Test();
 
            int theme = (int)Question.Themes.Логика;
            for (int i = 0, temp = 0; i < qCountInTest; i++, temp++)
            {
                if (temp % qCount == 0 && temp > 0
                    && theme + 1 < (int)Question.Themes.Макс)
                    theme++;
 
                var question = GetRandomQuestionByTheme(test, (Question.Themes)theme);
                if (question == null)
                {
                    theme++;
                    continue;
                }
 
                test.questions.Add(question);
            }
 
            tests.Add(test);
        }
 
        static Question GetRandomQuestionByTheme(Test test, Question.Themes theme)
        {
            var qArray = questions.FindAll(x => x.theme == theme);
            if (qArray.Count == 0)
                return null;
 
            HashSet<Question> sQuestions = new HashSet<Question>();
            foreach (var question in qArray)
                sQuestions.Add(question);
 
            sQuestions.ExceptWith(test.questions.ToArray());
            if (sQuestions.Count == 0)
                return null;
 
            return sQuestions.ElementAt(rand.Next(0, sQuestions.Count - 1));
        }
    }
 
    public class Test
    {
        public HashSet<Question> questions = new HashSet<Question>();
    }
 
    public class Question : IComparable<Question>
    {
        public Themes theme { get; set; }
 
        public string text { get; set; }
 
        public int CompareTo(Question other)
        {
            return 1;
        }
 
        public enum Themes : int
        {
            Логика = 0,
            МатАнализ,
            ДискретМат,
            Макс
        };
    }
}

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


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

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

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