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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2017, 11:00   #1
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию Калькулятор в командной строке

В общем задача была такова создать калькулятор командной строки с учетом приоритетов операций,тоесть 2+2*2/2 и тд

Код:
#include <iostream>
#include <cstring>

using namespace std;

int main(int argc,char*argv[]) {
	char *x=argv[1];
	int count=1;
	int count2=0;
	for(int i=0; i<strlen(argv[1]); i++)
		if((char)argv[1][i]=='+'||(char)argv[1][i]=='-'||(char)argv[1][i]=='*'||(char)argv[1][i]=='/')
			count2++;
	char *oper=new char[count2];
	for(int i=0; i<strlen(oper); i++)
		oper[i]='0';
	int g=0;
	for(int i=0; i<strlen(argv[1]); i++)
		if((char)argv[1][i]=='+'||(char)argv[1][i]=='-'||(char)argv[1][i]=='*'||(char)argv[1][i]=='/') {
			oper[g]=(char)argv[1][i];
			g++;
		}
	for(int i=0; i<strlen(argv[1]); i++)
		if(x[i]>='0'&&x[i]<='9')
			;
		else count++;
	double *z=new double[count];
	int k=0;
	for(int i=0; i<count; i++)
		z[i]=0;
	int n=strlen(x);
	for(int i=0; i<n; i++)
		if(x[i]>='0'&&x[i]<='9')
			z[k]=z[k]*10+x[i]-'0';
		else k++;

	for(int i=0; i<count; i++)
		cout<<z[i]<<" ";
	cout<<endl;
	for(int i=0; i<count2; i++)
		cout<<oper[i]<<" ";
	cout<<endl;

	double result=0;
	if(strlen(oper)>1) {
		for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='/') {
				result=z[i]/z[i+1];
				cout<<"ERROR"<<endl;
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[k+1]=z[k+2];
					z[k+2]=0;
					z[i]=result;
				}
				z[count-2]=0;
				i--;
				cout<<"ERROR2"<<endl;
			}
		}

		for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='*') {
				result=z[i]*z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[k+1]=z[k+2];
					z[k+2]=0;
					z[i]=result;
				}
				z[count-1]=0;
				i--;
			}
		}
		for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='-') {
				result=z[i]-z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[k+1]=z[k+2];
					z[k+2]=0;
					z[i]=result;
				}
				z[count-1]=0;
				i--;
			}
		}
		for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='+') {
				result=z[i]+z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[i]=result;
					z[k+1]=z[k+2];
					z[k+2]=0;
				}
				z[count-1]=0;
				i--;
			}
		}
	} else {
		if(oper[0]=='*')
			result=z[0]*z[1];
		if(oper[0]=='/')
			result=z[0]/z[1];
		if(oper[0]=='+')
			result=z[0]+z[1];
		if(oper[0]=='-')
			result=z[0]-z[1];
	}
	cout<<"Result:"<<result<<endl;

	return 0;
}
после долгих мучений смог сделать это, для большинства заданных операций все работает, но почему-то на операциях типа 2+2*2/2
или 2*2+2/2 зависает,как мне удалось выяснить проблема находится в цикле деления, он становится бесконечным,для наглядности вставил туда 2 вывода эррора, первый становится бесконечным,а второй не выводится вообще, пока не могу понять в чем проблема, помогите пожалуйста найти баг,буду благодарен
NDrago вне форума Ответить с цитированием
Старый 19.10.2017, 11:40   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Перепешите с использованием хотя бы функций. Т.е. 1 функция выполняет 1 операцию, например, выделяет входное число.
Декомпозируйте задачу на блоки. В этой вашей копипасте сложно разбираться.

Смотрите - 2 цикла совершенно одинаковых, различие в знаке операции, это явный кандидат на функцию
Код:
for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='-') {
				result=z[i]-z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[k+1]=z[k+2];
					z[k+2]=0;
					z[i]=result;
				}
				z[count-1]=0;
				i--;
			}
		}
		for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='+') {
				result=z[i]+z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[i]=result;
					z[k+1]=z[k+2];
					z[k+2]=0;
				}
				z[count-1]=0;
				i--;
			}
(а еще, - можно заменить сложением с отрицательным числом, и вообще исключить -)

В общем случае, если вы что-то делает 2 раза - это должна быть отдельная функция.

Последний раз редактировалось alexzk; 19.10.2017 в 11:45.
alexzk вне форума Ответить с цитированием
Старый 19.10.2017, 12:16   #3
NDrago
Пользователь
 
Регистрация: 22.09.2017
Сообщений: 45
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Перепешите с использованием хотя бы функций. Т.е. 1 функция выполняет 1 операцию, например, выделяет входное число.
Декомпозируйте задачу на блоки. В этой вашей копипасте сложно разбираться.

Смотрите - 2 цикла совершенно одинаковых, различие в знаке операции, это явный кандидат на функцию
Код:
for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='-') {
				result=z[i]-z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[k+1]=z[k+2];
					z[k+2]=0;
					z[i]=result;
				}
				z[count-1]=0;
				i--;
			}
		}
		for(int i=0; i<strlen(oper); i++) {
			if((char)oper[i]=='+') {
				result=z[i]+z[i+1];
				for(int j=i; j<strlen(oper)-1; j++) {
					oper[j]=oper[j+1];
					oper[j+1]='0';
				}
				for(int k=i; k<count-1; k++) {
					z[i]=result;
					z[k+1]=z[k+2];
					z[k+2]=0;
				}
				z[count-1]=0;
				i--;
			}
(а еще, - можно заменить сложением с отрицательным числом, и вообще исключить -)

В общем случае, если вы что-то делает 2 раза - это должна быть отдельная функция.
спасибо,поправлю,а в данном коде вообще невозможно найти ошибку?
NDrago вне форума Ответить с цитированием
Старый 19.10.2017, 12:18   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
В общем случае, если вы что-то делает 2 (или более) раза - это должна быть отдельная функция.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.10.2017, 12:40   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от NDrago Посмотреть сообщение
спасибо,поправлю,а в данном коде вообще невозможно найти ошибку?
Бесплатно? - нет
alexzk вне форума Ответить с цитированием
Старый 19.10.2017, 18:35   #6
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

ищи синтаксический анализ. Есть описание в книге "Полный справочник С++" автор Шилдт. где то в последних главах описан
SAMOUCHKA вне форума Ответить с цитированием
Старый 19.10.2017, 18:46   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
В общем случае, если вы что-то делает 2 раза - это должна быть отдельная функция.
Главное не забывать, что это не единственное предназначение функций и создавать их стоит и во многих других случаях.

Я шарю еще больше, да?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2017, 19:19   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Главное не забывать, что это не единственное предназначение функций и создавать их стоит и во многих других случаях.
Я шарю еще больше, да?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 20.10.2017, 19:48   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Дичь какая-то. Найдите в интернетике готовую реализацию обратной польской нотации и сдайте лабу
pu4koff вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметры в командной строке AltairShepard Общие вопросы Delphi 4 05.06.2013 19:08
Иероглифы в командной строке ac1d_buRn Операционные системы общие вопросы 8 26.02.2011 20:27
работа в командной строке genrix Общие вопросы C/C++ 6 24.02.2011 17:19
программа в командной строке Кристина13 Помощь студентам 0 11.06.2009 17:42
Обращение к командной строке yura_$198802 Общие вопросы Delphi 15 09.04.2009 03:37