版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲教师:刘丹C程序设计C语言程序设计第一章第二章第三章第四章第五章第六章第七章第一章C语言概述
C语言–––既可作为系统软件的程序设计语言,又可作为应用软件的程序设计语言。尤其是当今计算机应用极为广泛,软件的设计、编写质量要求高,经常与硬件部分打交道,如:界面设计等,所以用C语言编写是最理想的。因而C语言也是当前计算机语言中用得最广泛的语言之一。§1.1C语言出现的历史背景一、操作系统的设计语言O.S.–––操作系统,为用户使用计算机提供一个操作环境:系统命令、语言编程等。如:DOS.UNIX以前:O.S.软件用汇编指令编写。汇编语言:一种二进制指令代码的符号表示,既繁琐,又易出错,可读性差。改进:用C语言编写,既提高了程序的可读性,又可与硬件打交道。二、发展过程1960年出现了Algol60语言,但该语言主要面向问题,与硬件较远,故英国剑桥大学推出了CPL(CombinedProgrammingLanguage)
1967年,MatinRichards对CPL进行改进、简化、推出了BCPL(BasicCombinedProgrammingLanguage)
1970年,美国贝尔实验室KenThomson以BCPL为基础,再次简化推出了B语言,并写了第一个UNIX系统。美国贝尔实验室D.M.Ritchie在B语言基础上设计出了C语言,并用其将UNIX系统全部改写并实现。经进一步改进,至1977年出现了与具体机器无关的C编译文本,从而使C语言广泛应用,各种机器皆可使用。
1978年,美国BrainW.Kernighan与Dennis.M.Ritchie联合出版一书《TheCProgrammingLanguage》成为ANSIC之基础。
1983年,美国标准化协会(ANSI)制定了ANSIC。
ANSIC为基础:不同机器有不同版本,尤其是函数均应参考相应的机器。§1.2C语言的特点只有通过学习,方可理解C之特点,先简叙之:1.简洁、紧凑、方便、灵活
32个关键字,9种控制语句,主要用小写字母,压缩一切不必要成分2.运算符丰富除了最基本的+、-、×、÷、%等运算外,还将括号、赋值、类型强制转换等均作为运算符,共有34种运算符。3.数据结构丰富除基本类型外,有指针,结构体、共同体等类型。4.具有结构化的控制语句模块完整,控制中的语句可完整化。5.语法严格,但有灵活性如:数据类型可相互通用:整型、字符型通用。6.可与机器硬件打交道,直接访问内存地址,具有“高”、“低”级语言之功能。7.生成目标代码质量高,执行效率高。8.可移植性优于汇编语言。§1.3简单的C程序介绍
为了更好、更快地掌握C程序,我们先看几个C语言程序:例1.
main(){
printf("Thisisacprogram\n");
}例2.
main()/*求两个数之和*/{inta,b,sum;/*这是定义变量*/
a=123;b=456;sum=a+b;printf("sumis%d\n",sum);}例3.main()
/*主函数*/{inta,b,c;
/*定义变量*/
scanf("%d,%d",&a,&b);/*输入变量a和b的值*/c=max(a,b);/*调用max函数,将得到的值赋给c*/printf("max=%d",c;)/*输出c的值*/}
intmax(x,y)
intx,y;/*对形参x、y作类型定义*/{intz;/*max函用到的变量z,也要加以定义*/
z=y;if(x>y)z=x;return(z);/*将z的值返回,通过max带回调用处*/}通过分析,初步看到:1.
C程序全部由一个一个的函数构成。至少有一个主函数main(),其它函数可被主函数调用或相互调用。其它函数可为C函数库中函数,也可为自己编的函数。上述特点称为程序的模块化.2.
函数的构成:
函数说明+函数体
函数体:
变量定义与执行语句
可允许空函数:
dump(){}函数说明包括:函数名、类型、属性、参数等3.
函数的执行一定从main()开始。尽管main()函数位置可自由。4.
书写自由,一个语句可多行,一行可多个语句。5.
每一条语句必须有一个分号;6.
C语言的输入/出均以函数形式出现。scanf(),printf().7.
可用/
/对C语言加注释程序设计C主讲教师:刘丹第二章数据类型、运算符与表达式§2.1.数据类型著名计算机科学家沃思提出:
程序=数据结构+算法
所以,存放数据的方式直接反映了一种语言的数据表达能力。数据的存储方式又称之为:数据类型。举一个例子:以考生各科成绩及总分排队问题为列。
成绩的存放–––以数组形式
排队方法––––算法前面已述.C数据类型丰富,分为:基本类型构造类型指针类型空类型整型字符型实型单精度双精度数组结构体共用体数据有常量、变量之分,均为其中一种类型。本章先学习基本类型。枚举§2.2常量与变量2.2.1常量和符号常量常量程序运行过程中不能被改变的量。一般的数据显式写法均表示常量。如程序中:
20整型常量
15.8实型常量
'a'字符常量例:#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}还可用一个符号表示一个常量符号常量符号常量(一般用大写,以区分变量)再如:=3.1415629#definePAI3.1415629#definePRICE302.2.2变量程序执行中可以改变的量称为变量。变量包括变量名和变量值。变量名
用标识符命名,对应一定数量的内存存贮单元,其单元数视变量类型而定。标识符
由字母、数字、下划线组成且由字母或下划线开头的字符串。标识符可用来命名变量及作为常量名、函数名、类型名、文件名等,一个程序内不得有重复名。
如:_sum,sum,student_name,price等习惯上,变量名、函数名等用小写字母表示。常量名用大写字母表示(以增加可读性)。
另:需注意标识符长度,视不同系统而定。设允许8个字符。
则:student_namestudent_number为同一名字。C语言中,
变量须先定义,后使用如:intstudentstudent=30;
则若写成student=30,则未定义,编译时指出其错。
一旦变量被定义,即可在编译时为其分配相应数量的单元。
一旦变量被定义,其类型便确定。则可检查其运算的合法性。如:a%b表示a整除以b的余,则a,b必须为整型量。§2.3整型数据2.3.1整型常量整型常量
整型常数C语言提供了三种形式
十进制如:256,308,-120等八进制以数字0开头表示的整数例:0235,0146-012等.0235=2×82+3×8+5=15710
0146=1×82+4×8+6=10210-012=-(1×8+2)=-1010十六进制以"0x"开头的整型数
如:0x16,0x282.3.2整型变量一、分类:分为四种:基本型、短整型、长整型、无符号型
2.短整型:用"shortint"或"short"定义
3.长整型:用"long"或"longint"定义
1.基本型:用"int"定义
4.无符号型:
不存放符号,则不带符号数.
又分无符号整型,无符号短整型,无符号长整型。上述各种类型所占内存单元数及取值范围视不同机器而不同。详见P13。二、定义方法整型变量分别以下列方式定义2.
短整型
shortint或shorta,b,c;3.
长整型
longint或longa,b,c;1.
基本整型:
inta,b,c;4.
无符号型
unsigneda,b,c;unsignedshorta,b,c;unsignedlonga,b,c;例:
main(){inta,b,c,d;/*指定a,b,c,d为整型变量*/
unsigndu;/*指定u为无符号整型变量*/
a=12;b=–24;u=10;
c=a+u;d=b+u;printf("a+u=%d,b+u=%d\n",c,d);}由此看到:不同类型的整型数据可进行算术运算。但有一定规则,见§2.7.运行结果为
a+u=22,b+u=–14三、关于整型常量程序中出现的整型常数,系统按以下规则分配变量(内存单元)或赋值给相应变量
2.
若超越,而在–2147483648~2147483647之间,则可赋给longint变量。
1.
当常数(量)在–32768~32767之间,则可赋给int,longint变量。4.
一个非负整数<32768则可赋给unsignedint。5.
一个常数后加'l',或'L',表示长整数.如123l.主要用于函数调用时形、实参数传递。3.
若int,shortint长度相同,则二者皆可赋值。§2.4实型数据2.4.1实型常量有二种表示形式
1.十进制形式如:0.126,523.64等
2.
指数形式对于较大或较小的数,可用指数形式
0.00001261.26E–512600001.26E+6或1.26E6
'E','e'均可.分为单精度型与双精度型.
分别为
floatx,y,z;(单精度)
doublea,b,c;(双精度)
一般地:单精度占4字节内存单元;
双精度占8字节内存单元.
2.4.2实型变量注意:
不同机器对实型变量的有效数字长度的限制
如:
pc机,单精度一般为7位,双精度15位单精度数值:10–38~1038双精度数值:10–308~10308于是:floata;a=123456.789
则实际赋值a123456.7§2.5字符型数据用一对单引号括起来的单个字符。
如'a','A',二者不一样.此外,以"\"开头后接一个字符或n个字符代表了一种特殊字符常量。–––转义字符。
如\n––换行,\r––回车2.5.1字符常量其它如下表:字符形式\n\t\v\b\r\f\\\'\ddd\xxh功能换行横向跳格(即跳到下一个输出区)竖向跳格退格回车走纸换页反斜杠字符“\”单引号(撇号)字符1到3位8进制数所代表的字符1到2位16进制数所代表的字符注意:\表示ASCII码字符
三位八进制如
\101––表示字母A又:\x十六进制ASCII字符\x41––表示字母A其定义方式为:
charc1,c2;c1='A';c2='B';字符变量只占一个字节单元。
2.5.2字符变量用来存放一个字符的变量.一个字符存入一个字符变量。其对应单元存放的是其ASCII码,即ASCII码的二进制形式。
由此:字符变量中的数据是一整型数据。输出时既可输出字符,亦可输出整数,且字符变量可作整数运算。
2.5.3字符数据的实际存放形式例1:
main(){charc1,c2;
c1=97;
c2=98;
printf("%c%c",c1,c2)
}运行结果ab
看如下几个例子:例2:main(){charc1,c2;c1='a';c2='b';c1=c1–32;c2=c2–32;printf("%c%c",c1,c2)}运行结果AB例3:
main(){inti;charc;i='a';c=97;printf("%c,%d\n",c,c);printf("%c,%d\n",i,i);}运行结果:a,97
a,97有的系统将一个字节的整型变量的最高位,作为符号。这时对0~127之间的字符可输出正整数(ASCII)。但128~255字符最高位为1,则作为负数输出。由此最好用unsignedint存放字符整数(ASCII)。注:用双引号括起来的字符串。
例:
"GoodMorning!"
注意'A'与"A"是不同字符串存放时,在最后加上"/0"––空字符。
于是:GoodMorning!/02.5.4字符串常量"A"A/0但'A'
A注意:1.
字符串长度=实际字符个数+1,但最后\0不输出.
printf("GoodMorning!")此处不写/0。自动加上。2.
单个字符的字符串不能赋给字符变量。
例:
charc;c="a";是错误的。§2.6变量赋初值
C语言允许定义变量时赋予初值。
如:
inti=6;floatx=8.35;charc='6';*也可对某个变量赋初值:
inta,b,c=6;*不可能将同初值的变量赋初值时写成:
inta=b=c=6;
只能:
inta=6,b=6,c=6;
定义变量时赋初值实际上是在运行时执行一个赋初值语句:
inta=6;相当于:inta;a=6;§2.7类数值型数据间的混合运算
C语言允许双精度、单精度、整型及字符数据之间混合运算10+'a'+1.5–8765.1234'b'是允许的。
但有一个规则:先转换成同一类型,再计算。doublefloat高低图中“”
表示必定转换。如'a'+'b',先转换为int。结果为int。转换方法:longunsignedintchar,short即:既使是同一种类型也按"
"转换。图中“
”
:表示低,高型数据运算时,均先转换为高型。例:10+'a'+if–d/e其中:
i––intf––floatd––doublee––long
10+'a':转为int,结果为int
if:转为double,结果为double+:转为double
d/e:转为double-转为double则运算时:§2.8算术运算符与算术表达式运算符:运算的符号表示。
C语言有丰富的运算功能,先简述之
2.8.1.C运算符1.
算术运算符+,–,,/,%,等3.
逻辑运算符!,&&,¦¦2.
关系运算符>,<,==,>=,<=,!=4.
位运算符<<,>>,~,¦,^,&.5.
赋值运算符=等6.
条件运算符?等7.
逗号运算符,8.
指针运算符*,&11.
分量运算符•,,12.
下标运算符[]13.
其它运算符如函数的调用()9.
求字节数运算符sizeof10.
强制类型转换运算符(类型)
2.8.2算术运算符和算术表达式一、基本算术运算符+
加法正值3+6,+3–减法负值6–4,–5乘法38/除法8/5%求余7%4的值为3注:
两个整型数据相除(结果为整,一般向零靠拢)。–5/3–1“/”中,有一个float,则结果为double型,使用时千万注意int/int出现数据丢失。二、算术表达式及算术运算符的优先级与结合性运算对象:常量、变量、函数等优先级:
(),
,/,%,
+,–结合性:同一优先级,自左向右,为左结合性,反之为右结合性。例:
ab/c–1.5+'a'–de
当类型不同的数据进行运算时,按§2.7介绍的类型转换。
算术表达式:用算术运行运算符和括号将运算对象连接起来,且符合C语法规则的式子。三、可利用强制类型转换运算符将一个算术表达式转换为所需类型形式:(类型名)(表达式)例如:(double)a
将a转换为double(int)(x+y)将x+y转换为int(float)(5%3)将5%3转换为float注:1.
括号不能省略。
如:
intx会理解为变量intx.
2.
转换后的类型数据由系统分配一个中间变量存放,而原变量类型不变。floatx;又如:(int)(x+y)若省略:(int)x+y会变成将x转成整型.
(int)x;则x本身仍为实型,而(int)x由一个中间变量(整)存放x的整数部分。例:
main(){floatx;inti;x=3.6;i=(int)x;
printf("x=%d",x,i);}则:x=3.600000,i=3.总结以上类型转换,有二种:1.
强制另:
强制类型转换运算优先于算术运算符.2.系统自动如:
若x为float,则x%3不合法。但可用(int)x%3来解决。(附录III介绍了优先级)四、自增,自减运算符设有inti=3;++自增1––自减1则:++i,i++都会使i变为4,但有区别:++i:先使i值+1,再使用i值;i++:先使用i值,再使i值+1.j=++i;j=4,i=4.(i=i+1;j=i;)j=i++;j=3,i=4.(j=i;i=i+1)同理:––i,i––,均使i值–1,但:
又如:
printf("i=%d\n",i++);
结果:i=3若:
printf("i=%d\n",++i);
结果:i=4––i:先使i值–1,再使用i值;i––:先使用i值,再使i值–1i=3;几点注意:1.++和––运算法只能用于变量,不得用于常量和表达式.2.++,–
–,的结合性为从右至左,而一般算术运算符为从左至右。如:如5++,(a+b)++均为不合法.–i++"–"和"++"为同一优先级.–i++相当于–(i++)若i=3,则结果为–3,i为4.++,––主要用于循环变量自增或自减。1.
要慎用++、––运算符。五、有关表达式使用中的问题说明则:先对i进行3次自加,为6,然后三个i相加为18,而i为6。如:
表达式(i++)+(i++)+(i++)(i=3)
一般认为:从左至右:3+4+5=12,i6.但TurboC.MSC都是先取三个原值相加:i+i+i=9i6如果表达式数为:
k=(++i)+(++i)+(++i)2.
在表达式中,有的运算符为一个字符,有的为两个字符。3.
在函数调用时,如:一般地:自左至右尽可能多地将若干字符组成一个运算符。例:
i+++j,究竟理解为(i++)+j还是i+(++j)?printf("%d,%d",i,i++);若i=3,若参数计算从左至右,则输出3,3若从右至左,则输出4,3上述问题看似复杂,最好上机实践.§2.9赋值运算符和赋值表达式符号"="为赋值运算符。2.
整型数据赋给实型变量,数值不变,但按实数形式存放.1.
将实型数据(无论单,双精度)赋给整型变量时,舍弃小数.赋值时,两边类型若不一致,则按以下规则转换:4.
将intlongint,进行符号扩展。即:符号扩展,低16位long的低16位。5.
longint
int则高16位截断。3.
字符型数据赋给整型变量时:(2)字符带符号整型变量,则字符高位扩展。(1)字符无符号整型变量,则存入低8位,高8位补零。6.
将unsignedint型longint高位补0。原值传送,但数据大小不能超值。
如:unsignedinta=65535;intb;b=a;
则越界。而位数相同部分赋值
unsignedintintunsignedlonglongunsignedshortshort7.
非unsigned型长度相同的unsigned型数据,原样传送(包括符号位)一、复合赋值运算符:在"
="号之前加一个其它运算符。C语言规定:凡是二目运算符均可构成复合运算符。例:
a+=3;相当于a=a+3x=y+8;相当于x=x(y+8)x%=3;相当于x=x%一般形式:<变量><赋值运算符><表达式>二、赋值表达式例:
x=10为一赋值表达式其中<表达式>又可以是一个赋值表达式。例:
x=(y=10)相当于y=10;x=y
由于赋值号为右结合性,于是"
()"可省略,即为:x=y=10;例:
a+=a–=aa(设a12)又:a=5+(c=6)c=6,a=11a=(b=4)+(c=6)
b=4,c=6,a=10a=(b=10)/(c=2)b=10,c=2,a=5进一步,还可用复合赋值运算符作下列运算:步骤:
aa144.a–=aaa=a–aa=12–144=–132a+=–132a=a+(–132)=–264§2.10逗号运算符和逗号表达式一般形式:
表达式1,表达式2其计算规则:
先计算表达式1,再计算表达式2,最后值为表达式2的值。例:a=35,a4
则:先计算35,a15,a4=60,结果为60。又如:(a=35,a4),a+5扩展形式:表达式1,表达2,…,表达式n,结果为20(作为逗号表达式的值)
a+5a即20a.35=15a
a4=60(此时a值仍未变)结果为表达式n的值
注意:
x=(a=3,63)赋值表达式,x18;
x=a=3,6a逗号表达式,x3.逗号表达式主要用于某些语句中需一次计算多个表达式值的情况。如在循环语句中。函数调用中的实参之间虽然用的是逗号间隔,但不是逗号表达式。如:printf("%d,%d,%d",a,b,c);主讲教师:刘丹C程序设计第三章最简单的C程序设计§3.1C语句概述
C语句全部为可执行语句,对应若干机器操作指命令C程序由许多源文件组成。(分别编译,然后连接)每一个源文件由预编译命令和若干函数组成。每一个函数由说明部分和语句部分组成。其结构如图除说明部分外,重要部分为语句部分。C程序源程序文件1源程序文件i源程序文件n预编译命令函数1函数n说明部分执行部分(语句)……C语句分为五类1.控制语句––改变语句的执行顺序共有9种控制语句:
if()~else~(条件)
for()~(循环)
while()~(循环)
do~while(循环)
continue(结束本次循环)
switch(多分支选择)
break(中止整个循环)
goto(转移)
return(函数返回)()表示条件,~表示语句2.函数调用语句3.表达式语句printf("…");表达式加;如:i=i+1;i++;
x+y;
其函数调用也可理解为表达式语句.5.复合语句4.空语句
;
任何事情都不做.用{}括起来的一系列语句。如:{z=x+y;t=z/100;printf("%f",t);
}§3.2程序的三种基本结构从结构化程序设计角度出发,程序有三种结构:·顺序结构·选择结构·循环结构1.顺序结构表示ABAB先执行A,再执行B.2.选择结构表示为ABPTFBTPFA存在某条件P,若P为真,则执行A,否则执行B。3.循环结构表示为PFTAAP为T(1)当型结构当P条件成立时(T),反复执行A,直到P为“假”时才停止循环.有两种结构:当型和直到型(2)
直到型APFTA直到P为真先执行A,再判断P,若为F,再执行A,如此反复,直到P为T.
另外:由选择结构可以派生出另一种基本结构––多分支结构.KK=K1A1A2AiAn……K=K2K=Ki
已证明:上述三种结构组成的程序可以解决全部的问题,所以任何一种高级语言都具备上述三种结构。§3.3赋值语句
由赋值表达式加分号;构成,与其它高级语言相比有以下不同点:“=”为一运算符,由此,构成一赋值表达式,可出现于表达式能出现的任何地方:if((a=b)>0)t=a;§3.4数据输出
前面已论述:C语言本身无输入/出语句,由函数实现,如printf.等。
一般:C语言提供了一些标准的输入/出函数–––系统函数。形式:putchar(c);功能:向终端(一般为显示器)输出一个字符,其中c为字符型或整型变量注意:用该函数时,须用预编译命令:#include"stdio.h"3.4.1putchar
函数—字符输出函数举例:#include"stdio.h"main(){chara,b,c;a='B';b='O';c='Y';
putchar(a);putchar(b);putchar(C);}结果:BOY
putchar(a);putchar('\n');putchar(b);putchar('\n');
putchar(c);putchar('\n');*利用putchar还可输出其它转义字符结果:BOYputchar('\101');输出Aputchar('\’');输出’putchar('\015');输出↙*若将最后一行改为:3.4.2printf函数––格式输出函数一、printf的一般形式是C语言中使用得最多的一种输出函数,它可一次按格式输出多个不同类型的数据。printf(格式控制序列,输出表列);输出表列
–––用“,”号隔开的变量或表达式序列,其变量的值按对应的格式控制符所指定的格式输出。格式控制序列–––用双引号“...”括起来的格式符序列。格式控制序列由格式说明符和普通字符组成。2.普通字符原样输出1.格式说明符:
由%接–格式字符组成如:%f,%d等例:
a=3;b=4;printf("a=%d,b=%d",a,b);…结果:
a=3,b=4无论a,b中位数多少,均为上述形式:a=123b=45二、格式字符
如直接用%d,则将出错。不同类型的数据输出,用不同格式字符:1.
d格式符––十进制整数输出。(1)%d:按数据的实际长度输出。(2)%md:m表示输出字段宽度。若实际位数<m,左边补空格。(3)%ld:输出长整数如要指定宽度,则用%mld即可。例:
longa=1234567;printf("%ld",a);2.
o格式符–––按八进制形式输出.1111111111111111以1的补码形式inta=–1;printf("%d,%o",a,a);则输出结果:–1,177777注:连符号位一起组成八进制数输出特例:–1存于int单元如以长整型输出,在%加l,也可指定宽度m,%mo3.
x格式符–––以十六进制形式输出整数.例:
inta=–1;printf("%x,%o,%d”,a,a,a)输出结果:
ffff,177777,–1例:
main(){unsignedinta=65535;
intb=–2;
printf("a=%d,%o,%x,%u\n",a,a,a,a);
printf("b=%d,%o,%x,%u\n",b,b,b,b);}a=–1,177777,ffff,6553511111111111111111111111111111111a=65535b=–24.
u格式符–––无符号格式输出整数.b=–2,177776,fffe,65534运行结果为:5.
c格式符–––输出一个字符.注:
若有一整型变量,其值在0~255之间,则可以字符形式输出.一个字符型变量亦可以一个整型数据输出.charc='a';
printf("%c",c);例:
main(){charc='a';
inti=97;printf("%c,%d\n",c,c);printf("%c,%d\n",i,i);}运行结果为:
a,97a,97也可以指定输出字符宽度,如果有则输出:"a",即c变量输出占3列,前2列补空格.print("%3c",c)6.s格式符–––用来输出一个字符串.(1)%ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若串长小于m,则左补空格。允许一定的编辑即允许%ms,%–ms,%m.ns,%–m.ns四种形式,每一形式的意义如下:例:
printf("%s","CHINA");结果:
CHINA(3)%m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。(4)%–ms,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则m自动取n值,即保证n个字符正常输出。(2)%–ms,如果串长小于m,则在m列范围内,字符串向左靠,右补空格。7.
f格式符–––以小数形式输出单、双精度实数,有以下几种形式:
%m.nf,指定输出的数据共占m列,其中有n位小数。如果值长度小于m,则左端补空格。
%–mn.f,与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。
%f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。%f%m.nf%–m.nf8.e格式符–––以指数形式输出单,双精度实数基本形式:%e结果:1.23456共13列6例5例可有%m.ne和%–m.ne的形式9.g格式符––根据实数大小自动选择f格式,或e格式输出单双精度实数。e+002例:
printf("%e",123.456)表3.1printf格式字符总结格式字符d以带符号的十进制形式输出整数(正数不输出符号)oxucsfeg以8进制无符号形式输出整数(不输出前导符0)。以16进制无符号形式输出整数(不输出前导符0x)。以无符号10进制形式输出整数。以字符形式输出,只输出一个字符。说明输出字符串。以小数形式输出单、双精度数,隐含输出6位小数。以标准形式输出单、双精度数,数字部分小数位数为6位。选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。
许多情况与具体机器或系统有关,最好机器上一试。表3.2附加格式说明字符字符说明用于长整型整型,可加在格式符d、o、x、u前面。数据最小宽度对实数,表示输出n位小数;对字符串,表示截取的字符个数。输出的数字或字符在域内向左靠。m(代表一个正整数).n(代表一个正整数)–字母1§3.5数据输入
系统提供了若干函数,以提供从标准输入设备(键盘)上输入数据.3.5.1getchar
函数本节先介绍两个输入函数.形式:
getchar()功能:从标准输入装置(键盘)上输入一个字符要求:有#include"stdio.h"预编译命令例:#include"stdio.h"main(){charc;c=getchar();putchar(c);}3.5.2scanf函数功能:在标准输入装置(键盘)上按指定格式输入各种类型的数据地址表列–––变量的地址或字符串首地址。形式:scanf(格式控制序列,地址表列)格式控制序列–––同printf(…..)例:
main(){inta,b,c;scanf("%d%d%d",&a,&b,&c);prinft("%d,%d,%d\n,"a,b,c);}运行,机器等待你输入:345↙
结果3,4,5注意:1.scanf函数顺用地址量接受数据。2.输入数据的间隔为↙,Tab.空格,不能为“,”.3.允许在格式符中插入附加字符。格式字符及附加字符的定义如下表3.3和表3.4表3.3scanf格式字符格式字符d用来输入十进制整数。oxcsfe用来输入八进制整数。用来输入十六进制整数。用来输入单个字符。说明用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志‘\0’作为其最后一个字符。用来输入实数,可以用小数形式或指数形式输入。以f作用相同,e与f可以互相替换。表3.4scanf附加的格式说明字符字符说明用于输入长整型数据(可用%ld,%lo,%lx),以及double型数据(用%lf或%le)。用于输入短整型数据(可用%hd,%ho,%hx)。指定输入数据所占宽度(列数)。表示本输入项在读入后不赋给相应的变量。h域宽(为一正整数)*l4.对于输入unsigned型数据,不用%u,而用%d,%o,%x.5.指定数据长度时,系统自动截取。则当输入123456时,
scanf("%3d%3d",&a,&b);a12,b347.输入数据不能规定精度.6.在%后加“*”表示跳过相应的数据则当输入为1234567↙则a12b67scanf("%2d%*3d%2d",&a,&b);scanf("%7.2f",&a);是错误的8.在格式控制中除格式说明符外若还有其它字符,则应按顺序原样输入。例:
scanf("%d,%d",&a,&b);则必须输入21,28↙又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);则输入:a=34,b=58,c=100§3.6程序举例例1:
输入三角形三边,求三角形面积。例2:
输入一个大写字母,要求系统改为小写字母输出。例3.
当b2–4ac>0时,求ax2+bx+c=0的两个根。程序设计C主讲教师:刘丹在C程序的三种结构中,分支结构是一重要结构,其中的P为条件第四章逻辑运算和判断选取控制问题:条件如何表达?逻辑运算、关系运算§4.1关系运算符
关系运算比较运算,如:a>3为一比较运算,当a=5,a>3成立。结果称为“真”,否则,如:a=1,a>3不成立,为假。上述表达式a>3称为关系表达式。4.1.1
关系运算符及其优先次序1.<,<=,>,>=为同一优先级,==,!=等为同一优先级,但前者高于后者。2.关系运算符优先级低于算术运算符。C语言提供了六种关系运算符
<<=>>===!=优先级为:3.关系运算符优先级高于赋值运算符。如下图:算术运算符赋值运算符关系运算符高低举例:
c>a+bc>(a+b)a>b!=c(a>b)!=ca==b<ca==(b<c)a=b>ca=(b>c)4.1.2
关系表达式关系表达式的结果值规定为1或0.如:a>b,a+b>b+c,(a=3)>(b=5),'a'>'b',(a>b)>(b<c)完整的定义:用关系运算符将两个表达式(算术、关系、逻辑、赋值、字符等表达式)连接起来的式子。1––结果为真(成立)0––结果为假(不成立)如:当a=3,b=2,c=1时(a>b)==c成立1b+c<a不成立0d=a>b则a>b值为1,所以d=1.f=a>b>ca>b为1,a>b>c为0,所以f=0.§4.2逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式、逻辑表达式连接起来的式子–––逻辑表达式。4.2.1
逻辑运算符及优先级
a
b
!a
!b
a&&b
a¦¦b
真真假假真真
真假假真假真
假真真假假真
假假真真假假三种:&&(与),¦¦(或)!(非)其意义见真值表a&&b当a,b均为1时,才为1a¦¦b当a,b中有一个为1时,才为1!a当a为1,!a为0,反之为1.由此看到:¦¦和&&为双目运算符.!为单目运算符。优先级定义:2.&&和¦¦低于关系运算符。!高于算术运算符1.!(非)优先于&&(与).&&优先于¦¦即:!&&¦¦例:!a&&b¦¦x>y&&c
((!a)&&b)¦¦((x>y)&&c)4.2.2
逻辑表达式
1.逻辑表达式的值与关系表达式值一样,真为1,假为0。例:
a=4则!a值为0.此处只要a0,为真.则!a值为0.
a=4,b=5a&&b为1前面已定义了逻辑表达式,以下看一看逻辑表达式的值及具体的运算。
4&&0¦¦2为1.总之,在逻辑运算中,非0值参加逻辑运算时被看成1处理.
a=4,b=5a¦¦b为1
a=4,b=5!a¦¦b为12.一个逻辑表达式中的逻辑运算符并不是一定全部执行.一个实际的例子:判断年号是否为润年。如:a&&b&&c.则当a=0(假)时,b,c不需判断。当a=1,b=0,则不需判c.又如:a¦¦b¦¦c.当a=1时,b,c均不必判别。润年的定义:能被4整除且又能被400整除。
年号能被4整除但不能被100整除。当(year%4!=0)¦¦(year%100==0&&year%400!=0)为1时,year为非润年。设用变量year表示年号当((year%4==0&&year%100!=0)¦¦year%400==0)为1时,year为润年,否则为非润年。如果要判别非润年可在上述表达式前加非(!)运算符.当!((year%4==0&&year%100!=0)¦¦year%400==0)为1时,year为非润年。或者:即:则:§4.3if语句–––条件判断4.3.1if的三种形式功能:当表达式值非0时,执行语句A,否则不执行语句A.表达式语句A=00例如:
if(x>y)printf("%d",x)形式1
if(表达式)语句A其流程图:形式2
if(表达式)语句Aelse语句B功能:表达式为非0,执行语句A
表达式为0,执行语句B表达式语句A语句B0=0例:
if(x>y) printf("%d",x); elseprintf("%d",y);形式3
if(表达式1)语句1
elseif(表达式2)语句2elseif(表达式3)语句3……elseif(表达式n)语句nelse语句n流程:表达1表达2表达3表达n语句1语句2语句3语句n语句n语句1……0=0=0000如:
if(3)prinft("o.k");if('a')…
1.表达式可以是逻辑、关系,甚至是算术表达式。
2.上述形式中的语句必须以分号结束
3.上述形式中的语句可以是由{}括起来的复合语句。此时,在{}外可以不用分号.注意的问题:main(){floata,b,t;
scabf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}
printf("%5.2f,%5.2f",a,b);}例4.1输入两个实数,按代数值由小到大次序输出这两个数。
3.6,–3.2–3.20,3.60运行情况如下:例4.2输入三个数,按大小顺序输出。
main()
{floata,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}
if(b>c){t=b;b=c;c=t;}
printf("%5.2f,%5.2f,%5.2f",a,b,c);}运行情况如下:3,7,11.00,3.00,7.004.3.2.if语句的嵌套if(表达式1)内嵌ifelse内嵌注意:else与最近的if配对.一般形式在上述形式的if语句中,又可以是if语句–––称为嵌套。if(表达式2)语句1if(表达式3)语句3else语句2else语句4例:
if()if()语句2else语句3if(){if()语句1}
else…所以:必要时加{}.if()语句1else例4.3
有一函数y=–1(x<0)0(x=0)1(x>0)编一程序,输入一个x值,输出y值。有以下几种写法,请判断哪些是正确的?程序1:
main(){intx,y;scanf("%d",&x);
if(x<0)y=–1;elseif(x==0)y=0;elsey=1;
printf("x=%d,y=%d\n",x,y);}程序2:将上面程序的if语句改为:
if(x>=0)if(x>0)y=1;elsey=0;elsey=–1;程序3:将上述if语句改为:
y=–1;if(x!=0)if(x>0)y=1;elsey=0;程序4:
y=0;if(x>=0)if(x>0)y=1;elsey=–1;4.3.3条件运算符
C语言提供了一个简单的条件赋值语句或条件表达式。问题:当判断条件不论是“真”是“假”,均给同一变量赋值时,能否简化语句书写?条件运算符为?:三目运算符。功能:
先判表达式1,若非0,则值为表达式2的值,否则为表达式3的值。一般形式表达式1?表达式2:表达式3
max=a>b?a:b;当a>b.maxa.否则maxb注:1.
条件运算符优先于赋值运算符.
例:
max=(a>b?a:b)可去掉()
2.
条件运算符低于关系运算符和算术运算符。例:
max=a>b?a:b+1
max=a>b?a:(b+1)并不是
max=(a>b?a:b)+1
3.
条件运算符结合性为从右至左.
如:
a>b?a:c>d?c:d
相当于a>b?a:(c>d?c:d)4.
条件表达式不能取代一般的if语句,只有当if的两个分支为给同一变量赋值时才可替代if.if(a>b)printf("%d",a);elseprintf("%d",b)由于printf.不是表达式,故不可用条件表达式,但可为:
printf("%d",a>b?a:b);5.
表达式1、表达式2、表达式3可类型不同。
main(){charch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z'?(ch+32):ch;printf("%c",ch)}例4.4输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。运行结果如下:
Aa§4.4switch语句–––开关语句问题:当某一表达式有n个取值,每一取值执行一语句,则如果用内嵌if十分繁锁,而用switch简单.一般形式:switch(表达式){case常量表达式1:语句1
case常量表达式2:语句2
case常量表达式n:语句n
default:语句n+1}例:
根据成绩等级打印百分数段.switch(grade){case'A':printf("85~100\n");case'B':printf("70~84\n");case'C':printf("60~69\n");case'D':printf("<60\n");default:printf("error\n");}根据表达式的取值,判断其与哪一个常量表达式相等。如=表达式i,则自语句i开始执行,直到语句n+1止。若与所有常量表达式值不相等,则从default后的语句开始执行。功能:switch(表达式){case常表1:语句1;
break;一般形式改为:以上存在一个问题:没有完全起到分支作用。解决办法:增加break语句,使之跳出switch结构。
case常表2:语句2;
break;……case常表n:语句n;
break;default:语句n+1;}请大家修改以上例子,使之正确。注:
1.
常表值必须互不相等,否则二异性。2.
case顺序无关紧要。3.
不一定非用break不可,有时几种情况合并执行一组语句。switch(grade){case'A':case'B':case'C':printf(">60\n");break;case'D':printf("<60\n");break;}§4.5程序举例例1
写一程序,输入年号,判断是否为闰年。1.
算法:
根据闰年的判断条件当年号能被4整除但不能被100整除时,它为闰年。当年号能被100整除又能被400整除时,它为闰年。设用变量year表示年号,leap为待置值变量,当year为闰年:leap1,否则leap0.输入yearyear%4=0year%100=0leap0leap1yesANoNo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省新世纪学校2026年初三暑期阶段性考试英语试题含解析
- 四川省成都十八中学2025-2026学年初三第一次调查研究考试物理试题含解析
- 生态环保活动参与承诺书范文8篇
- 供应商管理标准化体系
- 企业营销活动策划模板及效果评估工具
- 技术支持响应与解决方案模板
- 2026年医疗过失道歉的沟通策略
- 2026年民用无人机安防应用市场洞察报告
- 2026年企业开放日接待与讲解方案
- 2026年学校食堂成本控制与膳食质量提升方案
- 中华诗词大赛1-3年级题库(含答案)
- CJ/T 358-2019非开挖工程用聚乙烯管
- 门窗质保合同协议书范本
- 血管活性药物静脉输注护理课件
- 2025年南京市联合体九年级中考语文一模试卷附答案解析
- 讲好法院故事:消息写作与新闻摄影实战指南
- 《宫颈癌预防与治疗》课件
- 2025年黑龙江商业职业学院高职单招语文2019-2024历年真题考点试卷含答案解析
- (省统测)贵州省2025年4月高三年级适应性考试(选择性考试科目)生物试卷(含答案)
- 人流术后避孕服务规范
- DB33T 1337-2023 河湖水库清淤技术规程
评论
0/150
提交评论