"C语言课程设计--算术计算器的实现"怎么做

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"C语言课程设计--算术计算器的实现"怎么做相关的知识,希望对你有一定的参考价值。

功能:程序首先显示计算器界面,并用户输入一个算术计算式。假如用户输入22+1<回车>,程序将在计算器的屏上输出结果。如果输入错误,显示input error。

1 2 3 + - 4 5 6 * / 7 8 9 = ← 0 End

要求:1)、只要求计算一个式子,回车后将结果显是在屏上。
2)、程序可重复进行运算,直到按End键退出。
3)、当用户没有输入时,在程序界面的下方显示当前日期与时间。
4)、运行过程保存计算器界面不改变
5)、最好能实现类似这样的算式:22 +3*4 (有加分)

这种程序我用java曾经实现过,不难,就是复杂点的逻辑,只是我现在做java了 要用c已经不怎么会了,问大家一下,我是个c的新手,首先怎么学习啊,用什么工具开发c语言啊,还有那个计算器的图形,用什么工具开发啊,很迷茫啊,vc6好像太大了,有高人指点下小弟

参考技术A #include<stdio.h>
#include<malloc.h>
#include<iostream.h>
struct
node

int
date;
struct
node
*next;
;
typedef
struct
node
*link;
link
number=NULL;
link
symble=NULL;
//把数据放入栈中//
link
push(link
stack
,int
num,int
k)

link
newnode;
newnode=(link)malloc(sizeof(struct
node));
if(newnode==NULL)
cout<<"out
of
space"<<endl;
else

if(k>=0
&&
k<=9)//判断前一个字符是否为数字

stack->date=stack->date*10+num;
return
stack;

else

newnode->date=num;
newnode->next=stack;
stack=newnode;
return
stack;



//从栈上取出数据//
link
pull(link
stack,int
*num)

link
top;//去栈顶元素
if(stack!=NULL)

top=stack;
stack=stack->next;
*num=top->date;
free(top);
return
stack;

else
*num=0;

//判断栈是否为空
int
empty(link
stack)

if(stack==NULL)
return
1;
else
return
0;

//判断是否为运算符
int
is_symble(char
ch)

switch(ch)

case
'(':
case
')':
case
'+':
case
'-':
case
'*':
case
'/':
return
1;
default:
return
0;


//
判断运算符的优先级
int
priority(char
ch)

switch(ch)

case
'(':
return
1;
case
'+':
case
'-':return
2;
case
'*':
case
'/':
return
3;//'+','-'的优先级小于'*','/'
default:return
0;


//计算两个操作数的值
int
tuo_result(int
m,int
num1,int
num2
)

switch(m)

case
'+':
return(num2
+
num1);
case
'-':
return
(num2-num1);
case
'*':
return(num2
*
num1);
case
'/':
return(num2
/
num1);


//主函数
void
main
()

char
expression[50];//存放表达式
int
position=0;//表达式的位置
int
sym=0;//运算符
int
num1=0;//后操作数
int
num2=0;//前操作数
int
sum=0;//运算结果
cout<<"请输入表达式:"<<endl;
gets(expression);
while(expression[position]!='\0'
&&
expression[position]!='\n')

if(is_symble(expression[position]))//判断运算符

if(expression[position]=='(')
symble=push(symble,expression[position],-1);
else
if(expression[position]==')')

while(symble->date!='(')

number=pull(number,&num1);
number=pull(number,&num2);
symble=pull(symble,&sym);
number=push(number,tuo_result(sym,num1,num2),-1);

//if(symble->date='(')symble=pull(symble,&sym);
symble=pull(symble,&sym);

else
if(!empty(symble))//判断放运算符的栈是否为空

if(priority(expression[position])
<=
priority(symble->date)
&&
!empty(symble))

//取出一个运算符和两个操作数
number=pull(number,&num1);
number=pull(number,&num2);
symble=pull(symble,&sym);
number=push(number,tuo_result(sym,num1,num2),-1);
//cout<<tuo_result(sym,num1,num2)<<endl;
//把运算符放在栈里
//symble=push(symble,expression[position],-1);

symble=push(symble,expression[position],-1);

//把运算符放在栈里
else
symble=push(symble,expression[position],-1);

else
if(!is_symble(expression[position]))//把操作数放在栈里
number=push(number,expression[position]-48,expression[position-1]-48);
//cout<<expression[position]<<endl;
position++;

//取出运算符栈的运算符
while(!empty(symble))

//cout<<symble->date<<endl;
symble=pull(symble,&sym);
if(!empty(symble))//判断是否为空

if(sym=='+'
&&
symble->date=='-'
)//判断符号问题
,2-2*3+5=1不然就是-1
sym='-';

number=pull(number,&num1);
number=pull(number,&num2);
//cout<<num1<<"
"<<num2<<endl;
//计算的结果放在栈中
number=push(number,
tuo_result(sym,num1,num2),-1);
//cout<<number->date<<endl;

//取出运算结果
number=pull(number,&sum);
cout<<expression<<"="<<sum<<endl;
参考技术B #include<stdio.h>
#include<malloc.h>
#include<iostream.h>

struct node

int date;
struct node *next;
;
typedef struct node *link;
link number=NULL;
link symble=NULL;
//把数据放入栈中//
link push(link stack ,int num,int k)
link newnode;
newnode=(link)malloc(sizeof(struct node));
if(newnode==NULL)
cout<<"out of space"<<endl;
else
if(k>=0 && k<=9)//判断前一个字符是否为数字

stack->date=stack->date*10+num;
return stack;

else

newnode->date=num;
newnode->next=stack;
stack=newnode;
return stack;





//从栈上取出数据//
link pull(link stack,int *num)

link top;//去栈顶元素
if(stack!=NULL)

top=stack;
stack=stack->next;
*num=top->date;
free(top);
return stack;


else
*num=0;


//判断栈是否为空
int empty(link stack)

if(stack==NULL)
return 1;
else
return 0;


//判断是否为运算符
int is_symble(char ch)

switch(ch)
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
return 1;
default:
return 0;



// 判断运算符的优先级
int priority(char ch)

switch(ch)
case '(':
return 1;
case '+':
case '-':return 2;
case '*':
case '/': return 3;//'+','-'的优先级小于'*','/'
default:return 0;



//计算两个操作数的值
int tuo_result(int m,int num1,int num2 )
switch(m)
case '+':
return(num2 + num1);
case '-':
return (num2-num1);
case '*':
return(num2 * num1);
case '/':
return(num2 / num1);




//主函数
void main ()

char expression[50];//存放表达式
int position=0;//表达式的位置
int sym=0;//运算符
int num1=0;//后操作数
int num2=0;//前操作数
int sum=0;//运算结果
cout<<"请输入表达式:"<<endl;
gets(expression);
while(expression[position]!='\0' && expression[position]!='\n')
if(is_symble(expression[position]))//判断运算符

if(expression[position]=='(')
symble=push(symble,expression[position],-1);
else if(expression[position]==')')
while(symble->date!='(')
number=pull(number,&num1);
number=pull(number,&num2);
symble=pull(symble,&sym);
number=push(number,tuo_result(sym,num1,num2),-1);

//if(symble->date='(')symble=pull(symble,&sym);
symble=pull(symble,&sym);



else if(!empty(symble))//判断放运算符的栈是否为空

if(priority(expression[position]) <= priority(symble->date) &&
!empty(symble))

//取出一个运算符和两个操作数
number=pull(number,&num1);
number=pull(number,&num2);
symble=pull(symble,&sym);
number=push(number,tuo_result(sym,num1,num2),-1);
//cout<<tuo_result(sym,num1,num2)<<endl;
//把运算符放在栈里
//symble=push(symble,expression[position],-1);

symble=push(symble,expression[position],-1);


//把运算符放在栈里
else
symble=push(symble,expression[position],-1);


else if(!is_symble(expression[position]))//把操作数放在栈里
number=push(number,expression[position]-48,expression[position-1]-48);
//cout<<expression[position]<<endl;

position++;


//取出运算符栈的运算符
while(!empty(symble))
//cout<<symble->date<<endl;

symble=pull(symble,&sym);
if(!empty(symble))//判断是否为空

if(sym=='+' && symble->date=='-' )//判断符号问题 ,2-2*3+5=1不然就是-1
sym='-';

number=pull(number,&num1);
number=pull(number,&num2);

//cout<<num1<<" "<<num2<<endl;
//计算的结果放在栈中
number=push(number, tuo_result(sym,num1,num2),-1);
//cout<<number->date<<endl;


//取出运算结果
number=pull(number,&sum);
cout<<expression<<"="<<sum<<endl;

本回答被提问者采纳
参考技术C 123+_456*/789=0 参考技术D 这个东西建议你到csdn网站注册个账号,然后那里有很多懂这个的人才,你可以到那里去问问他们。我的水平是不够了,只能建议到那里看看 第5个回答  2010-07-06 C?
C++用MFC应该很容易的

在Java中,设计一个算法,判断一个算术表达式中的括号是不是配对。

还需要分别指出哪个左括号与哪个右括号对应??

参考技术A 算法:
String str="5+(4-3))" 表达式
char kuohao[]; 用作括号堆栈
扫描str中的字符
1如果是(则入栈
2如果是)
a如果战不空出栈
b如果栈空,不匹配。算法结束
最后栈空则匹配

下面是我的实现

public class biaodashi

public static void main(String args[])

int top=0;//堆指针
boolean end=true;//不匹配时只输出一次

char stack[]=new char[100];//存括号

String biaoda="(((1+(2)-6))";//表达式
char biao[]=biaoda.toCharArray();//将字符串转化成字符数组
System.out.println("表达式: "+biaoda);

for(int i=0;i<biao.length&&end;i++)//遍历表达式中所有字符

if(biao[i]=='(')//如果是(则入栈

stack[top]='(';
top++;

else if(biao[i]==')')//如果是)则出战

if(!(top==0))
top--;
else

System.out.println("括号不匹配");
end=false;




//除循环两种可能

if(top==0&&end)
System.out.println("括号匹配");//出循环stack空
else if(top!=0&&end)
System.out.println("括号不匹配");//出循环时stack不空



追问

如果只是看括号是否匹配,我建议用StringBuffer来做更简单。呵呵

追答

我也是刚学java不久,你不只是看括号匹配。那还有什么要求

追问

要求指出每一个左括号所对应的右括号

本回答被提问者采纳
参考技术B http://reallyafei.javaeye.com/blog/347736 参考技术C stack 用栈就可以 参考技术D 迭代字符串的每个字符,算一下(的数量和)的数量是不是一样的就行了呗追问

需要指出哪个左括号与哪个右括号对应

追答

没那么麻烦吧。。先判断左右数量是否一致,左边第二个和右边第二个肯定是对应的啊。。

追问

如果括号提出来是这样呢:
(()())(()()())

追答

如果是(,向右继续找(,看有几个(,就找第几+1个)
右括号同理

以上是关于"C语言课程设计--算术计算器的实现"怎么做的主要内容,如果未能解决你的问题,请参考以下文章

c语言设计一个简单的计算器程序

求问!!!数据结构课程设计题:病毒测试程序。(c语言)

求计算机网络课程设计,采用VC、VB、java或C等编程语言编程实现。题目如下:任选一个

用C语言编写一个计算器程序,实现加,减,乘,除,求平方根(正数),倒数等功能.

C语言课程设计

在Java中,设计一个算法,判断一个算术表达式中的括号是不是配对。