已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
- I - C 程序设计实验指导书 计算机学院计算机实验教学中心 2007.9 - II - 前言 本实验指导书根据实验教学的需要,重点讲述了 C 语言程序设计以下几个方 面的内容,包括顺序结构、选择结构、循环结构、数组、函数、指针以及结构体 程序设计实习。针对每一个实习,分别指出了相应的实习目的、要求,同时给出 了题型结构丰富的例程分析和实习题目,其中很多都是历年计算机等级考试的真 题,内容紧扣教学大纲,形式不拘一格,生动有趣,有利于同学们循序渐进的学 习 C 程序设计。 本书不仅可以作为普通院校学生的 C 语言编程上机实习指导教材,也可作为 广大读者朋友自学 C 编程的实用教程。 由于时间仓促以及水平有限,错误与不足之处难免存在,敬请广大读者给与 批评指正! - 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 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 程序的步骤及方法。 (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,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“表示换行输出,在此将输出表示换行输出,在此将输出 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 是定义小数的位数。其中是定义小数的位数。其中“x=%8.3f“是定义按是定义按 3 位小数、位小数、8 位列宽格式输出,而位列宽格式输出,而 x 里存放里存放 1,所以小数部分要添,所以小数部分要添 3 个个 0,这样整数、小数点和小数部分合起来共占,这样整数、小数点和小数部分合起来共占 5 位列宽,所以位列宽,所以 整数整数 1 与等号间有与等号间有 3 个空格。个空格。“y=%7.5f“是定义按是定义按 5 位小数、位小数、7 位列宽格式输出,而位列宽格式输出,而 y 中存放中存放 2.4, 小数仅有小数仅有 1 位,所以后面需添位,所以后面需添 4 个零,个零,5 位小数位位小数位+1 位小数点位位小数点位+1 位整数位位整数位7 位,输出宽度正位,输出宽度正 好占用好占用 7 位,所以整数位,所以整数 2 与等号之间没有空格。依此总结出小数位后添零、整数位前添空格的规则,与等号之间没有空格。依此总结出小数位后添零、整数位前添空格的规则, 读者不难自行分析出读者不难自行分析出 14 行的输出格式。行的输出格式。 宽度定义为负数(如宽度定义为负数(如“%-8.3d“)时,通常控制小数位后面的空格。即整数位)时,通常控制小数位后面的空格。即整数位+小数点小数点+小数位小数位 的总位数不足定义宽度(如前面的的总位数不足定义宽度(如前面的-8) ,则在最后,则在最后 1 个小数位后面添空格。个小数位后面添空格。 第第 15 行行“c1=%c“中的中的“%c“指定按字符格式输出,所以字符变量指定按字符格式输出,所以字符变量 c1 按原类型输出字符按原类型输出字符a,而,而 “c2=%d“,指定按,指定按 10 进制数格式输出,所以字符变量进制数格式输出,所以字符变量 c2 中的字符中的字符A按按 10 进制进制 ASCII 码输出码输出 “65“。 以上仅仅是 printf( )函数的部分输出格式,它能完成的格式定义远不至此,其格式定义十 分灵活、方便、实用。读者可在今后上机实习中,认真体会总结,融会贯通。 【例 1-2】 已知两个变量 a,b,其值分别为 100 和 200,编程求它们的和 SUM。 分析:根据题意 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=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*/ SUM=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 实习内容 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)掌握赋值语句的使用。 (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); 说明:这是一个非常简单的关于数学问题的 C 语言程序,对于刚刚学习 C 语言的人来说,经 常出现语法上面的错误。比如: 忘记了忘记了 C 语言一条语句的最后应该加上语言一条语句的最后应该加上“;“。 数学中的数学中的“乘乘“在在 C 语言编程语句中应该写成语言编程语句中应该写成“*“,而不能省略或者用数学中的其他写法。,而不能省略或者用数学中的其他写法。 C 语言的语法规则规定在定义变量的时候数据类型和变量名之间应该有空格,这个很多初学者语言的语法规则规定在定义变量的时候数据类型和变量名之间应该有空格,这个很多初学者 容易犯错。容易犯错。 【例 2-2】 下面程序是求四个数的算术平均值,标有“*”行有错,请改正。 main( ) 图 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 的类型定义为“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;“语句前面没有错误标识“*“,对于改错题我们只能修改错误行, 其他的地方都是不能更改的。所以此句只能改成“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;“,这个语句的错误不 像前面那条语句是语法上面的错误,而是逻辑上的错误,这一点是改错题中比较难发现的,这 就要求改错前必须理解程序代码的意思,否则无从改起。 语句“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 - 说明:说明:对于改错题主要是考察大家阅读程序的能力,在学习语言、培养编程能力的过程中培养 阅读程序的能力是非常重要的。这也是本书设置此类题型的一个重要原因。对于改错题需要遵 循的一个重要原则是只能修改错误行的代码,不得更改其它地方,更不能随意更改题目给出的 代码的结构,这一点切记! 程序出错主要在两个方面:一是语法错误,二是逻辑错误。对于前者需要扎实的理论 基础,后者需要比较强的阅读程序的能力和编程能力。 2.3 实习内容 2-1 以下程序数入三个整数给 a,b,c,程序把 b 中的值给 a,把 c 中的值给 b,把最初 a 中的值给 c,然后输出 a,b,c 的值,请填空。 main( ) int temp; printf(“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 编译系统。 (2)掌握 C 语言的条件选择结构的编程(if、switch 语句) 。 (3)了解 C 语言表示逻辑量的方法(0 代表逻辑“假“,1 代表逻辑“真“) 。 (4)学会正确的使用逻辑运算符和逻辑表达式。 (5)通过简单程序的编写进一步熟悉、巩固所学的理论知识。 3.2 例程分析 【例 3-1】 编程找到并输出 3 个数中最大的数。 分析:计算机解题,首先需要将 3 个数输入计算机,计算机为了正确区分和找到这 3 个数,因 此需要将输入的 3 个数存放到指定的位置,这就是计算机编程中常说的定义变量、为变量赋值。 定义变量主要是说明要存放的数据类型以便为其分配存储单元,相当于为数据指定存放位置; 为变量赋值,就是将数据存放到指定的位置。针对此题,需定义 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即为最大数。 其实这种算法表述,是人们交流的自然语言表述,不利于转化为程序语句,设计程 序的算法语言还需 细化,如上面算法表述中的 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即为最大数。 依据编程算法可绘出程序流程图,参见图 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 程序的编写,可以根据流程图 结合算法语句将其转化成相应的 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 c main( ) int x,y,t; printf(“input x,y:“); scanf (“%d,%d“ , if (x10) y=2*x-5; 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;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 ; printf(“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 ( “%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() int i=1; while( ) if( ) printf(“%dn“,i); ; 分析:根据题义可以知道数据num范围在1100之间,被3整除表示成C语句,即“num%3=0“, 同理,被5整除即为“num%5=0“; 第一空由于程序用的是while循环,显然这个地方需要填写 循环条件,结合本题知数据在100以内,所以可以填为“ i 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, (个位为a1,十位为 a2) ,打印出所有这样的数及其个数n。请完善程序中空缺的语句行。 main() int k,a1,a2,n=0; for(k=10;kn) z=m; - 22 - else z=n; return z; /*函数返回两者中的最大值*/ int mini(int m,int n) /*求两者中较小者的函数*/ int z; if(mn) z=n; else z=m; return z; /*函数返回两这种的最小值*/ 说明: 利用函数,不仅可以实现程序的模块化,使程序设计变得简单和直观,提高了程序的易读性和利用函数,不仅可以实现程序的模块化,使程序设计变得简单和直观,提高了程序的易读性和 可维护性,而且还可以把程序中普遍用到的一些计算或者操作编成通用的函数。以共随时调用,这可维护性,而且还可以把程序中普遍用到的一些计算或者操作编成通用的函数。以共随时调用,这 样可以大大的减轻代码的数量和冗余量,而且也可以提高程序的开发效率。样可以大大的减轻代码的数量和冗余量,而且也可以提高程序的开发效率。 对于上面的自定义函数对于上面的自定义函数maxi(),mini(),如果充分的运用,如果充分的运用 C 语言中的问号语句,我们还可以作语言中的问号语句,我们还可以作 如下简化。如下简化。 maxi(int m,int n) mini(int m,int n) int temp; int temp; temp=mn?m:n; temp=m * int header( ) void square(int number); void ending( ); int sum; main( ) int index; header(); for (index =1;index b) p=*p1; *p1=*p2; *p2=p; /*完成值的交换*/ printf(“a=%d,b=%d“,a,b); printf(“min=%d,max=%d“,*p1,*p2); 34 程序运行结果: 输入:12,6 输出:a=6,b=12 min=6,max=12 解法 2: main( ) int *p,*p1,*p2,a,b; scanf(“%d,%d“, p1= p2= if(a b) p=p1; p1=p2; p2=p; printf(“a=%d,b=%d“,a,b); printf(“min=%d,max=%d“,*p1,*p2); 程序运行结果:输入:12,6 输出:a=12,b=6 min=6,max=12 说明: 上面两个程序的结果为什么不有不同?先来看看解法1中, if(ab) p=*p1; *p1=*p2; *p2=*p1; 这一组语句,当条件满足时,执行的是*p1 和*p2 的交换,实际上就是 a,b 值的交换,所以程 序运行后,a,b 的值都发生了变化。解法 2 中, if(a b) p=p1; p1=p2; 35 p2=p; 这样一组语句,当条件满足时,执行的是 p1、p2 指针的交换,p1 的值原来为p2 的值原来为 int a; p= “int *p“这条语句只是定义了一个指向 int 数据类型的指针变量,而*p=a,因为 p= /函数的原型声明 main( ) int a,b; int *p1,*p2; scanf(“%d,%d“, * p1=a; * p2=b; if(ab) swap(p1,p2); printf(“%d,%dn“,*p1,*p2); printf(“%d,%dn“,a,b); * swap(int p_1,int p_2) /*执行值的交换*/ * int *p; p=*p_1; *p_1=*p_2; *p_2=p; 分析:第一处错误实际和第二处错误一样,p1 和 p2 都是指针变量,及地址,所以应该将 a,b 的地址 赋给它们;第三处错误是参数类型不匹配,实参 p1 和 p2 都是指针变量,故形参变量应该也是指针 变量才行;第四处是没有搞清楚指针变量和指针变量所指变量的区别, *p_1 和*p_2 表示他们所 36 指的整数而不是指针,所以此处 p 应该定义为整型变量。 修改后正确的源程序如下: swap( ); /函数的原型声明 main( ) int a,b; int *p1,*p2; scanf(“%d,%d“, p1= p2= if(ab) swap(p1,p2); printf(“%d,%dn“,*p1,*p2); printf(“%d,%dn“,a,b); swap(int *p_1,int *p_2) /*执行值的交换*/ int p; p=*p_1; *p_1=*p_2; *p_2=p; 程序运行结果:12,6 6,12 6,12 说明: 上面程序中a,b的值发生了变化。为什么呢? 函数的参数可以是简单数据类型,也可以是指针类型。使用指针类型做函数的参数, 实际向函数传递的是变量的地址。由于子程序中获得了所传递变量的地址,在该地址空间的数 据当子程序调用结束后被物理地保留下来,为了使在函数中改变了的值能够被main函数所用, 不能采用把要改变值的变量作为函数参数的办法,而应该使用指针变量作为函数的参数,在函 数执行过程中,指针变量所指向变量的值发生变化,函数调用结束后,这些变化值依然保留下 来。 如果将上面程序中的swap函数改成下面的形式,看看程序的运行结果会发生什么变化? swap( int *p_1,int *p_2) /*执行指针变量的交换*/ 37 int *p; p=p_1; p_1=p_2; p_2=p; 这样根本不能输出正确的结果来,C 语言中实参变量和形参变量之间数据传递是单向的“值传 递“,指针变量作函数参数也要遵循这一规则,调用函数不能改变实参指针变量的值,但可以 改变实参指针变量所指变量的值。 7.3 实习内容 7-1 下面程序的功能是:从键盘上面输入 3 个整数,按由小到大的顺序输出。完善程序中 的空缺行。 main() void swap( ); int n1,n2,n3; int p1,p2,p3; printf(“请输入三个整数 n1,n2,n3:“); scanf(“%d,%d,%d“, p1= p2= ; if(n1n2) swap( ); if(n1n3) swap(p1,p3); if(n2n3) swap(p2,p3); printf(“排序后三个整数为:%d,%d,%dn“,n1,n2,n3); void swap( ) int p; p=*q1; ; *q2=p; 7-2 下面程序求一个字符串的长度,程序中标有“*“行有错,请改正。 main() 38 int length( ); int len ; char *str20; printf(“请输入一个字符串:“); scanf(“%s“,str); * len=length(*str); printf(“字符串长度为%d“,len); * int length(*p) int n=0; * while(p!= 0) n+; p+; return(n); 39 第第 8 章章 结结构构体体程程序序设设计计 8.1 目的要求 (1) 掌握结构体类型变量的定义和使用; (2) 掌握结构体类型数组的概念和应用; (3) 掌握指向结构体类型的指针的应用; (4) 掌握链表的概念,学会对链表的基本操作。 8.2 例程分析 【例 8-1】计算 5 名学生的平均成绩和不及格的人数。 源程序: struct stu int num; /*学号*/ char name20 ; /*姓名,定义成字符数组*/ char sex; /*性别,定义成字符型,F 代表女性,M 代表男性*/ float score; /*成绩*/ boy5= 101,“Li ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“He fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58, ; /*定义外部结构数组并初始化*/ main() int i,c=0; float ave,s=0; for(i=0;iscore; if(ps-scorenum, if(i=0) 42 pf=head=pb; /*若链表为空,当前结点为第一结点*/ else pf-next=pb; /*若链表不为空,pb 值赋予 pf 所指结点的指针域成员 next*/ pb-next=NULL; pf=pb; return(head); 说明: 在函数外首先用宏定义对三个符号常量作了定义。这里用 TYPE 表示 struct stu,用 LEN 表示 sizeof(struct stu)主要的目的是为了在以下程序内减少书写并使阅读更加方便。结构 stu 定义为 外部类型,程序中的各个函数均可使用该定义。 creat 函数用于建立一个有 n 个结点的链表,它是一个指针函数,它返回的指针指向 stu 结构。 在 creat 函数内定义了三个 stu 结构的指针变量。head 为头指针,pf 为指向两相邻结点的前一 结点的指针变量。pb 为后一结点的指针变量。在 for 语句内,用 malloc 函数建立长度与 stu 长 度相等的空间作为一结点,首地址赋予 pb。然后输入结点数据。如果当前结点为第一结点(i= =0),则把 pb 值 (该结点指针)赋予 head 和 pf。如非第一结点,则把 pb 值赋予 pf 所指结点的 指针域成员 next。而 pb 所指结点为当前的最后结点,其指针域赋 NULL。 再把 pb 值赋予 pf 以作下一次循环准备。 creat 函数的形参 n,表示所建链表的结点数,作为 for 语句的循环次数。 【例 8-4】写一个函数,删除链表中的指定结点。 分析: 删除一个结点有两种情况: (1)被删除结点是第一个结点。这种情况只需使 head 指向第二个结点即可。即 head=pb-next。 (2)被删结点不是第一个结点,这种情况使被删结点的前一结点指向被删结点的后一 结点即可。即 pf-next=pb-next。 源程序: TYPE * delet(TYPE * head,int num) TYPE *pf,*pb; if(head=NULL) /*如为空表, 输出提示信息*/ printf(“nempty list!n“); goto end; pb=head; while (pb-num!=num pb=pb-next; /*pf 指向当前结点,pb 指向下一结点*/ if(pb-num=num) if(pb=head) head=pb-next; /*如找到被删结点,且为第 1 结点,则使 head 指向第 2 个结点, 否则使 pf 所指结点的指针指向下一结点*/ else pf-next=pb-next; free(pb); printf(“The node is deletedn“); else printf(“The node not been foud!n“); end: return head; 说明: 函数有两个形参,head 为指向链表第一结点的指针变量,num
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川事业单位联考考试招聘易考易错模拟试题(共500题)试卷后附参考答案
- 华能山东石岛湾核电限公司2025年下半年应届高校毕业生招聘易考易错模拟试题(共500题)试卷后附参考答案
- 内蒙古乌兰浩特市部分小学和农村幼儿园招考教师易考易错模拟试题(共500题)试卷后附参考答案
- 佛山市人民政府行政服务中心招考普通专业技术雇用人员易考易错模拟试题(共500题)试卷后附参考答案
- 中国建科2025届校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025(中建一局一公司南方分公司)市场经理招聘若干人易考易错模拟试题(共500题)试卷后附参考答案
- 2025黑龙江大庆萨尔图区事业单位引进人才10名(第三批)易考易错模拟试题(共500题)试卷后附参考答案
- 2025青海事业单位联考招聘重点基础提升(共500题)附带答案详解
- 2025陕西烟草专卖局招聘42人易考易错模拟试题(共500题)试卷后附参考答案
- 2025陕西建工第十建设集团限公司招聘121人易考易错模拟试题(共500题)试卷后附参考答案
- 猪场产房工作汇报
- 心理健康教育课程标准
- 安全管理体系和措施方案
- 2025年江苏省高邮市辅警招聘考试试题题库附答案详解(b卷)
- 煤炭途耗管理办法
- 2024年山东省宁津县人民医院公开招聘护理工作人员试题带答案详解
- 葡萄膜炎误诊的教训
- 民航失信行为管理办法
- 2025保安证考试试题及答案集合
- 化学酶工程与生物酶工程课件
- 锑矿相关行业投资规划报告
评论
0/150
提交评论