




已阅读5页,还剩200页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计基础,前言,本电子讲稿是在近几年作者为计算机专业、计算机第二专业授课讲稿的基础上,为2000级计算机科学与技术(本科)(80学时)、计算机应用与维护及计算机网络专业(60学时)授课而开发的。在开发中借鉴了作者以前开发的QUICKBASIC程序设计及计算机应用基础电子讲稿的经验。在2000级授课完成后,对讲稿进行了修改。为使该讲稿适合99信息试点班(100学时)的教学,又根据教学要求,对讲稿的内容进行了一次较大规模的增加。此次用该讲稿给2001级计算机科学与技术班(80学时)授课时,又结合本人主持的教育部教学科研课题,按照现代新的认知教学理论建构主义的教学理论,对讲稿进行了第三次大规模的修改。本次修改,主要特色如下:,1根据人们学习程序语言的规律,讲稿全部以实例为主线。以这种方式教学,首先介绍实际问题,接着介绍问题的解决办法,也就是算法和数据结构,然后用伪代码将问题描述出来,最后将伪代码翻译成C语言程序(当然也可以是其它语言的程序)。对于程序中碰到的新的语句或函数,确改变了以往的程序语言教学的一般做法:一开始,先介绍语句或函数,然后介绍用法(语法),再用一个小例子说明该语句或函数的使用,最后,罗列一大堆有关该语句或函数的若干细节。这样的教学方法,对学生参加某些考试是很有帮助的。但要让学生在学完语言课程后编制一个稍复杂的程序,往往就无从下手。这样学习,很多学生学了一些语法或规律,但弄不明白为什么要这样。以实例为主线,学生在学习程序之后,对不懂的语法现象再学习,就有了感性认识,也比较容易接受;,2利用超级链接功能模拟人在学习时的联想,使得讲稿可以从任何一部分进入,无需从头开始学习;,4在以往的教材中,例题大多是为了说明语法而设计的,因此,各例题之间少有联系。在本电子讲稿中,大多数的例题之间是有联系的,单独使用时可以用来说明语言的语法现象,到课程结束时,这些例题又可以组合成一个较大的程序,以帮助学生进行程序设计训练。,3在教学中,我们发现,学生往往能读懂一些简单的程序,但对于一些简单的问题,要自己进行程序设计比较困难。讲稿中的例题,除少量较容易的例题外,全部给予了详细的算法分析,改变了以往教材或教学中的给出问题,然后给出程序,再给学生讲解程序。本讲稿以C程序作为基础,但对于其它高级语言的学习,也有参考价值。,第1章C语言简介,第2章顺序程序设计,第3章分支结构,第4章循环结构,第8章结构与共用体,第11章位运算,第10章Cwindows程序设计简介,第7章指针,第5章函数,第9章文件,第6章数组,第一章C语言简介,一.程序的概念,程序就是一系列的操作步骤,计算机程序就是由人事先规定的计算机完成某项工作的操作步骤。每一步骤的具体内容由计算机能够理解的指令来描述,这些指令告诉计算机“做什么”和“怎样做”。,二.程序设计语言的概念,编写计算机程序所使用的语言称为程序设计语言。,四高级程序设计语言(简称高级语言),高级语言是相对低级语言而言的。低级语言是计算机能直接识别的语言(机器语言)或符号化的机器语言(汇编语言),高级语言是一种通用的,面向用户的各类需要,与特定的机器相分离,并遵循一定的严格规定与形式的语言,其语言格式接近于自然语言或接近于数学函数形式。,三计算机语言发展过程,机器语言,汇编语言,高级语言,BASIC,QUICKBASIC,FORTRAN,COBOL,PASCAL,C,LISP,PROLOG,ADA,PL/1,VISUALBASIC,C+,五常用高级语言,六过程式语言,面向解题过程,告诉计算机“怎么做”,这种语言称为过程式语言。面向处理对象,告诉计算机“做什么”而不必指出“怎么做”,计算机就能完成所要求的任务.这种语言称为非过程式语言.,BASIC,QUICKBASIC,FORTRAN,PASCAL,C等均为过程式语言,SQL查询语言,SMALLTALK等均为非过程式语言.,七解释型与编译型语言,计算机不能直接识别高级语言,要让计算机能执行高级语言,需要将高级语言翻译成等价的机器语言,这种翻译有两种形式:,(1)边翻译边执行;(2)全部翻译完成后才执行。,前一种方式称为解释方式,后一种称为编译方式.,C,FORTRAN,PASCAL等为编译型语言BASIC,java等为解释型语言QUICKBASIC有解释和编译两种方式.,用高级语言写成的程序称为源程序(或源代码)翻译成的机器语言称为目标程序(目标代码),八C语言的特点,1语言简单、紧凑、使用方便、灵活。C语言一共只有32个关键字,9种控制语句,大小写区别;,2运算符丰富共有34种运算符,表达式类型多样化,使用灵活;,3数据结构丰富,具有现代化的语言的各种结构;,4具有结构化的控制语句,用函数作为程序模块,以实现程序的模块化,是结构化的理想语言,符合现代编程风格的要求;,7生成的目标代码质量高,一般只比汇编语言生成的目标代码效率低10%20%;,8用C语言编写的程序可移植性好(与汇编语言相比)。,6C语言允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件进行操作,能实现汇编语言的大部分功能;,5语法限制不太严格,程序设计自由度大。例如,对数组下标越界不作检查,对变量的类型使用比较灵活。如整型量与字符型数据及逻辑型数据可通用。,九C语言学习中要注意的问题及学习方法,1C语言关键字少,而且与其它高级语言类似,掌握标准C并不难。,2C语言是基于函数的语言,C语言的大部分功能需要调用库函数去实现。,DOS下的C编译器TurboC2.0大约有440个函数,BC+2.0大约有500多个函数,VC+除了标准的C运行库之及C语言扩展外,还有600多个WindowsAPI,以及VC+中的类库,Linux的C也有很多扩展。,要掌握好库函数是不太容易的。,3C语言可以直接对硬件进行操作,因此,对计算机的硬件要有一定的了解,否则,就发挥不了C语言的这一特长。,4C语言的指针使用极为灵活,这往往会给使用者带来困难。,5C语言的语法不太严格,给熟练的使用者以很大的灵活性,但给初学者带来很多困难,尤其是程序的调试。学会调试程序是非常重要的。,6学习计算机语言要多实践,学习C语言更要多实践,只有通过大量的上机实践才能真正掌握C语言。,十其它常用高级语言,面向对象的C语言。它是在C语言的基础上增加了面向对象的内容。C+的学习比C语言更为困难。从目前的发展看,C+的应用更为普及。,1C+语言,PASCAL语言是一种有着良好结构化特性的高级语言,它是在软件危机的70年代所创造的一种完全符合结构化原则,有着严格的语法规则的高级语言。该语言在语言教学中有着良好的声誉,但在实际使用中,利用该语言开发软件并不多。所以许多人认为PASCAL只是一种教学语言。,2PASCAL语言,3FORTRAN语言,FORTRAN是最早出现的高级语言之一。它是针对科学计算而设计的一种高级语言(早期计算机的主要任务就是进行科学计算),到目前为止,FORTRAN仍主要是用于科学计算。C语言出现后,有人给FORTRAN语言判了死刑,但事实上,在科学计算上,尤其是在大规模科学计算上,FORTRAN仍是首选的高级语言。FORTRAN自身也在发展,目前,FORTRAN已发展到90和95版本。微机上的FORTRAN编译器也有多种,在国内最流行的是VISUALFORTRAN5.0及更高的版本。此外还有其它的编译器如NDPFORTRAN等,只是在国内不大流行。,4VISUALBASIC,是由微软公司开发的,支持WINDOWS平台下开发的BASIC语言。它支持面向对象的开发,是目前WINDOWS平台下流行的开发工具之一。,5其它语言,在实际应用中,还有许多其它的高级语言或开发工具。一般来说,每一种高级语言或开发工具都有它的使用范围,到目前为止,还没有一种语言能包打天下。,十一学习高级语言目的,对于计算机或电子专业来说,C语言的学习有这样几个目的:,1学会使用C语言,能用C语言编制程序。2掌握高级语言的基本特点,为学习其它的高级语言或开发工具打下坚实的基础。同时,为后续有关课程的学习打下基础3对计算机程序的工作过程有所了解,增强使用程序的能力,而且,在学习C语言过程中所得到的能力,很容易迁移到其它软件的使用中。,第二章顺序结构程序的设计,顺序结构程序是指在程序的每次执行过程中,程序中的各条语句按照在程序中的先后顺序依次执行。每个顺序结构程序中的可执行语句在每一次程序执行的过程中,执行且只执行一次。顺序程序是最简单的程序。,设计一个程序,首先要将问题分析清楚,然后用适当的方法将问题描述出来,再根据问题的描述编成程序,最后调试运行。,描述问题的方法很多,有各种流程图,层次图、伪代码等,更多的时候是多种手段混合使用。,例2.1最简单的C程序,这也是世界上第一个C程序。,/*exam21.c*/*最简单的C程序*/#includemain()printf(“Hello,world!”);,头文件,主函数,例2.2已知圆的半径为R(R是一个可变的量),求圆的面积和周长,用计算机求解,程序如下,/*exam22.c*/*计算圆的面积和周长*/#includemain()floatr,area,s;scanf(“%f“,1、注释,2、数据说明,3、数据输入,4、数据处理,5、结果输出,例2.3已知平行四边形的长为50,宽为10,计算平行四边形的面积和周长。,程序如下:,/exam23.c/计算平行四边形的面积和周长#includemain()floata,b;a=10.0;b=5.0;printf(“AREA=%f”,a*b);,程序,例2.4以我国1992年工业产值为100,如果以9%的年增长率增长计算到2000年时的工业产值。,1算法分析:,对此问题,要找出问题的数学模型。设r为年增长率,n为年数,v为第n年的总产值。则有v=100*(1+r)n,2数据结构,根据算法分析,至少要用到这么几个量,年增长率、年数、第n年的总产值。而这几个量中,年增长率肯定是小数(浮点)型数据,年数是整数(整型),总产值不会是整数,应为浮点数。这些数据都要放在相应的变量中,并要进行相应的数据说明。,/exam24.c/计算到2000年的工业产值#includemain()intn;floatrate,value;n=2000-1992;rate=0.09;value=100*pow(float)(1+r),(float)n);printf(“2000年的产值为%f:”,value);,pow为求幂的函数格式pow(底,指数)底,指数均为浮点数。,强制类型转换,3源程序代码,此例中,只能算到2000年,且年增长率为9%时的工业产值。如果将工业产值改为10%,或者要算到其它年份,必须要修改源程序,使用不便。,方法2:用scanf函数重新编写程序。,/exam24.c/计算到2000年的工业产值#includemain()intn,year;floatvalue,rate;printf(“请输入年份和年增长率”);scanf(“%d,%f”,例2.5鸡兔同笼,已知鸡兔总头数为H(Heads),总数为F(Feet),问鸡兔各有多少只?,1算法分析:,(1)建立数学模型设鸡为x只,兔为y只,由题意有:x+y=h.(1)2*x+4*y=f.(2),(2)求解方程,找出x,y的具体求解公式:,以下用消元法找出方程的解,(2)式-2(1)式,注意:计算机不会自己建数学模型,也不会自己解方程!,2y=f-2h,y=(f-2h)/2,4(1)式-(2)式,2X=4H-F,X=(4H-F)/2,2数据结构,程序中要用到不同的数据,存放头、脚数量的变量,存放方程解(鸡、兔数量)的变量,存放方程判别式的变量等。对于头、脚的数量,肯定是整型变量,方程的解理论上讲是整型,但在求解方程时要进行运算,为了避免发生错误,最好是用浮点数据。,3伪代码(由于此问题比较简单,也可直接编写程序)。,说明变量x,y,f,h输入数据f,h计算x,y打印结果,伪代码是一种程序设计工具,介于程序语言与自然语言之间,伪代码不能被计算机编译,但它很容易翻译成高级语言.,/exam25.c#includemain()floatx,y;intf,h;printf(“InputthenumbersofHeadsandFeet”);scanf(“%d,%d”,4源程序代码,说明输入数据的内容,第三章分支结构程序设计,问题:,1、从键盘输入一个数,如果该数为正,打印,否则不打印;,2、将考试成绩不及格的学生名单打印出来;,3、解一元二次方程,求出相应的实根或复根。,对于上述或类似问题,需要进行某种判断,并根据不同情况进行不同的处理,怎样进行程序设计?,解决办法:,1、引入新的程序结构,分支结构,有时也称判断结构或选择结构。,2、为了和分支结构相配合,同时还要引入逻辑表达式的概念。,3、有三种形式可进行分支结构的程序设计,A、if结构B、多重选择结构(switch语句)C、无条件转移结构(goto语句),本章内容,if语句,关系表达式和逻辑表达式,if语句的变形及嵌套,多重选择语句(switch语句),无条件转移语句(goto语句),本章小结,例3.1求一元二次方程,的根,1、算法分析:,2、数据结构:由于问题简单,只需用到一些单精度实数,3、伪代码,输入方程系数a,b,c计算判别式d=b*b-4*a*cif判别式大于等于0then计算两个实根定位输出光标打印结果else计算实部计算虚部定位输出光标打印结果endprogram,4、源程序清单,#include#includemain()floata,b,d,c,x1,x2,p,q;printf(“输入方程系数:”);scanf(“%f,%f,%f”,求平方根的函数,例3.2商店售货,按购买货物款的多少分别给予不同的优惠折扣,编程计算实际应付货款。,购货不足250元,没有折扣;购货250元(含250元,下同),不足500元,减价5%;购货500元,不足1000元,减价7.5%;购货1000元,不足2000元,减价10%;购货2000元及以上,减价15%;,1、算法分析:设购物款为M,折扣为D,则D可表示为:D=0(M250)D=0.05(250M500)D=0.075(500M=2000)d=0.15;t=m*(1-d),/应付款printf(“实际应付款:%f”,t);,例3.4从键盘输入一字符,如果为Y,则打印是,为N,打印否,其它字符,打印输入错误。,/exam44.c#includemain()chara;printf(“输入一个字符:”);a=getchar();if(a=“Y”|a=“N”)if(a=“Y”)printf(“是”);elseprintf(“否”);elseprintf(“输入数据不合要求”);,演示,#includemain()intx,y,z;printf(“Iputx,y,z:”);scanf(“%d,%d,%d”,例3.5,演示,嵌套不能太深,一般以三层为限,嵌套太深,容易出错。,嵌套演示程序,#includemain()intx,y,z;printf(“Iputx,y,x:”);scanf(“%d,%d,%”,利用逻辑表达式将例4.5改写,改写后程序的结构要清晰得多。,演示,例3.6将输入的字母转化为小写字母。,1算法分析,在计算机中,处理英文字母,其实是处理它的ASCII码值。将大写字母变成小写字母,就是将大写字母的ASCII码值变为相应的小写字母的ASCII码值。,大写字母的ASCII值比小写字母的ASCII值小32,故将相应字母的ASCII值加32就变成了小写字母。,程序设计时,要注意如果输入的不是大写的字母,则不用转换。,main()charch;scanf(“%c”,2源程序代码之一,main()charch;scanf(“%c”,注意:1条件运算符优先于赋值运算符,低于关系运算符;2条件运算符的结合方向为“自右至左”ab?a:cd?c:dab?a:(cd?c:d),此处使用了条件运算符,3源程序代码之二,#includemain()inti;printf(“输入数字1-7:”);scanf(“%d”,例3.7输入星期中的某一天,显示对应的英文,此例似显复杂,是否有更好的办法?,main()intI;printf(“输入数字1-7:”);scanf(“%d”,例3.8用switch语句重写打印星期程序。,main()intI;printf(“输入数字1-7:”);scanf(“%d”,例3.9用switch语句重写例4.4的程序,main()chara;printf(“输入一个字符:”);a=getchar();if(a=“Y”|a=“N”)if(a=“Y”)printf(“是n”);elseprintf(“否n”);elseprintf(“字符不合要求!n”),显然,改写后的程序更清晰,更简短。,main()chara;printf(“输入字符:”);a=getchar();switch(a)caseY:printf(“是n”);break;caseN:printf(“否n”);break;default:printf(“字符不合要求!n”),例3.10在屏幕上显示菜单,分析:程序首先在屏幕上将功能显示出来,用户根据需要选择相应的功能,程序根据用户的选择执行相应的程序段。,对于这类程序,往往是用户输入一个英文字母,然后程序根据字母来断别程序该执行什么程序段,故一般用switch语句比较方便。,2源程序清单,switch(a)casei:printf(“调用输入模块!”);break;caseo:printf(“调用输出模块!”);break;casel:printf(“调用查找模块!”);break;caseq:printf(“调用退出模块!”);break;,main()intchara;printf(“请选择:”);printf(“输入i”);printf(“输出o”);printf(“找出最长的单词l”);printf(“退出q”);a=getchar();,执行选项时,要调用相应的模块(程序段)。由于现在还没有相应的程序,暂用一条打印语句代替。,以后会用相应程序代替,例3.11统计某班级中计算机课程中考试成绩高于80分的人数。假设学生人数为,main()inti,fs,j=0;Loop:scanf(“%d”,本章小结,1、分支结构:改变程序的执行流程,或有选择地执行程序;,2、ifelse和switch是结构化语句,而goto语句不是;,3、块if语句可以取代所有的分支结构,而多重分支结构不可;,4、块if语句中的条件可以是复杂逻辑表达式,而多重分支中的条件只能是简单表达式;,5、块if与goto语句结合,可以构造任何复杂的循环,但用专门的循环语句更方便。,返回目录,第四章循环结构,在人们所需处理的运算任务中,常常需要用到循环结构,所谓循环是指对同一个程序段重复执行若干次。被重复执行的部分(由若干语句组成)称为循环体。循环结构又称重复结构。,本章主要内容:while循环语句dowhile循环语句for循环语句循环嵌套及注意的问题程序的流程图,例4.1查找某班级中计算机课程中考试是否有成绩高于95分的人。,1算法分析,此题的算法比较简单,将该班计算机课程的考试成绩输入计算机,每输入一个成绩,就与95进行比较,如果有大于95的成绩,程序结束。但在输入和比较时,要有一种结构,使得计算机能不停地执行输入和比较,当某种条件(如找到了大于95分的成绩,或者所有的成绩都已输入完)满足,则结束程序。,2数据结构,数据结构也很简单,用一个变量存放输入的数据,还要用一个变量记录输入数据的个数,如果输入的数据完成时,则该变量就等于输入的数据的最大个数。,说明整型变量fs,i;输入成绩fs;记录输入成绩的个数(i=i+1);iffs95或者输入数据完成(i某值)退出输入;elsego输入成绩行;if(fs95)打印字符串“找到了!”else打印字符串“没找到!”结束程序,3程序伪代码,main()intfs,i;i=1;loop1scanf(“%d”,4源程序代码之一,5源程序代码之二,#includemain()intfs,i=1;printf(n请输入第%d个数据:,i);scanf(%d,注意输入提示,例4.2将输入的正文复制到输出,每次一个字符,1算法分析,本题的含义是每次从键盘上输入一个字符,然后将该字符在屏幕上输出。因为是正文,故其结束的标志为ctrl+z,要使用字符函数来接受从键盘输入的字符,一般用getchar函数。,2源程序代码#includeintmain(void)charc;printf(“inputatextendofctrl+zn”);c=getchar();while(c!=EOF)putchar(c);c=getchar();,在头文件中定义的常数(-1),#includeintmain(void)charc;printf(inputatextn);while(c=getchar()!=EOF)putchar(c);,例4.3请阅读下面的程序,说明程序的功能。,该程序与上面的程序功能一样,只不过将字符输入语句放入循环判断条件中。,例4.4比较两种循环的用法。从键盘输入一个字符Y或N,直到输入正确为止。,1算法分析,在程序中,经常会遇到要求用户输入Y或N,以确定某种状态。为防止用户在无意中碰到键盘而输入错误的字符,程序对用户输入的不合要求的字符忽略,并要求用户重新输入。,为了做到上述要求,程序对输入的字符要进行判断,如果不合要求,则将输入的字符忽略,并等待用户重新输入。,显然,要做到这一点,须用一个循环程序,当输入正确时,循环结束。,设输入变量为c,则循环控制条件为!(c=Y|c=N)或者(c!=Ywhile(c!=Y,格式2:doprintf(”EnterYorN“);c=getchar();while(c!=Y,显然,格式2更方便!,#includemain()intfs,i=1;doprintf(请输入第%d个数据:,i);scanf(%d,例4.5将例4.1用新的dowhile语句重写,查找某班级考试结果是否有高于95分的成绩。,例4.5统计某班级中计算机课程中考试成绩高于80分的人数,现用for循环语句重写该程序。,main()intfs,sum,j;sum=0;for(j=1;j80)sum=sum+1;printf(“sum=%dn“,sum);,给循环变量j赋初值1,循环变量j加1,循环控制条件,1、分析:该数列中每一项的分母都有规律,后一项为前一项加5,分母的通式为:An=An-1+5,A1=1或:,程序,/exam53.c#includemain()inti;floatsum=0;for(i=0;i0.00000000000001;i+)term=1.0/(i*i);sum=sum+term;pi=sqrt(sum*6);printf(%fn,pi);,两个相乘,其值会溢出,故得不到想要的结果,例4.8分别统计某班学生各科成绩中高于分的人数。学生人数为30人,课程为:数学、语文、英语、物理、生物。,intn,i;n=0;for(i=1;i=80)n=n+1;/累加大于80分的人数printf(n=%d“,n);,先看统计数学成绩,统计五门课程,只需将统计一门课程的程序用不同的数据执行5次,这可用一个循环实现。,/统计某一门课程n=0;for(i=0;i=80)n=n+1;printf(n=%d“,n);,for(j=0;j5;j+)/对课程循环,统计每门课程的成绩!,/统计一门课程n=0;for(i=0;i=80)n=n+1;printf(n=%d“,n);,这里,用到了二重循环。,例4.9求自然对数的底e,取前n项的和。,1算法分析,此题有两种算法:,一种是直接求通项,则先求n!,然后求1/n!,这种方法比较简单。求n阶乘的程序段为,f=1;for(j=1;jb)/*whileab*/printf(“*/”);,字符的类型,仅从字符本身是无法区分的。如上面的串中,字符串while可能是普通字符串,也可能是注释字符串。同样,对“*/”字符,与/*配对是注释字符,否则就是普通字符。因此,需要一个类型标志state。,因此,字符的类型标志可取为:普通字符(COPY)、注释开始(START)、注释字符(COMMENT)、注释结束(END)。,因此,在C程序中,从注释的角度来看,字符共有四种,普通字符、注释开始字符、注释结束字符及注释字符。,while(ab)printf(“*/”);为普通字符,whileab为注释字符,/*/为注释标志字符。,参照下例开始程序设计。,开始时,state置普通字符状态。,在普通字符状态,如果输入字符不是/,则将字符原样输出,如果输入字符为/,,在开始注释状态,如果输入字符为*,,while(ab)/*whileab*/printf(“*/”);,则可能开始注释,将state设为注释状态,字符/不输出;,参照下例开始程序设计。,开始时,state置普通字符状态。,在普通字符状态,如果输入字符不是/,则将字符原样输出,如果输入字符为/,,在开始注释状态,如果输入字符为*,表明注释开始,state置为注释状态;如果输入字符不是*,,while(ab)/*whileab*/printf(“*/”);,则可能开始注释,将state设为注释状态,字符/不输出;,参照下例开始程序设计。,开始时,state置普通字符状态。,在普通字符状态,如果输入字符不是/,则将字符原样输出,如果输入字符为/,,在开始注释状态,如果输入字符为*,表明注释开始,state置为注释状态;如果输入字符不是*,表明前面设置的注释开始状态不对,state改为普通字符状态;然后将/输出,接下将刚输入的字符原样输出。,在注释状态,如果输入的字符不是*,字符不加处理,否则,表明注释将要结束,将state置为结束状态。,在结束注释状态,如果输入字符为/,表明注释结束,state置为普通字符状态;否则,仍为注释状态,state置为注释状态。,while(ab)/*whileab*/printf(“*/”);,则可能开始注释,将state设为注释状态,字符/不输出;,while(c=getchar()!=EOF)if(输入换行符)输出换行符elseswitch(state)普通字符状态:if(输入字符/)字符状态设为START;else字符原样输出开始注释状态:if(输入字符*)注释内容从此后开始,状态设为注释else/为普通字符原样输出/原样输出输入的字符将字符状态重新设为普通字符(COPY)注释状态:if(输入字符*)注释即将结束,状态设为END;结束状态:if输入字符/注释结束,状态设为COPYelse仍为注释状态,S,输出c,输出n,F,c=n,c=/,S=START,输出/输出c,c=*,S=COMM,c=/,S=COPY,S=COMM,c=*,S=END,S=COPY,T,COPY,START,COMM,END,输入字符赋给c,c!=EOF,循环体底部,T,T,T,T,F,F,F,F,s=COPY,循环流程图,演示,#include#defineCOPY0#defineSTART1#defineCOMMENT2#defineEND3intmain(void)charc;intstate;state=COPY;printf(inputCprogramendofcrtl+z:n);while(c=getchar()!=EOF)if(c=n)putchar(n);else,switch(state)caseCOPY:if(c=/)state=START;elseputchar(c);break;caseSTART:if(c=*)state=COMMENT;elseputchar(/);putchar(c);state=COPY;break;caseCOMMENT:if(c=*)state=END;break;caseEND:state=(c=/)?COPY:COMMENT;break;,返回,例4.14利用getch函数,编写密码输入程序。,输入密码时,屏幕上不显示输入内容,而代之以“星号”之类的内容,以防他人看到密码。,#include#includemain()charc=0;printf(请输入密码:n);while(c!=13)c=getch();putchar(*);putchar(n);,一、函数过程的概念,过程是现代过程式语言的重要概念。在程序设计中,离开了过程就谈不上结构化程序设计。,过程是程序设计中的一个逻辑单元,是一段程序,能完成某一项简单的功能。过程与程序的关系类似于机器中的零部件与机器之间的关系。,如系统提供的sin(x)函数,就是一个函数过程。它是系统提供的求变量(参数)X的正弦值的过程。系统中有许多这样的过程,如sqrt,strcat等。,第五章函数,二、过程的优点:,1、利用过程可以把程序划分为若干个独立的逻辑单元,每一个单元相对于整个程序小得多,故其调试更容易;,2、过程可作为一个功能模块而被同一程序中的不同地方引用,也可被不同程序引用。如系统提供的函数,就可被不同的使用者引用。,三、C语言中的过程,C语言只提供了一种过程,即函数过程,也简称函数。后面,我们将把函数过程简称为函数。,例5.1编程计算组合数。设有j,k,且jk,则组合数c为c=(j!-k!)/k!。!为阶乘的符号。,1算法分析,此题不难编程,只要分别求出二个数的阶乘,然后根据公式进行计算即可。,求一数j的阶乘的程序段为,jc=1;for(i=1;i=j;i+)jc=jc*i;,2源程序代码之一,#includemain()inti,j,k,ic,jc,kc;floatresult;scanf(%d,%d,3源程序代码之二,#includefloatjc(int);main()inti,j,k,ic,jc,kc;floatresult;scanf(%d,%d,floatjc(intn)inti;floatj=1.0;for(i=1;i=n;i+)j=j*i;returnj;,函数定义,函数说明,参数,返回值,问题:在主函数和函数jc中都定义了变量j,它们之间的关系如何?,例5.2编写程序,利用递归调用方式,计算n!。,递归公式总是有一个结束条件,这个结束条件称为”边界条件”,如n!的边界条件为n=1.本例如定义的函数过程名为fact,则递归调用公式可用下式表示:,计算n!可以用下式定义:,n!=n(n-1)(n-2)(n-3)21,intfact(n)intf;if(nn,且n0),分析:本例采用辗转相除法来计算两个数m,n的最大公约数。过程:m除以n,如余数r=0,则n就是最大公约数。如r0,则mn,nr,再重复上述过程,直到r=0为止,这时的n就是要求的最大公约数.,例:m=112,n=77被除数除数商余数112/7713577/352735/750,因此,112和77的最大公约数为7,本问题的特点是要多次处理同一个问题,只是处理所用数据不同,且后一次所用数据为前一次处理的结果,正好用递归。,运行结果:m,n=?112,77gcd=7,/exam63.c#includeintfgcd(int,int);main()intm,n,g;printf(“m,n=?”);scanf(%d,%d,fgcd(m,n)intg;if(n=0)g=m;returng;elsefgcd(n,m%n);,例5.4设口袋中放着12个球,其中3个是红的,个是白的,6个是黑的,每次从中取个球,问有多少种取法。,1算法分析:(1)在袋中取出红球的可能性是,;白球的可能性是,;黑球的可能性是,;,(2)如果红白球之和小于个,则凑不满个,故每次红白球之和至少应为个;,(3)设红球分别取,个(即对红球的可能取法循环),白球可能的取法也是,但同时必须满足红白球之和不少于,黑球的个数为红白;,(4)每找到一种组合,都将它们的组合形式打印出来。,2数据结构设计:用三个整数表示红、白、黑三种球每次取出的个数,一个整数用来记录取法。r,w,b,sum,3伪代码:所有变量均说明为整型变量sum=0(计数变量初始化)beginloop(red=0to3)(对红球的可能取法循环)beginloop(white=0to3)(对白球可能的取法循环)ifred+white2(红球+白球2)则本次取不到8个球,不计数elsesum=sum+1(计数)endifendloop(循环结束)endloop(循环结束)printsum=;sum(打印结果)结束程序,程序,/exam64.c#includeintpri(int,int);main()intr,w,sum=0,i=1;for(r=0;r=2)sum=sum+1;printf(No%2d,i);pri(r,w);i+;printf(nsum=%dn,sum);,pri(intr,intw)intb,i;b=8-r-w;for(i=1;i=r;i+)printf(红);for(i=1;i=w;i+)printf(白);for(i=1;i=b;i+)printf(黑);putchar(n);,例6.1从键盘中输入3个数,并将其排序。,1算法分析,当数据较少时,问题比较简单。设3个数分别存放在变量a,b,c,假设从小到大排序,则步骤如下:,第一步将a与b比较,如果a大于b,则将a,b的数据交换,然后将a与c比较,如果a大于c,则a与c交换,至此,a中的数据最小。,第二步将b和c比较,如果b大于c,则b与c的数据交换。,最后,得到排好序的数据。,第六章数组,#includemain()inta,b,c,t;scanf(%d,%d,%d,显然,要有其它的解决办法。,#includemain()inta3,t;scanf(%d,%d,%d,在此例程序中,完成的功能与前面的程序一样,但存放数据用了一个新类型数组。,数组,顾名思义,就是一组数据,但用一个相同的名字表示。这组数据中各个元素的区分依赖数组的下标。,下标就是数组名后方括号中的数字。这种处理方式类似于数学中的下标,如,以字符数组为基础做一个简单的文本编辑程序。该程序首先从键盘中最多输入100行字符,每行最多80个字符然后将输入的字符在屏幕中输出。当输入不足80行时,输出空行表示输入结束。,例6.2,阅读程序时,要注意C语言的特点,程序中利用了一些C语言中常用的技巧。,1算法分析,此例涉及到字符数组,一般情况下,字符程序设计比较困难。,首先,要有一个变量能存放输入的字符文本,到目前为止,能用的工具只能是存放字符串的数组。其次,要能输入字符串的函数,第三,用什么方式能达到在输入空行时结束输入。,所谓空行,是指串中没有内容,也就是说,串的第一个字符即为串结束符。因此,判断一个串是否是空行的标准就是判断串的第一个字符的ASCII值是否为零。,当遇到串结束标志符0时,其ASCII值为零,循环条件为假,结束循环.,当输入空行,该行的第一个字符textt0为串结束符0,而字符0的ASCII值为零,!(0)即为非零,表示真,执行break语句,退出输入循环.,#include#defineMAX100#defineLEN81chartextMAXLEN;main()intt,i,j;for(t=0;tMAX;t+)/输入循环printf(%d:,t);gets(textt);if(!textt0)break;for(i=0;i=len)puts(arrayoverflown);return1;s1i=0;return0;,例6.4字符追加函数,检查数组越界。,退出过程,intstrcmp1(char,char);main()charc15=n,a,n,0;c2=n,a,n,0;printf(%dn,strcmp1(c1,c2);strcmp1(chars1,chars2)/字符串比较函数inti=0;while(s1i)if(s1i-s2i)return(s1i-s2i);elsei+;return0;,例6.5字符串比较函数的实现方法之一,此处要求第1个串比第2个串长,考虑一般情况,则要用长的串放入循环中,数组应用程序例,一排序,例6.6从键盘上输入4个数,并存入数组中,然后找出其中最大的数并打印其值。,#includemain()inttemp,i,j,a4;scanf(%d,%d,%d,%d,例6.7从键盘上输入4个数,存入数组中,然后将4个数进行排序(从小到大)并输出。,for(i=1;i4;i+)if(a0ai)temp=a0;a0=ai;ai=temp;,1算法分析:在例66中,只找出了最大数,如果要排序,则在找出最大的数后,在剩下的数中再找出最大的数,直到最后,则序就排好了。,for(j=0;j3;j+)for(i=j+1;i4;i+)if(ajai)temp=a0;a0=ai;ai=temp;,找最大的数,排序,main()inttemp,i,a4;scanf(%d,%d,%d,%d,简单的交换排序程序,例6.8简单的插入排序,插入排序法为在原数组中就地排序的方法。此方法由第二个单元开始,顺序从原始数据中取出数据,并将数据插入左端已排好序的序列合适的位置。,插入排序示意图,插入排序源程序,/exam68.c#includemain()inti,j,x,n,a=13,15,7,10,20,8,4,19;n=sizeof(a)/4;for(i=1;i=0,例6.9Shell排序,基本思路:将整个数组分割为若干较小的子数组分别进行排序,并逐步扩大数组的有序性直到完成。因此,shell排序要利用其它的排序程序。本例中用简单的插入排序。,具体做法:1对一个元素个数为N的数组,先取定一整数增量d1N,将相隔为d1的元素并为一组,在各组内排序;2然后取d2d1,重复上述分组过程和排序工作;3不断取d3,d4dn=1,最后将所有数据放在一起进行排序为止。,当数据量较大时,Shell排序速度很快。,Shell排序的速度基于两个前提:一、当有大量的数据要排序时,将其分成若干组分别进行排序所花时间大大少于全部数据放在一起排序所花的时间;二、排序时,有序数据的排序比无序数据的排序的时间要少。,Shell方法本身不进行排序,需要有其它的排序方法配合。,因此,对shell排序,选择的具体排序算法,一般是交换排序,因为交换排序不但简单,而且交换排序当数据大体有序时,速度很快。在本程序中,具体排序方法选择插入排序,它也是交换排序的一种变形。,/exam69.c/shellsor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025教育培训机构加盟合同
- 2025珠海市机动车驾驶员培训合同
- 2025辅导班教师聘用合同
- 2025成都市住房制度改革售购房合同样书
- 2024年职称计算机每日一练试卷完整版附答案详解
- 过敏性休克的应急演练脚本
- 2024粮油食品检验人员考试历年机考真题集及参考答案详解(预热题)
- 三支一扶模考模拟试题附参考答案详解(研优卷)
- 重难点解析人教版8年级数学上册《 整式的乘法与因式分解》专题测评练习题
- 强化训练-浙教版七年级下册第六章数据与统计图表综合训练试题(解析卷)
- 偏光片的基础知识
- 工会记账凭证(含公式)
- GB/T 2518-2019连续热镀锌和锌合金镀层钢板及钢带
- GB/T 222-1984钢的化学分析用试样取样法及成品化学成分允许偏差
- 国家开放大学电大《课程与教学论》形考任务3试题及答案
- 商务英语口语900句
- 培训师的核心技能-讲义课件
- 苏教版四年级(上)科学第二单元测试题(无答案)
- 辽宁省沈阳市基层诊所医疗机构卫生院社区卫生服务中心村卫生室名单目录信息
- 锅炉空预器清洗方案
- 《霜降-二十四节气》 课件
评论
0/150
提交评论