1、1C 语言程序设计实验指导韶关学院计算机科学学院庄景明课程性质:非独立设置的实验课 课程类别:专业基础课学时学分:总学时 72、总学分 4、实验学时 18、实验学分 1适用专业: 计算机科学与技术,信息管理与信息系统专业层次:本科,专科第一部分 上机实验的指导思想和要求1上机实验的目的学习 C 语言程序设计课程不能满足于 “懂了” ,满足于能看懂书上的程序,而应当熟练地掌握程序设计的全过程,即独立编写出源程序,独立上机调试程序,独立运行程序和分析结果。程序设计是一门实践性很强的课程,必须十分重视实践环节,必须保证有足够的上机实践时间。学习本课程应该至少有 18 小时的上机时间,最好能做到上机时
2、间与授课时间之比为 11。除了学校规定的上机实验以外,应当提倡学生自己课余抽时间多上机实践。上机实验的目的是:(1)加深对讲授内容的理解,尤其是一些语法规定。(2)熟悉 C 语言程序开发的环境。(3)学会上机调试程序。也就是善于发现程序中的错误,并且能很快地排除这些错误。要学会根据“出错提示” ,分析并找出错误。调试程序的能力是每个程序设计人员应当掌握的一项基本功。因此,在做实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序的一些功能、改变输入数据的方法等),再进行编译、连接和运行;甚至于 “自设障碍” ,即把正确的程序改为有
3、错的( 例如,用 scanf 函数输入变量时,漏写“”符号;使数组下标出界;使整数溢出等) ,以观察和分析所出现的情况。 2上机实验前的准备工作(1)了解所用的计算机系统( 包括 C 编译系统) 的性能和使用方法。(2)复习和掌握与本实验有关的教学内容。(3)准备好上机所需的程序。(4)对运行中可能出现的问题应事先作出估计;对程序中自己有疑问的地方,应作上记2号,以便在上机时给予注意。(5)准备好调试和运行时所需的数据。3上机实验的步骤(1)调出 C 编译系统,进人 C 工作环境( 例如 Turbo c 集成环境) 。(2)输人自己编好的程序(3)检查一遍已输人的程序是否有错( 包括输入时打错
4、的和编程中的错误),如发现有错,则及对改正。(4)进行编译。如果在编译和连接过程中发现错误,输出窗口会出现“出错信息” ,根据提示找到出错位置和原因,加以改正,再进行编译如此反复,直到顺利通过编译和连接为止。(5)运行程序,并分析运行结果是否合理和正确。在运行时要注意当输入不同数据时所得到的结果是否正确(例如解方程 ax2+bx+c=0 时,不同的 a、b、c 组合应得到相应的不同结果)。此时应运行几次,分别检查在不同情况下程序是否正确。(6)输出程序清单和运行结果。4写实验报告,实验报告应包括以下内容:(1)预习报告(题目,实验目的,实验设备,程序清单,疑难问题等)(2)实验数据(3)实验过
5、程报告(4)实验小结。5实验内容的安排结合所学内容布置上机练习题。应要求学生在实验前将教师指定的题目编好程序,然后上机输人和调试。第二部分 关于程序的调试和测试l程序错误的类型主要有以下几种:(1)语法错误:不符合 C 语言的语法规定。例如将 printf 错写为 pintf,括弧不匹配,语句最后漏了分号等,这些都会在编译时被发现并指出。这些都属于“致命错误” ,不改正是不能通过编译的。对一些在语法上有轻微毛病但不影响程序运行的问题(如定义了变量但始终未使用),编译时会发出“ 警告” 。虽然程序能通过编译,但不应当使程序“带病工作” ,应该将程序中所有“导致错误(error)”和“警告(war
6、ning)”的因素都排除再使程序投人运行。(2)逻辑错误:程序无语法错误,也能正常运行,但是结果不对。例如求 s=1+2+3+100,有人写出以下语句:for(s=0,i=1;i编译-连接-执行程序-显示结果(2) 、常用命令编辑切换(F6) ,编译(F9 ) ,运行(CTRL+F9) ,显示结果(ALT+F5)其它常用命令见“附录一” 。2、有下面的程序,目的是想计算由键盘输入的任意两个整数的积。#include “stdio.h”main() int x,y,p;scanf(“%d,%”,p=prodct(x,t) ;printf(“The product is %d”,p);int pr
7、odct(int a ,int b )int c ; c=a*b;return c;三、分析与讨论、记下在调试过程中所发现的错误、系统给出的出错信息和对策。分析讨论对策成功或失败的原因。、总结程序的结构和书写规则。5实验二 数据类型、运算符和表达式的应用(实验学时:2 学时 )一、目的和要求、了解语言中数据类型的意义。、掌握不同数据类型之间的赋值的规律。3、学会有关 C 语言的有关运算符,以及包含这些运算符的表达式,特别是是+ 和运算符的使用。4、进一步熟悉 C 程序的编辑环境。二、实验内容和步骤、下面的程序试图计算由键盘输入的任意两个整数的平均值:include main()int x,y,
8、a;scanf(“%x,%y”,a=(x+y)/2;printf(“The average is%dn”a);调试无语法错误后,分别使用下列测试用例对上述程序进行测试:(),()1,(),(),(),2、输入以下程序main()int j,k,m,n;k=8;j=10;m=k+;n=+j;printf(“%d,%d,%d,%d”,k,j,m,n);(1) 、运行程序,观察结果。(2) 、分析+在变量之前和在变量之后的不同点?6三、分析与讨论如何正确地选用数据类型、总结运算符的优先级? 7实验三 最简单程序设计(实验学时:2 学时 )一、目的和要求、掌握语言程序输入、输出的方法和格式。、学会编写
9、简单的 C 程序。二、实验内容与步骤、输入并编辑下面的程序main()int a,b;float c,d;long e,f;unsigned int u,v;char c1,c2;scanf(“%d,%d”,a,b);scanf(“%f,%f”,c,d);scanf(“%ld,%ld”,e,f);scanf(“%o,%o”,u,v);scanf(“%c,%c”,c1,c2);printf(“n”);printf(“a=%7d,b=%7dn”,printf(“c=%10.2f,d=%10.2fn”,printf(“e=17ld,f=%17ldn”,printf(“u=%o,d=%on”,prin
10、tf(“c1=%c,d=%cn”,这个程序有语法错误吗?为什么?、调试上述程序无语法错误后,用下面的测试数据,对程序进行测试:a=123,b=456,c=17.6,d=71837.65,e=70000,f=2174506,u=62000,v=58765,c1=a,c2=b分析运行结果。特别注意输入 c1,c2 的值是什么?什么原因?、将输入 e 和 f 的语句改为:scanf(“%d,%d”,再用上述测试数据测试并分析结果。、将输入 u、v 的语句改为:scanf(“%d,%d”,再用上述测试数据测试并分析结果。8、将输出 e ,f 的语句改为:printf(“e=%17d,f=%17dn”,
11、e,f);再用上述测试数据测试并分析结果。、将输出 u、v 的语句改为:printf(“u=%u,v=%un”,u,v);或printf(“u=%d,v=%dn”,u,v);再用上述测试数据测试并分析结果。、请自己修改程序和改变数据输入的形式,分析各种情况下的输入与输出。、在 scanf(“%c,%c”,、验证转义字符n 与 r 的意义有何不同。三、分析与讨论、总结在 printf 函数中可以使用的各种格式指定符,并给出样例。、总结在 printf 函数中可以使用的各转义字符及其功能。9a1if(a=2|x1) x=x+1;为了更容易明白程序的逻辑结构,我们用图 4.1 所示流程图来加以描述。
12、ynyn要求增加一些输入语句和输出语句,以便使上述程序能在不同的 a,b 和 x 值下运行,并且能观察程序流程经过(覆盖)了哪些语句、哪些分支及哪些路径。() 、实验步骤记下分别使用下列各组数据运行时的操作流程。10() a=1,b=1,x=1;() a=1,b=1,x=2;() a=3,b=0,x=1;() a=2,b=1,x=4;() a=2,b=1,x=1;2、(1) 、题目已知三个数 a,b,c ,找出最大值放于 max 中。分析:由已知可得在变量定义时定义四个变量 a,b,c 和 max,a,b,c 是任意输入的三个数,max 是用来存放结果最大值的。第一次比较 a 和 b,把大数存
13、入 max 中,因a,b 都可能是大值,所以用 if 语句中 ifelse 形式。第二次比较 max 和 c,把最大数存入 max 中,用 if 语句的第一种形式 if 形式。Max 即为 a,b,c 中的最大值。include “stdio.h“main()int a,b,c,max; /*定义四个整型变量*/scanf(“a=%d,b=%d,c=%d”,if (a=b)max=a; /*a=b*/else max=b; /*amax)max=c; /*c 是最大值*/printf(“max=%d“,max);(2) 、实验步骤若输入下列数据,分析程序的执行顺序并写出运行结果(1)a=1,b
14、=2,c=3 (2)a=2,b=1,c=3 (3)a=3,b=2,c=1 3、(1) 、题目输入某学生的成绩,经处理后给出学生的等级,等级分类如下:90 分以上(包括 90): A80 至 90 分(包括 80):B70 至 80 分(包括 70):C60 至 70 分(包括 60):D60 分以下: E方法一:(用 if 嵌套)分析:由题意知如果某学生成绩在 90 分以上,等级为 A;否则,如果成绩大于 80 分,等级为 B;否则,如果成绩大于 70 分,等级为 C;否则,如果成绩大于 60 分为 D;否则,如果成绩小于 60 分,等级为 E;但当我们输入成绩时也可能输错,出现小于 0 或大
15、于100,这时也要做处理,输出出错信息。因此,再用 if 嵌套前,应先判断输入的成绩11是否在 0100 之间。#include“stdio.h“main() int score;char grade;printf(“nplease input a student score:“);scanf(“%f“,if(score100|score=90)grade=A;else if(score=80)grade=B;elseif(score=70)grade=C;else if(score=60)grade=D;else grade=E;printf(“nthe student grade:%c“,
16、grade); 输入测试数据,调试程序。测试数据要覆盖所有路径,注意临界值,例如此题中得100 分,60 分,0 分以及小于 0 和大于 100 的数据。方法二:用 switch 语句分析:switch 语句是用于处理多分支的语句。注意,case 后的表达式必须是一个常量表达式,所以在以用 switch 语句之前,必须把 0100 之间的成绩分别化成相关的常量。所有A(除 100 以外) ,B,C,D 类的成绩的共同特点是十位数相同,此外都是 E 类。则由此可得把 score 除十取整,化为相应的常数。#include“stdio.h“main()int g,s;char ch;printf(
17、“ninput a student grade:“);scanf(“%d“,12s=g/10;if(s10)printf(“ninput error!“);else switch (s) case 10:case 9: ch=A; break;case 8: ch=B; break;case 7: ch=C; break;case 6: ch=D; break;default: ch=E;printf(“nthe student scort:%c“,ch); 输入测试数据,同方法一一样调试程序并写出结果。4、有一函数:y=x x=10用 scanf 函数输入 x 的值(分别为 x=10 三种情
18、况),求 y 值。分析:y 是一个分段表达式。要根据 x 的不同区间来计算 y 的值。所以应使用 If 语句。main() int x,y;printf(“please input x :”);scanf(“%d”,if (x=10写一程序,输入 x, 输出 y。2、给出一百分制成绩,要求输出成绩等级 A、B、C、D、E。90 分以上为 A,8089为 B, 7079 分为 C,6069 分为 D,60 分以下为 E。3、给一个不多于 5 位的正整数,要求:(1)求出它是几位数;(2) 、分别打出每一位数字;(3) 、按逆序打出各位数字,例如原数为 321,应输出 123。4、输入 4 个整数
19、,要求按由小到大的顺序输出。14实验五 循环结构程序设计(实验学时:2 学时 )(一)实验类别:设计(二)每组人数:1 人(三)实验要求:必修一、目的和要求1、掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环的次数。2、了解条件型循环结构的基本测试方法。3、掌握如何正确地控制计数型循环结构的次数。4、了解对计数型循环结构进行测试的基本方法。5、了解在嵌套循环结构中,提高程序效率的方法。二、实验内容与步骤1、(1) 、下面是一个计算 e 的近似值(使误差小于给定的 )的程序。main()double e=1.0,x=1.0,y,detax;int i=1;printf(“
20、n please input enter a error:”);scanf(“%lf”,y=1/x;while(y=detax)x=x*i;y=1/x;e=e+y;+i;printf(“%12.10lf”,e);2、实验步骤(1) 、阅读上面的程序,写出程序所依据的计算公式。(2) 、当输入的 detax 各是什么值时,能分别使程序按下面的要求运行:.不进入循环;15.只循环一次;.只循环两次;.进入死循环(程序将永远循环下去 )。为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?(3) 、原程序中 while 语句中的 y=detax,分别换成ydetax,y=detax,yn)
21、;其次,算法:使 k 为 m 除以 n 的余数,如果 m 能被 n 整除,则 k 值为 0,n 为这两个数的最大公约数,否则,使 k 代替 n,n 代替 m,重复以上过程,直到 k 值为 0。#include“stdio.h“main()int m,n,k,result;printf(“Enter two numbers:“);scanf(“%d,%d“,if(m0 if(k= =0)result=m;elsen=m;m=k;while(k0); /*循环取余求出最大公因子*/printf(“The greatest common divistor is:%dn“,result);else p
22、rintf(“Nonpositive values not allowedn“);10、用牛顿迭代求方程 2x3-4x2+3x-6=0 在 1.0 附近的根。#include “math.h”main()float x,x0,f,f1;x=1.0;18do x0=x;f=(2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x=x0-f/f1;while(fabs(x-x0)=1e-5);printf(“%6.2f”,x);11、打印下列图案*main() int i,j;for(i=1; imain()int m,i,k;scanf(“%d”,k=sqrt(m+1);fo
23、r(i=2;i=k+1)printf(“%d is a prime numbern”,m);else printf(“%d is not a prime numbern”,m);三、程序设计1、输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 2、求 Sn=a+aa+aaa+aaa 之值,其中 a 是一个数字。例如:192+22+222+2222+22222(此时 n=5), n 由键盘输入。3、求和 1!+2!+3 !+4!+20!4、打印 100-999 之间所有的 “水仙花数”。 “水仙花数” 是一个三位数,其各位数立方和等于该数本身。5、一个数如果恰好等于它的因子之和,这个数就
24、称为完数。求 1000 之内的所有完数。6、有一数列:2/1,3/2,5/3,8/5,求出这个数列的前 20 项之和。7、用迭代法求 x= a 。求平方根的迭公式为xn+1=1/2(xn+a/xn)要求前后两次求出的 x 的差的绝对值小于 10-58、用牛顿迭代求方程 2x3-4x2+3x-6=0 在 1.5 附近的根。9、打印下列图案*20实验六 数组及应用(实验学时:2 学时 )(一)实验类别:设计(二)每组人数:1 人(三)实验要求:必修一、目的和要求1、掌握 C 语言数组的基本用法。2、掌握一维数组的定义、赋值和输入输出的方法;3、掌握字符数组的使用;4、掌握二维数组的定义、赋值和输入
25、输出的方法;5、掌握与数组有关的算法(例如排序算法) 。二、实验内容与步骤1、在键盘上输入 N 个整数,试编制程序使该数组中的数按照从大到小的次序排列。分析:C 中数组长度必须是确定大小,即指定 N 的值。排序的方法有多种,我们取出其中两种作为参考。方法一:起泡排序从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1 )遍比较后就可以完成排序。源程序如下:#define N 10#include“stdio.h“main()int aN,i,j,temp
26、;printf(“please input %d numbersn“,N);for(i=0;iaj+1)temp=aj;21aj=aj+1;aj+1=temp;printf(“the array after sort:n“);for(i=0;iaj)min=j;temp=ai;ai=amin;amin=temp;for(i=2;imain( )char c30;int i,sum=0;gets(c);for(i=0;imax)max= aij;r=i;c=j;printf(“max=%d , row =%d , colum=%d n”,max , r, c);235、打印以下图案:* * *
27、* * * * * * * * * * * * * * * * * *main()char a5= * , * , * , * , * ;int i,j,k;char space= ;for(i=0;iv)t=u; u=v; v=t;a=u; b=v;while(r=b%a)!=0)b=a; a=r;return(a);lcd(u,v,h)int u,v,h;return(u*v/h);main()int u,v,h,l;scanf(“%d,%d“,h=hcf(u,v);printf(“H.C.F=%dn“,h);l=lcd(u,v,h);printf(“L.C.D=%dn“,l);这是一个十
28、分典型的算法,同学们一定要认真分析、学习。5、写一函数,用“起泡法” 对输入的 10 个字符按由小到大顺序排序。源程序如下:/*起泡法排序*/#define N 10char strN;28main()int i,flag;for (flag=1; flag = =1;)printf(“n 输入字符串,长度为 10:n”);scanf(“%s”,if (strlen(str)N)printf(“超过长度,请重输!”);else flag = 0;sort(str);printf(“n 排序结果:”):for (i=0;istri+1)t=stri; stri=stri+1; stri+1=t;
29、6、用牛顿迭代法求根。方程为 ax3+bx2+cx+d=0,系数 a、b、c、d 由主函数输入。求x 在 1 附近的一个实根。求出根后,由主函数输出。源程序如下:/*牛顿迭代法解方程*/#include “math.h”float solut(a,b,c,d)float a,b,c,d;float x=1,x0,f,f1;dox0=x;f=(a*x0+b)*x0+c)*x0+d;f1=(3*a*x0+2*b)*x0+c;x=x0-f/f1;29while(fabs(x-x0)=1e-5);return(x);main()float a,b,c,d;printf(“n 输入方程的系数 a,b,c
30、,dn”);scanf(“%f,%f,%f,%f”,printf(“n 方程是:%5.2fx3+%5.2fx2+%5.2fx+%5.2f=0”,a,b,c,d);printf(“nX=%10.7fn”,solut(a,b,c,d);在此题目中,方程的系数是未知的,这是与以前我们用牛顿迭代法的时候不同的地方。但原理、算法是相同的,这里我们用函数来求方程的根。也就是把牛顿迭代法用函数的形式表现出来。三、程序设计1 定义一个函数,功能是计算 n 个学生的成绩中,高于平均成绩的人数,并作为函数值。用主函数来调用它,统计 50 个学生成绩中,高于平均成绩的有多少人?2、编写一个对 n 个数据从大到小的排
31、序 C 函数,再编写一个计算最后得分的 C 函数,计算方法是:去除一个最高分,去除一个最低分,其余的平均分为参赛选手的最后得分。并在主函数中调用它们对有 n 个评委评分,m 个选手参赛的最后得分,从大到小排序输出。3、编写一个程序,包括主函数和如下子函数。(1) 输入 10 个无序的整数;(2) 用起泡方法从大到小排序;(3) 要求输入一个整数,用折半查找法找出该数,若存在,在主函数中输出其所处的位置,否则,插入适当位置。分析:input 函数完成 10 个整数的录入。sort 函数完成起泡法排序, search 函数完成输入数的查找。4、 编写并调试一个求(n 为整数)的递归函数,希望能在程
32、序运行过程中动态地显示递归函数被调用的轨迹。30实验八 指 针 (实验学时:2 学时 )(一)实验类别:设计(二)每组人数:1 人(三)实验要求:必做一、目的和要求1、熟悉指针的正确用法。2、本实验可在学习了教材第 10.3 节之后运行。3、了解指针参数的特殊性。4、 掌握函数、指针、数组的用法。5、实验可在学习了教材第六章后进行。二、实验内容和步骤1、想使指针变量 pt1 指向 a 和 b 中的大者,pt2 指向小者,以下程序能否实现此目的?swap(int *p1,int *p2)int *p;p=p1;p1=p2;p2=p;main()int a,b;scanf(“%d,%d”,pt1=pt2=if(ab)swap(pt1.pt2);printf(“%d,%dn”,*pt1,*pt2);上机调试此程序。如果不能实现题目要求,指出原因,并修改之。三、程序设计1、 输入 3 个字符,按由小到了大的顺序输出。2、 有 n 个整数,使其右循环移 m 个位置,写函数实现以下功能,n,m 在 main 函数中输入,并输出循环可移之后的 n 个数。3、 输入一行文字,统计大写字母、小写字母、空格、数字字符及其他字符各多少个?4、 入 3 个整数,按由小到大的顺序输出。5、 利用指针作函数参数,设计一函数实现将 n 个元素进行排序。