第 4章 简单的 C程序设计
4.1 流程结构和语句程序的基本结构:
顺序结构选择结构循环结构
4.1流程结构和语句
C语言中的语句:完成一定的 操作任务
1、表达式语句,P70
例 x=3;
x+y;
在任何表达式后面加一个分号,;,就构成一条表达式语句。
2、控制语句:
条件语句( if)
循环语句( while,do while,for)
结束本次循环语句 (continue)
中止执行 switch或循环语句 (break)
多分支选择语句 (switch)
转向语句 (goto)
从函数中返回语句 (return)
用来完成一定的控制功能。
3、函数调用语句:
由一个函数调用加一个分号构成函数调用语句。
例 printf(“hello!”);
4、空语句:
只有一个分号的语句,它什么也不做,有时候用来作被转向点,或循环语句中的循环体。
例 ;
5、复合语句:
用 {}把一些语句括起来。
例 {t=x;
x=y;
y=t;}
C语言无 I/O语句,I/O操作由函数实现
#include <stdio.h>
4.5 格式输入输出函数格式,printf(,格式控制串”,输出表 )
功能:按指定格式向显示器输出数据
– 标准输出函数 printf
输出表:要输出的数据(可以没有,多个时以,,” 分隔)
格式控制串:包含两种信息
– 格式说明,%[修饰符 ]格式字符,用于指定输出格式
– 普通字符或转义序列:原样输出
格式字符
d,i
x,X
o
u
c
s
e,E
f
g
%%
格式字符:
十六进制无符号整数不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数小数形式浮点小数
e和 f中较短一种百分号本身
int a=567;printf (,%d”,a);
int a=255;printf(“%x”,a);
int a=65;printf(“%o”,a);
int a=567;printf(“%u”,a);
char a=65;printf(“%c”,a);
printf(“%s”,“ABC”);
float a=567.789;printf(“%e”,a);
float a=567.789;printf(“%f”,a);
float a=567.789;printf(“%g”,a);
printf(“%%”);
567
ff
101
567
A
ABC
5.677890e+02
567.789000
567.789
%
说明
– 格式字符要用小写
– 格式字符与输出项个数应相同,按先后顺序一一对应
– 输出转换,格式字符与输出项类型不一致,自动按指定格式输出例 main()
{ unsigned i t u=65535;
printf(“u=%d \n”,u);
}
输出结果,u=-1
例 int a=3,b=4;
printf(“%d %d\,,a,b);
printf(“a=%d,b=%d\n”,a,b);
输出结果,3 4
a=3,b=4
11 11 11 11 11 11 11 11 65535
附加格式说明符(修饰符)
.n 对实数,指定小数点后位数 (四舍五入 )对字符串,指定实际输出位数修饰符 功 能
m 输出数据域宽,数据长度 <m,左补空格 ;否则按实际输出输出数据在域内左对齐(缺省右对齐 )-
指定在有符号数 的正数前显示正号 (+)+
输出数值时指定左面不使用的空位置自动填 00
在八进制和十六进制数前显示前导 0,0x#
在 d,o,x,u前,指定输出精度为 long型在 e,f,g前,指定输出精度为 double型l
例 int a=1234;
float f=123.456;
char ch=?a?;
printf(“%8d,%2d\n”,a,a);
printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f);
printf(“%3c\n”,ch);
运行 1234,1234
结果,123.456000,123.456000,123.5,123.46,1.23e+02
a
例 m.n
例 static char a[]=“Hello,world!”
printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a);
运行结果,Hello,world!
Hello,world!
Hello
Hello
Hel
例 int a=1234;
float f=123.456;
static char c[]=“Hello,world!”;
printf(“%8d,%-8d,%d\n”,a,a,a);
printf(“%10.2f,%-10.1f\n”,f,f);
printf(“%10.5s,%-10.3send\n”,c,c);
运行结果,_ _ _ _1234,1234_ _ _ _,1234
_ _ _ _123.46,123.5_ _ _ _ _,123.456000
_ _ _ _ _Hello,Hel_ _ _ _ _ _ _end
例 -
例 int a=1234;
float f=123.456;
printf(“%08d\n”,a);
printf(“%010.2f\n”,f);
printf(“%0+8d\n”,a);
printf(“0+10.2f\n”,f);
例 0,+
/*00001234*/
/*0000123.46*/
/*000+1234*/
/*000+123.56*/
例 int a=123;
printf(“%o,%#o,%X,%#X\n”,a,a,a,a);
例 #
例 long a=65536;
printf(“%d,%8ld\n”,a,a);
例 l
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
/*173,0173,7B,0X7B*/
/*0,65536*/
– 标准输入函数 scanf
格式,scanf(“格式控制串,,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数
地址表:变量的地址,常用取地址运算符 &
格式字符,d,i,o,x,u,c,s,f,e(g)——P83
例 scanf(“%d”,&a);
输入,10?
则 a=10
例 scanf(“%x”,&a);
输入,11?
则 a=17
附加格式说明符(修饰符)
l
修饰符 功 能
h
域宽
*
用于 d,o,x前,指定输入为 short型整数用于 d,o,x前,指定输入为 long型整数用于 e,f前,指定输入为 double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例 scanf(―%4d%2d%2d‖,&yy,&mm,&dd);
输入 19991015?
则 1999?yy,10?mm,15?dd
例 scanf(“%3d%*4 %f”,&k,&f);
输入 12345678765.43?
则 123?k,8765.43?f
例 scanf(,2d *3d 2d”,a,&b);
输入 12 345 67
则 12?a,67?b
例 sc ―%3c%2c‖,&c1,c2);
输入 abcde?
则‘ a‘?c,?d‘?c2
输入分隔符的指定
–一般以空格,TAB或回车键作为分隔符
–其它字符做分隔符:格式串中两个格式符间字符例 scanf(―%d%o%x‖,&a,&b,&c);
printf(―a=%d,b=%d,c=%d\n‖,a,b,c);
输入 123 123 123?
输出 a=123,b=83,c=291
例 scanf(“%d:%d:%d”,&h,&m,&s);
输入 12:30:45?
则 12?h,30?m,45?s
例 scanf(“%d,%d”,&a,&b)
输入 3,4?
则 3?a,4 b
例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
输入 a=12,b=24,c=36?
说明:
–用,%c‖格式符时,空格和转义字符作为有效字符输入
–输入数据时,遇以下情况认为该数据结束:
遇空格,TAB,或回车
遇宽度结束
遇非法输入
–输入函数留下的,垃圾,:
例 int x;
char ch;
scanf(“%d”,&x);
ch=getchar();
printf(“x=%d,ch=%d\n”,x,ch);
执行,123?
输出,x=123,ch=10
例 int x;
char ch;
scanf(“%d”,&x);
scanf(“%c”,&ch);
printf(“x=%d,ch=%d\n”,x,ch);
执行,123?
输出,x=123,ch=10
解决方法:
( 1)用 getchar()清除
( 2)用函数 fflush(stdin)清除全部剩余内容
(3) 用格式串中空格或,%*c”来,吃掉,
例 int x;
char ch;
scanf(“%d”,&x);
scanf(,%c”,&ch);
或 scanf(“%*c%c”,&ch);
如 scanf(―%c%c%c‖,&c1,&c2,&c3);
若输入 a b c?
则 a?c1,?c2,b?c3
4.4 字符输入输出函数格式,putchar( c )
参数,c为字符常量、变量或表达式功能:把字符 c输出到显示器上返值:正常,为显示的代码值;出错,为 EOF(-1)
– 字符输出函数
#include <stdio.h>
main()
{ int c;
char a;
c=65; a='B';
putchar(c); putchar('\n'); putchar(a);
}
运行结果,A
B
4.4 字符输入输出函数字符输入函数格式,getchar( )
功能:从键盘读一字符返值:正常,返回读取的代码值;出错,返回 EOF(-1)
#include <stdio.h>
main()
{ int c;
printf("Enter a character:");
c=getchar();
printf("%c--->hex%x\n",c,c);
}
运行结果:
Enter a character:A?
A--->hex41
4.6 顺序结构程序设计举例
A
B
A
B
流程图 N-S图
所谓顺序结构,见下图,先执行 A操作,再执行 B操作,两者是顺序执行的关系。
例 从键盘输入圆的半径,求圆的面积。
#define PI 3.1415926
#include "stdio.h"
main()
{ float r,s;
printf(“please input radius:\n r=”);
scanf(“%f”,&r);
s=PI*r*r;
printf(“area=%f\n",s);
}
输入,r=10?
输出:
Area=314.159260
例 从键盘输入大写字母,用小写字母输出
#include "stdio.h"
main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
输入,A?
输出,A,65
a,97
#include <math.h>
#include <stdio.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,4,6?
输出,a= 3.00,b= 4.00,c= 6.00 s= 6.50
area= 5.33
流程结构和语句格式输入输入函数标准输出函数 printf
标准输入函数 scanf
字符输入输出函数字符输出函数 putchar
字符输入函数 getchar
顺序结构程序设计
4.1 流程结构和语句程序的基本结构:
顺序结构选择结构循环结构
4.1流程结构和语句
C语言中的语句:完成一定的 操作任务
1、表达式语句,P70
例 x=3;
x+y;
在任何表达式后面加一个分号,;,就构成一条表达式语句。
2、控制语句:
条件语句( if)
循环语句( while,do while,for)
结束本次循环语句 (continue)
中止执行 switch或循环语句 (break)
多分支选择语句 (switch)
转向语句 (goto)
从函数中返回语句 (return)
用来完成一定的控制功能。
3、函数调用语句:
由一个函数调用加一个分号构成函数调用语句。
例 printf(“hello!”);
4、空语句:
只有一个分号的语句,它什么也不做,有时候用来作被转向点,或循环语句中的循环体。
例 ;
5、复合语句:
用 {}把一些语句括起来。
例 {t=x;
x=y;
y=t;}
C语言无 I/O语句,I/O操作由函数实现
#include <stdio.h>
4.5 格式输入输出函数格式,printf(,格式控制串”,输出表 )
功能:按指定格式向显示器输出数据
– 标准输出函数 printf
输出表:要输出的数据(可以没有,多个时以,,” 分隔)
格式控制串:包含两种信息
– 格式说明,%[修饰符 ]格式字符,用于指定输出格式
– 普通字符或转义序列:原样输出
格式字符
d,i
x,X
o
u
c
s
e,E
f
g
%%
格式字符:
十六进制无符号整数不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数小数形式浮点小数
e和 f中较短一种百分号本身
int a=567;printf (,%d”,a);
int a=255;printf(“%x”,a);
int a=65;printf(“%o”,a);
int a=567;printf(“%u”,a);
char a=65;printf(“%c”,a);
printf(“%s”,“ABC”);
float a=567.789;printf(“%e”,a);
float a=567.789;printf(“%f”,a);
float a=567.789;printf(“%g”,a);
printf(“%%”);
567
ff
101
567
A
ABC
5.677890e+02
567.789000
567.789
%
说明
– 格式字符要用小写
– 格式字符与输出项个数应相同,按先后顺序一一对应
– 输出转换,格式字符与输出项类型不一致,自动按指定格式输出例 main()
{ unsigned i t u=65535;
printf(“u=%d \n”,u);
}
输出结果,u=-1
例 int a=3,b=4;
printf(“%d %d\,,a,b);
printf(“a=%d,b=%d\n”,a,b);
输出结果,3 4
a=3,b=4
11 11 11 11 11 11 11 11 65535
附加格式说明符(修饰符)
.n 对实数,指定小数点后位数 (四舍五入 )对字符串,指定实际输出位数修饰符 功 能
m 输出数据域宽,数据长度 <m,左补空格 ;否则按实际输出输出数据在域内左对齐(缺省右对齐 )-
指定在有符号数 的正数前显示正号 (+)+
输出数值时指定左面不使用的空位置自动填 00
在八进制和十六进制数前显示前导 0,0x#
在 d,o,x,u前,指定输出精度为 long型在 e,f,g前,指定输出精度为 double型l
例 int a=1234;
float f=123.456;
char ch=?a?;
printf(“%8d,%2d\n”,a,a);
printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f);
printf(“%3c\n”,ch);
运行 1234,1234
结果,123.456000,123.456000,123.5,123.46,1.23e+02
a
例 m.n
例 static char a[]=“Hello,world!”
printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a);
运行结果,Hello,world!
Hello,world!
Hello
Hello
Hel
例 int a=1234;
float f=123.456;
static char c[]=“Hello,world!”;
printf(“%8d,%-8d,%d\n”,a,a,a);
printf(“%10.2f,%-10.1f\n”,f,f);
printf(“%10.5s,%-10.3send\n”,c,c);
运行结果,_ _ _ _1234,1234_ _ _ _,1234
_ _ _ _123.46,123.5_ _ _ _ _,123.456000
_ _ _ _ _Hello,Hel_ _ _ _ _ _ _end
例 -
例 int a=1234;
float f=123.456;
printf(“%08d\n”,a);
printf(“%010.2f\n”,f);
printf(“%0+8d\n”,a);
printf(“0+10.2f\n”,f);
例 0,+
/*00001234*/
/*0000123.46*/
/*000+1234*/
/*000+123.56*/
例 int a=123;
printf(“%o,%#o,%X,%#X\n”,a,a,a,a);
例 #
例 long a=65536;
printf(“%d,%8ld\n”,a,a);
例 l
00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
/*173,0173,7B,0X7B*/
/*0,65536*/
– 标准输入函数 scanf
格式,scanf(“格式控制串,,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数
地址表:变量的地址,常用取地址运算符 &
格式字符,d,i,o,x,u,c,s,f,e(g)——P83
例 scanf(“%d”,&a);
输入,10?
则 a=10
例 scanf(“%x”,&a);
输入,11?
则 a=17
附加格式说明符(修饰符)
l
修饰符 功 能
h
域宽
*
用于 d,o,x前,指定输入为 short型整数用于 d,o,x前,指定输入为 long型整数用于 e,f前,指定输入为 double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例 scanf(―%4d%2d%2d‖,&yy,&mm,&dd);
输入 19991015?
则 1999?yy,10?mm,15?dd
例 scanf(“%3d%*4 %f”,&k,&f);
输入 12345678765.43?
则 123?k,8765.43?f
例 scanf(,2d *3d 2d”,a,&b);
输入 12 345 67
则 12?a,67?b
例 sc ―%3c%2c‖,&c1,c2);
输入 abcde?
则‘ a‘?c,?d‘?c2
输入分隔符的指定
–一般以空格,TAB或回车键作为分隔符
–其它字符做分隔符:格式串中两个格式符间字符例 scanf(―%d%o%x‖,&a,&b,&c);
printf(―a=%d,b=%d,c=%d\n‖,a,b,c);
输入 123 123 123?
输出 a=123,b=83,c=291
例 scanf(“%d:%d:%d”,&h,&m,&s);
输入 12:30:45?
则 12?h,30?m,45?s
例 scanf(“%d,%d”,&a,&b)
输入 3,4?
则 3?a,4 b
例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
输入 a=12,b=24,c=36?
说明:
–用,%c‖格式符时,空格和转义字符作为有效字符输入
–输入数据时,遇以下情况认为该数据结束:
遇空格,TAB,或回车
遇宽度结束
遇非法输入
–输入函数留下的,垃圾,:
例 int x;
char ch;
scanf(“%d”,&x);
ch=getchar();
printf(“x=%d,ch=%d\n”,x,ch);
执行,123?
输出,x=123,ch=10
例 int x;
char ch;
scanf(“%d”,&x);
scanf(“%c”,&ch);
printf(“x=%d,ch=%d\n”,x,ch);
执行,123?
输出,x=123,ch=10
解决方法:
( 1)用 getchar()清除
( 2)用函数 fflush(stdin)清除全部剩余内容
(3) 用格式串中空格或,%*c”来,吃掉,
例 int x;
char ch;
scanf(“%d”,&x);
scanf(,%c”,&ch);
或 scanf(“%*c%c”,&ch);
如 scanf(―%c%c%c‖,&c1,&c2,&c3);
若输入 a b c?
则 a?c1,?c2,b?c3
4.4 字符输入输出函数格式,putchar( c )
参数,c为字符常量、变量或表达式功能:把字符 c输出到显示器上返值:正常,为显示的代码值;出错,为 EOF(-1)
– 字符输出函数
#include <stdio.h>
main()
{ int c;
char a;
c=65; a='B';
putchar(c); putchar('\n'); putchar(a);
}
运行结果,A
B
4.4 字符输入输出函数字符输入函数格式,getchar( )
功能:从键盘读一字符返值:正常,返回读取的代码值;出错,返回 EOF(-1)
#include <stdio.h>
main()
{ int c;
printf("Enter a character:");
c=getchar();
printf("%c--->hex%x\n",c,c);
}
运行结果:
Enter a character:A?
A--->hex41
4.6 顺序结构程序设计举例
A
B
A
B
流程图 N-S图
所谓顺序结构,见下图,先执行 A操作,再执行 B操作,两者是顺序执行的关系。
例 从键盘输入圆的半径,求圆的面积。
#define PI 3.1415926
#include "stdio.h"
main()
{ float r,s;
printf(“please input radius:\n r=”);
scanf(“%f”,&r);
s=PI*r*r;
printf(“area=%f\n",s);
}
输入,r=10?
输出:
Area=314.159260
例 从键盘输入大写字母,用小写字母输出
#include "stdio.h"
main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
输入,A?
输出,A,65
a,97
#include <math.h>
#include <stdio.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,4,6?
输出,a= 3.00,b= 4.00,c= 6.00 s= 6.50
area= 5.33
流程结构和语句格式输入输入函数标准输出函数 printf
标准输入函数 scanf
字符输入输出函数字符输出函数 putchar
字符输入函数 getchar
顺序结构程序设计