функция ввода числа с клавиатуры

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Владимир_
Сообщения: 7
Зарегистрирован: 29 апр 2009, 20:50

Написать функцию, обеспечивающую ввод с клавиатуры дробного числа. При нажатии клавиши соответствующий символ появляется на экране только в том случаи, если этот символ является допустимым в данной позиции. Например функция не должна допускать ввод более чем одной точки и знака минус не в первой позиции. Функция должна позволять редактировать введенное число при помощи клавиши <BackSpace>. При нажатии клавиши <Enter> функция должна завершать работу и возвращать введенное число. Не могу с ней разобраться... надеюсь кто поможет. Заранее благодарен.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------

Код: Выделить всё

#include "stdafx.h"
#include <conio.h>

unsigned getNumber()
{
    const int _key_back (0x08);
    const int _key_enter    (0x0D);

    _TCHAR text[16] = _T(""), limit[16];
    size_t max_len = _stprintf(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';
                    _fputts(_T("\b \b"), stdout);
                }
                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
                    {
                        _fputtc(ch, stdout);
                    }
                }
                break;
        }
    }
    //
    unsigned result = 0;
    _stscanf(text, _T("%u"), &result);

    return result;
}

using std::cout;
using std::endl;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Input: ";
    unsigned num = getNumber();
    cout << endl;
    cout << "Output: " << num << endl;
    //
    _gettch();

    return 0;
}
Вот похожий код... может кто все таки поможет.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

А что похожий пример не работает ? Я не разбирался досконально, но похоже, что это - вариант.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Владимир_
Сообщения: 7
Зарегистрирован: 29 апр 2009, 20:50

В том то и дело, что компилятор ругается...
Не могу понять в чем проблема.
Visual Studio стоит 2005. Может нужна 2008???
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В том примере мой код, который я когда-то публиковал на этом форуме. Но он применим только для ввода целочисленных без-знаковых величин. А для ввода и правки чисел с плавающей запятой нужен другой код.
Владимир_
Сообщения: 7
Зарегистрирован: 29 апр 2009, 20:50

WinMain , может можно как-то с тобой договориться насчет этой задачи???
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
WinMain ? у меня почему-то тот твой код не компилируется...
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Видимо этот код был сделан на более ранних версиях Visual C++.

Вот как он будет выглядеть в Visual C++ 2005...

Код: Выделить всё

#include "stdafx.h"
#include <conio.h>
#include <iostream>

unsigned getNumber()
{
    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';
                    _fputts(_T("\b \b"), stdout);
                }
                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
                    {
                        _fputtc(ch, stdout);
                    }
                }
                break;
        }
    }
    //
    unsigned result = 0;
    _stscanf_s(text, _T("%u"), &result);

    return result;
}

using std::cout;
using std::endl;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Input: ";
    unsigned num = getNumber();
    cout << endl;
    cout << "Output: " << num << endl;
    //
    _gettch();

    return 0;
}
Владимир_
Сообщения: 7
Зарегистрирован: 29 апр 2009, 20:50

А что это за функции: size_t и UINT_MAX???
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

А что это за функции: size_t и UINT_MAX???
Это не функции, это тип данных и константа.
А на счёт договориться... ну напиши полностью условие задачи.
Или тебе только одна эта функция нужна?
Владимир_
Сообщения: 7
Зарегистрирован: 29 апр 2009, 20:50

Это и было условие задачи, которое в самом начале написано)
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Отправь мне сообщение на почту: rychkov@inbox.ru со своего адреса.
Ответить