Создать консольный калькулятор, в который подаются значения одной строкой, без скобок - 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равно нулю, что означает успешное выполнение программы.