Мегаобучалка Главная | О нас | Обратная связь  


Основной код программы




#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <math.h>

int ChartoInt (int*,int,int);

double Sumin (int*,int *,int ,int );

void Scobka (int*,int *,int ,int );

 

char OTLADKA[1];

Void main (void)

/*======================[Начало]=======================*/

{

char S[125];

int i, iKol,m, buf[125],a[100],b[100],k,*p,l,*a1,*b1,u1,u2,s,ABC;

double c;

mr:

puts("Do Want to look the debugging information? (y/Any key)");

if (getch()!='y') {puts("Debugging information OFF"); OTLADKA[1]='N'; }

else {puts("Debugging information ON");printf("\a"); OTLADKA[1]='Y'; }

ABC=1;

m1:

printf("\r Э <<<-------------[ Расчёт N:%i ]------------->>> Э \n",ABC);

scanf("%s",&S);

if (OTLADKA[1]=='Y') printf("\n**** Отладочная информация *****\n");

m=strlen(S);

p=buf;a1=a; b1=b; //указатели

k=0;iKol=0;l=0;u1=0;u2=0;

/*Получение числа спомощью функции и запись в массив а, где l-счетчик-длинны числа*/

for (i=0; i<(m+1); i++)

{

if (S[i]=='1'){ buf[i]=1;l++;}

else if (S[i]=='2'){ buf[i]=2;l++;}

else if (S[i]=='3'){ buf[i]=3;l++;}

else if (S[i]=='4'){ buf[i]=4;l++;}

else if (S[i]=='5'){ buf[i]=5;l++;}

else if (S[i]=='6'){ buf[i]=6;l++;}

else if (S[i]=='7'){ buf[i]=7;l++;}

else if (S[i]=='8'){ buf[i]=8;l++;}

else if (S[i]=='9'){ buf[i]=9;l++;}

else if (S[i]=='0'){ buf[i]=0;l++;}

else { if (l!=0) {

a[iKol]=ChartoInt (p,i,l);

iKol++; //счетчик кол-ва чисел

l=0; //обнуление счетчика длинны числа

}

}

/*Вылавливание знака и присваивания ему номера 1-6 */

 switch (S[i]) {

case '+' :b[k]=1; k++; break;

case '-' :b[k]=2; k++; break; // к-счетчик кол-ва знаков



case '*' :b[k]=3; k++; break;

case '/' :b[k]=4; k++; break;

case '\0' : break; //Завершение сканирования если конец

 case '(' :b[k]=5; u1++; k++; break;

case ')' :b[k]=6; u2++; k++; break;

default :break;}

if(S[i]=='=') { break;} // Завершение сканирования

}

if(u1!=u2){goto m1;} // Проверка на кол-во скобок

Scobka(a1,b1,iKol,k); // получение ответа

c=Sumin(a1,b1,iKol,k);// присваивание ответа

s=(int)c; // округление до целого числа

if (OTLADKA[1]=='Y') printf("\n ***** OTLADKA INFO [END]*******\n");

puts(" Э ---------------------------- Э ");

printf("\r OTBET=[ %i ]\n",s); // вывод ответа

puts(" Э ---------------------------- Э ");

printf("\ [ 3AHOBO? (Any key/n) ]\r"); if (getch()!=='n') {goto m1;}

}

}

/*==================[Конец программы]==================*/

int ChartoInt (int *p, int i, int l)

 {

int a,j,b,b2,m;

a=0;

m=i+1-l;//Вычисление начала работы с массивом данных xx>[m]YYY>xxx

for (j=m; j<= (i+1); j++) // ‘1 2 3’ => 100+20+3=123

{

b=pow(10,(i-j)); //кол-во нулей

b2=p[j-1]; // извлекаемая цифра

a=a+(b2*b); //число1+ число2+… числоN= число

}

return (a);

}

double Sumin (int *pa1,int *pb1,int j,int k)

{

int i, buf1,l;

double s;

/* начало сканирования массива данных и чисел с опредилением приоретета */

for (i=0;i<=(k+1); i++)

{

 if ( pb1[i]==3) //"*"

{

buf1=pa1[i]*pa1[i+1];//умножение x*y

pa1[i]=buf1; //присвоение нового числа

for(l=(i+1);l<=(j+1);l++) //сдвиг на кол-во xxx-cc*dd

{

pa1[l]=pa1[l+1]; // сдвиг цифр

if (l==j)

{

pa1[l+1]=0;

pa1[j-1]=0;//для всех

l++;

j--; //уменьшение для того, чтобы цикл не съел знаки и числа

//X*Y-u X*Y=a => <a>-<u> "-"съелся

}

 }

for(l=i;l<=(k+1);l++)

{

pb1[l]=pb1[l+1]; //сдвиг знаков

if (l==k)

{

pb1[l+1]=0;

l++;

k--;// уменьшение для того, чтобы цикл не съел знаки и числа

i--; // уменьшение для того, чтобы цикл не съел знаки и числа }

}

  }

if ( pb1[i]==4) //"/"

{

buf1=pa1[i]/pa1[i+1];

pa1[i]=buf1;

for(l=(i+1);l<=(j+1);l++)

{

pa1[l]=pa1[l+1];

if (l==j)

{

pa1[l+1]=0;

l++;

j--;

}

}

for(l=i;l<=(k+1);l++)

{

pb1[l]=pb1[l+1];

if (l==k)

{

pb1[l+1]=0;

l++;

k--;

i--;

}

}

}

}

s=pa1[0];

l=0;

for (i=0; i<=(k+1);i++)//Выполнение действий согласно знаку

{

if (pb1[l]==1) //"+"

{

s=s+pa1[i+1];

 l++;

}

else if (pb1[l]==2) //"-"

{

s=s-pa1[i+1];

 l++;

}

}

int j1=0;

return (s);

}

void Scobka (int *a1,int *b1,int l,int k1)

{

int i,n,n1,j,array[126],barray[126],*par,*pbr,iShift,p,j3,iPar,iSk;

double c1;

int as,as1;//для отладки

par=array;// указатели на массивы для передачи в функцию

pbr=barray;

iPar=0; iSk=0;

for (i=0;i<=k1;i++)//основной цикл

 {

 if (b1[i]==5)//поиск скобок открытых

 {

 if (iPar==0) n=i; // указывает на начало скобок

iPar++;

}

if (b1[i]==6) //поиск скобок закрытых

 {

if (iPar!=1)

 {

iPar--;

iSk++;

continue;

}

n1=i;// указывает на конец скобок

p=0;//индекс для новых массивов

for(j=n;j<n1;j++)

{

array[p]=a1[j]; //создание временных массивов чисел

p++;

 as=p; //для отладки

}

p=0;

for(j=(n+1);j<n1;j++)

{

barray[p]=b1[j];//создание временных массивов знаков

p++;

as1=p; //для отладки

}

if(iSk!=0)

{

if (OTLADKA[1]=='Y') Scobka(par,pbr,as,as1);

}

iShift=n1-n; //"Сдвиг"следует обратить внимание – 1

c1=Sumin(par,pbr,iShift,(iShift-1)); //возвращаемая сумма в скобках

if (OTLADKA[1]=='Y') printf("\n Разное количество скобок N=%f\n",c1);

 a1[n]=(int)c1;

for(j3=0;j3<=iShift;j3++) //очистка массивов возможно ненужна

{

par[j3]=0;

pbr[j3]=0;

}

/*====================[сдвиг]==========================*/

if(l>n1)//l-количество чисел в массиве a1 если за скобками ничего нет то для упращения не нужно

{

for(j=(n+1);j<l;j++)

{

a1[j]=a1[j+iShift-1]; //сдвиг чисел

if (j==(l-iShift+1)) //учтено что массив начинается с нуля и точто сдвиг-1

{

for (j3=(l-iShift+1);j3<l;j3++) //обнуление вышедших за предел данных

{

a1[j3]=0;

}

j=l; //Выход из сдвига цикла для массива чисел

}

} //закрытия цикла сдвига чисел

l-=(iShift-1); //количество чисел уменьшилось

for(j=n;j<k1;j++)

{

b1[j]=b1[j+iShift+1]; //сдвиг знаков

if (j==(k1-iShift-2))

{

for (j3=(k1-iShift-1);j3<k1;j3++) //обнуление вышедших за предел данных

{

b1[j3]=0;

}

j=k1;//Выход из сдвига массива }

}

k1-=(iShift+1); //количество знаков уменьшилось

i=0; //пробежать цикл с начала

}//закрывает скобки проверки на на необходимость сдвига

else if(l==n1)

{

a1[n+1]=0;

b1[n]=0;

}

}

}

}


Приложение 2

Вывод результатов.

Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Читайте также:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (112)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.032 сек.)
Поможем в написании
> Курсовые, контрольные, дипломные и другие работы со скидкой до 25%
3 569 лучших специалисов, готовы оказать помощь 24/7