用C语言编一个计算器程序

要是有加减乘除 可以多个运算 例如:3+(2-5*3*5)=? 谢谢 急用啊

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define UNKNOWN_CHAR 2
#define DIVISOR_IS_ZERO 3
#define FALSE 0
#define TRUE 1
/*定义结构,主要用于GetString函数,可以不管它*/
typedef struct string
{char str;
struct string *next;
}string;

/*函数声明*/

/*可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址 . */
/*这个函数可以看成普通的scanf()*/
char *GetString();
/*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or '\0' . */
/*有错误就把错误代号装在*errorNum中,返回从中计算出的值*/
double GetASResultOf(char * str, int *rank, int *errorNum);
/*从字符串str第*rank个字符开始分析直到遇到不符合要求的字符,返回这个单位值.*/
/*如:str="12+sin(30)+[12+cos(60)]"
GetUnitageOf(str,0,errorNum)=12
GetUnitageOf(str,3,errorNum)=0.5
GetUnitageOf(str,11,errorNum)=12.5 */
double GetUnitageOf(char * str, int *rank, int *errorNum);
int main()
{
/*定义变量*/
double value;
int rank=0;
int errorNum=TRUE;
char * str;

/*接收字符*/
printf("counter v1.0\n");
printf("Made by PT\n");
printf("Date 2005-07-16\n\n");
printf("Please input your arithmetic:\n");
str=GetString();

/*调用处理函数,*/
value = GetASResultOf(str, &rank, &errorNum);

/*错误处理(没完善)*/
if (errorNum==TRUE) printf("The result is: %lf\n",value, rank);
else if (errorNum==UNKNOWN_CHAR) printf("char error!\n");
else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0\n");
else printf("Other error\n");

getch();
return 0;
}

/*0==[=========>无限动态字符接受函数*/
char *GetString()
{
char *CharToString(string * sHead, int arraySize);
int arraySize=0;
string *s;
string *sHead;

s = (string *)malloc(sizeof(string));
sHead = s;
s->str = getchar();
arraySize++;

while((s->str)!='\n')
{
arraySize++;
s->next=(string *)malloc(sizeof(string));
s=s->next;
s->str=getchar();
}

return CharToString(sHead, arraySize);
}

char *CharToString(string * sHead, int arraySize)
{
char *strArray;
string *s=sHead;
int i=0;
strArray = (char*)malloc(arraySize*sizeof(char));

while(i<arraySize)
{
if (s->str=='=' || s->str=='\n') break;
if (s->str!=32) strArray[i++]=s->str;
s=s->next;
}
strArray[i]='\0';
return strArray;
}
/*0==[=========> 得到一个单位的值*/
double GetUnitageOf(char * str, int *rank, int *errorNum)
{
double CharToNum(char * str, int *rank);
double value;

/*如果是数字或负号就返回这个数字*/
if ((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]=='-'))
{if (str[*rank]=='-') {(*rank)++;value = (-1)*GetUnitageOf(str, rank,errorNum);}
else {value = CharToNum(str, rank);}}

/*如果是括号就用GetASResultOf取得括号里面的值并返回*/
else if (str[*rank]=='(' ||
str[*rank]=='[' ||
str[*rank]=='{' )
{(*rank)++;
value = GetASResultOf(str, rank, errorNum);}

/*返回sin(x)*/
else if (str[*rank]=='s' &&
str[(*rank)+1]=='i' &&
str[(*rank)+2]=='n')
{ (*rank)=(*rank)+3;
value = GetUnitageOf(str, rank, errorNum);
value = sin(value);
}

/*返回cos(x)*/
else if (str[*rank]=='c' &&
str[(*rank)+1]=='o' &&
str[(*rank)+2]=='s')
{*rank=*rank+3;
value = cos(GetUnitageOf(str, rank, errorNum));}

/*返回tan(x)*/
else if (str[*rank]=='t' &&
str[(*rank)+1]=='a' &&
str[(*rank)+2]=='n')
{*rank=*rank+3;
value = tan(GetUnitageOf(str, rank, errorNum));}
/*还可以加一些的,懒得加了*/

/*defult:处理错误*/
else {*errorNum = UNKNOWN_CHAR;value = 0;}

/*检查errorNum*/
if (*errorNum==TRUE){return value;}
else return FALSE;
}

/*0==[=========>这个是把字符转换成数字的函数,只在GetUnitageOf()里用*/
/*数字不能超过15个,其余的将被抹去.*/
double CharToNum(char * str, int *rank)
{
int j=0;
double value=0;

while((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]==46))
{
if (str[*rank]!='.')
{if ((j++)<=15) {value = value*10+(str[*rank]-48);}}
else
{if (j<=15)
{
for ((*rank)++,j=1; (str[*rank]>=48 && str[*rank]<=57 && str[*rank]!='\0'); (*rank)++, j++)
{value = value+(str[*rank]-48)*pow(0.1,j);}
return value;
}
}

(*rank)++;
}
return value;
}
/*0==[=========>这个函数写的太复杂了,实在不好作解释,反正是在GetPDResultOf
函数和GetUnitageOf函数之间转啊转的*/
/*简单地说就是把str中第一个加减号前的式子算出来放在value变量中.再用函数
GetPDResultOf算出直到二个加减号前的式子然后与value相加或相减放在
变量value中,以此类推,直到遇上 ')' or ']' or '}' or '\0' */
double GetASResultOf(char * str, int *rank, int *errorNum)
{
double GetPDResultOf(char * str, int *rank, int *errorNum);
double value;
double dwIf_Zero;

/*遇上 ')' or ']' or '}' or '\0' 就返回*/
while (str[*rank]!=')' &&
str[*rank]!=']' &&
str[*rank]!='}' &&
str[*rank]!='\0')
{
if ((str[*rank]>=48 && str[*rank]<=57) ||
str[*rank]=='s' ||
str[*rank]=='c' ||
str[*rank]=='t')
{
if ((str[*rank-1]==')' ||
str[*rank-1]==']' ||
str[*rank-1]=='}') &&
*rank!=0)
{value = value*GetUnitageOf(str, rank, errorNum);}
else
{value = GetUnitageOf(str, rank, errorNum);}
}

else if (str[*rank]=='+')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value + GetPDResultOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return 0;}}

else if (str[*rank]=='-')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value - GetPDResultOf(str, rank, errorNum);}
else {value = GetUnitageOf(str, rank, errorNum);}}

else if (str[*rank]=='*')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value * GetUnitageOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return 0;}}

else if (str[*rank]=='/')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++;
dwIf_Zero=GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero==0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
else value = value /dwIf_Zero;}
else {*errorNum=UNKNOWN_CHAR;return 0;}}

else if (str[*rank]== '(' ||
str[*rank]== '[' ||
str[*rank]== '{' )
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value*GetASResultOf(str, rank, errorNum);}
else {value = GetUnitageOf(str, rank, errorNum);}}

else {*errorNum=UNKNOWN_CHAR;return FALSE;}

if (*errorNum!=TRUE) return FALSE;
}
(*rank)++;
return value;
}

double GetPDResultOf(char * str, int *rank, int *errorNum)
{
double value;
double dwIf_Zero;
value = GetUnitageOf(str, rank, errorNum);
if (str[*rank]=='\0') return value;

while (str[*rank]!='+' &&
str[*rank]!='-' &&
str[*rank]!=')' &&
str[*rank]!=']' &&
str[*rank]!='}')
{
if (str[*rank]=='*')
value = value * GetUnitageOf(str, rank, errorNum);
else if (str[*rank]=='/')
{
dwIf_Zero= GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero=0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
else value = value /dwIf_Zero;
}
else if (str[*rank]=='(' ||
str[*rank]=='[' ||
str[*rank]=='{')
{(*rank)++;
value = value * GetUnitageOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return FALSE;}
if (*errorNum!=TRUE) return FALSE;
}

return value;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-16
package as;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class JiSuanQi implements ActionListener{

/**
* 程序功能: 计算器
*
* Bug: 1)小数点:设一个Boolean成员变量,在点击后不可用。。。在"+-/*"中设为可用。
*/

//step1 Define Container
private JFrame fra = new JFrame("计算器");
private Panel panel = new Panel();
private float sum,sum1,sum2;
private char zifu;
private boolean ii=true;
Container con = fra.getContentPane();
JMenuBar bar = new JMenuBar();
JMenu JMenu1 = new JMenu("编辑");
JMenu JMenu2 = new JMenu("查看");
JMenu JMenu3= new JMenu("帮助");
JMenuItem JMenuitem= new JMenuItem("帮助111");
JMenuItem JMenuitem1= new JMenuItem("帮助111");

//step3 Define Component
TextField text = new TextField();
JButton bu1 = new JButton("1");
JButton bu2 = new JButton("2");
JButton bu3 = new JButton("3");
JButton bu4 = new JButton("4");
JButton bu5 = new JButton("5");
JButton bu6 = new JButton("6");
JButton bu7 = new JButton("7");
JButton bu8 = new JButton("8");
JButton bu9 = new JButton("9");
JButton bu0 = new JButton("0");
JButton bujia = new JButton("+");
JButton bujian = new JButton("-");
JButton bucheng = new JButton("*");
JButton buchu = new JButton("/");
JButton budian = new JButton(".");
JButton bufuhao = new JButton("+/-");
JButton budenghao = new JButton("=");
JButton buqingling = new JButton("C");

public void m()
{
//step2 Define Layout
con.setLayout(new BorderLayout());
panel.setLayout(new GridLayout(5,4,4,4));
buqingling.setForeground(Color.RED);

//step5 把组件(subassembly)放在Panel中
panel.add(bu1);
panel.add(bu2);
panel.add(bu3);
panel.add(bujia);
panel.add(bu4);
panel.add(bu5);
panel.add(bu6);
panel.add(bujian);
panel.add(bu7);
panel.add(bu8);
panel.add(bu9);
panel.add(bucheng);
panel.add(bu0);
panel.add(bufuhao);
panel.add(budian);
panel.add(buchu);
panel.add(buqingling);
panel.add(budenghao);
/*JMenu1.add("复制");
JMenu1.add("粘贴");
JMenu2.add("标准型");
JMenu2.add("科学型");
JMenu2.addSeparator();
JMenu2.add("数学分组");
//JMenu3.add("帮助");*/
JMenu1.add(JMenuitem1);
bar.add(JMenu1);
bar.add(JMenu2);
JMenu3.add(JMenuitem);
bar.add(JMenu3);
fra.setJMenuBar(bar);

//把Panel放到Fream中
con.add(panel,BorderLayout.CENTER);
con.add(text,BorderLayout.NORTH);
//对 JJButton 进行事件处理
bu1.addActionListener(this);
bu2.addActionListener(this);
bu3.addActionListener(this);
bu4.addActionListener(this);
bu5.addActionListener(this);
bu6.addActionListener(this);
bu7.addActionListener(this);
bu8.addActionListener(this);
bu9.addActionListener(this);
bu0.addActionListener(this);
bujia.addActionListener(this);
bujian.addActionListener(this);
bucheng.addActionListener(this);
buchu.addActionListener(this);
budian.addActionListener(this);
bufuhao.addActionListener(this);
budenghao.addActionListener(this);
buqingling.addActionListener(this);
//show windows size and window
fra.setSize(230,200);
fra.setResizable(false);//屏蔽最大化
fra.setVisible(true);//显示Frame
//关闭windows窗口
fra.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);

}
public void actionPerformed(ActionEvent e)
{
String str=e.getActionCommand();//获取用户点击按扭上的文字是什么。
String shuzi="0123456789";
String yunsuan="+-*/";

if(shuzi.indexOf(str)>=0)//判断返回的数值是否大于0
{
text.setText(text.getText()+str);
//ii=true;
}
else if(yunsuan.indexOf(str)>=0)
{
sum1=Float.parseFloat(text.getText());
text.setText("");
zifu=yunsuan.charAt(yunsuan.indexOf(str));
ii=true;
}
else if(str.equals(".") && ii==true)
{

text.setText(text.getText()+str);
ii=false;
}
else if(str.equals("="))
{
sum2=Float.parseFloat(text.getText());
switch(zifu)
{
case '+':
sum=sum1+sum2;
text.setText(""+sum);

break;
case '-':sum=sum1-sum2;
text.setText(""+sum);
break;
case '*':sum=sum1*sum2;
text.setText(""+sum);
break;
case '/':sum=sum1/sum2;
text.setText(""+sum);
break;
}

}
else if(str.equals("C"))
{
text.setText("");
sum=0;
sum1=0;
sum2=0;
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub
JiSuanQi ji = new JiSuanQi();
ji.m();

}

}

用c语言设计一个简单的加减乘除计算器
1、打开visual C++ 6.0-文件-新建-文件-C++ Source File。2、输入预处理命令和主函数:#include \/*函数头:输入输出头文件*\/,void main()\/*空类型:主函数*\/。3、定义变量:int a,b,d; \/*定义变量的数据类型为整型*\/,char c;\/*定义变量的数据类型为字符型*\/。4、输入四则运算式:pri...

用C语言实现一个简单的计算器,要求有面积和体积输出。
int main() { float a, b, c, d;scanf("%f %f", &a, &b); \/\/ 输入长和宽 c = a * b; \/\/ 计算面积 d = 2 * (a + b); \/\/ 计算周长 printf("面积 S=%.2f,体积 V=%.2f\\n", c, d); \/\/ 输出面积和周长 return 0;} ```...

用C语言怎么写出一个计算器?
(1)只需输入2个变量n和sum,且sum=n+sum.(2)确定n的范围为n<=100 (3)循环体为 for(n=1;n<=100;n++)sum+=n;(4)根据C语言编辑规则写出程序 用for循环求:include<stdio.h> int main(void){ int n,sum=0;for(n=1;n<=100;n++)sum+=n;printf("1+2+...+100=%d\\n",...

用c语言程序设计一个简单计算器,求其源代码
double num1 = 0, num2 = 0, result = 0;char str1[] = "1230.456+-789*\/知消扒Qc=^%";char cnum[5], str2[20] = "", c;int x, y, x0, y0, i, j, v, m, n, act, flag = 1;\/* Function prototypes *\/ void drawboder(void);void initialize(void);void computer...

用c语言 编写计算器程序
1、首先我们需要在Dev C++软件中创建一个C语言项目,项目类型选择控制台程序,如下图所示 2、接下来我们在项目下面新建C语言文件,如下图所示 3、然后我们在C文件中写入计算器逻辑代码,主要是让用户输入计算方式,然后程序自动计算,如下图所示 4、接下来我们点击运行菜单,选择下拉菜单中的运行选项,如...

如何用C语言编写一个简单的计算器?
1、首先在打开的C语言软件窗口中,在Main函数的上方,写上阶乘函数的框架,如下图所示。2、然后定义一个变量【result】,如下图所示。3、然后输入if判断语句,就可以写下程序的关键语句,如下图所示。4、接下来就可以调用输出,如下图所示。5、最后点击运行,如下图所示,就可以运行测试。

用c语言编写一个计算器。
include<stdio.h> int main(){ int a,b,c,max;printf("请输入三个数:\\n");scanf("%d%d%d",&a,&b,&c);if(a>b)max=a;if(c>max)max = c;printf("三个数中最大的数为:%d",max);return 0;}

怎么用C语言编写计算器程序?
想要驾驭C语言,编写一个功能强大的计算器程序并不复杂。下面,让我们一起探索一个基础且实用的C语言计算器代码示例,它涵盖了加、减、乘、除四则运算,展示了基础编程逻辑的魅力:<?xml version="1.0" encoding="UTF-8"?><\/<\/<\/#include <stdio.h><\/int main() {<\/ char operator;<...

用C语言能编出一个有计算器界面的计算器么?
这段代码是一个使用C语言编写的计算器程序,旨在图形界面下运行。不过,代码中存在一些问题,例如变量未初始化、语法错误、逻辑错误以及一些不正确的函数调用。以下是修改后的代码,我已经纠正了这些问题,并且改进了代码的结构和可读性。```c include include include include include include include \/* ...

用C语言做一个计算器,能实现加减乘除混合运算?
是的,可以使用C语言编写一个计算器程序,能够实现加、减、乘、除等混合运算。下面是一个简单的示例程序:```c include <stdio.h> int main() { char operator;double num1, num2, result;printf("Enter an operator (+, -, *, \/): ");scanf("%c", &operator);printf("Enter two ...

相似回答
大家正在搜