C语言程序设计
2002 年第三章 简单程序设计
3.1 流程控制结构和语句
1,流程控制结构语句 1
语句 2
语句 n
① 顺序结构语句 2
条件语句 1
② 分支结构 ③ 循环结构语句 1
条件条件语句 1
当型循环直到型循环真真真假假假
2,C语句概述
C语句指可执行的语句,分六种:
① 表达式语句 ;
② 复合语句 ;
③ 选择语句 (if,switch);
④ 循环语句 (while,do-while,for);
⑤ 转移语句 (break,continue,goto,return);
⑥ 标号语句 ;
说明:
所有 C语句以分号结束;
说明语句也以分号,供编译程序使用,不属于上述划分。
3,表达式语句任何一个 C表达式加上一个分号后形成一个表达式语句。
例 1:赋值表达式
x=y+1? x=y+1; 赋值语句例 2:函数调用表达式
printf(“hellow”)?printf(“hellow”); 函数调用语句例 3:
x+=y? x+=y;
i=y=k=0? i=y=k=0;
例 4,空语句;
3.2 基本输入输出
C语言没有输入输出语句,通过调用库函数进行输入输出。
标准输入输出函数说明在系统头文件 <stdio.h>中。
3.2.1 基本输入输出函数
1。输入一个字符函数原型,int getchar(void)
功能,从标准输入文件(键盘)读取一个字符。
例,c=getchar()
getchar的执行流程:
首先检查输入流中是否有字符,
有则取第一个字符作为函数返回值,程序向后执行;
无则等待输入,getchar函数处于等待输入状态。
getchar函数处于等待输入状态时,可用键盘输入字符,
以回车作为输入的结束;
例 abc 将‘ a?、‘ b?、‘ c?、‘ \n?依次送入输入流。
当输入回车后,将若干个字符送入输入流,激活了处于等待输入状态的 getchar函数,取输入流中的第一个字符
(‘ a?)作为函数返回值,程序继续向后执行,同时,剩余兹符( ‘ b?、‘ c?、‘ \n? )仍然还在输入流中。
main()
{ char ch1,ch2,ch3;
ch1=getchar(); /*等待输入,例:‘ a? */
ch2=getchar(); /*不等待,取字符‘ \n?*/
ch3=getchar(); /*等待输入,例:‘ b? */
printf(“\n%c%c%c”,ch1,ch2,ch3);
printf(“\n%d %d %d”,ch1,ch2,ch3);
}
a
b
a
b
97 10 98
输入第一个输出第二个输出
2。输出一个字符函数原型,int putchar(int c)
c是一个 char,short,int类型的表达式。
功能,在标准输出文件(显示器)上输出一个字符。
例,char c=?a?; int i;
putchar(?a? ); putchar(c); 输出 a
putchar(i= ); putchar(i=32) ; 输出空格
putchar(?\ n?) ; 输出换行
putchar((c=getchar())>=?a? &&c<=?z?)? c-?a?+?A?:c) ;
显示输入的字符,当为小写时,转换成大写
3。输入有格式的数据函数原型,int scanf(char *format,…..);
功能,从标准输入文件(键盘)输入若干个数据,可以是各种基本类型和字符串。
格式,scanf(格式字符串,地址 1,地址 2,….,地址 n);
例,int x; float y;
char c,name[10];
scanf(“%d%f”,&x,&y);
scanf(“%c”,&c);
scanf(“%s”,name);
4。输出有格式的数据函数原型,int printf(char *format,…..);
功能,从标准输出文件(键盘)输出若干个数据,可以是各种基本类型和字符串。
格式,printf(格式字符串,数据 1,数据 2,….,数据 n);
例,int x=10; float y=15.2;
char c=?a?,name[10]=“123456789”;
printf(“%d%f”,x,y);
printf(“%c”,c);
printf(“%s”,name);
printf(“x=%d\n”,x);
3.2.2 printf的格式字符串组成:
( 1) 普通字符:直接原样输出显示,起提示作用。
( 2) 转换说明字符:说明此处需要输出某种格式的数据。
转换说明,%[域宽说明 ]转换字符域宽说明:可缺省,用以说明要输出的数据的输出宽度;
转换字符:用以说明要输出的数据的类型。
例,int i=100,float x=-1.25
printf(“i=%d,x=%8.3f\n”,i,x);
输出结果:
i=100,x= -1.250
_
转换字符 参数类型 输出格式
d,i int 十进制整数
o int 八进制整数
x,X int 十六进制整数
u int 无符号十进制整数
c int 单个字符
s char * 字符串(必须以‘ \0?结束或给定长度)
f double 小数形式的浮点数
e,E double 标准指数形式的浮点数
g,G double 不输出无效 0的前提下,自动选择 %e或 %f
p void * 指针值
n int * 到此已输出的字符数目写入对应参数
% 不转换参数 输入 %
printf的转换字符
( 1) %d和 %u的区别
%d表示将表达式的值以有符号整数形式输出,把最高位理解成符号位;
%u表示将表达式的值以无符号整数形式输出,不考虑符号位。
例,unsigned k=65535; 65535=11111111 11111111
printf(“%u,%d”,k,k); 输出结果为,65535,-1
printf(“%u,%d”,32765+3,32765+3);输出结果为,32768,-32768
32765=01111111 11111101
32768=10000000 00000000
( 2) %f%e%g的输出精度(缺省域宽)
%f 小数点部分 6位数字(用四舍五入或右补 0满足小数位)
%e 尾数部分 6位数字(包括整数部分的一位非 0数字)
%g 不输出无效 0的前提下,根据浮点数的值自动选择 e或 f中输出宽度较小的格式例,printf(“%f,%e,%g”,12.00004951,12.00004951,12.00004951)
输出结果,12.000050 1.20000e+1 1.2e+1
( 3)转换说明与输出参数应一致例,int i=-6,x=5;
double y=123.4567;
printf(“%f”,i); 输出 0.000000(转换字符使用不当)
printf(“%%d%f”,i,x); 输出 %d0.000000(转换字符使用不当)
printf(“%4d”,i,y,x); 输出 -6 ( x,y未输出)
printf(“x=%d”); 在输出 x=之后,输出一随机数
3,常用域宽说明字符功能,1) 输出数据的对齐方向;
2) 输出的数据域的宽度、精度。
例 1,- 和 m.n的用法
printf(“%-6d”,123); 输出 123 数据宽度为 6列,左对齐
printf(“%6d”,123); 输出 123 数据宽度为 6列,右对齐
printf(“%6.2f”,123.4); 输出 123.40数据宽度为 6列,小数 2位
printf(“%4.2f”,123.456); 输出 123.46数据宽度为 6列,小数 2位例 2,h,l,L的用法
short x; long y long double z;
printf(“x=%hd,y=%ld,z= %Lf,,x,y,z );
例 3,*的用法 (可变域宽)
int n=6; char str[10]=“123456789”;
printf(“%*c”,n,); 输出空格,占 6列
printf(“%*c”,n,); 输出?,(左边 5个空格)
printf(“%*s”,2*n,); 输出字符串 123456789占 12列
(左边 3个空格)
3.2.2 scanf的格式字符串
1,组成:
( 1) 转换说明字符:说明此处需要输入某种格式的数据。
scanf(“%d”,&x);
( 2) 普通字符:一般只使用空格和制表符(按 TAB键);
当使用其它字符时,必须在输入时用同样字符匹配。
int m,n;
scanf(“m=%d n=%d”&m,&n);
输入时必须,m=10 n=20
建议形式,printf(“m=“); scanf(“%d”,&m);
printf(“n=“); scanf(“%d”,&n);
2,常用的 scanf转换字符
scanf转换字符与 printf类似,%[选项 ]转换字符
( 1) %d 输入十进制整数
%o 输入八进制整数
% x 输入十六进制整数
%u 输入无符号十进制整数
( 2) %f 输入浮点数
( 3) %c 输入字符
( 4) %s 输入字符串
2,scanf转换说明的可选项
%[选项 ]转换字符
( 1) m的用法
int i,j; char name[10];
scanf(“%3d%d”,&i,&j); 输入 12345 则 i=123,j=45
scanf(“%6s”,name); 输入 1234567890则 name为:
name[0] name[1] name[2] name[3] name[4] name[5] name[6] name[7] name[8] name[9]
123456\0?
name的值为一地址
( 2) *的用法:跳过输入数据
double x1,x2;
scanf(“%lf%*f%lf”,&x1,&x2);
输入,1.5 2.5 3.5 后 x1=1.5 x2=3.5
( 3) h,l,L的用法例 1,short i; long j; double x; long double y;
scanf(“%hd %ld %lf %Lf”,&i,&j,&x,&y);
例 2,long x=65536; /* 00000000 00000001 00000000 00000000*/
scanf(“%d”,&x); 输入 12
/* 00000000 00000001 00000000 00001100*/
printf(“%d”,x); 输出 12
printf(“%ld”,x); 输出 65548 注,65548=65536+12
( 4)输入字符时的虚读现象例 1,int x; char ch;
scanf(“%d %c”,&x,&ch);
输入 10 a 后 x=10 ch=
解决方法:输入 10a
例 2,printf(“x=?”);
scanf(“%d”,&x); 输入
printf(“ch=?”);
scanf(“%c”,&ch); 此时输入流中非空,有回车字符,不等待。
最后 x=10 ch=?\n?
例 3:用 %1s形式输入字符可过滤掉前面的空格和回车等分隔符 。
int x; char ch;
scanf(“%d %1s”,&x,&ch);
输入 10 a 后 x=10 ch=?a?
例 4:用 %1s形式时注意可能对其它数据的影响。
int x; char ch1=?a?,ch2=?b?,ch3=?c?;
scanf(“%d %1s”,&x,&ch2); 输入 10 m
printf(“%c%c%c”,ch1,ch2,ch3); 显示 am
用 %1s输入时将‘ \0?写入到了 ch2的后继字节。
( 4)字符串的输入
当输入字符串时,若后面还有数据,必须用分隔符。
例,int day,year;
char month[10];
scanf(“%d%s%d”,&day,month,&year);
输入 25 Dec 1996 或 25 Dec 1996
当输入字符串时,遇分隔符即结束。
char name[20];
printf(“姓名:” );
scanf(“%s”,name); 输入 Li Ming
printf(“%s”,name); 显示 Li
3.3 编写简单的 C程序仅包含一个 main函数,且仅包含顺序执行的表达式语句。
程序设计的方法和步骤:
分析问题:弄清输入、输出和处理要求;
确定算法:拟定处理的方法和步骤;
编写程序:用 C语句表示算法的每一步;
调试运行。
例 1 从终端输入一个字符,如果是小写字母则转换成大写后输出,否则原样输出。
#include,stdio.h”
main()
{
int c;
printf(“input a character?;
c=getchar();
c>=?a? && c<=?z putchar(c-?a?+A),putchar(c);
putchar(?\n?);
}
例 2,输入一个字符,输出该字符的字符码、该字符的前导字符及字符码,后续字符及字符码。
#include,stdio.h”
main()
{
int c,c1,c2;
printf(“input a character:”);
c=getchar(); /*输入 s*/
c1=c-1; c2=c+1;
printf(“The value of?%c? id %4d\n”,c,c);
printf(“%c:%d--- %c:%d--- %c:%d”,c1,c1,c,c,c2,c2);
}
c c1 c2
01110011
c c1 c2
01110011 01110010 01110100
s:115
2002 年第三章 简单程序设计
3.1 流程控制结构和语句
1,流程控制结构语句 1
语句 2
语句 n
① 顺序结构语句 2
条件语句 1
② 分支结构 ③ 循环结构语句 1
条件条件语句 1
当型循环直到型循环真真真假假假
2,C语句概述
C语句指可执行的语句,分六种:
① 表达式语句 ;
② 复合语句 ;
③ 选择语句 (if,switch);
④ 循环语句 (while,do-while,for);
⑤ 转移语句 (break,continue,goto,return);
⑥ 标号语句 ;
说明:
所有 C语句以分号结束;
说明语句也以分号,供编译程序使用,不属于上述划分。
3,表达式语句任何一个 C表达式加上一个分号后形成一个表达式语句。
例 1:赋值表达式
x=y+1? x=y+1; 赋值语句例 2:函数调用表达式
printf(“hellow”)?printf(“hellow”); 函数调用语句例 3:
x+=y? x+=y;
i=y=k=0? i=y=k=0;
例 4,空语句;
3.2 基本输入输出
C语言没有输入输出语句,通过调用库函数进行输入输出。
标准输入输出函数说明在系统头文件 <stdio.h>中。
3.2.1 基本输入输出函数
1。输入一个字符函数原型,int getchar(void)
功能,从标准输入文件(键盘)读取一个字符。
例,c=getchar()
getchar的执行流程:
首先检查输入流中是否有字符,
有则取第一个字符作为函数返回值,程序向后执行;
无则等待输入,getchar函数处于等待输入状态。
getchar函数处于等待输入状态时,可用键盘输入字符,
以回车作为输入的结束;
例 abc 将‘ a?、‘ b?、‘ c?、‘ \n?依次送入输入流。
当输入回车后,将若干个字符送入输入流,激活了处于等待输入状态的 getchar函数,取输入流中的第一个字符
(‘ a?)作为函数返回值,程序继续向后执行,同时,剩余兹符( ‘ b?、‘ c?、‘ \n? )仍然还在输入流中。
main()
{ char ch1,ch2,ch3;
ch1=getchar(); /*等待输入,例:‘ a? */
ch2=getchar(); /*不等待,取字符‘ \n?*/
ch3=getchar(); /*等待输入,例:‘ b? */
printf(“\n%c%c%c”,ch1,ch2,ch3);
printf(“\n%d %d %d”,ch1,ch2,ch3);
}
a
b
a
b
97 10 98
输入第一个输出第二个输出
2。输出一个字符函数原型,int putchar(int c)
c是一个 char,short,int类型的表达式。
功能,在标准输出文件(显示器)上输出一个字符。
例,char c=?a?; int i;
putchar(?a? ); putchar(c); 输出 a
putchar(i= ); putchar(i=32) ; 输出空格
putchar(?\ n?) ; 输出换行
putchar((c=getchar())>=?a? &&c<=?z?)? c-?a?+?A?:c) ;
显示输入的字符,当为小写时,转换成大写
3。输入有格式的数据函数原型,int scanf(char *format,…..);
功能,从标准输入文件(键盘)输入若干个数据,可以是各种基本类型和字符串。
格式,scanf(格式字符串,地址 1,地址 2,….,地址 n);
例,int x; float y;
char c,name[10];
scanf(“%d%f”,&x,&y);
scanf(“%c”,&c);
scanf(“%s”,name);
4。输出有格式的数据函数原型,int printf(char *format,…..);
功能,从标准输出文件(键盘)输出若干个数据,可以是各种基本类型和字符串。
格式,printf(格式字符串,数据 1,数据 2,….,数据 n);
例,int x=10; float y=15.2;
char c=?a?,name[10]=“123456789”;
printf(“%d%f”,x,y);
printf(“%c”,c);
printf(“%s”,name);
printf(“x=%d\n”,x);
3.2.2 printf的格式字符串组成:
( 1) 普通字符:直接原样输出显示,起提示作用。
( 2) 转换说明字符:说明此处需要输出某种格式的数据。
转换说明,%[域宽说明 ]转换字符域宽说明:可缺省,用以说明要输出的数据的输出宽度;
转换字符:用以说明要输出的数据的类型。
例,int i=100,float x=-1.25
printf(“i=%d,x=%8.3f\n”,i,x);
输出结果:
i=100,x= -1.250
_
转换字符 参数类型 输出格式
d,i int 十进制整数
o int 八进制整数
x,X int 十六进制整数
u int 无符号十进制整数
c int 单个字符
s char * 字符串(必须以‘ \0?结束或给定长度)
f double 小数形式的浮点数
e,E double 标准指数形式的浮点数
g,G double 不输出无效 0的前提下,自动选择 %e或 %f
p void * 指针值
n int * 到此已输出的字符数目写入对应参数
% 不转换参数 输入 %
printf的转换字符
( 1) %d和 %u的区别
%d表示将表达式的值以有符号整数形式输出,把最高位理解成符号位;
%u表示将表达式的值以无符号整数形式输出,不考虑符号位。
例,unsigned k=65535; 65535=11111111 11111111
printf(“%u,%d”,k,k); 输出结果为,65535,-1
printf(“%u,%d”,32765+3,32765+3);输出结果为,32768,-32768
32765=01111111 11111101
32768=10000000 00000000
( 2) %f%e%g的输出精度(缺省域宽)
%f 小数点部分 6位数字(用四舍五入或右补 0满足小数位)
%e 尾数部分 6位数字(包括整数部分的一位非 0数字)
%g 不输出无效 0的前提下,根据浮点数的值自动选择 e或 f中输出宽度较小的格式例,printf(“%f,%e,%g”,12.00004951,12.00004951,12.00004951)
输出结果,12.000050 1.20000e+1 1.2e+1
( 3)转换说明与输出参数应一致例,int i=-6,x=5;
double y=123.4567;
printf(“%f”,i); 输出 0.000000(转换字符使用不当)
printf(“%%d%f”,i,x); 输出 %d0.000000(转换字符使用不当)
printf(“%4d”,i,y,x); 输出 -6 ( x,y未输出)
printf(“x=%d”); 在输出 x=之后,输出一随机数
3,常用域宽说明字符功能,1) 输出数据的对齐方向;
2) 输出的数据域的宽度、精度。
例 1,- 和 m.n的用法
printf(“%-6d”,123); 输出 123 数据宽度为 6列,左对齐
printf(“%6d”,123); 输出 123 数据宽度为 6列,右对齐
printf(“%6.2f”,123.4); 输出 123.40数据宽度为 6列,小数 2位
printf(“%4.2f”,123.456); 输出 123.46数据宽度为 6列,小数 2位例 2,h,l,L的用法
short x; long y long double z;
printf(“x=%hd,y=%ld,z= %Lf,,x,y,z );
例 3,*的用法 (可变域宽)
int n=6; char str[10]=“123456789”;
printf(“%*c”,n,); 输出空格,占 6列
printf(“%*c”,n,); 输出?,(左边 5个空格)
printf(“%*s”,2*n,); 输出字符串 123456789占 12列
(左边 3个空格)
3.2.2 scanf的格式字符串
1,组成:
( 1) 转换说明字符:说明此处需要输入某种格式的数据。
scanf(“%d”,&x);
( 2) 普通字符:一般只使用空格和制表符(按 TAB键);
当使用其它字符时,必须在输入时用同样字符匹配。
int m,n;
scanf(“m=%d n=%d”&m,&n);
输入时必须,m=10 n=20
建议形式,printf(“m=“); scanf(“%d”,&m);
printf(“n=“); scanf(“%d”,&n);
2,常用的 scanf转换字符
scanf转换字符与 printf类似,%[选项 ]转换字符
( 1) %d 输入十进制整数
%o 输入八进制整数
% x 输入十六进制整数
%u 输入无符号十进制整数
( 2) %f 输入浮点数
( 3) %c 输入字符
( 4) %s 输入字符串
2,scanf转换说明的可选项
%[选项 ]转换字符
( 1) m的用法
int i,j; char name[10];
scanf(“%3d%d”,&i,&j); 输入 12345 则 i=123,j=45
scanf(“%6s”,name); 输入 1234567890则 name为:
name[0] name[1] name[2] name[3] name[4] name[5] name[6] name[7] name[8] name[9]
123456\0?
name的值为一地址
( 2) *的用法:跳过输入数据
double x1,x2;
scanf(“%lf%*f%lf”,&x1,&x2);
输入,1.5 2.5 3.5 后 x1=1.5 x2=3.5
( 3) h,l,L的用法例 1,short i; long j; double x; long double y;
scanf(“%hd %ld %lf %Lf”,&i,&j,&x,&y);
例 2,long x=65536; /* 00000000 00000001 00000000 00000000*/
scanf(“%d”,&x); 输入 12
/* 00000000 00000001 00000000 00001100*/
printf(“%d”,x); 输出 12
printf(“%ld”,x); 输出 65548 注,65548=65536+12
( 4)输入字符时的虚读现象例 1,int x; char ch;
scanf(“%d %c”,&x,&ch);
输入 10 a 后 x=10 ch=
解决方法:输入 10a
例 2,printf(“x=?”);
scanf(“%d”,&x); 输入
printf(“ch=?”);
scanf(“%c”,&ch); 此时输入流中非空,有回车字符,不等待。
最后 x=10 ch=?\n?
例 3:用 %1s形式输入字符可过滤掉前面的空格和回车等分隔符 。
int x; char ch;
scanf(“%d %1s”,&x,&ch);
输入 10 a 后 x=10 ch=?a?
例 4:用 %1s形式时注意可能对其它数据的影响。
int x; char ch1=?a?,ch2=?b?,ch3=?c?;
scanf(“%d %1s”,&x,&ch2); 输入 10 m
printf(“%c%c%c”,ch1,ch2,ch3); 显示 am
用 %1s输入时将‘ \0?写入到了 ch2的后继字节。
( 4)字符串的输入
当输入字符串时,若后面还有数据,必须用分隔符。
例,int day,year;
char month[10];
scanf(“%d%s%d”,&day,month,&year);
输入 25 Dec 1996 或 25 Dec 1996
当输入字符串时,遇分隔符即结束。
char name[20];
printf(“姓名:” );
scanf(“%s”,name); 输入 Li Ming
printf(“%s”,name); 显示 Li
3.3 编写简单的 C程序仅包含一个 main函数,且仅包含顺序执行的表达式语句。
程序设计的方法和步骤:
分析问题:弄清输入、输出和处理要求;
确定算法:拟定处理的方法和步骤;
编写程序:用 C语句表示算法的每一步;
调试运行。
例 1 从终端输入一个字符,如果是小写字母则转换成大写后输出,否则原样输出。
#include,stdio.h”
main()
{
int c;
printf(“input a character?;
c=getchar();
c>=?a? && c<=?z putchar(c-?a?+A),putchar(c);
putchar(?\n?);
}
例 2,输入一个字符,输出该字符的字符码、该字符的前导字符及字符码,后续字符及字符码。
#include,stdio.h”
main()
{
int c,c1,c2;
printf(“input a character:”);
c=getchar(); /*输入 s*/
c1=c-1; c2=c+1;
printf(“The value of?%c? id %4d\n”,c,c);
printf(“%c:%d--- %c:%d--- %c:%d”,c1,c1,c,c,c2,c2);
}
c c1 c2
01110011
c c1 c2
01110011 01110010 01110100
s:115