资源描述
C语言课程设计报告
学 院:
专 业:
班 级:
学 号:
姓 名:
指导老师:
目 录
第一部分:前言摘要 1
第二部分:课程设计名称及题目要求 1
第三部分:程序总体设计思路 2
第三部分:调试分析 8
第四部分:使用手册 10
第五部分:测试结果 10
第六部分:总结与致谢 13
第七部分:参考文献 14
第八部分:附录(源程序) 15
第一部分:前言摘要
课程设计是学习程序设计语言中的一个重要环节。为提高学生程序设计能力,课程设计共安排两个实践环节:上机实习和课程设计。其中上机实习与课堂教学同一学期先后进行,主要是检验课堂教学内容,初步掌握程序设计的基本方法和调试技能;课程设计是在课堂学习结束后,集中安排一次上机强化训练,使学生的程序设计能力再上一个台阶。最后,以报告形式形成此次课程设计的最终成果。
第一部分为上机实习。安排了Visual C++环境下的课堂实习内容。具体内容包括Visual C++ 集成环境的使用;课堂实验指导内容,共分八个实验,学生在每次上机实习前需事先阅读并熟悉相关实验内容。具体进度可由任课教师统一安排。由于统一安排的上机时间有限,部分实验内容可由学生在课后自由上机时间完成。
第二部分是课程设计。老师首先让大家复习以前所学知识,然后在每堂课上给大家出道相关题目让大家进行自我测试检验。最后通过多次统一课程设计,在课程结束时完成自己所选的题目的课程设计。
第二部分:课程设计名称及题目要求
题目名称:歌星大奖赛
【要求】
(1) 在歌星大奖赛中,有十个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均植。请编写一个程序实现。
(2) 同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委。
【需求分析】
这个问题的第一个要求算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。第二个要求为了考虑效率,要用到排序技术。
第三部分:程序总体设计思路
一、设计思想
对于我所做的题目,我是采用根据目标程序运行的过程的方法来编写的。此种方法较为简单明了,容易理解接受,属常规思维,但是不够精简,有进一步改进的空间。
我所做的是16题:《歌星大奖赛》。首先我学习了《C语言课程设计与学习指导》的相关内容,再在以前所学C语言的基础上,以及在老师的指导、同学的帮助指正下,借图书馆及网上的相关资料,了解了一些目标程序运行的次序与界面的操作方法后,我按照题目的具体要求进行了思考和设计,具体设计思路为:
程序的要求是根据十个评委对歌手的打分情况,求出这个歌手的平均成绩和最公平及最不公平的裁判。首先,我先考虑到程序的数据输入,可以用scanf函数来解决,并将输入的数据存放于数组中。随后对存放在数组中的数据进行排序,这步为执行找出最不公平的裁判提高了效率,只需将排好序的数组的首尾分值与平均值进行比较即可。将排好序的数组中间的八个数求平均值即为此歌手的成绩,可见排序法可大大的简化程序。接下来是最后一个任务就是找最公平的裁判,此部分我接受了同学的建议,使用拆半法,先将靠近中间的一个裁判假设为最公平的,再将他前面的裁判与之比较,找出前半部分的最公平的裁判,再将之与后半部分的进行比较,得出最终的最公平的裁判。整个程序的设计思路到此结束。
1.数据结构
struct test
{
int num;
float s;
};
2.文件结构
整个程序分为//main.c主函数和//Fun.c两部分。
3.基本思想
程序按照题目要求依次进行。在主函数下调用具体功能实现函数依次实现数据的输入和排序,求平均值,求最公平数据以及求最不公平数据的操作,最后输出结果。整体程序思想简单,无太复杂过程。
二、模块设计
【功能模块划分及其流程图】
本程序功能模块根据程序设计的需求,综合程序的实用性、人性化、智能化的考虑,将程序划分为5个部分分别编写,程序主体功能将由这5个部分来完成。这5个部分依次是:
1.分数的输入以及对分数进行排序的部分;
采用数组和指针,将10个裁判对于同一个选手的打分分别输入并存放于指针所指的地址中,以便后面调用和输出。
将输入的10个分数按照从低到高的顺序排成一列,以便方便接下来计算选手得分,以及找出最公平和最不公平裁判。
2.计算平均值的部分;
将排序好的分数去掉第一个和最后一个,再将剩下8个求和之后除以8,便是选手的最终得分。
3.找出最不公平裁判部分;
使用拆半法,先将靠近中间的一个裁判假设为最公平的,再将他前面的裁判与之比较,找出前半部分的最不公平的裁判,再将之与后半部分的进行比较,得出最终的最不公平的裁判。
4.找出最公平裁判部分;
使用拆半法,先将靠近中间的一个裁判假设为最公平的,再将他前面的裁判与之比较,找出前半部分的最公平的裁判,再将之与后半部分的进行比较,得出最终的最公平的裁判。
5.数据的输出部分。
总体设计:
歌星大奖赛评分系统
分数输入
分数排序
计算平均分
找出最不公平评委
找出最公平评委
数据输出
开始
主函数流程图:
InputAndSort
Average
WorstJude
BestJude
【模块接口说明】
首先通过InputAndSort实现对数据的输入与排序,然后依次调用Average,WorstJude和BestJude函数对数据进行处理,求出平均值,最公平数据和最不公平数据。
三、函数的功能实现
主要有以下几个部分:
void InputAndSort(struct test p[]); //输入评分和排序
float Average(struct test p[]); //平均
void WorstJude(struct test p[], float average); //最不公平
void BestJude(struct test p[], float average); //最公平
四、算法设计
//Fun.c
void InputAndSort(struct test p[])
{
int i, j, k;
float ts, tm[10];
struct test a[10], temp;
printf("Input 10 sorces\n");
for (i = 0; i<10; i++)
{
a[i].num = i + 1;
scanf("%f", &a[i].s); //分数的输入部分
}
for (i = 0; i<10; i++)tm[i] = a[i].s;
for (i = 0; i<10; i++)p[i] = a[i];
for (i = 0; i < 9; i++)
{
k = i;
for (j = i + 1; j < 10; j++)
if (tm[k] < tm[j])
k = j;
if (k != i)
{
ts = tm[i]; tm[i] = tm[k]; tm[k] = ts; temp = p[i]; p[i] = p[k]; p[k] = temp;
} //对输入数据进行排序
}
}
float Average(struct test p[])
{
int i;
float sum = 0;
float average = 0;
for (i = 1; i<9; i++)
sum += p[i].s;
average = sum / 8; //计算平均值的部分
printf("\n…………\n");
printf("The average is:%.1f\n", average);
printf("…………\n");
return average;
}
void WorstJude(struct test p[], float average)
{
int bad;
(fabs(p[0].s - average)>fabs(p[9].s - average)) ? (bad = 0) : (bad = 9); //通过绝对值之差判断与平均值相差最大的裁判
printf("The worst judge is %d and the score is %.1f\n", p[bad].num, p[bad].s);
} //输出最不公平裁判和其分数
void BestJude(struct test p[], float average)
{
int i;
int good;
double min = fabs(p[5].s - average);
good = 5; //暂定第六个为最公平裁判
for (i = 4; i>0; i--)
{
if ((fabs(p[i].s - average)) <= min)
{
min = fabs(p[i].s - average); good = i;
}
else break;
} //用折半法先将前半部分与min比较
for (i = 6; i<9; i++)
{
if ((fabs(p[i].s - average)) <= min)
{
min = fabs(p[i].s - average); good = i;
}
else break;
} //用折半法将后半部分与min比较
printf("The best judge is %d and the score is %.1f\n", p[good].num, p[good].s);
} //输出最公平裁判和其分数
第三部分:调试分析
1.优点分析
[算法上的优点]
主要体现在以下三点:
1. 程序采用main主函数方式设计,程序的主体的功能大都由该功能完成。程序如此设计有利于程序的进一步改进及有助于程序执行效率的提高。
2. 程序执行使用for语句,C语言中的for语句使用是最为灵活的,而他完全可以代替while语句!有助于相应功能准确高效运行。
3. 程序对数据的读写采用了scanf 函数,此数据的读取与存贮方式有利于磁盘数据的加密,即无法用记事本等程序对数据文件进行正常读取,有助于数据的保护与加密。另外,本程序采用scanf函数一次性把所有修改过的结构体数组写入文本文件的修改方式,不仅克服了本次程序设计中文本文件不能顺利准确读取的难点,而且相较于传统的fprintf()函数的写入方式与创建临时交换文件的写入方式,写入效率明显提高。
[功能上的优点]
主要体现在以下三点:
1. 简洁明了的程序菜单。
2. 人性化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑句,而且提示明确,具有较强的明确的指导作用。
3. 程序采用先对裁判分数进行排序,再将排序后首尾的分数直接与平均值进行比较,得出最差裁判。
2.缺点分析
【程序的缺点】
主要表现在以下四点:
1. 程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,未找到更加简单、更加高效、更加合理、更小占用的资源的算法。
2. 程序仍然存在不合理的地方,仍需进一步改进。
3. 程序功能仍然不够完善。
3.改进
1. 可以对程序进行进一步简化,我采用的是折半法求最公平裁判,可以直接从前到后来求最公平裁判;
2. 可以在程序执行完毕后设置执行某一操作来退出程序,这样更加人性化。因为这样必定会增加程序复杂度,所以我没有进行设置;
3. 程序运行时,出现不止一个最公平裁判或最不公平裁判时,程序会默认输出序号较小的裁判分数,并不能同时输出全部相同裁判位置,这方面还可以进一步改进完善。
第四部分:使用手册
1. 依次输入裁判分数,数据间用空格隔开;
2. 输完一组数据后按enter键执行下一步输出结果;
3. 输入下一组数据时重复以上操作即可;
4. 程序执行完毕后直接关闭程序。
第五部分:测试结果
本程序是一款应用软件,故数据设计、程序运行结果应在程序的运用中得以体现,现在通过一个程序的运用事例来对数据设计、程序运行结果进行演示与实现:
现在假设要求某一选手的得分情况,,则在下面所示的界面里输入10位裁判对于该选手的打分:
输入10位裁判对于该选手的打分,如下面界面所示:
输入输入完毕后,按[Enter]健回车,程序运行界面如下:
此程序显示了歌手的最后得分,以及根据裁判们打分与最后得分之间的差距判断出的最公平和最不公平裁判的位置及打分!
为了验证程序的准确性及公平与不公平裁判出现在每个裁判上的几率,又输入了几位歌手的打分,如下所示:
输入输入完毕后,按[Enter]健回车,程序运行界面如下:
接着又输入一组数据后运行如下:
当出现最高分的裁判和最低分的裁判各不止一个时,输入数据后程序界面的运行如下:
第六部分:总结与致谢
二:收获与体会;
为了编写这个程序我用了很多天时间,克服了非常多的困难,感觉到了很大的压力。程序是在边看书、边查资料、询问、长期思考与设计、调试、试验的基础上编写出来的,在编写程序的过程中,得到了许多的锻炼,编程的思维也得以塑造。有的地方我自己编不出来,多亏了室友的帮忙与指导。第二部分的折半法我原本没有采用,可是总是编不出来,最后不得已只有采用这个方法。这次课程设计让我收获很多,首先以前学的C知识得到了加强与巩固;其次收获了很多新知识,编程的方法、思路以及思维模式等;最后,通过此次课程设计,我发现了自己仍然存在很多的不足,基础知识大的并不扎实,需要进一步学习和复习巩固。
感谢老师在课程设计这段时间的指导与帮助,以及同学耐心地和我改进、完善程序!
第七部分:参考文献
[1]谭浩强.C语言设计(第四版)[M].北京:清华大学出版社,2010.
[2]张冬梅,刘远兴,陈晶,王媛妮.C语言课程设计与学习指导.中国铁道出版社,2008.
[3]何兴恒. C语言设计实践指导书.武汉:中国地质大学出版社,2004.
[4]谭浩强.C语言设计教程.北京:清华大学出版社,2007.
[5]张宝森.C语言程序设计实验与实训.北京:科学出版社,2005.
[6]王贺艳.C语言程序设计综合实训.北京:科学出版社,2007.
[7]杨开城.C语言程序设计教程实验与练习.北京:人民邮电出版社,2005.
[8]谭浩强. C语言设计题解与上机指导.北京:清华大学出版社,2010.
[9]杨彩霞.C语言课程设计实验指导与习题解答.北京:中国铁道出版社,2006.
[10]郑军红.C语言设计上机实习指导与综合练习.武汉:武汉大学出版社,2008.
第八部分:附录(源程序)
//main.c
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
struct test
{
int num;
float s;
};
void InputAndSort(struct test p[]); //输入评分和排序
float Average(struct test p[]); //平均
void WorstJude(struct test p[], float average); //最不公平
void BestJude(struct test p[], float average); //最公平
int main()
{
float average;
struct test a[10];
struct test *p = a;
do {
InputAndSort(p); //
average=Average(p);
WorstJude(p, average);
BestJude(p, average);
printf("\n…………\n");
printf("The next:");
} while (1);
return 0;
}
//Fun.c
void InputAndSort(struct test p[])
{
int i, j, k;
float ts, tm[10];
struct test a[10], temp;
printf("Input 10 sorces\n");
for (i = 0; i<10; i++)
{
a[i].num = i + 1;
scanf("%f", &a[i].s); //分数的输入部分
}
for (i = 0; i<10; i++)tm[i] = a[i].s;
for (i = 0; i<10; i++)p[i] = a[i];
for (i = 0; i < 9; i++)
{
k = i;
for (j = i + 1; j < 10; j++)
if (tm[k] < tm[j])
k = j;
if (k != i)
{
ts = tm[i]; tm[i] = tm[k]; tm[k] = ts; temp = p[i]; p[i] = p[k]; p[k] = temp;
} //对输入数据进行排序
}
}
float Average(struct test p[])
{
int i;
float sum = 0;
float average = 0;
for (i = 1; i<9; i++)
sum += p[i].s;
average = sum / 8; //计算平均值的部分
printf("\n…………\n");
printf("The average is:%.1f\n", average);
printf("…………\n");
return average;
}
void WorstJude(struct test p[], float average)
{
int bad;
(fabs(p[0].s - average)>fabs(p[9].s - average)) ? (bad = 0) : (bad = 9); //通过绝对值之差判断与平均值相差最大的裁判
printf("The worst judge is %d and the score is %.1f\n", p[bad].num, p[bad].s);
} //输出最不公平裁判和其分数
void BestJude(struct test p[], float average)
{
int i;
int good;
double min = fabs(p[5].s - average);
good = 5; //暂定第六个为最公平裁判
for (i = 4; i>0; i--)
{
if ((fabs(p[i].s - average)) <= min)
{
min = fabs(p[i].s - average); good = i;
}
else break;
} //用折半法先将前半部分与min比较
for (i = 6; i<9; i++)
{
if ((fabs(p[i].s - average)) <= min)
{
min = fabs(p[i].s - average); good = i;
}
else break;
} //用折半法将后半部分与min比较
printf("The best judge is %d and the score is %.1f\n", p[good].num, p[good].s);
} //输出最公平裁判和其分数
18
展开阅读全文