Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключить ввод "букв" в консоль 
V
    Опции темы
Alix36
Дата 11.9.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: нет
Всего: 3



Какими способами можно ограничить ввод символов букв в программу.
Код

float count2,result;
void main (void)                    
{
setlocale(LC_ALL, "Russian");
        cin>>count2;
    if(int(count2)==count2 && count2>0)
    {
        cout <<"Результат:" << exeFunc(count2);
    }else{
        cout <<"Результат: Введены некорректные параметры.";
    }
}

теми проверками что есть, ограничиваем исполнение при отрицательном или не целом числе.....
Из идей:
1) Проверять коды вводимых символов через getch().  Не вышло. Если начинаем ввод(cin) проверка уже не работает... что логично... 
2) "стирать" все не цифры, при попытке ввода.  Не могу придумать алгоритм... smile 
3) проверять при вводе(isdigit)  Функция всегда возвращает 0, независимо от того что ввели....


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Anikmar
Дата 11.9.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Alix36 @  11.9.2009,  16:04 Найти цитируемый пост)
Проверять коды вводимых символов через getch().  

Самое простое именно так.
PM MAIL ICQ   Вверх
Alix36
Дата 11.9.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: нет
Всего: 3



а как тогда? пример в студию...
Самое простое оказалось под носом.
переменная то float....
Все буквы и буквенные выражения =0.0000


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Anikmar
Дата 11.9.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Alix36 @  11.9.2009,  16:56 Найти цитируемый пост)
пример в студию...

А где щелчок пальцами? "Официант! Кальмаров и пример в студию!"  smile 

как-то так:
Код

char Cur;
char Buff[10];
int i=0;
do{
  Cur = getch();
  if ((Cur >= '0')&&(Cur <='9')||(Cur == '.'))
  {
      putch(Cur);
      Buff[i++] = Cur;
   }
  if (i==9) break;
}while(Cur != '\n');
Buff[i] = 0;



Это так - набросок. 
PM MAIL ICQ   Вверх
bsa
Дата 11.9.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



У тебя ошибка в самом начале программы - функция main() определена неверно:
Код
void main (void)
Должно быть так:
Код
int main()
или так:
Код
int main(int argc, char *argv[])

Хочу обратить внимание, что функция getch() не входит ни в один стандарт. Поэтому собираться программа с ее использованием будет далеко не на всех платформах.
PM   Вверх
Anikmar
Дата 11.9.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(bsa @  11.9.2009,  19:12 Найти цитируемый пост)
Хочу обратить внимание, что функция getch() не входит ни в один стандарт. Поэтому собираться программа с ее использованием будет далеко не на всех платформах. 


Честно говоря не встречал компилятора, в котором нет conio.h, но соглашусь, что можно использовать что-нибудь аналогичное (например из stdio.h типа getc/putc), которое включено в стандарт. Суть не меняется. Не думаю, что данный код претендует на гениальность и повсеместное применение.  smile

На самом деле я так редко пользуюсь этими функциями, что уже все позабывал - что там есть, чего нет.  smile 
PM MAIL ICQ   Вверх
bsa
Дата 11.9.2009, 20:06 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Anikmar, getc работает только после ввода всей строки (т.е. после нажатия клавиши Enter). Это означает, что пользователь может ввести левые символы, а ты с этим поделать ничего не сможешь. Имхо, проще считать просто строку, проверить на допустимые символы, если есть недопустимые - потребовать повторного ввода.
PM   Вверх
Anikmar
Дата 11.9.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(bsa @  11.9.2009,  20:06 Найти цитируемый пост)
getc работает только после ввода всей строки 

Да я же просто навскидку пример привел  smile 
Цитата(bsa @  11.9.2009,  20:06 Найти цитируемый пост)
Имхо, проще считать просто строку, проверить на допустимые символы, если есть недопустимые - потребовать повторного ввода. 

Там предел фантазий неограничен, но так некрасиво. Прикольнее просто запретить вводить по ходу пьесы, а заодно топикстартер может потренироваться на строках типа
--0.998.000 или -56.89+9 и т.п.  smile 
PM MAIL ICQ   Вверх
Alix36
Дата 12.9.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: нет
Всего: 3



1) void main(void) ничем не хуже int main(void)
программа не работает с внешними праметрами. И зачем ей что-то возвращать? 
2) платформа у меня определенная, программа узконаправленная smile conio подходит... 
Anikmar, Пожалуйста, Спасибо!!! 

"Имхо, проще считать просто строку, проверить на допустимые символы, если есть недопустимые - потребовать повторного ввода. "
ну... если строку оставить float, тогда все "нехорошие символы" будут нулями, и как их тогдаотличать от действительных нулей?.
 если вводить в char, то в итоге получаем тот-же цикл.


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Kanes
Дата 12.9.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 11.3.2005

Репутация: нет
Всего: нет



Цитата(Alix36 @  12.9.2009,  11:45 Найти цитируемый пост)
void main(void) ничем не хуже int main(void)
программа не работает с внешними праметрами. И зачем ей что-то возвращать? 

Коллега, не путайте Си и С++, в стандрате С++ строго оговорено что функция main() может иметь только два вида, которые привел bsa.
--------------------
Big gun - big future  
PM MAIL   Вверх
Alix36
Дата 12.9.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: нет
Всего: 3



хм... честно говоря не читал саму документацию... в книгах были и такие и такие конструкции.
По факту работает и то и то. но все таки буду знать.
вот переделанный рабочий код smile спасибо всем smile
Код

char Cur;
char Buff[20];
int i=0;
while(i<20)
{
    Cur = getch();
  if(Cur==13) break;
  if ((Cur >= '0')&&(Cur <='9'))
  {
      putch(Cur);
      Buff[i++] = Cur;
   }
  if (i==19) break;
}
Buff[i] = 0;
cout << Buff;

do-while не верно работает ибо прерывание по пробелу происходит после того как i может превысить лимит массива, соответственно теряем нулевой.

Либо можно просто  добавить if(Cur==13) break;, но 2 проверки на пробел не круто.



--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Anikmar
Дата 12.9.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Alix36 @  12.9.2009,  20:27 Найти цитируемый пост)
while(i<20)


Цитата(Alix36 @  12.9.2009,  20:27 Найти цитируемый пост)
if (i==19) break;


Как-то запутано тут все у вас. Главное условие цикла никогда не сработает. Можно смело писать while(true)
PM MAIL ICQ   Вверх
Alix36
Дата 13.9.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: нет
Всего: 3



а разве 19 не меньше 20 ? на последнем и срабатывает.

Я решил еще подумать....!

и сделал без массива... но чую сделал лишний switch, подскажите, можно ли от него избавиться?
Код

while(1>0)
{
    Cur = getch();
    if(Cur==13) break;
// если Ентер
    if ((Cur >= '0')&&(Cur <='9'))
    {
        switch(Cur){
            case 48: Cur=0;break;
            case 49: Cur=1;break;
            case 50: Cur=2;break;
            case 51: Cur=3;break;
            case 52: Cur=4;break;
            case 53: Cur=5;break;
            case 54: Cur=6;break;
            case 55: Cur=7;break;
            case 56: Cur=8;break;
            case 57: Cur=9;break;

        }
        cout << Cur;
// выводим выбранный символ.
        count=count*10+Cur;
// преобразуем символы с клв. в единое число :)
    }
}



--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Anikmar
Дата 13.9.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Alix36 @  13.9.2009,  21:25 Найти цитируемый пост)
    if ((Cur >= '0')&&(Cur <='9'))
    {
        switch(Cur){
            case 48: Cur=0;break;
            case 49: Cur=1;break;
            case 50: Cur=2;break;
            case 51: Cur=3;break;
            case 52: Cur=4;break;
            case 53: Cur=5;break;
            case 54: Cur=6;break;
            case 55: Cur=7;break;
            case 56: Cur=8;break;
            case 57: Cur=9;break;

        }

Можно ли избавиться? Вы сами внимательно посмотрите на то, что написали.
Может проще так:
Cur-=48;
Вот и избавились.

Это сообщение отредактировал(а) Anikmar - 13.9.2009, 21:35
PM MAIL ICQ   Вверх
Alix36
Дата 13.9.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: нет
Всего: 3



ну я же говорю что я лишнее что-то сделал ))



--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.