3.2 设计任务
1.已知一个整型数组a[5],其各元素值为4,6,8,10,12。使用指针法求该数组元素之积。 2.100个围成一圈,从第1个人开始,每数到3的人出圈。问最后一个出圈的人是哪一个。3.编写两个排序函数,要求一个函数完成从小到大排序,一个函数完成从大到小排序,并编写主函数完成:
① 输入n个数;
② 调用排序函数对n个数按从大到小排序并输出; ③ 调用排序函数对n个数按从小到大排序并输出;
3.3实现过程
【题目一】
【算法分析】(用文字或流程图进行描述)
【源程序代码】
【编译示图】(示图中要有0 error,0 warning的提示)
【运行结果示图】
【题目二】
【算法分析】(用文字或流程图进行描述)
【源程序代码】
【编译示图】(示图中要有0 error,0 warning的提示)
【运行结果示图】
第4章 综合设计题
4.1 设计任务
1.运用C语言开发一个“小学生算术四则运算测试系统”。该系统是让计算机充当一位给小学生布置作业的算术老师,为学生出题并阅卷。该系统要求实现下列功能:
①为小学生出题(分别进行+、-、*、/等不同运算)。
②学生做题后,进行评阅。学生每做一题后,评阅给出“答题正确,很好”或“答题错误,重做”等信息。
③加、减、乘、除运算功能可以自由选择实现。 ④运算数值可控制在两位数的四则运算范围内。
2.运用C语言开发一个“比赛评分系统”。评委打分原则:满分10分,评委打分后,去掉一个最高分和一个最低分,最后的平均分为参赛选手的最后得分(精确到小数点后两位)。要求该系统实现以下功能:
① 假设参赛人数为20人,评委为10人。(有兴趣的同学可拓展为参赛人数为n人,评委为m人)。并对参赛选手和评委分别编号,序号从1开始,顺序编号。
② 选手按编号顺序依次参加比赛,统计最后得分。
③ 比赛结束,按从高分到低分每行5人依次打印选手的得分情况。 ④ 公布选手获奖。取一等奖1名,二等奖2名,三等奖3名。
3.王小二帮学生食堂编了一个买菜计价的程序,该程序可以显示菜单,让学生输入菜号来选择买什么菜,之后程序会报出你买了多少个菜,用了多少钱。
4.2 设计过程
【题目一】
【算法分析】(用文字或流程图进行描述)
【源程序代码】
【编译示图】(示图中要有0 error,0 warning的提示)
【运行结果示图】
课程设计小结
《C程序设计》课程设计
学 部: 专 业:班 级:学 号: 姓 名: 指导教师:2011年
杜丽芳 月
文档资料的统一要求:
1、文档中的正文字体用五号宋体。
2、第1章,第2章,第3章设计任务要做2个,第4章要做1个,红色字体的必做。 3、每个问题均要有算法分析,源程序代码,编译示图,运行结果示图。 4、文件名命名中要有学生姓名。
5、没有按要求做的同学则视为本课程设计不合格。 6、每次上机所做的内容用移动磁盘带走。
第1章 分支与循环
1.1 算法与范例
1.递推算法
递推算法是循环程序设计的精华之一,在很多情况下使用递推算法能使程序简练,同时还能节省计算时间。
递推算法的基本思想:利用前一项的值来推算出当前项的值,即利用前一项的值乘以(或加上)某一系数得到当前项的值。使用递推算法的前提是必须有一项的值(一般是最前项)是已知的。使用递推算法的关键是如何根据多项式推出递推公式。 【示范】求
)的程序 ?n!(即1!+2!+3!+?+20!
n?120【编程提示】若多项式第1项为t1,第2项为t2,??, 第20项为t20, 则
第1项t1=1!
第2项t2=2!=1!*2= t1*2 第3项t3=3!=2!*3=t2*3, ??
第20项t20=20!=19!*20=t19*20
可以推出多项式后一项等于前一项乘以某一系数这一规律,故求某一项的递推公式为:ti=ti-1*n (n=1 to 20)。因此知道了多项式第1项1!,就可以利用递推公式求出后面的每一项,每求一项累加求和。 【参考程序】
#include
{double sum=0,t=1; int n;
for (n=1;n<=20;n++) {
t=t*n; //递推公式 sum=sum+t; }
printf(\ return 0; }
2.测试法
在实际应用中,有许多问题是无法用解释方法实现的,这时采用测试法来求解是一种很有效的方法。
测试法的基本思想是假设各种可能的解,让计算机进行测试,如果测试结果满足条件,则假设的解就是所要求的解。如果所要求的解是多值的,则假设的解也应是多值的,在程序
设计中,实现多值解的假设往往使用多重循环进行组合。
测试法求解的程序设计有两个要点: ⑴通过循环列出所有可能的解。
⑵对所有列出的可能的解进行条件测试。 【示范】百钱买百鸡问题
已知公鸡每只5元,母鸡每只3元,小鸡1元买3只。要求用100元钱正好买100只鸡,问公鸡、母鸡、小鸡各多少只?
【编程提示】设公鸡、母鸡、小鸡分别为a、b、c只,依据题目能列出下列两个方程:
a+b+c=100 5a+3b+c/3=100 三个未知数,只有两个方程,故是个多解问题。可采用多重循环组合出各种可能的a、b、
c的值。通过循环列出公鸡、母鸡和小鸡可能的只数,再对可能的只数进行条件测试。
100元钱,全部买公鸡最多只能买20只,即公鸡的只数a的范围是:a=0 to 20 100元钱,全部买母鸡最多只能买33只,即母鸡的只数b的范围是:b=0 to 33 100元钱,全部买小鸡最多只能买100只,即小鸡的只数c的范围是:c=0 to 100 【参考程序】:
#include
printf(\公鸡 母鸡 小鸡\\n\ for(a=0;a<=20;a++) for(b=0;b<=33;b++) for(c=0;c<=100;c++) if((a+b+c==100&&5*a+3*b+c/3.0==100) printf(\ return 0; }
1.2 设计任务
1. 王小二自夸刀工不错,有人放一张大地煎饼在砧板上,问他:“煎饼不许离开砧板,切100刀最多能分成多少块?”
2. 若一个口袋中放有12个球,其中有3个红色球,3个白色球和6个黑色球,从中任取8个球,问共有多少不同的颜色搭配,把每种搭配显示出来。
3. 输入年月日,求它是该年的第几天。注:闰年的2月有29天,平年的2月有28天。 4. 简单计算器。请编写一个程序计算表达式:data1 op data2的值。其中op为运算符+、-、*、/,data1和data2是数据。
5. 猜数游戏。由计算机“想”一个数请人猜,如果猜对了,则游戏结束,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到猜对为止。计算机记录人猜的次数,以此可以反映出猜数者“猜”的水平。
6. 一辆肇事汽车的号码是4位十进制数。目击者向交警描述这个车号:这是一个完全平方
数;这4个数字从左至右一个比一个大。请帮助交警寻找肇事者,将车号算出来。
1.3 实现过程
【题目一】
【算法分析】(用文字或流程图进行描述)
【源程序代码】
【编译示图】(示图中要有0 error,0 warning的提示)
【运行结果示图】
【题目二】
【算法分析】(用文字或流程图进行描述)
【源程序代码】
【编译示图】(示图中要有0 error,0 warning的提示)
【运行结果示图】
第2章 数组与函数
2.1 启示与范例
【示范1】输入n个学生的成绩,并求出其中高于平均分的人数。 【编程提示】用程序来实现本题的要求,首先有两个值得思考的问题:一是数据结构的选择;二是数组的长度。
① 数据结构的选择:n个学生的成绩是否有必要开辟数组来存放还是定义变量来存放?从任务要求分析知,两次用学生成绩,一次是求平均分;另一次是将每个学生的成绩与平均分比较,高于平均分要输出。因此有必要将其定义数组。
② 数组的长度定义:学生个数n的具体数值一般表示在编写程序时是未知的,而在程序执行时由使用者随意确定。即n是一个变量,其值需要用输入来确定。这样一来,存放n个分数的数组a,其长度的定义就必须注意,既不能定义为int a[n];因为数组长度要求是常量,而n是一个变量,又不能将n定义成符号常量,因为n的具体值是未知的。对于这种情况的处理方法一般是:将数组的长度定义较大,让使用者在此范围内随意使用,当然这个长度的定义有其原则,那就是既不让使用者感到长度不够,又不至于定义过大而浪费内存,这种情况视应用情况而定。 【参考程序】
#include
int i,a[1000],num=0,n; float aver=0;
printf(\输入学生个数n\\n\ scanf(\
printf(\输入学生的成绩存放到数组a中\\n\ for(i=0;i scanf(\ aver=aver+a[i]; } aver=aver/n; for(i=0;i printf(\高于平均分的人数是:%d\\n\ return 0; } 【示范2】输入任意个学生的学号及成绩,然后按顺序输出高分的前十名。 【编程提示】依据设计任务的要求需要考虑几个问题:初始数据的数据结构选择;采用的算法如何实现及相关的数据结构;任意个数据的实现问题。 ① 初始数据的数据结构选择问题:所谓任意个学生,应该是个数不限,因此,对于存 放初始数据的数据结构不宜选择为数组。并且,从算法实现的角度考虑,每个学生的数据输入后只需使用一次,没有再保留的必要,因此可选择简单变量作数据结构来存放一个学生的数据,而且每个学生的初始数据都用同一个数据结构存放,即对一个学生的数据使用完后就将该数据结构让给下一个学生的数据使用。 ② 算法的实现及相关的数据结构:本题核心的算法是排序,由设计任务可知只要求前十名的排序结果,因此算法上不需考虑对所有学生数据进行排序,只考虑对前十名排序即可。因此,应选择合适的数据结构来存放前十名排序结果的数据,显然,选择数组是最合适的。关于算法的实现可采用插入排序法最为合适。即存放排序结果的数组始终是存放当前已插入数据的前十名的排序结果,而后每输入一个学生的数据就进行一次插入排序更新这一排序结果。 ③ 任意个的实现:对于本题的程序来说,总体结构还是一个循环结构,每次循环的任务是输入一个学生的数据并进行插入排序。问题是何时结束循环?循环结束的条件是什么?对用户输入的有用数据,循环继续;对用户输入的无用数据即输入数据为负数时,循环结束。 ④ 为了使程序更加清晰。主程序只提供输入学生的学号、成绩,并且输出前十名的学号及成绩;子函数实现插入排序的过程。 【参考程序】 #include void insertsort(int num[],int a[],int n,int number,int score) { int i,j; for(i=0;i int main() { int i,num[10],a[10],number,score; for(i=0;i<10;i++) { a[i]=0; num[i]=0; } while(1) { printf(\输入学生的学号及学生成绩:\\n\ scanf(\ if(number<0||score<0) break; insertsort(num,a,10,number,score); } for(i=0;i<10;i++) printf(\前十名学生学号%d 成绩是%d\\n\return 0; } 2.2 设计任务 1. 有一个一维数组score[],内存放10个学生的成绩,要求编写三个函数分别求学生的平均成绩,求10个学生的最高分,求10个学生的最低分,在主函数中调用这三个函数得到结果。 2. 编写一个函数,将输入的一串字符中的小写字母转变成大写字母,在主函数中调用这个函数,并输出所有的大写字母。 3. 输入10个学生姓名,按字典顺序将排在最前面的学生姓名输出。即在字符数组中求最小字符串。 4. “数学黑洞”:任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差任为一个自然数。重复进行上述运算,会发现一个神秘的数。 2.3实现过程 【题目一】 【算法分析】(用文字或流程图进行描述) 【源程序代码】 【编译示图】(示图中要有0 error,0 warning的提示) 【运行结果示图】 【题目二】 【算法分析】(用文字或流程图进行描述) 【源程序代码】 【编译示图】(示图中要有0 error,0 warning的提示) 【运行结果示图】 第3章 指针 3.1 启示与范例 指针变量作为函数参数最常见有以下两种用法:① 用于接受实参变量的地址,从而可以在函数中通过访问指针变量所指向的内存单元来达到间接地访问实参变量。这样,函数中既可引用实参变量原来的值,也可将结果存入实参变量所在的单元,达到双向传递的效果。② 用于接受实参数组的首地址,从而可以在函数中通过访问指针变量所指向的内存单元来达到间接访问实参数组的各元素,这样,函数中既可以引用实参数组各元素的值,也可以将结果存入实参数组的各元素中。 【示范】通过改变指针的指向来引用不同元素法:编写输入100名学生的成绩,输出其中高于平均分的人数。 【参考程序】 #include int over_aver_number(int *a,int n) { int i,number=0; float aver=0; for(i=0;i aver+=*a++; /*a++的作用是每执行一次循环就让指针变量a指向下一个元素,使以后的访问就直接访问a所指向的内存单元,不需再作地址计算。*/ aver/=n; a-=n; // a-=n的作用是使a恢复其初始指向。 for(i=0;i int main() { int i,number,a[100]; //a是数组名,是指针常量。 printf(\ for(i=0;i<100;i++) scanf(\ number=over_aver_number(a,100); printf(\输出高于平均分的人数number=%d\ return 0; } 百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库c语言课程设计报告在线全文阅读。
相关推荐: