
第2章 C语言实验
实验1 熟悉实验环境
1. 实验目的
(1)熟悉C语言运行环境,了解和使用Visual C++ 6.0集成开发环境;
(2)熟悉Visual C++ 6.0环境的功能键和常用的功能菜单命令;
(3)掌握C语言程序的书写格式和C语言程序的结构;
(4)掌握C语言上机步骤,以及编辑、编译和运行一个C程序的方法;
(5)熟悉Visual C++ 6.0环境下的程序调试方法。
2. 实验指导
在本实验中,将使用Visual C++ 6.0编制如下两个简单的程序。
(1)编制一个程序实现向屏幕上输出一个字符串“Hello World!”,掌握编辑、编译、运行一个C程序的方法;
(2)在已知x、y值的情况下,计算出x与y的和、差、积、商的值并显示在屏幕上,通过对该程序的调试,初步掌握Visual C++ 6.0的调试方法。
1)编辑、编译和运行C程序的方法
编制运行程序的过程主要包括以下4个步骤:
• 编辑(将程序代码输入到C程序源文件(.c文件)中);
• 编译(将源文件编译成目标程序文件(.obj文件));
• 链接(将源文件和其他相关文件链接成可执行文件(.exe文件));
• 运行(运行可执行文件)。
上述4个步骤中,第一步的编辑工作最繁杂而又必须细致地由人工在计算机上来完成,其余几个步骤则相对简单,基本上由计算机来自动完成。
下面给出具体实验内容。
(1)启动并进入Visual C++ 6.0集成开发环境。
从桌面或“开始”程序菜单单击Microsoft Visual C++ 6.0进入Visual C++ 6.0集成开发环境,显示如图2-1所示界面。

图2-1 Visual C++ 6.0启动界面
(2)创建工程。
单击File菜单的New菜单项,打开如图2-2所示的对话框。

图2-2 New对话框(Projects选项卡)
在Projects选项卡中,单击Win32 Console Application工程类型,在Location文本框中输入创建工程的位置(如D:\CProgs\demo),在Project name文本框中输入工程名称(本例将工程命名为demo),最后单击OK按钮,弹出如图2-3所示对话框。

图2-3 Win32 Console Application的类型选择对话框
选择An empty project项将生成一个空的工程,工程内不包括任何东西。
选择A simple application项将生成包含一个带空的main()函数的源文件和一个空的头文件的工程。
选择A"Hello World!"application项与选择A simple application项类似,只是在main()函数中包含显示"Hello World!"字符串的输出语句。
如果选择An application that supports MFC项,则可以利用Visual C++ 6.0所提供的基础类库来进行编程。
为了更清楚地看到编程的各个环节,我们选择An empty project项,从一个空的工程来开始我们的工作。单击Finish按钮,弹出新建项目的基本信息,单击OK按钮进入到编程环境下,界面如图2-4所示。

图2-4 新建的工程界面
图中左侧的Workspace窗口中有两个标签,一个是ClassView,另一个是FileView。ClassView窗格中列出的是这个工程中所包含的类的信息。FileView窗格中列出的是这个工程所包含的所有文件信息。单击+符号打开所有的层次,会发现其中有三个文件夹:Source Files文件夹中包含了工程中所有的源文件;Header Files文件夹中包含了工程中所有的头文件;Resource Files文件夹中包含了工程中所有的资源文件。
(3)输入程序源代码(编辑)。
选择菜单Project中子菜单Add to Project下的new菜单项,弹出如图2-5所示的对话框。

图2-5 New对话框(Files选项卡)
在Files选项卡中,选择C++ Source File项,在File文本框中为将要生成的文件命名,本例的文件名为demofile.c。注意,如果这里不直接添加.c后缀,Visual C++ 6.0将默认创建C++源文件(后缀名为.cpp)。
单击OK按钮,进入输入源程序的编辑窗口,通过键盘在光标所在的位置输入以下程序代码,并保存文件:

现在可通过Workspace窗口中的FileView标签,看到Source Files文件夹下文件demofile.c已经被加了进去,如图2-6所示。实际上,这时在Workspace窗口的ClassView标签中的Globals文件夹下,也可以看到刚才所键入的main()函数。

图2-6 Source Files界面
(4)编译、链接和运行程序。
程序编辑完成之后,就可以进行后三步的编译、链接与运行了,所有后三步的命令项都处在菜单Build之中(也可以在Build或Build MiniBar工具栏中操作)。
首先选择执行菜单第一项Compile,此时将对程序进行编译。若编译中发现错误(error)或警告(warning),将在Output窗口中显示出它们所在的行以及具体的出错或警告信息,可以通过这些信息的提示来纠正程序中的错误或警告(注意,错误是必须纠正的,否则无法进行下一步的链接;而警告则不然,它并不影响程序正常运行,当然最好还是能把所有的警告也“消灭”掉)。当没有错误与警告出现时,Output窗口所显示的最后一行应该是:demofile.obj-0 error(s),0 warning(s)。
编译通过后,可以选择菜单的第二项Build来进行链接以生成可执行程序。在链接中出现的错误也将显示到Output窗口中。链接成功后,Output窗口所显示的最后一行应该是:demo.exe-0 error(s),0 warning(s)。
最后就可以运行(执行)所编制的程序了,选择Execute项,Visual C++ 6.0将运行已经编译好的程序,执行后将出现一个结果界面,如图2-7所示,其中的Press any key to continue是由系统产生的,使得用户可以浏览输出结果,直到按下了任一个键盘按键时为止。

图2-7 程序运行结果
至此我们已经编辑、编译、链接并运行了一个完整的程序。
如果需要开始另一个程序,应单击File菜单中的Close Workspace菜单项,待系统询问是否关闭所有的相关窗口,回答“是”,则结束当前工程,回到图2-1所示的Visual C++ 6.0启动画面,这样就可以新建另一个工程。
2)使用调试工具
当程序编译出错或者链接出错时,系统都将在Output输出窗口中随时显示出有关的提示信息或出错警告信息等(如果是编译出错,只要双击Output窗口中的出错信息就可以自动跳到出错的程序行,以便仔细查找)。但若编译和链接都正确,而执行结果又总是不正确时,这时就需要使用调试工具来帮助“侦察”出程序中隐藏的逻辑错误。
假设准备编制完成如下任务的程序:在已知x=5、y=2的情况下,先计算出x与y的和s、差d、积p、商q,而后计算result=s+d+p+q的值(result应该等于22.5)并显示在屏幕上。
但编制的如下程序运行后却得出了一个错误结果“The result is 22.000000”。

在“result=s+d+p+q;”程序行处设置一个断点(单击Build MiniBar工具栏中的Insert/Remove Breakpoint按钮),单击Build MiniBar工具栏中Go按钮让程序执行到此断点处(注意设为断点的那一行尚未被执行),这时的界面如图2-8所示。

图2-8 程序调试窗口
图2-8中左下方的Variable窗口中列出了当时各变量的取值情况:x=5,y=2,s=7,d=3,p=10,q=2.00000。可以发现商值有问题(应该是2.5),确定了错误所在行的位置,此时可以通过菜单选项Debug→Stop Debugging,中断当前的调试过程并返回正常的编辑状态。
该错误是由于数据类型转换不当而产生的,将q=x/y修改成q=(float)x/y,再一次执行就可以得出正确结果。
上述设置断点的调试手段使用起来很方便,另外也常配合使用“单步执行”的方式,来仔细检查每一步(一个程序行)执行后各变量取值的动态变化情况,具体方法是通过使用Debug菜单或者Debug工具栏中的Step Over或Step Into来进行所谓的“单步执行”。每执行一步后,都要仔细观察并分析系统自动给出的各变量取值的动态变化情况,以便及时发现异常而找到出错原因。
如果一个程序除main()函数外,还调用一个自定义函数或系统自带函数(如printf()函数等),当通过Step Over单步执行到调用函数f的程序行时,不会“跟踪”进入f函数的内部。若怀疑f函数可能有问题的话,要通过使用Step Into进入f函数内部再进行细致调试。在没有函数调用的地方,Step Over与Step Into的功能是相同的。若通过Step Into进入到函数内部,单步执行若干步之后,若发现不再需要在函数内进行单步调试的话,可通过Step Out从函数内部返回到函数调用语句的下一条语句处。
3. 实验内容
(1)按实验指导中的步骤编辑、编译、运行第一个“Hello World!”程序;
(2)利用实验指导中的第二个程序熟悉调试工具;
(3)编写一个程序,输入a、b、c三个值,输出它们的和与平均值。