高立秦的C语言实习报告

更新时间:2023-05-14 02:03:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中 国 地 质 大 学 本科生课程论文封面

课程名称 C语言课程设计 教师姓名 童恒建 本科生姓名 高立秦 本科生学号 20101003173 本科生专业 资源勘查工程 所在院系 资源学院 日期: 2012年2月20日

目录

第一部分:课程设计编号、名称、内容 .....

第二部分:程序总体设计思路

第三部分:程序功能划分、图示及流程图

第四部分:程序设计数据、运行结果

第五部分:程序的优缺点

第六部分:程序改进思路

第七部分:附录(源程序)第八部分:程序设计总结

................... .. ......... .......................... .......................... .......................

..........................

第一部分:课程设计编号、名称、内容

编号:二十一题 名称:歌星大奖赛 内容:

【要求】

(1) 在歌星大奖赛中,有十个评委为参赛的选手打分,分数为1~100分。选手

最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均植。请编写一个程序实现。

(2) 同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近

平均分)和最不公平(即与平均分的差距最大)的评委。

【提示】

一、 需求分析

这个问题的第一个要求算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。第二个要求为了考虑效率,要用到排序技术。

第二部分:程序总体设计思路

由于C语言是面对过程的语言,故我的设计思路是根据目标程序运行的过程来编写的。 王老师给我安排的是21题的《歌星大奖赛》,在编写本程序的过程中,首先我借助购买的指导材料,了解了一些目标程序运行的次序与界面的操作方法,然后按照题目的具体要求进行思考和设计。

因为老师抽签给我的程序比较简单,再加上前期实习时王老师交给的一些C的思路和方法,我很快便将整个程序的设计思路整理清楚。具体的设计思路如下:

程序的要求是根据十个评委对歌手的打分情况,求出这个歌手的平均成绩和最公平及最

不公平的裁判。首先,我先考虑到程序的数据输入,可以用scanf函数来解决,并将输入的数据存放于数组中。随后对存放在数组中的数据进行排序,这步为执行找出最不公平的裁判提高了效率,只需将排好序的数组的首尾分值与平均值进行比较即可。将排好序的数组中间的八个数求平均值即为此歌手的成绩,可见排序法可大大的简化程序。接下来是最后一个任务就是找最公平的裁判,此过程我使用拆半法,先将靠近中间的一个裁判假设为最公平的,再将他前面的裁判与之比较,找出前半部分的最公平的裁判,再将之与后半部分的进行比较,得出最终的最公平的裁判。为了方便管理员更好的使用界面操作,我还设置了每输入完一组数据并得到结果后,或接着输入下组数据或按0跳出界面。

整个程序的设计思路到此结束。

第三部分:程序功能划分、图示及流程图

【功能模块划分及其流程图】

本程序功能模块根据程序设计的需求,综合程序的实用性、人性化、智能化的考虑,将程序划分为6个部分分别编写,程序主体功能将由这6个部分来完成。这6个部分依次是:

1.分数的输入部分;

2.对分数进行的排序部分;

3.计算平均值的部分;

4.找出最不公平裁判部分;

5.找出最公平裁判部分;

6.数据的输出部分

总体设计:

系统功能模块图

第四部分:程序设计数据、运行结果

本程序是一款应用软件,故数据设计、程序运行结果应在程序的运用中得以体现,现在通过一个程序的运用事例来对数据设计、程序运行结果进行演示与实现:

【软件运用举例】

李明通过朋友介绍想了解裁判对某歌手的评分情况,于是到俱乐部管理员面前说明了意向,裁判部管理员启动歌手大奖赛管理系统。

程序开始界面如下:

管理员管理员输入评委对任意歌手的打分,输入完毕后程序如下菜单界面:

管理员输入输入完毕后,按[Enter]健,程序运行界面如下:

此程序显示了裁判对歌手的平均分数,以及根据裁判们打分与平均分数间的差距判断出的最公平和最不公平裁判的位置及打分!

为了向李明验证程序的准确性及公平与不公平裁判出现在每个裁判上的几率,管理员又输入了几位歌手的打分

管理员输入输入完毕后,按[Enter]健,程序运行界面如下:

接着又输入一组数据后运行如下:

当出现最高分的裁判和最低分的裁判各不止一个时,输入数据后程序界面的运行如下:

第五部分:程序的优缺点

【程序的优点】

算法是程序的灵魂,程序的优点首先表现在算法上的优点,其次才是功能上的。

[算法上的优点]主要体现在以下三点:

1. 程序采用main主函数方式设计,程序的主体的功能大都由该功能完成。程序如此设计

有利于程序的进一步改进及有助于程序执行效率的提高。

2. 程序对数据的读写采用了scanf 函数,此数据的读取与存贮方式有利于磁盘数据的加

密,即无法用记事本等程序对数据文件进行正常读取,即有助于数据的保护与加密。另外,对磁盘文本数据的修改有多种方式,通过对比研究发现,本程序采用scanf函数一次性把所有修改过的结构体数组写入文本文件的修改方式,不仅克服了本次程序设计中文本文件不能顺利准确读取的难点,而且相较于传统的fprintf()函数的写入方式与创建临时交换文件的写入方式,写入效率明显提高。

3. 程序执行使用for语句,C语言中的for语句使用是最为灵活的。不仅可以用于循环次

数已确定的情况,而且可以用于循环次数不确定而值给出循环结束条件的情况,他完全可以代替while语句!有助于相应功能准确高效运行。

当然,程序的编写白手写起的,历时3天,克服了非常多的困难,感觉到了很大的压力。程序是在边看书、边查资料、询问、长期思考与设计、调试、试验的基础上编写出来的,在编写程序的过程中,得到了许多的锻炼,编程的思维也得以塑造。

程序经过数次精简,但仍然比较大,可能是编程经验不足造成的,虽不能说本程序比一定他人与此相同的程序运行效率更高,占有资源更少,但是程序执行的准确性还是能够保障的。

[功能上的优点] 主要体现在以下三点:

1.简洁明了的程序菜单。程序主要采用了四组层次不同的菜单,相互独立又相互联系,巧

妙相接,符合用户的使用习惯与思维。

2.人性化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑问句,而且

提示明确,具有较强的明确的指导作用。程序提示不仅层次分明,提示方式多样,而且提示信息井然有序,更加有利于用户顺利、准确地看懂程序并进行操作。 3.程序采用先对裁判分数进行排序,再将排序后首尾的分数直接与平均值进行比较,得出

最差裁判。即方便的让用户能看懂程序,又提高了计算的效率,减少了运算的次数.再如每次评判结果操作结束后,均会提示是否返回主菜单,并提示是否再进行类似输入操作,这样给用户带来了操作的方便,大大提高了评选的管理效率。

【程序的缺点】

主要表现在以下四点:

1.程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,即

未找到更加简单、更加高效、更加合理、更小占用的资源的算法。 2.程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功

能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。 3.程序功能仍然不够完善。例如程序不能根据多组数据的输入判断出总的最公平和最不公

平的裁判,这是程序设计时所没有考虑到了。到了程序编写后期,经老师指导也发现了此错误,但却没有及时修改。

4.操作界面为DOS界面,不符合时代潮流,也不符合现代用户操作的习惯,信息表达方式

不丰富,比较单一,缺少图片、音乐等元化表达方式。

第六部分:程序改进思路

【针对第一点:程序算法精简问题】

>>改进思路: 1. 算法上除了采用结构体数组外,考虑在程序的算法设计上引入排序法,考察这样对数据

组织运算效率上是具有提高作用的。 2. 就现有知识水平、经验来看,对我来说,本程序的算法设计上已经是最精简的了。C语

言知识博大精深,有必要对C语言的专著进行研究学习,多阅读别人的程序代码、多动手实践操作与设计,这样便对程序算法精简改进提供了可能。

【针对第二点:用户输入错误问题】

>>改进思路:

对每个数据输入段代码进行更深的研究与分析,明确变量的类型、可能的数值,然后进行分类判断(if或switch语句),必要时借助for循环语句来控制程序进行,保障各模块运行相对独立,稳定准确执行各自功能。典型方法是如果输入数据错误,通过printf输出问题,并用for或(do)while构成循环,直到用户输入正确为止。此功能本因在程序中得以体现,但因对C语言编程掌握的不够全面和深入,加上时间不太充分,此程序中没有体现出来,是我编程工作中的失误,再以后还需加深学习并改进!

【针对第三点:程序功能完善问题】

>>改进思路:

[管理员对运动员的成绩输入]设计思路:将裁判的评给分数全部读入,并且全部进行简单的排序,通过去掉排序后首尾最高和最低分,求出相应的歌手的平均成绩,再将平均值与

每个裁判的打分进行比较,与平均值差值最大的定位此次打分中最不公平的裁判,与平均值差值最小的定为此次打分中最公平的裁判!

【针对第四点:操作界面单调问题】 >>改进思路:

C语言是面向过程的语言,当时语言开发的程序主要是面向DOS用户,虽具有较强的绘图功能等等功能,但主要还是面向DOS的。当今的主流语言是面向对象的语言,开发的平台大多为WINDOWS界面平台,开发的程序也主要是WINDOWS组件基础之上的图形界面程序,故可将程序要求移植到VC++之上,借助VC++强大的功能,编写WINDOWS界面程序,利用API接口函数方便调用各种WINDOWS强大功能,服务程序,使程序更加丰富、直观、生动、高效。

第七部分:附录(原程序)

#include <stdio.h> #include <math.h> #include <conio.h>

struct test {

int num; float s; };

main() {

int i,j,k,bad,good;

float ts,sum=0,aver=0,tm[10];

struct test data[10],*p[10],*temp;

do {

sum=0;aver=0;

printf("Input 10 sorces------input 0(exit)\n");

for(i=0;i<10;i++) {data[i].num=i+1;

scanf("%f",&data[i].s);

/*分数的输入部分*/ if(data[0].s==0) printf(0); }

for(i=0;i<10;i++) tm[i]=data[i].s;

for(i=0;i<10;i++) p[i]=&data[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;

} /*对输入分值进行排序*/ }

for(i=1;i<9;i++) sum+=p[i]->s; aver=sum/8;

/*计算平均值的部分*/

printf("\n-----------------\n"); printf("The aver is:%.1f\n",aver); printf("-----------------\n");

(fabs(p[0]->s-aver)>fabs(p[9]->s-aver))?(bad=0):(bad=9);

/*通过绝对差值判断与平均值相差最大的裁判*/

double min=fabs(p[5]->s-aver); good=5;

/*暂定第六个为最公平裁判*/

for(i=4;i>0;i--)

{if((fabs(p[i]->s-aver))<=min)

{min=fabs(p[i]->s-aver); good=i; } else break; }

/*用拆半法先将前半部分与min比较*/

for(i=6;i<9;i++)

{if((fabs(p[i]->s-aver))<=min)

{min=fabs(p[i]->s-aver); good=i; } else break; }

/*用拆半法先将后半部分与min比较*/

printf("The worst pingwei is %d and the sorce is %.1f\n", p[bad]->num,p[bad]->s);

/*打印出最不公平裁判和其分数*/

printf("The best pingwei is %d and the sorce is %.1f\n", p[good]->num,p[good]->s);

/*打印出最公平裁判和其分数*/

printf("\n----------------------------------\n"); printf("Next one:");

/*打印出下一位*/

}while(1);

/* getch(); */ return 0; }

第八部分:程序设计总结

经过这几天的程序设计实践,我学习到了很多原来不太清楚的东西。我们学习C语言课程是在大二上学期,到这次计算机实习,许多知识已经有点模糊,通过这次课程设计,不仅巩固了我的C语言理论知识,而且还很好的将我们所学的理论知识与上机实践紧密的结合起来,使我的实际操作能力大大提高。另外,通过这次课程,我更学会了如何在面对问题时,发现问题,分析问题并最终解决问题。在这次设计课程过程中,我遇到了一些比较难解决的问题,比如在比较哪一位裁判最公平和哪一位裁判最不公平的设计中,迟迟找不到下手的地方,但是通过和同学的交流还是解决了这些问题。在面对设计过程中出现的各种各样的问题时,都通过和老师以及同学的讨论交流一一解决。在不断地分析、纠错、调试中,我的知识也在不断地增加,解决问题的能力也在不断地增强。总之,这几天的计算机实习课让我获益匪浅,收获很多。

课程设计评语

注:1、无评阅人签名成绩无效;

2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;

3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。

本文来源:https://www.bwwdw.com/article/qh7e.html

Top