C语言程序设计实验指导上和习题湖南师范大学.docx
- 文档编号:9496408
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:132
- 大小:461.93KB
C语言程序设计实验指导上和习题湖南师范大学.docx
《C语言程序设计实验指导上和习题湖南师范大学.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验指导上和习题湖南师范大学.docx(132页珍藏版)》请在冰豆网上搜索。
C语言程序设计实验指导上和习题湖南师范大学
C程序设计
实验指导
2013年春季
引言
本课程的教学目的在于使学生通过实验C程序设计的基本语言知识(数据类型、控制结构、语法规则等)和基本编程技术(程序分析、算法与编程、常用程序模块等),对面向过程的高级语言程序设计技术有比较完整的理解,并形成程序设计的初步能力,能自己分析问题,按模块化程序设计的要求,编写结构完整、具有一定难度的控制和出错处理功能、由多个功能模块组合形成的小型程序。
本实验指导书是根据2005年出版发行的《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语言与学习和使用任何一门其它程序设计语言一样。
首先要理解程序设计语言的语法和语义;然后通过上机熟悉该语言集成开发环境,掌握编辑、修改、编译、链接、跟踪、调试程序等方面的技巧。
最后还要熟悉语言编译系统提供的库函数或类库,以便快速实现程序的设计与开发。
上机实验就是学习和掌握上面三个环节的重要途径。
“预则立,不预则废”。
上机实验前一定要预先编好有关程序,把上机的重点放到程序的编辑、修改、编译、链接、跟踪、调试程序方面来。
放到观察程序运行过程中的中间结果和运行完毕后的运行结果方面来。
最终使自己的大脑变成一台“计算机”,能够在脑袋中运行自己的程序,判断各种情况下程序的走向等等。
从而提高上机的效率和程序设计的准确性。
优秀的程序员往往不轻易“出手”,但出手往往令人拍案叫绝!
因此,“预”是培养编程者养成一种深思熟虑的好的编程习惯。
实验一C程序集成开发环境熟悉
一、实验目的
掌握在VisualC++6.0集成开发环境下怎样编辑、编译、连接、执行、修改和调试C语言程序。
二、实验内容
1.进入可视化的C++6.0集成开发环境
⑴启动计算机,进入窗口环境操作界面。
⑵鼠标依次点击“开始”→“程序”→“MicrosoftVisualStudio6.0”→“MicrosoftVisualC++6.0”启动VC6.0集成开发环境。
⑶选择“文件”(File)菜单中的“新建”(New)命令,在新建
图1
对话框中,选择“文件”选项卡,再选择“C++SourceFile”类型,按图示操作后单击对话框中的“确定”按钮。
(见图1)
⑷接着就会出现如图2所示的VC界面。
⑸在编辑窗口中,输入如下内容:
图2
#include"stdio.h"
//以上行对于本书中的例子没有给出。
望同学们对于所有的
//程序都保留这样一行。
main()
{printf("Hello!
这是我的FirstC程序.\n");
}
⑹选择“编译”菜单中的“编译my_c1.cpp”命令,并在出现的对话框中选择“是(Y)”结果如图3。
图3
⑺选择“编译”菜单中的“构件my_c1.exe”命令,构建可执行程序my_c1.exe,再选择“编译”菜单中的“!
执行my_c1.exe”命令。
在出现的对话框中选择“是(Y)”,结果屏幕如图4所示。
图4
图中的黑色窗口为运行结果窗口。
按任意键就可返回编辑界面。
⑻修改上述程序,将printf行括号中的双引号去掉左边的,重复⑹,可以看到图5。
其中的编译信息窗显示:
图5
my_c1.obj-16error(s),1warning(s)
可以看到由于一个双引号的漏写,导致出现16个语法错误,而实际上的错误只有一个,这是C编译器的特点,当它遇到错误时,会做出一些判断或推测,有时这种推测判断正确,有时也会错误。
了解这一特点后,希望同学们在上机时,先去修改第一个错误,一般可以在修改一个错误后立即重新编译,这样可以快速减少错误的数目。
下面请同学们用鼠标点击滚动条上的滑块,查看第一条错误信息,并用鼠标双击第一个错误信息。
(图6),
图6
可以看到,C编译器将Hello理解为了标识符,而前面又没有对Hello的说明,所以认为它是未声明的标识符(undeclaredidentifier),这个错误在初学者的程序里非常多见,希望同学们记住它。
将双引号加上再重新编译,就可恢复为无错误了。
⑼修改上述程序,在#include“stdio.h”这一行的最左边加两个“/”,即使得这一行成为注释(显示为绿色),重复⑹,可以看到图7所示的错误。
图7
相信同学们对其中的错误说明不难理解了,C编译器说printf是未声明的标识符。
原因是printf不是C语言的基本部分,它是定义在“stdio.h”中,这也就是我们为什么在前面说要在自己的程序前部加#include“stdio.h”的原因。
⑽请先选择“文件”菜单的“关闭工作区”命令,再按上面的步骤(3)~(5)操作将编辑窗口的程序更换为如下程序文本,依次引入下述错误,每引入一个错误,就对程序进行编译,记录编译器产生的错误信息,写在实验报告里。
/*变量使用相关的语法问题*/
#include"stdio.h"
voidmain()
{inta=1,b=2,c=3;
printf("Someoutput:
%d%d%d\n",a,b,c,c);
}
①把第6行变量声明语句的第一个逗号改为分号
②把第7行printf()改为print()
③去掉第7行中的第2个双引号
④把第7行中a,b,c,c改为a,b,c
⑤去掉printf语句末尾的分号
⑥去掉用于结束的花括号
注意,在引入每一个错误并编译后,开始引入下一个错误前将上一错误再改正。
2.程序的调试手段
作为程序员编写程序,一个难以避免的工作就是对程序的调试。
调试包括语法方面的,这一般通过编译就可基本解决,比如在上述图3中,细心的同学可能注意到在底部的编译信息窗中,编译报告中说:
my_c1.obj-0error(s),1warning(s),意思是编译过程中没发现错误(0error(s)),但有一个不合规范的使用(1warning(s))。
编程序应最好是达到0error和0warning,但有时无法做到如此完美,只要达到0error就可以了。
若不能做到0error,将不能产生机器语言程序,因而也就无法执行程序。
所以同学们在调试自己的程序时,必须是做到经编译后0error。
好在编译器对发现的错误都有一个比较正确的修改意见,同学们按意见修改后一般就可消除错误,只是修改意见是英文的,同学们需有一定的专业词汇或者经过一定时间与VC++的接触,就可理解;另一类就是逻辑方面的,这类错误的消除相对麻烦。
好在VC提供了非常丰富的调试手段,帮助我们分析错误,前提是程序已经没有语法错误,也就是说编译已经通过(0error(s))。
下面我们了解一些常用的,为了便于说明,请先选择“文件”菜单的“关闭工作区”命令,再按上面的步骤(3)~(5)操作将编辑窗口的程序更换为如下程序文本:
#include"stdio.h"
voidmain()
{
floati;
floatsum;
sum=1.0;
i=2.0;
while(i<=100)
{
sum+=1/i;
i=i+2;}
printf("sum=%f\n",sum);
}
⑴打开调试器
首先定位光标到main函数的函数首部所在行,选“编译”“开始调试”“Runtocursor”,出现如下图8所示界面。
在该界面中,“debug”菜单取代了“编译”菜单。
“debug”菜单的主要子菜单如下图9。
图8
Go(去)………………连续执行程序
Restart……………不管程序运行到何处,重新从头开始执行程序
StopDebugging……停止调试器
StepInto…………单步进入语句内执行,如函数调用、复合语句内等
StepOver…………单步越过语句执行,即一步执行完函数调用或复合语句
StepOut……………单步从语句的执行中跳出。
如从函数内跳出或从复合语句中跳出。
RuntoCursor……程序一次执行到光标所在位置暂停
⑵在图10左下角的小窗口中,可以观察程序中用到的变量的取值情况。
如果程序中变量很多,可在右下角的窗口中设定一些特别关心的变量,并可设定几组。
例如,当选择了“stepinto”命令后,屏幕如下图10所示,在重点变量观察窗的Name列输入i,然后单步执行程序,观察i的值Value变化情况。
有关这方
面的更多内容,请参阅MicrosoftVisualC++6.0手册。
三、对上述实验进行总结,将自己在这次实验中所学到的C语言程序上机操作方法及步骤写在实验报告中。
图9
图10
1.转义字符的使用
下列语句的运行结果:
printf(“I’mastudent\t!
you\are\teacher.\n”);
printf(“\thisisa\book\n”);
printf(“a\basket\ball\b\b”);
printf(“\x64\078\087”);
printf(“\872”);
printf(“\\872”);
printf(“SomeNum:
%%d%c”,081,’B’);
4.已知三角形边长求面积
#include
#include
voidmain()
{doublea,b,c,s,area;
a=3;
b=4;
c=5;
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));/*函数sqrt()用于求一个数的平方*/
printf("%4.1f,%4.1f,%4.1f,areais%4.2f\n",a,b,c,area);
2.键入以下代码
#include
voidmain()
printf(“Thisprintsacharacter,%c\nanumber,%d\nafloating\
point,%f”,’z’,123,456.789);
观察输出结果。
(提示:
printf()函数占了两行,在第一行末尾使用了一个反斜杠(\)指出字符串将延续到下一行,因此编译器将把这两行代码视为一行)
五、作业:
1.printf和scanf函数的详细使用方式
答案:
_______________________________________________________________________________
2.写出C语言程序的开发过程
答案:
_______________________________________________________________________________
3.写出语句scanf(“yy-mm-dd=%d-%d-%d”,&year,&month,&date);从键盘上的输入形式。
答案:
____________________________________________________________________________
4.指出下列程序的错误并改正。
①#include
voidmain();
doubledbPi,dbR;dbArea;
dbPi=3.14159;
dbR=10;
dbArea=dbR*dbR*dbPi;
dbL=2*dbR*dbPi;
printf(“\nate=%d,cir=%f\n,dbArea,dbL);
②#include
voidmain()
{
intnA;
printf(\npleaseintputaintegrate:
);
scanf(“%d”,nA);
if(nA>0)printf(“nA>0\n”);
elseprintf(“nA<=0\n”)
}
5.用C语言编写一个程序,实现如下菜单样式:
Menu
===================================
1.Inputthestudents’namesandscores
2.Searchscoresofsomestudents
3.Modifyscoresofsomestudents
4.Listallstudents’scores
5.Quitthesystem
===================================
Pleaseinputyourchoise(1-5):
6.编写一个程序,从键盘上输入华氏温度,屏幕显示对应的摄氏温度。
华氏温度和摄氏温度转换公式为:
c=(f-32)/1.8
7.编程实现求三个数中的最大数。
实验二:
数据类型
一、实验目标:
⏹理解数值数据的表示
⏹理解文字数据的表示
⏹理解C语言中数据类型的分类
⏹熟练应用变量的定义和赋值
⏹熟练应用表达式中数据类型的转换
二、实验重点:
⏹C语言中数据类型的分类
⏹变量的定义和赋值
⏹表达式中数据类型的转换
三、实验难点:
⏹表达式中数据类型的转换
⏹单个字符与字符串存储区别
四、上机操作:
1.仔细思考如下程序,试验以下三个问题:
a.将shortint改为long,看看输出结果;
b.将signedchar改为unsignedchar,看看输出结果;
#include
voidmain()
{shortintsX;
signedcharcCh;
sX=32767;cCh=127;
printf(“X=%d,Ch=%d”,sX,cCh);
sX=sX+1;cCh=cCh+1;
printf(“X=%d,cCh=%d”,sX,cCh);}
2.变量的初始化方式
intnA=96;
charnB=’\028’;
intnC=987654321;
intnD=987654321L
doubledbE=123.456;
intnX=nY,nY=6;
在我们编写程序时,如果按以上方式编写,会出现什么问题?
3.从键盘输入一个整数,以十进制、八进制、十六进制的形式输出:
#include
voidmain()
{intnA,nB,nC,nM,nN;
nA=11;
nB=011;
nC=0x11;
nM=65;
nN=97;
printf("十进制11等于%d,八进制11等于%d,十六进制11等于%d,\n",nA,nB,nC);
printf("十进制八进制十六进制字符\n");
printf("65%o%x%c,\n",nM,nM,nM);
printf("97%o%x%c,\n",nN,nN,nN);
}
4.强制类型转换:
运行如下程序段的观察输出结果:
charcM=100,cCh=’a’;
intnA=5,nB=3;
doubledbC=2.5,dbD;
dbD=nB/2+(int)(nA/2.0+cM/’\062’+cCh*2)/2.0
cCh=cCh+b/1.5;
printf(“dbD=%d,cCh=%c\n”,dbD,cCh);
5.输入下列程序,用于输入一个学生的姓名、学号、英语、数学、计算机成绩,输出学生姓名、学号和平均成绩。
#include
voidmain()
{
charcName[31];/*数组cName[31]最多可以放30个字符或15个汉字*/
intnEng,nMath,nComp,nNum;
doubledbAver;
printf("Pleaseinputthestudent'sname:
");
scanf("%s",cName);
/*字符串用格式符"%s",并且数组名cName前不需要取址符"&"*/
printf("Pleaseinputthestudent'sID:
");
scanf("%d",&cNum);
printf("Pleaseinputscores(Englishmathcomputer):
");
scanf("%d%d%d",&nEng,&nMath,&nComp);
dbAver=(nEng+nMath+nComp)/3.0;
printf("thestudent'snamedis%s,hisIDis%d,hisaveragescoreis%.1f\n",cName,cNum,dbAver);}
五、作业:
1.请写出C语言中基本的数据类型已经它们在内存中所占的字节数。
答案:
______________________________________________________________________________
2.请问charcA=’a’与字符串”a”在内存中是否有区别?
如有请写出它们的区别。
答案:
_______________________________________________________________________________
3.请问在编程过程中什么时候用自动类型转换,什么时候用强制类型转换?
答案:
_______________________________________________________________________________
4.编写输出字符0、9、A、Z、a、z的ASCII码的十进制、八进制和十六进制的表示形式的程序。
5.参考上机试验中例5编写一个程序,输入2个学生的姓名、学号、英语、数学、计算机成绩,输出这两个学生的姓名、学号和平均分。
6.编写一个程序输出5!
、10!
的结果
7.完成教材P66--67页的3.6,3.8,3.9,3.10.
8.完成教材P88—89页的4.4,4.5,4.6,4.7,4.8.
实验三:
控制结构
(一)
一、实验目标:
⏹了解程序设计的一般方法、结构化程序设计
⏹熟悉顺序结构、简单程序流程图的画法
⏹熟练应用if语句的使用规则以及相应的程序流程
⏹熟练应用switch语句的使用规则及相应的程序流程
二、实验重点:
⏹if语句的使用规则以及相应的程序流程
⏹switch语句的使用规则及相应的程序流程
三、实验难点:
⏹if语句的嵌套的应用
四、上机操作:
1.求ax*x+bx+c=0方程的解。
a、b、c由键盘输入,且b*b-4ac>0。
#include
#include
voidmain()
{
floata,b,c,p,x1,x2;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
p=sqrt(b*b-4*a*c);
x1=(-b+p)/(2*a);
x2=(-b-p)/(2*a);
printf("x1=%6.2f,x2=%6.2f\n",x1,x2);
}
2.编写程序,输入一个x,按照函数要求输出y值。
#include
voidmain()
{
intx,y;
scanf("%d",&x);
if(x<0)y=-1;
elseif(x==0)y=0;
elsey=1;
printf("x=%d,y=%d\n",x,y);
}
3.仔细阅读如下程序段,编译运行:
intnX=5,nY=3,nZ=2;
if(nX>6)
printf(“******\n”);
if(nY==3)
printf(“######\n”);
elseif(nZ<3)
printf(“$$$$$$\n”);
else
printf(“%%%%%%\n”);
4.阅读下列两个程序段,看看运行结果:
a、
intnX=0,nY=1;
if(nX&&nY)
printf(“*********\n”);
else
printf(“######\n”);
printf(“nX=%d,nY=%d”,nX,nY);
b、
intnX=0,nY=1;
if(nX++==0||++nY==2)
printf(“******\n”);
else
printf(“######\n”);
printf(“nX=%d,nY=%d”,nX,nY);
5.先不编译,写出如下程序的运行结果:
#include
voidmain()
{
intnX=1,nY=2;
switch(nX){
case1:
switch(nY){
case1:
printf(“aaaaaa\n”);break;
case2:
printf(“bbbbbb\n”);break;
}
case2:
switch(nY-1){
case1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实验 指导 习题 湖南 师范大学