1、高级语言(C语言)程序设计实验指导书第一章前言一、C语言实验的目的学习程序设计课程应当熟练地掌握程序设计的全过程,即独立编写源程序、独立上机调试、独立运行程序和分析结果,不能满足于能看懂书上的程序。上机实验的目的,绝不仅仅是为了验证所编写的程序是否正确,而是为了:1加深对讲授内容的理解,尤其是一些语法规定。通过实验来掌握语法规则是行之有效的方法。2熟悉所用的操作系统和相应的上机环境。3学会上机调试程序,根据出错信息掌握修改程序的方法。4通过调试完善程序。二、C语言实验前的准备工作1了解所用的上机环境(包括编译系统)的性能和使用方法。2复习和掌握与本实验有关的教学内容。3准备好上机所需的程序,不
2、要完全复制或抄写别人的程序去上机。4对程序中出现的问题应事先估计,对程序中自己有疑问的地方应先作上记号,以便上机时注意。5准备好调试程序和运行程序所需的数据。三、C语言实验的步骤上机实验原则上应一人一组,独立实验(如果程序太大,也可以23人一组)。上机过程中出现的问题,除了是系统的问题以外,不要轻易举手问老师。尤其对“出错信息”,应善于分析判断,找出出错的行,然后检查该行或其上一行。上机实验一般应包括以下几个步骤:1双击桌面Visual C+快捷方式进入Visual C+,或通过执行“开始=程序=Microsoft Visual Studio 6.0= Microsoft Visual C+6
3、.0”。2单击“文件”菜单的“新建”命令。3在打开的“新建”对话框中选择“文件”标签。4选择C+ Source File,选择文件保存位置,然后在文件输入栏中输入文件名。如图所示:5输入源程序。6编译程序:按“Ctrl+F7”或通过“编译”菜单中的“编译”命令,或使用工具栏中的相应工具进行编译编译连接运行若程序有错则找到出错行修改程序。7连接:若程序没有语法错误,则可按功能键或执行“编译”菜单中的“构件”命令或通过工具栏中的相关工具(编译工具右边工具),进行连接生成可执行文件。8运行程序:按组合键“Ctrl+F5”,或通过“编译”菜单中的执行命令,或通过工具栏中的“!”工具运行程序。四、写好C
4、语言实验报告实验报告应包括以下内容:1实验目的。2实验内容。3程序清单。4运行结果。5对运行结果的分析,以及本次调试程序所取得的经验。五、C语言实验任务与时间安排实验序号实验内容拟实验时间实验形式1Visual C+ 6.0集成环境的使用2验证性2基本数据类型与输入输出2验证性3顺序结构程序设计2验证性4选择结构程序设计2验证性5循环结构程序设计2验证性6数组5设计性7函数5设计性9指针4设计性10结构体4设计性12文件2验证性第二章实验实验一 Visual C+ 6.0集成环境的使用1.1 实验目的1.掌握VC 6.0集成开发环境的使用方法。2.了解C语言程序从编辑、编译、连接到运行的全过程
5、3.掌握C语言程序的结构特征与书写规则1.2 实验要求1.实验学时:2学时。2.使用Visual C+6.0环境编写和调试程序。3.所有上机题应通过调试,并获得正确的结果。4.对程序中重要的内容作必要的注释。1.3 实验准备1.阅读Visual C+ 6.0集成环境的相关材料。2.复习C语言程序基本结构与书写规则的有关内容。1.4 实验内容1. 上机调试(1)请输入以下程序,练习在Visual C+6.0环境下程序的编辑、编译、连接和运行。#includevoid main()printf(这是我的第一个程序n);(2)请说明以下程序的功能,然后上机验证。#includevoid main()
6、 int a,b,c; printf(Please input a,b:); scanf(%d%d,&a,&b); /*注意,输入数据时,数据间用空格分隔*/ c=a+b; printf(%d+%d=%dn,a,b,c);(3)请说明以下程序的功能,然后上机验证。#includefloat ave(float y1,float y2,float y3) float y; y=(y1+y2+y3)/3; return y;void main() float x,y,z,a; scanf(%f,%f,%f,&x,&y,&z); /* 注意,输入数据时,数据间用逗号分隔 */ a=ave(x,y,z
7、); printf(%fn,a);2.实验思考(1)输入并运行下面的程序。#includevoid main() char c,h; int i,j; c=a; h=b; i=97; j=98; printf(%c%c%c%cn,c,h,i,j); printf(%d%d%d%dn,c,h,i,j);(2)运行下列程序并分析出现的信息提示。#includevoid main() int i=23,s; s=i+j; printf(s=%dn,s);实验二 基本数据类型与输入输出2.1 实验目的1.掌握C语言基本数据类型以及常量的表示方法、变量的定义与使用规则。2.掌握C语言的算束运算、逗号运算
8、的运算规则与表达式的书写方法。3.掌握各种输入输出函数的使用方法。2.2 实验要求1.实验学时:2学时。2.使用Visual C+6.0环境编写和调试程序。3.所有上机题应通过调试,并获得正确的结果。4.对程序中重要的内容作必要的注释。2.3 实验准备1.复习数据类型和运算符的有关概念。2.复习各种类型常量的表示方法以及变量的概念与命名规则。3.复习输入输出函数各种格式符的含义与使用规则。2.4 实验内容1.上机调试(需作出必要的注释!)(1) 请说明以下程序的功能,然后上机验证。#include void main() printf(t*n); printf(tb*n); printf(tb
9、b*n); (2) 请说明以下程序的功能,然后上机验证。# includevoid mian() int x=010,y=10,z=0x10; char c1=M,c2=x4d,c3=115,c4=77 ,c; printf(x=%o,y=%d,z=%xn,x,y,z); printf(x=%d,y=%d,z=%dn,x,y,z); printf(c1=%c,c2=%c,c3=%c,c4=%cn,c1,c2,c3,c4);printf(c1=%d,c2=%d,c3=%d,c4=%dn,c1,c2,c3,c4);c=c1+32;print(c=%c,c=%dn,c,);(3) 请说明以下程序的功
10、能,然后上机验证。#include void main() int m=18,n=13; float a=27.6,b=5.8,x,; x=m/2+n*a/b+1/4; printf(%fn,x);(4)当输入是8.5,2.5,5,分析程序运行结果,并上机验证。#include void main() float x,y; Int z; scanf(%f,%f,%d,&x,&x,&z); y=x-z%2*(int)(x+17)%4/2; printf(x=%f,y=%f,z=%dn,x,y,z); 2.填空题(1) 以下程序输入3个整数值给a,b,c,程序把b中的值给a,把c中的值给b,把a中
11、的值给c,交换后输出a,b,c的值。例如,输入a=10,b=20,c=30,交换后a=20,b=30,c=10。#include void main() int a,b,c,_; printf(Enter a,b,c: ); scanf(%d%d,_); _; printf(%d,%d,%d,a,b,c);(2) 以下程序输入一个大写字母,要求输出对应的小写字母。#include void main() char upperc,lowerc; upperc=_; lowerc=_; printf(小写字母);putchar(upperc); printf(大写字母);putchar(lower
12、c);putchar(/n);3.思考题(1)分析程序,写出运行结果,并上机验证#include void main() char c1=a,c2=b,c3=c,c4=101,c5=101; printf(a%c b%ctc%ctabcn,c1,c2,c3); printf(tb%c%c.c4,c5); c4=65535; c5=-1.2345; printf (%d%d,c4,c5); (2) 分析程序,写出运行结果,并上机验证#include void main() int i=3,j=5,k,l,m=19,n=-56; k=+i; l=j+; m=i+; n-=-j; printf(%d
13、,%d,%d,%d,%d,%d,n,ij,k,l,m,n)(3) 分析程序,写出运行结果,并上机验证#include void main() float r,h,pi=3.1415926; float c0,s0,s,v; printf(input r,h(m):); scanf(%f,%f,&r,&h); c0=2*pi*r; s0=c0*h+2*s0; s=c0*h+2*s0; v=pi*r*r*h; printf(c0=%.2f(m)ns0=%.2fns(m20nv=%.2f(m3)n,c0,s0,s,v);实验三 顺序结构程序设计3.1 实验目的1.熟练掌握格式输入与格式输出函数与各种
14、格式符的使用;2.掌握各类数据输入/输出的实现方法;3.学习完成简单的顺序结构程序设计。3.2 实验要求1.实验学时:2学时。2.使用Visual C+6.0环境编写和调试程序。3.所有上机题应通过调试,并获得正确的结果。4.对程序中重要的内容作必要的注释。3.3 实验准备1.复习格式输入、输出语句的使用。2.复习各类输入、输出语句。3.复习简单的顺序程序设计的基本方法。3.4 实验内容1.上机调试(需作出必要的注释!)(1)输入三角形的三边长,求三角形面积。为简单起见,设输入的三边长a、b、c能构成三角形。从数学知识已知求三角形面积的公式为area=s(s-a)(s-b)(s-c), 其中s
15、=(a+b+c)/2include ain() float a,b,c,s,area; scanf(%f,%f,%f,&a,&b,&c); s=10/2(a+b+c); area=srt(s(s-a)(s-b)(s-c); printf(a=%7.2f, b=%7.2f, c =%7.2f, s =%7.2fn,a,b,c,s); printf(area=%72fn,area); (2)求ax2+bx+c=0方程的根。a,b,c由键盘输入,设b2-4ac0。众所周知,一元二次方程式的根为x1=-b+b2-4ac2ax2=-b-b2-4ac2a,可以将上面的分式分为两项:p=-b2a ,q=b2
16、-4ac2a,x1=p+q, x2=p-qinclude ain(); float a,b,c,disc,x1,x2,p,; scanf(a=%f,b=%f,c=%f,&a,&b,&c); disc=b*b-4*a*c; p=-b/(2*a);q=sqrt(disc)/(2*a); x1=p+;x2=p-; printf(nnx1=%5.2fnx2=%5.2fn,x1,x2); 2.填空题(1)已有如下定义和输入语句,若要求a,b,c1,c2的值分别为5、6、A和B,当从第一列开始输入数据时,正确的数据输入方式是 _ (表示回车)。int a,b;char c1,c2;scanf(%d%c%d
17、%c,&a,&c1,&b,&c2);A) 5 A 6 B B) 5 A6B C) 5A6B D) 5A6 B(2)以下说法正确的是_。A)输入项可以为一个实型常量,如scanf(“%f”,3.5);B)只有格式控制,没有输入项,也能正确输入,如scanf(“a=%d,b=%d”);C)当输入实型数据时,格式控制部分应规定小数点后的位数,如scanf(“%4.2f”,&f);D)当输入数据时,必须指明地址,如scanf(“%f”,&f);E)可以采用不同的格式符,实现对一个实型数据以八进制或十六进制形式输入/输出。F)整型数据不能使用%f或%lf格式符。(3)若a是int型变量,则表达式(a=5
18、*6,a*3),a+8的值是 _ 。(4)若有定义:int b=7; float a=2.5,c=4.7; 则表达式 a+(int)(b/3*(int)(a+c)/2)%4的值为_。 (5)输出长整型数据使用格式符_,输出无符号的整数用格式符_ ,以指数形式输出单精实数用格式符_。(6)下面程序运行时输入:10 11,输出_。#includevoid main()int a,b; scanf(%o%x,&a,&b); printf(a=%d,b=%dn,a,b); (7)下面程序段执行时,怎样输入才能让a=10,b=20 ?_ int a,b;scanf(a=%d,b=%d,&a,&b);(8
19、)若a和b均为int变量,以下语句的功能是_。a+=b;b=a-b;a-=b;(9)在scanf函数调用中,可以在格式字符和%之间加一星号*,它的作用是_。(10)a+、+a、a=a+1都能实现使变量a的值增1,与之等效的表达式还有_3.编程题下面程序功能:键盘输入一个三位数,输出逆序后的数。例如,输入236,输出632。程序中有多处错误,改正后在机器上调试通过。#includevoid main()int x,int y; int a,b,c; a=x/100; b=x/10%10; c=x%10; printf(Please input a num:); scanf(%d,&x); y=1
20、00c+10b+a; printf(y=%dn,y);4.思考题如果输入的数据可以是任意大小的数,并不限制一定是一个三位数,怎样才能将该数逆序并输出?实验四 选择结构程序设计4.1 实验目的1.掌握C语言的关系表达式和逻辑表达式的运算规则与书写方法。2.掌握各种类型的if语句和switch语句的使用方法。3.熟悉选择结构程序设计的方法。4.2 实验要求1.实验学时:2学时。2.使用Visual C+6.0环境编写和调试程序。3.所有上机题应通过调试,并获得正确的结果。4.对程序中重要的内容作必要的注释。 4.3 实验准备1.复习关系运算符与关系表达式、逻辑运算符与逻辑表达式的相关内容。2.复习
21、if语句和switch语句的格式与执行过程。4.4 实验内容1.上机调试(需作出必要的注释!)(1)先静态分析一下程序的运行结果,然后上机验证。#include void main() int a=3,b=4,c=5,x,yz; x=c,b,a; y=!a+by则将x与y的值进行交换,然后再用x与z进行比较,如果xz则将x与z的值进行交换,这样能使x最小。)#include void main()int x,y,z,t;scanf(%d%d%d,&x,&y,&z);if (xy) t=x;x=y;y=t; /*交换x,y的值*/if(xz) t=z;z=x;x=t;/*交换x,z的值,此时则x
22、获最小值*/if(yz) t=y;y=z;z=t;/*交换z,y的值*/printf(small to big: %d %d %dn,x,y,z);2.编程题(1)已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(单位:元):profit1000 没有提成1000 profit2000 提成10%2000 profit5000 提成15%5000 profit10000 提成20%10000 profit 提成25%请打印员工实际薪水。#include void main() int grade,profit; float salary=500; p
23、rintf(Input profit:); scanf(%d,&profit); grade=(profit-1)/1000; switch(grade) case 0: break; case 1: salary+=profit*0.1;break; case 2: case 3: case 4: salary+=profit*0.15;break; case 5: case 6: case 7: case 8: case 9: salary+=profit*0.2;break; default: salary+=profit*0.25; printf(salary=%.0fn,salary
24、);请按一下步骤实习思考:(调试并注释)分析程序中的switch结构。重点学习case标号的设计,本例将利润与提成的关系转换成整数的方法是,由于提成的变化点都是1000的整数被(1000、2000、5000、),同时为了解决相邻两个区间重叠问题,因此采用将利润porfit先减1(最小增量),然后再整除1000.输入并运行程序,用不同的利润去检验运行结果,如果结果不正确,请找出原因,改正后重新运行,直到结果正确为止。 若没有break; 结果如何?3.思考题已知银行整存整取存款不同期限的月息利率分别为: 0.63% 期限1年 0.66% 期限2年月息利率= 0.69% 期限3年 0.75% 期限
25、5年0.84% 期限8年要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。实验五 循环结构程序设计5.1 实验目的1.掌握语句、语句和语句实现循环的使用方法。2.掌握循环语句实现一些常用的算法。3.熟悉程序的跟踪调试技术。5.2 实验要求1.实验学时:2学时。2.使用Visual C+6.0环境编写和调试程序。3.所有上机题应通过调试,并获得正确的结果。4.对程序中重要的内容作必要的注释。5.可以用断点调试法完成部分上机调试题,并观察运行过程。 5.3 实验准备1.复习while语句、dowhile语句、fo语句、continue语句和beeak语句的格式与执行过程。2.复习一
26、些常用的算法,并总结它们的设计方法和思路。3.阅读“程序调试与测试”的相关内容。5.4 实验内容1.上机调试(需作出必要的注释!)(1)求n!提示:(1)注意结果的取值范围! (2)3中循环方式由你选择!也可以用两种方法做。 (3)程序的简单验证:正确结果应是:3!=6。5!=120。8!=40320 注可用单步跟踪(F10)观测循环语句的执行过程。(4)提示案例:(例3.7) 用while语句来实现1*2*3*10的乘积。#includevoid main() int i=1,mul=1; while (i=10) /*用while 语句求1*2*3*10的乘积*/ mul=mul*i; i
27、+; printf(n%ldn, mul);(2)求5个数的和及平均值的程序代码如下:#includevoid main() int a; float b,sum; for(a=1,sum=0.0;a6;a+) printf(“please input NO:%dn”,a); scanf(%f,&b); /*从键盘上输入5个数*/ sum+=b; /*求输入的5个数的加和*/ printf(average=%fn,sum/5);/*求5个数的平均值,并将其输出*/(3)从键盘输入10个数,求出最大值及最小值。#include void main() int a,max,min,i; /输入整数
28、 b=0; for(i=0;imax) max=a; if(amin) min=a; printf(in you inout digit the bigist is: %d,max); printf(in you inout digit the 最小值 is: %d,min);2.编程题抓交通肇事者。一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说牌照的前两位数字是相同的;乙说牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说四位的车号刚好是一个整数的平方。请根据以上线索求出肇事者的车号。提示:(1)车牌号为4位。实验六 数组6.1 实
29、验目的1.掌握数组的定义、初始化及数组元素的引用方法。2.掌握数组的赋值和输入输出方法。3.掌握与数组有关的算法,如排序、查找、插入、删除和矩阵运算等。4.掌握字符数组和字符串函数的使用。6.2 实验要求1.实验学时:5学时。2.使用Visual C+6.0环境编写和调试程序。3.所有上机题应通过调试,并获得正确的结果。4.对程序中重要的内容作必要的注释。5.可以用断点调试法完成部分上机调试题,并观察运行过程。 6.3 实验准备1.复习数组的定义、初始化以及数组元素的引用形式,理解数组的作用。2.学习使用循环语句控制数组元素下标的变化,实现对数组元素的处理。3.复习并理解与数组有关算法的基本思
30、路。4.复习字符数组的使用方法。6.4 实验内容1.上机调试(需作出必要的注释!)(1)运行下面的C程序,该运行结果说明什么?main( ) int num5=1,2,3,4,5;inti i;for(i=0;i=5;i+)printf(%d,numi);(2)请说明以下程序的功能,对加粗部分进行注释,然后上机验证。#include void main()int i,t,a10=0,1,2,3,4,5,6,7,8,9;t=a9;for(i=9;i0;i-)ai=ai-1;a0=t;praint(n);for(i=0;i10;i+)printf(%d,ai);(3)数组a存放10位学生成绩,请说
31、明以下程序的功能,对加粗部分进行注释,然后上机验证。#includevoid main() int i; float aver,a10=78,89,65,72,68,60,80,75,83,70;sum=a0; max=min=a0; for(i=1;imax) max=ai; else if (aimin) min=ai; sum=sum+ai; aver=sum/n; printf(“平均分=%f, 最高分%f, 最低分%fn”,aver,max,min); (4)请说明以下程序的功能,对加粗部分进行注释,然后上机验证。#includestdio.hvoid main() int I,j,
32、t,a33=100,101,102,45,46,47,77,78,79; for(i=0;i3;i+)for(j=0;ji;j+)t=aij;aij=aji;aji=t; for(i=0;i3;i+) printf(”n”);for(j=0;j3;j+) printf(” %d ”,aij);(5)数组a存放一个方阵数据,请说明以下程序的功能,对加粗部分进行注释,然后上机验证。#includestdio.hvoid main() int a100100,i,j,x,y,max,sum,c,n;printf(输入方阵的行列数:);scanf(%d,&c);if(c=1) printf(输入错误!
33、n); else for(i=0;i=c-1;i+) for(j=0;j=c-1;j+) scanf(%d,&aij); max=a00; x=0,y=0; for(i=0;i=c-1;i+) for(j=0;jmax)max=aij; x=i;y=j;printf(这个方阵中最大的数是%dn,max);sum=0; for(n=0;n=A&ai=a&ai=a&ai=z)aj+=ai; aj=0; printf(“%sn”,a);2.填空题(1)以下程序的功能是:若已定义:int a11,i;:在第一个循环中给前10个数组元素依次赋1、2、3、4、5、6、7、8、9、10;在第二个循环中使a数
34、组前10个元素中的值对称折叠,变成1、2、3、4、5、5、4、3、2、1,然后输出。请在程序的下划线处填空。#includestdio.hmain() int a10,i; for(i=1;i=10;i+) =i; for(i=1;i=10;i+)printf( %d,, ); for(i=1;i=5;i+) =ai; for(i=1;i=10;i+) printf( %d,, );(2)以下程序的功能是:求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。请在程序的下划线处填空。main() int x10,a9,i; for(i=0;i10;i+) scanf(%d,&xi); f
35、or( i=1; i10;i+) ai-1=xi+_; for(i=0;i9;i+ ) printf(%d,ai ) ; printf(n );(3)以下程序的功能是进行方阵的转置。在程序的下划线处填空。#include void main()int i,j,t,a44;printf(n input a:);for(i=0;i4;i+)for(j=0;j4;j+)scanf(%d,&aij);for(i=0;i4;i+)for(j=0;j4;j+)t=aij; ;aji=t;for(i=0;i4;i+) printf(n); for(j=0;j4;j+)printf(%5d,aij);(4)若要按以下形式输出数组num右上半三角1 2 3 4 6 7 811 12 16请在程序的下划线处填空,满足以上要求。main()int num44=1,2,3,4,5,6,7,8,9,10,11,12,13,1