Бесконечный l oop на вложенном операторе while - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь использовать 2 цикла while для консольной программы C#. Внешнее - повторять меню программы и функции, пока пользователь не выйдет. Внутренний l oop, который я использую в качестве проверки пользовательского ввода (который должен быть проанализирован в int).

Внутренний l oop, кажется, работает нормально, но как только программа попадает в оператор switch, кажется, что состояние переключателя бесконечно. Так что вместо записи в консоль я верю внешнему, а l oop делает запись бесконечно. Единственный случай, который устанавливает флаг в ложные остановки, как и ожидалось.

Может кто-нибудь объяснить, что происходит? как бы обновить флаг, чтобы внешний, пока l oop не выполнял функции коммутатора бесконечно? Программа должна go вернуться в меню пользователя и ожидать ввода во всех случаях, кроме случаев, когда пользователь выбирает 7 для завершения программы. Я смотрел на это часами. Пожалуйста, проинструктируйте меня!

using System;
using static System.Console;
using System.Collections.Generic;

namespace Project02AreaCalculator
{
  class Program
  {
    static private bool flag = true;
    static void Main(string[] args)
    {

        string inputvalue = "";
        int caseSwitch;

        // repeat program until flag is set to false by user selecting 7 to exit
        do
        {
            // repeat menu until user input can be parsed into an integer
            while (!int.TryParse(inputvalue, out caseSwitch))
            {
                flag = false;
                Console.WriteLine("Shape Area Calculator");
                Console.WriteLine("******************************************");
                Console.WriteLine("\t1. Circle");
                Console.WriteLine("\t2. Square");
                Console.WriteLine("\t3. Rectangle");
                Console.WriteLine("\t4. Rhombus");
                Console.WriteLine("\t5. Parallelogram");
                Console.WriteLine("\t6. Trapezoid");
                Console.WriteLine("\t7. Exit");
                Console.WriteLine("******************************************");
                Console.WriteLine("Select a shape type to calculate");
                inputvalue = ReadLine();
            }

            //convert input to integer and assign to caseSwitch
            caseSwitch = Convert.ToInt32(inputvalue);

            switch (caseSwitch)
            {
                case 1:
                    CalculateCircle();
                    //Clear();
                    flag = true;
                    break;
                case 2:
                    CalculateSquare();
                    // Clear();
                    flag = true;
                    break;
                case 3:
                    CalculateRectangle();
                    //Clear();
                    flag = true;
                    break;
                case 4:
                    CalculateRhombus();
                    //Clear();
                    flag = true;
                    break;
                case 5:
                    CalculateParallelogram();
                    //Clear();
                    flag = true;
                    break;
                case 6:
                    CalculateTrapezoid();
                    //Clear();
                    flag = true;
                    break;
                case 7:
                    //Clear();
                    Console.WriteLine("Goodbye! Press any key to end");
                    ReadKey();
                    flag = false;
                    break;
                default:
                    // Clear();
                    Console.WriteLine("Invalid Selection, Select 1-7");
                    flag = true;
                    break;
            }


        } while (caseSwitch != 7);

    }//end main

        //****************METHODS SECTION ****************************************************************************
        static private void CalculateCircle()
        {
            //area = pi * radius * radius (or pi times radius squared)
            Console.Clear();
            Console.WriteLine("Circle Area Calculator");
            Console.WriteLine("Enter the length of the circle's radius (-1 to exit back to menu):");
            Console.ReadKey();

        }
        static private void CalculateSquare()
        {
            //area = side * side (or side squared)
            Console.Clear();
            Console.WriteLine("Square Area Calculator");
            Console.WriteLine("Enter the length of one side of the square (-1 to exit back to menu):");
            Console.ReadKey();
          }
        static private void CalculateRectangle()
        {
            //area = Length * Width
            Console.Clear();
            Console.WriteLine("Rectangle Area Calculator");
            Console.WriteLine("Enter the length of one side of the Rectangle (-1 to exit back to menu):");
            Console.WriteLine("Enter the length of an opposing side of the Rectangle (-1 to exit back to menu):");
            Console.ReadKey();
        }

        static private void CalculateRhombus()
        {
            //area = ½ a * b (a and b being diagonals)
            Console.Clear();
            Console.WriteLine("Rhombus Area Calculator");
            Console.WriteLine("Enter the length of one diagonal of the rhombus (-1 to exit back to menu):");
            Console.WriteLine("Enter the length of the other diagonal of the rhombus (-1 to exit back to menu):");
            Console.ReadKey();
         }
        static private void CalculateParallelogram()
        {
            //area = base * height
            Console.WriteLine("Parallelogram Area Calculator");
            Console.WriteLine("Enter the length of the base of the Parallelogram (-1 to exit back to menu):");
            Console.WriteLine("Enter the height of the Parallogram (-1 to exit back to menu):");
            Console.ReadKey();
         }

        static private void CalculateTrapezoid()
        {
            //area = ½ height * (largeBase + smallBase)
            Console.WriteLine("Trapezoid Area Calculator"); 
            Console.ReadKey();
         }
    }
}

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Просто чтобы запустить вашу программу, выполните следующие изменения:

Сбросьте значение inputvalue и caseSwitch перед проверкой пользовательского ввода, как показано ниже,

...
...
do
            {
                inputvalue = "";
                caseSwitch = 0;
                // repeat menu until user input can be parsed into an integer
                while (!int.TryParse(inputvalue, out caseSwitch))
                {
...
...

А также оператор ниже также не требуется

caseSwitch = Convert.ToInt32(inputvalue);

Другая проблема заключается в том,

Во всех функциях запрашивается ввод данных пользователем, но ввод не используется и не сохраняется в какой-либо переменной.

Даже в некоторых функциях, таких как CalculateParallelogram, CalculateRhombus, пользователю предлагается ввести два значения длины и высоты, при этом берется только один ввод и этот слишком единственный ключ (Console.ReadKey ()).

Поэтому измените ReadKey на ReadLine и взять два ввода, где это было предложено. Есть и другая логическая проблема, которую необходимо улучшить в этом коде.

1 голос
/ 07 февраля 2020

Попробуйте добавить

inputvalue="";

После

caseSwitch = Convert.ToInt32(inputvalue);
...