C语言课程设计报告15

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《C程序设计》课程设计学部:土木专业:岩土班级:1班学号:1140100114姓名:指导教师:杜丽芳2011年1月1文档资料的统一要求:1、文档中的正文字体用五号宋体。2、第1章,第2章,第3章设计任务要做2个,第4章要做1个,红色字体的必做。3、每个问题均要有算法分析,源程序代码,编译示图,运行结果示图。4、文件名命名中要有学生姓名。5、没有按要求做的同学则视为本课程设计不合格。6、每次上机所做的内容用移动磁盘带走。第1章分支与循环1.1算法与范例1.递推算法递推算法是循环程序设计的精华之一,在很多情况下使用递推算法能使程序简练,同时还能节省计算时间。递推算法的基本思想:利用前一项的值来推算出当前项的值,即利用前一项的值乘以(或加上)某一系数得到当前项的值。使用递推算法的前提是必须有一项的值(一般是最前项)是已知的。使用递推算法的关键是如何根据多项式推出递推公式。【示范】求201!nn(即1!+2!+3!+…+20!)的程序【编程提示】若多项式第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=1to20)。因此知道了多项式第1项1!,就可以利用递推公式求出后面的每一项,每求一项累加求和。【参考程序】#includestdio.hintmain(){doublesum=0,t=1;intn;for(n=1;n=20;n++){t=t*n;//递推公式sum=sum+t;}printf(1!+2!+...+20!=%22.15e\n,sum);return0;}2.测试法在实际应用中,有许多问题是无法用解释方法实现的,这时采用测试法来求解是一种很有效的方法。测试法的基本思想是假设各种可能的解,让计算机进行测试,如果测试结果满足条件,则假设的解就是所要求的解。如果所要求的解是多值的,则假设的解也应是多值的,在程序设计中,实现多值解的假设往往使用多重循环进行组合。测试法求解的程序设计有两个要点:⑴通过循环列出所有可能的解。⑵对所有列出的可能的解进行条件测试。【示范】百钱买百鸡问题已知公鸡每只5元,母鸡每只3元,小鸡1元买3只。要求用100元钱正好买100只鸡,问公鸡、母鸡、小鸡各多少只?【编程提示】设公鸡、母鸡、小鸡分别为a、b、c只,依据题目能列出下列两个方程:a+b+c=1005a+3b+c/3=100三个未知数,只有两个方程,故是个多解问题。可采用多重循环组合出各种可能的a、b、c的值。通过循环列出公鸡、母鸡和小鸡可能的只数,再对可能的只数进行条件测试。100元钱,全部买公鸡最多只能买20只,即公鸡的只数a的范围是:a=0to20100元钱,全部买母鸡最多只能买33只,即母鸡的只数b的范围是:b=0to33100元钱,全部买小鸡最多只能买100只,即小鸡的只数c的范围是:c=0to100【参考程序】:#includestdio.hintmain(){inta,b,c;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(%d%d%d\n,a,b,c);return0;}1.2设计任务1.王小二自夸刀工不错,有人放一张大地煎饼在砧板上,问他:“煎饼不许离开砧板,切100刀最多能分成多少块?”2.若一个口袋中放有12个球,其中有3个红色球,3个白色球和6个黑色球,从中任取8个球,问共有多少不同的颜色搭配,把每种搭配显示出来。3.输入年月日,求它是该年的第几天。注:闰年的2月有29天,平年的2月有28天。4.简单计算器。请编写一个程序计算表达式:data1opdata2的值。其中op为运算符+、-、*、/,data1和data2是数据。5.猜数游戏。由计算机“想”一个数请人猜,如果猜对了,则游戏结束,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到猜对为止。计算机记录人猜的次数,以此可以反映出猜数者“猜”的水平。6.一辆肇事汽车的号码是4位十进制数。目击者向交警描述这个车号:这是一个完全平方数;这4个数字从左至右一个比一个大。请帮助交警寻找肇事者,将车号算出来。1.3实现过程1.3.1设计任务1的实现过程【算法分析】(用文字或流程图进行描述)【源程序代码】#includestdio.hintmain(){ints=1,n,t;for(n=1;n=100;n++){t=n;s=s+t;}printf(%d\n,s);return0;}【编译示图】(示图中要有0error,0warning的提示)【运行结果示图】1.3.2设计任务2的实现过程【算法分析】(用文字或流程图进行描述)【源程序代码】#includestdio.hintmain(){inta,b,c;for(a=0;a=3;a++)for(b=0;b=3;b++)for(c=2;c=6;c++)if(a+b+c==8)printf(红球=%d,白球=%d,黑球=%d\n,a,b,c);return0;}【编译示图】(示图中要有0error,0warning的提示)【运行结果示图】1.3.3设计任务3的实现过程【算法分析】(用文字或流程图进行描述)把符号都IF语句个个写出来,然后在写【源程序代码】#includestdio.hintmain(){floatdata1,data2,c;charop;scanf(%f%c%f,&data1,&op,&data2);if(op=='*')c=data1*data2;if(op=='/')c=data1/data2;if(op=='+')c=data1+data2;if(op=='-')c=data1-data2;printf(%.2f,c);return0;}【编译示图】(示图中要有0error,0warning的提示)【运行结果示图】1.3.4设计任务4的实现过程【算法分析】(用文字或流程图进行描述)按找出云年的判断方法,然后在根据云年和31天,29天,30天的计算规律【源程序代码】#includestdio.hintmain(){intfind(intx,inty,intz);intyear,month,date,day;scanf(%d%d%d,&year,&month,&date);day=find(year,month,date);printf(thedateis%dthdays\n,day);return0;}intfind(intx,inty,intz){inti,s,t,days=0;if(x%4==0)t=1;elset=0;for(i=1;iy;i++){if(i==2)s=2-t;elses=0;days+=30+i%2-s;}days=days+z;return(days);}【编译示图】(示图中要有0error,0warning的提示)【运行结果示图】第2章数组与函数2.1启示与范例【示范1】输入n个学生的成绩,并求出其中高于平均分的人数。【编程提示】用程序来实现本题的要求,首先有两个值得思考的问题:一是数据结构的选择;二是数组的长度。①数据结构的选择:n个学生的成绩是否有必要开辟数组来存放还是定义变量来存放?从任务要求分析知,两次用学生成绩,一次是求平均分;另一次是将每个学生的成绩与平均分比较,高于平均分要输出。因此有必要将其定义数组。②数组的长度定义:学生个数n的具体数值一般表示在编写程序时是未知的,而在程序执行时由使用者随意确定。即n是一个变量,其值需要用输入来确定。这样一来,存放n个分数的数组a,其长度的定义就必须注意,既不能定义为inta[n];因为数组长度要求是常量,而n是一个变量,又不能将n定义成符号常量,因为n的具体值是未知的。对于这种情况的处理方法一般是:将数组的长度定义较大,让使用者在此范围内随意使用,当然这个长度的定义有其原则,那就是既不让使用者感到长度不够,又不至于定义过大而浪费内存,这种情况视应用情况而定。【参考程序】#includestdio.hintmain(){inti,a[1000],num=0,n;floataver=0;printf(输入学生个数n\n);scanf(%d,&n);printf(输入学生的成绩存放到数组a中\n);for(i=0;in;i++){scanf(%d,&a[i]);aver=aver+a[i];}aver=aver/n;for(i=0;in;i++)if(a[i]=aver)num++;printf(高于平均分的人数是:%d\n,num);return0;}【示范2】输入任意个学生的学号及成绩,然后按顺序输出高分的前十名。【编程提示】依据设计任务的要求需要考虑几个问题:初始数据的数据结构选择;采用的算法如何实现及相关的数据结构;任意个数据的实现问题。①初始数据的数据结构选择问题:所谓任意个学生,应该是个数不限,因此,对于存放初始数据的数据结构不宜选择为数组。并且,从算法实现的角度考虑,每个学生的数据输入后只需使用一次,没有再保留的必要,因此可选择简单变量作数据结构来存放一个学生的数据,而且每个学生的初始数据都用同一个数据结构存放,即对一个学生的数据使用完后就将该数据结构让给下一个学生的数据使用。②算法的实现及相关的数据结构:本题核心的算法是排序,由设计任务可知只要求前十名的排序结果,因此算法上不需考虑对所有学生数据进行排序,只考虑对前十名排序即可。因此,应选择合适的数据结构来存放前十名排序结果的数据,显然,选择数组是最合适的。关于算法的实现可采用插入排序法最为合适。即存放排序结果的数组始终是存放当前已插入数据的前十名的排序结果,而后每输入一个学生的数据就进行一次插入排序更新这一排序结果。③任意个的实现:对于本题的程序来说,总体结构还是一个循环结构,每次循环的任务是输入一个学生的数据并进行插入排序。问题是何时结束循环?循环结束的条件是什么?对用户输入的有用数据,循环继续;对用户输入的无用数据即输入数据为负数时,循环结束。④为了使程序更加清晰。主程序只提供输入学生的学号、成绩,并且输出前十名的学号及成绩;子函数实现插入排序的过程。【参考程序】#includestdio.hvoidinsertsort(intnum[],inta[],intn,intnumber,intscore){inti,j;for(i=0;in;i++)if(scorea[i])break;if(i=n)return;for(j=n-2;j=i;j--){num[j]=num[j-1];a[j]=a[j-1];}num[i]=number;a[i]=score;}intmain(){inti,num[10],a[10],number,score;for(i=0;i10;i++){a[i]=0;num[i]=0;}while(1){printf(输入学生的学号及学生成绩:\n);scanf(%d%d,&number,&score);if(number0||score0)break;insertsort(num,a,10,number,score);}for(i=0;i10;i++)printf(前十名学生学号%d成绩是%d\n,num[i],a[i]);return0;}2.2设计任务1.有一个一维数组score[],内存放10个学生的成绩,要求编写三个函数分别求学生的平均成绩,求10个学生的最高分,求10个学生的最低分。2.编写一个函数,将输入的一串字符中的小写字母转变成大写字母,并输出所有的大写字母。3.输入10个学生姓名,按字典顺序将排在最前面的学生姓名输出。即在字符数

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功