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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.78
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
#1

Backspace и Delete - C++

17.04.2010, 22:56. Просмотров 6613. Ответов 9
Метки нет (Все метки)

функция обрабатывает ввод символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, –. По нажатию клавиши Esc ввод прекращается, и функция возвращает False. По нажатию клавиши Enter функция формирует число из введенных символов, передает число в Main через аргумент, и возвращает True. Функция должна проверять вводимую последовательность цифр на допустимый диапазон (+\-32767)на положение знака, на количество цифр.
Помогите изменить диапазон на (+\-32765) и чтобы по нажатию клавиши Delete все введенные цифры удалялись, но функция не завершалась. По нажатию клавиши Backspace удалялся предыдущий символ.
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
bool Input(short &num) {
    char tmp;
    short minus_flag=1;
    num=0;
    
    while(tmp=getch()) {
        switch(tmp) {
            case '0': 
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                if(num*10+(int)tmp-48<=SHRT_MAX && -1*(num*10+(int)tmp-48)>=SHRT_MIN) {
                    num*=10;
                    num+=(int)tmp-48;
                    printf("%c", tmp);
                }
                break;
            case '-': 
                if(num==0) {
                    minus_flag=-1;
                    printf("%c", tmp);
                }
                break;
            case 27: // ESC
                num*=minus_flag;
                printf("\n");
                return false;
            case 13: // ENTER
                num*=minus_flag;
                printf("\n");
                return true;
            case 8: // BackSpace
                
            case 46: // Delete
                                    
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2010, 22:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Backspace и Delete (C++):

delete vs. delete [] - C++
Всем привет, в разница использования delete и delete ? я читал, что delete используется для освобождения массивов, а delete для...

delete void* - C++
class MyClass{ public: int i; }; void main() { MyClass* MyObj = new MyClass; MyObj-&gt;i = 10; void* VoidLink =...

оператор delete у null - C++
Один человек говорил что опасно использовать такой код (delete к null указателю), ну или когда-то было опасно, и что желательно перед...

Ошибка при delete - C++
Здравствуйте, вылетает такая ошибка, почему? Указатель верный, до этого места все нормально работает

Backspace - C++ Builder
Добрый вечер. Делаю калькулятор с визуальной оболочкой в C++ Builder 2006, понадобилось добавить кнопку Backspace, чтобы удалить последний...

TMemo BackSpace - C++ Builder
Здравствуйте! У меня на форме TButton1 и TMemo, как с помощью кнопки удалить последнею букву в TMemo? Подскажите пожалуйста. :)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 01:31 #2
c Delete не уверен насчет затирания строки, но если мы знаем максимальное кол-во допустимых введенных символов то можно угадать как затереть строку, чтоб не испортить данные, не относящиеся к числу, или при каждом вводе цифры увеличивать счетчик некий и потом так же в цикле и очистить строку основываясь на счетчике кол-ва введенных символов)
C++
1
2
3
4
5
6
7
8
case 8:
    num /= 10;
    printf("\b \b");
    break;
case 46:
    num = 0;
    printf("\b \b\b \b\b \b \b\b \b\b \b");
    break;
интересная идея, у меня вот тоже есть мысли по поводу такой ф-ции, но я формирую массив символов и по нажатию Enter преобразую массив в число...
вот если интересно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int i = 0;
float X;
char c = 0, x[10];
 
while(c != 13){
      c = getch();
      if(c == 8){
            cout << "\b \b";
                  x[(i--)-1] /= 10;
      }
      if(c >= '0' && c <= '9'){
            x[i] = c;
            cout << x[i];
            i++;
      }
}
 
X = atof(x);
1
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 16:39  [ТС] #3
Да, неплохой вариант реализовать enter, я пробовала нечто подобное, но остановилась на том, что сейчас)) спасибо за помощь)) я не могла разобраться с \b, удвоить его у меня ума не хватило
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:50 #4
Цитата Сообщение от Vorona Посмотреть сообщение
c Delete не уверен насчет затирания строки, но если мы знаем максимальное кол-во допустимых введенных символов то можно угадать как затереть строку, чтоб не испортить данные, не относящиеся к числу, или при каждом вводе цифры увеличивать счетчик некий и потом так же в цикле и очистить строку основываясь на счетчике кол-ва введенных символов)
C++
1
2
3
4
5
6
7
8
case 8:
    num /= 10;
    printf("\b \b");
    break;
case 46:
    num = 0;
    printf("\b \b\b \b\b \b \b\b \b\b \b");
    break;
интересная идея, у меня вот тоже есть мысли по поводу такой ф-ции, но я формирую массив символов и по нажатию Enter преобразую массив в число...
вот если интересно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int i = 0;
float X;
char c = 0, x[10];
 
while(c != 13){
      c = getch();
      if(c == 8){
            cout << "\b \b";
                  x[(i--)-1] /= 10;
      }
      if(c >= '0' && c <= '9'){
            x[i] = c;
            cout << x[i];
            i++;
      }
}
 
X = atof(x);
может ты сможеш зделать так когда не вводиш не чево зделать чтоб оно не присваивало етому елементу масива 0
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 17:58 #5
более преобразованная ф-ция)
а на счет диапазона, думаю в 18 строке нужно так:
SHRT_MAX-2 и SHRT_MIN+2
1
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 19:05  [ТС] #6
Vorona вы просто мой спаситель!! =))) а на счет Delete и угадываний как удалить строку можно поподробней плиииз. максимальное кол-во допустимых введенных символов 6, а как это обыграть?
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 19:14 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int counter = 0; //в начале ф-ции объяви
case '9':
        if(num*10+(int)tmp-48<=SHRT_MAX && -1*(num*10+(int)tmp-48)>=SHRT_MIN) {
                num*=10;
                num+=(int)tmp-48;
                printf("%c", tmp);
                counter++;
        }
        break;
case 8:{
        num /= 10;
        printf("\b \b");
        counter--;
}
        break;
case 46:{
        num = 0;
        for(int i = 0; i < counter; i++)
                printf("\b \b");
}
        break;
что-то в таком стиле...
1
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 19:47  [ТС] #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
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
bool Input(short &num) {
    char tmp;
    short minus_flag=1;
    num=0;
    int counter=0;
    
    while(tmp=getch()) {
        switch(tmp) {
            case '0': 
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                if(num*10+(int)tmp-48<=SHRT_MAX-2 && -1*(num*10+(int)tmp-48)>=SHRT_MIN+2) {
                    num*=10;
                    num+=(int)tmp-48;
                    printf("%c", tmp);
                    counter++;
                }
                break;
            case '-': 
                if(num==0) {
                    minus_flag=-1;
                    printf("%c", tmp);
                }
                break;
            case 27: // ESC
                num*=minus_flag;
                printf("\n");
                return false;
            case 13: // ENTER
                num*=minus_flag;
                printf("\n");
                return true;
            case 8: // BackSpace
                {
                num/= 10;
                printf("\b \b");
                counter--;
                }
                break;
            case 46: // Delete
                {
                num=0;
                for(int i=0; i<counter; i++)
                                printf("\b \b");
                }
                break;
        }
    }
}
а строку удалить все равно не хочет(((
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 20:03 #9
ASCII код Delete: 83, 46 - это точка .
C++
1
2
3
4
5
6
7
8
case 83: // Delete
{       
        for(int i=0; i<counter; i++){
            num/=10;
            printf("\b \b");
        }
}
break;
или так:
C++
1
2
3
4
5
6
7
case 83: // Delete
{       
        num = 0;
        for(int i=0; i<counter; i++)
                printf("\b \b");
}
break;
1
llomushka
3 / 3 / 0
Регистрация: 21.03.2010
Сообщений: 19
18.04.2010, 20:12  [ТС] #10
блин!!! ну я и дура!!! спасибо огромное!!! ну и ступила!!! теперь все работает!!!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2010, 20:12
Привет! Вот еще темы с ответами:

ComboBox и Backspace - C++ Builder
У меня стоит запрет на нажатие всех кнопок в ComboBox:Key=0;Необходимо, чтобы можно было пользоваться клавишей Backspace

delete pi++ - C++ Builder
Всем Привет! Возникла необходимость в динамическом выделении-освобождении памяти Выделяю так: int *pi = NULL; int count = 0; ...

Оператор delete - C++ Builder
совершенно простой код, вызвал у меня взрыв мозга int* a = new int(); int* b = a; *a = 5; delete a; int * c = new int(); *c =...

Запрет нажатия клавиш Backspace и Delete - JavaScript
Подскажите пожалуйста. Как запретить использование на странице клавиш клавиатуры Backspace и Delete. Нашел такой способ, но у меня он не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.04.2010, 20:12
Ответ Создать тему
Опции темы

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