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

На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции - C++

Восстановить пароль Регистрация
 
 
unpapaicoconaut
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 11
13.03.2014, 18:20     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #1
Шаблоны функций (template)
Суть: на вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции.
Собственно, не задалось самое начало, не могу понять, как через template получить со входа неизвестный тип переменной
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2014, 18:20     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции
Посмотрите здесь:

перевести в число типа int или float ? C++
Дано натуральное число. Произвести операции над его цифрами. C++
Связный список (создать и реализовать операции над ним) C++
C++ Не происходит конвертация типа int в float
При вводе элементов массива выводить их тип (или int или float) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
recoder
 Аватар для recoder
129 / 129 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
13.03.2014, 18:44     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #2
Так?

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
#include <iostream>
using namespace std;
 
template <typename T>
void S(T &a);
 
int main() {
 
    int a = 3;
    float b = 5.54;
 
    S(a);
    cout << endl;
    S(b);
 
    cin.get();
    return 0;
}
 
template <typename T>
void S(T &a) {
    cout << "Plus = " << a + a << endl;
    cout << "Minus = " << a - a << endl;
    cout << "Proiz = " << a * a << endl;
    cout << "Div = " << a / a << endl;
}
saden
 Аватар для saden
183 / 167 / 41
Регистрация: 27.01.2013
Сообщений: 788
13.03.2014, 18:49     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #3
Обязательно надо темплейт? Можно перегрузить функции для переменных разных типов
unpapaicoconaut
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 11
13.03.2014, 19:00  [ТС]     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #4
Цитата Сообщение от recoder Посмотреть сообщение
Так?
нет, числа попадают с консоли std::cin

Добавлено через 25 секунд
Цитата Сообщение от saden Посмотреть сообщение
Обязательно надо темплейт?
желательно, но, если покажешь пример, я против не буду)
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
13.03.2014, 20:23     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #5
Можно принимать числа в char. Проверять, есть ли точка. А потом в зависимости от наличия точки переводить в int или float.
recoder
 Аватар для recoder
129 / 129 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
13.03.2014, 20:29     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #6
Так?

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
#include <iostream>
using namespace std;
 
template <typename T>
void S(T &a);
 
int main() {
 
    int a;
    float b;
    std::cout << "Int: ";
    std::cin >> a;
    S(a);
    std::cout << std::endl;
    std::cout << "Float: ";
    std::cin >> b;
    S(b);
 
    cin.get();
    cin.get();
    return 0;
}
 
template <typename T>
void S(T &a) {
    cout << "Plus = " << a + a << endl;
    cout << "Minus = " << a - a << endl;
    cout << "Proiz = " << a * a << endl;
    cout << "Div = " << a / a << endl;
}
saden
 Аватар для saden
183 / 167 / 41
Регистрация: 27.01.2013
Сообщений: 788
13.03.2014, 20:42     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void do_smth(int x)
{
...
}
 
void do_smth(float x)
{
...
}
 
main()
{
...
cin>>x;
do_smth(x);
...
}
unpapaicoconaut
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 11
13.03.2014, 20:59  [ТС]     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #8
Цитата Сообщение от recoder Посмотреть сообщение
Так?
нет, вся суть в том, что я получаю только ОДНО число и я не могу заранее сказать, введите integer или float
saden
 Аватар для saden
183 / 167 / 41
Регистрация: 27.01.2013
Сообщений: 788
13.03.2014, 21:00     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #9
как вариант - проверка на целое
C++
1
if(x==floor(x))
unpapaicoconaut
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 11
13.03.2014, 21:01  [ТС]     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #10
saden, в мэйне то придется тип х объявить, чтобы его ввести
saden
 Аватар для saden
183 / 167 / 41
Регистрация: 27.01.2013
Сообщений: 788
13.03.2014, 21:05     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #11
Цитата Сообщение от unpapaicoconaut Посмотреть сообщение
saden, в мэйне то придется тип х объявить, чтобы его ввести
согласен, сразу не подумал...
смотри второй вариант

Добавлено через 2 минуты
кстати, а как число получаецца? Тоже ж надо что-то объявить
unpapaicoconaut
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 11
13.03.2014, 21:08  [ТС]     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #12
я вот и пытался через шаблон сделать, чтобы оно сразу принимало подходящий тип, но не удалось
saden
 Аватар для saden
183 / 167 / 41
Регистрация: 27.01.2013
Сообщений: 788
13.03.2014, 21:10     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #13
а сравнение
C++
1
x==floor(x)
тоже не подходит?
recoder
 Аватар для recoder
129 / 129 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
13.03.2014, 21:36     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #14
Что за бред, это не язык с динамической типизацией. Хотя rtti могло бы помочь.
unpapaicoconaut
0 / 0 / 0
Регистрация: 13.03.2014
Сообщений: 11
13.03.2014, 21:43  [ТС]     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #15
Цитата Сообщение от saden Посмотреть сообщение
а сравнение
с ним можно попробовать
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 3
18.03.2014, 04:18     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #16
unpapaicoconaut, странное задание. Интересно, как оно звучит в оригинале?
Если тип должен определяться форматом ввода, то видимо нужно принять строку и спарсить. Вот диковатый вариант:
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
#include <iostream>
#include <Cmath>
#include<float.h>
using std::cin;
using std::cout;
using std::endl;
 
template <class T>
bool 
is_double(T some_number){
return fabs((double)some_number - (int)some_number) > DBL_EPSILON;
}
 
template <class T>
T foo(T x){
if(is_double(x)) return fabs((x - floor((double)x)));
else
return (int)x%2;
}
 
int main()
{
cout << "Enter the number" << endl;
char numb[32];
cin>>numb;
double some_number = atof(numb);
if( is_double(some_number) ) {
    cout << "double calls fraction" <<endl;
cout<<foo((double)some_number);
}
else{
    cout << "int calls int%2"<<endl;
    cout<<foo((int)some_number);
}
cout << endl;
system ( "pause" );
    return 0;
}
если предыдущий код воспринять серьезно (не дай бог конечно), то вот ещё шутка:
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
47
48
#include <iostream>
 
using std::cin;
using std::cout;
using std::endl;
 
class BaseCl{
public:
int a;
BaseCl():a(0){}
BaseCl(int a_) :a(a_){}
virtual void show(){cout << a;}
virtual void input(){cin >> a;}
};
 
class DerivBaseCl : public BaseCl
{
public:
double a;
DerivBaseCl(double a_):a(a_){}
void show(){cout << a;}
void input(){cin >> a;}
};
 
int main()
{
BaseCl b(123);
DerivBaseCl c(1.23);
BaseCl *d;
 
int select_type = 0;
cout<<"int or double? int - 0, double - 1 ";
cin>>select_type;
if(!select_type) d = &b;
else d = &c;
d->input();
cout<<endl;
d->show();
 
cout<<endl;
 
//прикол крепчает:
cout<<d->a%3;//забавно, что при явном объявлении такое деление не скомпилируется, 
//а в данном случае, для double%int возвращает 0.  :D
cout << endl;
system ( "pause" );
    return 0;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.03.2014, 12:34     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #17
Такой вариант:
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
47
48
#include <iostream>
#include <string>
#include <algorithm>
#include <stdexcept>
 
int main()
{
   while (true)
   {
      std::cout << "Enter number: -> ";
      std::string number;
      std::cin >> number;
 
      if (std::any_of(number.begin(), number.end(), isalpha) ||
          std::count(number.begin(), number.end(), '.') > 1  ||
          number.find(',') != std::string::npos)
      {
         std::cout << "BAD INPUT.\n";
         continue;
      }
 
      if (number.find('.') != std::string::npos) {
         std::cout << "Floating type:   ";
         try {
            long double ldval = std::stold(number);
            std::cout << ldval << "\n";
         }
         catch(const std::invalid_argument& e) {
            std::cerr << "Invalid argument. " << e.what() << "\n";
         }
      }
      else {
         std::cout << "Integer type:    ";
         try {
            long long llval = std::stoll(number);
            std::cout << llval << "\n";
         }
         catch(const std::out_of_range& e) {
            std::cerr << "Out of the range. " << e.what() << "\n";
         }
         catch(const std::invalid_argument& e) {
            std::cerr << "Invalid argument. " << e.what() << "\n";
         }
      }
   }
 
   return 0;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 3
18.03.2014, 13:34     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции #18
DiffEreD, красиво конечно. Вот если в моём варианте ввести 123e-3, то получим результат 0.123, что вполне логично.
DiffEreD
18.03.2014, 13:36
  #19

Не по теме:

Пускай ТС себе доработает.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 13:39     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции
Еще ссылки по теме:

C++ Как проверить вводилось ли число (типа double или float) в консоль
Задано число. Разместите в памяти последовательно все его цифры, используя указатели и операции над ними C++
C++ Ошибка: "Значение типа float нельзя присвоить сущности типа int"

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

Или воспользуйтесь поиском по форуму:
IGPIGP
18.03.2014, 13:39     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции
  #20

Не по теме:

Согласен. Тем более, что задание наверняка не предполагает, ничего из того, что тут деется.
Хотелось бы взглянуть на него в оригинале.

Yandex
Объявления
18.03.2014, 13:39     На вход подается число (int или float) в зависимости от его типа провернуть над ним разные операции
Ответ Создать тему
Опции темы

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