Вопрос по Visual С++

jin18
12/10/2006, 1:37:26 AM
В общем в лабораторной надо реализовать синтаксический анализатор математического выражения - подсчет зн-ния любой мат. ф-ии введенной с клавиатуры . Для этого я думаю стоит использовать класс string. То есть читаю строковую переменную, а затем с помощью уже реализованных методов класса string обрабатываю ее. Как включить библиотеку
#include <string> или #include <cstring> или #include <string.h> (все перепробовал, одновременно 2 из них не включал)? Далее объявляю переменную string s; или String s; Компилятор начинает ругаться, типа
error C2065: 'String' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 's'
error C2065: 's' : undeclared identifier
Помогите решить эту проблему. PS не могли бы так же поделиться ссылками, полезными для решения задачи синт.анализатора мат.выражения. Заранее спасибо...
kelt13
12/10/2006, 10:40:16 PM
я бы на месте компилятора тоже ругался :) string - класс из STL, оно всё живет в namespace (пространстве имен) std. Есть два варианта:

CODE
#include <string>

using namespace std;

void main(void)
{
   string s;
   // put your code here
}


CODE
#include <string>

void main(void)
{
   std::string s;
   // put your code here
}
kelt13
12/10/2006, 10:47:05 PM
да, касательно синтаксического анализа. что может быть в строке? скобки? какие операции? в зависимости от можно быстренько наваять программку.
jin18
12/10/2006, 11:43:52 PM
Ура заработало, только почему не работают перегруженные операторы cin и cout для строк:
string s = ("Stroka");
cout << s;
пишет:
error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char
Что касается анализатора: в нем могут быть скобки (), ф-ии exp, ln, sin, cos, ^n(это возведение в степень), +, -, *, /. Мне бы хотя бы идейку здравую и рациональную, не то что готовую программу(все равно в чужом коде тяжело будет разбираться). Наверное надо использовать рекурсию, возможно, бинарные деревья и их различные обходы , как у Вирта. Хотя бы без проверки на ошибки - просто чтобы правильно выдавала зн-ние ф-ии в точке. За то что уже откликнулся - огромное спасибо.
kelt13
12/11/2006, 4:01:11 PM

Ура заработало, только почему не работают перегруженные операторы cin и cout для строк:
string s = ("Stroka");
cout << s;
пишет:
error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char

ну нет там перегруженного оператора вывода в поток. попробуй

CODE
   string s;

   //...

   cout << s.c_str();



Что касается анализатора: в нем могут быть скобки (), ф-ии exp, ln, sin, cos, ^n(это возведение в степень), +, -, *, /. Мне бы хотя бы идейку здравую и рациональную, не то что готовую программу(все равно в чужом коде тяжело будет разбираться). Наверное надо использовать рекурсию, возможно, бинарные деревья и их различные обходы , как у Вирта. Хотя бы без проверки на ошибки - просто чтобы правильно выдавала зн-ние ф-ии в точке. За то что уже откликнулся - огромное спасибо.

в двух словах: можно обойтись без рекурсии и деревьев; у тебя все же задача вычислить значение математического выражения. просматриваешь строку, на лету при помощи стека перегоняешь её в обратную польскую запись и в ней же на лету же и вычисляешь. если будут сложности --- напиши, я тебе расскажу алгоритм для 4-х операций. до скобок и всего остального он дорабатывается максимум за час.
DELETED
12/13/2006, 6:01:33 PM
Очень полезная ссылка.

А это еще одна очень полезная ссылка.
jin18
12/18/2006, 6:27:34 AM
Парни, до сих пор мучаюсь. Вроде выдает ответ правильно. Ho у меня там встроенная ф-ия, которая преобразует любое число типа double(целое или вещественное) в строку. Работает она сначала нормально, но когда на входе число содержащее большое кол-во цифр, напр. 6.429999625 она не работает. Просто у меня в цикле это число умножается на 10-ку в возрастающей степени(6.429999625, 64.29999625, 642.9999625 и т.д.) пока не станет целым. Мне на этом этапе надо определить положение точки(считая с конца числа - то есть сколько раз я на 10 умножал), и получить целое число = 6429999625 , которое я потом обрабатываю - получаю символы '5', '2', '6', '9', ..., '6'. И записываю их в строку. Но вот проблема: тип целое число имеет максимальное зн-ние 2147483648. Так что нельзя присвоить целому числу это зн-ние 6429999625, и для чисел с кол-вом цифр больше 9 не работает алгоритм. А только целое число можно делить по модулю. Значит по символам мне его не разобрать. Sorry за этот детский лепет, но в инете ничего не нашел для C++ по этому вопросу. Встроенной ф-ии вроде нет и никак чето не получается. А с выражением вроде все пока работает, спасибо(я с ним несколько дней мучался). Не могли подсказать че делать? Заранее спасибо
jin18
12/18/2006, 6:30:01 AM
Да совсем забыл
cout << s.c_str();
работает, а для cin >> нет подобной ф-ии?
DELETED
12/18/2006, 1:30:38 PM
(jin18 @ 18.12.2006 - время: 03:27) Ho у меня там встроенная ф-ия, которая преобразует любое число типа double(целое или вещественное) в строку.
CODE char *  gcvt ( double value, int num, char * buffer ); // Convert floating point value to string
char *  fcvt ( double value, int num, int * dec, int * sign ); // Convert floating point value to string
pomogite
5/30/2010, 2:12:53 AM
Помогите решить...............Дана целочисленная матрица размера n X m, в которой имеются ровно два одинаковых элемента. Найти индексы этих элементов.
DELETED
5/30/2010, 6:15:03 AM
stl? c? cpp?
pomogite
5/30/2010, 11:11:54 AM
сpp
DELETED
5/30/2010, 7:12:49 PM
Дублирование было излишним. Смотрите Вашу тему.