| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1248 人关注过本帖
标题:请各位高手大侠帮帮忙啊,帮忙设计一个计算器程序,一般的就行。
只看楼主 加入收藏
gongrui85
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-11-9
收藏
 问题点数:0 回复次数:5 
请各位高手大侠帮帮忙啊,帮忙设计一个计算器程序,一般的就行。
请各位高手大侠帮帮忙啊,帮忙设计一个计算器程序,因为临近毕业设计,我选了一个用C语言设计计算器程序,哎,真的不会啊,最好是有标注的,否则小弟真的要抓瞎了 愁了好几天了 ,还是设计不出来,于是只有请各位大侠高手们帮帮忙了……谢谢了!!!
搜索更多相关主题的帖子: 计算器 
2008-11-09 21:13
Tchong
Rank: 1
等 级:新手上路
帖 子:117
专家分:0
注 册:2008-10-17
收藏
得分:0 
这是转贴别人的,要感谢写的人啊


写了两个小时写的很粗陋,只能计算整数,但是可以支持多级别括号,和同一级别的多个括号。
希望大家多多指教,这个题目其实很有意思,要是大家有兴趣,可以把功能做的更加全面,比如算次方什么的
#include<stdio.h>
#include<string.h>
#include<math.h>
void del(char* ,char *);
void del2(int [],int );
void convert(char [],char *,char *);
int jisuan(char []);
int num[100]={0};
void main()
{
char str[100];
int i;
printf("IF you want to exit,CTRL+Z will help you!!\n");
while(EOF!=scanf("%s",str))
{
printf("%d\n",jisuan(str));
for(i=0;i<100;i++)
num[i]=0;
}
}
int jisuan(char str[])
{
char *p;
char ss[100]={'\0'};
char fuhao[20]={'\0'};
int number[20]={0};
int kk=0,k,l,i,j=0,end=0,jj,wei=0;
p=strchr(str,'(');
while(p!=NULL)//查找str中的括号,并且优先处理,直到没有为止,
{
for(k=l=i=0;str[i]!='\0';i++)
{
if(str[i]=='(')k++;//这里是匹配多个括号,大家列个式子就能找到规律
if(str[i]==')')l++;
if(k==l&&k!=0)//第n个'('是和第'n'个')'匹配的
{
convert(ss,++p,&str[i-1]);//把括号中的字符传递出来处理
number[kk++]=jisuan(ss);//处理括号中的字符
num[0]=0;
*(--p)='q';//原来str中的括号位置用'q'来标志
p++;
del(p,&str[i+1]);//删除处理过的括号内容
k=l=0;
i=-1;
break;
}
}
p=strchr(str,'(');//继续查找括号
}
kk=0;
for(i=0;str[i]!='\0';i++)//这里我自己都觉得很没有条理,大家多花点时间
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
{
if(str[i-1]!='q')
{
for(jj=i-1,wei=0;jj>=end;jj--)
{
num[j]+=(str[jj]-'0')*(int)pow(10,wei++);
}
end=i+1;//end记录的是最后数字的位子,比如说“123”end记录的应该是2的位置
fuhao[j++]=str[i];
}
else
end=i+1;
}
if(str[i]=='q')
{
num[j]=number[kk++];//遇到第几个q就把number中的第机个元素传递给num
end=i+2;
fuhao[j++]=str[i+1];
}
}
if(str[i-1]!='q')//这里是考虑到数组的结尾有没有处理的数据
{ //比如说字符串"1+2+q+3"按照上面的处理最后就还有一个'3'没处理
for(--i,wei=0;i>=end;i--)
{
num[j]+=(str[i]-'0')*(int)pow(10,wei++);
}
}
for(jj=0;fuhao[jj]!='\0';jj++)//开始进行计算这时候原来有括号的式子
{ //已经简化为没有括号的式子
if(fuhao[jj]=='*'||fuhao[jj]=='/')//先乘除
{
if(fuhao[jj]=='*')//参与第jj个符号计算的数据是num[]中的第jj个和第jj+1
{
num[jj]*=num[jj+1];
}
else
{
num[jj]/=num[jj+1];
}
del(&fuhao[jj],&fuhao[jj+1]);
del2(num,jj+1);
jj=-1;
}
}
for(jj=0;fuhao[jj]!='\0';jj++)
{
if(fuhao[jj]=='+'||fuhao[jj]=='-')
{
if(fuhao[jj]=='+')
{
num[jj]+=num[jj+1];
}
else
{
num[jj]-=num[jj+1];
}
del(&fuhao[jj],&fuhao[jj+1]);
del2(num,jj+1);
jj=-1;
}
}
return num[0];
}
void del(char *i,char *j)
{
for(i;*j!='\0';j++)
{
*(i++)=*j;
}
*i=*j;
}
void del2(int num[],int i)
{
for(;i<100;i++)
{
num[i]=num[i+1];
}
}
void convert(char ss[],char *p,char *q)
{
int i=0;
char *pp;
for(pp=p;pp<=q;pp++)
{
ss[i++]=*pp;
}
}
刚开始偷了个懒,把number[]和num[] 设置成为int型,所以精度只能做到整数,其次还不能处理 小数和负数,
如果大家有兴趣就替小弟我改一下,提示一下要是想处理负数和小数在做字符串转换成数字的时候建议用atoi;
免的用什么pow10(),等我作业写完了自己在来改一下
2008-11-10 12:12
xujie3
Rank: 1
来 自:浙江
等 级:新手上路
帖 子:51
专家分:0
注 册:2008-7-22
收藏
得分:0 
程序代码:
/*用栈实现的算术运算,支持加 减 乘 除 括号 小数的运算,  
  输入运算式之后用‘=’结束 回车就可以了。
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define N 100
#define ADD 1
#define SUB 2
#define MUL 3
#define DIV 4
#define Lp  5
#define Rp  6
#define END 7
#define Epsilon 1e-7
#define RADIX 10

//将符号用数字代替,这个就可以只使用一个栈
struct
{
   char op;
   int code;

}replace[]=
         {
          {'+',1},{'-',2},{'*',3},{'/',4},{'(',5},{')',6},{'=',7},{' ',-1}
         };

char c=' ';


//栈的ADT相当于基本操作------------------------------------------
struct StackRecord
{
     double Array[N];
     int top;
};
typedef struct StackRecord *Stack;

Stack Create()
{
     Stack s;
     s=(Stack)malloc(sizeof(struct StackRecord)) ;
     s->top=-1;
     return s;

}


int IsEmpty(Stack s)
{
    return s->top==-1;

}

int IsFull(Stack s)
{
    return s->top==N-1;

}

void Push(Stack s,double x)
{
       if(IsFull(s))
        { printf("Full Stack!!");
          exit (0);
        }
       else
         s->Array[++s->top]=x;



}


void Pop(Stack s)
{
     if(IsEmpty(s))
       printf("Empty Stack!!");
     else
      s->top--;

}

double Top(Stack s)
{
     if(IsEmpty(s))
     {
        printf("Empty Stack!!");
        return 0.0;
     }
     else
       return s->Array[s->top];

}


double PopAndTop(Stack s)
{
     if(IsEmpty(s))
     {
        printf("Empty Stack!!");
        return 0.0;
     }
     else
       return s->Array[s->top--];

}

//----------------------------------------------


//读表达式的函数,把表达式当做字符读进来
int get_char(double *data)
{

     int i;
     double num,dradix;
     num=0.0;

     //去掉运算式前的空白
     while(c==' '||c=='\t')  c=getchar();

     if(c<'0'||c>'9')
     {
        for(i=0;replace[i].op!=c&&replace[i].code!=-1;i++)
          ;
        c=getchar();
        return replace[i].code;

     }

     else
     {
       
        do{
            num=num*RADIX+(c-'0');
            c=getchar();

           }while(c>='0'&&c<='9');

        if(c=='.')
        {
          c=getchar();
          dradix=1.0/RADIX;

          do{
             num=num+(c-'0')*dradix;
             dradix/=RADIX;
             c=getchar();

            }while(c>='0'&&c<='9');

        }

        *data=num;
        return 0;
     }




}

double operation(int op,double x,double y)
{
     double result;
     switch(op)
     {
        case ADD:
                result=x+y;
                return result;
        case SUB:
                result=x-y;
                return result;
        case MUL:
                result=x*y;
                return result;
        case DIV:
                if(fabs(y)<=Epsilon)
                 {
                   printf("divide by zero!\n");
                   exit(1);
                 }
                 else
                 {
                   result=x/y;
                   return result;
                 }


     }
     printf("Error!\n");
     return 1.0;




}

char Compare(int x,int y)
{
   switch(x)
    {
       case ADD:
       case SUB:
           if(y==MUL||y==DIV||y==Lp) return '<';
           else return '>';

       case MUL:
       case DIV:
               if(y==Lp) return '<';
           else return '>';
           case Lp:
               if(y==Rp) return '=';
               else return '<';
           case Rp:
               return '>';
           case END:
               if(y==END) return '=';
               else return '<';
           default:
              return 0;
    }

}


int main()
{
  double data,result,x,y;
  int type,temp;

  Stack opstack,numstack;
  opstack=Create();
  numstack=Create();

  Push(opstack,END);

  type=get_char(&data);

  while(!IsEmpty(opstack))
  {

     if(type==0)
     {
       Push(numstack,data);

       type=get_char(&data);

     }
     else
     {
       switch(Compare(temp=(int)Top(opstack),type))
        {
           case '>':
                Pop(opstack);
                y=PopAndTop(numstack);

                x=PopAndTop(numstack);

                result=operation(temp,x,y);

                Push(numstack,result);
                break;
           case '<':
                Push(opstack,type);

                type=get_char(&data);
                break;
           case '=':
               if(Top(opstack)==7)
               {
                Pop(opstack);
                break;
               }
                Pop(opstack);
                type=get_char(&data);

                break;

        }

      }

    }
    printf("%.2f\n",Top(numstack));
    return 0;
}


学数据结构的时候,一道实验题。
2008-11-10 20:37
番茄大帝
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2008-11-4
收藏
得分:0 
非常不错哦~谢谢楼上的两位啊。
2008-11-10 21:38
gongrui85
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-11-9
收藏
得分:0 
谢谢两位啊 非常感谢!!!
2008-11-15 14:38
RogueBoy
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-11-15
收藏
得分:0 
做个图形的吧。。
2008-11-15 19:11
快速回复:请各位高手大侠帮帮忙啊,帮忙设计一个计算器程序,一般的就行。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021661 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved