第四章 顺序结构程序设计
4.1 C语言语句概述
C语言的语句可分为三类:
-
注释语句
-
定义语句
-
执行语句
-
简单语句
- 控制语句(9类)
- 函数调用语句
- 表达式语句
- 空语句
-
复杂语句
-
在函数或复合语句内的定义语句必须放在执行语句前,先定义后执行 |
4.1.1 简单语句
-
表达式语句:
-
一个表达式的尾部加一个分号";"
-
执行表达式语句就是计算表达式的值
-
最经典的表达式就是赋值表达式构成的赋值语句;例:i=i+1;
-
-
函数调用语句:
-
由函数调用加上分号";"组成
-
例如: printf("c program"); /*调用库函数,输出字符串*/
-
-
控制语句:
- **条件判断语句:**if语句、switch语句等
- **循环执行语句:**do···while语句、while语句、for语句
- **转向语句:**break语句、goto语句、continue语句、return语句
-
空语句:
-
只有分号";"组成的语句称为空语句,执行时不产生任何动作
-
while(i>=1) ; /*循环体为空语句*/
-
4.1.2 复合语句
把多个语句用花括号{}括起来的一个语句称为复合语句,在语法上视为一条语句,在花括号的的语句数量不限
4.2 格式化输入输出函数
4.2.1 格式输出函数printf
4.2.1.1 printf函数的一般调用形式
-
格式1:printf(“格式控制”);
-
**功能:**按格式控制指定的格式输出数据,将双引号内的内容原样输出,标志不会输出
-
#include <stdio.h> printf("a=3,b=5"); 输出:a=3,b=5
-
-
格式2:printf(“普通字符/占位符”,输出列表的值);
-
**功能:**按格式将值输出,先计算后输出
-
**普通字符:**不带%,需要原样输出的字符
-
**占位符:**带%,被后面输出列表中要输出的值替换
-
#include <stdio.h> main() { int a=3223; float b=3.1415; printf("a=%d,b=%f,b*10=%e\n",a,b,b*10); } 输出: a=3223,b=3.141500,b*10=3.141500e+001
-
4.2.1.2 printf函数中常用的格式说明
在C语言中,printf函数的格式说明的一般形式为:
%[标志][宽度指示符][精度指示符][长度修饰符]占位符
4.2.1.2.1 格式字符
格式字符 说明
%d或%i 以十进制形式输出带符号整数(正数不输出符号)
%o 以八进制形式输出无符号整数(前缀0不输出,只输出实际存储的补码)
%x或%X 以十六进制形式输出无符号整数(不输出前缀0x,x表示用于abcdef输出,X表示用于ABCDEF输出)
%u 以十进制形式输出无符号整数
%f 以小数形式输出单、双精度实数,不指定精度时默认输出6位小数
%c 输出单个字符,不输出单引号
%s 输出一个字符串,不输出双引号
%e或%E 以指数形式输出单、双精度实数,小数位隐含6位,指数部分占5位,用E时,指数以大写表示
%g或%G 根据数值大小,自动选用%f或%e中输出宽度较短的一种输出单、双精度实数,不输出0,用“G”表示指数以大写形式,如没有指出精度,精度默认为6
4.2.1.2.2 宽度指示符
- 用来指定输出数据项的最小字段宽度,用十进制整数表示
- 省略宽度指示符时,按系统规定位数输出
- 若实际位数大于指定的宽度,则按实际位数输出;若实际位数小于指定宽度,则右对齐,左边补空格
输出语句 | 输出结果 |
---|---|
printf("%3d",4321); | 4321(实际位数为4大于指定位数3) |
printf("%f\n",123.54); | 123.540000(没有宽度指示符,按系统规定位数输出) |
printf("%12f",123.54); | –123.540000(-代表空格) |
printf("%e\n",123.54); | 1.235400e+002(没有宽度指示符,按系统规定位数输出) |
printf("%14e\n",123.54); | -1.235400e+002(-代表空格) |
printf("%8g\n",123.5) | 小数形式为123.500000,指数形式为1.235000e+002;宽度较短为小数形式,且%g不输出0,则为—123.5 |
4.2.1.2.3 精度指示符
- 以“."开头,后跟十进制整数,通常与宽度指示符结合使用,格式为“m.n”,m是输出数据所占的总宽度,n是输出数据的精度
- ”n“对于f、e、E,”n“表示输出小数的位数,当输出数据的小数位数大于”n“时,,截去右边多余的小数,并对截去的第一位小数做四舍五入,当输出数据的小数位数小于“n”时,在小数最右侧补0
- "n"对于g或G,表示输出有效数字位数,并对截去的第一位小数做四舍五入,整数部分不丢失
- “n”对于s,表示要输出字符的个数,实际位数大于定义精度时,截去超过的部分
输出语句 | 输出结果 |
---|---|
printf("%8.3f",123.55) | -123.550 |
printf("%8.0f",123.55) | -----124 |
printf("%.3e",123.56789) | 1.236e+002 |
printf("%g",123.56789) | 123.567(没有指出精度,默认为6位,截去最后一位四舍五入) |
printf("%.7g\n",123.56789) | 123.5679 |
printf("%.5\n",“abcdefg”) | abcde |
输出数据的实际精度并非完全取决于格式控制串中的宽度和精度,而是取决于数据在计算机内的存储精度 |
4.2.1.2.4 长度修饰符
长度修饰符分为h、l两种
- h表示短整型输出:可加在格式符d、o、x、u前面;如%hd
- l表示长整型输出:如%ld;但在VC中,int和long占用的字节数相同,故输出长整型整数时也可不加l,加在f前无意义
#include <stdio.h>
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);
}
输出结果:
a=15,---15,17,f
b=123.123459,123.123459,123.1235,1.231235e+002
c=12345678.123457,12345678.123457,12345678.1235
d=p,-------p
4.2.1.2.5 标志
标志字符为:-、+、#、空格和0五种
标志 | 意义 |
---|---|
- | 输出结果左对齐,右边填空格;不加-号则输出结果右对齐,左边填空格 |
+ | 输出符号(正号或负号) |
# | 对c,s,d,u类无影响;对o类:在输出结果前加0;对x类:在输出结果前加0x |
空格 | 输出值为正时加空格,为负时加负号 |
0 | 对数值格式,在指定宽度时,输出数据左边空格处填数字0,且有负号时,0要补到-号和数值中间:-0012 |
输出语句 | 输出结果 |
---|---|
printf("%-6d\n",111); | 111—(-代表空格) |
printf("%+d\n",111); | +111 |
printf("% d\n",111); | -111(-代表空格) |
printf("% d\n",-111); | -111(-代表负号) |
printf("%#o\n",10); | 012 |
printf("%06.2f\n",1.6); | 001.60 |
4.2.1.3 使用printf函数注意事项
-
格式控制字符串中格式说明之间可根据需要插入逗号、空格、转义字符等
-
格式控制字符串中格式说明与输出项应当个数一致
-
在格式控制字符串中,除了合法的格式说明外,可包含任意的合法字符,这些合法字符原样输出
-
如需要输出一个%号,则应在格式控制字符串中用两个连续的%表示
printf("%d%%\n",23); 输出:23%
-
在VC中,printf函数返回值是本次调用输出的字符个数!
-
不要在输出函数中改变输出变量的值,VC中,输出顺序是从右向左
4.2.2 格式输入函数scanf
4.2.2.1 scanf函数的一般调用形式
scanf函数的一般调用形式为:scanf(“格式控制字符串”,地址表列);
例如:scanf("%d,%d",&a,&b);"%d,%d"是格式控制字符串;"&a,&b"组成地址表列,表示两个输入项
- 格式控制字符串是指定输入数据的格式,与printf函数一样,包含普通字符和格式说明
- 各输入项只能是合法的地址表达式,即某个存储单元的地址,可以是变量的地址,或字符串的首地址
4.2.2.2 scanf函数中常用的格式说明
与printf函数类似,每个格式说明都必须用%开头,以一个格式字符作为结束,其一般形式:
%【*】【输入数据宽度】【长度修饰符】格式字符
4.2.2.2.1 格式字符
格式字符 说明
d或i 输入有符号的十进制整数
o 输入无符号的八进制整数
x或X 输入无符号的十六进制整数
u 输入无符号的十进制整数
f或e 输入实型数(小数形式或指数形式)
c 输入单个字符
s 输入字符串,结果存入字符数组中。输入时,以第一个非空白字符开始,第一个空白字符(按下空格键、Tab键或 Enter键)结 束,系统自动加上’\0’作为字符串结束标志
4.2.2.2.2 “*”符
表示读入该输入项后不赋予相应的变量,即跳过该输入值
scanf("%d*d%d",&a,&b);
若输入:10 20 30
则把10赋予a,20被跳过,30赋予b
4.2.2.2.3 数据宽度
在格式字符前可加入一个十进制正整数来指定输入的宽度,表示最多读入的数据位数,即读取相应的位数给相应的变量,多余的部分进行截取
scanf("%3d%5f",&a,&b);
若输入:123456.789
则把123赋给a,456.78赋给b,剩下截去
4.2.2.2.4 长度修饰符
长度格式符为h和l;VC中,输入short型整数,格式控制要用%hd;输入double型数据,须用%lf或%le,否则数据不能输入;但%d与%ld一样
4.2.2.3 使用scanf函数注意事项
-
格式控制串是为了输入数据使用的,无论其中有什么普通字符都不会想printf函数一样输出在屏幕上,显示输入提示要用printf函数
-
格式控制串中的普通字符必须原样输入;且输入项要给出变量地址,给出变量名非法
-
scanf("%d,%d",&a,&b);
**输入时:**3,5 (输入的两个数中间逗号要原样输入)
-
scanf(“a=%d,c=%d”,&a,&b);
**输入时:**a=3,c=5 (5给了b,并不是给了c;&后跟的是哪个变量,最终输入的值就赋给了哪个变量)
-
-
在格式说明中只能指定输入数据的总宽度,不能对实型数指定小数位的宽度(不能指定精度);例如:scanf("%5.2f",&a);是非法的
-
针对整型数据有4中输入方式:%d可自动跳过空白字符(空格、Tab键、回车),找到第一个非空白字符
-
1’空格’'2:
scanf("%d%d",&a,&b); 输入时:1 2
-
1“空格”“回车”2:
scanf("%d%d",&a,&b); 输入时: 1 2
-
1“Tab键”2:
scanf("%d%d",&a,&b); 输入时: 1 2
-
1“空格”“Tab键”“回车”2:
scanf("%d%d",&a,&b); 输入时: 1 2
-
-
针对字符型数据仅有一种输入方式:%c认为输入的所有字符均为有效字符;得到一个字符时,光标自动下移
scanf("%c%c%c",&ch1,&ch2,&ch3); 若输入:a b c 则ch1得到a,ch2得到空格,ch3得到b 若输入:abc 则ch1得到a,ch2得到b,ch3得到c
若在格式控制字符串中加入空格作为间隔,则输入时各数据间可加空格! -
调用scanf函数时,注意变量类型与格式字符保持一致
-
scanf函数也有一个返回值,返回值就是成功输入的项数
-
当输入数据的个数小于输入项的个数时,程序等待输入,直到满足要求为止。当输入数据的个数大于输入项的个数时,多余的数据不消失,作为下一个输入操作的输入数据!
#include <stdio.h> main() { int a,b,c,d; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b); scanf("%d%d",&c,&d); printf("c=%d,d=%d\n",c,d); } 输入:30 35 40 45 输出:a=30,b=35 c=40,d=45 程序运行到第一个scanf函数时,要求输入两个整数,但输入了4个,第一个scanf只把30给a,35给b;允许到第二个scanf函数时,40,45作为该操作的输入数据
4.3 字符数据的输入/输出
C语言没有提供输入输出语句,数据输入输出由标准函数来实现,VC中调用标准输入输出函数前,要求使用与编译命令对头文件”stdio.h“进行说明!
4.3.1 字符输出函数
putchar函数事标准字符输出函数,功能是再默认输出终端上输出单个字符
putchar(ch); ch可以是一个字符变量或常量,也可以是一个转义字符
例:输出单个字符‘B’
#include <stdio.h>
main()
{
char ch='B';
putchar(ch); /*输出字符变量ch的值*/
putchar('\n'); /*输出一个转义字符换行符*/
putchar('B'); /*输出一个字符常量B*/
putchar('\n'); /*输出一个转义字符换行符*/
putchar(0x42); /*输出十六进制数42对应十进制66ASCII值对应的B*/
putchar('\n'); /*输出一个转义字符换行符*/
}
4.3.2 字符输入函数
getchar函数是标准输入函数,功能是从系统默认的输入终端输入一个字符
getchar(); 输入时可以是字母字符、数字字符和其他字符等
getchar函数等待输入直到按下回车键才结束,回车键前所输入的所有字符都会显示在屏幕上,但只有第一个字符作为函数的返回值
getchar函数得到的字符可以赋给字符变量或整型常量,也可以不赋给任何变量,可直接作为表达式的一部分
例:输入单个字符
#include <stdio.h>
main()
{
char c;
c=getchar();
putchar(c);
}
输入:abc
输出:a
上述程序可写为:
#include <stdio.h>
main()
{
putchar(getchar());
}
4.4 顺序结构程序设计举例
4.4.1 鸡兔同笼
鸡和兔总数a头,鸡和兔共有b只脚,问鸡和兔各有多少只?
**分析:**设有x只鸡,y只兔;x、y、a、b四个数均为整型变量;a与b由用户输入,x、y根据a和b的实际数量改变;a=x+y;b=2x+4y;则x=a-(b-2a)/2;y=(b-2a)/2;
#include <stdio.h>
main()
{
int a,b,x,y;
printf("Input the head:");
scanf("%d",&a);
printf("Input the feet:");
scanf("%d",&b);
x=(4*a-b)/2;
y=(b-2*a)/2;
printf("The number of chick is %d\n",x);
printf("The number of rabbit is %d\n",y);
}
4.4.2 求圆的周长和面积
**分析:**圆周长:L=2πr;圆面积:S=πr²
#include <stdio.h>
#define PI 3.14159
main()
{
float r,l,s;
scanf("%f",&r);
l=2*PI*r;
s=PI*r*r;
printf("\nl=%8.4f",l);
printf("\ns=%8.4f",s);
}
4.4.3 输入两个整数,求出它们的商和余数并输出
#include <stdio.h>
main()
{
int a,b; /*定义两个整型变量*/
scanf("%d%d",&a,&b);
printf("商=%d,余数=%d\n",a/b,a%b);
}
4.4.4 读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位进行四舍五入,最后求输出结果
#include <stdio.h>
main()
{
double a,b,c,ave;
scanf("%f%f%f",&a,&b,&c);
ave=(a+b+c)/3;
printf("%.1f\n",ave);
}