Skip to main content
GameDev.net gamedev.net
🔒 Locked

How to handle this problem

Started by TheScriptan Jan 21, 2013 at 4:45 PM 4 replies 2.5k views
Original Post
TheScriptan
TheScriptan

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 T
Zaoshi Kaba
Zaoshi Kaba

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

TheScriptan
TheScriptan

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 T
PKLoki
PKLoki

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.

Mercile55
Mercile55
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
pulpfist
pulpfist

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

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.