printf("%c",code_fina[k1].bits[k2]);
printf("\n");
}}
七、测试数据
0000000
八、测试情况
题目二算术表达式求值演示
一、问题描述:
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。
设计一个程序,演示用算符优先法对算术表达式求值的过程。
二、基本要求:
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用教科书表3.1给出的算符优先关系,实现对算术四则运算运河运算表达式的求值,并仿照教科书的例3.1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
三、算法思想:
建立两个不同的栈,其中一个为运算符栈,另一个为操作数栈。
输入数据时,首先将操作数进栈,然后将运算符进栈。
继续当有输入运算符时,从前面的运算符栈中,取栈顶元素进行比较。
如果当前输入的运算符的优先级高于栈顶元素则进栈,否则,调用运算函数进行运算直至输入的字符为#时结束。
四、数据结构
typedefstruct{
charstackname[20];
char*base;
char*top;
}Stack;StackOPTR,OPND;
五、模块划分
1、函数:
voidmain()主函数;
intInitStack(Stack*s,char*name);
voidOutputStatus(void);
charPop(Stack*s);
charGetTop(Stacks);
switch(op)
charPrecede(charc1,charc2)
2函数之间的调用关系:
主函数main()调用其他函数六、源程序
六、原程序:
#include
#include
#include
#include
#include
#defineN100
doublenumStack[N]={0};
intnumTop;
charopStack[N];
intopTop;
intop(charch){
if(ch=='+'||ch=='-')return2;
if(ch=='*'||ch=='/')return3;
if(ch=='(')return-1;
return0;
}
doubleresult(doublenum1,charop,doublenum2){
if(op=='+')returnnum1+num2;
if(op=='-')returnnum1-num2;
if(op=='*')returnnum1*num2;
if(op=='/')returnnum1/num2;
return0;
}
intcompute(charstr[]){
doublenum=0;
inti=0,j=1,k=1;
intFlag=0;numTop=opTop=0;
while(str[i]!
='\0'||opTop>0)
{
if(str[i]>='0'&&str[i]<='9')
if(Flag==0)
num=num*10+str[i]-'0';
else
{
num+=(str[i]-'0')/(j*10.0);
j*=10;
}
else
if(str[i]=='.')Flag=1;
else
if(k==1&&str[i]=='-'&&(i==0||op(str[i-1])))k=-1;
else
{
if(i>0&&!
op(str[i-1])&&str[i]!
='('&&str[i-1]!
=')'){
numStack[numTop++]=num*k;
num=0;j=1;Flag=0;k=1;
}
if(opTop==0||str[i]=='(')
opStack[opTop++]=str[i];
else
if(str[i]==')'){
while(opTop>0&&opStack[--opTop]!
='('){
numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);
numTop--;
}
if(opStack[opTop]!
='(')return0;
}
else{
if(str[i]=='\0'&&numTop==0)return0;
while(opTop>0&&op(str[i])<=op(opStack[opTop-1])){
numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);
numTop--;
}
if(str[i]!
='\0')opStack[opTop++]=str[i];
}
}
if(str[i]!
='\0')i++;
}
if(numTop!
=1||opTop!
=0)return0;
return1;
}
voidface(){
system("cls");
printf("________\n");
printf("Savenumber(S)|Readnumber(R)|Clear(C)|Equal(E)|Quit(Q)\n");
printf("----------\n");
}
main()
{
inti=0,j=0,k;
charstr[N]="\0";
charnum[N]="\0";
charsave[N]="\0";
charch;
doubletemp;
unsignedlongtemp2;
face();
printf("inputanexpression,presskey'E'tocompute\n");
ch=getch();
while
(1)
{
if(ch=='.'||ch==')'||op(ch)||ch>='0'&&ch<='9')
{
str[i++]=ch;
str[i]='\0';
face();
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",str);
if(ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9')
{
num[j++]=ch;
num[j]='\0';
}
elsej=0;
}
if(ch=='S'||ch=='s')
if(strlen(num))
{
face();
printf("%shasbeensaved\n",strcpy(save,num));
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",str);
}
else{
face();
printf("thereisnonumbertosave!
\n");
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",str);
}
if(ch=='R'||ch=='r')
if(strlen(save)){
face();
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",strcat(str,save));
i+=strlen(save);
}
if(ch=='C'||ch=='c'){
if(strlen(str))str[--i]='\0';
face();
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",str);
}
if(ch=='E'||ch=='e'){
if(compute(str)){
printf("\n=%g\n",numStack[0]);
j=0;temp=numStack[0];
if(temp<0){
temp=-temp;
num[j++]='-';
num[j]='\0';
}
temp2=(unsignedlong)temp;
k=1;
while(temp2/k>=10)
k*=10;
while(k){
num[j++]=temp2/k+'0';
num[j]='\0';
temp2=temp2%k;
k/=10;
}
temp=temp-(int)temp;
if(temp!
=0){
num[j++]='.';
num[j]='\0';
temp+=0.0000005;
}
for(k=6;k>0;k--){
if(temp==0)break;
temp*=10;
num[j++]=(int)temp+'0';
num[j]='\0';
temp=temp-(int)temp;
}
}
else{
face();
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",str);
printf("\nwrongexpression!
");
}
i=0;j=0;str[0]='\0';
}
if(ch=='Q'||ch=='q'){
printf("\nareyousuretoquit?
(Y/N)\n");
ch=getch();
if(ch=='Y'||ch=='y')break;
else{
face();
printf("inputanexpression,presskey'E'tocompute\n");
printf("%s",str);
}
}
ch=getch();
}
}
七、测试数据
2*(5-0)
八、测试情况
结论
通过两周的课程设计,我学到哈夫曼编码可以节省资源空间,也学到了一些算法的应用,懂得了怎么用表达式求值,学到了不少东西但是在调试程序过程中也遇到了很多困难,使我认识到自己还有很多不足的地方,还需要继续努力!
参考文献
1.严蔚敏,吴伟民.数据结构.清华大学出版社,2005.11
2.谭浩强.C语言程序设计.清华大学出版社,2005.11
3.范辉.VisualC++程序设计.高等教育出版社
山东建筑大学计算机科学与技术学院
课程设计指导教师评语
班级:
061学生姓名:
周磊学号:
2006121143
指导教师评语(包括工作态度,遵守纪律;基本理论、知识、技能;独立工作能力和分析解决问题的能力;完成任务情况及水平):
学生成绩(百分制):
指导教师签名:
年月日