第 3章 顺序结构程序设计北京科技大学 计算机系
C 语言程序设计
2009-7-29
2程序的三种基本结构顺序结构
N-S
结构图流程图
A
B
A
B
选择结构
Y N
A B
P成立
P
T F
A B
2009-7-29
3程序的三种基本结构循环结构
N
Y
P成立
A
当 P成立时
A
直到型循环
A
当 P成立时
Y
N
A
P成立当型循环
N-S
结构图流程图
2009-7-29
4本章主要内容:
C语言的语句类型
数据输出
数据输入
顺序结构程序设计
2009-7-29
53.1 C语言的语句类型
主要内容:
– 说明性语句
– 表达式语句
– 控制语句
– 复合语句
2009-7-29
63.1.1 说明性语句
对程序中使用的变量、数组、函数等操作对象进行定义、声明的描述语句
只起说明作用,不产生可执行的机器指令代码。
例如,int a,b;
float function( int,int);
C程序由函数组成。函数的格式:
函数名(参数表)
{ 说明部分;
执行部分;
}
数据类型说明语句可执行语句
2009-7-29
7
表达式后面加一个分号,构成表达式语句
x=3; y=y+5;
x=a-b && c || d ;
printf("x=%d,y=%d\n",x,y);
sort(a,10);
3.1.2 表达式语句赋值语句函数调用语句
注意:
① 分号是语句必不可少的一部分
② 单独的一个分号,;” 构成一个空语句例如,; (空语句,是最简单的 C语句)
2009-7-29
83.1.3 控制语句
1.选择分支控制语句
if ( ) … else …
switch ( ) { … }
2.循环控制语句
for ( ) …
while ( ) …
do … while ( )
3.其他控制语句
break,continue,goto
return
2009-7-29
93.1.4 复合语句
用一对花括号,{},括起来的若干条语句
花括号中可以是说明语句、表达式语句、
控制语句,也可以是复合语句
例如:
⑴ if (a>b) { max=a; min=b; }
⑵ for(n=1; n<10 ;n++)
{ p = n + p;
if( p >= 100 )
{ printf(“% d\n”,p);
break;
}
}
2009-7-29
103.1.4 复合语句 ( 续 )
复合语句中如果有说明性语句,应该写在可执行语句的前面例如:
main( )
{ int a,b;
a=b=100;
{ float c=10.23;
printf("%f\n",c);
}
printf("%d %d\n",a,b);
}
要特别注意:
花括号的配对
花括号的位置
C语言学习的难点之一
2009-7-29
113.2 数据输出
主要内容:
– 字符输出函数
– 格式输出函数
2009-7-29
123.2.1 字符输出函数
函数调用的一般形式
putchar(ch)
功能:
– 在标准输出设备(即显示器屏幕)上输出一个字符。
例如:
putchar('b');
putchar('\n');
putchar('\101');
putchar(st);
2009-7-29
13说明
putchar是 C语言的标准库函数,使用时必须加编译预处理命令:
#include "stdio.h" 或 #include <stdio.h>
【 例 3.1】 利用 putchar函数输出字符 。
#include "stdio.h"
main( )
{ char c1,c2;
c1='a' ; c2='b' ;
putchar(c1);putchar(c2); putchar('\n');
putchar(c1-32);putchar(c2-32);
putchar('\n');
}
也可改为
c1=97 ; c2=98 ;
输出结果,ab
AB
例 jc3_1
2009-7-29
143.3.2 格式输出函数
函数调用的一般形式
printf(格式控制,参数 2,…,参数 n)
功能,按格式控制所指定的格式,在标准输出设备上输出参数 2,…,参数 n的值。
例如有程序段,
int a=123,b=100;
printf("%d %d %d\n",a,b,a+b);
printf ("c = %d + %d = %d\n",a,b,a+b );
2009-7-29
15格式控制
用双引号括起的字符串,用于指定 输出数据的类型、格式、个数
包括,普通字符 和 格式说明符照原样输出
printf ("c=%d+%d=%d\n",a,b,a+b );
格式说明符:指定输出 3个十进制整型数,
分别为变量 a,b,a+ b的值
2009-7-29
16输出格式说明符整型数据
%d 以有符号十进制形式输出整型数
%o 以无符号八进制形式输出整型数
%x 以无符号十六进制形式输出整型数
%u 以无符号十进制形式输出整型数实型数据
%f 以小数形式输出实型数
%e 以指数形式输出实型数
%g 按数值宽度最小的形式输出实型数字符型数据
%c 输出一个字符
%s 输出字符串其他 %% 输出字符 % 本身
在%和格式符之间可以使用 附加说明符
2009-7-29
17附加格式说明符
l 输出长整型数(只可与 d,o,x,u结合用)
m 指定数据输出的宽度(即域宽)
.n 对实型数据,指定输出 n 位小数;
对字符串,指定左端截取 n 个字符输出
+ 使输出的数值数据无论正负都带符号输出
- 使数据在输出域内按左对齐方式输出整数位数 +小数位数 +小数点自动对 n位后小数四舍五入例如:
%ld —— 输出十进制长整型数
%m.nf —— 右对齐,m位域宽,n位小数或 n个字符
%-m.nf —— 左对齐
2009-7-29
18例 3.2 整型数据的输出
main( )
{ int a=11,b=22;
int m=-1; long n=123456789;
printf("%d %d\n",a,b);
printf("a=%d,b=%d\n",a,b);
printf("m,%d,%o,%x,%u\n",m,m,m,m);
printf("n=%d\n",n);
printf("n=%ld\n",n);
}
程序输出:
1122
a=11,b=22
m,-1,177777,ffff,65535
n=-13035
n=123456789
例 jc3_a
2009-7-29
19例 3.3 实型数据的输出
main( )
{ float x=1234.56,y=1.23456789;
double z=1234567.123456789;
printf("x=%f,y=%f \n",x,y);
printf("z=%f\n",z);
printf("z=%e\n",z);
printf("z=%g\n",z);
printf("z=%18.8f\n",z);
printf("x=%10.3f\n",x);
printf("x=%-10.3f\n",x);
printf("x=%4.3f\n\n",x);
}
程序输出:
x=1234.560059,y=1.234568
z=1234567.123457
z=1.23457e+06
z=1234570
z= 1234567.12345679
x= 1234.560
x=1234.560
x=1234.560
例 jc3_b
2009-7-29
20例 3.4 字符型数据的输出
main( )
{ int m=97;
char ch='B';
printf("m,%d %c\n",m,m);
printf("ch,%d %c\n",ch,ch);
printf("%s\n","student");
printf("%10s\n","student");
printf("%-10s\n","student");
printf("%10.3s\n","student");
printf("%.3s\n\n","student");
}
程序输出:
m,97 a
ch,66 B
student
student
student
stu
stu
例 jc3_c
2009-7-29
21注意:
printf函数格式控制中的格式说明符与输出参数的个数和类型必须一一对应。
格式说明符的 % 和后面的描述符之间不能有空格。除 %X,%E,%G外类型描述符必须是小写字母。
长整型数应该用% ld( 或% lo、% lx、% lu) 格式输出,否则会出现输出错误。
printf函数的参数可以是常量、变量或表达式。
在计算各参数值时,Turbo C采用从右至左的顺序求值。
2009-7-29
223.3 数据输入
主要内容:
– 字符输入函数
– 格式输入函数
2009-7-29
233.3.1 字符输入函数
函数调用的一般形式
getchar( )
功能:
– 从标准输入设备(即键盘)上交互输入一个字符。
例如:
getchar( ) ;
c = getchar( );
printf("%c \n",getchar( ));
2009-7-29
24例如:
【例 3.8】 getchar函数的应用。
#include "stdio.h"
main( )
{ char ch;
ch=getchar( );
printf("%c %d\n",ch,ch);
printf("%c %d\n\n",ch-32,ch-32);
}
程序运行时输入,m并按回车键后输出结果是:
m 109
M 77
例 jc3_8
2009-7-29
25说明:
getchar是 C语言的标准库函数,使用时必须加编译预处理命令:
#include "stdio.h" 或 #include <stdio.h>
getchar函数需要交互输入,接收到输入字符之后才继续执行程序。
连续使用 getchar函数时,要注意字符的输入形式,例如执行如下程序段:
char ch1,ch2;
ch1=getchar( );
ch2=getchar( );
必须连续输入两个字符,中间不能有其他字符
2009-7-29
263.3.2 格式输入函数
函数调用的一般形式
scanf(格式控制,地址参数 2…,地址参数 n);
功能,按格式控制指定的格式,从标准输入设备 (即键盘 )交互输入数据,并依次存放到对应地址参数指定的变量中 (即将输入值赋给变量 )。
例如:
scanf ("%d%f",&a,&f);
scanf ("%o,%f ",&b,&x);
scanf ("a=%d,b=%d",&a,&b);
2009-7-29
27格式控制
用双引号括起的字符串,用于指定 输入数据的类型、格式、个数以及输入的形式
包括,普通字符 和 格式说明符照原样输入
scanf ("a=%d,b=%d",&a,&b);
格式说明符:指定输入 2个十进制整型数赋给变量 a 和 b
2009-7-29
28输入格式说明符整型数据
%d 输入十进制整型数
%u 输入无符号的十进制整型数
%o 输入八进制整型数
%x 输入十六进制整型数实型数据
%f 输入小数形式的单精度实型数
%e 输入指数形式的单精度实型数字符型数据
%c 输入单个字符
%s 输入一个字符串
在%和格式符之间可以使用附加说明符
2009-7-29
29附加格式说明符
l
与 d,o,x,u结合输入长整型数与 f 结合输入 double型数
m 指定数据输入的宽度(即域宽)
* 忽略读入的数据(即不将读入数据赋给相应变量)
例如:
%ld,%lo——输入十进制、八进制长整型数
%lf,%le——输入双精度实型数
%mf——输入 m位数(域宽)
%*d——忽略输入的一个整型数对 float和 double型指 整数位数 +小数点 +小数位数
2009-7-29
30例如:
scanf ("%d%d%d",&a,&b,&c);
输入 3个整型十进制数,以空白符
(空格,tab键或回车键)分隔
scanf ("%d,%o,%f ",&a,&b,&x);
输入 3个数,以“,”分隔
scanf ("a=%d,b=%d",&a,&b);
输入的形式是,a=32,b=28
( 普通字符要照原样输入)
2009-7-29
31程序:
main( )
{ int a,b,c; long m;
float x; double y;
char ch,string[20];
printf("input a,b,c,m,");
scanf("%d %o %x %ld",&a,&b,&c,&m);
printf("a=%d,b=%d,c=%d,m=%ld\n",a,b,c,m);
printf("input x,y,");
scanf("%f %lf",&x,&y); getchar();
printf("x=%f,y=%f\n",x,y);
printf("input ch,string,");
scanf("%c %s",&ch,string);
printf("ch=%c,string=%s\n\n",ch,string);
}
运行 jc3_d
2009-7-29
32使用 scanf函数应注意:
要求在程序运行中输入数据,输入的数据个数和类型必须与格式说明符一一对应。
地址参数形式,&变量名(除数组或指针变量)
格式控制中有普通字符时,必须照原样输入。
格式控制中无普通字符时,输入的数值型数据和字符串用空白符分隔,字符型数据不必分隔。
double型数据输入时,必须用 %lf或 %le格式
实型数输入时域宽不能用 m.n形式的附加说明
为了减少不必要的输入量,除了逗号、分号、
空格符以外,格式控制中尽量不要出现普通字符,也不要使用 '\n','\t' 等转义字符
2009-7-29
33
scanf ("%c%c%c",&ch1,&ch2,&ch3);
要输入,abc?
不能输入,a?b?c?
注意数值型数据与 char型数据的混合输入注意 ( 续 ),
格式符之间若无普通字符,则:
– 输入的数值型数据用空白符分隔
– 输入的 char型数据不必分隔例如:
scanf ("%d%d",&m,&n);
scanf ("%c",&ch);
错误输入:
32?28?
a
正确输入:
32?28a?
2009-7-29
343.4 顺序结构程序设计
3.4.1 顺序结构程序的一般算法描述变量定义变量赋值运算处理输出 结果可用:
变量初始化
赋值语句
输入函数调用语句
2009-7-29
353.4.2 顺序结构程序设计举例
【例 3.15】数据交换。从键盘输入 a,b的值,
输出交换以后的值。
思路,在计算机中交换变量 a和 b的值,
不能只写下面两个赋值语句
a=b ; b=a ;
正确的交换方法:
c=a ; a=b ; b=c;
2009-7-29
36程序:
main( )
{ int a,b,c;
printf("\ninput a,b,");
scanf("%d,%d",&a,&b);
printf("\nbefore exchange:a=%d b=%d\n",a,b);
c=a; a=b; b=c;
printf("after exchange,a=%d b=%d\n",a,b);
}
程序运行情况如下:
input a,b,32,57?
before exchange,a=32 b=57
after exchange,a=57 b=32
运行 jc3_15
2009-7-29
37举例:
【例 3.16】已知三条边 a,b,c,求三角形面积。计算三角形面积的海伦公式:
)cs)(bs)(as(sa r e a
)cba(21s
其中:
设定义:
整型变量 a,b,c
实型变量 s,area
2009-7-29
38程序如下:
#include "math.h"
main( )
{ int a,b,c;
float s,area ;
scanf("%d,%d,%d",&a,&b,&c);
s =1.0/2*(a+b+c) ;
area = sqrt(s*(s-a)*(s-b)*(s-c)) ;
printf("area = %8.3f \n",area) ;
}
程序运行情况如下:
3,4,5?
area = 6.000
实际上还需要判断 a,b、
c是否能构成三角形,即应该进行选择判断处理运行 jc3_16