Фрилансеров: 4472 Работодателей: 479 Заказов: 485
Авторизация Нет аккаунта? Регистрация
Удаленная работа, работа на дому, фриланс
 
Поиск работы / Работа по выходным
offline ContentUM / 23.12 (19:05)
Дизайн / Дизайнер для удаленной работы
offline ContentUM / 14.12 (18:26)
Поиск работы / Копирайтер
offline ContentUM / 25.11 (17:16)
Продвижение сайтов / Использование тега title
offline ContentUM / 21.11 (12:05)
Поиск работы / Перспективные направления поиска работы
offline ContentUM / 11.11 (16:48)
Поиск работы / Командная работа фрилансеров
offline ContentUM / 03.11 (15:44)
Продвижение сайтов / SEO копирайтинг – волшебство для сайтов
offline ContentUM / 26.10 (14:03)
Поиск работы / Начинающему фрилансеру посвящается
offline ContentUM / 20.10 (12:13)
Поиск работы / Осторожно! Тестовые задания для фрилансера
offline ContentUM / 19.10 (14:31)
Поиск работы / Творческие люди
offline Producer / 31.07 (20:12)

Программирование → Ввод чисел в консольных приложениях

Размещена: 21.05.2009 11:52

Автор: Виталий Рычков (WinMain)

 Для решения задач на C++ в приложениях с консольным интерфейсом возникает необходимость ввода числовых величин с возможностью их корректировки. Числовые значения могут быть целочисленными и вещественными (иметь десятичную дробь), положительными и отрицательными.
В данной статье будут рассмотрены примеры двух функций, одна из которых предназначена для ввода только целых положительных чисел, а другая функция позволяет ввести число с плавающей точкой и знаком «минус». Обе функции позволяют корректировать значения вводимых чисел.
Максимально-допустимые значения чисел, которые можно ввести с помощью этих функций, ограничены в одном случае максимальным значением 32-разрядного целого числа без знака, а в другом случае - длиной строки.
Реализация этих функций в Visual C++ 2005 выглядит так:

#include "stdafx.h"

#include

#include

unsigned InputInteger()

{

      const int _key_back     (0x08);

      const int _key_enter    (0x0D);

      _TCHAR text[16] = _T(""), limit[16];

      size_t max_len = _stprintf_s(limit, _T("%u"), UINT_MAX);

      //

      int pos = 0;

      bool _exit = false;

      while (!_kbhit() && !_exit)

      {

            int ch = _gettch();

            if (pos == max_len && ch != _key_back && ch != _key_enter)

                  continue;

            //

            switch (ch)

            {

                  case _key_enter : // Enter

                        _exit = true;

                        break;

                  case _key_back :  // Back

                        if (pos > 0)

                        {

                             text[--pos] = '\0';

                             _tprintf(_T("\b \b"));

                        }

                        break;

                  default :   // Any key

                        if (_istdigit(ch) > 0)

                        {

                             text[pos++] = ch, text[pos] = '\0';

                             if ((pos == max_len) && (_tcscmp(text, limit) > 0))

                             {

                                   text[--pos] = '\0';

                             } else

                             {

                                   _tprintf(_T("%c"), ch);

                             }

                        }

                        break;

            }

      }

      //

      unsigned result = 0;

      _stscanf_s(text, _T("%u"), &result);

      return result;

}

double InputDouble()

{

      const int _key_back     (0x08);

      const int _key_enter    (0x0D);

      int p = 0;

      bool end_line = false;

      TCHAR _str[32] = _T("");

      int max_len = sizeof(_str)/sizeof(TCHAR)-1;

      //

      while (!end_line)

      {

        int ch = _gettch();

        if (p == max_len && ch != _key_enter && ch != _key_back)

            continue;

            if (ch == '.' && _tcschr(_str, '.') != NULL)

                  continue;

            if (ch == '-' && _str[0] != '\0')

                  continue;

            switch (ch)

            {

            case _key_enter : 

                end_line = true;

                break;

            case _key_back :  

                if (p > 0)

                {

                    _str[--p] = '\0';

                    _tprintf(_T("\b \b"));

                }

                break;

            default:

                if (_istdigit(ch) > 0 || ch == '.' || ch == '-')

                {

                    _str[p++] = ch;

                    _str[p] = '\0';

                    if (p == max_len)

                    {

                        _str[--p] = '\0';

                    } else

                    {

                        _tprintf(_T("%c"), ch);

                    }

                }

                break;

            }

      }

      //

      return _tstof(_str);

}

 

int _tmain(int argc, _TCHAR* argv[])

{

      _cputts(_T("Ввод целого числа: "));

      unsigned val = InputInteger();

      _cputts(_T("\r\n"));

      _tcprintf(_T("Число = %d\r\n"), val);

      //

      _cputts(_T("Ввод дробного числа: "));

      double num = InputDouble();

      _cputts(_T("\r\n"));

      _tcprintf(_T("Число = %f\r\n"), num);

      //

      _gettch();

      return 0;
}

Автор: offlineadmin
Комментариев нет
Обсуждение:
Оставлять комментарии могут только зарегистрированные пользователи