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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
#1

Определение введенного типа - C++

23.07.2012, 14:32. Просмотров 2843. Ответов 10
Метки нет (Все метки)

Задался вопросом как сделать так чтоб программа определила вводимый тип. Тоесть программа требует чтоб пользователь ввел число - а после выводит на экран тип этого числа.

Можно конечно было б сделать с использованием if, но как то это не кошерно . Поэтому я решил использовать перезагрузку функций. Но вот что передать функции я не знаю .

Пожалуйста помогите. Заранее спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
void print(int i){cout<<"This is \"int\"\n";}
void print(double d){cout<<"This is \"double\"\n";}
void print(float f){cout<<"This is \"float\"\n";}
 
 
int main()
{
  // ???
  print(); // Г€ Г·ГІГ® ïåðåäГ*ГІГј print
  system("PAUSE");  
  return 0;
}

Не по теме:

И еще один маленький вопросик, как сделать чтоб название темы было "жирным"

Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.07.2012, 14:37     Определение введенного типа #2
Цитата Сообщение от cactus09 Посмотреть сообщение
Задался вопросом как сделать так чтоб программа определила вводимый тип.
считывать как строку, парсить и самому относить к тому или инному типу данных
Цитата Сообщение от cactus09 Посмотреть сообщение
Поэтому я решил использовать перезагрузку функций.
какая из перегрузок функции будет вызвана решает компилятор на этапе компиляции
Catstail
Модератор
22309 / 10714 / 1742
Регистрация: 12.02.2012
Сообщений: 17,785
23.07.2012, 14:40     Определение введенного типа #3
Лучше всего бы здесь использовать регулярные выражения... Но если по-простому, по-сельповски, то наличие точки или конструкции "E+/-nn" - признак "float". Все остальные - int (long). Вводить символы нужно в строку, и ее потом анализировать.
Перегрузка не при чем...
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
23.07.2012, 14:46  [ТС]     Определение введенного типа #4
Цитата Сообщение от Jupiter Посмотреть сообщение
считывать как строку, парсить и самому относить к тому или инному типу данных
- Как то слишком нерационально, нельзя ли как нибудь по другому. Если б был бы какой нибудь тип который мог бы изменятся в зависимости от тех данных которые приняла переменная...

Цитата Сообщение от Jupiter Посмотреть сообщение
какая из перегрузок функции будет вызвана решает компилятор на этапе компиляции
- Тоесть таким способом с перезагрузкой функции неполучится... печально
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
23.07.2012, 14:48     Определение введенного типа #5
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
#include <iostream>
#include <boost/variant.hpp>
 
void print(int i) { std::cout << "Int" << std::endl; }
void print(float f) { std::cout << "Float" << std::endl; }
void print(double f) { std::cout << "Double" << std::endl; }
 
struct visitor : public boost::static_visitor<void>
{
   template<typename T>
   void operator() (const T& value) const
   {
      print(value);
   }
};
 
void apply(const boost::variant<int, float, double>& var)
{
   boost::apply_visitor(visitor(), var);
}
 
int main()
{
   boost::variant<int, float, double> var;
   var = int(1);
   apply(var);
   var = double(1);
   apply(var);
   var = float(1);
   apply(var);
}
http://liveworkspace.org/code/ef076e...c498e9abe12d56

Но тут с вводом не покатит.
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
23.07.2012, 14:53  [ТС]     Определение введенного типа #6
ForEveR, Использование нестандартных библиотек как то сложновато, но все равно спасибо
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395
23.07.2012, 15:33     Определение введенного типа #7
Как-то разбирался с этим вопросом, свой код
Определить все данные, тип которых вводится из командной строки

А вот твой вариант этой проги:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
 
#define razmer_bufera 20
 
 
using namespace std;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
int f (char* p, char* tip) {
 
 //проверка- int не int;
 if (!(strcmp(tip, "int"))) {  
  if (atoi(p)&&!strchr(p, '.')) 
   printf ("%s целое число\n", p);
  else if ((strlen(p)==1)&& p[0]=='0') 
    printf ("%s целое число\n", p);
  return 0;
 }
 
 //проверка- double не double;
 if (!(strcmp(tip, "float"))|| !(strcmp(tip, "double"))) { 
  if (!(atoi(p)&&!strchr(p, '.')))  
   if (!((strlen(p)==1)&& p[0]=='0'))   
    if (atof(p)) 
     printf ("%s дробное число\n", p);
     return 0;
 }
 
 //проверка- char не char;
 if (!(strcmp(tip, "char"))) { 
  if (!(atoi(p)&&!strchr(p, '.')))
   if (!((strlen(p)==1)&& p[0]=='0'))
    if (!atof(p))
     if (strlen(p)== 1) 
      printf ("%s символ\n", p);
      return 0;
 }
 
 //проверка- char* не char*;
 if (!(strcmp(tip, "char*"))) { 
  if (!(atoi(p)&&!strchr(p, '.')))
   if (!((strlen(p)==1)&& p[0]=='0'))
    if (!atof(p))
     if (!(strlen(p)== 1)) 
      printf ("%s строка\n", p);
      return 0;
 }
 
 return 1;
}
 
 
 
 
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
int main(int argc, char* argv[]) {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 //Это типы
 char* tipi [4]= {(char*)"int", (char*)"double", (char*)"char", (char*)"char*"};
 
 printf ("Вводи что хочешь\n");
 
 char proba [razmer_bufera];
 //Будь осторожен с переполнением буфера!!!!
 gets (proba);
 
 
 for (int i= 0; i< 4; i++) {
  if (f (proba, tipi [i])) {
   printf ("Что-то ты не то ввёл\n");
   break;
  }    
 }
 
 getchar ();
 
 
 return 0;
}
корректно распознаёт четыре типа (float приравнен к double). Твоя задача по определению типа преобразовать его в переменную нужного типа. То есть, если ты, к примеру вводишь число 3, фактически ты вводишь строку "3", а не число. Тип определится, а вот дальше тебе нужно преобразоват "3"-> 3, смотри функции "atoi" и "atof"
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,049
Записей в блоге: 17
23.07.2012, 16:54     Определение введенного типа #8
Если не учитывать экспонентальную форму записи и отрицательность то как-то так:
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
#include <iostream>
#include <string>
#include <algorithm>
 
bool notdig(char ch) { return  !isdigit(ch) && ch!='.'; }
 
int main(int argc, char **argv)
{
using namespace std; 
 
while(true)
 {
  string s;
  getline(cin,s);
 
  if(find_if(s.begin(),s.end(),notdig) != s.end() ) cout<<"string#1"<<endl;
  else 
   {
    string::iterator b= find(s.begin(),s.end(),'.');
    if(b==s.end()) cout<<"int"<<endl;
    else
     {
       if(find(b+1,s.end(),'.')==s.end() ) cout<<"float"<<endl;
       else cout<<"string#2"<<endl;
     } 
   }
 } 
return 0;
}
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
23.07.2012, 22:38  [ТС]     Определение введенного типа #9
Огромное спасибо всем тем кто не прошел мимо . Жаль что тока что большая часть предложенных способов - это работа со строками (все-таки как ни как когда пытаешься создать программу по определению типа введенного числа ожидаешь что она будет работать с числами а не со строками ),если без строк то только способ который предложил ForEveR (тока один '-' -что там boost, а я в них ни нечего ни понимаю )
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.07.2012, 23:32     Определение введенного типа #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Эта программа определяет всё, кроме нуля с плавающей точкой:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
#include <typeinfo>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
template<class T>
double  it_is(const T_str&  s)
{
    T       t;
    char    c;
    std::istringstream  ssin(s);
    bool    bool_res    =       (ssin   >>  t) !=   0
                            &&  (ssin   >>  c)  ==  0
                            &&  t >= std::numeric_limits<T>::min()
                            &&  t <= std::numeric_limits<T>::max();
 
    if(bool_res)
    {
        std::cout   <<  t
                    <<  std::endl
                    <<  typeid(t).name()
                    <<  std::endl;
    }
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    std::cout   <<  "float_min = "
                <<  std::numeric_limits<float>::min()
                <<  std::endl;
 
    std::cout   <<  "float_max = "
                <<  std::numeric_limits<float>::max()
                <<  std::endl;
 
    std::cout   <<  "double_min = "
                <<  std::numeric_limits<double>::min()
                <<  std::endl;
 
    std::cout   <<  "double_min = "
                <<  std::numeric_limits<double>::min()
                <<  std::endl;
 
    for(;;)
    {
        T_str   s;
        std::cout   <<  "Input number of one of types int, float double: ";
        std::cin    >>  s;
        bool    int_or_float_or_double  =       it_is< int      >   (s)
                                            ||  it_is< float    >   (s)
                                            ||  it_is< double   >   (s);
 
        if( !int_or_float_or_double )
        {
            std::cout   <<  "not int and not float and not double"
                        <<  std::endl;            
        }
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }
}
Добавлено через 27 минут
Пардон, в строке 11 опечатка. Там возвращаемое значение функци bool.

Добавлено через 11 минут
Более правильный вариант (правильно обрабатывает отрицательные числа):
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iostream>
#include <limits>
#include <sstream>
#include <string>
#include <typeinfo>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
template<class T>
bool  it_is(const T_str&  s)
{
    T       t;
    char    c;
    std::istringstream  ssin(s);
    bool    bool_res    =       (ssin   >>  t) !=   0
                            &&  (ssin   >>  c)  ==  0
                            &&  abs(t) >= std::numeric_limits<T>::min()
                            &&  abs(t) <= std::numeric_limits<T>::max();
 
    if(bool_res)
    {
        std::cout   <<  t
                    <<  std::endl
                    <<  typeid(t).name()
                    <<  std::endl;
    }
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    std::cout   <<  "float_min = "
                <<  std::numeric_limits<float>::min()
                <<  std::endl;
 
    std::cout   <<  "float_max = "
                <<  std::numeric_limits<float>::max()
                <<  std::endl;
 
    std::cout   <<  "double_min = "
                <<  std::numeric_limits<double>::min()
                <<  std::endl;
 
    std::cout   <<  "double_min = "
                <<  std::numeric_limits<double>::min()
                <<  std::endl;
 
    for(;;)
    {
        T_str   s;
        std::cout   <<  "Input number of one of types int, float double: ";
        std::cin    >>  s;
        bool    int_or_float_or_double  =       it_is< int      >   (s)
                                            ||  it_is< float    >   (s)
                                            ||  it_is< double   >   (s);
 
        if( !int_or_float_or_double )
        {
            std::cout   <<  "not int and not float and not double"
                        <<  std::endl;            
        }
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 21:34     Определение введенного типа
Еще ссылки по теме:

C++ Определение типа треугольника
Определение типа объекта C++
C++ Определение типа данных
C++ Определение типа переменной
C++ Определение типа номера машины

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

Или воспользуйтесь поиском по форуму:
Xerotico
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 14
25.02.2014, 21:34     Определение введенного типа #11
Могут быть отрицательными, больше 10?
Извините, не в ту тему написал.
Yandex
Объявления
25.02.2014, 21:34     Определение введенного типа
Ответ Создать тему
Опции темы

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