Создать консольный калькулятор, в который подаются значения одной строкой, без скобок - C (СИ)
Формулировка задачи:
Задача следующая: создать консольный калькулятор, в который подаются значения одной строкой, без скобок, например calc 2+6/8-9*4+7/8. Операции должны выполнятся по правилам математики. Вопрос в том, как в этом случае обрабатывать строку? пробовал выделять отдельно числа и знаки в массивы, но дальше не могу ничего придумать, как работать с этими массивами..
Решение задачи: «Создать консольный калькулятор, в который подаются значения одной строкой, без скобок»
textual
Листинг программы
int calc(double *f,char *s,int *n,char ch1,char ch2) { int i=0,j; while(i!=*n-1) for(i=0;i<*n-1;i++) if(s[i]==ch1 || s[i]==ch2) { if(s[i]=='*') f[i]*=f[i+1]; if(s[i]=='/') f[i]/=f[i+1]; if(s[i]=='+') f[i]+=f[i+1]; if(s[i]=='-') f[i]-=f[i+1]; for(j=i;j<*n-2;j++)s[j]=s[j+1]; for(j=i+1;j<*n-1;j++)f[j]=f[j+1]; --*n; break; } return 0; } int main() { char s[30],str[60]; int i,ns,b,e; double f[30]; setlocale(LC_ALL,"Russian_russia.1251"); printf("ÑòðîêГ*:"); scanf("%s",str); if(strlen(str)) { for(b=ns=i=0;str[i];i++) if(i &&(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/' || !str[i+1])) { e=i; if(str[i+1]) s[ns]=str[i]; else e++; str[e]=0; f[ns++]=atof(str+b); b=i+1; } calc(f,s,&ns,'*','/'); calc(f,s,&ns,'+','-'); printf("=%f\n",f[0]); } system("pause"); return 0; }
Объяснение кода листинга программы
- Функция
calc
принимает в качестве параметров указатель на массивf
(для хранения результатов операций), указатель на строкуs
(содержащую математическую операцию), указатель на переменнуюn
(для хранения количества элементов в операции), а также два символаch1
иch2
(обозначающие операцию). - В функции
main
создается строкаstr
, в которую считывается математическая операция из консоли. - Далее в цикле происходит разбиение строки
str
на отдельные числа и операции. - Полученные числа конвертируются в тип
double
и сохраняются в массивеf
. - Операции (символы
+
,-
,*
,/
) сохраняются в массивеs
. - Переменная
ns
инициализируется нулем и используется для хранения количества чисел в операции. - Переменная
b
используется для отслеживания начала следующей операции. - Переменная
e
используется для отслеживания конца текущей операции. - После заполнения массива
s
вызывается функцияcalc
, которая выполняет операции над числами из массиваf
согласно указанным вs
операциям. - После выполнения всех операций выводится результат.
- В конце программы вызывается функция
system(
pause)
, чтобы программа не закрылась сразу после выполнения операции. - Возвращаемое значение функции
main
равно нулю, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д