Разбор строкового выражения. Алгоритм Рутисхаузера

Автор: Пользователь скрыл имя, 08 Декабря 2011 в 17:58, курсовая работа

Описание работы

«С – удобный, выразительный и гибкий язык, пригодный для программирования широкого класса задач», – таково мнение создателей С Брайана Кернигана и Дениса Ритчи. Язык С приобрел широкую известность как язык разработки операционной системы UNIX. Сегодня многие операционные системы написаны на С++.
С++ – это язык, расширяющий возможности С. Его разработал Бьерн Страуструп. Название С++ предложил Рик Массити. Оно указывает на эволюционную природу перехода к нему от С, так как «++» – это операция приращения в С.

Содержание

Введение. 4
Математическая формулировка задачи. 6
Описание программы…………………………………………………………………………………..7
Руководство пользователя 8
Выводы (заключение). 10
Список использованной литературы. 11
Приложение 1 (текст программы). 12

Работа содержит 1 файл

КУРСОВОЕ ПРОЕКТИРОВАНИЕ.docx

— 206.75 Кб (Скачать)
p>                              i++;

                              _input(left,right); //вставляем скобки ( и ) туда, куда указывают left и right

                        }

                  else if(step==1&&(str[i]=='-'||str[i]=='+'))   //шаг второй (операции + и -)

                        {

                              for (j=i-1; j>=0; j--)    //то же

                                  {                //самое, что

                                    if (str[j]==')')  //и для * и /

                                          balance++;    //  ||

                                    else if (str[j]=='(')            //  ||

                                          balance--;    //  ||

if(((str[j]=='*'||str[j]=='/'||str[j]=='-'||str[j]=='+')&&!balance)||(str[j]=='('&&balance==-1)?j,balance=0,1:0)

                                          break;      //  ||

                              }        //  ||

                              left=j+1;        //  ||

                              for (j=i+1; j<len; j++)       //  ||

                              {        //  ||

                                    if (str[j]=='(')      //  ||

                                          balance--;     //  ||

                                    else if (str[j]==')')      //  ||

                                          balance++;     //  ||

if(((str[j]=='*'||str[j]=='/'||str[j]=='-'||str[j]=='+')&&!balance)||(str[j]==')'&&balance==1)?j--,balance=0,1:0)

                                          break;      //  ||

                              }        //  ||

                              right=isalnum(str[j])?j:j-1;       //  ||

                              i++;        //  ||

                              _input(left,right);        //  \/

                        } 

            }

            for (int i=0, balance=0; i<len-2; i++)   //удаляем лишние скобки (сначала ищем)

            {

                  if (str[i]=='(')     //если открылась

                  {

                        int j;

                        for (j=i; j<len; j++)    //то смотрим, что внутри неё

                        {

                              if (str[j]=='(')  //кроме

                                    balance++; //других

                              else if (str[j]==')')  //скобок

                                    balance--; //и того, что внутри них

                              else if (balance==1) //если вложенные скобки закончились,

                                    empty=false//а внутри рассмативаемых что-то есть, то          //указываем, что они не лишние

                              if (!balance)  //если не лишние, то завершить цикл

                                    break;

                        }

                        if (empty)   //если лишние

                              _delete(i--,j);  //удаляем

                  }

                  empty=true //возвращаем значение на место и продолжаем внешний цикл

            }

}

void _input(int x, int y)  //вставляем скобки

{

      int right;

      for (right=len+1; right>y; right--)  //двигаем строку вправо с позиции y на 1 символ

            str[right]=str[right-1];  //на получившееся свободное место

      str[y+1]=')';    //ставим скобку

      ++len;     //увеличиваем длину

      for (right=len+1; right>x; right--)   //то же

            str[right]=str[right-1];  //самое

      str[x]='(';     //с позиции x

      ++len;        

} 

void _delete(int x, int y)

{

      int left;

      for (left=x; left<y-1; left++)  //надвигаем правую часть строки на вторую скобку

            str[left]=str[left+1];

      --len;

      for (; left<len; left++)  //затем ещё раз на первую скобку

            str[left]=str[left+2];

      --len;    //получается удаление

} 

void do_it()

{

      int tmp=0;

      for (int i=0, tmp=0; i<len; i++) //ставим приоритеты в вспомогательном символьном массиве

            if (str[i]=='(')

                  sign[i]=++tmp;

            else if (str[i]==')'||str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')

                  sign[i]=--tmp;

            else if (isdigit(str[i]))

            {

                  sign[i]=++tmp;

                  if (isdigit(str[i+1]))

                  {

                        for (++i; isdigit(str[i]);i++)

                              sign[i]=tmp;

                        --i;

                  }

            }

                      for (int i=0; i<len; i++) //показываем, что //получилось

                                                cout<<int(sign[i]);

                                                cout<<"\n\n";

      while (no_bracket())   //пока в выражении есть скобки

            get_answer(place_with_max()); //решаем его!

} 

int place_with_max()    //получаем

{      //индекс

      int index=0;    //элемента

      for (int i=0; i<len; i++)   //строки

            if (sign[i]>sign[index])  //с

                  index=i;   //наибольшим

      return index;    //приоритетом

} 

void get_answer(int pos) //вычисление результата операции с двумя операндами

{

      char c;

      int i=pos, left=1, right=1;

      int x=atoi(str+pos),y;   //читаем первый операнд

      for (; i<len&&sign[i]==sign[i+1]; i++)   //перематываем индекс на конец операнда

            ++left;    //считаем длину операнда

      c=str[++i];                   //читаем операцию

      y=(atoi(str+i+1));     //читаем второй операнд

      for (++i; i<len&&sign[i]==sign[i+1]; i++)  //перематываем индекс

            ++right;     //считаем длину правого операнда

      switch (c)

      {

Информация о работе Разбор строкового выражения. Алгоритм Рутисхаузера