课程设计报告(参考)

  • 格式:doc
  • 大小:69.50 KB
  • 文档页数:6

1 红河学院工学院

专业:计算机科学与技术

年级:2010级

学号:20103050215

姓名: XXXXXXX

成绩:

红河学院 工学院编制

2 说 明

1、本报告供学生课程设计时使用。

2、学生应认真阅读所学课程配套的相关资料。

3、课程设计报告里面的内容要手工填写,以备存档使用(源程序可打印)。

4、课程设计的总评成绩根据课程的性质,按一定比例计入该门课程成绩。

5、报告中的“算法分析及流程图”中的内容是评分的主要依据,如果不够书写,可以自行添加附页。

6、按规定的时间提交报告给教师评定成绩,由任课教师交到工学院存档。

课程设计目录

课程名称:C语言程序设计

任务序号 任务名称 起止页码

题目11 小明买书

3---11

设计任务(1)

任务

名称 小明买书

班级 2010级1班 指导

教师 张建美 地点 红河学院 成绩

学年 2010-2011年春季学期 开始

日期 2011-04-10 结束

日期 2011-06-10

3 内容及基本要求:

内容:

小明假期同爸爸一起去书店,他选中了六本书,每本书的单价分别为:3.1,1.7,2,5.3,0.9和7.2。不巧的是,小明的爸爸只带了十几块钱,为了让小明过一个愉快的假期,爸爸扔然同意买书,但提邮购一个要求,要小明从六本书中选出若干本,使得单价相加所得的和同10最接近。你能够帮助小明解决这个问题吗?

基本要求:

……

4 一.问题分析与算法设计

问题分析:

分析题意,可将题目简化为:从六个数中选出若干个求和,使得和与10的差值最小。

题目中隐含两个问题,其一是怎样从六个数中选出若干个数;其二是求与10的差。

从六个数中选出若干个数实质是从六个数中选出若干个进行组合。每个数在组合过程中只有两种情况:要么是选中参加求和,要么是没选中不参加求和。这样就可以使用六重循环对每个数是否参加求和进行全部可能情况的组合。

关于求与10的差值应当注意的是:差值的含义是指差的绝对值。例如:“9-10=-1"和"11-10=1",但9和11这两者与10的差值都是1。若认为”9“与”10的差值为-1就错了。

设计方法及步骤:

(1)首先定义头文件以及相应的宏,然后再定义三个结构体(其中最重要的结构体是一个含3个成员的结构体,且结构体变量为Mgraph);

(2)创建图。包括顶点数,边数的输入,以及各顶点(为字符)的输入。

(3)定义图中各顶点之间的关系为0(即无关联)。

(4)利用for循环将每一条边的起点与终点输入,并将输入的边的起点、终点与输入的有向图顶点不复合的边,赋值为1。

(5)定义主函数。主函数中包括,调用创建图的函数,并输出该图的深度优先遍历和广度优先遍历的结果。

任务总体安排:2008-12-20~2009-1-30完成课程设计所要求的全部任务。

进度安排:

2008-12-20~2008-12-31:上网查找与题目相关的资料,并重点阅读课本上的相关知识。

2009-1-2~2009-1-10:对问题进行抽象,得到描述问题的算法,编写出程序。

2009-1-11~2009-1-20:设计完整的程序进行演示。

2009-1-21~2009-1-31:对设计进行总结分析。

2009-2-1~2009-2-25:填写课程设计手册,并提交指导教师。

任务流程图:

……

可能遇到的问题:

……

解决的方法:

……

5 设计成果及总结分析:(设计成果包括程序清单、测试数据、指定的功能模块说明、设计说明,程序清单可打印)

功能模块:

……

程序清单:

#include

#include

int main()

{

int d[6],m,i,j;

long b[63],flag;

float c[6],min,x;

printf("Please enter the prices of 6 books:");

for(i=0;i<6;i++) scanf("%f",&c[i]); /*输入六个浮点数*/

for(i=0,min=-1,d[0]=0;d[0]<2;d[0]++) /*建立六个数的全部组合并处理*/

for(d[1]=0;d[1]<2;d[1]++) /*i:差值具有min组合的数量*/

for(d[2]=0;d[2]<2;d[2]++) /*min:与10的最小差值*/

for(d[3]=0;d[3]<2;d[3]++) /*d[]:组合时是否取该数的标志*/

for(d[4]=0;d[4]<2;d[4]++)

for(d[5]=0;d[5]<2;d[5]++)

{

for(flag=0,x=0,j=5;j>=0;j–)

/*flag:将六个数的组合用对应的一个十进制位表示 x:对应六个数组合的和*/

{

x+=c[j]*d[j]; flag=flag*10+d[j];

}

x=((x-10>0)? x-10:10-x); /*x: 组合的和与10的差*/

if(min<0)

{

min=x; /*对第一次计算出的差min进行处理*/

b[i++]=flag; /*b[]:有相同的min的flag的数组 i:b[]数组的下标*/

}

else if(min-x>1.e-6) /*对新的min的处理*/

{

min=x; b[0]=flag; i=1;

}

else if(fabs((double)x-min)<1.e-6)

b[i++]=flag; /*对相等min的处理*/

}

for(m=0;m

{

printf("10(+ -)%.2f=",min);

6 for(flag=b[m],j=0;flag>0;j++,flag/=10)

if(flag%10) /*将b[]中存的标记flag还原为各个数的组合*/

if(flag>1) printf("%.2f+",c[j]);

else printf("%.2f\n",c[j]);

}

}

运行结果

Please enter the prices of 6 books:3.1 1.7 2.0 5.3 0.9 7.2

10(+ -)0.10=2.00+0.90+7.20

10(+ -)0.10=1.70+2.00+5.30+0.90

10(+ -)0.10=3.10+1.70+5.30

(也可以用截图,如:)运行结果: