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

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

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

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

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

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

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

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

— 1.07 Мб (Скачать файл)
fy">                                          carriage(x,y,WHITE);

                               }

                               else

                               {

                                          sound(freq);

                                          delay(deltime);

                                          nosound();

                               }

                            }

                            else

                            {

                               carriage(x,y,BLACK);

                               len=strlen(let);

                               strcpy(p,let);

                               setcolor(WHITE);

                               if(len>1)

                                                           x+=dx;

                               moveto(x+dx,y+5);

                               if(len>1)

                                                           x-=dx;

                               outtext(let);

                               x+=dx*len;

 

                               p+=len;

           carriage(x,y,WHITE);

         }

      }

                if(BackSpace.Pressed())

      {

         if(x<LB+dx)

         {

           if(y>UB)

           {

             carriage(x,y,BLACK);

             x=RB-2*dx;

             y-=dy;

             carriage(x,y,WHITE);

           }

           else

           {

             sound(freq);

             delay(deltime);

             nosound();

           }

         }

         else

         {

           carriage(x,y,BLACK);

           x-=dx;

           *p--=0;

           setfillstyle(1,getbkcolor());

           bar(x+3,y,x+12,y+12);

           setfillstyle(1,WHITE);

                               carriage(x,y,WHITE);

                            }

                }

                if(ClearAll.Pressed())

                {

                                          setfillstyle(1,BLACK);

                                          bar(LB-1,UB,RB+1,DB);

                                          x=LB,y=UB;

                                          carriage(x,y,WHITE);

                }

 

                if(obuts[4].Pressed()) break;

      if(CloseBut.Pressed()) return 1;

 

   }

   return 0;

}

 

void PrintAns(char *s)

{

   setfillstyle(1,BLACK);

   bar(LB,DB+20,RB,DB+38);

   settextjustify(RIGHT_TEXT,TOP_TEXT);

   outtextxy(RB-3,DB+23,s);

   settextjustify(LEFT_TEXT,TOP_TEXT);

}

 

void main()

{

   char s[300],ans[20];

   double a;

   long t1;

 

   igraph();

   ButInit();

   iface();

 

   mouse->setVrange(0,480);

   mouse->show();

 

   while(1)

   {

      *s=0;

      if(getstring(s)) break;

      if(s)

        a=Calculate(s);

      sprintf(ans,"%f",a);

      PrintAns(ans);

   }

   closegraph();

   free(mouse);

}



 

Файл "CALC.H"



#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

#include <math.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);

}

 

 

int prior(char c)

{

   switch (c)

   {

                 case '^' : return 4;

                 case '*' : return 3;

                 case '/' : return 3;

                 case '+' : return 2;

                 case '-' : return 2;

                 case '(' : return 1;

   }

   return 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;

                              }

                            // printf("\n%f",res);

                 val=push(val,res);

                 }

                 else

                 {

                            s++;

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

                            *s1=0;

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

                            s--;

                 }

              s++;

  }

  return pop(&val);

}

 

 

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 calcfun(char *fun,double arg)

{

   double (*pf)(double);

   pf=0;

   if(!strcmpi(fun,"sqrt")) pf=sqrt;

 

   if(!strcmpi(fun,"abs")) pf=fabs;

 

   if(!strcmpi(fun,"sin")) pf=sin;

 

   if(!strcmpi(fun,"cos")) pf=cos;

 

   if(!strcmpi(fun,"tan")) pf=tan;

 

   if(!strcmpi(fun,"exp")) pf=exp;

 

   return pf?(pf)(arg):0;

 

}

 

double find(char *s,int &k);

 

 

void delfun(char *s)

{

              char fstr[10];

              double  fval;

              int k=0;

              char *p=s;

              while(*p)

              {

                if(isalpha(*p))

                {

                            fval=find(p,k);

                            sprintf(fstr,"%f",fval);

                            del(s,p-s+1,k);

                            insert(s,fstr,p-s+1);

                }

                p++;

              }

 

}

 

double Calculate(char *exp)

{

   char opz[100];

   delfun(exp);

   makeopz(exp,opz);

   return calcopz(opz);

}

 

double find(char *s,int &k)

{

   char *p1=s;

   int br=1;

   double a=0;

   char f[5],arg[80],*p2=f,*p3=arg;

 

   while(isalpha(*p1))

   {

                            *p2++=*p1++;

                            k++;

   }

   *p2=0;

 

   while(*p1)

   {

                *p3++=*p1;

                k++;

                if(*p1=='(') br++;

                else

                            if(*p1==')')br--;

                if(br==1)break;

                p1++;

   }

   *p3=0;

   a=Calculate(arg);

   return calcfun(f,a);

 

}



 

Файл "MOUSE.H"



#include <dos.h>

 

class Mouse

{

  public:

       int but;

       int x,y;

 

       Mouse();

       ~Mouse();

       int IsIn(int x1,int y1,int x2,int y2);

       void show();

       void hide();

       void getstate();

       void setVrange(int MYMax,int MYMin);

};

 

 

Mouse::Mouse()

{

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