版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全国计算机等级考试,C语言程序设计(二级),2020年7月25日星期六,1.语言与函数,1.语言与函数本教材可能与其他教材有所不同,除了废话,没有与编程不相干的话。不太好理解是吧?当你真的打开某一本教材,第一章:计算机的发展史讲述那过去的事情呵呵,我连VC6.0怎么安装我都不讲,大家相互讨论吧,对了,真装盗版时注意如果有一些错误的话跳过就是了,这里建议大家都有属于自己的计算机,尽量专机专用,不然如果我们在论坛里如果都讨论一些与编程不相干的问题(如:怎么我的机器调用出什么错误啊什么的)就没意思了。,2020年7月25日星期六,行了,闲话少说,书归正传,(注:我是一边写文章,一边在VC上试的,所以
2、说应该可以保证你一步一步的程序能够运行,所以请大家步步跟上。注意了,我们C语言与C+是同时教大家的,所以如果你有C语言的书,可能与我们的教学有出入,以我们论坛上的为准。,2020年7月25日星期六,建一个C应用程序的步骤,第一步当然是打开VC了,怎么打? 第二步:文件/新建./工程/Win32 Console Application注:以后我们按上面的规则说明怎么做:文件/:表示文件菜单;新建后有三个点表示将打开一个对话框,工程上带中括号表示选择此选项卡,后面是选择的内容。以后就这么定了,不说了。 第三步:在工程下面的输入框内输入一个题目:“MyFirst”注:名子随便起。 第四步:在位置下面
3、选择一个工程的位置,会吧? 第五步:按“确定”,再按“完成”,再按“确定”。(注:我说过,我们暂时不做过多的解释,如果你真的没做过程序的话,可能解释再多你也不一定懂是不是,所以你应该依葫芦画瓢就行了。),2020年7月25日星期六,建一个控制台应用程序,这时,我们我建立了一个工程。当然如果要输入程序我们还要继续进行下一步: 文件/新建./文件/C+ Source File明白什么意思了吧?右面的“文件”下面的输入框中输入“MyFirst”然后按“确定”。(注:对于上面的过程,我们以后表述为:建一个控制台应用程序“MyFirst”,我们就不再介绍过创建过程了。)于是出现了界面。行了,向里面输入一
4、些东西吧:void main(),2020年7月25日星期六,运行程序,然后点“运行”(注:就是上面那个感叹号图标,呵呵)怎么样?看到什么了?看到一个小黑窗口打开是不是?里面出现了一行字:Press any key to continue是不是?就是啊,如果你看到了以上的结果了,我们这一讲的程序目的就已经达到了,你可以自豪地说:我会编程序了。上面的:void main()是什么呢?是函数,就是这么简单,我们下一讲会专门讲讲我们对函数的使用。,2020年7月25日星期六,2.函数的秘密,2.函数的秘密void main() 函数的定义和函数的调用。函数的定义其实很简单:函数类型函数名(函数参数列
5、表)函数体,2020年7月25日星期六,为了让大家请楚点,我将上面的函数改一改:void main(void)则:函数类型:void函数名:main函数参数:void函数体:无明白了吧?其实函数参数也可以是无(告诉你吧,其实void就是无的意思。)好了,其实这就是函数的定义,当然一个函数定义出来是要用的,我们现在就打算用一个函数,可怎么用呢?,2020年7月25日星期六,我们定义一个函数,可以定义在main函数之前,当然也可以定义在其他的地方,用时用 #include 命令给包含进来就行了,就是这么做的。如果你学过语言,一定还记得一个函数printf吧?在我们中,为了使得编译出来的文件足够小,
6、都不包括这些函数的定义了,所以你想要用这些函数就要包含一个文件: stdio.h了。怎么做呢?在main函数前加上 #include 就行了,然后就可以在main函数中使用这个函数,我们的程序就可以变成下面这样:#include void main() printf(“我跟教授学编程n”);,2020年7月25日星期六,发现出现上面的东西了吧?呵呵,我们告诉大家,下面的Press any key to continue是系统给你加进去的,为了让你看起来方便,如果你不信你可以到你文件存放目录下,找到目录,双击MyFirst.exe 文件,你看到什么了?黑框一闪,是吧?所以说我们对于下面那一行字,
7、翻译翻译过来说是“按任意键继续”,是让你看的,当然,我们以后学过DOS后我会告诉你另外一种运行“控制台应用程序”的方法的,我们这节课就单讲函数了。,2020年7月25日星期六,怎么使用函数,怎么使用函数呢?函数名(函数参数);当然,函数还有其他的使用方法,我们以后专门讲函数时讲对于我们这没有返回值的函数(void类型),我们就这样用就行了,当然有返回值我们不需要用到返回值,我们也可以这样用。那么我们就明白了上面那个函数:printf(我跟教授学编程n);是什么意思了?我们想要明白意思,就要知道某一函数的功能,printf函数就是在屏幕上打印出想打印的数据。那么显然我们要打印的就是那括号中的数据
8、了。,2020年7月25日星期六,可能又有疑问了,那么用到的“”又是什么意思呢?用到的“n”又是什么意思呢?好,我就先告诉你什么意思吧:是两个双引号,中央包括的一串东西我们叫它字符串,也就是说上面意思就是我们要打印出“我跟教授学编程n”这样的一串字符串(注意:当然不包括“”了)。那我们在打印出的字符串中并没有发现n啊?呵呵,那是转义字符,语言规定,跟在“”后面的一律是转义字符,也就是说它的意义变了,“n”就表示回车。原因很简单啊,回车字符没法用键盘往电脑上输啊,于是语言就巧妙地用这个转义字符将这个问题给解决了。,2020年7月25日星期六,大家可以将“n”删了,再运行程序看看,你一看就会明白了
9、,当然你也可以再加两个看看,学编程的原则就是多动手,眼看千遍不如手动一遍,真的,所以我要大家都有自己的计算机与自己的VC编程环境就是这个原因。可惜啊可惜,正因为这个转义字符,给计算计带来了来灭顶之灾。一些高明的程序员们就会巧妙地运用转义字符,编出一些病毒,让我们的计算机遭受一遍又一遍的不明的虐待。所以我们在学习电脑的初期就要竖立一个信念:坚决不用计算机与自己的技术做违法的事情,这也是我对你们的唯一要求吧。行了,这一节就到这儿了,下一节我会和大家专门谈一谈 printf这的函数的另外一些用途,以开始我们编程之路的远征。,2020年7月25日星期六,作业,作业:前一课的函数加上包含(#includ
10、e)语句,用printf语句输出以下语句:听教授讲课感觉真好。再输出以下图形:* * * * * * * * *(提示:合理地使用转义字符:n,可以一次使用printf,也可多次使用printf),2020年7月25日星期六,3.函数与类型,3.函数与类型我们上一个教学单元告诉了你一个函数printf,还记得吧?这个函数的功能还真是很强。为了学习这个函数,我们必须引进一个新的知识点:数据类型详细内容我会在“阅读材料”中给大家详细展开,我们这里先告诉大家两三种我们必须要知道的类型就行了:一:整型(int)什么叫整型呢?整数啊,呵呵。其实计算机里的数据是有一定范围的,不过如果我们暂时使用的只要不出
11、范围就没关系。它的定义为:数据类型参数表;,2020年7月25日星期六,什么意思呢?很简单啊,说明一个整数,参数表就是定义这些数字是整数罢了,看:int x,y,z;int a,b,c;大家还知道在中学学过的代数吧?(如果你不是中学生,也难怪你“看不懂”,真的,有些东西是需要一些文化基础的,所以如果你真的看不懂,你就先回去狠补基础吧),x,y,z可以是变量,a,b,c可以是常量,是不是?那么我们上面第一行int x,y,z;是什么意思呢?显然是定义了三个整型变量x,y,z。而第二行:int a,b,c呢?还是定义了三个整型变量,呵呵,不要被迷惑噢。计算机与代数还是有区别的啊。也就是说我们的数据
12、在计算机中是可以变的。,2020年7月25日星期六,语句,我们再来谈一谈语句吧。我们计算机中的语句每一句都以分号“;”结尾,注意噢,是西文的小写分号如果你用中文的“;”,那就错了。所以我们编程时,如果写到语句,一定要是西文状态。这一点很重要,因为如果你要弄错了,以后回来为程序找错的时候很难找到错误在哪里。(我们用下面的“(!);”这句话怎么看怎么是正确的,可惜你的VC根本就看不懂,知道吗?正确的应该是:printf(Good);原因就这么简单,我们不要为自己制造麻烦,没办法啊,谁让计算机一开始在外国出现呢?如果计算机是我们中国人发明的,就没有这些问题了,所以我们中国人要自强啊。,2020年7月
13、25日星期六,好了,那么下面几句大家看看什么意思?x=1;y=2;z=3;a=x+y;b=y+z;c=a+b;可能大家一看就明白了吧?就是这样,我们现在是用的VC的编译器,就上面的这几句,在昔日的计算机中是做不到能够识别这些东西的,我们只能将这些方便归功于相应的科学家们。,2020年7月25日星期六,二:字符型(char)char c;简单吧?怎么和整型的定义差不多啊?其实也就差不多,还是上面的定义:数据类型参数表;那么我们字符型数据有什么特点呢?特点就是,算了吧,我们下面讲到常量时再告诉你吧。 三:字符串型,看到上面的双引号括起来的部分了吗:Good大家好 /注意,双引号一定要用西文的双引号
14、,不要用中文的,否则的话,哼哼,2020年7月25日星期六,两条斜杠,什么意思呢?“/”那是注释,也就是说我们在计算机中有了两道斜杠,后面的所有部分计算机都不理了,就这么简单,所以说这部分我们可以随便写什么东西在这里。那么这部分什么作用呢?这部分是给人看的,所以我们在程序中有一大段程序,实现某一功能,计算机当然执行不是注释的部分了,而注释部分我们可以在里面写上让人们一看就知道这一段程序什么作用的东西举个例子吧,下面一段程序你可能读不懂,但你一看注释是不是就明白了这段程序的功能了呢?int max(int a,int b) /取最大值的函数,此段函数的功能为:输入两个函数a和b,求出其中较大的那
15、个数。if(ab)return a;else return b;,2020年7月25日星期六,常量,如果你没有学过C语言或C+语言,上面的函数你显然看不懂,但一看后面的注释,你不就全明白了?程序部分,我们随着学习的深入,我们会明白,但这一段函数我们可以直接复制到中,我们马上将用这个函数个一个程序给大家看看。常量:什么是常量呢?很简单啊:1,2,3,4,5 0,-1,-2,-3,-4,-5这就是整型常量啊字符串常量就是我们上面所说的: Good 大家好,2020年7月25日星期六,而字符型常量呢?单引号括起来的, 如:a,b,c.当然这就表示字母a,b,c的常量,一定要用单引号括起来啊,原因很简
16、单,不然就与变量弄混了,请看下面:x,y,z: 变量x,y,z:常量明白了吧?那么下段程序就会很明白了: char c; c=a;这就是让变量c得到常量a的值。,2020年7月25日星期六,注意:下面的是错的。我,爱,名,人,机,则都是错的,什么原因呢?还因为电脑是人家西方人发明的,没办法,中名只能做“字符串”,不能做字符。所以我们上面用的我跟教授学编程为什么能用了,因为这是字符串啊。 行了,这下来谈谈printf吧。大家还记得有转义字符吧?我再告诉大家一个字符: %从我的看法来说,它也是一个转义字符,只不过他的意义是根据后面符代的参数来变的。大家试试就明白了,如果不明白,再发帖子来问我。%d
17、:将后面参数的意义转换成整数%c:将后面参数的意义转换为字符,2020年7月25日星期六,顺便说一下,其实在VC中字符与整型是不分的,举个例子吧:char c;c=s;printf(c=%d,c=%cn,c,c);大家将上面程序弄到电脑中试试看,发现了什么?我们这里要告诉大家的s的AscII码为:115有些东西需要仔细地去体会。好了,我们这再调用一个自己做的函数吧:(对了,上面的程序一定要放要main主函数中,而用到printf必须要包含头文件stdio.h啊),2020年7月25日星期六,#include int max(int a,int b) /取最大值的函数,此段函数的功能为:输入两个
18、函数a和b,求出其中较大的那个数。if(ab)return a;elsereturn b;void main()int a,b,c;a=23;b=45; /大家可以改动这两个数,看看运行的结果有什么变化,具体细节,我们会在以后专门的函数一章讲解。c=max(a,b);printf(你输入的比较大的那个数为:%dn,c);,2020年7月25日星期六,大家将上面的一个程序复制到VC中,运行运行看看,再改变改变其中a与b的值,看结果会出现什么样的不同。至于max函数中一些语句的意义,随着我们教程的不断深入,相信大家会明白的。大家知道了吧,如果你再说“看不懂”,不懂也不要紧,关键是“玩”嘛。我们做程
19、序,其实就是一种“玩”的过程,你们谁打游戏的一开始就知道这个游戏的整个流程了?还不都是摸索出来的?,2020年7月25日星期六,用“玩游戏”的感觉 “玩程序”,我们要用“玩游戏”的感觉“玩程序”。说实在的,上面那个函数,就是不明白,只需要我知道他的功能是什么了,拿过来用呗。这就是编程,说实话,你真正搞编程,有几行代码是你自己敲进去的,不就是这儿找个我想要的程序段,那找个我没能实现的函数,拿来“凑”出一个软件的吗?,2020年7月25日星期六,4.条件的判断,4.条件的判断,2020年7月25日星期六,#include int max(int a,int b) /取最大值的函数,此段函数的功能为
20、:输入两个函数a和b,求出其中较大的那个数。if(ab)return a;elsereturn b;void main()int a,b,c;a=23;b=45; /大家可以改动这两个数,看看运行的结果有什么变化,具体细节,我们会在以后专门的函数一章讲解。c=max(a,b);printf(你输入的比较大的那个数为:%dn,c);,2020年7月25日星期六,我们以前知道,函数的定义为:函数类型函数名(参数列表)函数体是吧?我们这节就来讨论两个内容:一个内容就是函数的类型:当我们以前使用void类型时,我告诉过你,这就表示没有类型,或者应该说没有返回参数。,2020年7月25日星期六,那么现在
21、要返回参数了,怎么返回呢?用下面关键字:return 返回值;是啊,我们举个例子吧:#include int GetThree(void)return 3; void main()printf(你的函数得到了一个数:%dn,GetThree();,2020年7月25日星期六,对了,对于变量的命名来说,是随便你怎么命名的,只要不和系统犯冲就行(所谓犯冲,就是不让系统引起误解,好多书规定了若干的规则,其实我认为没必要,举个例子吧,我们知道数字3为常量,那肯定不能当变量或函数名,而int当然也不能当参数名。你想想你能看懂你这是定义一个整型还是定义一个变量呢?连你都看不懂,怎么能使计算机懂呢?是吧。就
22、是这么简单,不犯冲就行。当然,如果你有意犯冲,计算机是不承认你的,肯定报错,而我们又不考试,也不会找几个让你去判断判断,是吧?如果在计算机上出现这种情况改改就行了,但随着我们学习的深入,这种错误几乎可以杜绝,因为我们经常编程就会习惯一些变量,如:x,y,z表示变量,pi表示圆周率,当然我们以后会在讲到深入的阶段教大家一些基本的规则的,这些都是计算机程序员的经验总结,让人一看就明白意思就行了。大家还记得上面的max吧?一看不就知道这是最大吗?那么这个函数功能就是求最大值就行了。如果你定义一个int min(int a,int b)函数去求最大值,就一定会让人困惑不解是吧?就是,我们编程的过程就是
23、在不断地积累经验,而你试图背道而驰,就必然会出现种种难以预料的情况,然而你想背道而驰,就即使将规则讲给你听,你也会出错,信吗?)。,2020年7月25日星期六,呵呵,这个函数的功能就是返回一个3。其实说实话,这个函数是一点用都没有,但很能说明问题。大家看到了吗?参数列表为:void(可省略),所以说我们下面GetThree()的括号中什么参数都没有,也就是说没必要代入参数,但代入了参数就错了,知道吗?当然,虽然不要参数,但括号是不能省的。这就是说,括号告诉我们这是一个函数,而不是一个变量。,2020年7月25日星期六,行了,再告诉大家一个秘密,在C+中,我们可以定义多个同名函数(当然还是不要冲
24、突,举例后再仔细道来)#include int max(void)printf(小样,你想骗我啊,不给我数字,我怎么判断大小啊?算了吧,看你可怜,送你个圆满吧!n);return 100;/注:只要函数类型不是void必须要有return 返回一个值int max(int a)printf(嗯,耍我,一个叫我判断大小,你行吗?算了,还给你吧!n);return a;int max(int a,int b)printf(嗯,这我还有点激情,给你判断一下吧,接着喽n);if (ab)return a;elsereturn b;,2020年7月25日星期六,int max(int a,int b,i
25、nt c)printf(乖乖隆地咚,想累死我啊?哎,谁让我是计算机呢?n);if(ab)b=a;if(bc)c=b;return c;void main()/注意我下面要干啥了?printf(我将输出没有参数max函数:n%dn,max();printf(我再输出带一个参数的max(23)=%dn,max(23);printf(二个参数比较了,看44与39哪个大吧:max(44,39)=%dn,max(44,39);printf(真能比较三个数的大小吗?不太信,来个简单的吧,max(34,556,712)=%dn,max(34,556,712);,2020年7月25日星期六,呵呵,厉害吧,同样
26、是max函数,输出了不尽相同的结果。可以处理各种问题,舒服啊。当然了,我们用的是C+,如果我们用C语言,就不能这样用了,这样用就报错了,在C中,一个函数名只能定义一个函数,而C+中只要不引起冲突,呵呵,你想定义多少随便你。你当然可以再定义一个四个数比较大小的max函数,虽然没那个必要,但在C+中是允许的。上面程序是长了点,但我们也要学会读长程序啊是吧?我们一个一个地来读一读吧。,2020年7月25日星期六,int max(void)printf(小样,你想骗我啊,不给我数字,我怎么判断大小啊?算了吧,看你可怜,送你个圆满吧!n);return 100;/注:只要函数类型不是void必须要有re
27、turn 返回一个值这一个函数显然没说的,第一句只是打出一段话,(当然,如果你做一个游戏,这段话可以做得很有意义,有些人总想做游戏,其实这学着编程不就来了吗?是不是?再看第二个:int max(int a)printf(嗯,耍我,一个叫我判断大小,你行吗?算了,还给你吧!n);return a;和第一个如出一辙,但返回的不是一个常量,而是一个变量(注意哟,在数学中,a一般是常量,但在这里,只要是变量定义,就是变量哟。),2020年7月25日星期六,if (ab)return a;elsereturn b; 这一段程序难点,我们仔细分析一下:这就是我们计算机中常用的判断语句。可能你一看就懂,我们
28、选翻译成中文吧:如果ab返回a;否则返回b;,2020年7月25日星期六,怎么样?它的规则就是:if(条件)语句1;else语句2;,2020年7月25日星期六,我们着一个简单的解释啊,如果条件满足的话,执行语句1,否则执行语句2;我们看,当比较44与39时,44传给a,39传给b。(注:按照参数列表的顺序向这里传,这里的a,b我们叫做形参形式参数)那么条件就为:ab 即4439,44当然大于39啦,所以满足条件(即执行语句1:返回a值,44)那么如果我们传递的是11和22呢?那么11传给a,22传给b,那么ab即1122这显然不满足(即条件为假,则执行语句2注:这里的语句1就跳过去不执行了于
29、是返回了b,即返回了22,不还是返回较大的那个数么?所以这里不管a与b哪个大,都是返回较大的那个数,这就是我们求最大值函数的到整个设计过程。,2020年7月25日星期六,int max(int a,int b)if(ab)return a;elsereturn b;所以这一部分程序很经典,我们把这种经典的程序断称之为“算法”,呵呵,可能与某些教科书不上符哟,但的确就是那么回事。所以我们称以上的为求最大值的算法。我们以后还会遇到种种算法,它应该成为我们脑海中的一点一滴的经验积累,以便在我们做软件的时候信手拈来。,2020年7月25日星期六,这里有经常打游戏的朋友吧,游戏中不也是要积累经验值吗?我
30、们这儿当然也是在不断地积累着我们编程的经验值,经验积累得越多,我们编程的能力就越强。C是我们的装备,算法是我们的经验,又有装备,又有经验,想想我们马上就要升级了,呵呵,有信心吧?好了,继续看第四个函数:if(ab)b=a;if(bc)c=b;return c;,2020年7月25日星期六,这里也是求最大值吗?是了,但这样一来b与c的值不就有可能被改变了吗?(具体算法大家自己分析)是了,这里就又告诉我们一个新的知识点:函数中传过去的是值,而不是参数本身。大家做做程序,再仔细地体会体会,有些东西说真的是只可意会,不可言传啊。作业:将上面的程序做进计算机,看看运行结果,改变数字看看变化,多动手,这是
31、编程的唯一经验。掌握求最大值的算法,熟悉算法的概念。依样画葫芦,做一个求两个数最小值的算法。理解if语句的含义,能够正确地运用if()else语句。看下面的程序段,上机运行,然后思考为什么会出现以下结果:,2020年7月25日星期六,#include void change(int a,int b)printf( -函数段开始-n);printf(改变a,b值前,a=%d,b=%dn,a,b);a=35;b=45;printf(改变a,b值后,a=%d,b=%dn,a,b);printf( =函数段结束=n);,2020年7月25日星期六,void main()printf(-主程序开始-n)
32、;int a,b;a=20;b=10;printf(进入函数之前,a=%d,b=%dn,a,b);printf(进入函数中.n);change(a,b);printf(退出函数后.n);printf(进入函数之后,a=%d,b=%d -请看这里,思考这是为什么?n,a,b);printf(=主程序结束=n);将以上程序输进电脑,或粘贴进电脑,运行看看会出现什么结果,思考看看,能否知道出现这种结果的原因。,2020年7月25日星期六,5.程序的流程今天星期六,本来真想休息休息(说实话,教授累了)可每天自己给自己下扣,哎,没办法。原来想让大家一环一环跟上,没想到我自己的些停不下来了(上了贼船了都。
33、注:如果你真有这种感觉,那真恭喜你,你的编程已经入门了。)我们看看上节布置的一个作业:(注:为了解说方便,我在前面加上行号啊,大家做程序时不需要行号),2020年7月25日星期六,0 #include 1 void change(int a,int b)2 3printf( -函数段开始-n);4printf(改变a,b值前,a=%d,b=%dn,a,b);5a=35;6b=45;7printf(改变a,b值后,a=%d,b=%dn,a,b);8printf( =函数段结束=n);9 ,2020年7月25日星期六,10 void main()11 12printf(-主程序开始-n);13in
34、t a,b;14a=20;15b=10;16printf(进入函数之前,a=%d,b=%dn,a,b);17printf(进入函数中.n);18change(a,b);19printf(退出函数后.n);20printf(进入函数之后,a=%d,b=%d -请看这里,思考这是为什么?n,a,b);21printf(=主程序结束=n);22 ,2020年7月25日星期六,实说话,行号是玩“小霸王学习机”时候学上的,那时候的编程,每句前面都要加上行号,你说怪了,不繁,你觉得奇也不奇(注:当然不奇了,那里候还没接触到不带行号的语言呢。)这里我说一下,大家编程时,一定不要带行号(呵呵,我将上面程序复制
35、到中运行了,运行不起来,不过原来我们小霸王编程时就简单了,插入一行只需要写两行间的一个行号就行了,连上下左右键都没必要打,呵呵)。我们先看第0句:包含一个文件:printf必须包含的文件下面的语句,根据我们的规定,先进入main函数:即先执行第10句,2020年7月25日星期六,然后逐行向下,直到第18句执行一个函数,调用函数,转入第1句执行,一直到第九句(注,其实9 并不是一句,而仅仅是一括号而已,它是不执行的,一直到第8句,然后返回第19句继续向下执行,输出后面的内容。事实就是这样,但为什么a与b的值没有改变呢?这就是我们所说的值传递,即原来在主函数中,a的值为20,b的值为10,而在传递
36、参数时,仅仅将20与10这两个数字的值传递给了参数,而本身与函数中的a和b没有任何的关系。即:在函数中定义的a与b和在主函数(main函数)中定义的a和b一点关系都没有,这就涉及到了我们“变量的作用域”的问题了。我们以后在真正讲函数时再给大家交待明白,这里你只要知道,函数中对主函数的值的改变其实是不影响主函数的。所以我们上面可以使用以下的程序求三个数的最大值,就是这个原因:,2020年7月25日星期六,int max(int a,int b,int c)if(ab)b=a;if(bc)c=b;return c;,2020年7月25日星期六,程序的流程,什么叫程序的流程呢?就是程序的流动方向,我
37、们上面不就是一句句向下执行的吗?这叫做顺序执行(当然在调用函数时出现了跳转。那与我们程序的流程所讨论的问题没有关系。我们程序一共有三种流程:顺序结构,选择结构与循环结构。科学家们发现,电脑中只要有这三种结构,我们脑海中的任何思维都可以变成程序而表达出来了。我们学过了顺序结构,如上面第一个程序。我们也初窥了选择结构:如if()else语句。关于循环结构,我们放到以后专题再讲。,2020年7月25日星期六,这里讲什么呢?啷个啷,啷个啷,表一表好汉武松武二郎呵呵告诉你一个连你都不知道的秘密,如果你真的一步一步跟着我跟到了这里,你至少学会了C+中的一个重要的概念:“多态”。我讲这些的目的是什么呢?让大
38、家分清C与C+,因为目前我们还在名人中,而不是独立的论坛,何况大家都冲着名人来的,如果我一旦才教大家那么多内容,没想到做名人错误百出,我不就名声扫地了吗?什么是多态呢?就是上一讲我们讲到的多个同名函数,那就叫多态。由于名人只支持C语言编程(你知道我以前在做教程时,告诉大家。函数名后一定要加“.c”的吗?这就是喽,假如你在名人中定义了两个相同名称的函数,如果你不明白这个道理,那你找错误都找不到,不知什么地方出问题了,是不是?),2020年7月25日星期六,程序的调试,大家点那小手一样的图标,可在当前行设计断点,而点边上一个按钮(我们称之为调试按钮,可进入调试状态)所谓调试状态,就是程序的执行是一
39、步一步执行的,并且有一些工具,可以让我们看目前程序的执行状况。大家想想大括号,看看那些图标,自己想象它们会有什么意思,看你能不能想出来(注:其实告诉大家可能很简单,但我们注意,我们以后还要搞程序,我们能不能做个软件,叫别人看到相应的图标就能猜出其中的功能来呢?这猜功能与做功能应该是软件制作人员的基本素质是不是?)大家每个图标点一点,运行一运行,看看有什么东西,当然,其实的变量的值是怎么变化的一切的一切,大家去实践就行了。自己动手,丰衣足食。,2020年7月25日星期六,当然,不明白的地方,可以问一问我,当然,如果叫你们一下子学会很多程序的调试过程,可能不太现实,毕竟我们有好多概念还没讲,所以说
40、,我们先来“玩”程序,玩不懂的地方放那儿,不要紧。学习就是这样,用电脑就是这样。即使出了问题了,我们也不怕,相信一点,电脑软件是用不坏的,所以大胆地玩。当然,遇到问题,先自己分析,尽量解决,多思考,勤动手。出现错误与失误并不可怕,每处理完一个错误,不是经验值增加那么简单,绝对是升了级了,呵呵。,2020年7月25日星期六,6.我调我自己 今天星期天,不讲新内容,看一个旧的程序:#include int max(int a,int b) if(ab)return a;elsereturn b;void main()int a,b,c;a=23;b=45;c=max(a,b);printf(你输入
41、的比较大的那个数为:%dn,c);,2020年7月25日星期六,如果你仔细看过以前的教程并且一个一个地上机试做了,对于上面的程序,你一定非常熟悉,不就是一个求最大值的程序吗?对,我下面要来改个求最小值的程序,(以前作业布置过,不知道大家做得怎么样?反正没有交作业,我也不知道。)#include void main()int a,b,c;a=23;b=45;c=min(a,b);printf(你输入的比较小的那个数为:%dn,c);int min(int a,int b) if(ab)return a;elsereturn b;怎么样?上机运行看看,运行不起来了,是不?出现了什么问题了?噢,我们
42、的求最小值的函数调到后面来了,所以嘛,这个主函数(main)就找不到它了,呵呵。当然,如果不让你头动,放个东西在你身后,你也找不到,是吧?所以和你提到这个人,你理所当然地不认识了。,2020年7月25日星期六,好了,那怎么处理这种情况呢?如果你有好的办法,那当然就是在前面放面“镜子”,是吧?下面我们就在前面加上一个“镜子”再试试看:#include int min(int a,int b);void main()int a,b,c;a=23;b=45;c=min(a,b);printf(你输入的比较小的那个数为:%dn,c);int min(int a,int b) if(ab)return
43、a;elsereturn b;,2020年7月25日星期六,大家看前三句:#include int min(int a,int b);void main()这里的 int min(int a,int b); 就是后面min函数的小镜子了。其实就这么简单,我不说你也会知道它人形式,其实就是后面函数体部分改为分号“;”就行了。即:函数类型函数名(参数列表);就这么简单,相信你也会写出这种形式。可能(一定会)有人不服,教授好无聊好无聊啊,那你就将定义放前面不就行了呢?为什么还要多此一举,放面小镜子呢(注:这面小镜子,我们叫它做“函数原形”)当然不能让你不服,看别人当然行了,如果你要看你自己呢?(呜,
44、大家者耷拉下脑袋,呵呵,教授好兴奋啊)咳!咳咳咳!嗯!啊!噢!是这样嘀,冒号(升八度)!如果你要看见自己,你必须照镜子,如果你不照镜子,你必定不能看见自己,所以你要看见自己,你就得必须有镜子。(有道理吧?啊!反正我不知道道理在哪儿),2020年7月25日星期六,行了,其实说实话,如果你编程序的话,让别人看,别人还愿意先看到主函数的,因为那样直接而且方便啊。你想想,一进入你的程序,就需要直接看结尾(因为没有函数原型,主函数肯定在结尾),然后再往上翻,这与人们的习惯不符啊,再说了,正如前面所说的,我们的程序真的能在自已的函数中调用自己,那时就必须要用到“镜子”)下面,我们看个例子吧。#includ
45、e void print(int n); /注意,在函数中不能用printf作为函数名,因为那样就与我们void print(int n) /语言中的关键字重名了,所以我以前说过,有一个不冲突的原则。printf(现在我是在调用自己的第%d次调用n,n);/大家可以将这一个语句与下面一个语句交换,看看有什么情况发生?if(n!=0)print(n-1);void main()print(10);怎么样?看到了什么?,2020年7月25日星期六,我们将这种调用自己的函数的调用方式叫做“递归调用”。递归调用最要注意的就是要避免“死循环”。什么?这里没用到循环啊?其实不错,你拿两个镜子平行地放在一起
46、,中央放一物体,你会看到什么呢?无数个物体,是吧?不错,但这种情况在我们电脑中不能发生,如果一旦发生,你多大的硬盘,你有多少的内存,都不够它使的。幸好我们现在的Windows系统是按任务运行程序的,我们可以试试这个程序,你不想运行就将Dos模式的黑框关掉就行了。行,我们将条件判断(if(n!=0))给拿走:#include void print(int n); /注意,在函数中不能用printf作为函数名,因为那样就与我们void print(int n) /语言中的关键字重名了,所以我以前说过,有一个不冲突的原则。printf(现在我是在调用自己的第%d次调用n,n);/大家可以将这一个语句
47、与下面一个语句交换,看看有什么情况发生?print(n-1);/if(n!=0)print(n-1);这里的条件判断的地方被我们给注释掉了。void main()print(10);,2020年7月25日星期六,大家明白为什么不能这样做的原因了吧?对了,上面的“!=”什么意思呢?这是“不等于”符号,电脑中不等号没法打,所以美国佬很聪明,用两个符号来代替。行了,这种递归调用有什么用呢?给大家做个特经典的程序吧,求阶乘。阶乘,就是n!=123n举个例子吧3!=123=6明白了吧?(注:由于阶乘的运算数字会迅速变大,所以我们做这个程序时,数字不要用的太大,以免出现情况,当然你可以用大数试试,有两种情
48、况,一种可能电脑出现一些怪怪的数字,还有一种情况就是电脑会报错。这是因为在我们计算机中的数与数学中的数不同,计算机中的数是有最大限制的,假如int类型的最大限制为100那么大于100的数字电脑就会拒绝处理,或者干脆给你一个假信息呵呵,电脑也会耍人啊),2020年7月25日星期六,#include int fun(int n); /这就是“小镜子”int fun(int n) /这是你自己if(n!=0) /这里的“!=”什么意思大家懂了吧?不等于return n*fun(n-1);elsereturn 1;void main()printf(10!=%dn,fun(10);这又是一个经典的算法
49、。,2020年7月25日星期六,当然,递归的算法优点是简单,它符合人们正常的思维,但一不小心,就会限入死循环,这是递归编程的唯一缺憾。那么上面的运算是怎么样实现的呢?我们来做一个设想:我们将阶乘做另一个定义吧:即:n!=n*(n-1)!注意了,大家在程序中看到“*”了吧?在计算机中,用它代表乘运算,原因很简单,用它来表示乘法不容易与英文字符“x”搞混。因为我们程序给计算机运行的同时,有时也是需要给人看的而如果出现了下面的运算:x*y如果用小叉来代表则为:xy你看中央那一个像不像大写的X?你怎么识别呢?我们再看看那个定义吧,它是怎么来的呢?n!=1*2*3*.*n=(1*2*3*.*n-1)*n
50、=n*(1*2*3*.*n-1)=n*(n-1)!,2020年7月25日星期六,即n!=n*(n-1)!当然这时候要定义一个数的阶乘:即:0!=1;将上面零的阶乘作为阶乘运算的条件,你瞧瞧,多么符合人们的思维啊?要求10!,就需要知道9!要知道9!,就需要知道8!要知道1!,就需要知道0!因为0!=1所以1!=10!=11=1所以2!=21!=21=2所以3!=32!=32=6所以4!=43!=46=24所以10!=3628800,2020年7月25日星期六,就是这样,你看,10的阶乘就够大的了是不?如果你想求再大的数,将阶乘函数前面的int换成long我们下面再来给大家将程序完善一下,做出整
51、个过程#include long fun(int n); /注意,我们将函数的类型换成了long了,这个long fun(int n)/是长整型,显然它的表示长度肯定比int长了long i;if(n!=0) /我们这里用了“花括号”,这是一个复合语句,关于复合语句,我们以后再讲i=fun(n-1);printf(要求%d!,则必须求%d!=%dn,n,n-1,i);return n*i; /这里是复合语句的结束。elsereturn 1;void main()printf(20!=%dn,fun(20);,2020年7月25日星期六,怎么样?上去做看看,发现负数了是吧?呵呵,没说嘛,计算机耍
52、我们,快去拿锤子把你的电脑给砸了,呵呵。这些原因,我们以后真正讲到数据类型时,给大家详细分析,反正我的电脑做到12!没有问题,大于12,电脑就呵呵,开始耍人了。行了,大家也可以自己想想有什么想法,能用递归的方式做成程序,挺好玩的。这节就讲到这儿吧,我们初期的函数之旅就些结束了,我们以后要真正地深入编程,好好地探究一番编程的奥秘,如果大家还有耐心,我们会将大家一步步带入程序的天堂,让大家体会将自己的想法转换为程序的乐趣。,2020年7月25日星期六,7.语句与表达式上节课我们曾经看过一个程序,我们在注释的时候我们说过:这叫复合语句,不知大家还曾记得否?. /我们这里用了“花括号”,这是一个复合语
53、句,关于复合语句,我们以后再讲i=fun(n-1);printf(要求%d!,则必须求%d!=%dn,n,n-1,i);return n*i; /这里是复合语句的结束。.没办法,逼着我们讲些理论了。大家还记得我们对于if()else的定义吗?if(条件)语句1else语句2,2020年7月25日星期六,我们这里的语句就是指一个语句,而如果我们要放多个语句,怎么办呢?那只好用我们这节讲的“复合语句”了。什么叫“复合语句”呢?其实就是一串语句,用花括号括起来,如上面的三个语句,用花括号一括,就可以在程序中看着一条语句使了,这就是我们的复合语句。复合语句仅仅是告诉我们,这是一个整体,要执行一块而执行
54、,要不执行我们都不执行,不求同年同月同日生,但愿同年同月同日死,唉,就是这么一回事儿。我们还来看我们以前的程序:if(n!=0)i=fun(n-1);printf(要求%d!,则必须求%d!=%dn,n,n-1,i);return n*i;elseprintf(我是else部分的语句);我们知道此时,如果if语句的条件不成立,显然执行else后面的语句,而如果if成立呢?编译器一看到一个花括号,嗯,这儿句还真够哥们义气的,同时执行了吧,于是乎,连带着那三句就执行了。于是,我们脑袋中想像的功能就实现了。假如我们将花括号拿掉,会出现什么情况呢?,2020年7月25日星期六,if(n!=0)i=fu
55、n(n-1);printf(要求%d!,则必须求%d!=%dn,n,n-1,i);elseprintf(我是else部分的语句);看上面的语句,我们人看着可能没毛病,但计算机就不同了,(计算机绝对是笨蛋,聪明的傻瓜),她看到了if,如果条件满足,好,执行了下一句。执行完了后,一看,后面没有语句了,于是乎,这一个if语句就结果了。以后她再看到else语句,她会莫名其妙,咦,这儿是谁丢垃圾?不讲卫生,拿走。于是给出了一句(报错):else语句没有相应的if语句与之配对(当然,这是中文版的报错罢了)。你可能还会在纳闷,这是怎么回事呢?前面明明有if语句嘛。坏就坏在if语句的定义不仅仅是上面的一种,还
56、有一种语句:if(条件)语句;,2020年7月25日星期六,什么意思?就是如果条件成立,后执行后面语句,如果不成立,就不执行。就是这么回事。原来if要不要else无所谓,他习惯于单身生活。哼if家族真不地道,还会重婚呢,你看,下面语句也成立:if(条件1)语句1;else if(条件2)语句2;else if(条件3)语句3;.else if(条件n-1)语句n-1;else语句n;,2020年7月25日星期六,怎么会这样?方便呗。看一个例子:例,给一个学生的成绩,判断其等级:#include void main()int i=86;if(i60)printf(又挂红灯啦,呵呵n);else
57、if(i70) /因为i60我们在前面判断过了,如果小于60此句向下根本不执行,所以我们没必要在些再作判断,以下同理printf(哇,终于过关了,不容易啊n);else if(i80)printf(不赖嘛,还真说得过去!n);else if(i90)printf(哇,你真优秀,太厉害了。n);elseprintf(太棒了,你是我的偶像,能给我签名吗?n);怎么样?其实这由于这种像多路开关的判断似乎很普遍,所以C语言专门为我们设计了一个多路开关的语句:switch语句:我们下面以5分制做这一个程序啊,假设1分与2分设为不及格,3分及格,4分良好,5分优秀,则程序如下:,2020年7月25日星期六
58、,#include void main()int i=2;switch(i)/注意,这我又是一个复合语句case 0: /我们零分也考虑在内case 1:case 2:printf(羞羞噢,不及格n);case 3:printf(唉!终于及格了n);case 4:printf(嗯,还算说得过去吧n);case 5:printf(好,不错,真优秀n);default:printf(想骗我啊,你输入的数据无效!n);,2020年7月25日星期六,大家去运行看看,这就纳闷了,怎么全给打出来了呢?(注:可能一定会有人说“看不懂,你当然看不懂啦,你没上机,你根本不知道出来的结果,你能纳闷吗?你能懂吗?懂
59、了,才怪?)我们先给大家解释解释这个case什么意思还要解释?谁不知道啊,运行结果都出来了。不错,就是判断switch后面的数与case后面的数是否相等,所以这种语句也叫switch()case语句当然,default:的意思就是不符合上面任何一个,如果你改为4分,再看,是不是在4以前的打印语句都没执行,而直接执行后面的呢?那我们也不能完全将后面的所有东西打印出来,也没有必要啊?是不是?当然,于是,人们又引进了一个新的关键字:break;知道我们以前为什么要用复合语句了吧?break;是退出复合语句的执行。我们看前面因为是顺序执行的,所以我们在case中没有必要用复合语句。其实就是这么回事。当然,为什么一定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 非股权参与的代理销售合同合同二篇
- 交通设施验收合同模板
- 宾馆采购规章制度
- 办公物品及设备采购制度
- 医院中药房采购管理制度
- 学生三包采购制度
- 汽修厂采购员管理制度
- 医院信息科采购项目制度
- 山西省晋城市2026届高三下学期第一次模拟考试生物试卷(含答案)
- 2025-2026学年山东省济宁市汶上县九年级(上)期末历史试卷(含答案)
- JJF(陕) 134-2025 小麦硬度指数测定仪校准规范
- 佳能相机PowerShot SX50HS中文说明书
- 4农业现代化背景下2025年智慧农业大数据平台建设成本分析
- 高中地理研究性学习报告范文
- 恶性肿瘤伤口护理
- 2025年重庆市中考道德与法治真题(原卷版)
- 2025年高考数学全国一卷试题真题及答案详解(精校打印)
- GB/T 42230-2022钢板卷道路运输捆绑固定要求
- 2024年河北省高考政治试卷(真题+答案)
- 医院人才评价管理制度
- 浙江金峨生态建设有限公司介绍企业发展分析报告
评论
0/150
提交评论