Как сделать case с диапазонами?
От: Oxy  
Дата: 05.05.03 17:35
Оценка:
Привет, всем!
Я новичок в С так что не ругайтесь на тупые вопросы
Надо сделать case с выбором из диапазона.
На делфе это выглядит так

Case ch of
  '0'..'4':Begin...End;
  '7'..'9':Begin...End;
End;


Вопрос, как это сделать на С?
Re: Как сделать case с диапазонами?
От: Кодт Россия  
Дата: 05.05.03 18:06
Оценка: 3 (1)
Здравствуйте, Oxy, Вы писали:

Oxy>Я новичок в С так что не ругайтесь на тупые вопросы

Oxy>Надо сделать case с выбором из диапазона.
Oxy>Вопрос, как это сделать на С?

1) по-тупому
switch( SomeChar() ) // вычисляем единожды
{
  case '0': case '1': ..... case '4': { } break;
  case '7': case '8': case '9': { } break;
  default: { }
}


2) через if
char ch = SomeChar(); // вычисляем единожды
if     (ch >= '0' && ch <= '4') then { }
else if(ch >= '7' && ch <= '9') then { }
else                                 { }


3) через свертку
typedef enum { CH_0_4, CH_7_9, CH_DEFAULT } CH_TYPE;
CH_TYPE types[10] = { CH_0_4, CH_0_4, ... CH_0_4,
                      CH_DEFAULT, ... CH_DEFAULT,
                      CH_7_9, CH_7_9, CH_7_9 
                    };

.....

CH_TYPE type = (ch < '0' || ch > '9') ? CH_DEFAULT : types[ch-'0'];
switch(type)
{
case CH_0_4: { } break;
case CH_7_9: { } break;
default: { }
}

по-другому, увы, никак.
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[2]: Как сделать case с диапазонами?
От: Oxy  
Дата: 05.05.03 18:31
Оценка:
Спасибо за подробное объяснение!
Сделал через if-ы.
Жаль что в С++ нет удобной возможности определять диапазоны в case как в Делфях.
Re[3]: Как сделать case с диапазонами?
От: Кодт Россия  
Дата: 05.05.03 19:27
Оценка:
Здравствуйте, Oxy, Вы писали:

Oxy>Жаль что в С++ нет удобной возможности определять диапазоны в case как в Делфях.


Это — к Кернигану и Ритчи, которые придумали Си. И к Страуструпу, который не стал расширять.

А на самом деле, в паскале есть такие конструкции, как диапазон и множество. В сях их просто нет, поэтому вводить синтаксис вида
case x..y, z, t :
оказалось неестественно.
Жалко, а что поделаешь.
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.