C语言课堂教程.ppt

上传人:s****8 文档编号:67334773 上传时间:2022-12-24 格式:PPT 页数:25 大小:544.50KB
返回 下载 相关 举报
C语言课堂教程.ppt_第1页
第1页 / 共25页
C语言课堂教程.ppt_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《C语言课堂教程.ppt》由会员分享,可在线阅读,更多相关《C语言课堂教程.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、项目五项目五 根据条件进行学生成绩汇总根据条件进行学生成绩汇总项目要求项目要求一个班有一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),老师想统计以下信息:(考了三门课,分别是数学、语文、英语),老师想统计以下信息:1、统计、统计小组一门课程的总分及平均分;小组一门课程的总分及平均分;2、统计小组若干门课程的总分及平均分;、统计小组若干门课程的总分及平均分;3、输出排序后小组三门课成绩单。输出排序后小组三门课成绩单。程序运行结果程序运行结果项目分析项目分析本项目要完成的功能相对比较

2、多,为了使程序的结构清晰,我们可以将此项目进行分解:A:统计小组一门课程的总分及平均分;B:统计小组若干门课程的总分及平均分;C:输出小组排序后三门课程的成绩单;M总负责,即制作菜单并根据需要调用相应的函数。而C这个任务又比较多,所以将它分解为:d:输入记录;e:计算每个同学的总分及平均分,f:是排序;g:输出排序后的记录。这样的编程方式结构清晰,特别是对功能复杂的程序。我们将A,B,C,D、e、f、g称为函数,M称为主函数。一个完整的C语言程序是由一个main()函数及若干个其他函数组成。在前面各项目中介绍的程序都只有一个主函数main(),但实用程序往往由多个函数组成。首先,要了解函数的定

3、义;第二,要懂得函数的调用;第三,函数的其他知识。任务任务1 统计小组一门课程的总分及平均分统计小组一门课程的总分及平均分一、问题情景一、问题情景一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),请你用菜单的方式:求小组一门课程的总分及平均分。即完成本项目中的第一个要求。分析:主函数的功能是设计一个菜单,由所选择的菜单调用相应的函数,但为了界面清晰,所以程序的执行过程中多次用一条线划界。所以问题就归结为制作一条线的函数及求一门课程的总分及平均分。#include stdio.hvoid ppp()printf(-n);float avg

4、1(int n)int x,i;float s=0;ppp();printf(请输入本小组的考试成请输入本小组的考试成绩绩n);for(i=1;i=n;i+)scanf(%d,&x);s+=x;return s;main()int k,n,km;float sum,average;char ch;ppp();printf(t班级成绩统计n);ppp();printf(1、统计小组一门课程的总分及平均分n,n);printf(2、统计小组若干门课程的总分及平均分n);printf(3、输出小组排序后三门课程的成绩单n);printf(请输入13之间的一个数:);scanf(%d,&k);ppp(

5、);if(k=1)printf(请输入统计的小组的人数n=);scanf(%d,&n);ppp();sum=avg1(n);average=sum/n;printf(本小组的总分=%.0ft平均分=%.1fn,sum,average);ppp();无参函数有参函数有参函数三、相关知识三、相关知识(一一)无参函数无参函数1、无参函数的一般形式类型说明符 函数名()声明部分 语句无参函数的调用函数说明语句函数名();函数类型 函数名()函数体;main()语句;函数名();函数名();语句;函数类型 函数名();main()语句;函数名()函数名();语句;函数类型 函数名()函数体;函数说明语句

6、【例例5-1】输出十行十列的星号(要求用函数调用方式解决)输出十行十列的星号(要求用函数调用方式解决)方法一方法一(主函数在前主函数在前)#include stdio.hvoid pp();main()int i;for(i=1;i=10;i+)pp();void pp()printf(*n);方法二(主函数在后)方法二(主函数在后)#include stdio.hvoid pp()printf(*n);main()int i;for(i=1;i=10;i+)pp();void 表示这个函数无返回值;表示这个函数无返回值;pp是函数名是函数名【例例5-2】用菜单的形式分别选择百钱买百鸡,九九表

7、,水仙用菜单的形式分别选择百钱买百鸡,九九表,水仙花数花数 分析:百钱买百鸡,九九表,水仙花数分别在项目三的例3-12、例3-11、例3-18中介绍过。本题就是将例3-12、例3-11、例3-18改为函数,然后在主函数中调用即可。所以本程序中有三个无参函数,即sxhs()、jjb()、bqmbj()分别是求水仙花数、求九九表、求百钱买百鸡。#include stdio.hvoid sxhs();void jjb();void bqmbj();main()int i;printf(1.水仙花数n);printf(2.乘法九九表n);printf(3.百钱买百鸡n);printf(请选择13的菜单

8、:);scanf(%d,&i);if(i=1)sxhs();/当x=1,调用求水仙花数的函数if(i=2)jjb();if(i=3)bqmbj();/*水仙花数*/void sxhs()int i,a,b,c;printf(n下列数字为水仙花数:n);for(i=100;i=999;i+)a=i/100;b=(i-a*100)/10;c=i-a*100-b*10;if(i=a*a*a+b*b*b+c*c*c)printf(%d n,i);/*乘法九九表*/void jjb()int i,j;printf(n乘法九九表n);for(i=1;i=9;i+)for(j=1;j=i;j+)printf

9、(%-5d,i*j);printf(n);/*百钱买百鸡*/void bqmbj()int x,y,z;printf(公鸡数 母鸡数 小鸡数n);for(x=1;x=50;x+)for(y=1;y=33;y+)z=100-x-y;if(2*x+3*y+0.5*z=100)printf(%4d%4d%4dn,x,y,z);(二二)空函数空函数类型说明符 函数名()“小括弧”中是空的,“花括弧”中也是空的。此函数的没有任何功能,只是占一个位置而已。这样做的好处是将来扩充新的功能方便。(三)有参函数(三)有参函数1、有参函数的一般形式类型说明符 函数名(形参类型 形参名,形参类型 形参名,形参类型

10、形参名)声明部分 语句return 语句“小括弧”中的形参,可以有一个,也可以有多个。函数体中的最后一个语句,通常是return语句,其作用是带回一个返回值。若没有返回值,则可以省略return语句。2、有参函数的调用与无参函数类似,只不过需要有形参。即:函数名(实参列表);具体有以下二种:函数类型 函数名(形参列表)函数体;main()语句;函数名(实参列表);函数名(实参列表);语句;函数类型 函数名(形参列表);main()语句;函数名(实参列表);函数名(实参列表);语句;函数类型 函数名(形参列表)函数体;【例例5-3】求求Cmn=m!/(n!(m-n)!)分析:如果有一个函数jc(

11、k),其功能是求k!,即jc(5)就是5!,jc(8)就是8!,jc(10)就是10!,显然对m!/(n!(m-n)!)来说,就是jc(m)/(jc(n)*jc(m-n)即可。#include stdio.hint jc(int k);/*函数说明语句*/main()int m,n,c;printf(请输入m,n的值:);scanf(%d%d,&m,&n);c=jc(m)/(jc(n)*jc(m-n);printf(Cmn的值为%dn,c);/*阶乘的函数*/int jc(int k)int i;int t=1;for(i=1;i=k;i+)t=t*i;return t;#include st

12、dio.h/*阶乘的函数*/int jc(int k)int i;int t=1;for(i=1;i=k;i+)t=t*i;return t;/*主函数*/main()int m,n,c;printf(请输入m,n的值:);scanf(%d%d,&m,&n);c=jc(m)/(jc(n)*jc(m-n);printf(Cmn的值为%dn,c);C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递。【例例5-4】调用函数时的数据传递。输入二个数调用函数时的数据传递。输入二个数x,y,求二个,求二个数中的大数。数中的大数。#include stdio.hint max(int x,in

13、t y)int t,max;if(xy)t=x;x=y;y=t;max=x;printf(在函数中的在函数中的x,y的值为的值为x=%d,y=%dn,x,y);return max;main()int x,y,mm;printf(请输入请输入x,y的值的值:);scanf(%d,%d,&x,&y);printf(调用函数前调用函数前x,y的值为的值为x=%d,y=%dn,x,y);mm=max(x,y);printf(mm的值为的值为%dn,mm);printf(调用函数后调用函数后x,y的值为的值为x=%d,y=%dn,x,y);尽管在主函数和max()函数中都定义了名为x,y的变量,但它们

14、是属于不同的实体,它们仅仅是名称相同而已,就好比有二个人都叫“李小芳”,但一个是计算机班的“李小芳”,但另一个是国贸班的“李小芳”。任务任务2 统计小组若干门课程的总分及平均分统计小组若干门课程的总分及平均分一、问题情景一、问题情景一个班有40位学生(分成五个组,但每个组的人数不一样)参加了期终考试(考了三门课,分别是数学、语文、英语),请你用菜单的方式:求小组若干门课程的总分及平均分。即完成本项目中的第二个要求。分析:由图可分析出主函数的功能是设计一个菜单,由所选择的菜单调用相应的函数,但为了界面清晰,所以在程序的执行过程中出现:求小组的若干门成绩的平均分及总分的函数又调用了一条线的函数pp

15、p()。二、具体实现二、具体实现#include stdio.h/*输出线条函数*/ppp()printf(-n);/*某个小组若干门课程的平均分与总分函数*/void avgevery(int n,int km)int x,i,j;float s,avg;for(j=1;j=km;j+)s=0;printf(请输入本小组第%d门考试成绩n,j);ppp();for(i=1;i=n;i+)scanf(%d,&x);s+=x;avg=s/n;printf(第%d课程的总分=%.0ft平均分=%.1fn,j,s,avg);ppp();/*主函数*/main()int k,n,km;float su

16、m,average;char ch;ppp();printf(t班级成绩统计n);ppp();printf(1、统计小组一门课程的总分及平均分n,n);printf(2、统计小组若干门课程的总分及平均分n);printf(3、输出小组排序后三门课程的成绩单n);printf(请输入13之间的一个数:);scanf(%d,&k);ppp();if(k=2)printf(请输入统计的小组的人数n=);scanf(%d,&n);ppp();printf(请输入要统计的课程门数km=);scanf(%d,&km);ppp();avgevery(n,km);三、相关知识三、相关知识 嵌套调用的定义:即在

17、调用一个函数的过程中,可以再调用一个函数。main()函数调用a1函数a1函数调用a2函数a2函数结束执行main函数中调用a1函数时,即转去执行a1函数;在a1函数中调用a2函数时,又去执行a2函数;a2函数执行完毕返回a1函数断点继续执行;a1函数执行完毕返回main函数的断点继续执行,直至程序执行结束。例题例题【例5-5】函数的嵌套调用。求Cmn=m!/(n!(m-n)!)。要求用函数的嵌套方式完成。分析:假设有3人参加,C负责计算jc(k),B向C要jc(k),然后计算Cmn;A负责输入m,n二个数,然后直接问B要Cmn的结果。#include stdio.h/*c的程序为*/int

18、jc(int k)int i;int t=1;for(i=1;i=k;i+)t=t*i;return t;/*而B的程序为:*/int cmn(int m,int n)int z;z=jc(m)/(jc(n)*jc(m-n);return z;/*A的程序为:*/main()int m,n,c;printf(请输入m,n的值:);scanf(%d%d,&m,&n);c=cmn(m,n);printf(Cmn的值为%dn,c);这个程序就是A要调用B,而B要调用C,所以就称为函数的嵌套。main()int k,n,km;float sum,average;char ch;ppp();printf

19、(t班级成绩统计n);ppp();printf(1、统计小组一门课程的总分及平均分n,n);printf(2、统计小组若干门课程的总分及平均分n);printf(3、输出小组排序后三门课程的成绩单n);printf(请输入13之间的一个数:);scanf(%d,&k);ppp();if(k=2)printf(请输入统计的小组的人数n=);scanf(%d,&n);ppp();printf(请输入要统计的课程门数km=);scanf(%d,&km);ppp();avgevery(n,km);现在回头分析本任务中的具体实现:主函数调用avgevery()函数,而avgevery()函数又调用ppp

20、()函数,即属于函数的嵌套。/*输出线条函数*/ppp()printf(-n);/*某个小组若干门课程的平均分与总分函数*/void avgevery(int n,int km)int x,i,j;float s,avg;for(j=1;j=km;j+)s=0;printf(请输入本小组第%d门考试成绩n,j);ppp();for(i=1;i1)#include stdio.hint age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return c;main()printf(第五个小朋友的年龄为%dn,age(5);运行结果如下:第五个小朋友的年龄为

21、11n=5age(4)+2返回值11第一次调用n=4age(3)+2返回值9第二次调用n=3age(2)+2返回值7第三次调用n=2age(1)+2返回值5第四次调用第五次调用n=1递归结束返回值3【例例5-6】求求1+2+3+n的和。的和。分析:可写成 1 (n=1)sum(n)=sum(n-1)+n (n1)程序如下:#include stdio.hint sum(int n)int y;if(n=1)y=1;else y=sum(n-1)+n;return y;main()int n;scanf(%d,&n);printf(%dn,sum(n);任务任务3 输出排序后小组三门课成绩单输出

22、排序后小组三门课成绩单 一、问题情景一、问题情景 一个班有40位学生参加了期终考试(考了三门课),请输出学生排序后的成绩单。分析:本项目要完成的功能相对比较多,为了使程序的结构清晰,我们可以将些项目进行分解:A:完成三门课成绩的输入;B:计算每个同学的总分与平均分;C:对三门课的成绩进行排序;D:输出函数 E:总负责,调用A、B、C、D即可。二、具体实现二、具体实现(假设本小组只有5个同学)#include stdio.h#include string.h#define N 5/*输出线条函数*/ppp()printf(-n);/*输入函数A*/void input(int scoreN3,c

23、har nameN10)int i,j;for(i=0;iN;i+)printf(第%d个同学的姓名及三门课的成绩:,i+1);scanf(%s,namei);for(j=0;j3;j+)scanf(%d,&scoreij);/*计算每个同学的总分与平均分B*/void sumavg(int scoreN3,float sum,float avg)int i,j;for(i=0;iN;i+)for(j=0;j3;j+)sumi=sumi+scoreij;avgi=sumi/3.0;/*排序函数C*/void px(int score3,float sum,float avg,char name

24、10)int i,j;float t;char nn10;for(i=0;iN-1;i+)for(j=0;jN-1-i;j+)if(sumjsumj+1)t=sumj;sumj=sumj+1;sumj+1=t;t=avgj;avgj=avgj+1;avgj+1=t;/这个同学的所有数据都要交换t=scorej0;scorej0=scorej+10;scorej+10=t;t=scorej1;scorej1=scorej+11;scorej+11=t;t=scorej2;scorej2=scorej+12;scorej+12=t;strcpy(nn,namej);strcpy(namej,nam

25、ej+1);strcpy(namej+1,nn);/*输出函数D*/void print(int score 3,float sumr,float avgr,char name 10)int i,j;ppp();printf(输出排序后五个同学三门课的成绩:n);ppp();printf(序号t姓名t课1t课2t课3t总分t平均分n);for(i=0;iN;i+)printf(%d:t,i+1);printf(%st,namei);for(j=0;j3;j+)printf(%dt,scoreij);printf(%.0ft%.1ft,sumri,avgri);printf(n);ppp();/

26、*主函数*/main()int i,j;int scoreN3,t;char nameN10,nn10;float sumrN=0,avgrN;/每个同学的总分及平均分/*调用输入记录函数*/input(score,name);/*调用计算总分与平均分的函数*/sumavg(score,sumr,avgr);/*调用排序函数*/px(score,sumr,avgr,name);/*调用输出函数*/print(score,sumr,avgr,name);新的知识点是:数组作为函数名时,是如何传递的。(三三)相关知识相关知识使用数组名作为函数参数时,实参与形参都应使用数组名(或指针变量,见项目六)

27、。当数组名作为函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,实参和形参的地址是相同的,即当形参的值发生变化时,实参的值也发生了变化。【例5-7】有二个学生A,B合力完成下面一个问题:求20个学生的平均成绩。他们的分工是这样的:B完成20个数的平均值,不负责数据的输入;A完成20个数的输入,然后问B要20个数的平均值后输出。分析:B所做的是求平均值的average()函数:已经有二十个数了,放在数组a20中,现在只要将这20个数相加后除以20,然后将结果交给A就行了。A所做的是主函数main():输入20个数,并将其放在数组中,调用B所做的函数,将输入的20个数传

28、递给B,然后接过B的结果,并将其输出。#include stdio.h/*B所完成的程序*/float average(int b20)/b20表示从A中拿到的20个数 int i,s;float avg;s=0;for(i=0;i20;i+)s=s+bi;/将20个数相加 avg=s/20.0;return avg;/结果交给对方/*A所完成的程序*/main()int i,a20;/定义20个数,将存放20个数据float avg;printf(请输入20个同学的成绩n);for(i=0;i20;i+)scanf(%d,&ai);/输入20个数据avg=average(a);/*调用ave

29、rage()函数,将数组a的值传给average 并接过average的结果,将其放在avg中*/printf(这些同学的平均分为%.1fn,avg);注意注意(4)形参数组也可不指定大小,或者在被调函数中另设一个参数,来传递数组的大小。如上面的程序可改为:(1)数组名作为函数参数,应该在主调函数和被调函数中分别定义数组,如上面程序中的b是形参数组,a是实参数组,分别在其所在的函数中定义。(2)实参数组与形参数组类型应当相同,如果不同,将会出错,如上面程序中的形参数组b是整型,实参数组a也是整型。(3)实参数组与形参数组大小可以不同也可以相同,C编译器对形参数组大小不做检查,只是将实参数组的首

30、地址传递给形参数组。如上面程序中的float average(int b20)改为float average(int b10),并不影响程序的正常运行,最后的结果也是相同的,我们甚至可以写成float average(int b),即只要b是数组即可。(5)形参数组与实参数组是占用同一个地址,所以是地址传递,即当形参的值发生变化时,实参的值也会跟着变化。#include stdio.hfloat average(int b,int n)int i,s;float avg;s=0;for(i=0;in;i+)s=s+bi;/将20个数相加 avg=(float)s/n;return avg;/结

31、果交给对方【例5-8】输入十个同学的成绩,要求用函数进行排序(降序)。即有二个学生A,B合力完成下面一个问题:将10个学生的成绩排序(降序)。他们的分工是这样的:A是完成主函数的编写:也就是完成10个数的输入,调用B编写的函数sort(),就得到排序完的10个数,然后进行输出。B所编写的函数sort()的功能是完成10个数的排序,不负责数据的输入。#include stdio.hvoid sort(int b);main()int a10,i;printf(请输入十个同学的成绩n);for(i=0;i10;i+)scanf(%d,&ai);sort(a);/调用函数sort()printf(排

32、序后的成绩为:n);for(i=0;i10;i+)printf(%3d,ai);printf(n);void sort(int b)/*函数的功能就是选择法进行排序*/int i,j,t;for(i=0;i9;i+)for(j=i+1;j10;j+)if(bibj)t=bi;bi=bj;bj=t;任务任务4 举一反三举一反三【例5-9】请仿照例5-2编写一个用菜单的形式分别选择1-100的奇数和,韩信点兵问题。(韩信点兵问题在例3-24)分析:1-100的奇数和,韩信点兵分别在项目三的习题、例3-24中介绍过。本题就是将它改为函数,然后在主函数中调用即可。所以本程序中有二个无参函数,即hxdb

33、()、sum()分别是韩信点兵、1-100的奇数和。#include stdio.hvoid hxdb()/韩信点兵long i;for(i=1;i+)if(i%3=2&i%5=2&i%7=4&i%13=6&i%17=2&i%19=10)break;printf(韩信统领的兵数有:%ldn,i);void sum()/1-100的奇数和int i,s=0;for(i=1;i=100;i=i+2)s=s+i;printf(1-100奇数的和为%dn,s);main()int i;printf(1.韩信点兵n);printf(2.1-100的奇数和n);printf(请选择12的菜单:);scan

34、f(%d,&i);if(i=1)hxdb();/当x=1,调用韩信点兵函数if(i=2)sum();【例5-10】编写一个函数,编写x!,在主函数中调用它。#include stdio.hint jc(int x)int i,t=1;for(i=1;ic&a+cb&b+ca)t=1;elset=0;return t;/*C所完成的函数*/float area(int a,int b,int c)/计算三角形面积float s,l;l=(a+b+c)/2.0;s=sqrt(l*(l-a)*(l-b)*(l-c);return s;/*A所完成的函数*/main()int a,b,c;printf

35、(请输入三角形a,b,c的值n);scanf(%d,%d,%d,&a,&b,&c);if(istriangle(a,b,c)=1)printf(三角形的面积为%.1fn,area(a,b,c);elseprintf(对不起,构不成三角形n);分析:若n=6,则6!=5!*6,5!=4!*5,4!=3!*4,3!=2!*3,2!=1!*2,而1!=1;所以,可以写成【例5-12】用递归求n!。#include long jc(int n)int i;long t;if(n=1)t=1;else t=jc(n-1)*n;return t;void main()int n;scanf(%d,&n);

36、printf(%d!=%ldn,n,jc(n);1 (n=1)n!=(n-1)!*n (n1)【例5-13】将例5-8改成:在函数中进行 n个学生成绩从高到低排名。即有二个学生A,B合力完成下面一个问题:将n个学生的成绩进行排序(降序)。他们的分工是这样的:A是完全成主函数的编写:也就是完成n个数的输入,调用B编写的函数sort(),就得到排序后的n个数,然后进行输出。B所编写的函数sort()的功能是完成n个数的排序,不负责数据的输入。#include stdio.hvoid sort(int b,int n);main()int a100,i,n;printf(请输入参加排序的学生数n=)

37、;scanf(%d,&n);printf(请输入%d个同学的成绩n,n);for(i=0;in;i+)scanf(%d,&ai);sort(a,n);/调用函数sort()printf(排序后的成绩为:n);for(i=0;in;i+)printf(%3d,ai);printf(n);void sort(int b,int n)/函数的功能就是选择法进行排序int i,j,t;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(bibj)t=bi;bi=bj;bj=t;【例例5-14】将将5-13题改成:在函数中进行题改成:在函数中进行 n个学生成绩排名。个学生成绩排名。升序

38、还是降序由函数中的升序还是降序由函数中的style参数决定。参数决定。分析:在编写的函数sort()中加入一个参数style,若style的值为a,则排列方式为升序,若style的值为d,则排列的方式为降序。#include stdio.hvoid sort(int b,int n,char style);main()int a100,i,n;char style;printf(请输入参加排序的学生数n=);scanf(%d,&n);printf(请输入%d个同学的成绩n,n);for(i=0;in;i+)scanf(%d,&ai);getchar();/吸收输入为数据的回车符printf(请

39、输入排序的方式,升序输入a,降序输入dn);scanf(%c,&style);sort(a,n,style);/调用函数sort()printf(排序后的成绩为:n);for(i=0;in;i+)printf(%3d,ai);printf(n);void sort(int b,int n,char style)/函数的功能就是选择法进行排序int i,j,t;if(style=d)for(i=0;in-1;i+)for(j=i+1;jn;j+)if(bibj)t=bi;bi=bj;bj=t;elsefor(i=0;in-1;i+)升序for(j=i+1;jbj)t=bi;bi=bj;bj=t;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁