C语言全程学习_第1页
C语言全程学习_第2页
C语言全程学习_第3页
C语言全程学习_第4页
C语言全程学习_第5页
已阅读5页,还剩200页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计基础 前 言本电子讲稿是在近几年作者为计算机专业、计算机第二专业授课讲稿的基础上,为2000级计算机科学与技术(本科)(80学时)、计算机应用与维护及计算机网络专业(60学时)授课而开发的。在开发中借鉴了作者以前开发的QUICK BASIC 程序设计及计算机应用基础电子讲稿的经验。在2000级授课完成后,对讲稿进行了修改。为使该讲稿适合99信息试点班(100学时)的教学,又根据教学要求,对讲稿的内容进行了一次较大规模的增加。此次用该讲稿给2001级计算机科学与技术班(80学时)授课时,又结合本人主持的教育部教学科研课题,按照现代新的认知教学理论建构主义的教学理论,对讲稿进行了第三

2、次大规模的修改。本次修改,主要特色如下:1 根据人们学习程序语言的规律,讲稿全部以实例为主线。以这种方式教学,首先介绍实际问题,接着介绍问题的解决办法,也就是算法和数据结构,然后用伪代码将问题描述出来,最后将伪代码翻译成C语言程序(当然也可以是其它语言的程序)。对于程序中碰到的新的语句或函数,确改变了以往的程序语言教学的一般做法:一开始,先介绍语句或函数,然后介绍用法(语法),再用一个小例子说明该语句或函数的使用,最后,罗列一大堆有关该语句或函数的若干细节。这样的教学方法,对学生参加某些考试是很有帮助的。但要让学生在学完语言课程后编制一个稍复杂的程序,往往就无从下手。 这样学习,很多学生学了一

3、些语法或规律,但弄不明白为什么要这样。以实例为主线,学生在学习程序之后,对不懂的语法现象再学习,就有了感性认识,也比较容易接受;2 利用超级链接功能模拟人在学习时的联想,使得讲稿可以从任何一部分进入,无需从头开始学习;4 在以往的教材中,例题大多是为了说明语法而设计的,因此,各例题之间少有联系。在本电子讲稿中,大多数的例题之间是有联系的,单独使用时可以用来说明语言的语法现象,到课程结束时,这些例题又可以组合成一个较大的程序,以帮助学生进行程序设计训练。3 在教学中,我们发现,学生往往能读懂一些简单的程序,但对于一些简单的问题,要自己进行程序设计比较困难。讲稿中的例题,除少量较容易的例题外,全部

4、给予了详细的算法分析,改变了以往教材或教学中的给出问题,然后给出程序,再给学生讲解程序。本讲稿以C程序作为基础,但对于其它高级语言的学习,也有参考价值。第1章 C 语言简介第2章 顺序程序设计第3章 分支结构第4章 循环结构第8章 结构与共用体第11章 位运算第10章 C windows程序设计简介第7章 指针第5章 函数第9章 文件第6章 数组第一章 C语言简介一.程序的概念程序就是一系列的操作步骤,计算机程序就是由人事先规定的计算机完成某项工作的操作步骤。每一步骤的具体内容由计算机能够理解的指令来描述,这些指令告诉计算机“做什么”和“怎样做”。 二.程序设计语言的概念编写计算机程序所使用的

5、语言称为程序设计语言。四 高级程序设计语言(简称高级语言) 高级语言是相对低级语言而言的。低级语言是计算机能直接识别的语言(机器语言)或符号化的机器语言(汇编语言),高级语言是一种通用的,面向用户的各类需要,与特定的机器相分离,并遵循一定的严格规定与形式的语言,其语言格式接近于自然语言或接近于数学函数形式。三 计算机语言发展过程机器语言汇编语言高级语言BASIC,QUICK BASIC,FORTRAN,COBOL,PASCAL, C,LISP,PROLOG, ADA,PL/1,VISUAL BASIC,C+五 常用高级语言六 过程式语言 面向解题过程,告诉计算机“怎么做”,这种语言称为过程式语

6、言。 面向处理对象,告诉计算机“做什么”而不必指出“怎么做”,计算机就能完成所要求的任务.这种语言称为非过程式语言. BASIC,QUICK BASIC,FORTRAN,PASCAL,C等均为过程式语言, SQL查询语言,SMALLTALK等均为非过程式语言.七 解释型与编译型语言 计算机不能直接识别高级语言,要让计算机能执行高级语言,需要将高级语言翻译成等价的机器语言,这种翻译有两种形式:(1)边翻译边执行;(2)全部翻译完成后才执行。前一种方式称为解释方式,后一种称为编译方式.C,FORTRAN,PASCAL 等为编译型语言BASIC,java等为解释型语言QUICK BASIC 有解释和

7、编译两种方式.用高级语言写成的程序称为源程序(或源代码)翻译成的机器语言称为目标程序(目标代码)八 C 语言的特点 1 语言简单、紧凑、使用方便、灵活。C语言一共只有32个关键字,9种控制语句,大小写区别; 2 运算符丰富 共有34种运算符,表达式类型多样化,使用灵活;3 数据结构丰富,具有现代化的语言的各种结构;4 具有结构化的控制语句,用函数作为程序模块,以实现程序的模块化,是结构化的理想语言,符合现代编程风格的要求; 7 生成的目标代码质量高,一般只比汇编语言生成的目标代码效率低10%20%; 8 用C语言编写的程序可移植性好(与汇编语言相比)。 6 C语言允许直接访问物理地址,能进行位

8、(bit)操作,可以直接对硬件进行操作,能实现汇编语言的大部分功能; 5 语法限制不太严格,程序设计自由度大。例如,对数组下标越界不作检查,对变量的类型使用比较灵活。如整型量与字符型数据及逻辑型数据可通用。 九 C 语言学习中要注意的问题及学习方法 1 C语言关键字少,而且与其它高级语言类似,掌握标准C并不难。 2 C语言是基于函数的语言,C语言的大部分功能需要调用库函数去实现。DOS下的C编译器Turbo C 2.0大约有440个函数, BC+2.0大约有500多个函数,VC+除了标准的C运行库之及C语言扩展外,还有600多个Windows API,以及VC+中的类库,Linux的 C也有很

9、多扩展。要掌握好库函数是不太容易的。3 C语言可以直接对硬件进行操作,因此,对计算机的硬件要有一定的了解,否则,就发挥不了C语言的这一特长。 4 C语言的指针使用极为灵活,这往往会给使用者带来困难。 5 C语言的语法不太严格,给熟练的使用者以很大的灵活性,但给初学者带来很多困难,尤其是程序的调试。学会调试程序是非常重要的。6 学习计算机语言要多实践,学习C语言更要多实践,只有通过大量的上机实践才能真正掌握C语言。十 其它常用高级语言面向对象的C语言。它是在C语言的基础上增加了面向对象的内容。C+的学习比C语言更为困难。从目前的发展看,C+的应用更为普及。1 C+语言 PASCAL语言是一种有着

10、良好结构化特性的高级语言,它是在软件危机的70年代所创造的一种完全符合结构化原则,有着严格的语法规则的高级语言。该语言在语言教学中有着良好的声誉,但在实际使用中,利用该语言开发软件并不多。所以许多人认为PASCAL 只是一种教学语言。2 PASCAL语言3 FORTRAN 语言FORTRAN是最早出现的高级语言之一。它是针对科学计算而设计的一种高级语言(早期计算机的主要任务就是进行科学计算),到目前为止,FORTRAN仍主要是用于科学计算。C语言出现后,有人给FORTRAN语言判了死刑,但事实上,在科学计算上,尤其是在大规模科学计算上,FORTRAN仍是首选的高级语言。FORTRAN 自身也在

11、发展,目前,FORTRAN已发展到90和95版本。微机上的FORTRAN编译器也有多种,在国内最流行的是VISUAL FORTRAN 5.0及更高的版本。此外还有其它的编译器如NDP FORTRAN等,只是在国内不大流行。4 VISUAL BASIC是由微软公司开发的,支持WINDOWS平台下开发的BASIC语言。它支持面向对象的开发,是目前WINDOWS平台下流行的开发工具之一。5 其它语言在实际应用中,还有许多其它的高级语言或开发工具。一般来说,每一种高级语言或开发工具都有它的使用范围,到目前为止,还没有一种语言能包打天下。十一 学习高级语言目的 对于计算机或电子专业来说, C语言的学习有

12、这样几个目的:1 学会使用C语言,能用C语言编制程序。2 掌握高级语言的基本特点,为学习其它的高级语言或开发工具打下坚实的基础。同时,为后续有关课程的学习打下基础3 对计算机程序的工作过程有所了解,增强使用程序的能力,而且,在学习C语言过程中所得到的能力,很容易迁移到其它软件的使用中。第二章 顺序结构程序的设计顺序结构程序是指在程序的每次执行过程中,程序中的各条语句按照在程序中的先后顺序依次执行。每个顺序结构程序中的可执行语句在每一次程序执行的过程中,执行且只执行一次。 顺序程序是最简单的程序。设计一个程序,首先要将问题分析清楚,然后用适当的方法将问题描述出来,再根据问题的描述编成程序,最后调

13、试运行。描述问题的方法很多,有各种流程图,层次图、伪代码等,更多的时候是多种手段混合使用。例2.1 最简单的C程序,这也是世界上第一个C程序。/* exam21.c */* 最简单的C程序 */#includemain() printf(“Hello,world!”);头文件主函数例2.2 已知圆的半径为R(R是一个可变的量),求圆的面积和周长,用计算机求解,程序如下/* exam22.c */* 计算圆的面积和周长 */#includemain() float r,area,s; scanf(“%f“,&r); area=3.14*r*r; s=2*3.14*r; printf(“面积= %

14、f, 周长=%f”,area,s);1、注释2、数据说明3、数据输入4、数据处理5、结果输出例2.3 已知平行四边形的长为50,宽为10,计算平行四边形的面积和周长。程序如下:/ exam23.c/ 计算平行四边形的面积和周长#includemain() float a,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)n2 数据结构根据算法分

15、析,至少要用到这么几个量,年增长率、年数、第n年的总产值。而这几个量中,年增长率肯定是小数(浮点)型数据,年数是整数(整型),总产值不会是整数,应为浮点数。这些数据都要放在相应的变量中,并要进行相应的数据说明。/ exam24.c/ 计算到2000年的工业产值#includemain() int n; float rate,value; n=2000-1992; rate=0.09; value=100*pow(float)(1+r),(float)n); printf( “2000年的产值为%f:”,value);pow为求幂的函数格式 pow(底,指数)底,指数均为浮点数。强制类型转换3

16、源程序代码 此例中,只能算到2000年,且年增长率为9%时的工业产值。如果将工业产值改为10%,或者要算到其它年份,必须要修改源程序,使用不便。方法2:用scanf函数重新编写程序。/ exam24.c/ 计算到2000年的工业产值#includemain() int n,year; float value,rate; printf(“请输入年份和年增长率”); scanf(“%d,%f”,&year,&rate); n=year-1992; value=100*pow(float)(1+r),(float)n); printf(“按给定利率到指定年份的产值为%f”,value);例2.5 鸡

17、兔同笼,已知鸡兔总头数为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-2hy=(f-2h)/2 4(1)式-(2)式2X=4H-FX=(4H-F)/22 数据结构程序中要用到不同的数据,存放头、脚数量的变量,存放方程解(鸡、兔数量)的变量,存放方程判别式的变量等。对于头、脚的数量,肯定是整型变量,方程的解理论上讲是整型,但

18、在求解方程时要进行运算,为了避免发生错误,最好是用浮点数据。3 伪代码(由于此问题比较简单,也可直接编写程序)。说明变量 x,y,f,h输入数据 f,h计算x,y打印结果伪代码是一种程序设计工具,介于程序语言与自然语言之间,伪代码不能被计算机编译,但它很容易翻译成高级语言./exam25.c#includemain() float x,y; int f,h; printf(“Input the numbers of Heads and Feet”); scanf(“%d,%d”,&f,&h); x=(4.0*h-f)/2.0; y=(f-2.0*h)/2.0; printf(“Heads=%d

19、;Feet=%d”,h,f); printf(“Chicken=%d,rabbits=%d”,x,y);4 源程序代码说明输入数据的内容第三章 分支结构程序设计问题:1、从键盘输入一个数,如果该数为正,打印,否则不打印;2、将考试成绩不及格的学生名单打印出来;3、解一元二次方程,求出相应的实根或复根。 对于上述或类似问题,需要进行某种判断,并根据不同情况进行不同的处理,怎样进行程序设计?解决办法:1、引入新的程序结构,分支结构, 有时也称 判断结构 或 选择结构。2、为了和分支结构相配合,同时还要引入 逻辑表达式的概念。3、有三种形式可进行分支结构的程序设计A、 if 结构B、多重选择结构(s

20、witch语句)C、无条件转移结构(goto语句)本章内容 if 语句关系表达式和逻辑表达式if 语句的变形及嵌套多重选择语句 (switch 语句)无条件转移语句( goto 语句)本章小结例 3.1 求一元二次方程的根1、算法分析:2、数据结构: 由于问题简单,只需用到一些单精度实数3、伪代码输入方程系数 a,b,c计算判别式 d=b*b-4*a*cif 判别式大于等于 0 then 计算两个实根 定位输出光标 打印结果else 计算实部 计算虚部 定位输出光标 打印结果end program4、源程序清单 #include #includemain() float a,b,d,c,x1,

21、x2,p,q; printf( “输入方程系数:” ); scanf(“%f,%f,%f”,&a,&b,&c); d=b*b-4*a*c; if ( d=0) x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf( “x1=%f,x2=%fn”,x1,x2); else p=-b/(2*a); q=sqrt(-d)/(2*a); printf( “x1=%f+i%f,x2=%f-i%fn”,p,q,p,q); 求平方根的函数例 3.2 商店售货,按购买货物款的多少分别给予不同的 优惠折扣,编程计算实际应付货款。购货不足250元,没有折扣;购货25

22、0元(含250元,下同),不足500元,减价5%;购货500元,不足1000元,减价7.5%;购货1000元,不足2000元,减价10%;购货2000元及以上,减价15%;1、算法分析: 设购物款为M,折扣为D,则D可表示为: D=0 (M250) D=0.05 (250 M500) D=0.075 (500 M1000) D=0.1 (1000 M2000) D=0.15 (2000M)2、源程序清单/ exam42.c#includemain() float m,d,t; printf(“请输入购物金额: ”); scanf(“%f”,&m); if ( m=250 & m=500 & m

23、=1000 & m=2000) d=0.15; t=m*(1-d), /计算应付 款 printf( “实际应付款:%f”,t);输入购物款: 249实际应付款:249输入购物款: 500实际应付款:462.5例 3.3 购物折扣程序的另一个写法改写后,程序更清晰,执行时间更省。/ exam42.c#includemain() float m,d,t; printf(“请输入购物金额: ”); scanf(“%f”,&m); if ( m=250 & m=500 & m=1000 & m=2000) d=0.15; t=m*(1-d), /应付款 printf( “实际应付款:%f”,t);例

24、 3.4 从键盘输入一字符,如果为Y,则打印是,为N,打印否,其它 字符,打印输入错误。/ exam44.c#includemain() char a; printf(“输入一个字符:”); a=getchar(); if( a=“Y” | a= =“N” ) if (a=“Y”) printf( “是”); else printf( “否”); else printf( “输入数据不合要求”);演示#includemain() int x,y,z; printf(“Iput x,y,z:”); scanf(“%d,%d,%d”,&x,&y,&z); if ( x0) if (y0 ) if

25、(z0) printf( “所有数据大于零!”); else printf( “只有X,Y大于零!”); else if (x=0) if (y=0) if (z=0) printf( “所有数据都为零!”); else printf( “只有X,Y等于零!”); else printf( “X 小于零!”);例 3.5 演示 嵌套不能太深,一般以三层为限,嵌套太深,容易出错。嵌套演示程序#includemain() int x,y,z; printf(“Iput x,y,x:”); scanf(“%d,%d,%”,&x,&y,&z); if ( x0 & y0 & z0) printf( “

26、所有数据大于零!”); else if (x0 & y) printf( “只有X,Y大于零!”); else if (x=0 & y=0 & z=0) printf( “所有数据都为零!”); else if (x=0 & y=0) printf( “只有X,Y等于零!”); else if (x=A & ch=A & chb?a:cd?c:d ab?a:(cd?c:d)此处使用了条件运算符3 源程序代码之二#includemain() int i; printf(“输入数字 1- 7: ”); scanf(“%d”,&i); if (i=1) printf ( “Today is Mond

27、ay!n”); else if (i=2) printf (“Today is Tuesday!n”); else if (i=3) printf (“Today is Wednesday !n”); else if (i=4) printf( “Today is Thursday!n”); else if (i=5) printf( “Today is Friday!n”); else if (i=6) printf( “Today is Saturday!n”); else printf( “Today is Sunday!n”);例 3.7 输入星期中的某一天,显示对应的英文此例似显复杂

28、,是否有更好的办法?main() int I; printf( “输入数字 1- 7: ”); scanf(“%d”,&i); switch(i) case 1: printf( “Today is Monday!”); case 2: printf( “Today is Tuesday!”); case 3: printf( “Today is Wednesday !”); case 4: printf( “Today is Thursday!”); case 5: printf( “Today is Friday!”); case 6: printf( “Today is Saturday

29、!”); default: printf( “Today is Sunday!”); 例 3.8 用 switch 语句重写打印星期程序。main() int I; printf( “输入数字 1- 7: ”); scanf(“%d”,&i); if (i=1) printf( “Today is Monday!”); else if (i=2) printf( “Today is Tuesday!”); else if (i=3) printf( “Today is Wednesday !”); else if (i=4) printf( “Today is Thursday!”); els

30、e if (i=5) printf( “Today is Friday!”); else if (i=6) printf( “Today is Saturday!”); else printf( “Today is Sunday!”);例 3.9 用 switch 语句重写例4.4的程序main() char a; printf( “输入一个字符:” ); a=getchar(); if (a=“Y” | a=“N” ) if (a=“Y” ) printf( “是n”); else printf( “否n”); else printf( “字符不合要求!n”)显然,改写后的程序更清晰,更简短

31、。main() char a; printf( “输入字符:”); a=getchar(); switch (a) case Y: printf( “是n”); break; case N: printf( “否n”); break; default: printf( “字符不合要求!n”) 例 3.10 在屏幕上显示菜单分析: 程序首先在屏幕上将功能显示出来,用户根据需要选择相应的功能,程序根据用户的选择执行相应的程序段。对于这类程序,往往是用户输入一个英文字母,然后程序根据字母来断别程序该执行什么程序段,故一般用 switch语句比较方便。2 源程序清单switch(a)case i: p

32、rintf(“调用输入模块!”); break;case o: printf(“调用输出模块!”); break;case l: printf(“调用查找模块!”); break;case q: printf(“调用退出模块!”); break; main() int char a; printf(“请选择:”); printf(“输入 i ”); printf(“ 输出 o ”); printf(“找出最长的单词 l”); printf(“退出 q”); a=getchar();执行选项时,要调用相应的模块(程序段)。由于现在还没有相应的程序,暂用一条打印语句代替。以后会用相应程序代替例 3

33、.11 统计某班级中计算机课程中考试成绩高于80分的人数。假设学生人数为 main() int i, fs, j=0;Loop: scanf(“%d”,&fs); j+; /统计已读入的数据个数 if (fs80) i+; printf(“%d, %d”,i,fs); if(j95 或者输入数据完成(i某值) 退出输入; else go 输入成绩行 ; if ( fs 95) 打印字符串“找到了!” else 打印字符串“没找到!”结束程序3 程序伪代码 main() int fs,i; i=1;loop1 scanf(“%d”,&fs); i=i+1; if(fs95| i10 ) goto

34、 loop2; else goto loop1; loop2 if ( fs 95) printf(“FIND !”); else printf( “DO NOT FIND !”);4 源程序代码之一5 源程序代码之二#includemain() int fs,i=1; printf(n请输入第 %d 个数据: ,i); scanf(%d,&fs); while(fs=95 & i95) printf( n找到啦!n ); else printf( n没找到!n);注意输入提示例 4.2 将输入的正文复制到输出,每次一个字符1 算法分析 本题的含义是每次从键盘上输入一个字符,然后将该字符在屏幕

35、上输出。因为是正文,故其结束的标志为ctrl+z 要使用字符函数来接受从键盘输入的字符,一般用getchar函数。2 源程序代码 #includeint main(void) char c; printf(“input a text end of ctrl+zn”); c=getchar(); while(c!=EOF) putchar(c); c=getchar(); 在头文件中定义的常数(-1)#includeint main(void)char c;printf(input a text n);while(c=getchar()!=EOF) putchar(c);例 4.3 请阅读下面的

36、程序,说明程序的功能。该程序与上面的程序功能一样,只不过将字符输入语句放入循环判断条件中。例 4.4 比较两种循环的用法。 从键盘输入一个字符Y或N,直到输入正确为止。1 算法分析在程序中,经常会遇到要求用户输入Y或N,以确定某种状态。为防止用户在无意中碰到键盘而输入错误的字符,程序对用户输入的不合要求的字符忽略,并要求用户重新输入。为了做到上述要求,程序对输入的字符要进行判断,如果不合要求,则将输入的字符忽略,并等待用户重新输入。显然,要做到这一点,须用一个循环程序,当输入正确时,循环结束。设输入变量为c ,则循环控制条件为!(c=Y | c=N) 或者(c!=Y & c!=N)2 源代码比

37、较格式1: c=getchar(); while (c!=Y & c!=N) printf( answer is Y or N“); c=getchar(); 格式2: do printf( ”Enter Y or N“); c=getchar(); while(c!=Y & c!=N);显然,格式 2更方便!#includemain() int fs,i=1; do printf(请输入第 %d 个数据: ,i); scanf(%d,&fs); i+; while(fs=95 & i95) printf( n找到啦!n ); else printf( n没找到!n);例 4.5 将例4.1用

38、新的dowhile 语句重写查找某班级考试结果是否有高于95分的成绩。例 4.5 统计某班级中计算机课程中考试成绩高于80分的人数,现用for 循环语句重写该程序。 main() int fs,sum,j; sum=0; for (j=1; j80) sum=sum+1; printf(“sum=%dn“,sum); 给循环变量 j 赋初值1循环变量 j 加1循环控制条件例4.6 求数列 的和。1、分析: 该数列中每一项的分母都有规律,后一项为前一项加5,分母的通式为: An =An-1 +5, A1 =1或: 程序/ exam53.c#includemain()int i;float sum

39、=0;for(i=0;i=100;i+)sum=sum+1.0/(1+i*5);printf(%f,sum);sunhui:2002年4月10日星期三6时16分56秒根据昨天上机的情况,本次课安排了一次习题课。昨天上机时也布置了两道题。一道题是求和:加一道题是教材120页的第八题。学生的思路还是很多的。例 4.7 求的近似值,精确到公式为:此类问题相对简单,但要注意累加变量和通项的初值。该问题中,累加变量sum 的初值为0,通项 term 的初值为 1。#include#includemain()double pi,term,sum;int i;sum=0.0;term=1.0;for(i=1

40、;term0.00000000000001;i+)term=1.0/(i*i);sum=sum+term;pi=sqrt(sum*6);printf(%fn,pi);两个相乘,其值会溢出,故得不到想要的结果例 4.8 分别统计某班学生各科成绩中高于分的人数。 学生人数为30人,课程为:数学、语文、英语、物理、生物。int n,i;n=0;for(i=1;i=80) n=n+1; / 累加大于80 分的人数 printf(n=%d“,n); 先看统计数学成绩 统计五门课程,只需将统计一门课程的程序用不同的数据执行 5 次,这可用一个循环实现。 / 统计某一门课程 n=0; for(i=0;i=8

41、0) 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;j=n;j+) f=f*j;,则有设通项为由于数列的第一项不能用通项表示,故将其直接放入累加变量中。程序片段为第二种求通项的公式e=1.0; a=1;for(m

42、=1;m=n;m+) a=a*(1/m ); e=e+ a;/ 利用双重循环计算main() int i,j,n; float e,f; printf( “Please input N: ”); scanf(“%d”,&n); e=1.0; for(i=1;i=n;i+) f=1; for(j =1;j=i;j+) f=f*j; e=e+1/f; printf( “e=%f”,e);/ 利用单重循环计算main() int i,n; float e,f; printf( “Please input N:”); scanf(“%d”,&n); e=1.0; f=1; for(i=1;i=n;i+

43、) f=f*(1/i ); e=e+ f; printf( “e=%f”,e);2 源代码例 4.10 从键盘上输入字符并按行显示,遇到Esc键结束,要求只显示输出内容。 在每行前显示字符串“The Line No. is n”,n为1,2,3,1 算法分析此题要求从键盘上输入字符并按行显示,初一看,只要用行输入语句就行。但仔细分析后会发现,用行输入语句不行。如用 gets 或 scanf 语句,则输入的内容会在屏幕上回显(即输入的内容显示在屏幕上),其次,这两个语句都不能单独捕捉到Esc键。因此,只能用单个字符输入的函数,但要求不要回显,getchar函数也不行,但推测是与getchar相类

44、似的函数。故可先调出getchar 的帮助,然后看See Also。既然是按行显示,用字符输入函数,每输入一个字符,立刻在屏幕上显示出来。当接受到换行符时,转入下一行。因此,对每一行的输入,要用一个循环,循环的控制条件就是输入的字符不为换行符。当输入为换行符时,循环从头开始。程序的结束是以接受到Esc键为标志的,故而要在行输入的外面再增加一个循环,此循环的结束条件是输入的字符为Esc键。行输入的程序片段为printf(nThe Line No. is %d, i); do printf(%c, c); c=getch(); while(c!=13 & c!=27);13 return键ASCI

45、I码27 Esc键ASCII码getch 不回显输入 字符函数#include#includeint main(void) int i=0; char c=0; while(c!=27) c=0; i+; printf(nThe Line No. is %d, i); do printf(%c, c); c=getch(); while(c!=13 & c!=27); printf(nThe endn);从键盘上输入一个字符,不回显Esc键的ASCII码值回车符的ASCII码值2 源程序代码 例 4.11 输入一个算式,模拟袖珍计算机的加、减、乘、除四则运算。例如:输入10.8+0.13*10

46、0 计算结果为: 1093.000000假定计算时不考虑运算符的优先级,也不允许有( ),而是按照运算符出现的先后顺序执行运算。 main(void) double x,y; char op; inx: printf(input arithmetic expression:n); scanf(%lf,&x); while(op=getchar()!=n) iny: scanf(%lf,&y); switch(op) case +:x+=y; break; case -:x-=y; break; case *:x*=y; break; case /: if(y) x/=y; else print

47、f(division is zero,input y againn); goto iny; break; default: printf(illegal operator,input againn); goto inx; printf(%8.4fn,x);开始 输入系数a,b,cd=b*b-4*a*cd=0例4.12:用流程图描述求解一元二次方程的根x1=(-b+sqrt(d)/2x2=(-b-sqrt(d)/2输出x1,x2p=-b/2q=sqrt(-d)/2输出x1,x2结束TF例4.13 输入一段C语言程序(一个正文),按原来格式复制到输出,复制过程中删除输入程序中所有的注释。此处注释专

48、指“/* */”的注释。1 算法分析程序先要输入,在C语言中,当从键盘输入时,先将输入数据放入键盘缓冲区中,当接受到回车符后,程序才开始从键盘缓冲区中读数据。分析之前,首先,弄明白问题的意思。程序要求输入一段程序(C语言),并将输入的程序在屏幕上输出。在输出时将程序中的注释(/* */)过滤,既不输出注释。输出时要将注释过滤掉,首先要判别什么内容是注释内容。例: while(ab) /*while a b */ printf(“*/”);字符的类型,仅从字符本身是无法区分的。如上面的串中,字符串while可能是普通字符串,也可能是注释字符串。同样,对“*/”字符,与/*配对是注释字符,否则就是

49、普通字符。因此,需要一个类型标志 state 。因此,字符的类型标志可取为: 普通字符(COPY)、注释开始(START)、注释字符(COMMENT)、注释结束(END)。因此,在C程序中,从注释的角度来看,字符共有四种,普通字符、注释开始字符、注释结束字符及注释字符。while(ab) printf(“*/”); 为普通字符,while ab 为注释字符,/* */ 为注释标志字符。参照下例开始程序设计。开始时,state 置普通字符状态。在普通字符状态,如果输入字符不是/,则将字符原样输出,如果输入字符为/,在开始注释状态,如果输入字符为*,while(ab) /*while a b */

50、 printf(“*/”); 则可能开始注释,将state 设为注释状态,字符 / 不输出;参照下例开始程序设计。开始时,state 置普通字符状态。在普通字符状态,如果输入字符不是/,则将字符原样输出,如果输入字符为/,在开始注释状态,如果输入字符为*,表明注释开始,state置为注释状态;如果输入字符不是*,while(ab) /*while a b */ printf(“*/”); 则可能开始注释,将state 设为注释状态,字符 / 不输出;参照下例开始程序设计。开始时,state 置普通字符状态。在普通字符状态,如果输入字符不是/,则将字符原样输出,如果输入字符为/,在开始注释状态,

51、如果输入字符为*,表明注释开始,state置为注释状态;如果输入字符不是*,表明前面设置的注释开始状态不对,state改为普通字符状态;然后将/输出,接下将刚输入的字符原样输出。在注释状态,如果输入的字符不是*,字符不加处理,否则,表明注释将要结束,将state置为结束状态。在结束注释状态,如果输入字符为/,表明注释结束,state 置为普通字符状态;否则,仍为注释状态,state置为注释状态。while(ab) /*while a b */ printf(“*/”); 则可能开始注释,将state 设为注释状态,字符 / 不输出;while(c=getchar()!=EOF) if(输入换行

52、符)输出换行符 else switch(state) 普通字符状态: if (输入字符 /) 字符状态设为 START; else 字符原样输出 开始注释状态: if (输入字符 *) 注释内容从此后开始,状态设为注释 else / 为普通字符 原样输出 / 原样输出输入的字符 将字符状态重新设为 普通字符(COPY) 注释状态: if(输入字符 *) 注释即将结束,状态设为END; 结束状态: if 输入字符 / 注释结束,状态设为COPY else 仍为注释状态 S输出c输出nFc=nc=/S=START输出/输出cc=*S=COMMc=/S=COPYS=COMMc=*S=ENDS=COP

53、YTCOPYSTARTCOMMEND输入字符赋给c,c!=EOF循环体底部TTTTFFFFs=COPY循环流程图演示#include#define COPY 0#define START 1#define COMMENT 2#define END 3int main(void)char c; int state; state=COPY; printf(input C program end of crtl+z:n);while(c=getchar()!=EOF) if(c=n)putchar(n); elseswitch(state)case COPY: if (c=/) state=STAR

54、T; else putchar(c);break;case START: if (c=*)state=COMMENT; elseputchar(/);putchar(c);state=COPY; break;case COMMENT: if(c=*) state=END; break;case END: state=(c=/)?COPY:COMMENT; break;返回例4.14 利用getch函数,编写密码输入程序。输入密码时,屏幕上不显示输入内容,而代之以“星号”之类的内容,以防他人看到密码。#include#includemain() char c=0; printf(请输入密码:n)

55、; while(c!=13) c=getch(); putchar(*); putchar(n);一、函数过程的概念 过程是现代过程式语言的重要概念。在程序设计中,离开了过程就谈不上结构化程序设计。 过程是程序设计中的一个逻辑单元,是一段程序,能完成某一项简单的功能。过程与程序的关系类似于机器中的零部件与机器之间的关系。 如系统提供的 sin(x) 函数,就是一个函数过程。它是系统提供的求变量(参数) X 的正弦值的过程。系统中有许多这样的过程,如 sqrt,strcat等。第五章 函数二、过程的优点:1、利用过程可以把程序划分为若干个独立的逻辑单元,每一个单元相对于整个程序小得多,故其调试更

56、容易; 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()int i,j,k,ic,jc,kc;float r

57、esult;scanf(%d,%d,&j,&k);jc=1;for(i=1;i=j;i+)jc=jc*i;kc=1;for(i=1;i=k;i+)kc=kc*i;result=(jc-kc)/(float)kc;printf(the result=%fn,result);3 源程序代码之二#includefloat jc(int);main() int i,j,k,ic,jc,kc; float result; scanf(%d,%d,&j,&k); result=( jc(j)- jc(k) )/ jc( k ); printf(the result=%fn, result);float j

58、c(int n) int i; float j=1.0; for(i=1; i=n; i+) j=j*i; return j;函数定义函数说明参数返回值问题:在主函数和函数 jc 中都定义了变量 j,它们之间的关系如何?例5.2 编写程序,利用递归调用方式,计算n!。 递归公式总是有一个结束条件,这个结束条件称为”边界条件”,如n!的边界条件为n1) C=计算n!可以用下式定义:n!=n(n-1)(n-2)(n-3)21int fact(n) int f; if(n=1) f=1; elsef=fact(n-1)*n; return f;#includeint fact(int);main()

59、int i,n;scanf(%d,&n);i=fact(n);printf(n!=%d,i);例5.3 编写程序,利用递归调用方式计算两个数m、n的最大公约数。(其中mn,且n0)分析:本例采用辗转相除法来计算两个数m,n的最大公约数。过程:m除以n,如余数r=0,则n 就是最大公约数。如r0,则mn,nr,再重复上述过程,直到r=0为止,这时的n就是要求的最大公约数. 例:m=112,n=77 被除数 除数 商 余数 112 / 77 1 35 77 / 35 2 7 35 / 7 5 0因此,112和77的最大公约数为7本问题的特点是要多次处理同一个问题,只是处理所用数据不同,且后一次所用

60、数据为前一次处理的结果,正好用递归。运行结果: m,n=? 112,77 gcd =7 /exam63.c#includeint fgcd(int,int);main() int m,n,g; printf(“m,n=?”); scanf(%d,%d,&m,&n); if(nm) printf(input error!); return 1; g=fgcd(m,n); printf(“gcd%dn,g); return 0;fgcd(m,n) int g; if(n=0) g=m; return g; else fgcd(n,m%n);例 5.4 设口袋中放着12个球,其中3 个是红的,个是白

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论