Closed TopicStart new topicStart Poll

Страницы: (1) 1 
jin18
дата: [ i ]
  • *
  • Новичок
  • Репутация: 11
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
В общем в лабораторной надо реализовать синтаксический анализатор математического выражения - подсчет зн-ния любой мат. ф-ии введенной с клавиатуры . Для этого я думаю стоит использовать класс 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
дата: [ i ]
  • *
  • Новичок
  • Репутация: 1
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
я бы на месте компилятора тоже ругался :) 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
дата: [ i ]
  • *
  • Новичок
  • Репутация: 1
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
да, касательно синтаксического анализа. что может быть в строке? скобки? какие операции? в зависимости от можно быстренько наваять программку.
jin18
дата: [ i ]
  • *
  • Новичок
  • Репутация: 11
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Ура заработало, только почему не работают перегруженные операторы 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
дата: [ i ]
  • *
  • Новичок
  • Репутация: 1
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
QUOTE

Ура заработало, только почему не работают перегруженные операторы 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();


QUOTE

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


в двух словах: можно обойтись без рекурсии и деревьев; у тебя все же задача вычислить значение математического выражения. просматриваешь строку, на лету при помощи стека перегоняешь её в обратную польскую запись и в ней же на лету же и вычисляешь. если будут сложности --- напиши, я тебе расскажу алгоритм для 4-х операций. до скобок и всего остального он дорабатывается максимум за час.

Это сообщение отредактировал kelt13 - 11-12-2006 - 14:01
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
Очень полезная ссылка.

А это еще одна очень полезная ссылка.

Это сообщение отредактировал JeyLo - 13-12-2006 - 16:04
jin18
дата: [ i ]
  • *
  • Новичок
  • Репутация: 11
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Парни, до сих пор мучаюсь. Вроде выдает ответ правильно. Ho у меня там встроенная ф-ия, которая преобразует любое число типа double(целое или вещественное) в строку. Работает она сначала нормально, но когда на входе число содержащее большое кол-во цифр, напр. 6.429999625 она не работает. Просто у меня в цикле это число умножается на 10-ку в возрастающей степени(6.429999625, 64.29999625, 642.9999625 и т.д.) пока не станет целым. Мне на этом этапе надо определить положение точки(считая с конца числа - то есть сколько раз я на 10 умножал), и получить целое число = 6429999625 , которое я потом обрабатываю - получаю символы '5', '2', '6', '9', ..., '6'. И записываю их в строку. Но вот проблема: тип целое число имеет максимальное зн-ние 2147483648. Так что нельзя присвоить целому числу это зн-ние 6429999625, и для чисел с кол-вом цифр больше 9 не работает алгоритм. А только целое число можно делить по модулю. Значит по символам мне его не разобрать. Sorry за этот детский лепет, но в инете ничего не нашел для C++ по этому вопросу. Встроенной ф-ии вроде нет и никак чето не получается. А с выражением вроде все пока работает, спасибо(я с ним несколько дней мучался). Не могли подсказать че делать? Заранее спасибо

jin18
дата: [ i ]
  • *
  • Новичок
  • Репутация: 11
  • Статус: Давай пообщаемся!
  • Member OfflineМужчинаСвободен
Да совсем забыл
cout << s.c_str();
работает, а для cin >> нет подобной ф-ии?
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
QUOTE (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
дата: [ i ]
  • *
  • Новичок
  • Репутация: 1
  • Статус: Давай пообщаемся!
  • Member OfflineСвободен
Помогите решить...............Дана целочисленная матрица размера n X m, в которой имеются ровно два одинаковых элемента. Найти индексы этих элементов.
дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
stl? c? cpp?
pomogite
дата: [ i ]
  • *
  • Новичок
  • Репутация: 1
  • Статус: Давай пообщаемся!
  • Member OfflineСвободен
сpp

дата: [ i ]
  • Unregistered
  • Статус:
  • Свободен
Дублирование было излишним. Смотрите Вашу тему.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)

Страницы: (1) 1

Closed TopicStart new topicStart Poll0


Рекомендуем почитать также топики:

F.E.A.R Как? Страшно?

Фильм в планшете

Виндов в России больше не будет!

IP КАМЕРЫ

Мерцает монитор



>