Сопоставление ответа на C#

так что у меня есть этот вопрос:

"1. The word 'virile' means what?\na. Like a rabbit\nb. Like a man\nc. Like a wolf\nd. Like a horse\n" As you can see its one string separated with \n for each choice . (a , b , c , d )

поэтому я написал код, чтобы проверить, где находится ответ, будь то a, b, c или d

ans = "Like a man";
if (data.Content.StartsWith("a") && data.Content.Contains(ans))
{
    Reply("a");
}
else if (data.Content.StartsWith("b") && data.Content.Contains(ans))
{
    Reply("b");
}
else if (data.Content.StartsWith("c") && data.Content.Contains(ans))
{
    Reply("c");
}
else if (data.Content.StartsWith("d") && data.Content.Contains(ans))
{
    Reply("d");
}

Мне ставят «пятерку», так как это ответ. Я знаю, почему, потому что я использую Startwith, что неправильно, потому что (data.content) начинается с вопроса, так как его одна строка.

мой вопрос: как я могу заставить программу искать любое совпадение в вопросе для моего ответа, а затем писать, что это было a, b, c или d

Я не знаю, что у вас есть data.Content, так что насчет того, чтобы сделать Split в вашем вопросе, и индексы с 1 по 4 являются вашими ответами, а затем просто выполните сопоставление с вашими ответами

João Silva 09.04.2018 17:43

так что я должен разделить строку, тогда я ищу a, b, c, d?

rami_ahmed 09.04.2018 17:46

если у вас есть доступ к вопросу, я бы разделил вопрос на \ n, а затем на for от индекса 1 до <5 и проверял, какой из них содержит ответ. Можете ли вы сказать нам, какого типа ваши данные?

João Silva 09.04.2018 17:50

не могли бы вы написать, как я использую метод разделения в моем случае, если у вас есть время? <3

rami_ahmed 09.04.2018 17:50

мои данные в строке типа

rami_ahmed 09.04.2018 17:51

проверь, помогло ли тебе то, что я написал

João Silva 09.04.2018 17:59

Вы почему-то обязаны так ставить вопрос? Есть гораздо лучшие способы создать опрос / викторину.

Rufus L 09.04.2018 18:06

да, это очень помогает, спасибо всем <3

rami_ahmed 12.04.2018 13:42

@RufusL как? идея состоит в том, чтобы подождать (data.content), чтобы задать вопрос, и моя программа попытается найти ответ, если это был a, b, c или d

rami_ahmed 12.04.2018 13:44

Я бы создал один класс для представления вопроса и возможных ответов, а другой класс для хранения всех вопросов и задания их пользователю (и ведения счета). Выложу пример ...

Rufus L 12.04.2018 17:10

Я предлагаю, если вы нашли какой-либо из ответов полезным, нажимайте стрелки вверх рядом с ними, чтобы дать респонденту (который добровольно потратил свое время, чтобы помочь вам) баллы, особенно принятый ответ.

Peter Campbell 05.06.2018 16:23

Я сделал это давным-давно, но все еще есть проблема, не знаю, почему

rami_ahmed 07.06.2018 14:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
413
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Проверьте, помогает ли это вам.

private string question = "1. The word 'virile' means what?\na. Like a rabbit\nb. Like a man\nc. Like a wolf\nd. Like a horse\n"; // your question

string ans = "Like a man"; // your answer
string[] allAnswers = question.Split('\n');

   for (int i = 1; i < 5; i++) { // index 0 contains the question
       if (answers[i].Contains(ans)) {
            Reply(answers[i][0].ToString()); // toString since [0] returns the first char, in your case will be the answer.     
        }

    }
public char GetQuestionRef(string question, string answer)
{
    string[] answers = question.Split('\n');
    char question; 

    for(int i = 1; i < answers.Length; i++)
    {
        if (answers[i].Contains(answer))
        {
            question = answers[i].Substring(0, 1);              
        }
    }

    return question;
}
Ответ принят как подходящий

Возможно, это решение LINQ будет полезно:

string input = "1. The word 'virile' means what?\na. Like a rabbit\nb. Like a man\nc. Like a wolf\nd. Like a horse\n";
string[] inputSplit = input.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
string ans = "Like a man";
string result = new string(inputSplit.Where(x => x.Contains(ans))
                                     .Select(x => x[0]).ToArray());
Reply(result);

result = б

Другой способ сделать это - создать класс, содержащий свойства «элемента викторины», такие как вопрос, список возможных ответов и указатель правильных ответов. Мы также можем дать этому классу возможность задавать вопрос, отображать ответы, получать ответ от пользователя и затем возвращать истину или ложь, если ответ правильный.

Например:

public class QuizItem
{
    public string Question { get; set; }
    public List<string> PossibleAnswers { get; set; }
    public bool DisplayCorrectAnswerImmediately { get; set; }
    public int CorrectAnswerIndex { get; set; }

    public bool AskQuestionAndGetResponse()
    {
        Console.WriteLine(Question + Environment.NewLine);

        for (int i = 0; i < PossibleAnswers.Count; i++)
        {
            Console.WriteLine($" {i + 1}. {PossibleAnswers[i]}");
        }

        int response = GetIntFromUser($"\nEnter answer (1 - {PossibleAnswers.Count}): ",
            1, PossibleAnswers.Count);

        if (DisplayCorrectAnswerImmediately)
        {
            if (response == CorrectAnswerIndex + 1)
            {
                Console.WriteLine("\nThat's correct, good job!");
            }
            else
            {
                Console.WriteLine("\nSorry, the correct answer is: {0}",
                    $"{CorrectAnswerIndex + 1}. {PossibleAnswers[CorrectAnswerIndex]}");
            }
        }

        return response == CorrectAnswerIndex + 1;
    }

    // This helper method gets an integer from the user within the specified bounds
    private int GetIntFromUser(string prompt, int min, int max)
    {
        int response;
        do
        {
            Console.Write(prompt);
        } while (!int.TryParse(Console.ReadLine(), out response) ||
                 response < min || response > max);
        return response;
    }
}

Теперь, когда у нас есть класс, представляющий QuizItem, мы можем создать другой класс, представляющий сам Quiz. Этот класс будет иметь список элементов викторины, сможет представлять каждый элемент пользователю, сохранять ответы и отображать результаты викторины.

Например:

public class Quiz
{
    public Quiz(User user)
    {
        if (user == null) throw new ArgumentNullException(nameof(user));
        User = user;
        QuizItems = new List<QuizItem>();
    }

    public List<QuizItem> QuizItems { get; set; }
    public User User { get; set; }
    public DateTime StartTime { get; private set; }
    public DateTime EndTime { get; private set; }

    public void BeginTest()
    {
        Console.Clear();

        if (QuizItems == null)
        {
            Console.WriteLine("There are no quiz items available at this time.");
            return;
        }

        Console.WriteLine($"Welcome, {User.Name}! Your quiz will begin when you press a key.");
        Console.WriteLine($"There are {QuizItems.Count} multiple choice questions. Good luck!\n");
        Console.Write("Press any key to begin (or 'Q' to quit)...");
        if (Console.ReadKey().Key == ConsoleKey.Q) return;

        Console.SetCursorPosition(0, Console.CursorTop);
        Console.Write(new string(' ', Console.WindowWidth));
        Console.SetCursorPosition(0, Console.CursorTop - 1);

        var itemNumber = 1;
        StartTime = DateTime.Now;

        foreach (var item in QuizItems)
        {
            Console.WriteLine($"Question #{itemNumber}");
            Console.WriteLine("-------------");

            itemNumber++;
            var result = item.AskQuestionAndGetResponse();
            User.QuestionsAnswered++;
            if (result) User.CorrectAnswers++;
        }

        EndTime = DateTime.Now;
        var quizTime = EndTime - StartTime;

        Console.WriteLine("\nThat was the last question. You completed the quiz in {0}",
            $"{quizTime.Minutes} minues, {quizTime.Seconds} seconds.");

        Console.WriteLine("\nYou answered {0} out of {1} questions correctly, for a grade of '{2}'",
            User.CorrectAnswers, User.QuestionsAnswered, User.LetterGrade);
    }
}

Этот класс использует класс User, который используется для хранения имени пользователя и их результатов:

public class User
{
    public User(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
    public int QuestionsAnswered { get; set; }
    public int CorrectAnswers { get; set; }
    public string LetterGrade => GetLetterGrade();

    private string GetLetterGrade()
    {
        if (QuestionsAnswered == 0) return "N/A";

        var percent = CorrectAnswers / QuestionsAnswered * 100;

        if (percent < 60) return "F";
        if (percent < 63) return "D-";
        if (percent < 67) return "D";
        if (percent < 70) return "D+";
        if (percent < 73) return "C-";
        if (percent < 77) return "C";
        if (percent < 80) return "C+";
        if (percent < 83) return "B-";
        if (percent < 87) return "B";
        if (percent < 90) return "B+";
        if (percent < 90) return "A-";
        if (percent < 97) return "A";
        return "A+";
    }
}

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

Чтобы использовать эти классы, мы можем просто создать экземпляр нового класса Quiz, передать ему User, заполнить QuizItems и затем вызвать BeginTest:

private static void Main()
{
    Console.Write("Please enter your name: ");
    var userName = Console.ReadLine();

    var quiz = new Quiz(new User(userName));
    PopulateQuizItems(quiz);          
    quiz.BeginTest();

    GetKeyFromUser("\nDone!! Press any key to exit...");
}

Я поместил код для заполнения элементов викторины в отдельный метод, чтобы уменьшить беспорядок в методе Main. Прямо сейчас у него есть только ваш единственный вопрос:

private static void PopulateQuizItems(Quiz quiz)
{
    if (quiz == null) return;

    quiz.QuizItems.Add(new QuizItem
    {
        Question = "What does the word 'virile' mean?",
        PossibleAnswers = new List<string>
        {
            "Like a rabbit",
            "Like a man",
            "Like a wolf",
            "Like a horse"
        },
        CorrectAnswerIndex = 1,
        DisplayCorrectAnswerImmediately = true
    });
}

Тогда это выглядит примерно так:

Другие вопросы по теме