Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 15:32   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию win calc

у меня вопрос, как в калькуляторе(не консольный) можно вычислять выражения на "лету", например (1+2)*10-5+2, т.е жмешь 1 потом + ...2...*...10...-...5...2...=
а не так: 1...+...2...=...*...10...=...-...5...=...+...2...=
как такое реализовать. Была идея создать переменные(флажки) и устанавливать и снимать их когда надо, мб есть другой способ?

5+3+2=10
этот алгоритм будет вычислять: 5+3=8 8+2=10
Код:
событие кнопки +:
arg1 = строка из edit
_op = '+'

событие кнопки =:
arg2 = строка из edit
arg1+=arg2
edit->text = arg1

итд
надеюсь вопрос понятен?)
NiCola999 вне форума Ответить с цитированием
Старый 13.03.2010, 15:41   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Почитайте Страуструпа, там в главе 6 (по крайней мере, в Специальном издании) есть подробное описание калькулятора со скобками.
Там, конечно, консоль, но основное отличие будет только в формировании строки - там она просто сразу вводится с клавиатуры (или передается как параметр программе), а здесь вы используете кнопки калькулятора в качестве клавиш пишущей машинки, по нажатию "=" считаете, что ввод закончен. А потом обрабатываете по алгоритму калькулятора.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 13.03.2010, 15:47   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

значит я несовсем корректно задал вопрос), дело в том что когда например считаешь 1+2+3 на нормальном кальуляторе, жмешь 1 потом + потом 2, затем после нажатия + в edit выводится результат 1+2, вот как так сделать. В событии нажатия кнопки + надо дописать какое-то условие чтоб вычислялся результат, вот такое я что-то не могу придумать...
NiCola999 вне форума Ответить с цитированием
Старый 13.03.2010, 19:12   #4
Stepler
Форумчанин
 
Аватар для Stepler
 
Регистрация: 03.02.2008
Сообщений: 213
По умолчанию

Использовать обратную польскую запись и как вариант алгоритм дейкстры.
Пишу программы на заказ, контакты под аватаром!
Отзывы тут
Stepler вне форума Ответить с цитированием
Старый 13.03.2010, 20:23   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

о_О а она тут каким боком? Хотите сказать калькулятор винды сделан с польской записью ? Возможно вы не поняли что я хочу. Покажу подробно на примере...

вычислить выражение (5+2)*10-3
действие(Д), вывод в Edit(E)
Код:
Д: 5
E: 5

Д: +
Е: 5

Д: 2
Е: 2

Д: *
Е: 7

Д: 10
Е: 10

Д:-
E:70

Д:3
Е:3

Д:=
Е: 67
в общемто мне кажется что тут правдо без стека и польской записи не обойтись)

Последний раз редактировалось NiCola999; 13.03.2010 в 22:54.
NiCola999 вне форума Ответить с цитированием
Старый 13.03.2010, 22:12   #6
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Не какой польской записи, а тем более Дейкстры не надо. Храни предыдущее полученное значение и при нажатии на +,-,*,/,= считай предыдущее + / - / * / div предущее. Посмотри исходники любого калькулятора.

Моя реализация на JavaScript
Вложения
Тип файла: rar калькулятор под windows.rar (1.0 Кб, 15 просмотров)
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer

Последний раз редактировалось Ozerich; 13.03.2010 в 22:14.
Ozerich вне форума Ответить с цитированием
Старый 13.03.2010, 22:55   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

только он у вас не работает(кнопка '=' ниче не делает)
NiCola999 вне форума Ответить с цитированием
Старый 13.03.2010, 23:03   #8
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Виноват. Держи рабочий

Я не заметил что у тебя пример со скобками. Если есть скобки в примере, то вычислять надо подругому. Как вариант это упомянутая выше польская нотация или рекурсивный пересчет.

Вот рекурсивное решение

Код:
class solver
{
private:

	int n;
	string s;

	long long getch(string s,int l,int r)
	{
		long long res=0;
		s.assign(s.begin()+l,s.begin()+r+1);
		while(s.find(" ")<s.size())
			s.erase(s.begin()+s.find("="));
		for(int i=s.size()-1;i>=0;i--)
			res+=st[s.size()-1-i]*(s[i]-48);
		return res;
	}

	int findnext(int pos)
	{
		int cur=1;
		while(cur>0)
		{
			pos++;
			if(s[pos]=='(')cur++;
			else if(s[pos]==')')cur--;
		}
		return pos;
	}

	int  solve(int l,int r)
	{
		int pos=l,res=0,chb,cur;
		bool plus=true,minus=false,mnoz=false,ch=false;
		while(pos<=r)
		{
			if(s[pos]>='0' && s[pos]<='9')
			{
				if(!ch)
				{
					chb=pos;
					ch=true;
				}
			}
			else if(s[pos]=='+' || s[pos]=='-' || s[pos]=='*')
			{
				ch=false;
				cur=getch(s,chb,pos-1);
				if(plus)res+=cur;
				else if(minus)res-=cur;
				else if(mnoz)res*=cur;
				plus=(s[pos]=='+');
				minus=(s[pos]=='-');
				mnoz=(s[pos]=='*');
			}
			else if(s[pos]=='(')
			{
				int last=findnext(pos+1);
				if(plus)res+=solve(pos+1,last-1);
				else if(minus)res-=solve(pos+1,last-1);
				else if(mnoz)res*=solve(pos+1,last-1);
				if(last==r)return res;
				plus=(s[last+1]=='+');
				minus=(s[last+1]=='-');
				mnoz=(s[last+1]=='*');
				pos=last+1;
			}
			pos++;
		}

	}

	solver(int ch)
	{
		this->n=ch;
	}

	bool check(string s)
	{
		while(s.find(" ")<s.size())
			s.erase(s.begin()+s.find(" "));
		this->s.assign(s.begin(),s.end());
		return (solve(0,s.size()-1)==n);
	}

};
Это класс для проверки равенства выражения(string s) числу(сh). Думаю, найдёшь что хотел. Тут без деления.
Вложения
Тип файла: rar Калькулятор V2.0.rar (1.1 Кб, 14 просмотров)
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer

Последний раз редактировалось Stilet; 15.03.2010 в 09:30.
Ozerich вне форума Ответить с цитированием
Старый 14.03.2010, 00:09   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ага, спасибо. Но я уже начал делать стековый калькулятор
NiCola999 вне форума Ответить с цитированием
Старый 14.03.2010, 00:23   #10
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
ага, спасибо. Но я уже начал делать стековый калькулятор
Рекурсия это ведь тоже стек
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenOffice Calc, инсталл Xeon332 Софт 11 09.02.2010 09:08
висне сет при запуску Win XP после установки Win 7 VVkSoft Windows 3 15.09.2009 10:36
траблы с calc express xaero93 Помощь студентам 0 23.04.2009 06:10
Win или не Win, вот в чем вопрос. Sibedir Свободное общение 101 09.09.2008 20:03
пути в реестре, где находятся программы автозагрузки для win'95 win'98 win' me win 2000 Prisian Win Api 1 11.09.2007 20:07