Автор работы: Пользователь скрыл имя, 14 Марта 2012 в 19:55, курсовая работа
Цель курсовой работы – систематизация, углубление и активное применение знаний по системному программированию, закрепление знаний, полученных в лекционном курсе, а также на практических и лабораторных занятиях.
Метод исследования – изучение литературы, составление и отладка программ на компьютере.
1.Введение
2.Разработка программы
3.Руководство программиста
4.Руководство пользователя
5.Заключение
6. Список использованной литературы
7. Листинг программы
Кыргызско – Российский Славянский университет
Кафедра информационных и вычислительных технологий
КУРСОВАЯ РАБОТА
по дисциплине «Язык программирования Си»
Тема: «Стековый калькулятор»
Выполнил: студент группы ИВТ-3-09 Данияр уулу Бектур
Руководитель: преподаватель Сычев В. Н.
Бишкек 2012
Содержание
1.Введение
2.Разработка программы
3.Руководство программиста
4.Руководство пользователя
5.Заключение
6. Список использованной литературы
7. Листинг программы
Пояснительная записка к курсовой работе содержит: 18 стр.
Цель курсовой работы – систематизация, углубление и активное применение знаний по системному программированию, закрепление знаний, полученных в лекционном курсе, а также на практических и лабораторных занятиях.
Метод исследования – изучение литературы, составление и отладка программ на компьютере.
В настоящее время вычислительная техника проникла практически во все сферы человеческой деятельности. С помощью ЭВМ можно решать самые разные задачи. Но для того, чтобы решить поставленную задачу, необходимо указать последовательность действий, выполнение которых приведёт к требуемому результату, – составить программу. Для удобства работы с ЭВМ эта операция производится с помощью языков программирования (высокого или низкого уровня).
Один из используемых языков программирования - это Borland С, который можно использовать для написания программ, работающих в операционной среде Windows.
Среда программирования Borland С позволяет создавать тексты программ, компилировать их, находить ошибки и оперативно их исправлять; компоновать программы из отдельных частей, включая стандартные модули, отлаживать и выполнять отлаженную программу.
Используя перечисленные возможности, можно создавать различные прикладные программы, например, такие, как программа, написанная при выполнении данной курсовой работы.
В данной курсовой работе представлена реализация стекового калькулятора. В нем используются те же вычисления, что и в обычном калькуляторе: сложение, вычитание, умножение, деление и др. Кроме арифметических операций, пользователь может ввести название одной из стандартных функций: sin, cos, exp, tan. В программе используется метод обратной польской записи, поэтому можно рассчитывать сложные выражения с использованием скобок. Такая программа весьма полезна, поскольку позволяет проводить вычисления, не прибегая к записи промежуточных результатов на бумаге.
Первым шагом должен быть ввод значений, с которыми необходимо произвести вычисления. Для большего удобства можно реализовать графический интерфейс и вывести одно окно для ввода значений и другое – для конечного результата операции.
Для реализации стекового вычислителя необходимо задать структуру. Методы этой структуры будут производить различные операции со стеком: push, pop, insert, delete.
В самом начале загрузки программы необходимо инициализировать графический интерфейс, на котором будут располагаться клавиши с цифрами и названиями операций. Для удобства пользователя в программе подключена мышь.
При нажатии на определенную клавишу, на дисплее, в отдельном окне, отображается ее значение. После того как введены необходимые значения, пользователю необходимо нажать клавишу “равно(=)”, для получения результата.
Для вычисления выражения надо сначала преобразовать его в обратную польскую запись. Затем в начале каждой функции проверяется, что глубина стека не меньше двух. В противном случае, выдается сообщение об ошибке, и функция завершается. Далее из стека извлекаются операнды у и x. Элементы извлекаются из стека в порядке, обратном их помещению в стек, поэтому y извлекается раньше, чем x. Затем производится операция над y и x, и результат ее помещается обратно в стек и печатается на дисплее.
Структурная схема программы
Структурная схема программного комплекса (рис.1) включает 8 подчиненных программных модулей, расположенных на втором и третьем уровнях. Программные модули выполняют следующие функции (в скобках указаны имена процедур):
Меню (Menu) – служит для выбора пользователем требуемого арифметического действия;
Ввод (Input) – обеспечивает ввод чисел;
Операция (Operation) – обеспечивает ввод арифметического действия, выбранного в меню;
Вычисления (Calculation) – производит выбранные вычисления с помощью вызываемых программных модулей «сложение», «вычитание», «умножение» и «деление».
Также имеются еще 6 подчиненных программных модулей, которые выполняют стандартные операции: синус, косинус, тангенс, абсолютное значение, экспонента, взятие квадратного корня, но для того, чтобы не нагромождать структуру, было отображено только 4.
Программа состоит из трех файлов: "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(
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-
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=='-'||
{ if (!opers) opers=push(opers,*e);
Else
if(prior(opers->c)<prior(*e))
opers=push(opers,*e);
else
{ while(opers&&(prior(opers->c)>
*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=='-'||*
{ 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)||*
*s1=0;
val=push(val,atof(sn));