《C语言程序设计》上机实验指导手册.docx
《《C语言程序设计》上机实验指导手册.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》上机实验指导手册.docx(22页珍藏版)》请在冰豆网上搜索。
《C语言程序设计》上机实验指导手册
C语言程序设计
上机实验指导手册
电子与信息工程学院
计算机科学系
第一部分上机实验的指导思想和要求
一、上机实验的目的
学习《C语言程序设计》课程不能满足于“懂得了”,满足于了解了语法和能看懂书上的程序,而应当掌握程序设计的全过程,即能独立编写出源程序,独立上机调试程序,独立运行程序和分析结果。
“程序设计”是一门实践性很强的课程,必须十分重视实践环节。
许多实际的知识不是靠听课和看书学到手的,而是通过长时间的实践积累的。
要提倡通过实践去掌握知识的方法。
必须保证有足够的上机实验时间,学习本课程应该至少有30小时的上机时间,最好能做到与授课时间之比为1:
1。
除了学校规定的上机实验以外,应当提倡学生自己课余抽时间多上机实践。
上机实验的目的,绝不仅是为了验证教材和讲课的内容,或者验证自己所编的程序正确与否。
学习程序设计,上机实验的目的是:
(1)加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无味又难以记住,但它们是很重要的,初学者的程序出错往往错在语法上。
通过多次上机,就能自然地、熟练地掌握。
通过上机来掌握语法规则是行之有效的方法。
(2)熟悉所用的计算机系统的操作方法,也就是了解和熟悉C语言程序开发的环境。
一个程序必须在一定的外部环境下才能运行,所谓“环境”,就是指所用的计算机系统的硬件和软件条件,或者说是工作平台。
使用者应该了解为了运行一个C程序需要哪些必要的外部条件(例如硬件配置、软件配置),可以利用哪些系统的功能来帮助自己开发程序。
每一种计算机系统的功能和操作方法不完全相同,但只要熟练掌握一两种计算机系统的使用,再遇到其他系统时便会触类旁通,很快就能学会。
(3)学会上机调试程序。
也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。
经验丰富的人,在编译连接过程中出现“出错信息”时,一般能很快地判断出错误所在,并改正之。
而缺乏经验的人即使在明确的“出错提示”下也往往找不出错误而求助于别人。
要真正掌握计算机应用技术,就不仅应当了解和熟悉有关理论和方法,还要求自己动手实现。
对程序设计来说,则要求会编程序并上机调试通过。
因此调试程序不仅是得到正确程序的一种手段,而且它本身就是程序设计课程的一个重要的内容和基本要求,应给予充分的重视。
调试程序固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积经验,而且有些经验是只能“会意”难以“言传”。
别人的经验不能代替自己的经验。
调试程序的能力是每个程序设计人员应当掌握的一项基本功。
因此,在做实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在己通过的程序基础上作一些改动(例如修改一些参数、增加程序的一些功能、改变某些语句、改变输入数据的方法等),再进行编译、连接和运行。
甚至于“自设障碍”,即把正确的程序改为有错的(例如语句漏写分号;用scanf函数输入变量时,漏写“&”符号;比较符“==”错写为赋值号“=”;使数组下标出界;使整数溢出等),观察和分析所出现的情况。
这样的学习才会有真正的收获,是灵活主动的学习而不是呆板被动的学习。
二、上机实验前的准备工作
在上机实验前应事先做好准备工作,以提高上机实验的效率,准备工作至少应包括:
(1)了解所用的计算机系统(包括C编译系统和工作平台)的性能和使用方法;
(2)复习和掌握与本实验有关的教学内容;
(3)准备好上机所需的程序。
由于计算机实验室给每个学生安排的时间是有限的,要珍惜时间,充分利用。
应当在上机前按指定的题目编写好程序。
手编程序应书写整齐,并经人工检查无误后才能上机,以提高上机效率。
初学者切忌不编程序或抄别人程序去上机,应从一开始就养成严谨的科学作风;
(4)对运行中可能出现的问题事先作出估计,对程序中自己有疑问的地方,应作出记号,以便在上机时给予注意;
(5)准备好调试和运行时所需的数据。
三、上机实验的步骤
上机实验时一人一组,独立上机,复杂分组进行,相互讨论完成任务。
上机过程中出现的问题,除了是系统的问题以外,一般应自己独立处理,不要轻易举手问教师。
尤其对“出错信息”,应善于自己分析判断。
这是学习调试程序的良好机会。
上机实验一般应包括以下几个步骤:
(1)进入C工作环境(Dev-C++5.8.3)。
(2)输入自己所编好的程序。
(3)检查一遍已输入的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,及时改正。
(4)进行编译和连接。
如果在编译和连接过程中发现错误,屏幕上会出现“出错信息”,根据提示找到出错位置和原因,加以改正。
再进行编译……,如此反复直到顺利通过编译和连接为止。
(5)运行程序并分析运行结果是否合理和正确。
在运行时要注意当输入不同数据时所得到的结果是否正确。
(6)输出程序清单和运行结果。
四、实验验收
(1)现场验收,学生讲解、提问、答辩的方式,通过三方面的表现给出实验成绩;
(2)提交程序清单(电子版)。
第二部分关于程序的调试和测试
一、程序错误的类型
为了帮助各位同学调试程序和分析程序,下面简单介绍程序出错的种类。
(1)语法错误
即不符合C语言的语法规定,例如将main错写为naim,括号不匹配,语句最后漏了分号等,这些都会在编译时被发现并指出。
这些都属于“致命错误”,不改正是不能通过编译的。
对一些在语法上有轻微毛病但不影响程序运行的错误(如定义了变量但始终未使用),编译时会发出“警告”,虽然程序能通过编译,但不应当使程序“带病工作”,应该将程序中所有导致“错误(error)”和“警告(warning)”的因素都消除,再使程序投入运行。
(2)逻辑错误
这是指程序无语法错误,也能正常运行,但是结果不对。
例如求s=l+2+3+…+100,有人写出以下语句:
for(s=0,i=1;i<100;i++)
s=s+i;
语法没有错,但求出的结果是l+2+3+…+99之和,而不是l+2+3+…+100之和,原因是少执行了一次循环。
这类错误可能是设计算法时的错误,也可能是算法正确而在编写程序时出现疏忽所致。
这种错误计算机是无法检查出来的。
如果是算法有错,则应先修改算法,再改程序。
如果是算法正确而程序写得不对,则直接修改程序。
(3)运行错误
有时程序既无语法错误,又无逻辑错误,但程序不能正常运行或结果不对。
多数情况是数据不对,包括数据木身不合适以及数据类型不匹配。
如有以下程序:
voidmain()
{inta,b,c;
scanf(“%d,%d”,&a,&b);
c=a/b;
printf(“%d\n”,c);
}
当输入的b为非零值时,运行无问题。
当输入的b为零时,运行时出现“溢出(overflow)”的错误。
如果在执行上面的scanf语句时输入456.7834.56,则输出c的值为2,显然是不对的。
这是由一于输入的数据类型与输入格式符%d不匹配而引起的。
二、程序的测试
程序调试的任务是排除程序中的错误,使程序能顺利地运行并得到预期的效果。
程序的调试阶段不仅要发现和消除语法上的错误,还要发现和消除逻辑错误和运行错误。
除了可以利用编译时提示的“出错信息”来发现和改正语法错误外,还可以通过程序的测试来发现逻辑错误和运行错误。
程序的测试的任务是尽力寻找程序中可能存在的错误。
在测试时要设想到程序运行时的各种情况,测试在各种情况下的运行结果是否正确。
程序测试是程序调试的一个组成部分。
有时程序在某些情况下能正常运行,而在另外一些情况下不能正常运行或得不到正确的结果,因此,一个程序即使通过编译并正常运行而且结果正确,还不能认为程序没有问题了。
要考虑是否在任何情况下都能正常运行并且得到正确的结果。
测试的任务就是要找出那些不能正常运行的情况和原因。
下而通过一个典型的和容易理解的例子来说明测试的概念。
求一元二次方程ax2+bx+c=0的根。
有人根据求根公式x1,2=(-b±sqrt(b2-4ac))/2a编写出以下程序:
#include
#include
voidmain()
{
floata,b,c,disc,x1,x2;
scanf(“%f,%f,%f”,&a,&b,&c);
disc=b*b-4*a*c;
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf(”x1=%6.2f,x2=%6.2f\n”,x1,x2);
}
当输入a,b,c的值为1,-2,-15时,输出xl的值为5,x2的值为-3。
结果是正确无误的。
但是若输入a,b,c的值为3,2,4时,屏幕上出现了出错信息,程序停止运行,原因是此时b2-4ac小于0,出现了对负数求平方根的运算,故出错。
因此,此程序只适用b2-4ac≥0的情况。
我们不能说上面的程序是错的,而只能说程序对可能出现的情况“考虑不周”,所以不能保证在任何情况下都是正确的。
使用这个程序必须满足一定的前提(b2-4ac≥0),这样,就给使用程序的人带来不便。
人们在输入数据前,必须先算一下,看b2-4ac是否大于或等于0。
一个程序应能适应各种不同的情况,并且都能正常运行并得到相应的结果。
下面分析一下求方程ax2+bx+c=0的根,有几种情况:
(1)a≠0时
①b2-4ac>0有两个不等的实根:
x1,2=(-b±sqrt(b2-4ac))/2a
②b2-4ac=0有两个相等的实根:
x1=x2=-b/2a
③b2-4ac<0有两个不等的共轭复根:
x1,2=(-b±sqrt(b2-4ac)i)/2a
(2)a=0时,方程就变成一元一次的线性方程:
bx+c=0
①当b≠0时,x=-c/b
②当b=0时,方程变为0x+c=0
当c=0时,x可以为任何值;
当c≠0时,x无解。
综合起来,共有6种情况:
①a≠0,b2-4ac>0
②a≠0,b2-4ac=0
③a≠0,b2-4ac<0
④a=0,b≠0
⑤a=0,b=0,c=0
⑥a=0,b=0,c≠0
应当分别测试程序在以上6种情况下的运行情况,观察它们是否符合要求。
为此,应准备6组数据。
用这6组数据去测试程序的“健壮性”。
在使用上面这个程序时,显然只有满足①②情况的数据才能使程序正确运行,而输入满足③~⑥情况的数据时,程序出错。
这说明程序不“健壮”。
为此,应当修改程序,使之能适应以上6种情况。
可将程序改为:
#include
#include
voidmain()
{floata,b,c,disc,x1,x2,p,q;
printf("inputa,b,c:
");
scanf(“%f,%f,%f”,&a,&b,&c);
if(a==0)
if(b==0)
if(c==0)
printf("Itistrivial.\n);
else
printf("Itisimpossible.\n);
else
{printf("Ithasonesolution:
\n);
pirntf("x=%6.2f\n",-c/b);
}
else
{disc=b*b-4*a*c;
if(disc>=0)
if(disc>0)
{printf("Ithastworealsolutions:
\n");
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf(”x1=%6.2f,x2=%6.2f\n”,x1,x2);
}
else
{printf("Ithastwosamerealsolutions:
\n");
printf("x1=x2=%6.2f\n",-b/(2*a));
}
else
{pritnf("Ithastwocomplexsolutions:
\n");
p=-b/(2*a);
q=sqrt(-disc)/(2*a);
printf("x1=%6.2f+%6.2fi,x2=%6.2f-%6.2fi\n",p,q,p,q);
}
}
}
为了测试程序的“健壮性”,我们准备了6组数据:
①3,4,1②1,2,1③4,2,1④0,3,4⑤0,0,0⑥0,0,5
分别用这6组数据作为输入的a,b,c的值,得到以下的运行结果:
①inputa,b,c:
341
Ithastworealsolutions:
x1=-0.33,x2=-1.00
②inputa,b,c:
121
Ithastwosamerealsolutions:
x1=x2=-1.00
③inputa,b,c:
421
Ithastwocomplexsolutions:
x1=-0.25+0.43i,x2=-0.25-0.43i
④inputa,b,c:
034
Ithasonesolutions:
x1=-1.33
⑤inputa,b,c:
000
Itistrivial.
⑥inputa,b,c:
005
Itisimpossible.
经过测试,可以看到程序对任何输入的数据都能正常运行并得到正确的结果。
以上是根据数学知识知道输入数据有6种方案。
但在有些情况下,并没有现成的数学公式作为依据,例如一个商品管理程序,要求对各种不同的检索作出相应的反应。
如果程序包含多条路径(如由if语句形成的分支),则应当设计多组测试数据,使程序中每一条路径都有机会执行,观察其运行是否正常。
以上就是程序测试的初步知识。
测试的关键是正确地准备测试数据。
如果只准备4组测试数据,程序都能正常运行,仍然不能认为此程序己无问题。
只有将程序运行时所有的可能情况都作过测试,才能作出判断。
测试的目的是检查程序有无“漏洞”。
对于一个简单的程序,要找出其运行时全部可能执行到的路径,并正确地准备数据并不困难。
但是如果需要测试一个复杂的大程序,要找到全部可能的路径并准备出所需的测试数据并非易事。
例如:
有两个非嵌套的if语句,每个if语句有两个分支,它们所形成的路径数目为2×2=4。
如果一个程序包含100个if语句,则可能的路径数目为2100=1.267651×1030,要测试每一条路径儿乎是不可能的。
实际上进行测试的只是其中一部分(执行几率最高的部分)。
因此,经过测试的程序一般还不能轻易宣布为“没有问题”,只能说“经过测试的部分无问题”。
正如检查身体一样,经过内科、外科、眼科、五官科……各科例行检查后,不能宣布被检查者“没有任何病症”,他有可能有隐蔽的、不易查出的病症。
所以医院的诊断书一般写为“未发现异常”,而不能写“此人身体无任何问题”。
我们应当了解测试的目的,学会组织测试数据,并根据测试的结果修改完善程序。
第三部分实验内容与安排
实验一简单的C程序实验
1.实验目的
(1)了解Dev-C++集成环境的窗口界面,熟练掌握如何编辑、编译、连接、运行一个C程序以及如何保存和修改C语言的源程序。
(2)通过运行简单的C程序,初步了解C源程序的结构和特点。
(3)学会简单的读程序和调试程序。
2.实验内容
(1)输出图形。
(2)求下图所示田径场的周长和面积。
(3)已知圆的周长与面积公式为:
Cir=2*3.14*rad
Area=3.14*rad*rad
从键盘输入一个半径值,求该圆的周长和面积。
要求:
用主函数实现半径的输入,圆周长和面积的输出,周长和面积用不同的函数来实现。
3.预习内容
《C程序设计(第四版)》第1章、第3章
实验二顺序程序设计
1.实验目的
(1)掌握C语言中使用最多的一种语句——赋值语句的使用方法。
(2)掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法,了解字符型数据和整型数据的内在关系。
(3)掌握不同的类型数据之间赋值的规律。
(4)掌握对各种类型数据的正确输入方法。
(5)学会使用C的有关算术运算符,以及包含这此运算符的表达式。
(6)掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。
(7)进一步掌握编写程序和调试程序的方法。
2.实验内容和步骤
(1)用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,C2=’a’。
问在键盘上如何输入?
#include
intmain()
{
inta,b;
floatx,y;
charc1,c2;
scanf(“a=%db=%d”,&a,&b);
scanf(“%f%f”,&x,&y);
scanf(“%c%c”,&c1,&c2);
………………
return0;
}
(2)设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2为数字。
请编程序。
(3)求ax2+bx+c=0方程的根。
a,b,c由键盘输入,假设b2-4ac>0。
3.预习内容
《C程序设计(第四版)》第3章。
实验三选择结构程序设计
1.实验目的
(1)了解C语言表示逻辑量的方法(以0代表“假”,以非0代表“真”)。
(2)学会正确使用逻辑运算符和逻辑表达式。
(3)熟练掌握if语句和switch语句。
(4)结合程序掌握一些简单的算法。
(5)进一步学习调试程序的方法。
2.实验内容
本实验要求事先编好解决下面问题的程序,然后上机输入程序并调试运行程序。
(1)有3个整数a,b,c,由键盘输入,输出其中最大的数。
(2)有一函数:
x(x<1)
y=2x-1(1≤x<10)
3x-11(x≥10)
写程序,用scanf函数输入x的值,输出y相应的值。
运行程序.输入x的值(分别为x<1、1~10、x>10这3种情况),检查输出的y值是否正确。
(3)给出一个百分制成绩,要求输出成绩等级A、B、C、D、E。
90分以上为A,81~89分为B,70~79分为C,60~69分为D,60分以下为E。
①事先编好程序,要求分别用if语句和switch语句来实现。
运行程序,并检查结果是否正确。
②再运行一次程序,输入分数为负值(如-70),这显然是输入时出错,不应给出等级,修改程序,使之能正确处理任何数据,当输入数据大于100和小于0时,通知用户“输入数据错”,程序结束。
(4)给一个不多于5位的正整数,要求:
①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为321,应输出123。
应准备以下测试数据:
·要处理的数为1位正整数;
·要处理的数为2位正整数;
·要处理的数为3位正整数;
·要处理的数为4位正整数;
·要处理的数为5位正整数。
除此之外,程序还应当对不合法的输入做必要的处理,例如:
·输入负数;
·输入的数超过5位(如123456)。
3.预习内容
《C程序设计(第四版)》第4章。
实验四循环结构程序设计
(一)
1.实验目的
(1)熟悉掌握用while语句、do-while语句实现循环的方法。
(2)掌握在程序设计中用循环的方法实现一些常用算法。
(3)进一步学习调试程序。
2.实验内容
编程序并上机调试运行。
(1)输入两个正整数m和n,求它们的最大公约数和最小公倍数。
在运行时,输入的值m>n,观察结果是否正确。
再输入时,使m修改程序,不论m和n为何值(包括负整数),都能得到正确结果。
(2)分别求出1~100的和、1~50的平方和、1~10的倒数和,并计算三者之和。
(3)输出所有的“水仙花数”,所谓的“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。
例如153是一个“水仙花数”,因为153=13+53+33。
(4)编程序找出1000之内的所有完数,并输出。
所谓完数,是指一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如,6的因子为1,2,3,而6=1+2+3,因此6是完数。
3.预习内容
《C程序设计(第四版)》第5章
实验五循环结构程序设计
(二)
1.实验目的
(1)熟悉掌握用for语句实现循环的方法。
(2)掌握在程序设计中用循环的方法实现一些常用算法。
(3)进一步学习调试程序。
2.实验内容
编程序并上机调试运行。
(1)有一个分数序列:
2/1,3/2,5/3,5/8,13/8,21/13,……
求出这个数列的前20项之和。
(2)一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。
求它在第10次落地时,共经过多少米,第10次反弹多高。
(3)输出以下图案:
*
***
*****
*******
*****
***
*
3.预习内容
《C程序设计(第四版)》第5章
实验六数组
(一)
1.实验目的
(1)掌握一维数组和二维数组的定义、赋值和输入输出的方法。
(2)掌握与数组有关的算法(特别是排序算法)。
2.实验内容
编程序并上机调试运行。
(1)已有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
(2)将一个数组中的值按逆序重新存放。
例如,原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。
(3)输出以下的杨辉三角形(要求输出10行)。
1
11
121
1331
14641
15101051
………………………………
(4)输出“魔方阵”。
所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
例如,三阶魔方阵为(此题选做)
816
357
492
3.预习内容
《C程序设计(第四版)》第6章。
实验七数组
(二)
1.实验目的
(1)掌握字符数组和字符串函数的使用。
(2)掌握与字符数组有关的算法。
2.实验内容
编程序并上机调试运行。
(1)找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。
也可能没有鞍点。
(此题选做)
(2)编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1不要使用strcmp函数。
(3)编写一个程序,将字符数组s2中的全部字符复制到字符数组1中。
不用strcpy函数。
复制时,’\0’也要复制过去,’\0’后面的字符不复制。
3.预习内容
《C程序设计(第四版)》第6章。
实验八函数
(一)
1.实验目的
(1)掌握定义函数的方法。
(2)掌握函数实参与形参的对应关系,以及“值传递”的方式。
(3)掌握函数的调用方法和过程。
(4)掌握函数的递归调用
2.实验内容
编程序