




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——C语言试验指导书(第2版)
C语言程序设计
试验指导书
(其次版)
编著曹计昌卢萍李开张茂元
华中科技大学计算机学院
2023年3月
目录
编写说明4试验1TurboC2.0集成开发环境及简单程序调试5
一、试验目的5二、试验任务5三.操作指导(结合第1题)7试验2表达式和标准输入与输出17
一、试验目的17二、试验题目及要求17
1、源程序改错题172、源程序修改替换题183、编程设计题18
试验3流程控制试验19
一、试验目的19二、试验题目及要求19
1.源程序改错题192.源程序修改替换题193.编程设计题194.选做题20
试验4函数与程序结构试验21
一、试验目的21二、试验题目及要求21
1.源程序改错题212.源程序修改替换题213.跟踪调试题224.编程设计题225.选做题23
试验5编译预处理试验24
一、试验目的24二、试验题目及要求24
1.源程序改错题242.源程序修改替换题243.跟踪调试题254.编程设计题26
试验6标准库及用户自定义库试验27
一、试验目的27二、试验题目及要求27
1.编程设计题272.选做题28
试验7数组试验29
一、试验目的29二、试验题目及要求29
2
1.源程序改错题292.源程序完善、修改、替换题293.跟踪调试题304.编程设计题315.选做题31
试验8指针试验32
一、试验目的32二、试验题目及要求32
1.源程序改错题322.源程序完善、修改、替换题323.跟踪调试题334.编程设计题345.选做题34
试验9结构与联合试验35
一、试验目的35二、试验题目及要求35
1.表达式求值的程序验证题352.源程序修改替换题353.编程设计题374.选做题37
试验10文件试验38
一、试验目的38二、试验题目及要求38
1.文件类型的程序验证题382.源程序修改替换题393.编程设计题39
3
编写说明
本试验指导书是根据2023年出版发行的《C语言程序设计》教材编写。在试验题型方面进行了较大改进。除了传统的编程设计题之外,增加了源程序改错题,源程序完善、修改、替换题,程序的调试跟踪题等,目的是培养学生在C语言程序设计方面的实际编程动手能力。即:培养学生跟踪程序,设置断点,调试程序的能力;排除程序中语法、规律方面错误与故障的能力;养成细致、周密、严谨的编程作风。
源程序改错题先给出一些含有典型,常见错误的源程序,让学生通过编译或运行发现错误,并加以改正,从而改正初学者易犯的常见错误。
源程序修改替换题也是先给出源程序,然后要求学生按要求编写修改替换原来程序中的部分代码。如:用if语句和goto语句替换while循环,用switch语句替换多个if语句,用while循环替换for循环等。使学生把握同一种算法的多种不同实现。
跟踪调试结果填空题先给出源程序,要求学生填写程序运行过程中的某些中间结果。强迫学生用断点设置、单步跟踪等调试程序,观测并填写相应的中间结果。
编程设计题只给出题目,要求学生完成从源程序的编程、编辑、修改,编译产生目标代码,链接产生可执行文件,运行程序得到正确结果的全部环节。要求预先编写程序,上机试验从源程序的编辑开始。考虑学生上机试验的完成进度区别较大,因此每个试验安排3个题目,前2个必做,后一个供速度快的同学选做。3个题目的难度依次为易、中、较难。
C语言程序设计的上机试验是进一步深刻了解C语言的语法、语义,把握用C语言进行初步程序设计所需要的方法和技能的一个重要环节。优秀的程序员毫无例外的都是在机器上“摸爬滚打〞出来的。C语言的创始人DennisM.Ritchie是如此,C++的创始人BjarneStroustrup也是如此。这些语言大师们都是在机器上使用现行语言遇到巨大障碍的状况下才产生了发明新的计算机语言灵感和动力。DennisM.Ritchi直到上世纪90年代还在它的386机器上编程。因此作为C语言的初学者一定要要重视试验。
学习C语言与学习和使用任何一门其它程序设计语言一样。首先要理解程序设计语言的语法和语义;然后通过上机熟悉该语言集成开发环境,把握编辑、修改、编译、链接、跟踪、调试程序等方面的技巧。最终还要熟悉语言编译系统提供的库函数或类库,以便快速实现程序的设计与开发。上机试验就是学习和把握上面三个环节的重要途径。
“预则立,不预则废〞。上机试验前一定要预先编好有关程序,把上机的重点放到程序的编辑、修改、编译、链接、跟踪、调试程序方面来。放到观测程序运行过程中的中间结果和运行完毕后的运行结果方面来。最终使自己的大脑变成一台“计算机〞,能够在脑袋中运行自己的程序,判断各种状况下程序的走向等等。从而提高上机的效率和程序设计的确凿性。优秀的程序员往往不轻易“出手〞,但出手往往令人拍案叫绝!因此,“预〞是培养编程者养成一种深思熟虑的好的编程习惯。
由于时间仓促,本试验指导书仅仅是试用版,先供大家参考。希望同学们在参考使用过程中多提宝贵看法,以便今后逐步加以完善。试验指导书中试验1、试验3由李开老师编写,试验4、试验5由张茂元老师编写,试验2、试验6和试验10由卢萍老师编写,试验7、试验8、试验9由曹计昌老师编写。并由曹计昌老师对试验指导书统稿。
参编的老师们衷心希望自己的学生将来能够成为编程高手,成为计算机领域的优秀人才!
4
试验1TurboC2.0集成开发环境及简单程序调试
一、试验目的
编写简单的C程序(顺序结构的程序),熟悉TurboC2.0集成开发环境,学会在集成开发环境中运行和调试程序的方法。我们将通过一个简单的例子演示操作步骤,有关TurboC2.0开发环境的详细信息请参阅教材的附录4。
二、试验任务
通过编辑、编译、链接、调试、执行下面程序。熟悉TurboC2.0集成开发环境及简单程序设计与调试过程。
1.输入三角形三边a,b,c的值,计算并输出三角形的面积。三角形面积公式为:
area?s(s?a)(s?b)(s?c)
s=(a+b+c)/2
(平方根函数的调用形式为sqrt(x),x和函数值均为浮点类型,sqrt所需的系统头文件为。)源程序如下:
#include#include
voidmain(void){
floata,b,c,s,t;
scanf(\s=(a+b+c)/2/*Line9*/t=s*(s-a)*(s-b)*(s-c);/*Line10*/area=sqrt(t);/*Line11*/print(\}
2.输入自己的名字的汉语拼音,要计算机问候自己并且输出这是自己学习C语言的第一个程序的句子。源程序如下:
#include\voidshow(charstr[]);voidmain(void){
charname[20];
printf(\
5
}3.(选做)编程实现1.5.2中输入10个整数,统计正数和负数的个数,计算正数和负数的累加和与平均值的算法。源程序如下:
#include\voidmain(void){
intx,k,positive,negtive,sum_pos,sum_neg;floateven_pos,even_neg;k=1;
positive=negtive=sum_pos=sum_neg=0;while(k0){
positive++;sum_pos+=x;}
else{
++negtive;sum_neg+=x;}}k++;}
even_pos=(float)sum_pos/positive;even_neg=(float)sum_neg/negtive;
printf(\printf(\
printf(\printf(\}
gets(name);
printf(\show(name);}
voidshow(charstr[]){
printf(\
6
三.操作指导(结合第1题)
(一)设置编译环境
1.创立自己的目录
为了避免将不同的人、不同性质和用途的程序混放在一起,每个学生设一个专用的子目录,源程序文件和编译生成的目标文件都可以存放在此子目录中。在本例中创立自己的目录D:\\WT
2.进入TC
TC的执行程序tc.exe本身也是一个DOS程序,假使在Windows中运行tc.exe,则首先转到MS-DOS环境,然后执行以下操作系统命令:
cd\\tc(将当前目录指定为TC目录,该目录下有tc.exe)c:\\tc>tc(执行tc.exe进入TC)
退出TC有两种方式:一种是ALT-X(终止退出),终止退出后必需执行tc.exe才能重新进入TC;另一种是FILE/OSSHELL(驻留退出),驻留退出时用EXIT返回TC(不能用tc.exe)。
3.设置目录路径
选择Options/Directories,会弹出一个窗口,如图1所示。
图1
第1行Includedirectories指“包含文件〞所在的目录,系统显示出默认的子目录C:\\TC\\INCLUDE。第2行Librarydirectories指库文件所在的目录,系统显示出默认的子目录C:\\TC\\LIB。第4行TurboCdirectory指TurboC系统文件所在的目录,系统显示的是安装时的默认目录C:\\TC。假使你的“包含文件〞、库文件和系统文件存放的目录与缺省路径不一致,就作相应的修改。第3行Outputdirectory指定输出文件(.obj文件和.exe文件)存放的目录,需要用户指定。假使用户不指定,系统就会就会将它保存在当前工作目录中。现在我们想指定输出文件目录为我们自己的目录,在选中第3行Outputdirectory后,按回车键,就会弹出一个“输出文件目录〞对话框,在此框内输入D:\\WT,见图2,它表示要将.obj文件和.exe文件保持在D:\\WT子目录中。
7
图2
在进行了以上设置后,还应当把这些信息保存起来。方法是:在上述设置完毕后按Esc键返回Options菜单,然后选择SaveOptions菜单项,将对环境的重新设置保存到配置文件(tcconfig.tc)中。
(二)运行程序
1.编辑和存盘
输入新程序:FILE/NEW,此时光标处于空白的编辑窗口(Edit区)等待用户输入。将本试验中其次部分的源程序照原样输入。
保存新文件:FILE/WRITETO,输入带路径的文件名。
在本例中输入d:\\wt\\area.c,将源文件area.c保存到自己的目录d:\\wt中,见图3。
图3
装入已存在的程序(老程序):FILE/LOAD,或F3,此时可输入要装入的源程序文件名(或直接按回车,然后从列表框中选取)。保存老文件:FILE/SAVE,或F2。
8
2.编译、连接和运行
2.1编译和连接过程中发现错误
在本例中,输入源程序后,按Ctrl+F9键,屏幕上的显示如图4所示。
图4
从中间的窗口可以看到在编译中发现了2个警告和2个错误。所谓“警告(Warning)〞是指较微弱的错误,系统对此能够容忍,依旧把有警告的程序生成目标文件和可执行文件,可以执行程序,但不保证程序的运行结果正确。而“错误(Errors)〞是指严重的错误,系统不能容忍任何一个错误,编译系统对有错误的程序不生成目标文件和可执行文件,必需改正后再重新编译和连接。
按任何一个键后,中间的编译信息窗口消失,在屏幕下部的Message窗口中,显示了具体的出错信息,见图5。
图5
该窗口的第1行显示的是编译的文件名。第2行是出错信息,告诉用户在编译的源文件中的第10行出现了一个错误,错误的内容是:Statementmissing;infunctionmain(主函数中的语句漏了一个分号)。从图5可以看到该行是以高亮度显示的。与此相
9
应,在上部Edit窗口中的源程序第10行也是以高亮度显示的,这样便于用户对照检查。我们可以发现是第9行的末尾漏了一个分号,而不是第10行漏了分号。为什么会显示是第10行漏了分号呢?这是由于编译系统在检查第9行时,发现语句末尾没有分号,但这时还不能判定该语句有错,由于C语言允许把一个语句分写在两行上。因此,编译系统接着检查第10行,看第10行的开头有无分号。当发现第10行的开头没有分号时才判定出错,但此时的位置已是第10行了,所以报错的行数为第10行。所以,在看到出错信息时,不能只简单地从系统显示的出错行数去找错,应当连同上下行一起检查。
在按回车键后,激活了上面的编辑窗口,光标自动停留在第10行上,以便用户修改,两个窗口中的高亮度显示行已恢复为正常显示。在编辑窗口顶部用红色显示方才观测的出错信息,以便用户对照检查修改,见图6。
图6
我们在第9行末尾加上一个分号,然后再分析第2个错误。先按F6键以激活Message窗口,用?和?键使第2条出错信息用高亮度显示,见图7。
图7
Message窗口中的第2个出错信息行告诉我们:源程序第11行有错误,错误的内容是:Undefinedsymbol‘area’infunctionmain(符号area在主函数中未被定义)。
10
可以看到编辑窗口中源程序第11行也是以高亮度显示的,经检查发现变量area未定义,应当修改。按回车键,激活编辑窗口,光标停留在第11行上,同时在编辑窗口顶部显示出错信息行。将程序第6行改为:floata,b,c,s,area;
作了以上的修改后,再按Ctrl+F9键,屏幕上的显示如图8所示。
图8
从中间的窗口可以看到在连接中发现了1个错误。按任何一个键后,中间的连接信息窗口消失,在屏幕下部的Message窗口中,显示了具体的出错信息,见图9。
图9
第3行是出错信息,内容是:Undefinedsymbol‘_print’inmodulearea.c(符号print在area.c文件中未被定义),经检查发现库函数的名字写错了,应当修改。按F6键,激活编辑窗口,将程序第11行的print改为printf。
再按Ctrl+F9键,这次程序就可以开始运行了。
2.2在TC集成环境中运行
在编辑窗口完成一个源程序的编辑后,假使经过检查认为没有问题,就可以直接按Ctrl+F9键。这时TurboC将一次完成从编译、连接到运行的全过程。这是运行TurboC
11
程序最简便常用的方法。假使在编译或连接中有错,就将停下来,显示出错信息,等用户改正后再按Ctrl+F9键重新编译、连接;如不出错,就自动开始运行。
程序运行时,如有键盘输入语句,屏幕显示会切换到用户屏,此时用户可从键盘输入数据。在本例中,按Ctrl+F9键以后,屏幕显示切换到用户屏,要求输入数据,用户可从键盘输入:345见图10。
图10
按回车键后,屏幕的显示又从用户屏切换回TC窗口,因此用户看不到运行结果。假使想看运行结果,可按Alt+F5键,此时屏幕显示切换到用户屏。程序运行的结果显示在用户屏上。
用户在看完运行结果后,如想回到编辑窗口继续对源程序进行编辑修改,可按任一键即回到TC窗口。
下面把最常用的功能键的有关操作简要列出:Ctrl+F9:编译、连接、运行
Alt+F5:观看运行结果
按任一键:从用户屏切换回TC窗口
2.3在DOS环境下运行
假使在编译、连接过程中未发现错误,系统就会生成可执行文件.EXE,在DOS环境下进入可执行文件.EXE所在的目录,直接输入可执行文件名,即可运行程序。在本例中可执行文件名为area.exe,输入命令方式为:d:\\wt>area
(三)用DEBUG方式运行程序
程序的编译和连接没有错误,不等于运行结果一定正确。编译系统能检查出语法错误,但无法检查出规律错误。在本例中,经过修改,这个源程序已经没有语法错误,顺利通过编译和连接。在运行时如输入:345则输出结果为:area=0
12
这个结果显然是不对的。可能用户难以很快地找出错误的原因,这时可采用下面介绍的两种动态调试方法。1.单步执行
这种方法的特点是:程序一次执行一行。每执行完一行后,就停下来,用户可以检查此时各有关变量和表达式的值,以便发现问题所在。
对本例中的程序,重新开始运行,按F7键,可以看到在编辑窗口的源程序的主函数main()处,用高亮度显示,表示准备进入main函数。同时可以看到屏幕下部的Message窗口变成了Watch窗口,它是观测数据用的,见图11。
图11
再按一次F7键,亮条移到第8行(第6行是对变量的定义,不是执行语句,故被跳过),表示下一步要执行此行。再按一次F7键,此时执行第8行,由于该行是scanf函数语句,需要输人数据,所以切换到用户屏,用户在此处输入:
345
按回车键后,屏幕显示切换到编辑窗口,亮条移到第9行,表示第8行已执行完毕。再按两次F7键,亮条移到第11行,表示第10行已执行完毕。此时可以检查一下有关变量的值是否正确。按Ctrl+F7键,在编辑窗口中出现一个观测数据的输入框。假使我们想查看变量a的值,就在此框内输入字符a,见图12。
13
图12
按回车键后,该输入框消失,在屏幕下部的Watch窗口显示出a的当前值3.0,见图13。
图13
假使还想查变量b的值,需要重新按Ctrl+F7键,并在Addwatch框内输入字符b,然后按回车键,就可在Watch窗口看到变量b的值是4.0。用同样方法可得到变量c的值5.0,变量s的值6.0,变量t的值36.0。现在,Watch窗口中的信息如下:
t:36.0s:6.0c:5.0b:4.0a:3.0
最先查看的a值在最下面一行,最终查看的s值在最上面一行。这些值都是正确的,没有问题。应再继续运行,检查后面的语句有无问题。再按一次F7键,亮条移到main函数的第12行,表示第11行已执行完毕。此时,按Ctrl+F7键,在Addwatch框内输入area并按回车键,在Watch窗口中显示出area的值是6.0,而不是0。三角形面积应当等于此值。那么为什么printf函数会输出0呢?我们再按F7键,亮条移到main函数的第13行,表示第12行已执行完毕。在Watch窗口中显示出area的值依旧是6.0,说明area的值是对的,而printf函数语句的输出不对。由于printf函数语句已执行完,应当在用户屏上有输出,用Alt+F5观测用户屏上的显示,发现输出结果为area=0。至此,出错的范围已缩得很小了,就在printf函数语句内,而且确定是输出格式有问题,导致未能正确输出一个数据。经细心检查,发现用了输出整数的格式符%d,这就查出了出错的原因。将%d改为%f,再用Ctrl+F9运行程序。在输入3,4,5之后,输出结果为:
area=6.000000结果正确。
以上我们通过一个简单的例子详细地介绍了如何用单步执行的方法进行动态调试。实际上,对这种简单的程序,大量人可能很快就能查出错误所在,而不必采用单步执行方法,我们主要是通过这个例子来说明如何使用F7和Ctrl+F7键检查程序的错误。
上面是用功能键实现单步执行的方法,也可以通过选择菜单命令来实现单步执行。用Run下拉菜单中的Traceinto命令也能使程序单步执行,相当于按一次F7键。选择主菜单
14
条中的Break/watch后按回车键,得到下拉菜单。从中选择Addwatch,并按回车键,也可得到Addwatch输入对话框,相当于按一次Ctrl+F7键。显然,用功能键比用菜单项选择择便利得多。
2.设置断点
单步执行法能有效地、一行一行地检查感兴趣的数据的值,但是假使程序很长,是难以逐行进行检查的。对于一个较长的程序,常用的方法是在程序中设若干个断点,程序执行到断点时暂停,用户可以检查此时有关变量或表达式的值。假使未发现错误,就使程序继续执行到下一个断点,如此一段一段地检查。这种方法实质上是把一个程序分割成几个分区,逐区检查有无错误,这样就可以将找错的范围从整个程序缩小到一个分区,然后集中精力检查有问题的分区。再在该分区内设若干个断点,把一个分区分成几个小区,然后寻觅有错的小区。用这种方法可不断缩小找错范围直到找到出错点。
设断点的方法是:将光标移到某一行上,然后按Ctrl+F8键,此行就以颜色条覆盖,作为断点行。假使想取消断点行,则将光标移到断点行上,再按一次Ctrl+F8键,颜色条消失,该行就不再是断点行。运行时遇断点行暂停,此时,用户可以用前面介绍过的方法查看有关变量和表达式的值。假使想继续运行,再按一次Ctrl+F9键即可。
按Ctrl+F9使此程序运行,输入a、b、c的值1、2、6。在终止运行后,按Alt+F5键观测用户屏,发现输出为:
sqrt:DOMAINerror
Floatingpomterror:Overflow.这显然不对。
为了找出问题所在,可在程序中第9行、第11行和第12行设置断点,把光标先后移到这三行,并按Ctrl+F8键,这三行就被红色条覆盖,如图14所示。
图14
按Ctrl+F9运行程序,执行到scanf函数语句时,切换到用户屏,输入a、b、c的值。这次输入:126
程序继续执行到第一个断点行暂停。请注意是遇到断点行即暂停,所以断点行并未被执行,只执行到断点行的上一行。此时按Ctrl+F7键查看a,b,c的值,从Watch窗口可以看到a,b,c的值是正确的。到目前为止,并未发现程序有错误。再按Ctrl+F9键使程序继续运行,到其次个断点暂停。此时再按Ctrl+F7键查看t的值,从Watch窗口可以看到t
15
的值为-59.0625,t为负值在计算平方根时会出现错误。为证明此点,按Ctrl+F9继续运行,执行“area=sqrt(t);〞时屏幕闪了一下(这是程序向用户屏输出信息,然后又切换回TC窗口而产生的),按Alt+F5键观测用户屏,可看到出错信息:
sqrt:DOMAINerror
Floatingpomterror:Overflow.
表示在调用sqrt函数时,出现数据范围的错误(sqrt要求参数值不小于0,负数超出了有效范围),引起“浮点数错误——溢出〞。这个错误是由于输入a,b,c的值不恰当而造成的,程序本身并无错误,不需要修改程序。在以后运行时应注意使输入的三角形三边的值要满足三角形的性质:两边之和大于第三边。
16
试验2表达式和标准输入与输出
一、试验目的
1.熟练把握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中的类型
转换,重点是C语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结合性;
2.把握getchar,putchar,scanf和printf函数的用法。3.把握简单C程序(顺序结构程序)的编写方法。
二、试验题目及要求
1、源程序改错题
下面给出了一个简单C语言程序例程,用来完成以下工作:1.输入华氏温度f,将它转换成摄氏温度c后输出;2.输入圆的半径值r,计算并输出圆的面积s;
3.输入短整数k、p,将k的高字节作为结果的低字节,p的高字节作为结果的高字节,拼成一个新的整数,然后输出;
在这个例子程序中存在若干语法和规律错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。
#include#definePI3.14159;voidmain(void){
intf;
shortp,k;doublec,r,s;
/*fortask1*/
printf(“InputFahrenheit:〞);scanf(“%d〞,f);c=5/9*(f-32);
printf(“\\n%d(F)=%.2f(C)\\n\\n〞,f,c);
/*fortask2*/
printf(\scanf(\
17
s=PI*r*r;
printf(\
/*fortask3*/
printf(\scanf(\
newint=(pprintf(\}
2、源程序修改替换题
下面的程序利用常用的中间变量法实现两数交换,请改用不用第三个变量的交换法实现。#includevoidmain(){
inta,b,t;
printf(“Inputtwointegers:〞);scanf(“%d%d〞,t=a,a=b,b=t;
prinf(“\\na=%d,b=%d〞,a,b);}
3、编程设计题
上机调试运行以下程序:
(1)编写一个程序,输入字符c,假使c是大写字母,则将c转换成对应的小写,否则c的值不变,最终输出c。
(2)编写一个程序,输入无符号短整数x,m,n(0≤m≤15,1≤n≤16-m),取出x从第m位开始向左的n位(m从右至左编号为0~15),并使其向左端(第15位)靠齐。(3)IP地址寻常是4个用句点分隔的小整数,如32.55.1.102。这些地址在机器中用无符号长整形表示。编写一个程序,以机器存储的形式读入一个32位的互联网IP地址,对其译码,然后用常见的句点分隔的4部分的形式输出。
18
试验3流程控制试验
一、试验目的
1.把握复合语句、if语句、switch语句的使用,熟练把握for、while、do-while三种基
本的循环控制语句的使用,把握重复循环技术,了解转移语句与标号语句。2.练习循环结构for、while、do-while语句的使用。3.练习转移语句和标号语句的使用。
4.使用TurboC2.0集成开发环境中的调试功能:单步执行、设置断点、观测变量值。
二、试验题目及要求
1.源程序改错题
下面是计算s=n!的源程序,在这个源程序中存在若干语法和规律错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。例如,8!=40320。#includemain()
{inti,n,s=1;
printf(\scanf(\for(i=1,i够正确完成指定任务。源程序如下:
#include\#include\structs_list{
intdata;/*数据域*/
structs_list*next;/*指针域*/};
voidcreate_list(structs_list*headp,int*p);voidmain(void){
structs_list*head=NULL,*p;
ints[]={1,2,3,4,5,6,7,8,0};/*0为终止标记*/create_list(head,s);/*创立新链表*/p=head;/*遍历指针p指向链头*/while(p){
printf(\输出数据域的值*/p=p->next;/*遍历指针p指向下一结点*/}
printf(\}
voidcreate_list(structs_list*headp,int*p){
structs_list*loc_head=NULL,*tail;if(p[0]==0)/*相当于*p==0*/;
else{/*loc_head指向动态分派的第一个结点*/
loc_head=(structs_list*)malloc(sizeof(structs_list));loc_head->data=*p++;/*对数据域赋值*/tail=loc_head;/*tail指向第一个结点*/
while(*p){/*tail所指结点的指针域指向动态创立的结点*/
tail->next=(structs_list*)malloc(sizeof(structs_list));tail=tail->next;/*tail指向新创立的结点*/
tail->data=*p++;/*向新创立的结点的数据域赋值*/}
tail->next=NULL;/*对指针域赋NULL值*/}
headp=loc_head;/*使头指针headp指向新创立的链表*/}
(2)修改替换create_list函数,将其建成一个后进先出的链表,后进先出链表的头指针始终指向最终创立的结点(链头),后建结点指向先建结点,先建结点始终是尾结点。
36
3.编程设计题
(1)设计一个字段结构structbits,它将一个8位无符号字节从最低位向最高位声明为8个字段,各字段依次为bit0,bit1,?,bit7,且bit0的优先级最高。同时设计8个函数,第i个函数以biti(i=0,1,2,?,7)为参数,并且在函数体内输出biti的值。将8个函数的名字存入一个函数指针数组p_fun。假使bit0为1,调用p_fun[0]指向的函数。假使structbits中有多位为1,则根据优先级从高到低依次调用函数指针数组p_fun中相应元素指向的函数。8个函数中的第0个函数可以设计为:voidf0(structbitsb)
{
Printf(“thefunction%discalled!\\n〞,b);}
(2)用单向链表建立一张班级成绩单,包括每个学生的学号、姓名、英语、高等数学、普通物理、C语言程序设计四门课程的成绩。用函数编程实现以下功能:
(1)输入每个学生的各项信息。(2)输出每个学生的各项信息。
(3)修改指定学生的指定数据项的内容。
(4)统计每个同学的平均成绩(保存2位小数)。
(5)输出各位同学的学号、姓名、四门课程的总成绩和平均成绩。4.选做题
(1)对编程设计题第(2)题的程序,增加依照平均成绩进行升序排序的函数,写出用交换结点数据域的方法升序排序的函数,排序可用选择法或冒泡法。
(2)对选做题第(1)题,进一步写出用交换结点指针域的方法升序排序的函数。
(3)采用双向链表重做编程设计题第(2)题。
37
试验10文件试验
一、试验目的
1.熟悉文本文件和二进制文件在磁盘中的存储方式;2.熟练把握流式文件的读写方法。
二、试验题目及要求
1.文件类型的程序验证题
设有程序:
#includevoidmain(void){
shorta=0x253f,b=0x7b7d;charch;
FILE*fp1,*fp2;
fp1=fopen(\fp2=fopen(\fwrite(fwrite(fprintf(fp2,\
rewind(fp1);rewind(fp2);
while((ch=fgetc(fp1))!=EOF)putchar(ch);putchar('\\n');
while((ch=fgetc(fp2))!=EOF)putchar(ch);putchar('\\n');
fclose(fp1);fclose(fp2);}
(1)请思考程序的输出结果,然后通过上机运行来加以验证。
(2)将两处sizeof(short)均改为sizeof(char)结果有什么不同,为什么?
(3)将fprintf(fp2,\改为fprintf(fp2,\结果有什么不同。
38
2.源程序修改替换题
将指定的文本文件内容在屏幕上显示出来,命令行的格式为:
typefilename
(1)源程序中存在什么样的规律错误(先观测执行结果)?对程序进行修改、调试,使之能够正确完成指定任务。
#include#include
voidmain(intargc,char*argv[]){
charch;FILE*fp;if(argc!=2){
printf(\exit(-1);}
if((fp=fopen(argv[1],\指向filename*/printf(\exit(-1);}
while(ch=fgetc(fp)!=EOF)/*从filename中读字符*/putchar(ch);/*向显示器中写字符*/fclose(fp);/*关闭filename*/}
(2)用输入输出重定向freopen改写main函数。
3.编程设计题
(1)从键盘输入一行英文句子,将每个单词的首字母换成大写字母,然后输出到一个磁盘文件“test〞中保存。
(2)设计一个通信录管理程序,程序应有以下9个选项:
①录入每个联系人的基本信息(至少应有姓名、单位、电话、邮件地址);②从磁盘文件中读取记录到内存;③保存记录到磁盘文件;④修改记录;⑤插入一条记录;
39
⑥删除一条记录;⑦显示所有的记录;
⑧按姓名对记录升序排序⑨退出要求:
1)用链表结构;
1)采用结构化程序设计,将每个功能定义成函数;2)应有用户界面,提供菜单项选择项。
40
试验4函数与程序结构试验
一、试验目的
1.熟悉和把握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类型的定义和返回值使用。
2.熟悉和把握不同存储类型变量的使用。3.熟悉多文件编译技术。
二、试验题目及要求
1.源程序改错题
下面是计算s=1!+2!+3!+?+n!的源程序,在这个源程序中存在若干语法和规律错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。#include\voidmain(void){
intk;
for(k=1;k=4isthesumoftwoprimes.10=3+712=5+7??20=3+17
22
5.选做题
1、设file1.c如下:#include
intx,y;/*外部变量的定义性说明*/charch;/*外部变量的定义性说明*/voidmain(void){
x=10;y=20;
ch=getchar();
printf(\func1();}
file2.c如下:
externintx,y;/*外部变量的引用性说明*/externcharch;/*外部变量的引用性说明*/voidfunc1(void){
x++;y++;ch++;
printf(\}
试用TCC进行多文件编译和链接。然后在DOS环境下运行生成的可执行文件。
23
试验5编译预处理试验
一、试验目的
5.把握文件包含、宏定义、条件编译、assert宏的使用;6.练习带参数的宏定义、条件编译的使用;7.练习assert宏的使用;
8.使用TurboC2.0集成开发环境中的调试功能:单步执行、设置断点、观测变量值。
二、试验题目及要求
1.源程序改错题
下面是用宏来计算平方差、交换两数的源程序,在这个源程序中存在若干语法和规律错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。#include\#defineSUMa+b#defineDIFa-b
#defineSWAP(a,b)a=b,b=avoidmain{
intb,t;
printf(\scanf(\printf(\thedifferencebetweensquareofaandsquareofbis:%d\SUM*DIF);
SWAP(a,b);
Printf(\}
2.源程序修改替换题
下面是用函数实现求三个数中最大数、计算两数之和的程序,在这个源程序中存在若干语法和规律错误。
要求:1)对这个例子程序进行调试修改,使之能够正确完成指定任务;
2)用带参数的宏替换函数max,来实现求最大数的功能。voidmain(void){
inta,b,c;
24
floatd,e;
printf(\scanf(\
printf(\
printf(\scanf(\
printf(\%f\\n\}
intmax(intx,inty,intz){
intt;if(x>y)t=x;elset=y;if(t
#endif}
intinteger_fraction(floatx){
inti=x;returni;}
1)修改程序,使程序编译通过且能运行;
2)单步执行。进入函数decimal_fraction时watch窗口中x为何值?在返回main时,watch窗口中i为何值?3)排除错误,使程序能正确输出面积s值的整数部分,不会输出错误信息assertionfailed。
4.编程设计题
(1)三角形的面积是area?s(s?a)(s?b)(s?c),其中s?(a?b?c)/2,a,b,c为
三角形的三边,定义两个带参数的宏,一个用来求s,另一个用来求area。编写程序,用带参数的宏来计算三角形的面积。
(2)用条件编译方法来编写程序。输入一行电报文字,可以任选两种输出:一为原文输出;二为变换字母的大小写(如小写‘a’变成大写‘A’,大写‘D’变成小写‘d’),其他字符不变。用#define命令控制是否变换字母的大小写。例如,#defineCHANGE1则输出变换后的文字,若#defineCHANGE0则原文输出。
26
试验6标准库及用户自定义库试验
一、试验目的
1.熟悉和把握C图形库的使用。2.学会建立库的基本方法。3、学会使用标准库中的随机数函数。
二、试验题目及要求
1.编程设计题
(第1题必做,第2~4题可以任意选作)
1)写一个程序:模拟重复投掷一个硬币直到连续掷出三次heads。程序应当演示每次投掷的结果(tails或heads)以及投掷硬币总数。
2)编程序实现多变的填充矩形,程序运行时,显示一个矩形,以白色为填充色,当按下任意键时,矩形的填充图案和颜色会发生改变。
3)在不同的位置以不同的大小画10个圆。每个圆应当随机地选择半径并且被摆在屏幕里一个随机的位置上,每个圆必需适合窗口,以防止伸展出边界。
4)创立一个日历库,该库包括MonthName、MonthDays、FirstDayOfMonth和IsLeapYear四个函数。这四个函数的函数原型及功能为:①char*MonthName(intmonth);
该函数将月份month转换成对应的英文名,如将月份2转换成February。②intMonthDays(intmonth,intyear);该函数返回某年year某月month的天数。③intFirstDayOfMonth(intmonth,intyear);
该函数计算某年year某月month的第一天是星期几,返回该结果。④intIsLeapYear(intyear);
该函数判断某年year是否闰年,是,返回1,否则返回0。
创立一个提供这四个函数连同星期里每天名称的常量的接口caltools.h。然后创立一个文
27
件caltools.c实现那些函数。编写calendar.c程序以应用该接口。
2.选做题
1)编写程序:利用两页屏幕来实现单摆的往复运动。方法是:在活动页上绘制单摆的下一位置图形后,再将此活动页变成可见页,另一页变成活动页画下一个单摆图,如此重复,单摆便运动起来。
2)创立一个新的图形库,该库中包括DrawBox,DrawCenteredBox,DrawTriangle和DrawGrid四个函数。这四个函数的函数原型及功能为:
①voidDrawBox(intx,inty,intwidth,intheight);
该函数画一个矩形,其左上角坐标是(x,y),宽度为width,高度为height。②voidDrawCenteredBox(intx,inty,intwidth,intheight);
该函数画一个矩形,其中心点坐标是(x,y),宽度为width,高度为height。③voidDrawTriangle(intx,inty,intbase,intheight);
该函数画一个底边水平的等腰三角形,底边的左端点坐标是(x,y),底边长度为base,三角形高度为height。假使height为正数,是顶点在上面的正三角形;假使height为负数,是顶点在下面的倒三角形
④voidDrawGrid(intx,inty,intwidth,intheight,intcolumns,introws);该函数画一个内有网格的矩形,矩形的左上角坐标是(x,y),宽度为width,高度为height。矩形内有columns列rows行。
定义一个新的接口gfigures.h提供这4个函数,并且写相应的gfigures.c文件来实现那些函数口。编写*.c程序以应用该接口(自由设计一图形)。
28
试验7数组试验
一、试验目的
1.把握数组的说明、初始化和使用。
2.把握一维数组作为函数参数时实参和形参的用法。3.把握字符串处理函数的设计,包括串操作函数及数字串与数之间转换函数实现算法。4.把握基于分治策略的二分查找算法和选择法排序算法的思想,以及相关算法的实现。
二、试验题目及要求
1.源程序改错题
下面程序用来将数组a中元素按升序排序后输出。分析程序中存在的问题,并对程序进行修改,使之能够正确完成任务。#includevoidmain(void){
inta[10]={27,13,5,32,23,3,17,43,55,39};voidsort(int[],int);inti;
sort(a[0],10);
for(i=0;i
29
#defineM10#defineN3voidmain(void){
inta[M],b[M];/*数组a存放圈中人的编号,数组b存放出圈人的编号*/inti,j,k;
for(i=0;i1;i--){
/*i表示圈中人个数,初始为M个,剩1个人时终止循环;j表示当前报数人的位置*/
for(k=1;ki-1)j=0;/*最终一个人报数后第一个人接着报,形成一个圈*/b[M-i]=j?:;/*将报数为N的人的编号存入数组b*/if(j)
for(k=--j;k
voidstrncat(char[],char[],int);voidmain(void){
chara[50]=\strncat(a,b,4);
printf(\}
voidstrncat(chars[],chart[],intn){
inti=0,j;
while(s[i++]);
for(j=0;j5);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 2248-2025液体容积式流量计型式评价大纲
- 防洪设施监测与检测技术考核试卷
- 呼吸衰竭患者的抢救配合
- 校园心肺复苏急救方法
- 安全教育饮食卫生
- 外科血气分析临床案例解析
- 婴儿窒息复苏急救方法
- 教师优则校优
- RMC-4998-formic-生命科学试剂-MCE
- “特朗普经济学”系列之十六:限制对华投资美国有哪些手段
- 学校预防性侵教育活动开展情况总结
- 剖腹产延长产假申请书
- 2023年06月江苏南通如东县司法局等17家单位招录政府购买服务人员124人笔试题库含答案详解
- 湖南三支一扶考试历年真题
- 心肺运动试验-PPT-医学课件
- 物流公司安全生产规章制度汇编
- 门诊急危重症优先处置制度及程序全套资料
- 灭火和疏散应急预案流程图
- 西藏自治区建筑与市政工程竣工验收报告
- 文化产业经济学 焦斌龙课件第五章 文化产业结构
- GB/T 32831-2016高能激光光束质量评价与测试方法
评论
0/150
提交评论