C语言程序设计(16)_第1页
C语言程序设计(16)_第2页
C语言程序设计(16)_第3页
C语言程序设计(16)_第4页
C语言程序设计(16)_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、I - C 程序设计实验指导书 计算机学院计算机实验教学中心 2007.9 - II - 前言 本实验指导书根据实验教学的需要,重点讲述了 C 语言程序设计以下几个方 面的内容,包括顺序结构、选择结构、循环结构、数组、函数、指针以及结构体 程序设计实习。针对每一个实习,分别指出了相应的实习目的、要求,同时给出 了题型结构丰富的例程分析和实习题目,其中很多都是历年计算机等级考试的真 题,内容紧扣教学大纲,形式不拘一格,生动有趣,有利于同学们循序渐进的学 习 C 程序设计。 本书不仅可以作为普通院校学生的 C 语言编程上机实习指导教材,也可作为 广大读者朋友自学 C 编程的实用教程。 由于时间仓促

2、以及水平有限,错误与不足之处难免存在,敬请广大读者给与 批评指正! - III - 目录目录 第第 1 章章简单简单 C 程序设计程序设计1 1.1目的要求.1 1.2例程分析.1 1.3实习内容.3 第第 2 章章顺序结构程序设计顺序结构程序设计 4 2.1目的要求.4 2.2例程分析.4 2.3实习内容.6 第第 3 章章选择结构程序设计选择结构程序设计 7 3.1目的要求.7 3.2例程分析.7 3.3实习内容.10 第第 4 章章循环结构程序设计循环结构程序设计 12 4.1目的要求.12 4.2例程分析.12 4.3实习内容.15 第第 5 章章函数程序设计实习函数程序设计实习 18

3、 5.1目的要求.18 5.2例程分析.18 5.3实习内容.23 第第 6 章章数组程序设计实习数组程序设计实习 26 6.1目的要求.26 6.2例程分析.26 6.3实习内容.29 第第 7 章章指针程序设计实习指针程序设计实习 31 7.1目的要求.31 7.2例程分析.31 7.3实习内容.35 第第 8 章章结构体程序设计实习结构体程序设计实习37 8.1目的要求.37 8.2例程分析.37 - IV - 8.3实习内容.46 - 1 - 第第 1 章章 简简单单 C 程程序序设设计计 1.1 目的要求 (1) 熟悉 VC6.0 编译系统的组成,熟练掌握上机建立、编写 C 程序的步

4、骤及方法。 (2) 通过简单程序的编写进一步巩固所学的理论知识。 (3) 掌握基本输出语句的使用。 1.2 例程分析 【例 1-1】 分析理解以下源程序中 printf 函数的输出格式的定义规则。 行号 源程序 01 main() 02 03 int a,b,c; 04 long int m,n; 05 float x,y; 06 char c1,c2; 07 a=3861; b=48; c=5; 08 x=1; y=2.4; 09 m=12345; n=123456; 10 c1=a; c2=A; 11 printf(n); 12 printf(a=%3d,b=%3d,c=%5dn,a,b,

5、c); 13 printf(x=%8.3f,y=%7.5fn,x,y); 14 printf(m=%6ld,n=%9ldn,m,n); 15 printf(c1=%c, c2=%dn,c1,c2); 16 注:为了便于分析,源程序左侧列有行号,在 TC 集成环境编写源程序时,不能列此行号,下同。 程序运行结果参见图 1-1。 图 1-1 图多种输出格式 - 2 - 输出函数 printf( )的主要输出格式说明如下: 对于对于 printf( )函数引号中的函数引号中的a、b、c2等,程序运行时原样输出。等,程序运行时原样输出。 程序第程序第 11 行中的行中的n表示换行输出,在此将输出表示换

6、行输出,在此将输出 1 空行。第空行。第 12 行变量行变量 a 的值为的值为3861是是 4 位,位, 大于大于a=%3d中的中的3,所以此处的,所以此处的 3 不起作用。而不起作用。而 b 中的中的48是是 2 位,比位,比b=%3d 少少 1 位,所位,所 以输出的以输出的48与等号间有与等号间有 1 个空格。同理,个空格。同理,c 输出的结果输出的结果5与等号间有与等号间有 4 个空格。个空格。 程序第程序第 13 行中的行中的%8.3和和%7.5,其小数点前的,其小数点前的 8 和和 7 是定义包括小数点在内的总位数宽是定义包括小数点在内的总位数宽 度,后面的度,后面的 3 和和 5

7、 是定义小数的位数。其中是定义小数的位数。其中x=%8.3f是定义按是定义按 3 位小数、位小数、8 位列宽格式输出,而位列宽格式输出,而 x 里存放里存放 1,所以小数部分要添,所以小数部分要添 3 个个 0,这样整数、小数点和小数部分合起来共占,这样整数、小数点和小数部分合起来共占 5 位列宽,所以位列宽,所以 整数整数 1 与等号间有与等号间有 3 个空格。个空格。y=%7.5f是定义按是定义按 5 位小数、位小数、7 位列宽格式输出,而位列宽格式输出,而 y 中存放中存放 2.4, 小数仅有小数仅有 1 位,所以后面需添位,所以后面需添 4 个零,个零,5 位小数位位小数位+1 位小数

8、点位位小数点位+1 位整数位位整数位7 位,输出宽度正位,输出宽度正 好占用好占用 7 位,所以整数位,所以整数 2 与等号之间没有空格。依此总结出小数位后添零、整数位前添空格的规则,与等号之间没有空格。依此总结出小数位后添零、整数位前添空格的规则, 读者不难自行分析出读者不难自行分析出 14 行的输出格式。行的输出格式。 宽度定义为负数(如宽度定义为负数(如%-8.3d)时,通常控制小数位后面的空格。即整数位)时,通常控制小数位后面的空格。即整数位+小数点小数点+小数位小数位 的总位数不足定义宽度(如前面的的总位数不足定义宽度(如前面的-8) ,则在最后,则在最后 1 个小数位后面添空格。个

9、小数位后面添空格。 第第 15 行行c1=%c中的中的%c指定按字符格式输出,所以字符变量指定按字符格式输出,所以字符变量 c1 按原类型输出字符按原类型输出字符a,而,而 c2=%d,指定按,指定按 10 进制数格式输出,所以字符变量进制数格式输出,所以字符变量 c2 中的字符中的字符A按按 10 进制进制 ASCII 码输出码输出 65。 以上仅仅是 printf( )函数的部分输出格式,它能完成的格式定义远不至此,其格式定义十 分灵活、方便、实用。读者可在今后上机实习中,认真体会总结,融会贯通。 【例 1-2】 已知两个变量 a,b,其值分别为 100 和 200,编程求它们的和 SUM

10、。 分析:根据题意 3 个变量 a、b、SUM 之间的关系为 SUM=a+b,这是程序编写的基础。而变 量 a,b 的值已知,可用赋值语句而不必从键盘输入。 源程序 1: main() int a, b ,SUM; /*严格区分大小写*/ a=100; b=200; /*给两个变量 a,b 赋值*/ SUM=a+b; /*将 a,b 两个变量值的和赋给变量 SUM*/ printf(SUM is %d n,SUM); /*输出结果 SUM*/ 说明: C 程序在定义变量的同时可以赋值,这样前程序在定义变量的同时可以赋值,这样前 3 行语句可简化成如下写法:行语句可简化成如下写法: int a=

11、100,b=200, SUM; - 3 - 这样可以使程序更加简洁。这样可以使程序更加简洁。 通常程序的赋值不仅是具体的数据,还可以是变量或表达式等,自然通常程序的赋值不仅是具体的数据,还可以是变量或表达式等,自然 C 语言编程也不例外。语言编程也不例外。 为了体验这些赋值语句的应用,可将为了体验这些赋值语句的应用,可将【例例 1-2】源程序源程序 1 改写成如下的源程序改写成如下的源程序 2 形式。形式。 源程序 2: main() int SUM , a=100, b=200; /*定义变量 a,b 的同时赋值*/ SUM= a; /*变量 a 的值赋给 SUM,即 SUM=100*/ S

12、UM=SUM+b; /*表达式赋值,将 SUM(其值为 100)+b(其值为 200)再赋 给 SUM*/ printf(SUM is %d n,SUM); /*输出结果 SUM*/ 源程序 2 将与源程序 1 的结果完全一样。 程序中第程序中第 6 条语句条语句SUM=a+b,是依据解题要求作出的算法分析,再结合,是依据解题要求作出的算法分析,再结合 C 语言的语法规则语言的语法规则 建立建立 a,b,SUM 等变量间的表达式关系。依据题意作出算法分析,是程序编写的切入点,望能引等变量间的表达式关系。依据题意作出算法分析,是程序编写的切入点,望能引 起读者的注意。起读者的注意。 1.3 实习

13、内容 1-1 验证以下每个 printf 函数的显示结果是什么? 1) printf (%9.4fn,123.456); 2) printf (%-9.4fn,123.456); 3) printf (%*dn,4,2345); 4) printf (%4cn,d); 1-2 验证以下逻辑表达式的值,设 a=3,b=4,c=5。 1) a+bc float b; a=4; b=9.5; - 4 - printf(a=%d,b=%4.2fn,a,b); - 5 - 第第 2 章章 结结构构化化程程序序设设计计顺顺序序结结构构 2.1 目的要求 (1)进一步熟悉 VC6.0 编译系统。 (2)掌握

14、赋值语句的使用。 (3)掌握数据的输入、输出方法,能正确的使用各种格式转换符。 (4)掌握顺序结构程序设计的方法。 2.2 例程分析 【例 2-1】 已知一个圆柱体的半径 r 为 6,高 h 为 7,求圆柱体的体积。(单位省略) 源程序: #define PI 3.14159 /*定义圆周率的值*/ main( ) float r, h; float s; float v; /*定义四个浮点型变量*/ r=6.0; h=7.0; /*给变量 R,H 赋值*/ s=PI*r*r; /*计算底面积*/ v=s*h; /*计算圆柱体体积*/ printf(圆柱体的体积为%fn,v); 说明:这是一个

15、非常简单的关于数学问题的 C 语言程序,对于刚刚学习 C 语言的人来说,经 常出现语法上面的错误。比如: 忘记了忘记了 C 语言一条语句的最后应该加上语言一条语句的最后应该加上;。 数学中的数学中的乘乘在在 C 语言编程语句中应该写成语言编程语句中应该写成*,而不能省略或者用数学中的其他写法。,而不能省略或者用数学中的其他写法。 C 语言的语法规则规定在定义变量的时候数据类型和变量名之间应该有空格,这个很多初学者语言的语法规则规定在定义变量的时候数据类型和变量名之间应该有空格,这个很多初学者 容易犯错。容易犯错。 【例 2-2】 下面程序是求四个数的算术平均值,标有“*”行有错,请改正。 ma

16、in( ) 图 2-1 求圆柱体积流程 计算体积 v=s*h 开始 输出结果 结束 给 r、h 赋值 计算面积 s=*r*r - 6 - int a,b,c,d; float s; printf(please input the num:n); * scanf(%f,%f,%f,%f,a, b, c, d); * s=a+b+c+d/4.0; * printf(%d,s); 分析:分析:本题要求四个数的算术平均数,结合给出的源程序不难看出语句int a,b,c,d; 和float s;分别定义了 4 个整数和一个浮点数 s(用来存放算术平均数的值,读者可以思考这里为什么 不将 s 的类型定义为

17、int?);紧接着语句printf(please input the num:n);执行在屏幕上输出提 示信息,告知操作者需要从键盘上面输入数据;下面看第一个标有*的语句,可以容易看出 是从键盘上面输入 4 个数据,初学者在这点上面很容易糊涂,看很多遍都认为没错,而且对于 此语句,在 Turbo C 2.0 的环境下编译时根本不会提示语法错误。我们得结合函数 scanf(格式 说明符,变量地址列表)的语法格式来看,从语法上来看,后面的变量地址列表在变量的前面 有取地址符改成 float a,b,c,d;而 scanf 语句中的%d不改呢?答案是 否定的。因为本题int a,b,c,d;语句前面

18、没有错误标识*,对于改错题我们只能修改错误行, 其他的地方都是不能更改的。所以此句只能改成scanf(%d,%d,%d,%d, 接下来语句s=a+b+c+d/4.0;很明显是求 4 个数的算术平均值并将其赋给变量 s,初一看,此行 没有错误,很多人就认为是在求 4 个数的算术平均值,结合数学知识和 C 语言算术运算符之 间优先级关系,就不难发现错误所在,语句s=a+b+c+d/4.0;表达的意思是将 a,b,c 三者的和 加上 d 的 1/4,然后将和赋给变量 s,结合题意应该改成s=(a+b+c+d)/4.0;,这个语句的错误不 像前面那条语句是语法上面的错误,而是逻辑上的错误,这一点是改错

19、题中比较难发现的,这 就要求改错前必须理解程序代码的意思,否则无从改起。 语句printf(%d,s);,对于本题即使此行不改,在 Turbo C 2.0 环境下编译时也没有语法错误 提示,只是显示出来的结果有问题。可以返回上面看程序,s 变量定义的类型是 float,所以在 输出的时候应该以%f的格式输出。 修改后的正确源程序如下: main() int a,b,c,d; float s; printf(please input the num:n); scanf(%d,%d,%d,%d, s=(a+b+c+d)/4.0; printf(%f,s); - 7 - 说明:说明:对于改错题主要是

20、考察大家阅读程序的能力,在学习语言、培养编程能力的过程中培养 阅读程序的能力是非常重要的。这也是本书设置此类题型的一个重要原因。对于改错题需要遵 循的一个重要原则是只能修改错误行的代码,不得更改其它地方,更不能随意更改题目给出的 代码的结构,这一点切记! 程序出错主要在两个方面:一是语法错误,二是逻辑错误。对于前者需要扎实的理论 基础,后者需要比较强的阅读程序的能力和编程能力。 2.3 实习内容 2-1 以下程序数入三个整数给 a,b,c,程序把 b 中的值给 a,把 c 中的值给 b,把最初 a 中的值给 c,然后输出 a,b,c 的值,请填空。 main( ) int temp; prin

21、tf(Enter a,b,c); scanf(%d,%d,%d, ); a=b; b=c; printf(a=%d,b=%d,c=%dn,a,b,c); 2-2 已知直角三角形的两个直角边长分别为 3,4,求此直角三角形的斜边长 c 及面积 S。 2-3 下面程序是求半径为 r,高为 h 的圆锥体的体积 v,标有*的行有错,请改正。 main() float r,h,v; * scanf(%d,%d,r,h); * v=3.14*r*r*h; * printf(v=%d, - 8 - 第第 3 章章 结结构构化化程程序序设设计计选选择择结结构构 3.1 目的要求 (1)进一步熟悉 VC6.0

22、编译系统。 (2)掌握 C 语言的条件选择结构的编程(if、switch 语句) 。 (3)了解 C 语言表示逻辑量的方法(0 代表逻辑假,1 代表逻辑真) 。 (4)学会正确的使用逻辑运算符和逻辑表达式。 (5)通过简单程序的编写进一步熟悉、巩固所学的理论知识。 3.2 例程分析 【例 3-1】 编程找到并输出 3 个数中最大的数。 分析:计算机解题,首先需要将 3 个数输入计算机,计算机为了正确区分和找到这 3 个数,因 此需要将输入的 3 个数存放到指定的位置,这就是计算机编程中常说的定义变量、为变量赋值。 定义变量主要是说明要存放的数据类型以便为其分配存储单元,相当于为数据指定存放位置

23、; 为变量赋值,就是将数据存放到指定的位置。针对此题,需定义 3 个变量,可以为变量取名为 a、b、c,将 3 个数分别赋给 a、b、c,另外,再定义一个变量 max存放比较结果最大数。 计算机一次只能比较两个数,首先将 a 与 b 比,大的数放入 max中,再把 max与 c 比,又把大 的数放入 max中。最后,输出 max中存放的数,就是 a、b、c 3 个数中最大的数。算法可以表 述为: a)输数存入 a、b、c。 b)a 与 b 中大的一个放入 max中。 c)把 c 与 max中大的一个放入 max中。 d)输出 max,max即为最大数。 其实这种算法表述,是人们交流的自然语言表

24、述,不利于转化为程序语句,设计程 序的算法语言还需 细化,如上面算法表述中的 b)、c)句可作如下相应 的修改。 其中第 b) 把 a 与 b 中大的一个放入 max中,应表述为: 若 a b,则 max a;否则 max b。 而将第 c) 把 c 与 max中大的一个放入 max中,应表述为: 若 c max,则 maxc。 修改后的、方便编程的算法语言应该写成:修改后的、方便编程的算法语言应该写成: 1)a数 1;b数 2;c数 3。 2)若 a b,则 maxa;否则 maxb。 3)若 c max,则 maxc;否则 max 不变。 - 9 - 4)输出 max,max即为最大数。

25、依据编程算法可绘出程序流程图,参见图 2-1。 根据上面的分析,不难写出其对应的 C 语言程序语句, 源程序如下: main() int a,b ,c , max ; /*定义四个变量*/ scanf(%d,%d,%d, if (ab) max=a; /*a 大时,maxa*/ else max=b; /*b 大时,maxb*/ if (cmax) /*a 或 b 大值与 c 比较*/ max=c ; /*c 大时,maxc*/ printf (%d, max); /*输出max */ 说明: 从前面的算法分析以及源程序的写出,读者不难看到,对于 C 程序的编写,可以根据流程图 结合算法语句将

26、其转化成相应的 C 程序语句。 【例3-2】 下面程序功能为:读入两个数x、y,将大数存入x,小数存入y。请完善程序中的空 缺行。 # include main( ) int x,y,t; printf(input x,y:); scanf (%d,%d , ) ; if (x=y,只需顺序打出,否则,应将x,y中的数进行交换,然 ab maxamaxb 开始 输出 maxc cmax 结束 YN N Y 图 3-1 输出 3 个数中的最大数 输入 a、b、c - 10 - 后输出。两数交换必须使用一个中间变量t,定义三个浮点数x、y、t。 算法: 1)读入x、y; 2)大数存入x,小数存入y

27、; 3)输出x、y。 第2步具体化: 若xy,则交换x与y; 再具体化,x与y交换; tx xy yt 算法的流程图见图2-2,程序如下: # include main( ) int x,y,t; printf(input x,y:); scanf (%d,%d , if (xy) t=x ; x=y ; y=t; /*将两者的值交换*/ printf (result:%dt%dn,x,y); 执行结果: input x,y :1 ,5(回车) result : 5 1 说明: 上面程序中用到的2个数的交换算法是一种常用算法,希望读者能够理解并加以运用。 if语句中,有时需要执行的语句不止一条

28、,这就要用到复合语句。就像上面的程序一 样。复合语句,就是用一对花括号括起来的一条或多条语句,形式如下: 语句1; 语句2; Y N xy tx; xy; yt 开始 输出 结束 图 3-2 大数存 x 小数存 y 输出 输入 x、y - 11 - . 语句n; 无论包括多少条语句,复合语句从逻辑上讲,被看成是一条语句。复合语句在分支结 构、循环结构中,使用十分广泛。对于复合语句,许多C语言初学者不容易把握,有些人根本 没有用大括号的概念,有些人不知道该用大括号包括哪些语句,这个得根据具体的程序流程来 定。 【例3-3】 编写程序,当输入x后,输出如下函数表达式中y的值。 ()00 ()05

29、()5510 - ()2510 源程序如下: main ( ) float x , y; printf(please input x :); scanf (%f, if(x0) y=0; if(0=x if(5x printf(%.2fn,y); 3.3 实习内容 3-1 当 a,b,c 的值分别为 3,4,5 时,以下各语句执行后 a,b,c 的值为多少?请将其用程序 的形式实现。 1)if (ac) a=b;b=c;c=a; else a=c;c=b;b=a; 2)if (ab)temp=b;b=a;a=temp; if(ac)temp=a;a=c;c=temp; if(ad)temp=a

30、;a=d;d=temp; if(bc)temp=b;b=c;c=temp; if(bd)temp=b;b=d;d=temp; if(cd)temp=c;c=d;d=temp; * printf(%d,%d,%d,%dn,d,c,b,a); 3-4 有一函数: )10( )101 ( ) 1( 113 12 X X X X X X y 下面程序,输入x,输出y,请完善程序中空缺的语句行。 main() int x,y; printf(please input the number x:n); scanf(%d, ); if( ) y=3*x-11; else if(x=1) ; else ; p

31、rintf(y=%d,y); - 13 - - 14 - 第第 4 章章 结结构构化化程程序序设设计计循循环环结结构构 4.1 目的要求 (1)掌握 C 语言 for、while、dowhile 循环编程。 (2)掌握在程序设计过程中用循环的方法实现各种算法(如穷举、迭代、递推等) 。 (3)进一步掌握 TC 编译系统程序调试的方法。 (4)巩固所学理论知识的同时锻炼 C 语言编程能力。 4.2 例程分析 【例4-1】 求 n!,下面程序标有*的行有错,请改正。 main ( ) int n,i; * int s; printf(please input n (n=0) :); scanf (

32、 %d , if (n=0) * s=0; if (n0) i=1; while (i=0) :); scanf ( %d , if (n=0) s=1; /*n=0时其阶乘为1*/ if (n0) i=1; while (i=0):0 0!= 1 说明:long int s,在定义s变量时,一定要注意溢出问题。int型数的取值范围是-32768至 32767;如果数值过大,会产生溢出而得不到正确的结果。所以在这个题目当中定义成了长整型 数,它的取值范围是-231至(231-1) 。 【例4-2】 下面程序输出100以内能够同时被3和5整除的整数。请完善程序中的空缺行。 - 16 - main

33、() int i=1; while( ) if( ) printf(%dn,i); ; 分析:根据题义可以知道数据num范围在1100之间,被3整除表示成C语句,即num%3=0, 同理,被5整除即为num%5=0; 第一空由于程序用的是while循环,显然这个地方需要填写 循环条件,结合本题知数据在100以内,所以可以填为 i=100,第二空是一个逻辑判断,紧 接着下面一条语句是输出数据,所以上面应该是满足题目所要求的条件,由前面的分析容易知 道该空的内容。第三空是循环控制变量的变化,从题目的要求可知应该是每次增加1,所以参 考源程序如下: main() int i=1; /*在这里i 可以

34、理解为循环控制变量,赋初值1*/ while(i=100) /*循环控制条件,100以内的整数*/ if(i%3=0 /*打印出满足条件的整数*/ i+; /*i值增1*/ 下面给出用for语句实现题目要求功能的另外一种解法,以便拓宽读者的思路。 main( ) int i; for(i=1;i=100;i+) /*给i 赋出值1,循环控制条件i100*/ if(i%3=0 /*打印出满足条件的整数*/ - 17 - 说明: 初学者应注意将同时被3和5整除这句话用正确的C语句语法格式为: i%3= =0表达式2;表达式3)语句,其中表达式1与表 达式2后面均有;(分号) ,往往容易忽略或错误用

35、成,(逗号) 。 当循环体中语句多于一条的时候一定得加上 ,这是初学者写程序很容易出错的环 节,漏掉了 ,程序没有语法错误,但是却得不到正确的结果。 有时在满足某种条件的情况下不执行循环体中的所有语句而提前开始下一轮循环,这 时候就要用到循环的辅助语句: continue语句。continue语句只能用在循环结构中,一旦执行 了continue语句,程序就跳过循环体中位于该语句后面的所有语句,提前结束本次循环周期而 进行下一个循环周期。如果continue语句用在嵌套循环中,那么它只影响包含它的最内层循环。 运用continue语句可以将解法2中源程序改为如下形式: main() int i;

36、 for(i=1;i=100;i+) if(i%3=0 else if(i%3=0) printf(%dn,i); 有时,需要在循环体中提前跳出循环,这时就要用到另一个循环辅助语句:break语 句。break语句可以使程序提前跳出循环体,结束循环。通常,如果存在两个相互独立的理由 离开循环时,应该使用break语句。如果在嵌套循环中使用了break语句,它只影响包含它的最 内层循环。在条件分枝结构中用到的break语句也是跳出switch语句而进行后面其他的程序语句。 4.3 实习内容 4-1 打印半径为1到1 0的圆的面积,若面积超过1 0 0,则不予打印。 4-2 计算半径为1到1 5的

37、圆的面积,仅打印出超过5 0的圆面积。 4-3 下面程序是输出100200间所有的素数。标有*行有错,请改正。 #include main() int num,k,i; - 18 - * for(num=200,num100;num+); k=sqrt(num); * for(i=2;ik) printf(%d is a prime number.n,num); 4-4 编写程序将1100之间所有不能被7整除的数打印出来。 (计算机等级考试试题) 4-5 编写程序求100以内整数中为13的倍数的最大值。 (计算机等级考试试题) 4-6 下面程序功能为:找出能被3整除,且至少有一位是5的两位数k

38、, (个位为a1,十位为 a2) ,打印出所有这样的数及其个数n。请完善程序中空缺的语句行。 main() int k,a1,a2,n=0; for(k=10;k=100;k+) a1= ; a2= ; if( ) printf(%d ,k); ; printf(%dn,n); 4-7 下面程序计算S=1-1/3+1/5-1/7+1/(2*n+1)的值。请完善程序中空缺的语句行。 main() int i=0,n; float s=0.0,w,f=-1.0; do printf(Please input N:); - 19 - scanf(%d, while( ); for(i=0;in) z

39、=m; - 22 - else z=n; return z; /*函数返回两者中的最大值*/ int mini(int m,int n) /*求两者中较小者的函数*/ int z; if(mn) z=n; else z=m; return z; /*函数返回两这种的最小值*/ 说明: 利用函数,不仅可以实现程序的模块化,使程序设计变得简单和直观,提高了程序的易读性和利用函数,不仅可以实现程序的模块化,使程序设计变得简单和直观,提高了程序的易读性和 可维护性,而且还可以把程序中普遍用到的一些计算或者操作编成通用的函数。以共随时调用,这可维护性,而且还可以把程序中普遍用到的一些计算或者操作编成通用

40、的函数。以共随时调用,这 样可以大大的减轻代码的数量和冗余量,而且也可以提高程序的开发效率。样可以大大的减轻代码的数量和冗余量,而且也可以提高程序的开发效率。 对于上面的自定义函数对于上面的自定义函数maxi(),mini(),如果充分的运用,如果充分的运用 C 语言中的问号语句,我们还可以作语言中的问号语句,我们还可以作 如下简化。如下简化。 maxi(int m,int n) mini(int m,int n) int temp; int temp; temp=mn?m:n; temp=mn?m:n; return(temp); return(temp); 运用函数的嵌套调用运用函数的嵌套

41、调用,我们还可以将上面解法中我们还可以将上面解法中 main 函数的函数调用语句做进一步的改进函数的函数调用语句做进一步的改进, 如下所示如下所示: 将maxt=maxi(a,b);,max=maxi(maxt,c);这两条语句改写成: max=maxi(a,maxi( b,c)。 将mint=mini(a,b);,min=mini(mint,c); 这两条语句改写成: min=mini (a,mini( b,c)。 【例 5-3】编写一个数据交换函数 swap(x,y),调用该函数对两个形参变量进行交换,观察程序 运行结果。 分析:进一步巩固、加深理解值传递中,形参与实参的关系。分析:进一步

42、巩固、加深理解值传递中,形参与实参的关系。 - 23 - main() void swap(); /*函数的原型声明*/ int a,b; printf(a=); scanf(%d, printf(b=); scanf(%d, swap(a,b); printf(交换后实参:a=%d b=%dn,a,b); /*函数交换后的结果 */ void swap(int x,int y) int t; printf(交换前形参:x=%d y=%dn,x,y); t=x;x=y;y=t; printf(交换后形参:x=%d y=%dn,x,y); 程序运行结果程序运行结果:(假如假如 a,b 的初始值分

43、别为的初始值分别为 3,4) 交换前形参:x=3,y=4 交换后形参:x=4,y=3 交换后实参:a=3,b=4 说明: C 语言中实参、形参之间的传递,有两种方式,一种是值传递,另一种是地址传递。上面程序语言中实参、形参之间的传递,有两种方式,一种是值传递,另一种是地址传递。上面程序 它们之间使用的是值传递,在值传递方式下,被调函数对于形参变量值的改变不会影响主调函数中它们之间使用的是值传递,在值传递方式下,被调函数对于形参变量值的改变不会影响主调函数中 实参值的改变,这一点,上述程序可以说明。如果,实参、形参之间采用的是地址传递,那么形参实参值的改变,这一点,上述程序可以说明。如果,实参、

44、形参之间采用的是地址传递,那么形参 值的变化就会影响实参的变化。地址传递,将在后面的实习中练习。读者若有兴趣,也可以自己试值的变化就会影响实参的变化。地址传递,将在后面的实习中练习。读者若有兴趣,也可以自己试 着先练习。着先练习。 【例 5-4】下面函数是求 s=1!+2!+20!的值。请完善程序中的空缺行。 main( ) ; int m ; float s=0.0 ; for(m=1;m=20;m+) s+= ; printf(s=1!+2!+3!+.+20!=%f,s); - 24 - float fun( int n ) float z; if(n=0) z=1; else ; ; 分

45、析:从程序的结构可以看出采用了函数调用的形式,第 1 空我们就可以判断不是变量的声明 或定义,应该是自定义函数的原形声明;第 2 空属于 for 循环的循环语句,暂时不知道该填什 么,接着往下读程序,输出语句输出变量 s 的值,结合题意知 s 就是要求的阶乘和,所以第 2 空就是在求阶乘,并且是函数调用的形式。第 3、4 空在自定义函数中,显然此函数功能为求 n 的阶乘(形参为 n) 。 由数学中阶乘的求解方法可知,对于任意自然数 n(大于 1) ,它的阶乘等于自然数 n-1 的阶乘 n。即 fun(n)=fun(n-1)*n。自定义函数须将其计算的结果返回,即为第 4 空语句需完成的功 能。

46、由上分析,参考源程序如下: main( ) float fun( ); /*函数的原型声明*/ int m ; float s=0.0 ; /*注意变量的类型*/ for(m=1;m=20;m+) /*用一个循环实现 120 的阶乘和*/ s+=fun( m ); printf(s=1!+2!+3!+.+20!=%f,s); float fun( int n ) /*求 n 的阶乘*/ float z; if(n=0) z=1; else z=fun(n-1)*n ; /*递归调用*/ return z; 说明: 对此程序请注意变量对此程序请注意变量 s 的定义类型。程序中变量的定义类型。程序

47、中变量 s 用来存放用来存放 20 个数的阶乘和,一般习惯定义个数的阶乘和,一般习惯定义 s 变量类型为变量类型为 int,在这里,在这里 s 的值很大,已经超过了的值很大,已经超过了 int 类型数据的最大范围,可以将它定义成类型数据的最大范围,可以将它定义成 long int 或者或者 float 类型。类型。 - 25 - 程序中对于阶乘的求法使用了递归调用的方法,也可以用一个循环累乘的方法实现,请读者自程序中对于阶乘的求法使用了递归调用的方法,也可以用一个循环累乘的方法实现,请读者自 己完成。递归调用的一个最大优点就是使程序简洁、紧凑,但是在使用递归调用时,一定要注意避己完成。递归调用

48、的一个最大优点就是使程序简洁、紧凑,但是在使用递归调用时,一定要注意避 免无穷递归,这就需要设定一个条件,只有在满足条件时才进行递归调用,否则不再继续。免无穷递归,这就需要设定一个条件,只有在满足条件时才进行递归调用,否则不再继续。 5.3 实习内容 5-1 下面程序是用函数调用计算17的平方及平方和。程序中标有*行有错,请改正。 # include * int header( ) void square(int number); void ending( ); int sum; main( ) int index; header(); for (index =1;index =7;index

49、+) square(index); ending( ) ; * int header( ); * sum =1; printf(This is the header for the square programnn); * void square(number) int numsq; numsq = number * number; sum += numsq; printf(The square of %d is %dn,number,numsq); void ending( ) printf(nThe sum of the squares is %dn,sum); - 26 - 5-2 写一

50、个判断素数的函数,在主函数中输入一个整数,输出是否是素数的信息。 5-3 下面程序使给定的一个二维数组(33)转置,即行列互换。完善程序中的空缺行。 #define N 3 int arrayNN; convert( ) int i,j,t; for(i=0;iN;i+) for(j=i+1;jN;j+) t=arrayij; ; arrayji=t; main() int i,j; for(i=0;iN;i+) for(j=0;jN;j+) scanf(%d, for(i=0;iN;i+) for(j=0;jN;j+) printf(%d ,arrayij); printf(n); ; fo

51、r(i=0;iN;i+) for(j=0;jN;j+) printf(%d ,arrayij); printf(n); 5-4 下面程序使输入的字符串按反序存放,程序中标有*行有错,请改正。 main() void inverse( ); - 27 - char str100; * scanf(%c,str); * inverse(str100); printf(The converted str is:%sn,str); * void inverse(int str) char t; int i,j; * for(i=0;j=strlen(str);istrlen(str);i+,j-) t

52、=stri ; stri=strj-1; strj-1=t; - 28 - 第第 6 章章 数数组组程程序序设设计计 6.1 目的要求 (1)掌握一维数组、二维数组的定义、赋值和输入输出的方法。 (2)掌握 C 语言字符数组和字符串函数的使用。 (3)掌握与数组有关的相关算法,如排序算法等。 (4)进一步巩固 C 语言循环结构程序的设计。 (5)巩固所学的理论知识,培养、锻炼 C 语言程序程序设计的能力。 6.2 例程分析 【例 6-1】 下面程序将 09 的值赋给一个一维数组中的各元素,标有*行有错,请改正。 main() int i; * int a9; * for(i=0,i=9,i+)

53、 ai=i; * for(i=1;i=10;i+) printf(%dn,ai); 分析:因为是 09 共有 10 个数,所以需要一个含有 10 个元素的一维数组。 数组定义,如数组定义,如 int a10是定义一个包含是定义一个包含 10 个元素的存放整数的一维数组,个元素的存放整数的一维数组,C 语言规定数组的语言规定数组的 下标从下标从 0 开始,所以,数组中元素的标号从开始,所以,数组中元素的标号从 a0a9,而不是从,而不是从 a1a10,这是初学者在数组,这是初学者在数组 编程最容易疏忽出错的地方。编程最容易疏忽出错的地方。 如果定义数组如果定义数组 int a10;而对该数组赋值

54、使用而对该数组赋值使用 a1a10下标,这样第下标,这样第 1 个数值至第个数值至第 9 个数值个数值 会相应地赋给数组会相应地赋给数组 a1a9元素,数组的元素,数组的 a0元素因没有赋值而存放的是随机数,又因为数组没元素因没有赋值而存放的是随机数,又因为数组没 有有 a10元素而造成第元素而造成第 10 个数值被漏掉。个数值被漏掉。 如果定义数组如果定义数组 int a10改为改为 int a11,此时,使用,此时,使用 a1a10下标赋值,虽然能得到下标赋值,虽然能得到 10 个数个数 的赋值,但会造成的赋值,但会造成 a0元素的闲置浪费。第一和第三处错误由此可知。元素的闲置浪费。第一和

55、第三处错误由此可知。 - 29 - 第二处错误这个也是初学者最容易犯的,for 语句应该是用;隔开而不是,。 修改后正确的源程序如下: main() int i; /*定义循环控制变量*/ int a10; /*定义包含 10 个元素的整数数组*/ for(i=0;i=9;i+) ai=i; /*为数组的各元素赋值*/ for(i=0;i=9;i+) /*可以写成 for(i=0;i10;i+)的形式*/ printf(%dn,ai); /*打印数组中的每一个元素*/ 说明:对于涉及到数组的 C 语言程序设计,无论是数组元素的赋值或者数组元素的打印、遍 历等等一般都得用到循环结构。 【例 6-

56、2】 从键盘上面为一个 34 矩阵的元素赋初值,并打印出矩阵各元素的值。 分析:根据题义,应该建立一个 3 行 4 列的二维数组来存取数据。 源程序如下: main() int i,j; int a34; for(i=0;i3;i+) /*控制行*/ for(j=0;j4;j+) /*控制列*/ scanf(%d, /*从键盘送入数据*/ for(i=0;i3;i+) /*控制行*/ for(j=0;j4;j+) /*控制列*/ printf(%2d ,aij); /*输出矩阵各元素的值*/ printf(n); 说明: 二维数组以行、列矩阵的形式存储。第一个下标代表行,第二个下标代表列,这意

57、味着按照在二维数组以行、列矩阵的形式存储。第一个下标代表行,第二个下标代表列,这意味着按照在 内存中的实际存储顺序访问数组元素时,列下标比行下标的遍历快一些。内存中的实际存储顺序访问数组元素时,列下标比行下标的遍历快一些。 - 30 - 对于二维数组的各元素的赋值、输出或者遍历,用一个嵌套的对于二维数组的各元素的赋值、输出或者遍历,用一个嵌套的 for 循环来实现,对此初学者往循环来实现,对此初学者往 往不容易建立相应的空间结构概念。但此类求解,比较实用,读者应加强练习。往不容易建立相应的空间结构概念。但此类求解,比较实用,读者应加强练习。 【例 6-3】 以下程序功能:从键盘为一个 44 的

58、矩阵输入数据,输出该矩阵的对角线元素存 放的数以及它们的和。请完善程序中的空缺行。 main( ) int i,j,a44; int sum= ; for(i=0; i4; i+) for(j=0;j4;j+) scanf(%d, for(i=0; i4; i+) for(j=0;j4;j+) if( ) printf(%dn,aij); ; printf(%dn, ); 分析:一个 44 矩阵的下标排列情况: 分析出矩阵对角线元素的下标特征,是编写这个程序的关键。不难看出对角线元素的下标有这 样的关系:主对角线元素的下标 i=j。副对角线元素的下标 i+j= 3; 先来看第 1 空,此处要求

59、为 sum 赋初值,通过阅读后面的程序代码可知 sum 变量就是用来存 发对角线元素和值的,所以必须为其赋初值 0;在此顺便提一下,如果一个变量 s 用来存放一 组数的乘积,那么必须为其赋初值 1;紧接着下来一个嵌套 for 循环完成了数组初值的输入, 再接着下来嵌套 for 循环就是数组元素的遍历,以便寻找满足题目条件的数据,第 2 空条件判 断,要填写条件,结合下面的输出语句,可知这里应该填对角线元素满足的条件 00 10 20 30 03 13 23 33 02 12 22 32 01 11 21 31 主对角线元素副对角线元素 - 31 - i=j int sum=0; for(i=0; i4; i+) /*为矩阵输入数据*/ for(j=0;j4;j+) scanf(%d, for(i=0; i4; i+) /*矩阵元素的遍历,找寻满足条件的数据*/ for(j=0;j4;j+) if(i=j | i+j=3) /*对角线元素满足的条件*/ printf(%dn,aij); /*打印满足条件的对角线元素*/ sum=sum+aij; /*求对角线元素的和*/ printf(%dn,sum); /*打印对角线元素的和*/ 说明: 编程的关键,是在程序编写前,善于分析找出题目求解的特征,建立好

温馨提示

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

评论

0/150

提交评论