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

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

Войти
Регистрация
Восстановить пароль
 
 
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
#1

трабл с вводом с клавиатуры - C++

09.03.2013, 02:54. Просмотров 675. Ответов 20
Метки нет (Все метки)

суть программы
я ввожу 2 числа и программа вычисляет такую штуку:
число1%число2
в head объявляю класс
в method описываю методы класса
в main пример работы
вот, что наработал:
head
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
class integer
    {
    private:
        char chnum[6];
        char chmod[6];
        int num;
        int mod;// возможность выбора делителя
    public:
        int division();
        integer();
    };
method
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
#include "head.h"
#include <iostream>
#include <string>
int integer::division()
    {
       int res;
       res=num%mod;
       std::cout<<"Result:"<<std::endl;
       return res;
    }
integer::integer()
    {
       std::cout<<"enter num"<<std::endl;
       std::cin>>chnum;
       bool a=true;
       for (int i=0; i<5; i++)
           {
             if(chnum[i]<'0' || chnum[i] >'9')
                 {
                   a=false;
                   std::cout<<"error";
                   break;
                 }
           }
       if (a!=0)
           {
             num=atoi(chnum);
           }
       std::cout<<"enter mod"<<std::endl;
       std::cin>>chmod;
       bool b=true;
       for (int i=0; i<5; i++)
           {
             if(chmod[i]<'0' || chmod[i] >'9')
                 {
                   b=false;
                   std::cout<<"error";
                   break;
                 }
           }
       if (b!=0)
           {
             mod=atoi(chmod);
           }
    }
main
C++
1
2
3
4
5
6
7
#include <iostream>
#include "head.h"
void main()
    {
        integer a;
        std::cout<<a.division()<<std::endl;
    }
чуть не забыл, хочу запретить ввод букв, а вернее выдавать ошибку при вводе буквы
идея у меня была такая: проверить каждый элемент массива чар на то, буква ли он, если буква, то выдадим ошибку
если цифра, то массив через atoi передадим в интовую переменную, но хоть убей не получается( есть подозрение, что что-то не так с условием проверки на букуву)
нид хелп
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 11:36     трабл с вводом с клавиатуры #2
Простой метод: пройтись посимвольно и посчитать количество цифр. Если их меньше длины строки, значит, число уже не целое.
C++
1
2
3
4
5
6
7
8
char a[6];
int cnt = 0;
std::cin>>a;
for (int i=0; i<strlen(a); ++i)
   if (isdigit(a[i]))
      cnt++;
if (cnt != strlen(a))
   std::cout<<"Err";
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 11:39  [ТС]     трабл с вводом с клавиатуры #3
BumerangSP, что делает isdigit?
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 11:45     трабл с вводом с клавиатуры #4
lowlol, проверяет символ на цифру. Можно конечно и так, но так длиннее.
C++
1
if (a[i]>='0' && a[i]<='9')
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 11:54  [ТС]     трабл с вводом с клавиатуры #5
Цитата Сообщение от BumerangSP Посмотреть сообщение
lowlol, проверяет символ на цифру. Можно конечно и так, но так длиннее.
C++
1
if (a[i]>='0' && a[i]<='9')
насчет такого способа:
в коде, который наверху, я и пытался его осуществить, но, допустим, когда я вводил 123, он выводил error.когда вводил какую либо букву - аналогичная ситуация.а когда вводил допустим 1234567abc, т.е. строку подлиннее, то error он не выдавал
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 11:56     трабл с вводом с клавиатуры #6
lowlol, так там стоит "или" (||) вместо "и"(&&). Это разные вещи. Причем должно быть >= и <=. Т.к. если в строке будет 0 или 9, то они не пройдут по условию.
Насчет длинной строки: если мы вводим символов больше, чем места под них выделили, то конец отсекается. Видимо, символы тогда и отсеклись.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 12:08  [ТС]     трабл с вводом с клавиатуры #7
BumerangSP, у меня было: если элемент левее 0 или правее 9, то я останавливаю цикл и выдаю ошибку. так неверно?
C++
1
2
3
4
5
if(chnum[i]<'0' || chnum[i] >'9')
                 {
                   a=false;
                   std::cout<<"error";
                   break;
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 12:21     трабл с вводом с клавиатуры #8
lowlol, и что, сейчас также при тех примерах выдает ошибки? В своем примере я указал точный промежуток от 0 до 9.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 12:24  [ТС]     трабл с вводом с клавиатуры #9
BumerangSP,
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::cout<<"enter num"<<std::endl;
       std::cin>>chnum;
       int c=0;
       for (int i=0; i<5; i++)
           {
              if(isdigit(chnum[i]))
                  c++;
           }
       if (c!=strlen(chnum))
           {
              std::cout<<"Err";
           }
если пишу вот так, то вылетает окно с дебаг асертейшн фэил: с>= -1 && c<=255
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 12:29     трабл с вводом с клавиатуры #10
Проблема может быть в кодировке, русских буквах и прочем. Кстати, а чего цикл только до 5? До 6 надо.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 12:30  [ТС]     трабл с вводом с клавиатуры #11
BumerangSP, ну так с нулевого же: 0 1 2 3 4 5, итого 6 элементов
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 12:31     трабл с вводом с клавиатуры #12
lowlol, там стоит <5, а, значит, до 5 он и не дойдет. Либо <=5, либо <6.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 12:38  [ТС]     трабл с вводом с клавиатуры #13
BumerangSP, точно, сейчас исправлю

Добавлено через 4 минуты
BumerangSP, в общем, я кажется понял
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::cout<<"enter num"<<std::endl;
       std::cin>>chnum;
       bool a=true;
       for (int i=0; i<6; i++)
           {
             if((chnum[i]>='0' && chnum[i] <='9')==0)
                 {
                   a=false;
                   std::cout<<"error";
                   break;
                 }
           }
вот с таким кодом, он не выводит еррор только если я ввожу 6 значное число, т.е. мне нужно как-нибудь не проверять пустые элементы массива
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 12:57     трабл с вводом с клавиатуры #14
lowlol, это тоже не совсем верно. Длина строки не всегда 6 будет. А если ввести меньше 6 символов? Уже неверно. Надо до длины строки - strlen(chnum).

Добавлено через 2 минуты
Цитата Сообщение от lowlol Посмотреть сообщение
проверять пустые элементы массива
какие такие пустые?
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 13:01  [ТС]     трабл с вводом с клавиатуры #15
BumerangSP, спасибо, все заработало, но есть еще один аспект, выдает err только если я ввожу англ буквы, с русскими ассертейшн фэил

Добавлено через 49 секунд
Цитата Сообщение от BumerangSP Посмотреть сообщение
lowlol, это тоже не совсем верно. Длина строки не всегда 6 будет. А если ввести меньше 6 символов? Уже неверно. Надо до длины строки - strlen(chnum).

Добавлено через 2 минуты

какие такие пустые?
ну допустим если я ввел 1, то у меня массив был бы 1 0 0 0 0 0
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 13:20     трабл с вводом с клавиатуры #16
Там не всегда нули. Мусор всякий, в основном.
В 12-ой студии проблем с русскими символами нет.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 13:26  [ТС]     трабл с вводом с клавиатуры #17
BumerangSP, http://img16.imageshack.us/img16/5451/88219761.png
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 13:35     трабл с вводом с клавиатуры #18
пред. код.
Миниатюры
трабл с вводом с клавиатуры  
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
09.03.2013, 13:41  [ТС]     трабл с вводом с клавиатуры #19
BumerangSP, почему тогда у меня ошибку выдает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 14:13     трабл с вводом с клавиатуры
Еще ссылки по теме:

Функция в трабл C++
C++ Трабл с вводом/выводом
Трабл линковки C++
C++ найти точки пересечения 2 кругов с вводом с клавиатуры центрами и радиусами
Управление вводом с клавиатуры в С++ C++

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

Или воспользуйтесь поиском по форуму:
BumerangSP
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
09.03.2013, 14:13     трабл с вводом с клавиатуры #20
lowlol, надо в самой студии настройки смотреть.
Yandex
Объявления
09.03.2013, 14:13     трабл с вводом с клавиатуры
Ответ Создать тему
Опции темы

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