1、C 程序设计基础上机实验指导书李文杰、李桂芝、鱼涛 编写杨根兴 审定北京机械工业学院计算中心目 次说明怎样学习 C 语言实验一 C 程序集成开发环境熟悉实验二 数据的输入和输出实验三 表达式的计算实验四 选择结构语句实验五 循环结构语句实验六 数组应用(一)实验七 数组应用(二)1实验八 函数及程序结构(一)实验九 函数及程序结构(二)实验十 指针的应用说 明C 程序设计同其他程序设计一样,使实践性很强的课程。除了要听好课,多看课外书外,还需大量的上机实践才能更好地理解和掌握所学到的内容。一般来说,上机和讲课时间之比应不少于 1:1 。但由于目前各校安排的教学时数限制,课内时间将更多的精力用于
2、讲课上,课内安排的上机时间相对较少,学生不要因此对上机的重要性有所误解。学生应在课外再花一定的时间进行 C 语言的上机实践,这样才能学好该门课。上机实验的目的有以下几个方面:验证所编写的程序的正确性。进一步理解教材和课堂授课中介绍的内容熟练地掌握 C 程序开发环境的使用,为今后开发大型软件打好基础。学习和掌握一般程序的调试和测试方法。2上机前应充分做好以下准备工作:复习和掌握与本次实验有关的教学内容。根据本次实验的内容,在纸上编写好准备上机调试的程序,并初步检查无误。准备好对程序进行测试的数据。对每种测试数据,给出预期的程序运行结果。预习实验步骤,对实验步骤中提出的一些问题进行思考。上机实验后
3、,应及时写出实验报告,实验报告应包括以下内容:实验目的和内容。程序说明,包括程序结构、各模块的算法(N-S 图表示) 。打印出的调试正确的源程序。打印出的程序运行记录(包括对不同测试数据的运行结果) 。针对实验步骤中提出的问题,写出解决办法及对运行结果的分析。3怎样学习 C 语言很多同学对学习 C 语言感到很难,尤其是在各高校将 C 语言放在大学第一学年教学时经常会考试不及格。究竟怎样才能学好 C 语言?这里将我对 C 语言的理解给大家介绍一下, 计算机语言挺枯燥的,如何提起兴趣? 首先要明确学习的目标,没有明确的学习目标就没有学习动力。给自己定一个目标,比如这次一定通过课程考试,或者这个月学
4、习完做个东西出来等等。其次,确定了目标之后,要认真去做,多上机操作实践,遇到不懂的要多跟教师和其他同学交流,千万不能放弃。当自己编的一段小程序运行通过,或攻下一道难题,自己就会获得一种成就感,可能还会很兴奋,也就渐渐有了兴趣。最后,要把所学的知识运用到实际问题当中,这样既可以巩固所学的知识,不至于完学了就忘,还可以根据实际需要拓展知识面。这样良性循环,兴趣也会越来越浓。学习计算机语言最好的方法是什么?答曰:读程序。没错,读程序是学习 C 语言入门最快,也是最好的方法。不要总是抱着书本逐行啃,而是学习它们的例程。 学习完每一章,都要认真体会这一章的所有概念,然后不放过这一章中提到的所有例程,仔细
5、研读程序,直到每一行都理4解了,然后找几个编程题目,最好是和例程类似的或一样的,自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了,你就可以写出和它一样的程序,绝对不一定,不相信你就试一试吧,如果写不出来,也不要着急,回过头来再继续研究例程,想想自己为什么写不出来,然后再去写这段程序,反反复复,直到你手到擒来为止。这一过程,就和我们学习任何其他语言比如英语和汉语一样。我们大家都有体会,我们学习一门语言,都是从最基本的语法开始,然后学习一些字和词,再来学习一些词组或句子,然后再用词组和句子组成一段话,表达一个简单的意思,最后才是写一篇文章或者是一本书,表达更复杂的思想。我们知道,在我们完成
6、这一过程时,并不是像说得这么简单。在我们能写出一篇好的文章或者一本好书之前,我们可能需要阅读大量的其他人写的好文章或好书,有时我们还要把它们背下来;同样的,在我们写出一个好的程序或者软件前,我们也需要阅读大量的样本例程或者软件的源代码,甚至要背一些好的程序代码。写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算法)。?那么怎样才算精通程序设计呢?怎样才能精通程序设计呢?举个例子:你面前有 10 个人,找出一个叫“张三”的人,你该怎么办?第一种方法:直接对这 10 个人问:“谁叫张三”。第 2 种方法:你挨个去问“你是不是张三?”,直到问到的这个人就是张三。第三种方法
7、:你去挨个问一个人“你认不认识张三,指给我看”。不要小看这个问题,你说当然会选第一种方法,没错恭喜你答对了,因为这个方法最快,效率最高,但是在程序设计中找到解决问题的最5优方法和你用的手段却是考验一个程序员程序设计水平的重要标志,而且是不容易达到的。实验一 C 程序集成开发环境熟悉一、实验目的掌握在 Visual C+ 6.0 集成开发环境下怎样编辑、编译、连接、执行、修改和调试 C 语言程序。二、实验内容1进入可视化的 C+ 6.0 集成开发环境启动计算机,进入窗口环境操作界面。鼠标依次点击“开始”“ 程序”“Microsoft Visual Studio 6.0”“Microsoft Vi
8、sual C+ 6.0” 启动 VC6.0 集成开发环境。6选择“文件” (File)菜单中的“新建” (New)命令, 在新建 图 1对话框中,选择“文件”选项卡,再选择“C+ Source File”类型,按图示操作后单击对话框中的“确定”按钮。 (见图 1) 接着就会出现如图 2 所示的 VC 界面。 在编辑窗口中,输入如下内容:#include “stdio.h“/以上行对于本书中的例子没有给出。望同学们对于所有的/程序都保留这样一行。main( ) printf(“Hello!这是我的 First C 程序.n“); 此处输入源程序文件名单击此处来修改文件保存位置7 选择“编译”菜单
9、中的“ 编译 my_c1.cpp” 命令,并在出现的对话框中选择“是(Y ) ”结果如图 3。图 2图 3编译信息窗8选择“编译”菜单中的“构件 my_c1.exe”命令,构建可执行程序my_c1.exe,再选择“编译 ”菜单中的“!执行 my_c1.exe” 命令。 在出现的对话框中选择“是(Y ) ”,结果屏幕如图 4 所示。图 4图中的黑色窗口为运行结果窗口。按任意键就可返回编辑界面。修改上述程序,将 printf 行括号中的双引号去掉左边的,重复,可9以看到图 5。其中的编译信息窗显示:图 5my_c1.obj - 16 error(s), 1 warning(s)可以看到由于一个双引
10、号的漏写,导致出现 16 个语法错误,而实际上的错误只有一个,这是 C 编译器的特点,当它遇到错误时,会做出一些判断或推测,有时这种推测判断正确,有时也会错误。了解这一特点后,希望同学们在上机时,先去修改第一个错误,一般可以在修改一个错误后立即重新编译,这样可以快速减少错误的数目。下面请同学们用鼠标点击滚动条上的滑块,查看第一条错误信息,并用鼠标双击第一个错误信息。 (图 6) ,图 6可以看到,C 编译器将 Hello 理解为了标识符,而前面又没有对 Hello 的说明,所以认为它是未声明的标识符(undeclared identifier) ,这个错误在初学者的程序里非常多见,希望同学们记
11、住它。 将双引号加上再重新编译,鼠标点击滚动条,查看错误信息错误所在的文件及行号 错误的解释当前错误所在的位置指示10就可恢复为无错误了。修改上述程序,在#include “stdio.h”这一行的最左边加两个“/” ,即使得这一行成为注释(显示为绿色) ,重复,可以看到图 7 所示的错误。相信同学们对其中的错误说明不难理解了,C 编译器说 printf 是未声明的标识符。原因是 printf 不是 C 语言的基本部分,它是定义在“stdio.h”中,这也就是我们为什么在前面说要在自己的程序前部加#include “stdio.h”的原因。请先选择“文件”菜单的“关闭工作区”命令,再按上面的步
12、骤(3)(5 )操作将编辑窗口的程序更换为如下程序文本,依次引入下述错误,每引入一个错误,就对程序进行编译,记录编译器产生的错误信息,写在实验报告里。 /* 变量使用相关的语法问题 */ #include “stdio.h“void main() int a=1,b=2,c=3; printf(“Some output: %d %d %dn“,a,b,c,c); 11把第 6 行变量声明语句的第一个逗号改为分号把第 7 行 printf()改为 print() 去掉第 7 行中的第 2 个双引号 把第 7 行中 a,b,c, c 改为 a,b,c 去掉 printf 语句末尾的分号 去掉用于结
13、束的花括号 注意,在引入每一个错误并编译后,开始引入下一个错误前将上一错误再改正。2.程序的调试手段作为程序员编写程序,一个难以避免的工作就是对程序的调试。调试包括语法方面的,这一般通过编译就可基本解决,比如在上述图 3 中,细心的同学可能注意到在底部的编译信息窗中,编译报告中说:my_c1.obj - 0 error(s), 1 warning(s),意思是编译过程中没发现错误(0 error(s)), 但有一个不合规范的使用(1 warning(s)) 。编程序应最好是达到 0 error 和 0 warning,但有时无法做到如此完美,只要达到 0 error 就可以了。若不能做到 0
14、error,将不能产生机器语言程序,因而也就无法执行程序。所以同学们在调试自己的程序时,必须是做到经编译后 0 error。好在编译器对发现的错误都有一个比较正确的修改意见,同学们按意见修改后一般就可消除错误,只是修改意见是英文的,同学们需有一定的专业词汇或者经过一定时间与12VC+的接触,就可理解;另一类就是逻辑方面的,这类错误的消除相对麻烦。好在 VC 提供了非常丰富的调试手段,帮助我们分析错误,前提是程序已经没有语法错误,也就是说编译已经通过(0 error(s)) 。下面我们了解一些常用的,为了便于说明,请先选择“文件”菜单的“关闭工作区”命令,再按上面的步骤(3)( 5)操作将编辑窗
15、口的程序更换为如下程序文本:#include “stdio.h“void main()float i;float sum;sum=1.0;i=2.0;while (ib+c);/=判断两边是否相等printf(“表达式 2=%dn“,d=ab+c); /=用于赋值2以下程序的功能是:从键盘输入一个字符型数据,若输入一个数字字符(0- 9) ,则将其转换成相应的整数显示出来;若输入其它字符,则显示出错信息。#include “stdio.h“void main( )char c;scanf(“%c“,if(0b)max=a;else max=b;printf(“两者中的大数为:%dn“,max)
16、;4if 语句的第二种形式为 if-else 形式if(表达式) 语句 1;else 语句 2;其语义是:如果表达式的值非零(为真) ,则执行语句 1,否则执行语句 2 。程序填空题。下列程序用于完成对输入的整数判断它是奇数还是偶数,并给出相应的提示。试完成它缺少的部分,并上机验证。#include “stdio.h“void main( )int x;scanf(“%d“,if( x%2=0 ) printf(“x=%d is Evenn“,x);/偶数else printf(“x=%d is Oddn“,x); /奇数编程:输入两个整数,输出其中的大数。提示:改用 if-else 语句判别
17、 a,b 的大小,若 a 大,则输出 a,否则输出 b。5if 语句的第三种形式为 if-else-if 形式(嵌套的 if)当有多个分支选择时,可采用 if-else-if 语句,其一般形式为:24if(表达式 1) 语句 1;else if(表达式 2) 语句 2;else if(表达式 3) 语句 3;else if(表达式 m) 语句 m;else 语句 n;其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应的语句。然后跳到整个 if 语句之外继续执行程序。 如果所有的表达式均为假,则执行语句 n 。 然后继续执行后续程序。编程:要求判别键盘输入字符的类别。可以根据输入字
18、符的 ASCII 码来判别类型。由 ASCII 码表可知 ASCII 值小于 32 的为控制字符。 在“0”和“ 9”之间的为数字,在“ A”和“Z”之间为大写字母, 在“ a”和“z ”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用 if-else-if 语句编程,判断输入字符 ASCII 码所在的范围,分别给出不同的输出。例如输入为“g” ,输出显示它为小写字符。在嵌套中要特别注意 if 和 else 的配对问题。为了避免二义性,语言规定,else 总是与它前面最近的 if 配对。#include “stdio.h“void main()char x;printf(“输入
19、一个字符:n“);scanf(“%c“,if(xb) d=a;elseif(cb) d=c;else d=b;printf(“d=%dn“,d);程序 2:#include “stdio.h“void main()int a=3,b=4,c=5,d=0; if(ab) if(cb) d=c;else d=b;else d=a;printf(“d=%dn“,d);程序 3:#include “stdio.h“void main()int a=3,b=4,c=5,d=0; if(ab) if(cb) d=c;else d=b;printf(“d=%dn“,d);程序 4:#include “std
20、io.h“void main()int a=3,b=4,c=5,d=0; if(ab)if(cb) d=c;else d=b;printf(“d=%dn“,d);26编程:比较键盘依次输入的两个数 a 和 b 的大小关系,并根据大小关系分别输出 1(若 ab) 、0(若 a=b) 、-1 (若 ab)printf(“1n“);else if(ab?printf(“%dn“,a):printf(“%dn“,b);8switch 语句语言还提供了另一种用于多分支选择的 switch 语句, 其一般形式为:switch(表达式)27case 常量表达式 1: 语句 1;case 常量表达式 2: 语
21、句 2;case 常量表达式 n: 语句 n;default : 语句 n+1;在 switch 语句中, “case 常量表达式” 只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个 switch 语句。 这是与前面介绍的 if 语句完全不同的,应特别注意。程序分析题。分析以下程序,对分析的结果上机检验。#include “stdio.h“void main( )int x=1,y=0,a=0,b=0;switch(x)case 1:switch(y)case 0: a+;break;case 1: b+;break; break; /此
22、处没有 break 的时候继续向下执行,加上 break 后跳出 switch 循环case 2:a+;b+;break;printf(“a=%d, b=%dn“,a,b);在程序中的/abc 前面, 后面添加一个 break; 再次运行该程序,程序结果有何变化?在实验报告中对结果作出解释。三、对上述实验进行总结,写出实验报告,把你通过本实验掌握的内容整理出来。28实验五 选择结构程序设计(二)一、实验目的进一步掌握选择结构程序设计,熟练运用选择语句编写程序,提高调试和修改程序的能力。二、实验内容输入三个整数,输出最大数和最小数。分析:首先比较输入的 a,b 的大小,并把大数装入 max, 小
23、数装入 min 中,然后再与 c 比较,若 max 小于 c,则把 c 赋予 max;如果 c 小于 min,则把 c赋予 min。因此 max 内总是最大数,而 min 内总是最小数。最后输出 max 和min 的值即可。#include “stdio.h“void main( )int a,b,c,max,min;printf(“输入三个整数:n“);scanf(“%d %d %d“,ab?max=a:max=b;ab?min=b:min=a;if(cmax)max=c;if(c=10用 scanf 函数输入 x 的值 (分别为 x=10 三种情况),求 y 值。分析:y 是一个分段表达式
24、。要根据 x 的不同区间来计算 y 的值。所以应使用 if 语句。#include “stdio.h“void main( )int x,y;printf(“输入 x 的值:“);scanf(“%d“,if(x1)y=x;if(1=xif(10=x)y=(3*x-11);printf(“则 y 值为: %dn“,y);3编写程序,输入三角形三边 a、b、c,判断 a、b、c 能否构成三角形,若不能则输出相应的信息,若能则判断组成的是等腰、等边、直角还是一般三角形。实验步骤与要求:(1) 输入一组数据 3,4,8 ,观察程序运行结果,并与实验二中程序 2 做比较(2) 另外再输入几组数据进行测试:3,4, 53,3,33,3,5(3)如果程序有误,可采用 “单步跟踪执行”的调试方法,确定错误的出处。#include “stdio.h“void main()