1.3 程序的实例解析与升华
通过上例的描述,读者应该了解C语言程序的构成要点,可以成功地编写和编译简单的C语言程序了。但file1.c程序毕竟是一个较简单的程序,本节在上例的基础上对C语言程序进行扩展,使读者快速了解C语言程序的结构。
1.3.1 简单例题的引申
观察file1.c程序可以得知,若输出多行信息,可以调用多个printf函数来实现。当然,C语言程序也可以接受用户信息、处理数值问题,以及调用程序员自己设计的函数。代码1.2的功能是:已知圆的半径为2,计算圆的周长和面积。
代码1.2 求圆面积和周长:fiIe2.c
#include "stdio.h" /*标准输入/输出文件头*/ main() { float r,l,area; /*说明三个实型变量,分别表示半径、周长和面积*/ r=2; /*赋值:将2送给r*/ l=2*3.14*r; /*计算周长,结果送l*/ area=3.14*r*r; /*计算面积,结果送给area*/ printf("\n l=%f,area=%f\n",l,area); /*输出周长、面积*/ }
屏幕上的输出结果为:
l=12.560000,area=12.560000
对于这个程序,需要了解的是:
◆ float为实型数据的关键字。C语言中所有的数据必须属于某种数据类型,这样编译系统才可以访问数据。
◆ r,l,area是变量,在程序运行过程中数据值可以变化。
◆ /* */是注释,说明程序中语句的功能。
执行代码1.2时,可以求半径为2的圆的周长和面积。若求任意半径的圆面积和周长,则可以调用系统函数scanf,具体实现是把r=2语句替换成:
scanf("%f",&r);
则程序执行到该语句时,屏幕显示会切换到用户窗口,以等待用户从键盘完成输入。
前面所举的几个C语言程序只有一个主函数,即main函数。一个C语言程序至少包含一个主函数(main函数)或若干个其他函数。代码1.3的功能是:利用函数调用求两个数的和。
代码1.3 求两个数的和:fiIe3.c
#include "stdio.h" void main (){ /*主函数中调用求和函数Add,求两个变量的和*/ int i,j,sum; /*变量定义语句*/ int Add(int m,int n); /*函数的声明部分*/ scanf ("%d %d",&i,&j); /*输入两个整数,分别给变量i,j*/ sum = Add (i, j); /*调用求和函数*/ printf ("\nSum is %d\n",sum); /*屏幕上显示输出和*/ } int Add (int m, int n) /*定义Add函数,函数的返回类型为整型*/ { /*入口参数m,n是整型*/ return m+n; /*直接返回m,n的和*/ } /*函数调用Add(i,j)根据返回类型确定为int型的表达式*/
执行程序并输入2和3,得到:
2 3 Sum is 5
对于这个程序,需要了解的是:
◆ 语句"int i, j, sum; "称为变量定义语句,"int"是系统保留的关键字,"i, j, sum"则是用户引入的变量,变量定义语句通知编译器为这些变量分配内存空间。
◆ 语句"scanf ("%d %d", &i, &j); "在读取屏幕上输入的变量i和j的值,变量i和j之前分别加上了取地址运算符&,在屏幕上输入数据时,中间用空格区分。
◆ "%d, %d"是输入输出的格式化字符串,用来指示输入输出的数据类型和格式转换,"%d"表示十进制整数类型。其他类型的格式,以后介绍。
◆ "sum = Add (i, j); "是函数调用语句,此函数为用户自定义的函数。而int Add (int m , int n)为函数的定义开始。
◆ 函数由函数头和函数体构成。
说明
井号(#)引入的指令为预处理指令,对应的预处理语句不以分号(;)结尾,#include称为文件包含预处理指令,通过该指令系统将其后程序段使用的名称进行了预先的处理,#include stdio.h的作用是将stdio.h文件在预处理阶段插入到程序.cpp中,作为程序源文件的一个有机部分。#include指令是代码重用的有效手段。stdio.h是标准输入输出头文件,其中包含了printf和scanf函数的原型说明。
从以上两个扩展的实例可以看到,C语言在main函数中加上数据声明语句、处理数据的语句及函数调用语句,运行时则可自动运行,完成一定的功能。从上面这些C语言的源程序可以了解到,C语言的结构十分清晰、简单,几行代码就可以完成相应的操作。
1.3.2 C语言程序的组成
通过以上这几个示例,可以分析出C语言源程序的基本特点、基本的组成结构、常见语句的书写模式,由此可以总结出以下特点。
◆ 一个C语言源程序可以由一个或多个源文件组成。每个源文件可由一个或多个函数组成。
◆ 函数有两类:库函数和用户自定义函数。库函数是系统提供的,用户可直接调用,如输入和输出函数等。对于库函数中没有的功能,需要用户自己编程实现,即自己定义函数。自定义函数的数目由程序的复杂程度决定。
◆ 函数是构成C语言程序的基本单位,它完成相对独立的功能。它由函数头和函数体两部分组成。函数的一般形式为:
函数名(参数表) {数据说明部分; 执行语句部分; }
函数名小括号中的“参数表”可以根据需要存在,可能有,也可能没有。若有多个,之间应用逗号隔开。若没有参数,则参数说明部分可以省略。但函数名后的一对圆括号则不能省略。函数名与参数说明部分统称为函数说明部分。一对大括号中间所包含的全部内容叫做函数体。
◆ 一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。main()函数表示DOS模式下应用程序的入口。
◆ 源程序中可以有预处理命令(include命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。
◆ 程序体部分全部放在“{}”内,在程序部分主要包括两种语句,分别为声明语句和执行语句。声明语句主要是对使用的变量和函数做出声明,执行语句体现了程序的功能。语句是构成程序的基本单元。
◆ 每一个函数说明和每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
◆ 标识符、关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
◆ 一个好的程序一定要有适当的注释,即“/*------*/”。
由此可见一个完整的C语言程序一般包含以下4部分:
◆ 编译预处理命令
◆ 全局变量及函数说明
◆ main()函数
◆ 用户自定义函数
初学者在学习C语言的过程中,要多读一些源代码,总结其程序的功能、组成及结构。也要注意编程人员在程序编写上的特点,作为自己的编写程序的参照。养成好的习惯,这样才可以写出清晰、易懂、功能完整的优秀程序。
1.3.3 常见的错误解析与解决办法
对于刚刚接触C语言的读者来讲,若忽略了任意一个知识点,都可能导致程序运行不成功,出现很多错误提示。接下来分析各种不成功的实例及其解决方法。
代码1.4是一个文件包含命令的错误使用。
代码1.4 文件包含命令的错误使用:fiIe4.c
/*file4.c文件的错误代码如下:*/ #include <stdio.h>; main() { putchar(ch); /*输出一个字符*/ printf("Hello C!\n"); /*输出一个字符串*/ }
这个代码在编译时虽然编译系统不提示出错,但是程序中若使用其他输入输出函数,编译将不能成功。实际上文件包含命令后不允许有分号,因为这个命令不是一个可执行语句。解决的方法很简单,只要把分号去掉就可以了。
代码1.5是一个主函数写错的例子。
代码1.5 主函数写错:fiIe5.c
/*file5.c文件的错误代码如下:*/ #include <stdio.h> mian() { /*错误代码*/ printf("Hello C!\n"); }
编译时错误提示:
Undefined symbol ‘_mian’in module c0s
根据错误提示得知缺少了主函数,主函数是程序执行的入口,主函数名是系统定义的main,任何自己写错或尝试命名都是不被编译系统所识别的。只要把错误的主函数名mian改成main即可。
代码1.6是一个缺少分号的例子。
代码1.6 缺少分号:fiIe6.c
/*file6.c文件的错误代码如下:*/ #include <stdio.h> main(){ printf("Hello C!\n") /*错误代码*/ }
编译时错误提示:
Statement missing ; in function main
根据错误提示得知输出语句缺少了分号。分号是语句的一部分。书写的时候不要忘记给每条语句加上分号。改正的方法很简单,只要加上分号即可。
代码1.7是一个变量名写错的例子。
代码1.7 变量名写错:fiIe7.c
/*file7.c文件的错误代码如下:*/ #include "stdio.h" main(){ float r,l,Area; /*说明三个实型变量,分别表示半径、周长和面积*/ r=2; /*赋值:将2送给r*/ l=2*3.14*r; /*计算周长,结果送给l*/ area=3.14*r*r; /*计算面积,结果送给area*/ printf("\n l=%f, area=%f\n", l, area); /*输出周长、面积*/ }
编译时错误提示:
Undefined symbol ‘area’
根据给出的提示得知缺少变量。变量area没定义就使用了,已经定义的变量Area与变量area是两个完全不同的变量,因为C语言是区分大小写的,没定义或定义错误是C语言所不认可的,变量在使用前一定要有定义,同时还要赋初值。只要在定义部分做出area变量的声明,则程序改正成功。
代码1.8是一个不正确调用函数的例子。
代码1.8 调用函数时缺少参数:fiIe8.c
/*file8.c文件的错误代码如下:*/ #include "stdio.h" main(){ float r,l,area; /*说明三个实型变量,分别表示半径、周长和面积*/ r=2; /*赋值:将2送给r*/ l=2*3.14*r; /*计算周长,结果送给l*/ area=3.14*r*r; /*计算面积,结果送给area*/ printf("\n l=%f, area=%f\n, "l, area); /*输出周长、面积*/ }
编译时错误提示:
Function call missing ) in function main
根据给出的错误提示得知,printf函数缺少了参数,仔细观察源程序的输出语句的参数,字符串参数和输出项之间分隔编辑有错误。只要把最后的分隔符移出双引号外,则程序更正完毕。
以上仅仅是代码编写中出现的一小部分错误。初学者在编写程序的过程中,肯定会遇到各种各样的错误,因此平时在调试程序时要注意积累,出现错误时多分析原因,避免在以后编写程序的过程中再出现相同的错误。