shock_X можешь посмотреть нек моменты в моей старой теме по схожему вопросу: http://www.rsdn.ru/Forum/?mid=2857791
Без функции, которая "просмотрит" всю введенную строку, не обойтись. Читай строку с консоли, не число. И затем сделай функцию: сначала смотришь если есть минус - если есть, то продвигаешь адрес - пропуская этот минус и затем все символы должны быть цифрами: Код (Text): int IsNumeric (char* s) { if (*s == '-') { s++; } char ch; while ((ch = *s++) != 0) { if (! isdigit (ch)) { return 0; // Not a valid format } } return 1; // All digits } Доработай там, наверное, так как, например: "+76" не будет определено как верный формат. Ну или, например: "-8273463764874798437" будет определено как верный, хотя конвертирование вернёт ошибку переполнения.
Можно заюзать boost::lexical_cast. Он сначала выводит один тип в поток (std::ostream) а потом выводит другой из потока. Ежели чего не сработало кидает boost::bad_lexical_cast. И для того чтобы свои типы приводить к разным типам надо переопределить операторы << (std::ostream &,...), >> (std::istream &). Естественно способ не самый быстрый. Код (Text): int x = boost::lexical_cast<int, std::string>("1234"); std::string str = boost::lexical_cast<std::string, double>(x);
Да, вариантов много, но ничего не помогает. может подскажите что сделать/прописать, чтобы в нижеследующем коде не было зацикливания. Код (Text): #include <stdio.h> #include <stdlib.h> int main () { int test; do // этот цикл получается "бесконечным", если ввели не число { system("cls"); printf("i="); scanf("%d", &test); } while (test<-100 || test>100); printf ("i=%d", test); return 0; } И ещё вопрос. Оператор scanf("%d", &test); сканирует целое число со знаком. А это не подразумевает, что он будет сканировать только целое число? Ведь символы ввести тоже можно, а из-за них происходит зацикливание...
Clear_Energy Я с первого поста этой темы прошу в этом помочь. Если б я знал как это делать, я бы стал здесь писать?!
Внес изменения в программу, решил одну проблему, появилась другая... Ниже код функции, в которой осуществляется ввод числа и проверка диапазона и числового формата (алгоритм тут -> http://www.wasm.ru/forum/viewtopic.php?pid=282111#p282111): Код (Text): int EnterWithCheck(int& test) { bool NoError; do { system("cls"); NoError=true; cout << "Введите число от -100 до 100 "; cin >> test; cout << "Нажмите 'Enter' для продолжения" << endl; system("pause"); if (cin.good()) { cin.ignore(10, '\n'); // и расскажите плз что значат цифры в этой строке break; } cin.clear(); cin.ignore(10, '\n'); if (test < -100 || test > 100) { NoError=false; ErrorScreen(); // сообщение об ошибке } } while (NoError==false); return test; } Далее в программе эта функция используется трижды, т.е. получаем три переменные для дальнейшего использования: test1, test2, test3. Переменная test2 не равна test1, а переменная test3 не равна test2 и не равна test1. Когда используем функцию первый раз - то при вводе знаков (не чисел) программа не ругается, а когда используется второй и третий раз - то ругается (опять же, если ввести знаки). Вопрос - почему так?
Решил задачу, изменив алгоритм. Тему можно закрывать, но напоследок... 2 Johnikum: А чем мне помогла бы книга - Ахо А., Сети Р., Ульман Д. "Компиляторы. Принципы, технологии, инструменты" ? Я же не спрашивал как работают компиляторы, вопрос был совершенно другой
shock_X попробую ответить за уважаемого Johnikum: тем, что в этой книге, как минимум рассмотрена задача лексического анализа (читай: парсинга). как раз то, что тебе нужно.
varnie ну смысл того, что мне нужно сделать я понимаю. На паскале я могу реализовать это запросто. Но с Си++ я имею дело только 2 месяца. А как показала данная тема + множество других тем на разных сайтах и форумах -- решить одну задачу можно не то что разными способами, а используя совершенно разные функции... Спасибо тем, кто помог в той или иной мере, кто сказал какие можно использовать функции, но... по моему начальному алгоритму решения я не нашёл, поэтому пришлось его переделать, используя уже полученные навыки и знания.
shock_X раз спрашиваешь - значит книгу не читал... там есть разбор выражений в том числе и числовых varnie именно
shock_X с каких это пор? может из-за того, что ты пытаешся с помощью "^" возводить в степень, а компилятор по стандарту считает xor