第四章 顺序程序设计
,C语言程序设计,
课程讲义
2006年 4月
从程序流程的角度来看,程序可以分为三
种基本结构,即顺序结构、分支结构、循
环结构。 这三种基本结构可以组成所有的
各种复杂程序。C语言提供了多种语句来
实现这些程序结构。本章介绍这些基本语
句及其在顺序结构中的应用,使读者对C
程序有一个初步的认识,为后面各章的学
习打下基础。
本章概述,
3.1 C语句概述
3.2 赋值语句
3.3 数据输入输出的概念
3.4 字符数据的输入输出
3.5 格式输入与输出
3.6 顺序结构程序设计举例
本章主要内容
3.1 C语句概述
C程序的结构,
C语句可分为以下五类,
1、表达式语句
2、函数调用语句
3、控制语句
4、复合语句
5、空语句
C程序的执行部分是由语句组成的
程序的功能也是由执行语句实现的
1、表达式语句,表达式语句由表达式加上分号“;”组成。
其一般形式为,表达式;
执行表达式语句就是计算表达式的值。例如,
x=y+z; 赋值语句;
y+z; 加法运算语句,但计算结果不能保留,无实际意义;
i++; 自增 1语句,i值增 1。
3.1 C语句概述
执行函数语句就是调用函数体并把实际参数赋予函数定义中
的形式参数,然后执行被调函数体中的语句,求取函数值
2、函数调用语句,
由函数名、实际参数加上分号“;”组成。
其一般形式为,函数名 (实际参数 );
3.1 C语句概述
3、控制语句,
控制语句用于控制程序的流程,以实现程序的各
种结构方式。它们由特定的语句定义符组成。C
语言有九种控制语句。 可分成以下三类,
条件判断语句,if语句,switch语句;
循环执行语句,do while语句,while语句,for语句;
转向语句,break,goto,continue,return语句。
{ x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
3.1 C语句概述
4、复合语句,
把多个语句用括号 {}括起来组成的一个语句称复合语句。
在程序中应把复合语句看成是单条语句,而不是多条语句。
例如,
是一条复合语句。
复合语句内的各条语
句都必须以分号,;”
结尾,在括号,}”外
不能加分号。
本语句的功能:只要从键盘输入的字符不是回车则重新输入。
这里的循环体为空语句。
5、空语句:只有分号“;”组成的语句称为空语句。
空语句是什么也不执行的语句。空语句可用来作空循环体。
while(getchar()!='\n');
例如,
其展开之后的一般形式为,
变量 =变量 =…= 表达式 ;
例如,
a=b=c=d=e=5;
3.2 赋值语句
赋值语句是由赋值表达式再加上分号构成的表达式语句。
其一般形式为,变量 =表达式 ;
赋值语句的功能和特点都与赋值表达式相同。 它是程序中使
用最多的语句之一。
1、在赋值符,=”右边的表达式也可以又是一个赋值表达式,
因此,可以有其右的表述形式 变量 =(变量 =表达式 );
按照赋值运算符的右接合性,因此实际上等效于,
e=5; d=e; c=d; b=c; a=b;
3.2 赋值语句
如下述说明是错误的,int a=b=c=5
2、注意在变量说明中给变量赋初值和赋值语句的区别。
3、在变量说明中,不允许连续给多个变量赋初值。
给变量赋初值是变量说明的一部分,赋初值后的变量与其后的
其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分
号结尾。
例如,int a=5,b,c;
必须写为,
int a=5,b=5,c=5;
而赋值语句允许连续赋值。
4、注意赋值表达式和赋值语句的区别。
讨论 下述语句哪个是合法的?
if((x=y+5)>0) z=x; if((x=y+5;)>0) z=x;
合法的:语句
的功能是,若
表达式 x=y+5
大于 0则 z=x
非法的:因为
x=y+5;是语句,
不能出现在表达
式中
3.3 数据输入输出的概念
因此源文件开头应有以下预编译命令,
#include< stdio.h >

#include,stdio.h”
stdio是 standard input &outupt的意思。
在C语言中,所有的数据输入/输出都是由库函数完成的。
因此都是函数语句。
在使用C语言库函数时,要用预编译命令
#include
其作用是:将有关“头文件”包括到源文件中。
使用标准输入输出库函数时要用到:, stdio.h”文件
考虑到 printf和 scanf函数使用频繁,系统允许在使用这两
个函数时可不加 #include< stdio.h > 或
#include,stdio.h”
3.4 字符数据的输入输出
3.4.1 putchar 函数(字符输出函数)
1,格式,putchar(字符变量)
2,功能,在标准输出设备上,输出指定的字符
* 一次调用只能输出一个字符
* 加上分号成为字符输出语句
* 使用时在程序开头用编译命令
#include”stdio.h” 编译预处理
3,说明
putchar('A'); (输出大写字母 A)
putchar(x); (输出字符变量 x的值)
putchar(?\101?); (也是输出字符 A)
#include<stdio.h>
void main(){
char c;
printf("input a character\n");
c=getchar();
putchar(c);
}
1,格式,getchar( );
2,功能,从键盘上输入一个字符
通常把输入的字符赋予一个字符变量,构成
赋值语句,如,
char c;0.2
c=getchar();
3,说明
【 例 4.2】
输入单个字符。
3.4.2 getchar函数(键盘输入函数)
3.4 字符数据的输入输出
4、程序最后两行可用下面两行的任意一行代替,
putchar(getchar());
printf(“%c”,getchar());
使用 getchar函数还应注意几个问题,
1,getchar函数只能接受单个字符,输入数字也按字
符处理。输入多于一个字符时,只接收第一个字符。
2、使用本函数前必须包含文件, stdio.h”。
3、在 TC屏幕下运行含本函数程序时,将退出 TC 屏
幕进入用户屏幕等待用户输入。输入完毕再返回 TC
屏幕。
3.4 字符数据的输入输出
3.5 格式输入与输出
3.5.1 printf函数(格式输出函数)
printf函数称为格式输出函数,其关键字最末一个字母 f
即为“格式” (format)之意。其功能是按用户指定的格式,
把指定的数据显示到显示器屏幕上。在前面的例题中我们已
多次使用过这个函数。
printf函数调用的一般形式为,
printf(“格式控制字符串”,输出表列 )
其中格式控制字符串用于指定输出格式。格式控制串可由格
式字符串和非格式字符串两种组成。格式字符串是以 %开头
的字符串,在 %后面跟有各种格式字符,以说明输出数据的
类型、形式、长度、小数位数等。
非格式字符串在输出时原样照印,在显示中起提示作用。
输出表列中给出了各个输出项,要
求格式字符串和各输出项在数量和
类型上应该一一对应。
3.5 格式输入与输出
在 Turbo C中格式字符串的一般形式为,
[标志 ][输出最小宽度 ][.精度 ][长度 ]类型
1、格式字符串
格式字符 意 义
d 以十进制形式输出带符号整数 (正数不输出符号 )
o 以八进制形式输出无符号整数 (不输出前缀 0)
x,X 以十六进制形式输出无符号整数 (不输出前缀 Ox)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数
e,E 以指数形式输出单、双精度实数
g,G 以 %f或 %e中较短的输出宽度输出单、双精度实数
c 输出单个字符
s 输出字符串
类型字符用以表示输出数据的
类型,其格式符和意义如下表
所示,
3.5 格式输入与输出
1.标志:标志字符为 -,+,#、空格四种,其意义下表所示,
标 志 意 义
- 结果左对齐,右边填空格
+ 输出符号 (正号或负号 )
空格 输出值为正时冠以空格,为负时冠以负号
# 对 c,s,d,u类无影响;对 o类,在输出时加前缀 o;对 x类,在输出时加前缀 0x;对 e,g,f 类当结果有小数时才给出小数点
2,输出最小宽度,若实际位数多于定义的宽度,则按实际位数
输出,若实际位数少于定义的宽度则补以空格或 0。
3,精度,精度格式符以,.”开头,后跟十进制整数。本项的意
义是:如果输出数字,则表示小数的位数;如果输出的是
字符,则表示输出字符的个数;若实际位数大于所定义的
精度数,则截去超过的部分。
5、长度格式符为 h,l两种,h表示按短整型,l表示按长整型。
3.5 格式输入与输出
main()
{
int a=15;
float b=123.1234567;
double c=12345678.1234567;
char d='p';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}
格式应用举例
main(){
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,
-i++,-i--); }
3.5 格式输入与输出
main(){
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
这两个程序的区别是用一个 printf语句和多个 printf 语句输出。
但从结果可以看出是不同的。为什么结果会不同呢?就是因为
printf函数对输出表中各量求值的顺序是自右至左进行的。
先对最后一项, -i--”求值,结果为 -8,然后 i自减 1
后为 7。 再对, -i+,项求值得 -7,然后 i自增 1
后为 8。再对, i--”项求值得 8,然后 i再自减 1后
为 7。再求, i++”项得 7,然后 i再自增 1后为 8。
再求, --i”项,i先自减 1后输出,输出值为 7。
最后才求输出表列中的第一项, ++i”,此时 i自
增 1后输出 8。
但是必须注意,求值顺序
虽是自右至左,但是输出
顺序还是从左至右,因此
得到的结果是上述输出结
果。
main() /*程序 3*/
{int i,j,k1,k2;
int k3,k4,k5;
i=3;
k1=(i++)+(i++)+(i++);
printf(“k1=%d\n”,k1);
i=3;
k2=(++i)+(++i)+(++i);
printf(“k2=%d\n”,k2);
i=3;j=4;
k3=i+++j;
printf(“k3=%d\n”,k3);
结果为, k1=9
k2=18
k3=7
k4=7
k5=8
4,3
i=3;j=4;
k4=(i++)+j;
printf(“k4=%d\n”,k4);
i=3;j=4;
k5=i+(++j);
printf(“k5=%d\n”,k5);
i=3;
printf(“%d,%d\n”,i,i++);
}
3.5 格式输入与输出
程序举例
3.5.2 scanf函数 (格式输入函数 )
3.5 格式输入与输出
scanf函数称为格式输入函数,即按用户指定的格式从
键盘上把数据输入到指定的变量之中。
scanf函数的一般形式为,
scanf(“格式控制字符串”,地址表列 );
其中,格式控制字符串的作用与 printf函数相同,但不能显示
非格式字符串,也就是不能显示提示字符串。地址表列中给
出各变量的地址。地址是由地址运算符,&”后跟变量名组
成的。
例如,
&a,&b
分别表示变量 a和变量 b 的地址。
1,scanf函数的一般形式
变量的地址和变量值的关系为,
在赋值表达式
中给变量赋值,
如,
a=567
则,a为变量名,
567是变量的值,
&a是变量 a的地址。
3.5 格式输入与输出
但在赋值号左边是变量名,不能写地址,而 scanf函数在
本质上也是给变量赋值,但要求写变量的地址,如 &a。 这两
者在形式上是不同的。 &是一个取地址运算符,&a是一个表达
式,其功能是求变量的地址。
main(){
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
【 例 4.7】
由于 scanf函数本身不能显示提示串,故先用 printf语句在屏幕上输出提示,
请用户输入 a,b,c的值。执行 scanf语句,则退出 TC屏幕进入用户屏幕
等待用户输入。用户输入 7 8 9后按下回车键,此时,系统又将返回 TC屏
幕。在 scanf语句的格式串中由于没有非格式字符在,%d%d%d”之间作
输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输
入数之间的间隔。
3.5 格式输入与输出
格式字符串的一般形式为,
%[*][输入数据宽度 ][长度 ]类型
其中有方括号 []的项为任选项。各项的意义如下,
1、格式字符串
① 类型:表示输入数据的类型,其格式符和意义如下表所示。
格式 字符意义
d 输入十进制整数
o 输入八进制整数
x 输入十六进制整数
u 输入无符号十进制整数
f或 e 输入实型数 (用小数形式或指数形式 )
c 输入单个字符
s 输入字符串
3.5 格式输入与输出
②,*”符,用以表示该输入项,读入后不赋予相应的变量,即
跳过该输入值。
如, scanf("%d %*d %d",&a,&b);
当输入为,1 2 3时,把 1赋予 a,2被跳过,3赋予 b。
③ 宽度,用十进制整数指定输入的宽度 (即字符数 )。
例如,scanf("%5d",&a);
输入,12345678
只把 12345赋予变量 a,其余部分被截去。
④ 长度,长度格式符为 l和 h,l表示输入长整型数据 (如 %ld)
和双精度浮点数 (如 %lf)。 h表示输入短整型数据。
3.5 格式输入与输出
使用 scanf函数还必须注意以下几点,
? scanf函数中没有精度控制,如,scanf("%5.2f",&a);是非
法的。不能企图用此语句输入小数为 2位的实数。
? scanf中要求给出变量地址,如给出变量名则会出错。如
scanf("%d",a);是非法的,应改为 scnaf("%d",&a);才是合
法的。
? 在输入多个数值数据时,若格式控制串中没有非格式字符
作输入数据之间的间隔则可用空格,TAB或回车作间隔。 C
编译在碰到空格,TAB,回车或非法数据 (如对,%d”输入
,12A”时,A即为非法数据 )时即认为该数据结束。
? 在输入字符数据时,若格式控制串中无非格式字符,则认
为所有输入的字符均为有效字符。
例如,
scanf("%c%c%c",&a,&b,&c);
输入为,
d e f
则把 'd'赋予 a,' ' 赋予 b,'e'赋予 c。
只有当输入为,
def
时,才能把 'd'赋于 a,'e'赋予 b,'f'赋予 c。
如果在格式控制中加入空格作为间隔,
如,
scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。
3.5 格式输入与输出
main(){
char a,b;
printf("input character a,b\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
}
main(){
char a,b;
printf("input character a,b\n");
scanf("%c %c",&a,&b);
printf("\n%c%c\n",a,b);
}
【 例 4.9】
【 例 4.8】
由于 scanf函数 "%c%c"
中没有空格,输入 M N,
结果输出只有 M。而输入
改为 MN时则可输出 MN两
字符。
本例表示 scanf格式控制
串 "%c %c"之间有空格时,
输入的数据之间可以有空
格间隔。
⑤ 如果格式控制串中有非格式字符则输入时也要输入该非格
式字符。
例如,scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“,”作间隔符,故输入时应为,5,6,7
又如, scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为,a=5,b=6,c=7
3.5 格式输入与输出
⑥ 如输入的数据与输出的类型不一致时,虽然编译能够通过,
但结果将不正确。
main(){
int a;
printf("input a number\n");
scanf("%d",&a);
printf("%ld",a);
}
由于输入数据类型为整型,
而输出语句的格式串中说明
为长整型,因此输出结果和
输入数据不符。
3.5 格式输入与输出 (举例)
main(){
char a,b,c;
printf("input character a,b,c\n");
scanf("%c %c %c",&a,&b,&c);
printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-
32,b-32,c-32);
}
1.输入三个小写字母,输出其 ASCII码和对应的大写字母。
2,输出各种数据类型的字节长度。
main(){
int a;
long b;
float f;
double d;
char c;
printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:
%d\n",sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));}
读程序,
main()
{char ch;
int i;
float x;
scanf(“%c %d %f”,&ch,&i,&x);
printf(“ch=%c i=%d x=%f\n”,ch,i,x);}
运行 1结果是,
输入,d 23 12.345 并回车
输出,ch=d i=23 x=12.345000
运行 2结果是,
输入,d 23.645 12.345 并回车
输出,ch=d i=23 x=0.645000
输入
数据时说
明符间的
字符也应
该输入;
输入的数
据类型必
须与 scanf
中说明的
一致;输
入数据的
个数不能
少于 scanf
中说明的
个数。
3.5 格式输入与输出 (举例)
3.6 顺序结构程序设计举例
【 例 4.14】 输入三角形的三边长,求三角形面积。
已知三角形的三边长 a,b,c,则该三角形的面积公式为,
其中 s = (a+b+c)/2}
#include<math.h>
main()
{
float a,b,c,s,area;
scanf(“%f,%f,%f”,&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n”,a,b,c,s);
printf(“area=%7.2f\n”,area);
}
3.6 顺序结构程序设计举例
【 例 4.15】 求 ax2+bx+c=0方程的根,a,b,c由键盘输入,
设 b2-4ac>0。求根公式为,
则 x1=p+q
x2=p-q
#include<math.h>
main()
{
float a,b,c,disc,x1,x2,p,q;
scanf(“a=%f,b=%f,c=%f”,&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;x2=p-q;
printf(“\nx1=%5.2f\nx2=%5.2f\n”,x1,x2);
}
3.6 顺序结构程序设计举例
编程,从键盘输入四个整数,分别存入整型
变量 a,b,c,d中,并将 (a+b)?(c+d)的
结果显示出来。
main() \*程序 4*\
{int a,b,c,d,x;
scanf(“a=%d,b=%d”,&a,&b);
scanf(“%d%d”,&c,&d);
x=(a+b)*(c+d);
printf(“\n(a+b)*(c+d)=”);
printf(“%d\n”,x);}
结果为, a=1,b=2 (输入)
3 4 (输入)
(a+b)? (c+d)=21 (输出)
,定义一个整型变量,从键盘为该变量
输入数据,并将其值减 1后显示出来。
main() \*程序 5*\
{int i;
scanf(“i=%d”,&i);
print i=%d\n”,i-1);
}
结果为,
i=5 (输入 5)
i=4 (输出 4)
一, C中的语句有五类
二,C中的基本结构有三种
三, 字符输入输出函数(一次一个字符)
四,格式输入输出函数( scanf,printf)
五,格式控制符的使用 %m.nf,%-m.nf等
注意
课后小结