Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка введенного значения и выдача exception'a

22K
01 июля 2009 года
kotelius
75 / / 08.08.2008
Всем привет!!!

Вобщем, есть задачка:
[COLOR="DarkRed"]Ввести с клавиатуры число в диапазоне от 100 до 100000000 и проверь введенное число, при необходимости выдать сообщение об исключении.[/COLOR]
Язык C#.

Реализовал я ее следующим способом, но там не все гладко :(
Код:
[COLOR="Blue"]using[/COLOR] System;

[COLOR="#0000ff"]namespace[/COLOR] Chitaem_chislo
{
    [COLOR="#0000ff"]class[/COLOR] [COLOR="Teal"]ReadChislo[/COLOR]
    {
       [COLOR="#0000ff"]static void[/COLOR] Main()
       {
          [COLOR="Blue"]ulong[/COLOR] Chislo = 0;
          [COLOR="#0000ff"]while[/COLOR] (Chislo == 0)
          {
              [COLOR="#008080"]Console[/COLOR].Write("[COLOR="DarkRed"]Введите число:[/COLOR]");
              [COLOR="#008080"]Console[/COLOR].WriteLine("[COLOR="#8b0000"](от {0} до {1}):[/COLOR]", 100, 100000000);
              [COLOR="#0000ff"]try[/COLOR]
              {
                  Chislo = [COLOR="#008080"]Convert[/COLOR].ToUInt32([COLOR="#008080"]Console[/COLOR].ReadLine());
              }
              [COLOR="#0000ff"]catch[/COLOR] ([COLOR="#008080"]Exception[/COLOR] ex)
              {
                  [COLOR="#008080"]Console[/COLOR].WriteLine(ex.Message + " [COLOR="#8b0000"]Попробуйте снова!!!\n[/COLOR]");
              }
             }
          [COLOR="#008080"]Console[/COLOR].WriteLine("[COLOR="#8b0000"]\n\nPress Enter, please...[/COLOR]");
          [COLOR="#008080"]Console[/COLOR].Read();
        }
     }
}

Я никак не могу сделать проверку входит ли введеное число в range, и соответственно выдавать exception.
Я так понимаю, здесь необходимо создать метод, который будет проверять это число, верно ли это?
Подскажите, пожалуйста, в каком направлении копать.
Заранее благодарен.
92
01 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
 
Код:
[COLOR=#0000ff]try[/COLOR]
              {
                  Chislo = [COLOR=#008080]Convert[/COLOR].ToUInt32([COLOR=#008080]Console[/COLOR].ReadLine());
                  if (Chislo < 100 || Chislo > 100000000)
                      // сообщение об ошибке :)
              }
              [COLOR=#0000ff]catch[/COLOR] ([COLOR=#008080]Exception[/COLOR] ex)
              {
                  [COLOR=#008080]Console[/COLOR].WriteLine(ex.Message + " [COLOR=#8b0000]Попробуйте снова!!!\n[/COLOR]");
              }


так? )
22K
01 июля 2009 года
kotelius
75 / / 08.08.2008
Цитата: Тень Пса


if (Chislo < 100 || Chislo > 100000000)
// сообщение об ошибке :)



Да, это практически то что нужно, но этот вариант я уже опробывал.
Я извиняюсь, я немного не корректно поставил вопрос. Мне нужно, чтобы после проверки введенного числа, и если оно не подходит под range, выдавался exception и снова предложение ввести число, т.е. цикл while продолжается. А в данной ситуации, цикл while прекращается, как я понимаю, и происходит выход из программы.
Я в принципе все реализовал, но с применением goto и метки, но как говорится это "признаки дурного тона".

535
02 июля 2009 года
Нездешний
537 / / 17.01.2008
попробуйте использовать т.н. "схему Бертрана"
Код:
public void Pattern()
{          
   do
   {
      try
      {
         bool Danger = false;
         Success = true;
         MakeJob();
         Danger = CheckDanger();
         if (Danger)     throw (new MyException());
         MakeLastJob();
      }
      catch (MyException me)
      {
         if(count > maxcount)  throw(new MyException("Три попытки были      безуспешны"));
         Success = false;
         count++;
         //корректировка ситуации
         Console.WriteLine("Попытка исправить ситуацию!");
         level +=1;
      }
   }while (!Success);
}
535
02 июля 2009 года
Нездешний
537 / / 17.01.2008
А вообще в вашем случае всего-то надо сделать Chislo = 0 в блоке catch
Код:
using System;

namespace Chitaem_chislo
{
    class ReadChislo
    {
       static void Main()
       {
          ulong Chislo = 0;
          while (Chislo == 0)
          {
              Console.Write("Введите число:");
              Console.WriteLine("(от {0} до {1}):", 100, 100000000);
              try
              {
                  Chislo = Convert.ToUInt32(Console.ReadLine());
                  [COLOR="#ff0000"]if (Chislo < 100 || Chislo > 100000000)   throw new //SomeException;[/COLOR]
              }
              catch (Exception ex)
              {
                  Console.WriteLine(ex.Message + " Попробуйте снова!!!\n");
                  [COLOR="Red"]Chislo = 0;[/COLOR]
              }
          }
          Console.WriteLine("\n\nPress Enter, please...");
          Console.Read();
        }
     }
}
5
02 июля 2009 года
hardcase
4.5K / / 09.08.2005
Проще надо быть :)
Код:
using System;

class Program {
   
    static long ParseInputValue(string str) {
        long result = long.Parse(str);
       
        if(result < 100L)
            throw new FormatException("Число меньше 100.");
           
        if(result > 100000000L)
            throw new FormatException("Число больше 100000000");
           
        return result;
    }    
   
    static void Main() {
        long value = 0;
       
        while (true) {
            Console.Write("Введите число:");
            Console.WriteLine("(от {0} до {1}):", 100, 100000000);
            try {
                value = ParseInputValue(Console.ReadLine());
                Console.WriteLine("Все ОК :)");
            } catch (FormatException ex) {
                Console.WriteLine(ex.Message + " Попробуйте снова!!!\n");
            }
        }
    }
}
535
02 июля 2009 года
Нездешний
537 / / 17.01.2008
 
Код:
while (true) {
            Console.Write("Введите число:");
            Console.WriteLine("(от {0} до {1}):", 100, 100000000);
            try {
                value = ParseInputValue(Console.ReadLine());
                Console.WriteLine("Все ОК :)");
            } catch (FormatException ex) {
                Console.WriteLine(ex.Message + " Попробуйте снова!!!\n");
            }
}
Зацикливание, или я чего-то не понимаю? :)
5
02 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Нездешний
Зацикливание, или я чего-то не понимаю? :)

Нет, проверка ввода с выбросом исключения. long.Parse выбрасывает FormatException (ну и AgrumentNullException, если строка - null), его можно в принципе и для наших целей использовать.

535
02 июля 2009 года
Нездешний
537 / / 17.01.2008
ну а при правильном-то вводе?
5
02 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Нездешний
ну а при правильном-то вводе?


А при правильном вводе исключения не будет :) И мегасофтна напечатает
[quote=Мегасофтина]
Все ОК :)
[/quote]


А от ArgumentNullException можно защититься вот так:

Код:
static long ParseInputValue(string str) {
        long result = long.Parse(str ?? string.Empty);
       
        if(result < 100L)
            throw new FormatException("Число меньше 100.");
           
        if(result > 100000000L)
            throw new FormatException("Число больше 100000000");
           
        return result;
    }
535
02 июля 2009 года
Нездешний
537 / / 17.01.2008
напечатать-то напечатает!.. а потом еще раз запросит число...
Из while(true) без бросания exception мегасофтина выходит как-то?

ЗЫ: С до-диез знаком не близко :)
5
02 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Нездешний
Из while(true) без бросания exception мегасофтина выходит как-то?

Ctrl+C / Ctrl+Break / Alt + F4 зачем накручивать полную инфраструктуру работы в консольной одноразовой программе?

535
02 июля 2009 года
Нездешний
537 / / 17.01.2008
А, понял :)
Философия, однако!
22K
02 июля 2009 года
kotelius
75 / / 08.08.2008
Ребята, благодарю за ответы.
Цитата: hardcase
Проще надо быть :)


hardcase проще нельзя, просто-напросто по той причине, что я многого еще не знаю, да и впридачу нужно использовать только тот материал который прошел. Поэтому, в связи с тем, что с [COLOR="Blue"]Parse'ом[/COLOR] я еще не работал, приходится обходится другими реализациями.

Цитата: hardcase

Ctrl+C / Ctrl+Break / Alt + F4 зачем накручивать полную инфраструктуру работы в консольной одноразовой программе?


Да, я понимаю, что здесь накручивать нету смысла, но просто это часть программки, и дальше она еще будет дописываться, поэтому постоянный цикл мне здесь не нужен.
В общем, остановился на этом:

Код:
using System;

namespace Chitaem_chislo
{
    class ReadChislo
    {
        static void Main()
       {
          long Chislo = 0;
          while (Chislo == 0)
          {
              Console.Write("Введите число: ");
              Console.WriteLine("(от {0} до {1}):", 100, 100000000);
              try
              {
                  Chislo = Convert.ToInt32(Console.ReadLine());
                  if (Chislo < 100 || Chislo > 100000000)
                      throw new FormatException("Число не подходит!");
              }
              catch (FormatException ex)
              {
                  Console.WriteLine(ex.Message + " Попробуйте снова!\n");
                  Chislo = 0;
              }
          }
          Console.WriteLine("Вы ввели число: {0}", Chislo);
          Console.WriteLine("\n\nНажмите Enter для выхода...");
          Console.Read();
        }
    }
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог