1、语言程序设计课程实验指导书第一部分 前言一、实验的目的学习程序设计课程不能满足于“懂得了” ,满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即独立编写源程序、独立上机调试、独立运行程序和分析结果。上机实验的目的,绝不仅仅是为了验证教材和讲课的内容,或者验证自己所编写的程序的正确与否。程序设计课程上机实验的目的是:1加深对讲授内容的理解,尤其是一些语法规定。通过实验来掌握语法规则是行之有效的方法。2熟悉所用的操作系统。3学会上机调试程序。通过反复调试程序掌握根据出错信息修改程序的方法。4通过调试完善程序。二、实验前的准备工作1了解所用的计算机系统(包括编译系统)的性能和使用方法。2复
2、习和掌握与本实验有关的教学内容。3准备好上机所需的程序,切忌不编程或抄别人的程序去上机。4对程序中出现的问题应事先估计,对程序中自己有疑问的地方应先作上记号,以便上机时给予注意。5准备好调试程序和运行程序所需的数据。三、实验的步骤上机实验应一人一组,独立实验。上机过程中出现的问题,除了是系统的问题以外,不要轻易举手问老师。尤其对“出错信息” ,应善于分析判断,找出出错的行,然后检查该行或其上一行。上机实验一般应包括以下几个步骤:1双击桌面 Visual C+快捷方式进入 Visual C+,或通过执行“开始=程序=Microsoft Visual Studio 6.0= Microsoft V
3、isual C+6.0”或执行文件“C:Program FilesMicrosoft Visual StudioCOMMONMSDev98BinMSDEV.EXE“。2单击“文件”菜单的“新建”命令。3在打开的“新建”对话框中选择“文件”标签。4选择 C+ Source File,选择文件保存位置,然后在文件输入栏中输入文件名。如图所示:5输入源程序。6编译程序:按“Ctrl+F7”或通过“编译”菜单中的“编译”命令,或使用工具栏中的相应工具进行编译 编译 连接 运行若程序有错则找到出错行修改程序。7连接:若程序没有语法错误,则可按功能键或执行“编译”菜单中的“构件”命令或通过工具栏中的相关工
4、具(编译工具右边工具) ,进行连接生成可执行文件。8运行程序:按组合键“Ctrl+F5” ,或通过“编译”菜单中的执行命令,或通过工具栏中的“!”工具运行程序。四、写好实验报告实验报告应包括以下内容:1实验目的。2实验内容。3程序清单。4运行结果。5对运行结果的分析,以及本次调试程序所取得的经验。五、实验任务与时间安排 实验序号 实验内容 拟实验时间 实验形式1 C 程序的运行环境及运行一个 C 程序 2 验证性2 数据类型、运算符和表达式 2 验证性3 最简单的 C 程序设计 2 验证性4 选择结构程序设计 2 验证性5 循环控制 4 验证性6 数组 4 验证性7 函数 2 验证性8 编译预
5、处理 2 验证性9 指针 2 验证性10 结构体、共用体 6 设计性11 位运算 2 验证性12 文件 2 验证性六、教材C 程序设计(第三版) 潭浩强著 清华大学出版社第二部分 实验内容实验一 程序的运行环境和运行一个程序的方法一、实验目的1了解所用的计算机系统。2了解在该系统上如何进行编辑、编译、连接和运行一个程序。3通过运行简单的程序了解程序的特点。二、实验内容和步骤熟悉所用的系统。了解 Windows 资源管理器的使用方法:文件的查看、复制、运行等方法,Visual C+所在目录,文本文件的建立方法。2进入 Visual C+,并新建一个 C+源程序文件。3熟悉 Visual C+的集
6、成环境,了解各菜单项有哪些子菜单。4输入下面的程序(教材中的例.) ,注意区分大小写。#includevoid main()printf(“This is a C program.n“);编译并运行程序。5关闭工作区,新建一个程序,然后对教材中的例.重复中的操作(即只将程序改为例 1.2 中的程序,其它操作步骤相同) 。6关闭工作区,新建一个程序,然后输入并运行一个需要在运行时输入数据的程序#includevoid main()int a,b,c;int max(int x,int y);printf(“input a and b:“);scanf(“%d,%d“,c=max(a,b);pri
7、ntf(“nmax=%d“,c);int max(int x,int y)int z;if(xy) z=x;else z=y;return(z);(1)运行程序,若程序有错,则修改错误后继续运行程序,当没有错误信息时输入:2,5 并按 Enter 键,查看运行结果。(2)将程序的第三行改为:int a;b;c;然后按 F9 看结果如何,将其修改为 int a,b,c;将子程序 max 的第 3,4 行合并为一行,运行程序,看结果是否相同。7运行一个自己编写的程序,程序的功能是输出两行文字。实验二 数据类型、运算符和表达式一、实验目的掌握语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以
8、及对它们赋值的方法。2掌握不同数据类型之间赋值的规律。3学会使用的有关算术运算符,以及包含这些运算符的表达式,特别是自加()和自减()运算符的使用。4进一步熟悉程序的编辑、编译、连接和运行的过程。二、实验内容和步骤输入并运行下面的程序#includevoid main()char c1,c2;c1=a;c2=b;printf(“%c %c“,c1,c2);()运行此程序()加入下面的一个语句作为“”前的最后一个语句:printf(“%d,%dn“,c1,c2);()将第行改为:int c1,c2;然后再运行程序,并观察结果是否相同。()将第行改为 int c1,c2;将第 4,行依次改为:c1
9、=a;c2=b;c1=“a“;c2=“b“c1=300;c2=400;每改为一次后运行程序,观察结果。2分析教材第章习题 3.6 中的程序的运行结果,然后输入该程序并运行,将运行结果与前面分析的结果对比。3输入并运行下面的程序#includevoid main()int a,b;unsigned c,d;long e,f;a=100;b=-100;e=50000;f=32767;c=a;d=b;printf(“%d,%dn“,a,b);printf(“%u,%un“,a,b);printf(“%u,%un“,c,d);c=a=e;d=b=f;printf(“%d,%dn“,a,b);print
10、f(“%u,%un“,c,d);请对照程序和运行结果分析:()将一个负整数赋给一个无符号的变量,会得到什么结果。画出它们在内存中的表示形式。()将一个大于 32767 的长整数赋给一个整型变量,会得到什么结果。画出它们在内存中的表示形式。()将一个长整数赋给无符号的变量,会得到什么结果。画出它们在内存中的表示形式。4输入习题 3.10()运行程序,注意 i,j,m,n 的值。()将第 4,5 行改为:m=i+;n=+j;再运行。()将程序改为:#includevoid main()int i,j;i=8;j=10;printf(“%d,%dn“,+i,+j);i=8;j=10;printf(“
11、%d,%dn“,i+,j+);i=8;j=10;printf(“%d,%dn“,+i,i);i=8;j=10;printf(“%d,%dn“,i+,i);运行程序并分析运行结果。5按习题 3.7 的要求编程并上机运行:要将“China”译成密码,密码规律是:用原来的字母后面第 4 个字母代替原来的字母。例如,字母“A”后面第 4 个字母是“E” ,用“E”代替“A” ,因此, “China”应译为“Glmre”。请编一程序,用赋初值的方法使 c、c2、c3、c4、c5 这 5 个变量的值分别为C,h, i,n, a,经过计算,使 c、c2、c3、c4、c5 分别变为:G,l,m,r,e,并输出
12、.程序提示:main 函数算法如下:定义 char 型变量 c,c2,c3,c4,c5;给字符型变量赋值c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;输出 c,c2,c3,c4,c5实验三 最简单的程序设计一、实验目的1掌握语言中使用最多的一种语句赋值语句的使用方法。2掌握各种类型数据的输入输出方法,能正确使用各种格式输出符。二、实验内容和步骤掌握各种格式输出符的使用方法。#includevoid main()int a,b;float d,e;char c1,c2;double f,g;long n,m;unsigned p,q;a=61;b=62;c1=a
13、;c2=b;d=3.56; e=-6.87;f=3156890121;g=0.123456789;m=50000;n=-60000;p=32768;q=40000;printf(“a=%d,b=%dnc1=%c,c2=%cnd=%6.2f,e=%6.2fn“,a,b,c1,c2,d,e);printf(“f=%15.6f,g=%15.12fnm=%ld,n=%ldnp=%u,q=%un“,f,g,m,n,p,q);(1)运行此程序并分析运行结果。(2)在此基础上,修改程序的第行:a=61;b=62;c1=a;c2=b;f=3156,890121;g=0.123456789;d=f;e=g;p=
14、a=m=50000;q=b=n=-60000;运行程序,分析运行结果。(3)将行改为以下的 scanf 语句,即用 scanf 函数接收从键盘输入的数据:scanf(“%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u“,运行程序(无错误的情况下)输入数据如下:61,62,a,b,3.56,-6.87,3156,890121,0.123456789,50000,-60000,32768,400002按习题 38 的要求编写程序并运行:设圆半径 r=1.5,圆柱高 h=3,求圆周长、圆面积,圆球表面积、圆球体积、圆柱体体积。用 scanf 输入数据,输出计算结果,输出
15、时要有文字说明,取小数后 2 位数字。程序提示:#define PI 3.14159main 算法如下定义 float 型变量 r,h,L,s1,s2,v1,v2;用 scanf 语句输入圆半径和圆柱高求圆周长、面积、圆球表面积、圆柱体体积输出圆周长、圆面积、圆球表面积、圆球体体积程序中的 用 PI 代替。3编写程序,用 getchar 函数读入两个字符给 c1,c2,然后分别用 putchar 函数和printf 函数输出这两个字符。实验四 选择结构程序设计一、实验目的1了解语言表示逻辑值的方法。2学会正确使用逻辑运算符和逻辑表达式的方法。3熟悉 if 语句和 switch 语句。4结合程序
16、掌握一些简单的算法。5学习调试程序的方法。二、实验内容本实验要求编程解决以下问题,然后上机调试运行程序。1 1032xy用 scanf 函数输入 x 的值,求 y 的值。程序提示:main 函数结构如下:定义实型变量 x 与 y使用 scanf 函数输入 x 的值if x=90grade=Aelse if score=80grade=Belse if score=70grade=Celse if score=60grade=Delse grade=E输出百分制成绩和等级。(2)使用 switch 语句的 main 函数结构如下:定义 float 型变量 score,char 型变量 grade
17、输入百分制成绩赋给 scoreswitch(int(score/10)case 10:case 9: grade=A;break;case 8: grade=B;break;case 7: grade=C;break;case 6: grade=D;break;default: grade=E;break;输出百分制成绩和等级3编程实现:输入一个不多于位的正整数,要求:()输出它是几位数, ()分别输出每一位数字, ()按逆序输出各位数字,如原数为,则应输出。应准备以下测试数据要处理的数为位正整数;要处理的数为位正整数;要处理的数为位正整数;要处理的数为位正整数;要处理的数为位正整数;除此之外
18、,程序还应当对不合法的输出作必要的处理。例如:输入负数;输入的数超过位;程序提示:main 函数结构如下:定义 long 型变量 num,int 型变量 c1,c2,c3,c4,c5输入一个不超过 5 位的正整数赋给 numif num99999 输出:输入的数超过 5 位else if num0) printf(“n%ld 是一个 5 位数n“,num);printf(“其各位分别为:%1d,%1d,%1d,%1d,%1dn“,c1,c2,c3,c4,c5);printf(“逆序输出为:%1d%1d%1d%1d%1dn“,c5,c4,c3,c2,c1);else if(c20) 是 4 位数
19、,输出其各位,格式与 5 位数类似else if(c30) 是 3 位数,输出其各位,格式与 5 位数类似else if(c40) 是 2 位数,输出其各位,格式与 5 位数类似else if(c50) 是 1 位数,输出其各位,格式与 5 位数类似4编程实现:输入个整数,要求按由小到大的顺序输出。得到正确结果后,修改程序使之按由大到小的顺序输出。main 函数结构如下:int a,b,c,d,t;输入 4 个整数:赋给 a,b,c,d;if(ab) 交换 a,bif(ac) 交换 a,cif(ad) 交换 a,dif(bc) 交换 b,cif(bd) 交换 b,dif(cd) 交换 c,d输
20、出 a,b,c,d实验五 循环控制一、实验目的熟悉使用 while 语句,do-while 语句和 for 语句实现循环的方法。掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等) 。二、实验内容上机完成习题 6.1:输入两个正整数 m 和 n,求出它们的最大公约数和最小公倍数。输入时,使 m=1e-7)e=e+t;i+;p=p*i;t=1.0/p;输出 e 的值3编程求 1 到 n 中能被 3 或 7 整除的数之和。分别用 for 循环语句和 while 循环语句完成本题。程序提示:for 循环语句的主要算法如下:for(i=1;i=1;i-)x=2*x+1实验六 数组一、实
21、验目的1掌握一维数组与二维数组的定义、赋值及输入输出方法。2掌握字符数组和字符串函数的使用。3掌握与数组有关的算法(特别是排序算法)二、实验内容用选择法对个整数排序(从小到大) 。个整数用 scanf 函数输入。程序提示:方法一:冒泡法。见例 6.3方法二:选择法。输入 10 个整数存放到数组 a 的 a0到 a9中输出 10 个数for(i=0;iaj) min=j;交换 ai与 amin输出排序后的 10 个数2有个数存放在一个数组中,输入一个数要求用折半查找法找出该数是数组中的第几个元素的值,如果该数不在数组中,则输出无此数,要找的数用 scanf 函数输入。程序提示:方法一:顺序查找法
22、,即从数组的第一个数开始,将要找的数与数组中的数一一比较,直到找到为止。写出用此方法的程序。方法二:折半查找法,先对数组进行升序排序,每次查找时,只将要找的数与数组中居中的数进行比较,若比居中的数小,再与前一半居中的数比较,否则,与后一半居中的数比较,如此类推,直到找到为止。用循环语句输入 15 个数调用排序算法对其进行排序while(flag)输入要查找的数loca=0;top=0;bott=N-1;if(numberaN-1) loca=-1;while(sign=1if(number=amid)loca=mid;printf(“找到了,数%d 在数组的第%d 位、n“,number,lo
23、ca+1);sign=0;else if(numberakmaxj) flag1=0;/max 不是该列的最小元素if(flag1)printf(“n 第%d 行第%d 列的%d 是鞍点n“,i+,maxj+,max);flag2=1;/endforiif(!flag2) printf(“n 矩阵中无鞍点n“);实验七 函数一、实验目的1掌握定义函数的方法。2掌握函数实参及形参的对应关系以及“值传递”方式。3掌握函数的嵌套调用和递归调用的方法。4掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法。5学会对多文件程序的编译和运行。二、实验内容(1 为必做,2-5 至少选做一个)写出一个判
24、别素数的函数,在主函数输入一个整数,输出是否素数的信息。本程序应准备以下测试数据:17,34,2,0,分别输入数据,运行程序并检查结果是否正确。程序提示:求素数函数如下:int prime(int n)if n=length)length=len;place=point;len=0;return place;在 main 函数中输入一行字符,然后调用上面函数取得最长字符的开始位置,从该位置开始输入数组元素,直到输出的数组元素不是英文字母时止。3用递归法将一个整数 n 转换成字符串。例如输入 483应输出字符串“4 8 3 ”。n 的位数不确定,可以是任意的整数。程序提示:void conver
25、t(int n)int i;if(i=n/10)!=0)convert(i);putchar(n%10+0);在 main 函数中输入一个整数,然后先输出该数的符号,然后调用函数 convert(n)。4求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数用另一个函数根据求出的最大公约数求最小公倍数。分别用下面的两种方法编程。()不用全局变量,在主函数中输入两个数和输出结果。()用全部变量的方法,数据的传递通过全部变量的方法。程序提示:使用下面函数求最大公因子,其中 v 为最大公因子,若将 v 设为外部变量,则可不使用 return 语句。int hcf(int u,int v)/求最大
26、公因子int t,r;if(vu)t=u;u=v;v=t;while(r=u%v)!=0)/余数 r 不为 0 时继续作辗转相除法u=v;v=r;return(v);5写一个函数,输入一个十六进制数,输出相应的十进制数。程序提示:输入时将十六进制数作为一个字符串输入,然后将其每一个字符转换成十进制数并累加,转换方法如下:if(si0PR(“Input three floating numbers f,f2,f3:n“);scanf(Fs,scanf(Fs,scanf(Fs,PR(NL);PR(“Output one floating number each line:n“);PR(F,f1);
27、PR(F,f2);PR(F,f3);PR(NL);PR(“Output two number each line:n“);PR(F2,f , f2);PR(NL);PR(“Output three number each line:n“);PR(F3,f , f2,f3);实验九 指针一、实验目的1通过实验进一步掌握指针的概念,会定义和使用指针变量。2能正确使用数组的指针和指向数组的指针变量。3能正确使用字符串的指针和指向字符串的指针变量。4能正确使用指向函数的指针变量。5了解指向指针的指针的概念及其使用方法。二、实验内容以下程序要求使用指针处理。1 输入三个整数,按由小到大的顺序输出。运行无
28、错后改为:输入三个字符串,按由小到大的顺序输出。程序提示:先排序,排序时交换两个数使用以下函数:void swap(int *pint *p2)int p;p=*p1;*p1=*p2;*p2=p;调用格式为:swap(strcpy(p,p1);strcpy(p,p2);strcpy(p2,p);main 函数结构如下:int n,n2,n3,*p,*p2,*p3;void swap(int *p,int *p2);输入三个数或三个字符串p,p2,p3 分别指向这三个数if(n1n2) swap(p,p2);if(n1n3) swap(p,p3);if(n2n3) swap(p2,p3);输出这
29、三个数2将一个的矩阵转置,用一函数实现。在一主函数中用 scanf 函数输入以下矩阵元素: 将数组名作为函数参数,在执行函数的过程中实现矩阵转置,函数调用结束后在主函数中输出转置后的矩阵。程序提示:使用下面函数实现矩阵转置void move(int *p)int i,j,t;for(i=0;i调用格式为 sin(x),cos(x),exp(x) 程序提示:求积分函数如下:float integral(float (*p)(float),float a,float b,int n)int i;float x,h,s;h=(b-a)/n;x=a;s=0;for(i=0;i*(p+j)temp=*(
30、p+i); *(p+i)=*(p+j); *(p+j)=temp;main 函数如下:void main()void sort(int *p,int n);int i,n,data10,*p,*pstr10;printf(“Input n:“);scanf(“%d“,for(i=0;in;z=z;z=z|(valuen);return(z);unsigned getbits2(unsigned value,int n)unsigned z;z=(1n)return z;main 函数内容如下:int a,n,m;unsigned getbits1(unsigned value,int n);u
31、nsigned getbits2(unsigned value,int n);a=0;if(a5)!=a)printf(“nlogical move!n“);m=0;elseprintf(“n arithmetic move!n“);m=1;printf(“Input an octal number:“);scanf(“%o“,printf(“nHow many digit move owards the right:“);scanf(“%d“,if(m=0)printf(“nArithmetic right move,result:%on“,getbits1(a,n);elseprintf(
32、“Logical right move,result:%o“,getbits2(a,n);2编写一个函数 getbits,从一个位的单元中取出某几位(即这几位保留原值,其余位为) ,函数调用形式为:getbits(value,nn2)value 为该位数的值,n1 为欲取出的起始位,n2 为欲取出的结束位。要求用八进制数输出这几位。注意,应先将这几位右移到最右端,然后用八进制形式输出。程序提示:unsigned getbits(unsigned value,int nint n2)unsigned z;z=0;z=(zn1)return z;3设计一个函数,使给出一个函数的原码,输出该数的补码
33、。程序提示:unsigned getbits(unsigned value)unsigned int z;z=valueif(z=0100000)z=value+1;elsez=value;return z;实验十二 文件一、实验目的1掌握文件、缓冲文件系统、文件指针的概念。2学会使用文件的打开、关闭、读、写等文件操作函数。3学会用缓冲文件系统对文件进行简单的操作。二、实验内容1建立一个程序,用于产生 200 组算式,每组算式包括一个两位数的加法、减法(要求被减数要大于减数) 、乘法和两位数除以一位数的除法算式,每一组为一行,将所有的算式保存到文本文件 d:a.txt 中 程序提示:#incl
34、ude#includevoid main()FILE *fp;int i,a,b,t;fp=fopen(“d:a.txt“,“w“);for(i=1;i=200;i+)a=rand()%100;b=rand()%100;if(b2) b=b+2;fprintf(fp,“t%2d+%2d= “,a,b);a=rand()%100;b=rand()%100;if(ab) t=a;a=b;b=t;fprintf(fp,“t%2d-%2d= “,a,b);a=rand()%100;b=rand()%100;fprintf(fp,“t%2d%2d= “,a,b);a=rand()%100;b=rand()%10;if(b2) b=b+2;if(a10) a=a+10;fprintf(fp,“t%2d%2d= “,a,b);fprintf(fp,“n“);fclose(fp);2在 WORD 中打开 d:a.txt 文件,查看文件内容是否正确3向 d:a.txt 文件追加 100 组算式,每组算式包括一个一位数的加法、减法。程序提示:对 1 题程序进行适当修改(修改打开方式与循环语句) 。