第一章C程序基础 我们用计算机解决问题,都是利用某种软件。如我们使用Word编辑文 件,用 Excel处理电子表格,用IE浏览网络资源,用QQ上网聊天等。这 些软件都是按照一定算法编制的计算机程序。而算法是为解决一个问题而采 取的方法和步骤 从广义的角度说,算法早就融入我们的生活中。比如,早上上学,就 开始了上学的算法:走哪条路,坐什么车,如果堵车怎么办等等,一直到到 达学校,这个算法就完成了。用计算机解决问题也是按照相应的步骤(算法) 步一步完成的。这些步骤的实现用的是计算机语言,也就是编写计算机程 序的语言。C语言就是一种计算机语言。 现在我们要学习的就是如何用C语言编写计算机程序。 1.1c语言程序的基本结构 111认识C语言程序 首先来看两个简单的C语言程序。 【例1.1】在屏幕上输出一行信息: This is a C program. # include< stdio. h>/预处理命令* void main() /定义主函数* printf(" This is aC program.n"),/*调用库函数,输出信息* 【例1.2】计算两数之和,并输出结果 # include< stdio. h>/*预处理命令 void main() *定义主函数,计算两数之和* nta,b,sum;/*定义三个整型变量* a=123;b=456;为变量a,b赋初值* sum=a+b /*让sum等于a+b的值* printf("sum=%dn",sum),/*调用库函数,输出结果
6 第一章 C 程序基础 我们用计算机解决问题,都是利用某种软件。如我们使用 Word 编辑文 件,用 Excel 处理电子表格,用 IE 浏览网络资源,用 QQ 上网聊天等。这 些软件都是按照一定算法编制的计算机程序。而算法是为解决一个问题而采 取的方法和步骤。 从广义的角度说,算法早就融入我们的生活中。比如,早上上学,就 开始了上学的算法:走哪条路,坐什么车,如果堵车怎么办等等,一直到到 达学校,这个算法就完成了。用计算机解决问题也是按照相应的步骤(算法) 一步一步完成的。这些步骤的实现用的是计算机语言,也就是编写计算机程 序的语言。C 语言就是一种计算机语言。 现在我们要学习的就是如何用 C 语言编写计算机程序。 1.1 C 语言程序的基本结构 1.1.1 认识 C 语言程序 首先来看两个简单的 C 语言程序。 【例 1.1】 在屏幕上输出一行信息:This is a C program. #include <stdio.h> /* 预处理命令 */ void main( ) /*定义主函数*/ { printf("This is a C program.\n"); /* 调用库函数,输出信息 */ } 【例 1.2】 计算两数之和,并输出结果。 #include <stdio.h> /* 预处理命令 */ void main( ) /*定义主函数,计算两数之和 */ { int a,b,sum; /* 定义三个整型变量 */ a=123; b=456; /* 为变量 a,b 赋初值 */ sum=a+b; /* 让 sum 等于 a+b 的值 */ printf("sum=%d\n",sum); /* 调用库函数,输出结果 */ }
现在我们对这两个C语言程序作解析 (1)# include< stdio h>表示文件包含,其功能是将头文件 stdio h的内容 包含到用户源程序中。文件 stdio. h中声明了程序所需要的输入和输出操作 的有关信息,有了“# include< stdio.h>”后,该程序就可以利用包含文件中 的内容了。 (2)main()表示“主函数”,main是函数名。每个C程序必须有man() 函数。函数名后的一对圆括号不能省略。一个C程序可以包含若干个函数, 但只能有一个主函数。C程序的执行从主函数开始,而不论主函数在什么位 置(所有函数之前、所有函数之后或一些函数之后另一些函数之前)。 main()前面的void是一种数据类型,这里说明本函数没有返回值。 (3)用{}括起来的是man的函数体。main函数中的所有操作(语句) 都在这一对{}之间。也就是说main函数的所有操作都在main函数体中。 (4)pin()是C语言的标准输出函数,其含义是将双引号内的内容输出 到显示器屏幕上。例11中的pint()用于将字符串“ This is a C program. n 输出。即在屏幕上显示: This is a C program.“n”是换行符,即使光标跳 到下一行行首(第一列)。例12中的%d为格式控制符,表示在此位置将代 以一个十进制整数,该整数由逗号后面的变量sum提供。程序运行后,将 在屏幕上输出:sum=579。 (5)分号“;”是C语句结束符,表示该语句结束 (6)/**/括起来的部分是一段注释,注释只是为了改善程序的可读性 在编译、运行时不起作用(事实上编译时会跳过注释,目标代码中不会包含 注释)。注释可以放在程序的任何位置,并允许占用多行,只是需要注意“/*”、 “*/”匹配,不能嵌套注释。 (7) int a b,sum;是变量声明。声明了三个具有整数类型的变量ab,sum。 C语言的变量必须先声明再使用 (8)a=123;b=456;,是两条赋值语句。将123赋给变量a,456赋给变量b 执行上述两条语句后,a、b两个变量的值分别为123和456 (⑨)sm=a+b是将a,b两变量的内容相加,然后将结果赋值给整型变量 此时sum的内容为579。 【例1.3】输入两个整数,计算并输出两者较大的数。 #include <stdio. h> void main()/*主函数* /*main函数体开始* Int a, b,C, /*声明部分,定义变量* anf("%d%d"&a&b),/*调用库函数,输入变量a、b的值* c=max(a, b) /*调用max函数,将调用结果赋给c printf("max=%dn", c) }/*main函数体结束*
7 现在我们对这两个 C 语言程序作解析。 ⑴ #include <stdio.h> 表示文件包含,其功能是将头文件 stdio.h 的内容 包含到用户源程序中。文件 stdio.h 中声明了程序所需要的输入和输出操作 的有关信息,有了“#include <stdio.h>”后,该程序就可以利用包含文件中 的内容了。 ⑵ main( )表示“主函数”,main 是函数名。每个 C 程序必须有 main( ) 函数。函数名后的一对圆括号不能省略。一个 C 程序可以包含若干个函数, 但只能有一个主函数。C 程序的执行从主函数开始,而不论主函数在什么位 置(所有函数之前、所有函数之后或一些函数之后另一些函数之前)。 main( )前面的 void 是一种数据类型,这里说明本函数没有返回值。 ⑶ 用{ }括起来的是 main 的函数体。main 函数中的所有操作(语句) 都在这一对{ }之间。也就是说 main 函数的所有操作都在 main 函数体中。 ⑷ printf( )是 C 语言的标准输出函数,其含义是将双引号内的内容输出 到显示器屏幕上。例 1.1 中的 printf( )用于将字符串“This is a C program.\n” 输出。即在屏幕上显示:This is a C program.。“\n”是换行符,即使光标跳 到下一行行首(第一列)。例 1.2 中的%d 为格式控制符,表示在此位置将代 以一个十进制整数,该整数由逗号后面的变量 sum 提供。程序运行后,将 在屏幕上输出:sum=579。 ⑸ 分号“;”是 C 语句结束符,表示该语句结束。 ⑹ /* */括起来的部分是一段注释,注释只是为了改善程序的可读性, 在编译、运行时不起作用(事实上编译时会跳过注释,目标代码中不会包含 注释)。注释可以放在程序的任何位置,并允许占用多行,只是需要注意“/*”、 “*/”匹配,不能嵌套注释。 ⑺ int a,b,sum;是变量声明。声明了三个具有整数类型的变量 a,b,sum。 C 语言的变量必须先声明再使用。 ⑻ a=123;b=456;是两条赋值语句。将 123 赋给变量 a,456 赋给变量 b。 执行上述两条语句后,a、b 两个变量的值分别为 123 和 456。 ⑼ sum=a+b;是将 a,b 两变量的内容相加,然后将结果赋值给整型变量 sum。此时 sum 的内容为 579。 【例 1.3】 输入两个整数,计算并输出两者较大的数。 #include <stdio.h> void main( ) /* 主函数 */ { /* main 函数体开始 */ int a,b,c; /* 声明部分,定义变量 */ scanf("%d%d",&a,&b); /* 调用库函数,输入变量 a、b 的值 */ c=max(a,b); /* 调用 max 函数,将调用结果赋给 c */ printf("max=%d\n",c); } /* main 函数体结束 */
nt max(intx,inty)/*max函数,用于计算两数中较大的数* /*max函数体开始* Z /*声明部分,定义变量* if(x>y)Z=X return z. /*将z值返回,通过max带回调用处* /*max函数体结東* 说明: (1)本程序包括两个函数。其中主函数main仍然是整个程序执行的起 点。函数max的功能是计算两数中较大的数 (2) scanf()是C语言的标准输入函数,用于从键盘输入若干数据给指定 的变量。%d表示输入十进制整数。主函数main调用 scanf函数获得两个整 数,存入a、b两个变量,然后调用函数max获得两个数中较大的值,并赋 给变量c。最后输出变量c的值(结果)。 (3) int max(int x, int y)是函数max的函数头,函数max的函数头表明此 函数获得两个整数,返回一个整数 (4)用{}括起来的部分是max函数的函数体。max的函数体是函数max 的具体实现。它从参数表获得数据,处理后得到结果z,然后将z返回调用 函数main (5)本例表明除了可以调用库函数外,还可以调用用户自己定义、编写 的函数 112C语言程序的基本结构 综合上述三个例子,下面对C语言程序的基本组成和形式(程序结构) 加以说明 C程序的结构 预处理命令 void main()/*主函数 /*函数体开始* 声明部分 执行部分 /*函数体结束* 其他函数 声明部分 执行部分
8 int max(int x,int y) /* max 函数,用于计算两数中较大的数 */ { /* max 函数体开始 */ int z; /* 声明部分,定义变量 */ if (x>y) z=x; else z=y; return z; /* 将 z 值返回,通过 max 带回调用处 */ } /* max 函数体结束 */ 说明: ⑴ 本程序包括两个函数。其中主函数 main 仍然是整个程序执行的起 点。函数 max 的功能是计算两数中较大的数。 ⑵ scanf( )是 C 语言的标准输入函数,用于从键盘输入若干数据给指定 的变量。%d 表示输入十进制整数。主函数 main 调用 scanf 函数获得两个整 数,存入 a、b 两个变量,然后调用函数 max 获得两个数中较大的值,并赋 给变量 c。最后输出变量 c 的值(结果)。 ⑶ int max(int x,int y)是函数 max 的函数头,函数 max 的函数头表明此 函数获得两个整数,返回一个整数。 ⑷ 用{ }括起来的部分是 max 函数的函数体。max 的函数体是函数 max 的具体实现。它从参数表获得数据,处理后得到结果 z,然后将 z 返回调用 函数 main。 ⑸ 本例表明除了可以调用库函数外,还可以调用用户自己定义、编写 的函数。 1.1.2 C 语言程序的基本结构 综合上述三个例子,下面对 C 语言程序的基本组成和形式(程序结构) 加以说明。 C 程序的结构: 预处理命令 void main( ) /* 主函数 */ { /* 函数体开始 */ 声明部分 执行部分 } /* 函数体结束 */ 其他函数 { 声明部分 执行部分 }
下面对C程序的结构作简单说明: 1.函数是C程序的基本单位 ①一个C源程序必须包含一个main函数,也可以包含其它函数。函 数是C程序的基本单位 ②程序中的函数有些是C语言的标准库提供的,称为标准函数(或库 函数)。如 printf()函数和sean()函数。编写程序时,如果有标准函数,就 使用标准函数:如果没有标准函数,则用户需要自己编写。 被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编 写的函数。C是函数式的语言,程序的全部工作都是由各个函数完成的。编 写C程序就是编写一个个函数。 ③C函数库非常丰富, ANSI C提供100多个库函数, Turbo C提供300 多个库函数。 2main()函数 主函数是每个程序执行的起点。一个C程序总是从main函数开始执行 而不论man函数在程序中的位置。可以将main函数放在整个程序的最前面, 也可以放在整个程序的最后,或者放在一些函数之后另一些函数之前 3.函数的结构 个函数由函数首部和函数体两部分组成 ①函数首部:一个函数的第一行,格式如下: 返回值类型函数名(函数参数类型1函数参数名1…,函数参数类型 函数参数名n]) 如: Int max( Int x, Int y) 注意:一个函数可以没有参数,但是后面的一对()不能省略,这是格式 的规定,如main(。 ②函数体:函数首部下面用一对{}括起来的部分。如果函数体内有多 对{},则最外层是函数体的范围。函数体一般包括声明部分和执行部分 声明部分:定义本函数所使用的变量,并为变量分配相应大小的内存单 元。变量名是内存单元的符号地址。 执行部分:由若干条语句组成的命令序列(可以在其中调用其它函数) 4.书写风格 C程序书写格式自由,一行可以写几个语句,一个语句也可以写在多行 上。每条语句的最后必须有一个分号“;”表示语句的结東。 5.输入输出 C语言本身不提供输入/输出语句,输入输出操作是通过调用库函数(如 scanf和 printf)完成的。 由于输入输出操作涉及具体的计算机硬件,因此把输入/输出操作放在 函数中处理可以简化C语言和C的编译系统,便于C语言在各种计算机上 实现
9 下面对 C 程序的结构作简单说明: 1. 函数是 C 程序的基本单位 ① 一个 C 源程序必须包含一个 main 函数,也可以包含其它函数。函 数是 C 程序的基本单位。 ② 程序中的函数有些是 C 语言的标准库提供的,称为标准函数(或库 函数)。如 printf( )函数和 scanf( )函数。编写程序时,如果有标准函数,就 使用标准函数;如果没有标准函数,则用户需要自己编写。 被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编 写的函数。C 是函数式的语言,程序的全部工作都是由各个函数完成的。编 写 C 程序就是编写一个个函数。 ③ C 函数库非常丰富,ANSI C 提供 100 多个库函数,Turbo C 提供 300 多个库函数。 2. main()函数 主函数是每个程序执行的起点。一个 C 程序总是从 main 函数开始执行, 而不论main函数在程序中的位置。可以将main函数放在整个程序的最前面, 也可以放在整个程序的最后,或者放在一些函数之后另一些函数之前。 3. 函数的结构 一个函数由函数首部和函数体两部分组成。 ① 函数首部:一个函数的第一行,格式如下: 返回值类型 函数名([函数参数类型 1 函数参数名 1][,…,函数参数类型 n,函数参数名 n]) 如:int max(int x,int y) 注意:一个函数可以没有参数,但是后面的一对( )不能省略,这是格式 的规定,如 main( )。 ② 函数体:函数首部下面用一对{ }括起来的部分。如果函数体内有多 对{ },则最外层是函数体的范围。函数体一般包括声明部分和执行部分。 声明部分:定义本函数所使用的变量,并为变量分配相应大小的内存单 元。变量名是内存单元的符号地址。 执行部分:由若干条语句组成的命令序列(可以在其中调用其它函数)。 4. 书写风格 C 程序书写格式自由,一行可以写几个语句,一个语句也可以写在多行 上。每条语句的最后必须有一个分号“;”表示语句的结束。 5. 输入/输出 C 语言本身不提供输入/输出语句,输入/输出操作是通过调用库函数(如 scanf 和 printf)完成的。 由于输入/输出操作涉及具体的计算机硬件,因此把输入/输出操作放在 函数中处理可以简化 C 语言和 C 的编译系统,便于 C 语言在各种计算机上 实现
不同的编译系统除了提供函数库中的标准函数外,还按照硬件的情况提 供一些专门的函数。因此不同编译系统提供的函数数量、功能会有一定差异。 6.注释 注释部分要放在符号“/”和“*”之间。为了便于阅读,程序中应适 当地加入注释。注释只起帮助阅读和理解程序的作用,不参加程序的编译, 也不影响程序的运行。使用注释是编程人员的良好习惯。 实践中,编写程序往往需要不断的修改、完善,事实上没有一个应用系 统是不需要修改、完善的。很多人会发现自己编写的程序在经历了一些时间 以后,由于缺乏必要的文档和必要的注释,最后连自己都很难再读懂。需要 花费大量时间重新思考、理解原来的程序,浪费了大量的时间。如果一开始 编程就对程序进行注释,刚开始麻烦一些,但日后可以节省大量的时间 7.预处理命令 预处理命令能够改进程序的设计环境,提高编程效率。C语言的预处理 功能主要包括:宏定义、文件包含、条件编译,分别用宏定义命令(# define)、 文件包含命令(# include)、条件编译命令(# indef.#lse.,# endif)实现,为 了与一般语句区别,这些命令以“#”开头 113C语言的表达式和语句 用表达式构成语句,表示一种运算或操作。表达式语句是在表达式的最 后加上一个“;”构成。一个表达式语句必须在最后出现分号,分号是语句 不可缺少的一部分。C程序中大多数语句是表达式语句(包括函数调用语 句) 表达式语句的一般形式 表达式 表1-1表达式与表达式语句举例 表达式语句 a=3(赋值表达式) a=3,(赋值语句)将3赋给变量a get()(函数调用表达式,gcth( gech(;合法且有意义,只关心 函数调用也属于表达式)|(函数调用语句)是否有击键,不关心具体的值 i++(自增表达式) 计+;(一般表达式语变量i的值加1 ch=ech()(函数调用表达ch= getch() 将函数的返回值赋给变量ch 式,赋值表达式) 一般表达式语句) x+y(算术表达式) x+y,(一般表达式x+y,是一个语句,其作用是完 语句) 成x+y操作,是合法的,但是 并不将结果赋给另外的变量,所
10 不同的编译系统除了提供函数库中的标准函数外,还按照硬件的情况提 供一些专门的函数。因此不同编译系统提供的函数数量、功能会有一定差异。 6. 注释 注释部分要放在符号“/*”和“*/”之间。为了便于阅读,程序中应适 当地加入注释。注释只起帮助阅读和理解程序的作用,不参加程序的编译, 也不影响程序的运行。使用注释是编程人员的良好习惯。 实践中,编写程序往往需要不断的修改、完善,事实上没有一个应用系 统是不需要修改、完善的。很多人会发现自己编写的程序在经历了一些时间 以后,由于缺乏必要的文档和必要的注释,最后连自己都很难再读懂。需要 花费大量时间重新思考、理解原来的程序,浪费了大量的时间。如果一开始 编程就对程序进行注释,刚开始麻烦一些,但日后可以节省大量的时间。 7. 预处理命令 预处理命令能够改进程序的设计环境,提高编程效率。C 语言的预处理 功能主要包括:宏定义、文件包含、条件编译,分别用宏定义命令(#define)、 文件包含命令(#include)、条件编译命令(#ifdef…#else…#endif)实现,为 了与一般语句区别,这些命令以“#”开头。 1.1.3 C 语言的表达式和语句 用表达式构成语句,表示一种运算或操作。表达式语句是在表达式的最 后加上一个“;”构成。一个表达式语句必须在最后出现分号,分号是语句 不可缺少的一部分。C 程序中大多数语句是表达式语句(包括函数调用语 句)。 表达式语句的一般形式: 表达式; 表 1-1 表达式与表达式语句举例 表 达 式 表达式语句 说 明 a=3(赋值表达式) a=3;(赋值语句) 将 3 赋给变量 a getch( )(函数调用表达式, 函数调用也属于表达式) getch( ); (函数调用语句) getch( ); 合法且有意义,只关心 是否有击键,不关心具体的值 i++ (自增表达式) i++;(一般表达式语 句) 变量 i 的值加 1 ch=getch( )(函数调用表达 式,赋值表达式) ch=getch( ); (一般表达式语句) 将函数的返回值赋给变量 ch x+y(算术表达式) x+y; (一般表达式 语句) x+y; 是一个语句,其作用是完 成 x+y 操作,是合法的,但是 并不将结果赋给另外的变量,所