"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好像太大了,有高人指点下小弟
#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语言课程设计--算术计算器的实现"怎么做的主要内容,如果未能解决你的问题,请参考以下文章
求计算机网络课程设计,采用VC、VB、java或C等编程语言编程实现。题目如下:任选一个