Trumpkin
Trumpkin

Reputation: 11

How to have multiple argument's in a C# if statement

[That title may be wrong for the question, please inform me if so]

I'm coding a little maths quiz in C#, and I was wondering how to make an if statement that says something similiar to:

"if the user responds with 'this' or ' this' { do blahblahblah }

But I don't know how to say the OR bit in C#, I looked through the C# operators page, but kind of got lost in the technical jargon (I'm a rookie).

This is what I have so far:

Console.WriteLine("What is 200 / 5?");

string sFirstAnswer = Console.ReadLine();

if (sFirstAnswer == "40" || " 40")
{
    sUser1Score++;

    Console.WriteLine("\n Correct, 200 / 5 = 40. You have been awarded 1 point.");

    Console.ReadLine();
}

Upvotes: 0

Views: 328

Answers (6)

Icepickle
Icepickle

Reputation: 12796

I thought I might give an (over-the-top) example of what I meant to make it a bit more Dynamic

A few classes now help to ask you the questions, and with a few functions built around it, you can easily show your questions in a menu format, and then ask the question, with random nr's (only whole number division was a bit more annoying :))

You could make it easier that the Generate method limits the range a bit more, but I just thought I wanted to give you an idea of how it could look like

using System;
using System.Collections.Generic;

namespace MathQuiz
{
    class Program
    {
        interface IExercise
        {
            string Title { get; }
            void Generate();
        }

        abstract class Exercise<TResult> : IExercise
        {
            public virtual string Title
            {
                get
                {
                    return "Exercise";
                }
            }

            public abstract bool isCorrect(TResult reply);

            public abstract TResult Solve();

            public abstract bool TryParse(string value, out TResult result);

            public abstract void Generate();
        }

        abstract class ExerciseWith2Items<TSource, TResult> : Exercise<TResult>
        {
            public virtual TSource Item1 { get; set; }
            public virtual TSource Item2 { get; set; }

            public abstract string Operator { get; }

            public override string ToString()
            {
                return string.Format("{0} {1} {2}", Item1, Operator, Item2);
            }
        }

        abstract class WholeNumberExercise : ExerciseWith2Items<int, int>
        {
            public override void Generate()
            {
                Random next = new Random();
                Item1 = next.Next(100) + 15;
                Item2 = next.Next(100) + 15;
            }

            public override bool TryParse(string value, out int result)
            {
                return int.TryParse(value, out result);
            }
        }

        class Division : WholeNumberExercise
        {
            protected bool IsPrime(int nr)
            {
                int max = (int)Math.Sqrt(nr);
                if (nr <= 2)
                {
                    return true;
                }
                for (int i = 2; i < max; i++)
                {
                    if (nr % i == 0)
                    {
                        return false;
                    }
                }
                return true;
            }

            public override int Item1
            {
                get
                {
                    return base.Item1;
                }
                set
                {
                    // primes cannot be divived, so increase the value until we don't have a prime
                    while (IsPrime(value))
                    {
                        value++;
                    }
                    base.Item1 = value;
                }
            }

            public override int Item2
            {
                get
                {
                    return base.Item2;
                }
                set
                {
                    if (value <= 0)
                    {
                        // minimum 2
                        value = 2;
                    }
                    // small override: we only want whole number division, so change the nr to the closest nr that has no rest after division
                    int closest = 0;
                    while ((value - closest > 1 && Item1 % (value - closest) != 0) ||
                        (value + closest < Item1 && Item1 % (value  + closest) != 0))
                    {
                        closest++;
                    }
                    // in case closest == 0, it doesn't really change anything
                    if (Item1 % (value - closest) == 0)
                    {
                        value -= closest;
                    }
                    else
                    {
                        value += closest;
                    }
                    base.Item2 = value;
                }
            }

            public override string Operator
            {
                get { return "/"; }
            }

            public override bool isCorrect(int reply)
            {
                return reply == (Item1 / Item2);
            }

            public override void Generate()
            {
                Random r = new Random();
                Item1 = r.Next(500) + 100;
                Item2 = r.Next(50) + 2;
            }

            public override int Solve()
            {
                return (Item1 / Item2);
            }
        }

        class Multiplication : WholeNumberExercise
        {
            public override string Operator
            {
                get { return "*"; }
            }

            public override bool isCorrect(int reply)
            {
                return reply == (Item1 * Item2);
            }

            public override int Solve()
            {
                return (Item1 * Item2);
            }
        }

        class Addition : WholeNumberExercise
        {
            public override string Operator
            {
                get { return "+"; }
            }

            public override bool isCorrect(int reply)
            {
                return reply == (Item1 + Item2);
            }

            public override int Solve()
            {
                return (Item1 + Item2);
            }
        }

        class Subtraction : WholeNumberExercise
        {
            public override string Operator
            {
                get { return "-"; }
            }

            public override bool isCorrect(int reply)
            {
                return reply == (Item1 - Item2);
            }

            public override int Solve()
            {
                return (Item1 - Item2);
            }
        }

        static IExercise ShowMenu(IList<IExercise> exercises)
        {
            int menu;

            do
            {
                Console.Clear();
                Console.WriteLine("Test your match skills :)\r\n");
                for (int i = 0; i < exercises.Count; i++)
                {
                    Console.WriteLine("\t{0}\t{1}", i, exercises[i].GetType().Name);
                }
                Console.WriteLine("\r\n\t99\tExit\r\n");
                Console.Write("Please enter your choice: ");
                if (!int.TryParse(Console.ReadLine(), out menu))
                {
                    // wrong input
                    menu = -1;
                }
                if (menu != 99)
                {
                    if (menu >= exercises.Count)
                    {
                        menu = -1;
                    }
                }
            }  while (menu < 0);

            IExercise result = null;

            if (menu != 99)
            {
                result = exercises[menu];
            }

            return result;
        }

        static void Solve(IExercise exercise)
        {
            if (exercise == null)
            {
                return;
            }
            if (!(exercise is WholeNumberExercise))
            {
                Console.WriteLine("Don't know how to solve this exercise, please contact developer :)");
                Console.ReadLine();
                return;
            }
            var solvable = exercise as WholeNumberExercise;
            solvable.Generate();
            Console.Write("{0}: '{1}' = ", solvable.GetType().Name, exercise);
            int reply;
            bool validAnswerGiven;
            do
            {
                validAnswerGiven = solvable.TryParse(Console.ReadLine(), out reply);
                if (validAnswerGiven)
                {
                    if (solvable.isCorrect(reply))
                    {
                        Console.WriteLine("Correct!");
                    }
                    else
                    {
                        Console.WriteLine("Incorrect, the correct result is {0}", solvable.Solve());
                    }
                }
                else
                {
                    Console.WriteLine("Please enter valid value (whole number)!");
                }
            } while (!validAnswerGiven);
            Console.ReadLine();
        }

        static void Main(string[] args)
        {
            IList<IExercise> potentialExercises = new List<IExercise>()
            {
                new Addition(),
                new Subtraction(),
                new Division(),
                new Multiplication() 
            };

            IExercise selectedExercise;
            do
            {
                selectedExercise = ShowMenu(potentialExercises);
                Solve(selectedExercise);
            } while (selectedExercise != null);

            Console.WriteLine("Program completed!");
        }
    }
}

it is runnable code, so copy and paste in visual studio console project should do the trick ;)

Upvotes: 1

BlackjacketMack
BlackjacketMack

Reputation: 5692

Since you're validating an answer from an equation, you want to Parse it and get it into a numeric form pronto.

var answer = Convert.ToInt32(sFirstAnswer.Trim());

var expected = 40;

if(answer == expected){
//gold ribbon
}

Upvotes: 0

kmcnamee
kmcnamee

Reputation: 5255

In addition to the above you could also try to convert the string to an integer

int number = 0
bool result = Int32.TryParse(Console.ReadLine(), out number);

if (number== 40){

...
}

number will be 0 if conversion fails to int and result false but for your case you dont care its not 40...

MSDN Int TryParse

Upvotes: 0

Andy Nichols
Andy Nichols

Reputation: 3002

You can create a list of allowed answers and then check it's in the list.

var correctFirstAnswers = new List<string>{"40", " 40"};
if (correctFirstAnswers.Contains(sFirstAnswer))

this is more readable than || when there are multiple possible answers.

Upvotes: 1

Jonathan Kittell
Jonathan Kittell

Reputation: 7493

if (sFirstAnswer == "40" || sFirstAnswer == "40")

Upvotes: 1

Andrew
Andrew

Reputation: 5083

Write

if (sFirstAnswer == "40" || sFirstAnswer == " 40")

or better yet, trim the answer:

if (sFirstAnswer.Trim() == "40")

Upvotes: 7

Related Questions