第3章C程序的基本结构精Word下载.docx
《第3章C程序的基本结构精Word下载.docx》由会员分享,可在线阅读,更多相关《第3章C程序的基本结构精Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
![第3章C程序的基本结构精Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/11/2fc44f1e-ed89-4193-8b11-4b763dd6fa35/2fc44f1e-ed89-4193-8b11-4b763dd6fa351.gif)
length=9.42,area=7.07
printf()函数的一般格式如下:
printf("
格式字符串"
[,输出项表]);
1.格式字符串。
“格式字符串”也称“转换控制字符串”,可以包含三种字符:
(1)格式指示符。
格式指示符的一般形式如下:
%[标志][输出最小宽度][.精度][长度]类型
详细内容见教材
(2)转义字符
例如,[案例3.1]中printf()函数中的'
\n'
就是转义字符,输出时产生一个“换行”操作。
(3)普通字符──除格式指示符和转义字符之外的其它字符。
格式字符串中的普通字符,原样输出。
2.输出项表
输出项表是可选的。
如果要输出的数据不止1个,相邻2个之间用逗号分开。
下面的printf()函数都是合法的:
(1)printf("
Iamastudent.\n"
);
(2)printf("
%d"
3+2);
(3)printf("
a=%fb=%5d\n"
a,a+3);
3.1.2格式指示符
输出不同类型的数据,要使用不同的类型转换字符。
1.类型转换字符d──以带符号的十进制整数形式输出。
[案例3.2]类型转换字符d的使用。
{intnum1=123;
longnum2=123456;
/*用3种不同格式,输出int型数据num1的值*/
num1=%d,num1=%5d,num1=%-5d,num1=%2d\n"
num1,num1,num1,num1);
/*用3种不同格式,输出long型数据num2的值*/
num2=%ld,num2=%8ld,num2=%5ld\n"
num2,num2,num2);
num1=%ld\n"
num1);
num1=123,num1=123,num1=123,num1=123
num2=123456,num2=123456,num2=123456
num1=16908411
对于整数,还可用八进制、无符号形式(%o(小写字母o))和十六进制、无符号形式(%x)输出。
对于unsigned型数据,也可用%u格式符,以十进制、无符号形式输出。
所谓无符号形式是指,不论正数还是负数,系统一律当作无符号整数来输出。
例如,printf("
%d,%o,%x\n"
-1,-1,-1);
2.类型转换字符f──以小数形式、按系统默认的宽度,输出单精度和双精度实数。
[案例3.3]类型转换字符f的使用。
main()
{floatf=123.456;
doubled1,d2;
d1=1111111111111.111111111;
d2=2222222222222.222222222;
%f,%12f,%12.2f,%-12.2f,%.2f\n"
f,f,f,f,f);
d1+d2=%f\n"
d1+d2);
123.456001,123.456001,123.46,123.46,123.46
d1+d2=3333333333333.333010
对于实数,也可使用格式符%e,以标准指数形式输出:
尾数中的整数部分大于等于1、小于10,小数点占一位,尾数中的小数部分占5位;
指数部分占4位(如e-03),其中e占一位,指数符号占一位,指数占2位,共计11位。
也可使用格式符%g,让系统根据数值的大小,自动选%f或%e格式、且不输出无意义的零。
3.类型转换字符c──输出一个字符(只占一列宽度)。
[案例3.4]类型转换字符c的使用。
{charc='
A'
;
inti=65;
c=%c,%5c,%d\n"
c,c,c);
i=%d,%c"
i,i);
c=A,A,65
i=65,A
需要强调的是:
在C语言中,整数可以用字符形式输出,字符数据也可以用整数形式输出。
将整数用字符形式输出时,系统首先求该数与256的余数,然后将余数作为ASCII码,转换成相应的字符输出。
4.类型转换字符s──输出一个字符串。
[案例3.5]类型转换字符s的使用。
{printf("
%s,%5s,%-10s"
"
Internet"
%10.5s,%-10.5s,%4.5s\n"
Internet,Internet,Internet,Inter,Inter,Inter
3.2格式化输入--scanf()函数
scanf()函数是用来从外部输入设备向计算机主机输入数据的。
3.2.1scanf()函数的一般格式
[案例3.6]已知圆柱体的底半径radius=1.5,高high=2.0,求其体积。
{floatradius=1.5,high=2.0,pi=3.14159,vol;
vol=pi*radius*radius*high;
/*求体积*/
printf(“vol=%7.2f\n”,vol);
/*输出求出的体积*/
[案例3.7]已知圆柱体的底半径为radius,高为high,求其体积。
/*功能:
说明函数scanf()的格式及作用。
*/
{floatradius,high,vol,pi=3.1415926;
Pleaseinputradius&
high:
"
scanf("
%f%f"
&
radius,&
high);
/*从键盘输入两个实数赋给变量r,h*/
radius=%7.2f,high=%7.2f,vol=%7.2f\n"
radius,high,vol);
1.52.0↙
radius=1.50,high=2.00,vol=14.14
在程序中给计算机提供数据,可以用赋值语句,也可以用输入函数。
在C语言中,可使用scanf()函数,通过键盘输入,给计算机同时提供多个、任意的数据。
1.scanf()函数的一般格式
格式字符串"
输入项首地址表);
(1)格式字符串。
格式字符串可以包含3种类型的字符:
格式指示符、空白字符(空格、Tab键和回车键)和非空白字符(又称普通字符)。
格式指示符与printf()函数的相似,空白字符作为相邻2个输入数据的缺省分隔符,非空白字符在输入有效数据时,必须原样一起输入。
(2)输入项首地址表──由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。
输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量。
变量首地址的表示方法:
&
变量名
其中“&
”是地址运算符。
例如[案例3.7]中的“&
radius”是指变量radius在内存中的首地址。
2.scanf()函数的功能:
从键盘上接收格式化输入。
运行[案例3.7]的程序时,从键盘上输入2个实数,分别存入&
radius、&
high起始的存储单元中,即输入两个实数分别赋给radius和high。
3.2.2格式指示符
格式指示符的一般形式为:
%[*][宽度][F|N][h|l]类型字符
1.类型字符
类型字符如表3-6所示。
例如,在[案例3.7]的scanf()函数语句中,格式字符串“%f%f”。
2.宽度n
指定该项输入数据所占列数为n。
换句话说,读取输入数据中相应的n位,但按需要的位数赋给相应的变量,多余部分被舍弃。
例如,scanf("
%3c%3c"
ch1,&
ch2);
ch1=%c,ch2=%c\n"
ch1,ch2);
假设输入“abcdefg”,则系统将读取的“abc”中的“a”赋给变量ch1;
将读取的“def”中的“d”赋给变量ch2,所以printf()函数的输出结果为:
ch1=a,ch2=d。
3.赋值抑制字符*
表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。
例如,scanf("
%2d%*2d%3d"
num1,&
num2);
num1=%d,num2=%d\n"
num1,num2);
假设输入“123456789”,则系统将读取“12”并赋值给num1;
读取“34”、但舍弃掉(“*”的作用);
读取“567”并赋值给num2。
所以,printf()函数的输出结果为:
num1=12,num2=567。
4.类型修饰符──F、N、h、l。
其含义与printf()中的一样,分别为远指针、近指针、短整型和长整型。
3.2.3数据输入操作
1.如果相邻2个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据。
2.“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。
%d,%d"
假设给num1输入12,给num2输入36,正确的输入操作为:
12,36↙
另外,scanf()函数中、格式字符串内的转义字符(如\n),系统并不把它当转义字符来解释,从而产生一个控制操作,而是将其视为普通字符,所以也要原样输入。
例如:
假设给num1输入2,给num2输入36,正确的输入操作为:
num1=12,num2=36\n↙
提高人机交互性建议:
为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。
例如,将scanf("
改为:
num1="
scanf("
num1);
num2="
3.输入数据时,遇到以下情况,系统认为该数据结束:
(1)遇到空格,或者回车键,或者Tab键。
(2)遇到输入域宽度结束。
例如“%3d”,只取3列。
(3)遇到非法输入。
例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。
4.使用格式说明符“%c”输入单个字符时,空格和转义字符均作为有效字符被输入。
3.3单个字符输入输出--getchar()和putchar()函数
3.3.1单个字符的输出──putchar()函数
[案例3.8]putchar()函数的格式和使用方法。
说明putchar()函数的格式和使用方法。
#include"
stdio.h"
/*编译预处理命令:
文件包含*/
{charch1='
N'
ch2='
E'
ch3='
W'
putchar(ch1);
putchar(ch2);
putchar(ch3);
/*输出*/
putchar('
putchar('
/*输出ch1的值,并换行*/
/*输出字符'
,并换行*/
putchar(ch3);
NEW
N
E
W
3.3.2单个字符的输入──getchar()函数
[案例3.9]说明getchar()函数的格式和作用。
说明getchar()函数的格式和作用。
/*文件包含*/
{charch;
Pleaseinputtwocharacter:
ch=getchar();
/*输入1个字符并赋给ch*/
putchar(ch);
putchar(getchar());
/*输入一个字符并输出*/
程序运行情况如下:
Pleaseinputtwocharacters:
ab↙
a
b
3.4顺序结构程序设计
在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。
[案例3.10]输入任意三个整数,求它们的和及平均值。
设计一个顺序结构程序,求三个整数的和及平均值。
{intnum1,num2,num3,sum;
floataver;
Pleaseinputthreenumbers:
"
%d,%d,%d"
num2,&
num3);
/*输入三个整数*/
sum=num1+num2+num3;
/*求累计和*/
aver=sum/3.0;
/*求平均值*/
num1=%d,num2=%d,num3=%d\n"
num1,num2,num3);
sum=%d,aver=%7.2f\n"
sum,aver);
}
在顺序结构程序中,一般包括以下几个部分:
1.程序开头的编译预处理命令。
在程序中要使用标准函数(又称库函数),除printf()和scanf()外,其它的都必须使用编译预处理命令,将相应的头文件包含进来。
2.顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括:
(1)变量类型的说明。
(2)提供数据语句。
(3)运算部分。
(4)输出部分。
3.5关系运算及其表达式
所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。
例如,“a>
b”中的“>
”表示一个大于关系运算。
如果a的值是5,b的值是3,则大于关系运算“>
”的结果为“真”,即条件成立;
如果a值是2,b的值是,则大于关系运算“>
”的结果为“假”,即条件不成立。
3.5.1关系运算符及其优先次序
1.关系运算符
C语言提供6关系运算符:
<
(小于),<
=(小于或等于),>
(大于),
>
=(大于或等于),==(等于),!
=(不等于)
2.优先级
(1)在关系运算符中,前4个优先级相同,后2个也相同,且前4个高于后2个。
(2)与其它种类运算符的优先级关系
关系运算符的优先级,低于算术运算符,但高于赋值运算符。
3.5.2关系表达式
1.系表达式的概念
所谓关系表达式是指,用关系运算符将两个表达式连接起来,进行关系运算的式子。
2.系表达式的值--逻辑值(非“真”即“假”)。
由于C语言没有逻辑型数据,所以用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。
例如,假设num1=3,num2=4,num3=5,则:
(1)num1>
num2的值=0。
(2)(num1>
num2)!
=num3的值=1。
(3)num1<
num2<
num3的值=1。
(4)(num1<
num2)+num3的值=6,因为num1<
num2的值=1,1+5=6。
再次强调:
C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。
所以,关系表达式的值,还可以参与其它种类的运算,例如算术运算、逻辑运算等。
3.6逻辑运算及其表达式
关系表达式只能描述单一条件,例如“x>
=0”。
如果需要描述“x>
=0”、同时“x<
10,就要借助于逻辑表达式了。
3.6.1逻辑运算及其优先次序
1.逻辑运算符及其运算规则
(1)C语言提供三种逻辑运算符:
逻辑与(相当于“同时”)
||逻辑或(相当于“或者”)
!
逻辑非(相当于“否定”)
例如,下面的表达式都是逻辑表达式:
(x>
=0)&
(x<
10),x<
1)||(x>
5),(x==0),
(year%4==0)&
(year%100!
=0)||(year%400==0)
(2)运算规则
1)&
:
当且仅当两个运算量的值都为“真”时,运算结果为“真”,否则为“假”。
2)||:
当且仅当两个运算量的值都为“假”时,运算结果为“假”,否则为“真”。
3)!
:
当运算量的值为“真”时,运算结果为“假;
当运算量的值为“假时,运算结果为“真”。
例如,假定x=5,则(x>
=0)&
(x<
10)的值为“真”,(x<
-1)||(x>
5)的值为“假”。
2.运算符的运算优先级
(1)逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:
(非)→&
(与)→||(或)
(2)与其它种类运算符的优先关系
→算术运算→关系运算→&
→||→赋值运算
3.6.2逻辑表达式
1.逻辑表达式的概念
所谓逻辑表达式是指,用逻辑运算符将1个或多个表达式连接起来,进行逻辑运算的式子。
在C语言中,用逻辑表达式表示多个条件的组合。
例如,(year%4==0)&
=0)||(year%400==0)就是一个判断一个年份是否是闰年的逻辑表达式。
2.逻辑量的真假判定──0和非0
C语言用整数“1”表示“逻辑真”、用“0”表示“逻辑假”。
但在判断一个数据的“真”或“假”时,却以0和非0为根据:
如果为0,则判定为“逻辑假”;
如果为非0,则判定为“逻辑真”。
例如,假设num=12,则:
!
num的值=0,num>
=1&&num<
=31的值=1,num||num>
31的值=1。
3.7if语句和条件运算符
3.7.1if语句
[案例3.11]输入任意三个整数num1、num2、num3,求三个数中的最大值。
说明if语句的格式。
{intnum1,num2,num3,max;
if(num1>
num2)
max=num1;
else
max=num2;
if(num3>
max)
max=num3;
Thethreenumbersare:
%d,%d,%d\n"
max=%d\n"
max);
11,22,18↙
11,22,18
max=22
本案例中的第1个if语句,可优化为如下不带else子句的形式:
if(num2>
max)max=num2;
这种优化形式的基本思想是:
首先取一个数预置为max(最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。
这种方法,对从3个或3个以上的数中找最大值的处理,非常有效。
1.if语句的一般格式
if(表达式)
{语句组1;
{语句组2;
}]
(1)if语句中的“表达式”必须用“(”和“)”括起来。
(2)else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。
(3)当if和else下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。
2.if语句的执行过程
(1)缺省else子句时
当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,否则直接转向执行下一条。
(2)指定else子句时
当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;
否则,执行语句组2。
3.if语句的嵌套与嵌套匹配原则
if语句允许嵌套。
所谓if语句的嵌套是指,在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。
if语句嵌套时,else子句与if的匹配原则:
与在它上面、距它最近、且尚未匹配的if配对。
为明确匹配关系,避免匹配错误,强烈建议:
将内嵌的i