How to handle this problem

Started by
4 comments, last by pulpfist 11 years, 2 months ago

For example I have this code:


Console.Write("Write Your First Number: ");
                num1 = int.Parse(Console.ReadLine()); // If i write here 6/2 or just s,y program frozes and exits. How To Handle that?
                Console.Write("Write Your Operand: ");
                operand = Console.ReadLine(); // If i write here 6/2 or just s,y program frozes and exits. How To handle that
                Console.Write("Write Your Second Number: ");
                num2 = int.Parse(Console.ReadLine()); // If i write here 6/2 or just s,y program frozes and exits. How To Handle That?
                switch (operand) 
                {
                    case "+":
                        answer = num1 + num2;
                        break;
                    case "-":
                        answer = num1 - num2;
                        break;
                    case "*":
                        answer = num1 * num2;
                        break;
                    case "/":
                        answer = num1 / num2;
                        break;
                    default:
                        Console.Clear();
                        Console.WriteLine("You entered wrong operand. Press Any Key To Continue...");
                        Console.ReadLine();
                        Console.Clear();
                        Calc();
                        break;
                }

How can i handle this if switch default is not working? It's just frozes. I just want to make Console.WriteLine("You entered wrong key, try again");

Check out my blog or twitter for news how I am doing in the project "Learn Programming in 2 Years!". You can follow my progress, and help me! :)

My Projects:

"Learn Programming In 2 Years"

"Windows Tutorials"

"Ubuntu Tutorials"

My Games:

Moving@ IndieDB: http://www.indiedb.com/games/moving-rl

My Links:

My Blog: http://www.thescriptan.blogspot.com

My Twitter: https://twitter.com/TheScriptan

Advertisement

Most likely it throws exception, you'll have to use try{} catch{} block.

I will try, but i don't know much about try{} and catch{}

Check out my blog or twitter for news how I am doing in the project "Learn Programming in 2 Years!". You can follow my progress, and help me! :)

My Projects:

"Learn Programming In 2 Years"

"Windows Tutorials"

"Ubuntu Tutorials"

My Games:

Moving@ IndieDB: http://www.indiedb.com/games/moving-rl

My Links:

My Blog: http://www.thescriptan.blogspot.com

My Twitter: https://twitter.com/TheScriptan

It's generally a better idea to use int.TryParse(...) to parse numbers. That function returns false if the parse fails so you can take appropriate action. Only use int.Parse() if you can guarantee that the operation will succeed. In the case of user input, program defensively by using TryParse.

Visit http://www.mugsgames.com

Stroids, a retro style mini-game for Windows PC. http://barryskellern.itch.io/stroids

Mugs Games on Twitter: [twitter]MugsGames[/twitter] and Facebook: www.facebook.com/mugsgames

Me on Twitter [twitter]BarrySkellern[/twitter]

There are parsers, i.e. lex and yacc that would help you to create proper parser, but if you want to do it from scratch, all by yourself, then go ahead.

Instead of doing it step by step / token by token, allow user to type if entire formula, i.e. 5+5/2
Then tokenize entered text, by splitting it into functional entities, and verify its structure, rejecting when suspicious.
i.e.
1. 5
2. +
3. 5
4. /
5. 2
(if you want to handle proper operation order, like *, /, +, -, then make sure that you order entities properly. RPN is the best choice of notation, which orders entities in a simple stack format)
then do the operations in the proper order, between the entities.
i.e.
3,4,5: 5 / 2 => 2.5 and gives:
1. 5
2. +
3. 2.5
... etc

I would make a loop so that the program continues. Also, if you make functions that will continue to ask for input until the input is valid, you don't really need a default


class Program
{
    static int GetOperand(string title)
    {
        int operand;
        while (true)
        {                
            Console.Write(title + "\n> ");
            if (int.TryParse(Console.ReadLine(), out operand))                
                break;                
            else Console.WriteLine("Invalid input. Try again");
        }
        return operand;
    }

    static string GetOperator(string title)
    {
        string op;
        while (true)
        {
            Console.Write(title + "\n> ");
            op = Console.ReadLine();
            if (op == "+" || op == "-" || op == "*" || op == "/")
                break;
            else Console.WriteLine("Invalid input. Try again");
        }
        return op;
    }

    static void Main(string[] args)
    {
        int num1, num2, answer=0;
        string op;
        while (true)
        {
            num1 = GetOperand("Write Your First Number");                                
            op = GetOperator("Write Your Operand");
            num2 = GetOperand("Write Your Second Number");                                
            switch (op)
            {
                case "+":
                    answer = num1 + num2;
                    break;
                case "-":
                    answer = num1 - num2;
                    break;
                case "*":
                    answer = num1 * num2;
                    break;
                case "/":
                    answer = num1 / num2;
                    break;                    
            }
            Console.WriteLine("Answer is " + answer.ToString());
        }
    }
}

edit: Don't forget to check for division by zero. If the denominator is zero, your program will crash

edit2: For a more flexible design, search for "reverse polish notation", as Mercile55 mentioned

This topic is closed to new replies.

Advertisement