C语言程序设计24的问题.docx
《C语言程序设计24的问题.docx》由会员分享,可在线阅读,更多相关《C语言程序设计24的问题.docx(14页珍藏版)》请在冰豆网上搜索。
![C语言程序设计24的问题.docx](https://file1.bdocx.com/fileroot1/2022-12/1/9b5c86ba-1da0-40bf-b72d-9d24b17d1bae/9b5c86ba-1da0-40bf-b72d-9d24b17d1bae1.gif)
C语言程序设计24的问题
课程设计报告
课程名称C语言程序设计
课题名称计算24的问题
专业通信工程
班级通信1081
学号201013120122
姓名舒晨
指导教师罗雅博曹燚
2012年7月6日
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题计算24的问题
专业班级通信工程
学生姓名舒晨
学号201013120122
指导老师罗雅博曹燚
审批
任务书下达日期2012年6月22日
任务完成日期2012年7月6日
2011级通信工程专业
《C语言程序设计》课程设计任务书
一、课程设计的性质与目的
《C语言程序设计》是通信工程专业重要的基础课,通过本课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握C语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
二、设计要求
每个同学至少选作设计题目一个,每个同学的学号末尾2位对8求余,所得数为对应的设计题目题号,该题为该生必做题。
源程序必须格式规范,程序运行正确无误,有较强的容错性,界面友好。
必须使用模块化程序设计方式,自己独立完成。
三、课程设计报告要求
设计报告格式:
1统一封面(本任务书附带)、设计题目、设计要求以及系统功能需求分析;
2总体设计:
包括系统总体设计框架和系统功能模块图;
3详细设计。
包括主要功能模块的算法设计思路以及对应的工作流程图;
4主要源程序代码。
包括存储设计说明,以及完整源程序清单(放在附录中);
5调试分析过程描述。
包括测试数据、测试输出结果,以及对程序调试过程中存
在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等);
6总结。
包括课程设计过程中的学习体会与收获、对C语言和本次课程设计的认
识等内容。
7附录(完整源程序清单):
可以是手写或打印稿(注意:
不能和其他同学一样)
8报告最后附上评分表(见任务书末页)
四、检查要求:
1每个人必须有可运行的程序,每个人要通过答辩;
2每个人必须交《C语言课程设计报告》(打印稿)
五、评分
1根据平时上机考勤,且每个人必须自己动手编写程序,不得抄袭;
2根据程序运行结果;
3学生能熟练地解释清楚指导老师对自己程序的提问;
4课程设计报告完成的质量和规范;
一、课程设计的性质与目的………………………………1
二、课程设计题目…………………………………………1
三、功能分析和程序流程图………………………………2
四、源程序代码……………………………………………7
五、程序运行截图…………………………………………14
六、总结和个人心得………………………………………15
七、评分表…………………………………………………16
一、课程设计的性质与目的
《C语言程序设计》是通信工程专业重要的基础课,通过本课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握C语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
二、课程设计题目
计算24的问题
要求:
在屏幕上输入1-10范围内4个整数(可以有重复),对它们进行加减乘除四则运算后(可以任意的加括号限定计算的优先级),寻找计算结果等于24的表达式
三、功能分析和程序流程图
1.主函数流程图
开始
输入4个数
算出这4个数的全排列
运用+,-,*,/进行计算
是否有结果等于24的组合?
输出该组合及算法
结束
否
是
2.程序开始界面:
voidHello()
{
puts("\n");
puts("##################################################");
puts("####");
puts("##输入4个整数,用它们构造一个算术四则运算,##");
puts("##使结果等于24。
每个数恰好利用一次。
##");
puts("##(可输出有重复的全部解)##");
puts("####");
puts("##################################################");
puts("####");
puts("##设计者:
舒晨##");
puts("##时间:
2012-7-2##");
puts("####");
puts("##################################################");
puts("\n");
}
3.操作数栈,生成n个数中取m个数的全排列。
m=n时即为n个数的全排列,每产生一个排列,放入b[]中。
STACKopnstk;//操作数栈
intb[N],K=0;//a[]的备份/用于生产排列的工作区
voidgen(intn,intm)//生成n个数中取m个数的全排列。
m=n时即为n个数的全排列。
---
{//---每产生一个排列,放入b[]中。
voidgen24();//函数声明
inti;
if(m==0)
{
for(i=0;igen24();//函数调用
}
else
for(i=0;i='.')
{
b[K++]=a[i];
a[i]='.';
gen(n,m-1);
a[i]=b[--K];
}
}
4.运用+,-,*,/运算符来计算着四个数所组成的各种组合并得出结果,判断结果是否等于24,若等于24,则输出这组排列式及算法,若没有等于24的组合,则重新输入4个数。
voidgen24()//用b[]中的4个数产生等于24的算式
{
boolcalc(float,char,float,float&);//函数声明
inti,jn,jo,p0,p1,p2;
charenumopr[3],op;
floata1,a2,c;
constchar*p;
for(i=0;ifor(i=0;i<5;++i)//尝试每种栈模式
for(p0=0;p0<4;++p0){enumopr[0]=opr[p0];
for(p1=0;p1<4;++p1){enumopr[1]=opr[p1];
for(p2=0;p2<4;++p2){enumopr[2]=opr[p2];
opnstk.reset();
for(jn=jo=0,p=stkmode[i];*p!
='';++p)switch(*p){
case'n':
opnstk.push(b[jn++]);break;
case'#':
a2=opnstk.pop();a1=opnstk.pop();op=enumopr[jo++];
if(calc(a1,op,a2,c))opnstk.push(c);elsegotoloc_1;
}
if(abs(c-24)while(*++p!
=0)switch(*p){
case'(':
case')':
putchar(*p);
break;
case'a':
case'b':
case'c':
case'd':
printf("%d",b[*p-'a']);
break;
case'1':
case'2':
case'3':
printf("%c",enumopr[*p-'1']);
break;
}
putchar('\n');
gotoloc_2;
}
loc_1:
continue;
}}}
loc_2:
return;
}
boolcalc(floata,charop,floatb,float&c)
{
staticboolbRet;
switch(bRet=true,op){
case'+':
c=a+b;break;
case'-':
c=a-b;break;
case'*':
c=a*b;break;
case'/':
if(abs(b)>eps)c=a/b;elsebRet=false;
}
returnbRet;
}
四、源程序代码
#include
voidHello()
{
puts("\n");
puts("##################################################");
puts("####");
puts("##输入4个整数,用它们构造一个算术四则运算,##");
puts("##使结果等于24。
每个数恰好利用一次。
##");
puts("##(可输出有重复的全部解)##");
puts("####");
puts("##################################################");
puts("####");
puts("##设计者:
舒晨##");
puts("##时间:
2012-7-2##");
puts("####");
puts("##################################################");
puts("\n");
}
constintN=4;//操作数的个数/栈的极限高度
#defineeps1E-6//浮点精度
inlinefloatabs(floatx){returnx>=0.0?
x:
-x;}//栈模板
templateclassSTACK{
protected:
Ta[N];//栈的存储体
intn;//栈的高度/未来栈顶位置
public:
STACK(){reset();}//栈初始化
voidreset(){n=0;}//清空栈
voidpush(Tx){if(nTpop(){if(n>0)returna[--n];elseputs("栈下溢");}//弹出栈顶数据
//Ttop(){if(n>0)returna[n-1];elseputs("栈空");}//查询栈顶元素
//boolisempty(){returnn==0;}//查询栈是否为空
//intheigth(){returnn;}//查询栈的高度
};
constcharopr[]="+-*/";
inta[N];//输入的4个数
STACKopnstk;//操作数栈
intb[N],K=0;//a[]的备份/用于生产排列的工作区
voidgen(intn,intm)//生成n个数中取m个数的全排列。
m=n时即为n个数的全排列。
---
{//---每产生一个排列,放入b[]中。
voidgen24();//函数声明
inti;
if(m==0)
{
//for(i=0;igen24();//函数调用
}
else
for(i=0;i='.'){
b[K++]=a[i];
a[i]='.';
gen(n,m-1);
a[i]=b[--K];
}
}
//用后缀表达式计算,用中缀表达式输出。
//---n表示将一个操作数压栈,#表示进行一步运算。
//---abcd指操作数的输出顺序,123指运算符的输出顺序。
constcharstkmode[5][22]={
"nnnn###=a3(b2(c1d))",
"nnn#n##=a3((b1c)2d)",
"nnn##n#=(a2(b1c))3d",
"nn#nn##=(a1b)3(c2d)",
"nn#n#n#=((a1b)2c)3d",
};
voidgen24()//用b[]中的4个数产生等于24的算式
{
boolcalc(float,char,float,float&);//函数声明
inti,jn,jo,p0,p1,p2;
charenumopr[3],op;
floata1,a2,c;
constchar*p;
//for(i=0;ifor(i=0;i<5;++i)//尝试每种栈模式
for(p0=0;p0<4;++p0){enumopr[0]=opr[p0];
for(p1=0;p1<4;++p1){enumopr[1]=opr[p1];
for(p2=0;p2<4;++p2){enumopr[2]=opr[p2];
opnstk.reset();
for(jn=jo=0,p=stkmode[i];*p!
='';++p)switch(*p){
case'n':
opnstk.push(b[jn++]);break;
case'#':
a2=opnstk.pop();a1=opnstk.pop();op=enumopr[jo++];
if(calc(a1,op,a2,c))opnstk.push(c);elsegotoloc_1;
}
if(abs(c-24){
while(*++p!
=0)switch(*p){
case'(':
case')':
putchar(*p);
break;
case'a':
case'b':
case'c':
case'd':
printf("%d",b[*p-'a']);
break;
case'1':
case'2':
case'3':
printf("%c",enumopr[*p-'1']);
break;
}
putchar('\n');
gotoloc_2;
}
loc_1:
continue;
}}}
loc_2:
return;
}
boolcalc(floata,charop,floatb,float&c)
{
staticboolbRet;
switch(bRet=true,op){
case'+':
c=a+b;break;
case'-':
c=a-b;break;
case'*':
c=a*b;break;
case'/':
if(abs(b)>eps)c=a/b;elsebRet=false;
}
returnbRet;
}
intmain()
{
Hello();
while(true)
{
printf("请输入%d个整数(用空白分隔。
结束程序请输入0):
",N);
for(inti=0;iK=0;gen(N,N);
}
loc_0:
return0;
}
五、程序运行截图
1.程序开始界面:
2.输入1,5,8,9的运行结果:
3.输入的数字不能得出24的结果:
六、总结和个人心得
设计本程序,起因于儿时的游戏24点,游戏简单富有思考价值。
首先输入1-10范围内的任意4个数,通过不同的组合和运行不同的算法结合在一起反弹能不能是他算出的结果等于24。
课程设计是培养学生综合运用搜学的知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力和集体训练和考察的过程。
经过自己的努力终于做出来了,但是还是存在一些缺陷,这是我子经济对这个程序的思路:
先把各种组合和算法列出来,然后通过不同的算法搭配来计算每种排列所得到结果,若计算出来的结果等于24,直接输出,再计算下一个排列,一直循环知道算完所有的排列数。
但是后有一点小问题,就是输入有些数字后输出的式子有很多重复的,只是前后位置换了一下,此问题还没有解决,希望能从以后的学习中解决这个问题。
七、评分表
计算机与通信学院课程设计评分表
设计内容:
计算24的问题
项目
评价
课程设计期间表现情况
课程设计内容完成情况
课程设计答辩成绩
课程设计报告完成质量
综合成绩
日期:
2012年7月6日