Как предотвратить сбой из-за неправильного ввода в C #? - PullRequest
1 голос
/ 03 марта 2010

Программа, которую я написал, настроена на прием только положительных целых чисел. Если пользователь вместо этого вводит букву, то происходит сбой. Отрицательные целые числа не вызывают каких-либо проблем, хотя они не «действительны» в отношении того, как работает моя программа.

Что я хочу сделать, это:

  1. Предотвращение сбоя программы при неверном вводе.

  2. Отображение сообщения об ошибке, если ввод неверен

  3. Продолжить программу с того места, где она остановилась, не затрагивая остальную часть программы.

Кроме того, часть моей программы связана с делением. Есть ли способ запретить пользователю вводить все нули?

Это в C #

Мой код:

using System;

с использованием System.Collections.Generic; использование System.Linq; используя System.Text;

namespace Общий калькулятор {

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


        do
        {




            Console.WriteLine("Enter Striking Level: ");

            string striking = Console.ReadLine();

            Console.WriteLine("Enter Grappling Level: ");

            string grappling = Console.ReadLine();

            Console.WriteLine("Enter Submission Level: ");

            string submission = Console.ReadLine();

            Console.WriteLine("Enter Durability Level: ");

            string durability = Console.ReadLine();

            Console.WriteLine("Enter Technical Level: ");

            string technical = Console.ReadLine();

            Console.WriteLine("Enter Speed Level: ");

            string speed = Console.ReadLine();

            Console.WriteLine("Enter Hardcore Level: ");

            string hardcore = Console.ReadLine();

            Console.WriteLine("Enter Charisma Level: ");

            string charisma = Console.ReadLine();




            int gra = Convert.ToInt32(grappling);
            int str = Convert.ToInt32(striking);
            int dur = Convert.ToInt32(durability);
            int spd = Convert.ToInt32(speed);
            int tec = Convert.ToInt32(technical);
            int hdc = Convert.ToInt32(hardcore);
            int cha = Convert.ToInt32(charisma);
            int sub = Convert.ToInt32(submission);

            int total = str + gra + sub + dur + tec + spd + cha + hdc;


            int overall = total / 8 + 8;




            Console.WriteLine("The Overall is " + overall);
            Console.WriteLine("Do you wish to continue? y/n? ");



            if (Console.ReadLine() == "y")
            {
                shouldContinue = true;


            }
            else break;


        } while (shouldContinue == true);
    }
}

}

Ответы [ 5 ]

3 голосов
/ 03 марта 2010
int value = 0;
if (!int.TryParse(input, out value))
{
    MessageBox.Show("Oops");
} else {
    // use the value in the variable "value".
}
2 голосов
/ 03 марта 2010
static void Main(string[] args)
{
        bool validInput = false;
        string inputString;
        UInt32 validPositiveInteger = 0;
        while (!validInput)
        {
            Console.WriteLine("Please enter a positive 32 bit integer:");
            inputString = Console.ReadLine();
            if (!UInt32.TryParse(inputString, out validPositiveInteger))
            {
                Console.WriteLine("Input was not a positive integer.");
            }
            else if (validPositiveInteger.Equals(0))
            {
                Console.WriteLine("You cannot enter zero.");
            }
            else
            {                   

                validInput = true;
                //Or you could just break
                //break;
            }


        }

        Console.WriteLine(String.Format("Positive integer = {0}", validPositiveInteger));
}
1 голос
/ 03 марта 2010

Вот, пожалуйста:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OverallCalculator
{
    class Program
    {
        static void Main(string[] args)
        {
            bool shouldContinue = true;

            while (shouldContinue)
            {
                int strikingLevel = GetValue("Enter Striking Level: ");
                int grapplingLevel = GetValue("Enter Grappling Level: ");
                int submissionLevel = GetValue("Enter Submission Level: ");
                int durabilityLevel = GetValue("Enter Durability Level: ");
                int technicalLevel = GetValue("Enter Technical Level: ");
                int speedLevel = GetValue("Enter Speed Level: ");
                int hardcoreLevel = GetValue("Enter Hardcore Level: ");
                int charismaLevel = GetValue("Enter Charisma Level: ");

                int total = strikingLevel + grapplingLevel + durabilityLevel + submissionLevel +
                    technicalLevel + speedLevel + charismaLevel + hardcoreLevel;

                int overall = total / 8 + 8;

                Console.WriteLine("\nThe Overall is {0}.", overall);
                while (true)
                {
                    Console.WriteLine("Do you wish to continue? y/n? ");
                    string response = Console.ReadLine();
                    if (response.Equals("y", StringComparison.CurrentCultureIgnoreCase) ||
                        response.Equals("yes", StringComparison.CurrentCultureIgnoreCase))
                    {
                        shouldContinue = true;
                        break;
                    }
                    else if (response.Equals("n", StringComparison.CurrentCultureIgnoreCase) ||
                        response.Equals("no", StringComparison.CurrentCultureIgnoreCase))
                    {
                        shouldContinue = false;
                        break;
                    }
                }
            } 
        }

        private static int GetValue(string prompt)
        {
            while (true)
            {
                Console.WriteLine(prompt);
                string input = Console.ReadLine();
                int value;
                if (int.TryParse(input, out value))
                {
                    if (value <= 0)
                        Console.WriteLine("Please enter a positive number.");
                    else
                        return value;
                }
                else
                {
                    Console.WriteLine("Please enter a number.");
                }
            }
        }
    }
}
0 голосов
/ 03 марта 2010

Я написал это много месяцев назад, когда я впервые изучил C #. Это преобразование из функции VB, которое я получил за VB5 дней. Основным преимуществом функции является то, что ошибки нет - входные данные просто не позволяют использовать символы вне предопределенного списка.

/***********************************************************************
 * bool ValiText(char inChar,
 *               string valid,
 *               bool editable,
 *               bool casesensitive
 * Description: Validate Input Characters As They Are Input
 * Notes: For each control whose input you wish to validate, just put
 *        e.Handled = ValiText(e.KeyChar, "0123456789/-" [,true][,true])
 *        In The KeyPress Event
 ***********************************************************************/
public bool ValiText(char inChar, string valid, bool editable, bool casesensitive)
{
    string inVal = inChar.ToString();
    string tst = valid;
    /// Editable - Add The Backspace Key
    if (editable) tst += ((char)8).ToString();
    /// Case InSensitive - Make Them Both The Same Case
    if (!casesensitive)
    {
        tst = tst.ToLower();
        inVal = inVal.ToLower();
    }
    return tst.IndexOf(inVal,0,tst.Length) < 0;
}
public bool ValiText(char inChar, string valid, bool editable)
{
    string tst = valid;
    /// Editable - Add The Backspace Key
    if (editable) tst += ((char)8).ToString();
    return tst.IndexOf(inChar.ToString(),0,tst.Length) < 0;
}
public bool ValiText(char inChar, string valid)
{
    return valid.IndexOf(inChar.ToString(),0,valid.Length) < 0;
}

Обратите внимание, что это не будет работать в веб-приложении.

0 голосов
/ 03 марта 2010

Да ... прежде чем делать какие-либо вычисления, вам необходимо проверить данные, которые вы собираетесь использовать. Если какие-либо данные неверны, вы отображаете окно сообщения с подробным описанием ошибок и возвращаете фокус к форме, чтобы пользователь мог исправить ошибки. Повторите при необходимости.

...