C语言宝典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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函数缺少了参数,仔细观察源程序的输出语句的参数,字符串参数和输出项之间分隔编辑有错误。只要把最后的分隔符移出双引号外,则程序更正完毕。

以上仅仅是代码编写中出现的一小部分错误。初学者在编写程序的过程中,肯定会遇到各种各样的错误,因此平时在调试程序时要注意积累,出现错误时多分析原因,避免在以后编写程序的过程中再出现相同的错误。