Andrew Heid
Andrew Heid

Reputation: 93

Case Switch with a loop

I am not understanding what is going on in my case statement to determine if I want to redo the users input. Should I make another loop outside of my while loop? I attempted such and my case statement becomes unreachable code. Maybe I am not understanding case-switch statements.

class Program
{
    static void Main(string[] args)
    {


        string _a = "";
        constructor con = new constructor();
        Console.WriteLine("Enter enter exit to end the program...");
        Console.WriteLine("Enter C for constructor, M for method, A for an array...");
        Console.WriteLine("Please reference source code to have full details and understanding...");
        bool control = true;
        while (control)
        {
            _a = Console.ReadLine();
            switch (_a.ToUpper())
            {

                case "EXIT":
                    Console.WriteLine("Thank you for using AJ's program...");
                    control = false;
                    break;
                case "C":
                    Console.WriteLine(con.a);
                    Console.WriteLine("Would you like to test another scenario?");
                    Console.ReadLine();
                    if (_a.ToUpper() == "Y")
                    {
                        Console.ReadLine();
                        return;

                    }
                    control = false;
                    break;
                case "M":
                    control = false;
                    metroid();
                    break;
                case "A":
                    control = false;
                    Array();
                    break;
                default: Console.WriteLine("No match");
                    break;
            }
        }
    }
    public class constructor
    {
        public string a = "This is a constructor!";
    }
    static public void metroid()
    {
        string b = "This is a method!";
        Console.WriteLine(b);
    }
    static public void Array()
    {
        try
        {
            Console.WriteLine("This is a random array. Please enter the size.");
            string sSize = Console.ReadLine();
            int arraySize = Convert.ToInt32(sSize);
            int[] size = new int[arraySize];
            Random rd = new Random();
            Console.WriteLine();
            for (int i = 0; i < arraySize; i++)
            {
                size[i] = rd.Next(arraySize);
                Console.WriteLine(size[i].ToString());
            }
        }
        catch (System.FormatException)
        {
            Console.WriteLine("Not correct format, restarting array process.");
            Array();
        }
    }
}
}

Upvotes: 0

Views: 705

Answers (5)

crthompson
crthompson

Reputation: 15865

Here's what I came up with. You had too many ways of exiting your loop, so I removed all of the control = false lines except where the user typed "EXIT"

Also, in case "C" you return out of the method if they choose "Y", I changed that to continue so that the loop would continue.

Finally, I moved the 3 instruction statements into the loop, so when the user hit "Y" it would print those again.

static void Main(string[] args)
{
    string _a = "";
    constructor con = new constructor();
    bool control = true;
    while (control)
    {
        Console.WriteLine("Enter enter exit to end the program...");
        Console.WriteLine("Enter C for constructor, M for method, A for an array...");
        Console.WriteLine("Please reference source code to have full details and understanding...");
        _a = Console.ReadLine();
        switch (_a.ToUpper())
        {

            case "EXIT":
                Console.WriteLine("Thank you for using AJ's program...");
                control = false;
                break;
            case "C":
                Console.WriteLine(con.a);
                Console.WriteLine("Would you like to test another scenario?");
                _a = Console.ReadLine(); //<==problem #1 you didnt set your var name
                if (_a.ToUpper() == "Y")
                {
                    continue; //<==problem #2 return exits the program, continue, just keeps going
                }
                control = false;
                break;
            case "M":
                metroid();
                break;
            case "A":
                Array();
                break;
            default:
                Console.WriteLine("No match");
                break;
        }
    }
}

Upvotes: 1

gaurav5430
gaurav5430

Reputation: 13892

may be you want to change

                Console.ReadLine();
                if (_a.ToUpper() == "Y")
                {
                    Console.ReadLine();
                    return;

                }

as

                _a = Console.ReadLine();
                if (_a.ToUpper() == "Y")
                {
                    _a = Console.ReadLine();
                    continue;

                }

Upvotes: 0

jomsk1e
jomsk1e

Reputation: 3625

Try putting the Console.Writeline inside the while loop like this:

static void Main(string[] args)
{
    bool control = true;
    while (control)
    {
        Console.WriteLine("Enter enter exit to end the program...");
        Console.WriteLine("Enter C for constructor, M for method, A for an array...");
        Console.WriteLine("Please reference source code to have full details and understanding...");
        string _a = Console.ReadLine();
        switch (_a.ToUpper())
        {
            case "EXIT":
                Console.WriteLine("Thank you for using AJ's program...");
                control = false;
                break;
            case "C":
                Console.WriteLine("press c");
                Console.WriteLine("Would you like to test another scenario?");
                Console.ReadLine();
                if (_a.ToUpper() == "Y")
                {
                    Console.ReadLine();
                    return;

                }
                control = false;
                break;
            case "M":
                control = false;
                metroid();
                break;
            case "A":
                control = false;
                Array();
                break;
            default: Console.WriteLine("No match");
                break;
        }
    }
}

Additional reading about switch here and here.

Just add comment for the result, thanks. Hope this helped!

Upvotes: 0

Nish Rathi
Nish Rathi

Reputation: 254

                string NewInput= Console.ReadLine();
                if (NewInput.ToUpper() == "Y")
                {
                   //print some thing with console.writeline

                   //if after this you want to restart the loop then instead of return use 
                   continue;
                }

Upvotes: 0

user2905764
user2905764

Reputation:

I think you should considering goto in this case. Yes you need to put some extra effort, but it will help you overcoming the While loop.

A sample below:

 switch (_a.ToUpper())
  {
    case "EXIT":
      Console.WriteLine("Thank you for using AJ's program...");
      control = false;
      // execute goto when your all line executes successfully
      goto case "New";

     case "New":
     // some logic
  }

See working sample here Goto-Switch

Upvotes: 0

Related Questions