Форум программистов, компьютерный форум CyberForum.ru

Диапазон значений - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.83
disker
 Аватар для disker
2 / 2 / 0
Регистрация: 25.01.2012
Сообщений: 78
30.01.2012, 18:38     Диапазон значений #1
Числу B нужно присвоить значение в зависимости от того, какое значение у числа А, но проблема в том, что конкретного значения числа А нет. Оно может лежать в таких 5-ти отрезках:

1. [0..0.2)
2. [0.2..0.4)
3. [0.4..0.6)
4. [0.6..0.8)
5. [0.8..1]

Я так подозреваю, что тут нужно использовать что-то вроде оператора switch. Когда-то давно писал программу на QBasic и там, если не ошибаюсь, можно было задать диапазон значений для оператора case. То есть что-то такое, было давно, поэтому код уже точно не помню:
C++
1
2
3
4
5
сase [0..0.2): операция 1
case [0.2..0.4): операция 2
case [0.4..0.6): операция 3
case [0.6..0.8): операция 4
case [0.8..1]: операция 5
Как с этим обстоят дела в С++ ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2012, 18:38     Диапазон значений
Посмотрите здесь:

C++ Диапазон
Диапазон значений массива. C++
C++ Диапазон данных
C++ как понять Диапазон принимаемых значений?
C++ Диапазон значений указателей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.01.2012, 18:44     Диапазон значений #2
Цитата Сообщение от disker Посмотреть сообщение
Как с этим обстоят дела в С++ ?
На Си можно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   int a = rand() % 12;
   
   switch (a)
   {
   case 0 ... 2:
      printf("0-2\n");
      break;
      
   case 3 ... 7:
      printf("3-7\n");
      break;
      
   case 8 ... 9:
      printf("8-9\n");
      break;
      
   default:
      printf("over 10\n");
   }
   
   return 0;
}
На C++ придется подходить более серьезно.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
30.01.2012, 18:46     Диапазон значений #3
Я бы писал
C++
1
2
3
4
5
if((B>=0)&&(B<0.2))A=1;
//Копипаст, изменение цифр
else if((B>=0.2)&&(B<0.4))A=1;
else if((B>=0.4)&&(B<0.6))A=1;
//И т.д.
Или сделал бы макрос, чтобы он за меня это делал. Например
C++
1
2
3
#define Fignya(X,Y,Z) if((B>=X)&&(B<Y))A=Z
Fignya(0,0.2,1);
Fignya(0.2,0.4,2);
Ну или не макросом, а функцией. как - тоже можно легко сообразить.

При любом из моих вариантов оно будет работать, но... *WTF/minute зашкалит*
З.Ы. я не знаю способа заставить свитч работать нормально с дробными. Может кто научит?)
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.01.2012, 18:54     Диапазон значений #4
Всегда можно просто набросать горстку if-else-statements и сделать из нее отдельную функцию

C++
1
2
3
4
5
6
7
8
9
10
int calculate_b(int a)
{
   if (a >= 0 && a < 10)
      return 0;
   else
   if (a >= 11 && a < 20)
      return 1;
   else
      return 2;
}
Чуть усовершенствова получаем такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
bool in_between(T a, T min, T max) 
{
   return a >= min && a <= max;
}
 
int calculate_b(int a)
{
   if (in_between(a, 0, 10))
      return 0;
   else
   if (in_between(a, 11, 20))
      return 1;
   else
      return 2;
}
Можно вообще сделать enum, который будет обозначать диапазон значений и уже его использовать в switch:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
 
enum b_range
{
   B_RANGE_0,
   B_RANGE_1,
   B_RANGE_2
};
 
template<typename T>
bool in_between(T a, T min, T max) 
{
   return a >= min && a <= max;
}
 
b_range get_range(int a)
{
   if (in_between(a, 0, 10))
      return B_RANGE_0;
   else
   if (in_between(a, 11, 20))
      return B_RANGE_1;
   else
      return B_RANGE_2;
}
 
int main()
{
   int a = rand();
   int b = 0;
   
   switch (get_range(a))
   {
   case B_RANGE_0:
      b = 0;
      break;
      
   case B_RANGE_1:
      b = 1;
      break;
      
   case B_RANGE_2:
      b = 2;
      break;
   }
}
А еще можно написать класс, который будет кастоваться в int и обратно
В общем-то есть куча способов, а какой будет предпочтительнее зависит от конкретной задачи.
disker
 Аватар для disker
2 / 2 / 0
Регистрация: 25.01.2012
Сообщений: 78
30.01.2012, 19:05  [ТС]     Диапазон значений #5
Цитата Сообщение от Teravisor Посмотреть сообщение
Я бы писал
C++
1
2
3
4
5
if((B>=0)&&(B<0.2))A=1;
//Копипаст, изменение цифр
else if((B>=0.2)&&(B<0.4))A=1;
else if((B>=0.4)&&(B<0.6))A=1;
//И т.д.
Вот этот скорее всего выберу (правда ещё почитаю литературу что об этом случае говорят) так как у меня действия могут меняться и функцию тут вряд ли можно организовать Хотя немного странно что такой мощный язык и в этом плане слабее какого-то QBasica ... не ожидал
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.01.2012, 19:07     Диапазон значений #6
Цитата Сообщение от Teravisor Посмотреть сообщение
я не знаю способа заставить свитч работать нормально с дробными
На сколько я знаю, такого просто нет. switch с целыми работает.
Я бы как-то так сделал:
C
1
int b(double a) { return ( a >= 0.0 && a < 0.2 ) ? 1 : ( a >= 0.2 && a < 0.4 ) ? 2 : /*...*/ ( a >= 0.8 && a <= 1.0 ) ? 5 : 0; }
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
30.01.2012, 19:13     Диапазон значений #7

Не по теме:

Аааа я забыл цифру изменить

Цитата Сообщение от Teravisor Посмотреть сообщение
изменение цифр
Цитата Сообщение от Teravisor Посмотреть сообщение
A=1;
XD



Добавлено через 3 минуты
По делу - мои ифы читабельнее этого кода в одну строчку ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2012, 19:17     Диапазон значений
Еще ссылки по теме:

Написать программу,которая выводит таблицу значений функции >^(x-2)+(x+1). Диапазон изменения аргумента вводится пользователем так же как и шаг пригла C++
Диапазон значений для переменных C++
Выход за диапазон значений C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
30.01.2012, 19:17     Диапазон значений
  #8

Не по теме:

Цитата Сообщение от Teravisor Посмотреть сообщение
По делу - мои ифы читабельнее этого кода в одну строчку ...
В смысле - читать дольше прийдётся... А в прочем, любите простые вещи размусоливать - дело ваше, я не настаиваю...

Yandex
Объявления
30.01.2012, 19:17     Диапазон значений
Ответ Создать тему
Опции темы

Текущее время: 12:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru