第 3章 C语言的基本程序设计本章介绍C语言程序设计的基本方法和基本的程序语句。使读者对C程序有一个初步的认识,
为后面各章的学习打下基础。
3.1 C语言的语句概述
3.2 算法与结构化程序设计方法
3.3 顺序结构程序设计
3.4 顺序结构程序设计实训
3.5 选择结构程序设计
3.6 选择结构程序设计实训
3.7 循环结构程序设计
3.8 循环结构程序设计实训
3.1 C语言的语句概述
C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句、空语句。
1 表达式语句表达式语句由表达式加上分号“;”组成。
格式为:表达式;
例如,sum=a+b;
i++;
printf("Hello,everyone!\n ");
执行表达式语句就是计算表达式的值。最常用的表达式语句是赋值语句和函数调用语句 。
2 函数调用语句格式为,函数名 (实际参数表 );
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。 (在第六章函数中详细介绍 )
例如 printf("C Program ");调用库函数,输出字符串。
3 控制语句控制语句用于控制程序的流程,以实现程序的各种结构方式。
C语言有九种控制语句。 可分成以下三类:
( 1)条件判断语句
if语句,switch语句
( 2)循环执行语句
do while语句,while语句,for语句
( 3)转向语句
break语句,goto语句,continue语句,return语句
4 复合语句在 C 语言中,把多个语句用一对大括号,{ }”括起来组成的语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如例如,{
x=y+z;
a=b+c;
printf("%d%d ",x,a);
}
是一条复合语句。复合语句内的各条语句都必须以分号
,;”结尾,在括号,}”外不能加分号。
5 空语句格式,;
功能,不进行任何操作,只起到占位的作用,在程序中可用来作空循环体。
例如,for(i=0;i<100;i++);
这里的循环体为空语句,for循环虽然执行了多次,
由于循环体为空,循环只是有延时作用而已。
[Return]
3.2 算法与结构化程序设计方法
3.2.1 算法
1 算法的概念数据结构 (data structure)是对数据的描述,在程序中要指定数据的类型和数据的组织形式;算法 (algorithm)是对操作的描述,即操作步骤。实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。
程序=算法十数据结构十程序设计方法十语言工具和环境计算机的算法可分为两大类:数值运算算法和非数值运算算法。数值运算算法主要用于解决数值计算问题,
如求方程的根、求函数值、求定积分等。数值运算算法以外的算法均属于非数值运算算法,如排序问题采用的算法就是非数值运算算法。
【 例 3-1】 交换两个变量 a,b的值。
对于交换两个变量 a,b值问题,可以借助于临时变量 c,采用以下步骤实现:
S1,c=a; S1,c=b;
S2,a=b; 或 S2,b=a;
S3,b=c; S3,a=c;
【 例 3-2】 求 1+ 2+ 3+ … + 10的和。
设两个变量 S和 i,分别用以存放部分和及整数 l~ 10。
采取以下步骤实现目标:
S1,S= 0
S2,i=1
S3,S=S+ i
S4,i= i+ l
S5:如果 i不大于 10,则返回重新执行步骤 S3及其后续的 S4,S5。否则,算法到此结束,变量 S中保存的就是要求的和。
2 算法的特性
(1) 有穷性一个算法必须包含有限个操作步骤,且要在合理的时间范围内由计算机处理完成。
(2) 确定性算法中的每一个步骤都应当是确定的,而不应当是含糊的、有歧义的。
(3) 有零个或多个输入所谓输入是指在执行算法时需要从外界取得必要的信息。
(4) 有一个或多个输出算法的目的是为了求解,“解”就是输出。一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。
(5) 有效性算法中的每一个步骤都应当能有效地执行,并得到确定的结果。
3 算法的表示算法的表示或者描述主要可以用以下几种方法:自然语言、流程图,N-S结构图和伪代码。其中最常用的方法是流程图和 N-S结构图。
( 1)三种基本结构
l)顺序结构:其中 A和 B两个框是顺序执行的(其结构如图 3-1)。
2)选择结构或称分支结构:根据给定的条件 p是否成立而选择执行 A框或 B框,A框和 B框必有一个被执行(其结构如图 3-2)。
3)循环结构(又称重复结构),即重复执行某一部分操作的结构。循环结构分两种:当型循环结构和直到型循环结构。
① 当型循环结构:如图 3-3(a)所示。
② 直到型循环结构:如图 3-3(b)所示。
A
B
图 3-1顺序结构 图 3-2选择结构
(a)当型循环 (b)直到型循环
( 2) 用 N-S结构图表示算法图 3-4为例 3-1的 N-S结构图。图 3-5为例 3-2的 N-S结构图。
c=a
a=b
b=c
图 3-4 例 3-1的
N-S结构图图 3-5例 3-2的
N-S结构图
3.2.2 结构化程序设计方法一个结构化程序就是用高级语言表示或实现的结构化算法。结构化程序设计方法包括以下几个步骤:自顶而下、逐步细化、模块化设计、结构化编码。
对于一个复杂的任务,先要对其进行详尽的分析,
把它分解成若干个相互独立的子任务(模块):再把每一个子任务分解成若干个更小的子任务(子模块),直到子任务足够小,可以直接用简单的算法来实现为止;然后对每一个分解后的子任务(子模块)进行程序编码,即模块化程序设计:最后按照刚才分解的相反顺序组合各个模块,最终解决问题。
这种设计时自顶而下、逐步细化,实现时自下而上、
逐步组合的结构化程序设计方法全局性强,有利于保证程序层次分明、结构清晰、算法正确。
[Return]
3.3 顺序结构程序设计
3.3.1 数据输出函数
1字符输出函数 putchar
(1) 格式
putchar(字符变量 ) ;
(2) 功能
putchar 函数是字符输出函数,其功能是在显示器上输出单个字符。
(3) 使用说明程序中如使用本函数,则必须在文件开头使用文件包含命令 #include<stdio.h> 或 #include“stdio.h”将库函数包括到用户源文件中。
例如,putchar('A'); 输出大写字母 A。
putchar(x); 输出字符变量 x的值。
putchar('\n'); 换行。
2 格式输出函数 printf
printf函数是一个标准库函数,它的函数原型在头文件,stdio.h”中。但由于 printf函数使用频繁,系统不要求在使用 printf 函数之前必须包含 stdio.h文件。
(1) 格式
printf("格式控制字符串 ",输出表列 )
(2) 格式字符串格式字符串的格式为,[标志 ][输出最小宽度 ][.
精度 ][长度 ]格式字符
1)格式字符:
格式字符用以表示输出数据的类型,其含义如下所示:
格式字符 含义
d 以十进制形式输出带符号整数 (正数不输出符号 )
o 以八进制形式输出无符号整数 (不输出前缀 O)
x,X 以十六进制形式输出无符号整数
(不输出前缀 Ox)
(格式字符为 x,输出十六进制的 a~ f时用小写,否则用大写 )
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数,隐含输出 6位小数。
e,E 以指数形式输出单、双精度实数,
隐含输出 6位小数。
(用 e时指数用 e表示 (如 1.2e+02),否则用 E表示 (如 1.2E+02))
g,G 选 %f或 %e中输出宽度较短的一种格式输出
c 输出单个字符
s 输出字符串
2)标志常用标志字符为 -,+两种,他们的意义分别是:
-:结果左对齐,右边填空格。
+:输出符号 (正号或负号 )空格输出值为正时冠以空格,为负时冠以负号。
3)输出最小宽度用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则左边补以空格或 0
(默认格式为右对齐)。
4)精度精度格式符以,.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;
如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
5) 长度长度格式符为 h,l两种,h表示按短整型量输出,
l表示按长整型量输出。
(3) 说明如果要输出字符,%”,则应该在“格式控制”
字符串中用连续两个%表示。
例如,printf("%f%%",1.0/4); 输出结果为:
0.250000%
3.3.2 数据输入函数
1字符输入函数 getchar()
( 1)格式
getchar()
( 2)功能其功能是从键盘上输入一个字符。通常把输入的字符赋予一个字符变量,构成赋值语句。
( 3)使用说明
1) getchar函数只能接受单个字符,输入数字也按字符处理。
输入多于一个字符时,只接收第一个字符。
2) 使用本函数前必须包含文件,stdio.h”。
3) 在 TC屏幕下运行含本函数程序时,将退出 TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回 TC屏幕。
2 格式输入函数 scanf
scanf函数是一个标准库函数,它的函数原型在头文件
,stdio.h”中,与 printf函数相同,C语言也允许在使用
scanf函数之前不必包含 stdio.h文件。
(1) 格式
scanf(“格式控制字符串”,地址表列 );
其中,格式控制字符串的作用与 printf函数相同,地址表列中给出各变量的地址,或字符串的首地址。变量的地址是由地址运算符,&”后跟变量名组成的。
(2) 格式字符串
格式字符串的格式为,%[*][输入数据宽度 ][长度 ]格式字符
下面介绍各项的具体含义。
1)格式字符格式字符表示输入数据的类型,其含义如下所示:
格式字符 含义
d 输入带符号的十进制整数
o 输入无符号的八进制整数
x,X 输入无符号的十六进制整数 (大小写作用相同 )
u 输入无符号的十进制整数
f,e,E,g,G 输入实型数 (用小数形式或指数形式,大小写作用相同 )
c 输入单个字符
s 输入字符串
2)“*”符表示跳过指定的输入项或列数,读入的数据不赋予相应的变量。
例如,scanf("%d %*d %d",&a,&b);
当输入 1 2 3 时,把 1赋予 a,2被跳过,3赋予 b。
3) 宽度用十进制整数指定输入的宽度 (即字符数 ),系统将自动截取所需数据。
例如,scanf("%5d",&a);如输入 12345678则只把 12345赋予变量 a,其余部分被截去。
4)长度长度格式符为 l和 h,l表示输入长整型数据 (如 %ld) 和双精度浮点数 (如 %lf)。 h表示输入短整型数据。
(3) 使用说明
1)输入数据时不能规定精度例如,scanf("%8.3f",&a); 是非法的。不能企图用此语句输入小数为 3位的实数。
2) 格式字符串后面应当是变量地址,而不该是变量名。
例如,scanf("%d",a);是非法的,应改为
scnaf("%d",&a);才是合法的。
3) 格式字符串中除了格式字符外还出现了非格式字符,则输入时应输入与这些字符相同的字符 。
例如,scanf(“%d,%d”,&a,&b);应输入 3,4。这里的“,”与格式字符串中的“,”对应。如果输入 3 4或
3; 4则不正确。
4) 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
[Return]
3.4 顺序结构程序设计实训在确定算法和数据结构以后,顺序结构程序设计可归纳为五步:
⑴ 包含头文件或宏定义(不是必有的)
⑵ 定义变量和类型
⑶ 变量赋初值(可定义时赋,或用赋值语句,或键入)
⑷ 计算处理(考虑类型转换、溢出)
⑸ 输出结果(考虑类型、精度)
根据上面介绍的步骤进行下面的程序设计。
【 例 3-7】 计算任意两整数的和、差、积、商。
【 例 3-8】 计算圆柱的体积。
【 例 3-9】 计算一元二次方程 ax2+bx+c=0的根。 (假设 b2-
4ac>0)
【 例 3-10】 按不同格式输出整型与长整型。
【 例 3-11】 输入一个三位正整数,以倒序形式输出它的各位数。 [Return]
3.5 选择结构程序设计
3.5.1 if 语句
1 if语句的三种基本格式
(1) if型
1)格式
if (表达式 ) 语句;
2)执行过程如果表达式的值为真,则执行其后的语句,否则不执行该语句,执行后继语句。其执行过程如图所示:
3)使用说明:
这里的表达式一般是关系表达式、逻辑表达式,但还可以是算术表达式、赋值表达式或字符表达式,甚至也可以是一个变量,这正是 C语言灵活性的具体体现。系统对表达式的值进行判断,若为非零就按真来处理,执行语句;若为零就按假来处理,不执行语句。
【 例 3-12】 输入两个整数,比较它们的大小,
并将其中的大数输出 。
(2) if-else型
1)格式:
if (表达式 ) 语句 1;
else 语句 2;
2)执行过程如果表达式的值为真,则执行语句 1,否则执行语句 2,语句 1或语句 2执行完之后,执行后继语句。
其执行过程如图所示:
3)使用说明:
① 语句 1、语句 2后面都必须有,;”,它们可以是简单语句,也可以是复合语句。
② 若 if语句中,在表达式为真或为假时,都执行一个赋值语句,且是给同一个变量赋值,就可以用条件表达式来处理。如:
max=(a>b)?a:b;
当然,条件表达式很多时候不能取代一般的 if语句。
(3) if-else-if型
1) 格式
if (表达式 1) 语句 1;
else if (表达式 2) 语句 2;
else if (表达式 3) 语句 3;

else if (表达式 n) 语句 n;
else 语句 n+1;
2) 执行过程依次判断表达式的值,当出现某个值为真时,
则执行其对应的语句,然后跳到整个 if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句 n+1,然后继续执行后续程序。
( 4) if语句 (三种格式 )的使用说明
1) 在 if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
2) 在 if和 else后面可以只含一个语句,也可以有一组(多个)语句,此时必须把这一组语句用大括弧括起来组成一个复合语句。但要注意的是在右花括弧之后不能再加分号。
if语句的嵌套当 if语句中的执行语句又是 if语句时,则构成了 if 语句嵌套的情形。
( 1)格式:
if (表达式 1)
if (表达式 2) 语句 1;
else 语句 2;
else
if (表达式 3) 语句 3;
else 语句 4;
( 2)说明:
1)在嵌套的 if语句中,经常会出现多个 if和多个 else重叠的情况,这时要特别注意 if和 else的配对问题。C语言规定,else 总是与它上面最近的还没有配对的 if配对。
2)如果程序要求 else必须与某一个 if配对,则应通过添加大花括弧构成复合语句,以此来确定匹配关系。
3.5.2 switch语句
C语言还提供了另一种用于多分支选择的 switch语句。
1 格式
switch(表达式 )
{ case常量表达式 1,语句 1;
case常量表达式 2,语句 2;

case常量表达式 n,语句 n;
default,语句 n+1;
}
2执行过程计算表达式的值,并逐个与其后的常量表达式值相比较,
当表达式的值与某一个 case后面的常量表达式的值相等时,
就执行此 case后面的语句,然后不再进行判断,继续执行后面所有 case后的语句。如表达式的值与所有 case后的常量表达式均不相同时,则执行 default后的语句 n+1。
3 使用说明
(1) 在 case后的各常量表达式的值必须互不相同,否则会出现错误。
(2) 在 case后,允许有多个语句,可以不用 {}括起来。
(3) 各 case和 default子句的出现先后顺序不会影响程序执行结果。
(4) default子句可以省略不用。
[Return]
3.6 选择结构程序设计实训
【 例 3-17】 输入三个整数 x,y,z,请把这三个数由小到大输出 。
【 例 3-18】 输入并判断和显示任意一年是否为闰年 。
【 例 3-19】 编写一个计算售票收款数目的小程序 。 具体要求为:每张票零售价格为 25元,团体票价为 20元,一次购票数目超过 30张 ( 包含 30) 时按团体票出售 。 对输入的购票数目计算并输出相应的购票款的数额 。
【 例 3-20】 编写一个已知利润计算薪水的程序 。 标准如下:
( profit表示利润,薪水的单位是元)
profit≤1000 基础薪水为 500
1000< profit≤2000 另按利润的 10%提
2000< profit≤5000 另按利润的 15%提
5000< profit≤10000 另按利润的 20%提
10000< profit 另按利润的 25%提 [Return]
3.7 循环结构程序设计循环结构是结构化程序设计中三种基本结构之一 。 C语言提供了 while,do while,for三种循环语句来组成各种不同形式的循环结构 。
3.7.1 while循环语句
1格式
while (表达式 ) 语句; 其中表达式是循环条件,语句为循环体。
2执行过程先计算表达式的值,若表达式的值为真 (非 0)时,执行循环体语句;然后重复执行上面的操作,直到表达式的值为假时结束循环,执行 while循环后面的语句。其执行过程可用图表示。
3 使用说明
1) while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真 (非 0)即可继续循环。
2) 循环体如包括有一个以上的语句,则必须用 {}括起来,
组成复合语句 。
3) 循环体中应有修改循环变量,使循环趋于结束的语句,
否则出现死循环 。
4) 循环之前要为有关变量赋初值 。
一般要设计循环程序,首先要根据问题找出,循环三要素,。 即:
1)有关变量的初始化,应放在循环之前 。
2)循环条件
3)循环内要重复执行的任务 。
3.7.2 do while循环语句
1格式
do语句; while(表达式 );
其中语句是循环体,表达式是循环条件。
2执行过程先执行循环体语句,再判别表达式的值,若为真 (非 0)则返回重复执行循环体语句,如此反复,直到表达式为假终止循环。
执行过程如图所示。
3 使用说明
(1)do-while语句和 while语句的区别在于 do-while是先执行后判断,因此 do-while至少要执行一次循环体。而 while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。
(2) 在 if语句,while语句中,表达式后面都不能加分号,而在
do-while语句的表达式后面则必须加分号。
(3) do和 while之间的循环体由多个语句组成时,必须用 { }括起来组成一个复合语句。
(4) 编程时 do-while语句和 while语句一般可以相互转换。 (5) 循环之前要为有关变量赋初值。
3.7.3 for循环语句
for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。 1格式
for(表达式 1;表达式 2;表达 3)
语句;其中,“语句,即为循环体语句 。
(1) 先计算表达式 1的值 。
(2)再计算表达式 2的值,若值为真 (非 0)则执行循环体语句,否则结束循环,执行 for语句的后继语句 。
(3)然后再计算表达式 3的值,转回第 2步继续执行 。
例如:利用 for语句来计算 1+2+3+… 100的和 。
3 使用说明
(1) for 语句最常用的格式是,for(循环变量赋初值;循环条件;循环变量的增值 ) 语句;
(2) 如果在 for语句外(即 for语句出现前 )给循环变量赋初值,
可省略表达式 1。
(3) 表达式 2一般为关系表达式或逻辑表达式。
(4) 表达式 3通常可用来修改循环变量的值,一般是赋值语句。
(5) for语句中的各表达式都可省略,但分号间隔符不能少。
(6) 循环体可以是空语句,但空语句后的分号不可少。
(7) 这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。
4 几种循环语句的比较
(1)for循环主要用于循环变量初值、步长、增量以及循环次数确定的循环。
(2)while或 do-while循环主要用于循环次数及判断条件要在循环执行过程中才能确定的循环。
(3)用 while和 do-while循环时,循环变量的初始化应在 while和 do-while语句之前完成。 for循环中,
循环变量的初始化可在表达式 1中完成,也可放于循环之前。
(4) while和 do-while循环可以互相转换。 for循环也可以转换为 while和 do-while循环,但是 while和
do-while循环倒不一定能转换为 for循环。
(5) 三种循环中 for循环的功能最强,凡是其它两个循环能实现的,用 for循环也能实现。
3.7.4 break语句和 continue语句
1 break语句
(1) 格式
break;
(2) 执行过程
break语句只能用在 switch 语句或循环语句中,其功能是跳出 switch语句或跳出本层循环,转去执行后继语句。使用 break语句可以使循环语句有多个出口,在某些情况下使编程更加灵活、方便。 2 continue语句格式
continue;
(2) 执行过程
continue语句只能用在循环体中,结束本次循环,即不再执行循环体中 continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是,本语句只结束本层本次的循环,并不跳出循环。
3.7.5 循环的嵌套当循环体内某语句又是循环语句时,就构成了循环的嵌套。内嵌循环的循环体中还可以出现循环语句,这就构成了多重循环。 C语言中,
for语句,while语句,do-while语句可以相互嵌套,构成多重循环。 例如:
(1) for( ; ; ) (3) while()
{… {
while ( ) …
{…} for( ; ; )
… {…}
} …
}
(2)do { (4) for( ; ; )
… {…
for( ; ; ) for( ; ; )
{…} {…}
… …
}while(); }
都是合法的循环嵌套形式。 [Return]
3.8 循环结构程序设计实训
【 例 3-26】 编程计算 n!。
【 例 3-27】 从键盘输入两个整数,计算并输出这两个整数的最大公约数和最小公倍数。
【 例 3-28】 输入一个正整数,计算并输出这个正整数的各位数字之和。
【 例 3-29】 用穷举法来判断并输出 100以内的素数。
[Return]