附录A  C程序的基本开发过程
C语言程序开发涉及到四个过程:编辑、编译、连接、装载并运行。这些单词所表达的意义我们可以慢慢体会,下面首要的是学会依葫芦画瓢,学会按照下面的方法在VC++环境下建立一个工程、编辑源文件、编译、调试、装载并运行程序。在Windows操作系统下,VC++环境的基本使用方法如下,详细的调试方法可参阅相关资料,或者参阅微软MSDN帮助文件。
输出函数printf使用方法A.1 安装程序
    VC++环境的安装请参阅相关的安装程序说明。双击setup文件,然后根据提示,一路next就可以了。
A.2 新建一个工程、新建一个源文件、添加源文件到工程
1.首先请在F盘(或其他盘)上建立文件夹TEST,以便将待建的C程序工程文件project等相关文件放置在该文件夹中。
2.新建一个工程project
  首先鼠标左键单击“文件”菜单,选择“新建”单击鼠标左键,系统将弹出一个窗口,单击“工程”选项,将得到图A.1所示窗口。请在“位置”栏填入刚才所建的目录F:\TEST(可以是自己设定的其他目录),并在“工程名称”栏填入project(可以是自己命名的其他工程名),然后鼠标左键单击左边窗口倒数第三项“Win32 Console Application”,使该项变蓝,然后鼠标左键单击“确定”按钮。得到图A.2所示窗口,选择“一个空工程”,单击“完成”得到图A.3。再单击“确定”得到图A.4所示的窗口,鼠标左键单击右下角的“FileView”字样,再单击project files左边的“+”号,在其下面的工作空间将出现三个文件夹:“Source Files”、“Header Files”、“Resource Files”,如图A.5所示(此时尚无浮动菜单)。
图A.1
            图A.2                                    图A.3
图A.4
图A.5
3.新建一个源文件hello.c
要新建一个C程序源文件可以选择“文件”菜单的“新建”选项,在弹出的窗口中选择“文件”选项
单击,得到如图A.6所示的窗口,其“位置”栏中的内容是默认的,在“添加到工程”前打勾,“工程名”project也是默认的,但“文件名”一栏中的内容需要自己填写,且必须是以.c为后缀,比如图中的 hello.c(注:该栏的内容一定要以.c为后缀,否则系统会默认为.cpp,这样编译时就会调用C++的编译器,而我们需要调用C语言的编译器)。然后在左边选项中选中“C++ Source File”选项,单击“确定”按钮,就得到了hello.c文件。此时,右边文件区变白,我们就可以在文件区添加源程序代码了,如图A.8所示。此时,左边的工作空间的“Source Files”文件夹前将出现一个“+”号,单击“+”号,其下将出现“hello.c”文件。在hello.c文件中编制源文件将得到如图A.8所示的结果。
图A.6                                    图A.7
图A.8
4.添加一个源文件到工程
鼠标右键单击“Source Files”文件夹,将弹出如图A.5所示的浮动菜单,拖动鼠标到“添加文件
到目录”选项,单击鼠标左键弹出“插入文件到工程”选窗口,选择好正确的源文件,单击“确定”按钮,该源文件将添加到“Source Files”目录(如添加成功,“Source Files”文件夹前面将出现一个“+”号,鼠标左键单击加号将看到刚才添加的源文件出现在“Source Files”文件夹下面,鼠标左键双击该文件,该文件的内容将显示在右边的文件区,此时就可以编辑该源文件了。注:采用前述第3条方法生成的源文件hello.c不需要添加操作,因为在生成它时,它已经自动添加到了project工程。
    A.3 编译、连接、运行、调试一个程序
当源文件编辑完成后,就可以编译、连接和运行程序了。方法如下:
    单击“组建”菜单的“编译”选项,将完成编译工作得到***.obj目标文件(文件名就是源文件的名字),编译结果将在窗口最下面的输出窗口显示。可根据窗口的提示修改源文件以改正错误。
单击“组建”菜单的“组建”选项,完成连接工作得到可执行文件(文件名是工程名),连接的结果也将在窗口最下面的输出窗口显示。
单击“组建”菜单的“全部重建”选项,将完成编译和连接两项工作,编译和连接的结果将在输出窗口显示。
单击“组建”菜单的“执行”选项,可运行程序,程序运行的结果如图A.7所示。
另外,单击“组建”菜单的“开始调试”选项,然后交替按下F11和F10快捷键可以完成程序的单步调试工作。调试方法大家可以逐步摸索,慢慢体会,多试试自然就熟悉了。不要怕出错误,经验是在错误中不断学习的。
    A.4 输出窗口的常见错误提示
在教学中,同学们在遇到编译、连接和运行错误提示时常常不知道其含义,下面罗列一下一些常见的错误,以帮助大家上机操作。为了方便,我们采用了“倒推”的方式,我们将例题2.2的程序做一点简单修改,看看将会出现的错误和警告提示。
注:我们将例题中的a=10和b=20两语句改为用scanf("%d,%d", &a, &b)输入。
在练习时,同学们也可以采用以下方法一步步试试,这样就会知道自己的程序编译、连接、调试、运行时出现类似问题的大致原因。
1.完全正确的程序
    将例题2.2的源程序s2_2.c复制到project目录。然后鼠标双击project目录下的project.dsw文件,将打开project工程(如新建工程也可)。此后鼠标左键单击“Source Files”文件夹下方的hello.c文件,使其变蓝,然后按下键盘上的“Delete”按键,hello.c文件将从“Source Files”文件夹上删除。此后可按 A.2的第4操作步骤将s2_2.c源程序添加到“Source Files”目录。双击“Source Files”文件夹下的s2_2.c文件名,将在右边窗口显示其文件内容,此后可对文件进行编辑将“a=10;b=20;”两语句删除,并在该位置添加以下二语句:
    printf("Please input a, b:");        /* 在屏幕上显示提示语,提示下一步的操作 */
    scanf("%d,%d", &a, &b);        /* 调用scanf()函数输入a和b的值 */
这样程序将如下所示:
/* 文件名:s2_2.c,比较两个整数的大小 */
/* 欢迎登陆C/C++教学网站:cs.scu.edu/~chenliangyin */
#include <stdio.h>                /* 文件包含预处理命令 */
#include <stdlib.h>                /* 文件包含预处理命令 */
int Max (int x, int y);                /* 函数声明语句。*/
int main (void)                    /* 主函数main(void)。*/
{
    int a, b, c;                    /* 变量定义语句,定义了三个变量:a,b,c */
    printf("Please input a, b:");        /* 在屏幕上显示提示语,提示下一步的操作 */
    scanf("%d,%d", &a, &b);        /* 调用scanf()函数输入a和b的值 */
   
    c = Max (a, b);        /* 函数调用语句,调用自定义函数Max( ),并将其返回值赋给c */
    printf ("Max (a, b) = %d.\n", c);    /* 调用在stdio.h中声明的库函数printf( )*/
   
    /* 输出系统提示并返回操作系统 */
    system("PAUSE");                /* 调用库函数system( ) */
    return 0;                      /* 返回值0,返回操作系统 */
}
/* 下面是Max( )用户自定义函数的函数定义部分,满足函数定义的语法格式要求就是函数 */
int Max (int x, int y)                /* 函数头部分:x和y为形式参数 */
{                                /* 两个外层大括弧之间的内容为函数体部分 */
    int z;                        /* 变量定义语句。定义了变量z */
   
    if ( x>y )    /* 分支语句。如果x>y成立,将x的值赋给z,否则将y的值赋给z */
    {
        z = x;                    /* 将x的值赋值给z变量 */
    }
    else
    {
        z = y;                    /* 将y的值赋值给z变量 */
    }
   
    return (z);        /* 函数返回语句,函数返回主调函数并将z的值一并返回 */
}
点击“组建”菜单的“全部重建”按钮,执行编译、连接后,输出窗口将有如下显示:
--------------------Configuration: project - Win32 Debug--------------------
s2_2.c
- 0 error(s), 0 warning(s)
表示编译、连接正确出现0个错误,0个警告。此时点击“组建”菜单的“执行[]”按钮,程序开始执行,系统弹出一个Dos控制台界面窗口,输出提示语:“Please input a, b:”(如图A.9所示),此时,输入:“10,20”(注:逗号为半角逗号),并按下回车,那么10将赋值给a,20将赋值给b,同时输出窗口将显示:“Max (a, b) = 20.”,表明运行正常,并求到了a和b的最大值(如图A.10所示)。
图A.9                                        图A.10
2.输入非半角逗号导致结果不正确
    在出现“Please input a, b:”的时候,输入:“10,20”(全角逗号),此时系统输出为:“Max (a, b) = 10.”。结果并不是希望的20,原因是20并未输入给b,在scanf( )的输入格式控制字符串中的两个%d和%d之间有一个半角逗号,必须原样输入。上述输入中系统并未接收到半角逗号所以20也就不可能输入给b。
    另外,如果在输入时输入“10 20”(中间无半角逗号,只有空格),也会得到同样的结果。
    当我们将“scanf("%d,%d", &a, &b);”改为“scanf("%d%d", &a, &b);”时,此时就可以在输入时用空格来分隔两个输入的整数。
3.在main()函数前面将函数声明语句“int Max (int x, int y);”注释掉
    单击“组建”菜单的“编译”按钮,此时将会出现如下编译结果提示:
--------------------Configuration: project - Win32 Debug--------------------
s2_2.c
F:\test\project\s2_2.c(16) : warning C4013: 'Max' undefined; assuming extern returning int
s2_2.obj - 0 error(s), 0 warning(s)