上机调试.docx
- 文档编号:23343933
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:57
- 大小:55.02KB
上机调试.docx
《上机调试.docx》由会员分享,可在线阅读,更多相关《上机调试.docx(57页珍藏版)》请在冰豆网上搜索。
上机调试
高级程序设计(C语言)实验指导书
目录
使用说明3
实验一C语言程序初步4
实验二 数据类型6
实验三 运行符与表达式7
实验四 输入与输出8
实验五 选择结构10
实验六条件型循环结构12
实验七计数型循环结构14
实验八函数的定义及调用17
实验九数组18
实验十指针
(一)21
实验十一指针
(二)23
实验十二结构体和共用体26
实验十四文件28
实验十六综合应用举例
(二)35
附录一:
TurboC程序设计上机指导43
TurboC程序设计初步43
TurboC常用的编辑命令46
TurboC程序的调试48
TurboC编译、连接和运行时的常见错误50
附录二:
C语言程序设计调试技术50
C语言程序设计调试技术
(一)——运行错误的判断与调试50
C语言程序设计调试技术
(二)——基本调试手段50
C语言调试技术(三)-TurboC集成环境的调试功能50
C语言调试技术(四)--图形程序运行的条件50
实验一C语言程序初步
一、目的和要求
1、 熟悉C语言运行环境。
2、 掌握C语言程序的书写格式和C语言程序的结构。
3、 掌握C语言上机步骤,了解运行一个C程序的方法。
二、实验内容
1、 C语言上机步骤:
(A)、进入系统
然后进行编辑源程序->编译->连接->执行程序->显示结果
(B)、常用命令
编辑切换(F6),编译(F9),运行(CTRL+F9),显示结果(ALT+F5)其它常用命令见“附录一”。
2、有下面的C程序,目的是想计算由键盘输入的任意两个整数的积。
/********exl.c********/
#include
main()
{
scanf(“%x,%y”,&x,%y)
p=prodct(x,t)
printf(“Theproductis:
”,p)
}
intprodct(inta,intb)
{
intc
c=a*b
returnc
}
请调试上述程序。
三、实验步骤
1、静态地检查上述程序,改正程序中的错误。
2、在编辑状态下照原样键入上述程序。
3、编译并运行上述程序,记下所给出的出错信息。
4、按照事先静态检查后所改正的情况,进行纠错。
5、再编译执行纠错后的程序。
如还有错误,再编辑改正,直到不出现语法错误为止。
6、下面给出6组测试用例,你认为哪几组较好?
为什么?
(1)0, 0
(2)0, 99
(3)20,50
(4)33000,20
(5)-5,-2
(6)-5,2
要测试出上述程序中所有错误,你认为应当用几组测试用例?
四、分析与讨论
1、记下在调试过程中所发现的错误、系统给出的出错信息和对策。
分析讨论对策成功或失败的原因。
2、总结C程序的结构和书写规则。
实验二 数据类型
一、目的和要求
1、了解C语言中数据类型的意义。
二、实验内容和步骤
1、下面的程序试图计算由键盘输入的任意两个整数的平均值:
#include
main()
{
intx,y,a;
scanf(“%x%y,&x,&y);
a=(x+y)/2;
printf(“Theaverageis:
”a);
}
调试无语法错误后,分别使用下列测试用例对上述程序进行测试:
(1)2,6
(2)1,3
(3)-2,-6
(4)-1,-3
(5)-2,6
(6)-1,3
(7)1,0
(8)1,6
(9)32800,33000
(10)-32800,33000
1、分析上述哪几组测试用例较好?
通过测试,你发现程序有什么错误了吗?
若有错误,请指出错误原因。
2、 操作符sizeof用以测试一个数据或类型所占用的存储空间的字节数。
请编写一个程序,测试各基本数据类型所占用的存储空间大小。
三、分析与讨论
如何正确地选用数据类型?
(提示:
给合前面做过的两个实验及书本进行讨论总结)
实验三 运行符与表达式
一、目的和要求
1、理解常用运行符的意义。
2、掌握C语言表达式的运行规则。
二、实验内容和步骤
1、编写一个C语言程序,测试下列各表达式
i,j
i+1,j+1
i++,j++
++i,++j
i+++++j
++i+++++j++
要求在各表达式中i和j都分别有相同的初值。
在实验中注意下列问题:
(1) 哪些表达式是错误的?
为什么?
(2) 理解+,++,++i,i++的意义和优先级别。
2、编写一个程序,测试常用的十个运算符的优先顺序。
四、分析与讨论
分析总结运算符的优先级。
实验四 输入与输出
一、目的和要求
1、掌握C语言程序输入、输出的方法和格式。
二、实验内容与步骤
1、输入并编辑下面的程序
main()
{
inta,b;
floatc,d;
longe,f;
unsignedintu,v;
charc1,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=%7d\n”,&a,&b);
printf(“c=%10.2f,d=%10.2f\n”,&c,&d);
printf(“e=17ld,f=%17ld\n”,&e,&f);
printf(“u=%o,d=%o\n”,&u,&v);
printf(“c1=%c,d=%c\n”,&c1,&c2);
}
这个程序有语法错误吗?
为什么?
2、调试上述程序无语法错误后,用下面的测试数据,对程序进行测试:
a=123,b=456,c=17.6,d=71837.65,e=70000,f=2174506,u=62000,v=58765,c1=’a’,c2=’b’
分析运行结果。
特别注意输入c1,c2的值是什么?
什么原因?
3、将输入e和f的语句改为:
scanf(“%d,%d”,&e,&f);
再用上述测试数据测试并分析结果。
4、将输入u、v的语句改为:
scanf(“%d,%d”,&u,&v);
再用上述测试数据测试并分析结果。
5、将输出e ,f 的语句改为:
printf(“e=%17d,f=%17d\n”,e,f);
再用上述测试数据测试并分析结果。
6、将输出u、v的语句改为:
printf(“u=%u,v=%u\n”,u,v);
或
printf(“u=%d,v=%d\n”,u,v);
再用上述测试数据测试并分析结果。
7、请读者自己修改程序和改变数据输入的形式,分析各种情况下的输入与输出。
8、在scanf(“%c,%c”,&c1,&c2);语句之前加一个语句:
getchar();
9、验证转义字符\n与\r的意义有何不同。
三、分析与讨论
1、总结在printf函数中可以使用的各种格式指定符,并给出样例。
2、总结在printf函数中可以使用的各转义字符及其功能。
实验五 选择结构
一、实验目的
1、了解条件与程序流程的关系
2、了解用不同的数据使程序的流程覆盖不同的语句、分支和路径。
二、实验内容和步骤
1、题目
有如下程序段:
{……
if(a>1&&b==0)x=x/a;
if(a==2||x>1)x=x+1;
}
为了更容易明白程序的逻辑结构,我们用图5.1所示流程图来加以描述。
y
n
y
n
要求增加一些输入语句和输出语句,以便使上述程序能在不同的a,b和x值下运行,并且能观察程序流程经过(覆盖)了哪些语句、哪些分支及哪些路径。
2、实验步骤
记下分别使用下列各组数据运行时的操作流程。
(1) a=1,b=1,x=1;
(2) a=1,b=1,x=2;
(3) a=3,b=0,x=1;
(4) a=2,b=1,x=4;
(5) a=2,b=1,x=1;
(6) a=1,b=0,x=2;
(7) a=2,b=1,x=1;
(8) a=3,b=0,x=2。
三、分析讨论
(1) 用哪一组数据就可使程序中的每个处理语句都执行一次?
为了找出程序中各条处理语句中的错误,应该使用什么样的数据对程序进行测试?
请上机验证自己的结论。
(2) 用哪两组数据就可以使程序段中的每个分支都运行一次?
这种情形与上面的讨论有何不同?
如果为了找出程序中积压分支中的错误,应该使用什么样的数据对程序进行测试?
请上机验证自己的结论。
(3) 用哪两组数据就可以把判定框中的每个条件运算都进行一次?
如果为了测试出判定条件中的错误,应使用哪些数据对程序进行测试?
请上机验证自己的结论。
(4) 用哪四组数据才可以把各种条件的组合都检测一遍?
如果为了测试各种条件的组合的情形,应该使用什么样的测试数据?
请上机验证自己的结论。
(5) 用哪四组数据才可以把起始到终止的各条路径都覆盖一次?
如果为了测试出程序在不同路径下的错误,应该使用什么样的测试数据?
请上机验证自己的结论。
四、进一步的实验
1. 题目
从键盘上输入三个数,让它们代表三条线段的长度,请写一个判断这三条线段所组成的三角形属于什么类型(不等边,等腰,等边或不构成三角形)的C程序。
2. 请分别设计下列数据对自己的程序进行测试:
(1) 找出各条语句中的错误。
(2) 找出积压分支中的错误。
(3) 找出各条件中的错误。
(4) 找出各种条件组合中的错误。
(5) 找出各条路径中的错误。
实验六条件型循环结构
一、目的和要求
1、掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环的次数。
2、了解条件型循环结构的基本测试方法。
二、实验内容与步骤
1、下面是一个计算e的近似值(使误差小于给定的δ)的程序。
main()
{doublee=1.0,x=1.0,y,detax;
inti=1;
printf(“\npleaseinputenteraerror:
”);
scanf(“%lf”,&detax);
y=1/x;
while(y>=detax)
{
x=x*I;
y=1/x;
e=e+y;
++i;
}
printf(“%12.10lf”,e);
}
2、实验步骤
(1)、阅读上面的程序,写出程序所依据的计算公式。
(2)、当输入的detax各是什么值时,能分别使程序按下面的要求运行:
.不进入循环;
.只循环一次;
.只循环两次;
.进入死循环(程序将永远循环下去)。
为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?
(3)、原程序中while语句中的y>=detax,分别换成y>detax,y=detax,y 假如不知道机器内的程序中的各语句实际上是什么,分别输入什么样的detax来测试出while语句的循环条件写错了。 (4)、把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。 假如不知道机器内的程序实际上是怎么写的,输入什么样的detax就能测试出少了上述这条语句。 (5)、若把原程序中的++i换成i++,观察程序的运行发生了什么变化? 假如不知道这条语句到底是怎么写的,输入什么样的detax就能测试出这条语句写错了. (6)、把原程序中的while结构改写成do—while结构,再分别按上述的 (2)、(3)两步进行实验。 三、分析讨论 总结一下测试条件循环结构的一般方法。 实验七计数型循环结构 一、 目的和要求 1、 掌握如何正确地控制计数型循环结构的次数 2、 了解对计数型循环结构进行测试的基本方法 3、 了解在嵌套循环结构中,提高程序效率的方法 二、 实验内容与步骤 1、 实验题目 下面是一个用以计算 的C程序。 main() { inti,j; longsum=0; for(i=1,i<=20,i++) for(j=1;j<=3;j++) sum=sum+(i+1)*(i+1)*(j+2) printf(“sumis: %d\n”,sum); } 2、 实验步骤 (1) 将上述程序中的和分别做什么样修改,能使程序按如下要求运行: .不循环; .外循环1次,不进入内循环; .外循环,内循环各1次; .外循环1次,内循环2次; .外循环2次,内循环1次; .外循环19次,内循环3次; .外循环20次,内循环2次; .外循环21次,内循环3次。 (2) 试修改程序,以便能知道控制表达式 i=1;j<=20;i++ 和 j=1;j<3;j+= 各执行了多少次? (3)内循环与外循环的控制表达式进行对换,观察程序的执行结果有无变化,并且观 察对换后的外循环与内循环控制表达式执行的总次数有无变化? (4)将(3)中程序写为 main() { inti,j,k; longsum=0; for(j=1.j<=3.j++) { k=j+2; for(i=1;i<=20;i++) sum=sum+(i+1)*(i+1)**k; } printf(“sumis: %d\n”,sum); } 观察程序的执行结果有无变化? (5)将(3)中程序改写为 main() { intI,j,m,n; longsum=0; for(j=1;j<=3;j++) { m=j+2; for(I=1;j<=20;I++) { n=I+1; sum=sum+m*m*k; } } printf(“sumis: %d\n”,sum); } 观察程序的执行结果有无变化? (6)在(5)的程序中,若将外循环控制表达式分别做如下修改: .j=1;j<3;j++ .j=1;j=3;j++ .j=1;j>=3;j++ .j=1;j>3;j++ .j=1;j<=3;j-- .j=1;j>3;j-- .j=1;j<3;j++ .j=0;j<=3;j+= .j=0;j<3;j++ j=1;j<=3;j++ j=1;j<3;++j 观察程序的执行结果有无变化? 三、 分析讨论 (1) 如何测试计数型循环结构的控制表达式中的错误? (2) 从实验中你得到了哪些提高嵌套循环程序效率的启示? 实验八函数的定义及调用 一、 目的与要求 1、 掌握C语言函数定义及调用的规则。 2、 理解参数传递的过程。 二、 实验内容与步骤 1、 上机调试下面的程序,记录系统给出的出错信息,并指出出错原因。 main() { int,y; printf(“%d\n”,sum(x+y)); intsum(a,b) { inta,b; return(a+b); } } 2、 编写并调试一个求(n为整数)的递归函数,希望能在程序运行过程中动态地显示递归函数被调用的轨迹。 三、 分析讨论 1、 针对以上实验内容写出相应的参数传递过程并分析结果。 2、 讨论参数的传递的几种形式。 实验九数组 一、目的和要求 1、掌握数组定义的规则。 2、掌握C语言数组的基本用法。 二、实验内容与步骤 1、编写程序,测试下列数组的定义方式是否正确 (1) main() { intn; scanf(“%d”,&n); inta[n]; …… } (2) main() { constintn=10; inta[n]; } (3) #include #defineM10 main() { inta[M]; } (4) main() { inta[2+2*4]; } (5) #include #defineM2 #defineN8 main() {inta[M+N]; } 通过这一实验,可以说明什么问题? 2、运行下面的C程序,根据运行结果,可以说明什么? main() {intnum[5]={1,2,3,4,5}; intii; for(i=0;i<=5;i++) printf(“%d”,num[i]); } 3、操作符&用以求一个变量的地址,这在函数scanf中已经使用过了。 现在要你设计一个程序,返回一个3*5的二维数组各元素的地址,并由此说明二维数组中各元素是按什么顺序存诸的。 4、为一个起泡排序程序设计测试用例,并测试之。 5、1983年,在ACM图林奖颁奖大会上,杰出的计算机科学家,UNIX的鼻祖,C语言的创始人之一,图林大奖得主,KenThompson上台的第一句话是: “我是一个程序员,在我的1040表上,我自豪地写上了我的职业。 作为一个程序员,我的工作就是写程序,今天我将向大家提供一个我曾经写过的最精练的程序。 ”这个程序如下: chars[]={ ‘\t’, ‘0’, ‘\n’, ‘}’, ‘;’, ‘\n’, ‘\n’, ‘/’, ‘*’, ‘\n’, /*(213linesdeleted)*/ 0 }; /* *Thestringisa *representationofthebody *ofthisprogramfrom‘0’ *totheend */ main() {inti; printf(“char\ts[]={\”}; for(i=0;s[i];i++) printf(“\t%d,\n”,s[i]); printf(“%s”,s); } 请上机运行这个程序,指出它的功能和运行结果。 三、分析讨论 通过实验,分析定义与引用数组的区别。 实验十指针 (一) 一、目的和要求 1. 熟悉指针的正确用法。 二、实验内容和步骤 1、指出下面程序错误的原因。 main() { intx=10,y=5,*px,*py; px=py; px=&x; py=&y; printf(“*px=%d,*py=%d,*px,*py); } 2、下面的程序试图有如下运行结果: whichstyleyouwantto: Capital(c)oruncapital(a): c↙ COMPUTER Whichsytleyouwantto: Capital(c)oruncapital(a): u↙ computer 请调试下面的程序,使其有如上执行结果。 #include main() { chars*; charc; printf(“whichstyleyouwantto: ln”); printf(“capital(c)oruncapital(a): ”); c=getchar(); if(c=’c’)strcpy(s,”COMPUTER”); elsestrcpy(s,”computer”); put(s); } 分析出错原因。 3.下面的程序能获得上述运行结果吗? main() { char*S=”COMPUTER”; charc; printf(“whichstyleyouwantto\n”); printf(“capital(c)oruncapital(u);”); c=getchar(); if(c=’c’) put(s); else{ s=”computer”; puts(s); } } 分析出错原因。 4.设计一个C程序,用以测试下列各表达式的运算。 (1) y=*px++ (2) y=*++py (3) y=(*py)++ (4) y=--*ppx++ 三、分析讨论 数组与指针的联系。 实验十一指针 (二) 一、目的和要求 1、 了解指针参数的特殊性。 2、 掌握函数、指针、数组的用法。 二、实验内容与步骤 1、想使指针变量pt1指向a和b中的大者,pt2指向小者,以下程序能否实现此目的? swap(int*p1,int*p2) { int*p; p=p1;p1=p2;p2=p; } main() { inta,b; scanf(“%d,%d”,&a,&b); pt1=&a;pt2=&b; if(a printf(“%d,%d\n”,*pt1,*pt2); } 上机调试此程序。 如果不能实现题目要求,指出原因,并修改之。 2、 下面的程序。 注意其中的复杂声明语句; int(*function[4])(); 和各标记符的含义,并记录执行结果。 main() { intfun1(); intfun2(); intfun3(); intfun4(); int(*function[4])(); inta=10,b=5,i; function[0]=fun1; function[1]=fun2; function[2]=fun3; function[3]=fun4; for(I=0;I<4;i++) printf(“funno.%d->%d\n”,i+1,execute(a,b,function[i])); } execute(intx,inty,int*fun()) { return(*fun)(x,y);} fun1(intx,inty) { return(x+y);} fun2(intx,inty) { return(x-y);} fun3(intx,inty) { return(x*y);} fun4(intx,inty) { return(x/y);} 3、程序 main(intargc,char*argv[]) { while(argc-->1) printf(“%s\n”,*++argv); 的文件名为echo.h,编译后可执行程序名为echo.exe(用DOS时),运行时输入下面命令行: echoBASICFORTRANCOBOLPASCL 分析输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 调试