Стековый калькулятор

Автор работы: Пользователь скрыл имя, 14 Марта 2012 в 19:55, курсовая работа

Краткое описание

Цель курсовой работы – систематизация, углубление и активное применение знаний по системному программированию, закрепление знаний, полученных в лекционном курсе, а также на практических и лабораторных занятиях.
Метод исследования – изучение литературы, составление и отладка программ на компьютере.

Содержание работы

1.Введение
2.Разработка программы
3.Руководство программиста
4.Руководство пользователя
5.Заключение
6. Список использованной литературы
7. Листинг программы

Содержимое работы - 1 файл

отчет по си курсач(готовый).doc

— 1.07 Мб (Скачать файл)


Кыргызско – Российский Славянский университет

 

Кафедра информационных и вычислительных технологий

 

 

 

 

 

 

 

 

 

КУРСОВАЯ РАБОТА

 

по дисциплине «Язык программирования Си»

 

 

 

Тема: «Стековый калькулятор»

 

 

 

 

 

Выполнил: студент группы ИВТ-3-09 Данияр уулу Бектур

 

Руководитель: преподаватель Сычев В. Н.

 

 

 

 

 

 

 

 

 

 

 

 

Бишкек 2012

 

Содержание

1.Введение

2.Разработка программы

3.Руководство программиста

4.Руководство пользователя

5.Заключение

6. Список использованной литературы

7. Листинг программы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Пояснительная записка к курсовой работе содержит: 18 стр.

Цель курсовой работы – систематизация, углубление и активное применение знаний по системному программированию, закрепление знаний, полученных в лекционном курсе, а также на практических и лабораторных занятиях.

Метод исследования – изучение литературы, составление и отладка программ на компьютере.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.Введение

В настоящее время вычислительная техника проникла практически во все сферы человеческой деятельности. С помощью ЭВМ можно решать самые разные задачи. Но для того, чтобы решить поставленную задачу, необходимо указать последовательность действий, выполнение которых приведёт к требуемому результату, – составить программу. Для удобства работы с ЭВМ эта операция  производится с помощью языков программирования (высокого или низкого уровня).

Один из используемых языков программирования - это Borland С, который можно использовать для написания программ, работающих в операционной среде Windows.

Среда программирования Borland С позволяет создавать тексты программ, компилировать их, находить ошибки и оперативно их исправлять; компоновать программы из отдельных частей, включая стандартные модули, отлаживать и выполнять отлаженную программу.

Используя перечисленные возможности, можно создавать различные прикладные программы, например, такие, как программа, написанная при выполнении данной курсовой работы.

В данной курсовой работе представлена реализация стекового калькулятора. В нем используются те же вычисления, что и в обычном калькуляторе: сложение, вычитание, умножение, деление и др. Кроме арифметических операций, пользователь может ввести название одной из стандартных функций: sin, cos, exp, tan. В программе используется метод обратной польской записи, поэтому можно рассчитывать сложные выражения с использованием скобок. Такая программа весьма полезна, поскольку позволяет проводить вычисления, не прибегая к записи промежуточных результатов на бумаге.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.Разработка программы

 

2.1. Метод решения задачи

 

2.1.1. Ввод и вывод данных

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

 

2.1.2. Реализация стекового вычислителя

Для реализации стекового вычислителя необходимо задать структуру. Методы этой структуры будут производить различные операции со стеком: push, pop, insert, delete.

 

2.2. Алгоритм решения задачи

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

При нажатии на определенную клавишу, на дисплее, в отдельном окне, отображается ее значение. После того как введены необходимые значения, пользователю необходимо нажать клавишу “равно(=)”, для получения результата.

Для вычисления выражения надо сначала преобразовать его в обратную польскую запись. Затем в начале каждой функции проверяется, что глубина стека не меньше двух. В противном случае, выдается сообщение об ошибке, и функция завершается. Далее из стека извлекаются операнды у и x. Элементы извлекаются из стека в порядке, обратном их помещению в стек, поэтому y извлекается раньше, чем x. Затем производится операция над y и x, и результат ее помещается обратно в стек и печатается на дисплее.

 

 

 

 

 

 

 

 

 

 

Структурная схема программы

 

 

 

 

 

 

 

 

 

 

 

 

 

Структурная схема программного комплекса (рис.1) включает 8 подчиненных программных модулей, расположенных на втором и третьем уровнях. Программные модули выполняют следующие функции (в скобках указаны имена процедур):

Меню (Menu) – служит для выбора пользователем требуемого арифметического действия;

Ввод (Input) – обеспечивает ввод чисел;

Операция (Operation) – обеспечивает ввод арифметического действия, выбранного в меню;

Вычисления (Calculation) – производит выбранные вычисления с помощью вызываемых программных модулей «сложение», «вычитание», «умножение» и «деление».

Также имеются еще 6 подчиненных программных модулей, которые выполняют стандартные операции: синус, косинус, тангенс, абсолютное значение, экспонента, взятие квадратного корня, но для того, чтобы не нагромождать структуру, было отображено только 4. 

 

 

 

 

 

 

 

 

 

3.Руководство программиста

Программа состоит из трех файлов: "CALC.H", "CALCULAT.CPP" и "MOUSE.H". Первый файл реализует стек вещественных чисел. В нем описываются операции помещения числа в стек, возврата числа из стека, удаления и вставку числа в стек. Также реализуются функции создания польской записи введенных значений. Файл "MOUSE.H" подключает мышь, для работы в графическом интерфейсе. И, наконец, файл "CALCULAT.CPP" реализует стековый калькулятор на базе стека.

Файл "CALC.H". В данном файле описаны операции производимые со стеком. Стек в данном проекте описан как структура:

struct stk

{

    double c;

    stk *next;

};

Далее идут сами операции:

stk *push(stk *head,double a)         //помещает данные в стек

   stk *ptr;

   if (!(ptr=(stk*)malloc(sizeof (stk))))

   {printf("\nNot enough memory!\n");

              exit(-1);}

   ptr -> c = a;

   ptr -> next=head;

   return ptr;}

double pop (stk **head)              //возвращает данные из стека

{  stk *ptr;

   double a=0;

   if (!*head)return 0;

   ptr = *head;

   a = ptr->c;

   *head=ptr->next;

   free(ptr);

   return a;}

void del(char *src,int pos,int len)       //удаление данных из стека

{  char *temp=(char*)malloc(strlen(src)-(pos+len));

   strcpy(temp,src+pos+len-1);

   *(src+pos-1)=0;

   strcat(src,temp);

   free(temp);

}

void insert(char *src,char *sub,int pos)    //добавление данных в стек

{

  int srclen=strlen(src);

   int slen=strlen(sub);

   char *tmp=(char*)malloc(srclen-slen);

   strcpy(tmp,src+pos-1);

   *(src+pos-1)=0;

   strcat(src,sub);

   strcat(src,tmp);

   free(tmp);}

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

Также некоторую трудность составляет создание обратной польской записи, при обработке входных данных.

Void makeopz(char *exp,char *opz)

{  stk *opers=0;

   char *e=exp,*op=opz;

   while (*e)

   {

                 if(*e=='(') opers=push(opers,*e);

                 if(isdigit(*e))

                 {                *op++='|';

                              while (isdigit(*e)||*e=='.') *op++=*e++;

                              e--;                 }

                 if(*e=='^'||*e=='+'||*e=='-'||*e=='*'||*e=='/')

                 {                 if (!opers) opers=push(opers,*e);

                               Else

                            if(prior(opers->c)<prior(*e))

                                            opers=push(opers,*e);

                                            else

                                            {      while(opers&&(prior(opers->c)>prior(*e)))

                                                        *op++=pop(&opers);

                                                        opers=push(opers,*e);

                                            }

                 }

                 if (*e==')')

                 {                            while(opers->c!='(')

                                          *op++=pop(&opers);

                                          pop(&opers);}

                 e++;   }

   while(opers) *op++=pop(&opers);

   *op=0;}

После проведенных преобразований выполняется само вычисление:

double calcopz(char *s){

   stk *val=NULL;

   double n1,n2,res;

   char sn[10],*s1=sn;

   while(*s)

   {  s1=sn;

                 if (*s=='^'||*s=='+'||*s=='-'||*s=='*'||*s=='/')

                 {                n2=pop(&val);

                              n1=pop(&val);

                              switch (*s)

                              {                            case '^' : res=pow(n1,n2); break;

                                                        case '+' : res=n1+n2; break;

                                                        case '-' : res=n1-n2; break;

                                                        case '*' : res=n1*n2; break;

                                                        case '/' : res=n1/n2; break;}

                               val=push(val,res);}

                 else {

                            s++;

                            while(*s!='|'&&(isdigit(*s)||*s=='.')) *s1++=*s++;

                            *s1=0;

                            val=push(val,atof(sn));

Информация о работе Стековый калькулятор