C语言程序设计_第1页
C语言程序设计_第2页
C语言程序设计_第3页
C语言程序设计_第4页
C语言程序设计_第5页
已阅读5页,还剩437页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章C语言概述本章主要内容:

程序设计语言的分类

C语言的特点

C语言源程序的执行过程1.1程序设计语言简述程序(program)是指一组指示计算机或其他具有信息处理能力装置去执行动作或做出判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。程序设计(programdesign)是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。早上起来做上课准备?计算机每执行一个操作都是按照事先指定的内容和步骤进行,每个步骤的具体内容由计算机能够理解的指令或语句来描述,指令或语句告诉计算机“做什么”和“怎么做”。(1)分析问题:对于要处理问题的条件和目标进行认真分析,选择解决问题的方法。(2)设计算法:在分析问题的基础上,设计出解决问题的方法和具体步骤。(3)编写程序:选择程序设计语言对所设计的算法进行实现,并对源程序进行编译、链接,生成可执行程序。(4)运行测试:运行生成的可执行程序,并对结果进行测试分析,排查纠正程序中的错误。(5)编写文档:提供给用户使用的程序,需要向用户提供程序说明书,指出程序功能,运行环境,安装启动以及注意事项等。程序设计语言第一代语言——机器语言(MachineLanguage)机器语言是用二进制代码表示,计算机能直接识别和执行的一种机器指令的集合。第二代语言——汇编语言(AssemblyLanguage)汇编语言是面向机器的程序设计语言,在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。机器语言和汇编语言属于低级语言。第三代语言——高级语言(High-levelLanguage)采用接近于人类自然语言的单词和符号来表示程序,使编程变得更加简单,且写出的程序可读性强。高级语言与计算机的硬件结构及指令系统无关,它提供了丰富的数据类型和运算符,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且容易学习掌握。流行的高级语言有c,c++,java,C#,pascal,python,lisp,prolog,FoxPro等,程序设计方法面向过程的方法:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向过程最重要的是模块化的思想方法。C语言是面向过程的方法。面向对象的方法:1.2C语言简介1967年,剑桥大学的MartinRichards对CPL语言进行了简化,于是产生了BCPL(BasicCombinedProgrammingLanguage)语言。1970年,美国贝尔实验室的KenThompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。1.2C语言简介1973年,C语言的主体完成。Thompson和Ritchie用它完全重写了UNIX。随着UNIX的发展,C语言自身也在不断地完善。直到今天,各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言。1989年,ANSI发布了第一个完整的C语言标准——ANSIX3.159—1989,简称“C89”。1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC9899:1999,简称“C99”。2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899:2011,简称为“C11”。1.3C语言程序的基本结构以“#”开头的是预处理命令,#include为包含命令(行尾没有分号),表示把标准输入输出头文件(standardinput&outputheaderfile,stdio.h)包含到本程序中。程序中的main函数称为主函数。一个C程序必须包含一个main函数,也只能有一个main函数,程序从main开始执行,在main函数结束。main前的int代表需要返回一个整数值(C99标准要求),C语言程序的基本结构具有以下特点一个C语言源程序可以由一个或多个源文件(扩展名为.c)组成。每个源文件可由一个或多个函数组成。一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。源程序中可以有预处理命令(include命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。每个函数的定义包含两部分,函数头和函数体。函数的头部包括函数名,返回类型和用圆括号“()”括起来的形参说明。函数体用花括号“{}”括起来的函数执行部分。函数体中包含各种语句,语句是程序的基本执行单位,每一条语句都以分号“;”结束。1.4C语言程序的运行本章小结(1)计算机是由程序控制的,要使计算机按照特定步骤去工作,必须用计算机语言编写程序。(2)计算机语言分为低级语言和高级语言。机器语言和汇编语言属于低级语言。低级语言依赖于硬件,通用性差。高级语言接近人类自然语言,通用性强。(3)C语言程序的基本组成单位是函数,一个C语言程序中必须有一个main函数。main函数位置任意。程序从main函数开始执行。在函数中包含若干语句,语句以分号结束。(4)运行C程序的四个步骤:(编写源程序)->(对源程序进行编译,得到目标程序)->(将目标程序与库函数链接,得到可执行的目标程序)->(运行可执行的目标程序)。第二章

数据类型本章主要内容:C语言基本数据类型常量的概念各种类型常量的特点及表示形式变量的概念不同类型变量的定义、赋值和使用方法2.1标识符在C语言中,各种名称都用标识符来表示,如变量名、符号常量名、函数名、数组名、文件名、指针名等。C语言的标识符有三类:关键字、预定义标识符和用户标识符。其中前两种由系统命名,已预先定义好,只有用户标识符需要用户来命名2.1标识符标识符的使用有如下规定:C语言标识符由字母、数字和下划线组成,只能以字母、下划线开头。在C语言中大写字母与小写字母表示不同的符号。一般约定,变量名用小写字母,符号常量名用大写字母。用户定义的标识符不可与系统的关键字、预定义标识符同名。为了提高程序的可读性,标识符在命名时尽量“见名知义”。例如,year,month,day,age,sex等。2.1标识符下面是一些正确和错误标识符命名的实例。正确形式:count、test23

错误形式:2count、hi!there、high..balance

2.2关键字关键字(keywords)是一种具有特定含意的标识符。关键字又称保留字,在系统中已定义过,需加以保留。不能用关键字作为用户标识符。C语言中关键字分为三类:类型说明符:用于定义、说明变量、函数或其它数据结构的类型。如int、double等。语句定义符:用于表示一个语句的功能。如if、else就是条件语句的语句定义符。预处理命令字:用于表示一个预处理命令。如程序开头用到的include。2.2关键字注意:在C程序中,关键字不能用于其它目的,即不允许将关键字作为变量名或函数名使用。2.3数据类型数据类型(Datatype)是按被定义数据的性质、表示形式、占据存储空间的多少、构造特点来划分的。在C语言中,数据类型可分为基本数据类型、构造数据类型、指针类型等。2.3数据类型void类型(空类型)基本数据类型最主要的特点是,其值不可以再分解为其他类型。2.4常量在程序执行过程中,其值不发生改变的量称为常量(constant)。C语言中常用的常量有整型常量、浮点型常量、字符型常量和字符串常量。2.4.1整型常量整型常量就是整常数。在C语言中,使用的整型常量有八进制、十进制和十六进制3种。在程序中是根据前缀来区分各种进制数的。十进制整型常量

十进制整型常量没有前缀,其数码为0~9。

合法的十进制整常数:

56、-100、2018

不合法的十进制整常数:

023,23D2.4.1整型常量

八进制整型常量八进制整型常量必须以0开头,即以0作为八进制数的前缀,数码取值为0~7。八进制数通常是无符号数。

合法的八进制数:

017、0101、0177777

不合法的八进制数:

17、082、-01362.4.1整型常量

十六进制整型常量

十六进制整型常量的前缀为0X或0x,其数码取值为

0~9,A~F或a~f。

合法的十六进制整常数:

0X2A、0XA0、0XFFFF

不合法的十六进制整常数:

5A、0X3H2.4.1整型常量整型常量的后缀

如使用的数超过了整型数的范围,就必须用长整型数来表示。 长整型数是用后缀“L”或“l”来表示的。 无符号整型常量,则在整数值后面加上“U”或“u”。 无符号的长整型常量的表示方法是在整数后面加上“UL”,“LU”,“ul”或“lu”。2.4.2浮点型常量浮点型也称为实型(real),浮点型常量也称为浮点数或者实数。在C语言中,浮点型常量有两种形式:十进制小数形式指数形式。2.4.2浮点型常量

十进制小数形式

由数字0~9和小数点组成。 合法的浮点数:

0.0、5.0、3.14、300.、-267.8230

不合法的浮点数:

345、-E7、100.-E3、-5、2.7E

注意:必须有小数点。2.4.2浮点型常量

指数形式

由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。

其一般形式为:

aEn(a为十进制小数,n为十进制整数)

其值为a×10n。如: 2.1E5

(2.1*105) 3.7E-2(3.7*10-2) 0.5E7

(0.5*107) -2.8E-2(-2.8*10-2)2.4.2浮点型常量

不合法的浮点数:

345

-E7

100.-E3

-5

2.7E

无阶码标志也无小数点无阶码无小数点

阶码标志E之前既无整数部分也无小数部分

负号位置不对2.4.3字符常量字符常量是用单引号括起来的单个字符。一个字符常量在计算机的内存中占据一个字节的容量。字符常量的值就是该字符的ASCII码值。一个字节常量实际上也是一个字节的整型常量,可以参与各种运算。例如:'a'、'C'、'='、'+'、'?'都是合法字符常量。2.4.3字符常量单引号中的内容不能是单引号、双引号和反斜线。

例如:''','"','\'都是不合法的。单引号,双引号和反斜线具有其他的特殊用途。如果需要表示它们,正确的写法是'\'','\"','\\'。如何输出一个百分号(%)?2.4.3字符常量

转义字符是一种特殊的字符常量。转义字符主要用来表示那些用一般字符不便于表示的控制代码。转义字符以反斜线\开头,后跟一个或几个字符。

例如,'\n'就是一个转义字符,其意义是“回车换行”。2.4.3字符常量

表2.2

常用的转义字符及其含义转义字符转义字符的意义ASCII代码\n回车换行10\t横向跳到下一制表位置9\b退格8\r回车13\f走纸换页12\\反斜线符"\"92\'单引号符39\"双引号符34\a鸣铃7\ddd1~3位八进制数所代表的字符

\xhh1~2位十六进制数所代表的字符表中的\ddd和\xhh,ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字母A,\102表示字母B,\134表示反斜线,\X0A表示换行等。将ASCII码为'\106'即70的字符赋给ch2.4.4字符串常量字符串常量是由一对双引号括起的字符序列。在C语言中没有相应的字符串变量,用一个字符数组来存放一个字符串。

合法的字符串常量:

"CHINA","program","$12.5"2.4.4字符串常量

字符串常量和字符常量主要有以下区别:(1)字符常量由单引号括起来,字符串常量由双引号括起来。(2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。(3)可把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。

字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中存放字符'\0'(ASCII码为0)。这是字符串结束的标志。2.4.4字符串常量

例如:字符串"program"在内存中所占的字节为每个格子表示一个字节,存放一个字符,最后一个字节存放字符'\0',表示该字符串结束。2.4.4字符串常量字符常量'a'和字符串常量"a"虽然都只有一个字符,但在内存中的情况是不同的。字符常量'a'在内存中占1个字节,可表示为字符串常量"a"在内存中占2个字节,可表示为2.4.5符号常量常量除了可以用上述方法直接表示外,还可以采用符号表示,称为符号常量。符号常量在使用之前必须先定义,其一般形式为:

#define标识符常量#define是一条预处理命令(预处理命令都以#开头),称为宏定义命令。其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。使用符号常量的好处是:含义清楚,能做到“一改全改”。定义符号常量PI,值为3.14159请注意,把常量定义为大写字母形式,是一个很好的编程实践。2.5

变量程序执行过程中,值可以改变的量称为变量(variable)。一个变量应该有一个名字,在内存中占据着一定的存储单元。变量值的改变实际上就是对应存储单元中内容的改变。2.5

变量变量:在程序运行期间,变量的值是可以改变的。变量必须先定义,后使用定义变量时指定该变量的名字和类型变量名和变量值是两个不同的概念变量名实际上是以一个名字代表的一个存储地址从变量中取值,就是通过变量名找到相应的内存地址,从该存储单元中读取数据2.5变量变量的命名必须遵循以下几条规则:(1)必须是以英文字母或下划线开头的,由字母、数字和下划线组成的字符序列。(2)不能与C语言的关键字(保留字)重名。(3)C语言对变量名的大小写敏感。(4)习惯上符号常量的标识符用大写字母,变量标识符可大小写结合。

(5)在程序中出现的变量都必须“先定义后使用”;凡未被定义的,不作变量名使用;指定变量类型后,系统编译时可分配相应的存储单元。2.5.1整型变量在C语言中,整型用int表示。根据整型数在存储器中占用的字节数,可以用long和short来修饰int,表示长整型数和短整型数;根据其是否带有符号,可用signed和unsigned来修饰int,表示带符号整型数和无符号整型数。当整型数带有修饰语时,可将int省略。

shortint→short

unsignedlongint→unsignedlong2.5.1整型变量在C语言标准中,各个整型数据所占的存储空间没有具体规定,各个编译系统在处理时也有所不同,longint型数据的存储空间不少于int型数据,shortint型数据的存储空间不大于int型数据。表2.3

整型数据类型变量定义的一般形式为:类型说明符

变量名标识符,变量名标识符,...;例:inta,b,c;(a,b,c为整型变量)longx,y;(x,y为长整型变量)unsignedintp,q;(p,q为无符号整型变量)2.5.1整型变量

注意:允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用1个空格间隔。最后一个变量名之后必须以“;”分号结尾。变量定义必须放在变量使用之前。一般放在函数体的开头部分。在程序中,经常会出现整型数据的溢出问题。变量a的最高位为0,后15位全为1。加1后变成第1位为1,后面15位全为0。而它是-32768的补码形式,输出变量b的值为-32768请注意:一个短整型变量只能容纳-32768~32767范围内的数,无法表示大于32767或小于-32768的数。遇到此情况就发生“溢出”不同类型的量可以参与运算并相互赋值,其中的类型转换是由编译系统自动完成的。2.5.2实型变量实型变量分为:单精度(float型)、双精度(double型)和长双精度(longdouble型)三类。在VC++6.0中,float型数据占4个字节,double型数据占8个字节。它们表示的数据范围和精度也不同。与整型数不同,浮点数均为有符号浮点数,不能用signed和unsigned修饰。符号long可以用来修饰double形成longdoble类型长双精度型)。例如:

floatx,y;(x,y为单精度实型量)doublea,b,c;(a,b,c为双精度实型量)2.5.2实型变量

实型数据的舍入误差由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。在有效位以外的数字将被舍去。由此可能会产生误差。a是单精度浮点型,有效位数只有七位。而整数已占五位,故小数点二位后均为无效数字。b是双精度型,有效位为十六位。2.5.3字符型变量C语言提供的字符型数据占8位,它一般表示字符数据或很小的整数。字符型数据可分为一般字符型(char)数据和无符号字符型(unsignedchar)数据两类。其中char的取值范围为-128~127的整数,unsignedchar的取值范围为0~255的整数。字符变量的类型说明符是char。字符变量类型定义的格式

chara,b;2.5.3字符型变量

个字符变量被分配一个字节的内存空间,只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。

如x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a,b赋予'x'和'y'值: a='x';

b='y';2.5.3字符型变量

实际上是在a,b两个单元内存放120和121的二进制代码:

a:

b:C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。整型量为两字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。本章小结(1)标识符的命名必须是由字母或下划线开头,随后跟字母、数字或下划线任意组合而成的字符序列。(2)标识符命名要做到见名知意(3)数据类型可分为基本类型、构造类型、指针类型、空类型四类。数据类型同时给出了数据所能进行操作。(4)常量是一种在程序中其值保持不变的量。C语言中常量分为数字常量和字符常量两类。数字常量又分为整型常量和浮点型常量。字符常量和字符串常量是两种不同的常量。C语言中,常量通常用符号常量来表示,符号常量也是一种标识符。(5)在程序执行过程中,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型变量、浮点变量、字符变量。在程序中,变量必须先定义后使用。第三章运算符与表达式本章主要内容:各种运算符的运算规则运算符的优先级和结合性表达式的书写各种表达式的计算3.1表达式与运算符运算符(Operator):

C语言的运算符可按操作数的个数分为单目运算符、双目运算符、三目运算符。按运算符的功能分为算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、强制类型转换运算符、下标运算符、扩展赋值运算符等。表达式(Expression):使用运算符将常量、变量、函数连接起来,构成表达式。表达式的值与运算符的种类和数据类型有关。area=3.14*r*r;C语言运算符类型运算符算术运算符+、-、*、/、%、++、--关系运算符>、<、==、>=、<=、!=逻辑运算符&&、||、!位运算符<<、>>、&、!、^、~赋值运算符=条件运算符?:逗号运算符,指针运算符*求字节数运算符sizeof强制类型转换运算符(类型)下标运算符[]扩展赋值运算符+=、-=、*=、/=、%=其他函数调用运算符()3.2算术运算符与算术表达式

运算符作用举例说明+加法运算符2+3、a+b、’a’+3+、-、*、/四个运算符是双目运算符。操作数可以是任何类型。运算的结果由操作数的类型决定。-减法运算符3-1、c-2、d-3.5*乘法运算符5*6、c*c、3.14*r/除法运算符5/2、5.0/2、3/d%求余运算符5%2%运算符是双目运算符,操作数必须是整型。++自增运算符a++、++a++运算符是单目运算符,作用是使变量的值增加1,操作数可以是任何数据类型。--自减运算符a--、--a--运算符是单目运算符,作用是使变量的值减少1,操作数可以是任何数据类型。在算术表达式中,+、-、*、/的计算和数学表达式相同,按照先乘除后加减的原则进行计算。当参加运算的操作数中有一个为float或double类型,系统会将其他操作数先转换成float或double类型后再计算。在C语言的除法运算中,如果两个操作数都是整型,结果为整数,其值是截取商的整数部分,不是四舍五入。在求余(求模)运算中,要求两个操作数必须是整型。求余运算a%b的结果等于两个操作数相除后的余数。求余结果的正负号和第一个操作数的正负号相同.++,--作用:使操作数的值加1或减1。种类:前自增、前自减:自增运算符(++)和自减运算符(--)可以出现在操作数之前,如++x称为前自增;后自增、后自减:自增运算符(++)和自减运算符(--)可以出现在操作数之后,如x++称为后自增。注意:当表达式中有多个运算符时,要注意运算符的优先级和结合性。++、--的优先级最高,其次是*、/、%,优先级最低的是+、-。变量a的初值表达式运算后a的值运算后表达式的值1++a222a++323--a224a--34++的优先级高于+,而且++是自右向左运算符,表达式e=a+++b相当于e=(a++)+b;3.3赋值运算符与赋值表达式符号:=格式:左值=右值作用:是把右值赋给左值。左值是变量,必须有一块可以保存信息的存储空间。右值可以是变量、常量、表达式或函数调用。举例:a=3;//把常量3赋给变量ab=a+3;//先计算表达式a+3的值,再赋值给变量bc=pow(2,4);//把函数调用的返回值赋值给变量cd=a>b;//先计算关系表达式a>b的值再赋值给变量d赋值运算的类型转换(1)实型数据(float、double)赋给整型变量(int)时,舍去实型数据的小数部分,保留整数部分后赋给整型变量。如:inta;a=12.56;//转换后a的值为12(2)整型数据(int)赋给实型数据(float、double)变量时,数值不变,增加小数部分。如:doubleb;b=3;//转换后b的值为3.00000(3)字符型数据(char)赋给整型(int)变量时,将字符的ASCII码赋给整型变量。如:intc;c=’A’; //转换后c的值为65 赋值运算的类型转换(4)将整型数据(int、short、long)赋给一个char型变量时,只将数据的低八位赋给char型数据。如:chard;d=97;//转换后d的值为97d=1000;//转换后d的值为-24(5)将float型数据赋给一个double型变量时,数值不变,有效位数扩展到16位,在内容中以8个字节存储。(6)将占字节数多的数据赋给占字节数少的变量时,要注意溢出问题。C语言在发生溢出时,编译不会报错。inte;e=12.456789e10;//转换后e的值为-2147483548,发生溢出,结果错误复合赋值运算符号举例说明+=加法赋值a+=3等价于a=a+3-=减法赋值b-=a+2等价于b=b-(a+2)*=乘法赋值c*=10等价于c=c*10/=除法赋值d/=4等价于d=d/4%=模运算赋值e%=3等价于e=e%3左移赋值a<<=n等价于a=a<<n,a乘以2的n次方右移赋值a>>=n等价于a=a>>n,a除以2的n次方&=位逻辑与赋值a&=b等价于a=a&b|=位逻辑或赋值a|=b等价于a=a|b^=位逻辑异或赋值a^=b等价于a=a^b3.4关系运算符与关系表达式符号举例>大于<小于==等于>=大于等于<=小于等于!=不等于3.4关系运算符与关系表达式关系表达式:用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式)连接起来的式子。如:a>ba/b==0a!=b+2(a=4)>(b<5)3.4关系运算符与关系表达式关系表达式的计算:在计算关系表达式时一定要注意表达式的值。关系运算的结果为逻辑值,即“真”和“假”。C语言规定:关系表达式的值用1表示“真”,用0表示“假”。如:4==5a+1>b/3当表达式中有算术运算符和关系运算符时,算术运算符的优先级高于关系运算符,先计算算术运算符。当表达式中有多种关系运算符时,<、<=、>、>=的优先级相同,==和!=的优先级相同,前者的优先级高于后者。当表达式中有赋值运算符(=)和关系运算符时,关系运算符的优先级高于赋值运算符,先计算关系运算符。运算符名称举例说明&&逻辑与3&&2、a>=3&&a<=5双目运算符,当操作数同时为真时,结果才为真,否则结果为假。||逻辑或a>3||a<5a%3==0||a%7==0双目运算符,当操作数同时为假时,结果才为假,否则结果为真。!逻辑非!(a>2)单目运算符,当操作数为真时,结果为假;当操作数为假时,结果为真。3.5逻辑运算符与逻辑表达式3.5逻辑运算符与逻辑表达式逻辑表达式:用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑表达式的值:关系表达式的值一样为逻辑值,即“真”和“假”。同样用数值1表示“真”,用数值0表示“假”。思考:如何表示偶数?&&(逻辑与)、||(逻辑或)、!(逻辑非)的优先级不同。!的优先级高于&&、||;!的优先级高于算术运算符;关系运算符的优先级高于&&、||。&&和||运算符具有“短路”功能。“短路”功能是可以减少计算量,当运算符左边的值能判断整个逻辑表达式的结果时,则不再计算右边的表达式。3.6逗号运算符与逗号表达式逗号表达式:用逗号运算符可以将两个或多个表达式连接起来,形成逗号表达式。格式:表达式1,表达式2,表达式3,......,表达式n逗号表达式的计算:从左往右逐个计算表达式,逗号表达式作为一个整体,它的值为最后一个表达式(即表达式n)的值;逗号运算符的优先级别在所有运算符中最低。注意:从左往右逐个计算表达式;逗号表达式作为一个整体,它的值为最后一个表达式(即表达式n)的值;逗号运算符的优先级别在所有运算符中最低。3.7运算符的优先级和结合性运算符的优先级:决定了表达式中不同运算执行的先后顺序。一般来说,从高到低是单目运算符、算术运算符、关系运算符和逻辑运算符、赋值运算符。运算符的结合性:决定了并列的多个同级运算符执行的先后顺序。大部分运算符的结合性都是从左到右,只有单目运算符、条件运算符、赋值运算符的结合性是从右到左。本章小结(1)运算符描述的是对数据进行的操作,表达式是由数据项和运算符组成的式子。(2)C语言的运算符可按操作数的个数分为单目运算符、双目运算符、三目运算符。(3)按运算符的功能分为算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、强制类型转换运算符、下标运算符、扩展赋值运算符等。(4)运算符的优先级一般来说,从高到低是单目运算符、算术运算符、关系运算符和逻辑运算符、赋值运算符。(5)大部分运算符的结合性都是从左到右,只有单目运算符、条件运算符、赋值运算符的结合性是从右到左。第四章常用的数据

输入输出函数本章主要内容:掌握各种语句的含义和分类熟练使用字符数据输入/输出函数熟练使用格式输入/输出函数4.1语句C语言中语句(Sentence)是指示计算机完成某种特定运算及其操作的命令。(1)说明语句:用来定义变量和进行函数原型声明。如:inta=2,b=4;

//定义变量intmax(int,int);

//函数的原型声明说明语句一般放在数据说明部分,编译时处理,在程序运行时不会执行。4.1语句(2)表达式语句:表达式语句由表达式加上分号“;”组成。可以分为:算术表达式、赋值表达式、逗号表达式、关系表达式、逻辑表达式等。a+3;

//算术表达式,无实际意义,计算结果不能保存c=a/3;

//赋值表达式,表达式的值是a/3a=1,b=2,c=a+b;//逗号表达式从左往右逐个计算表达式

4.1语句(3)函数调用语句:在程序中通过对函数的调用来执行函数体,函数调用的一般形式为:函数名(实参列表);常用库函数的调用:printf(“%d”,a);//调用格式输出函数,实现输出变量a的值pow(x,n);//调用pow函数求x的n次方,计算结果不能保存在进行函数调用时,如果函数有返回值需要定义变量接收返回值,或者函数调用可以作为函数的实参使用。printf(“%d”,pow(x,3));//输出pow函数求x的3次方4.1语句(4)控制语句:用来规定程序的执行顺序和控制程序的流程。C语言中有9种控制语句,可以分为选择语句、循环语句、转向语句、返回语句四类。选择语句:if语句、switch语句循环语句:for语句、while语句、do-while语句转向语句:break语句、continue语句、goto语句返回语句:return语句4.1语句(5)复合语句:把多个语句用“{}”括起来组成的一个语句。if(a>b) { temp=a; a=b; b=temp; }4.1语句(6)空语句:是什么也不执行的语句,只由分号“;”组成。空语句可用于循环语句,表示循环体为空。如:while((ch=getchar())!='#');//从键盘输入字符,直到输入#结束4.2数据的输入输出C语言中没有提供专门的输入输出语句。输入输出是通过C语言提供的标准输入输出库函数来实现。在使用输入输出库函数时,要在程序开头使用文件包含命令:#include<stdio.h>#include"stdio.h"作用是将标准输入输出函数的头文件(stdio.h)包含到用户源文件中。stdio表示standardinput&output,.h是C语言头文件(Head)。常用的输入输出函数有:putchar、getchar、printf、scanf、puts、gets4.3字符数据输入输出1、putchar函数功能:输出一个字符函数原型为:intputchar(charch);注意:使用函数时参数(实参)可以是整型变量、字符型变量、整型常量、字符型常量或者转义字符等。使用函数若输出成功,返回该字符,否则返回EOF。举例:inta=49;putchar(a);//输出整型变量a所对应的字符1charch='a';putchar(ch);//输出字符变量chputchar('A');//输出大写字符

Aputchar('\101');//输出字符Aputchar('\n');//换行putchar(97);//输出ASCII码为97的字符a注意:当实参是整型变量或整型常量时,其值应在0~127范围内,才是可以显示的字符。4.3字符数据输入输出2、getchar函数功能:输入一个字符函数原型为:intgetchar();注意:使用时通常定义一个字符变量或整型变量来接收getchar()函数的返回值。如:charch=getchar();getchar()函数不仅能从输入设备获得一个可显示的字符数据,而且可以获得屏幕上无法显示的控制字符的信息。?如何把大写字母转换为小写字母4.4格式输入输出函数3、printf函数功能:向终端输出若干个任意类型的数据。格式:printf(“格式控制字符串”,输出表列)格式控制字符串用于指定输出格式。格式控制串由格式字符串和非格式字符串两部分组成。格式字符串是以“%”开头的字符串,在“%”后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。输出表列是需要输出的一些数据,可以是常量、变量、表达式或函数调用等。1、整型数据的输出2、浮点型数据的输出当输出浮点型数据(单精度、双精度)时,常用的格式说明符为f。用%f输出时,单精度浮点数的有效位数是6~7位,双精度浮点数的有效位数是15~16位。当超出有效位数时,系统会自动四舍五入。3、字符数据的输出4、字符串的输出5、其他格式控制4.4.2格式输入函数4、scanf函数功能:从标准输入设备(键盘)读取数据,并把数据送入到指定的变量中。格式:scanf(“格式控制字符串”,地址表列)格式控制字符串用于指定输入格式。格式控制字符串由格式字符串和非格式字符串两部分组成。在输入时,非格式字符部分要原样输入。地址列表是要输入数据的各变量的地址。inta;scanf(“%d”,&a);使用scanf语句可以一次输入多个不同类型的数据。当连续输入多个数值时,在输入的数据之间要用一个或多个空格、或Enter键或Tab键分隔。【例4.4】从键盘输入三个字符,并输出。#include<stdio.h>//预处理intmain(){ charch1,ch2,ch3; printf("输入三个字符\n"); scanf("%c%c%c",&ch1,&ch2,&ch3);

//输入三个字符 printf("ch1=%c,ch2=%c,ch2=%c\n",ch1,ch2,ch3); return0;}语句连续输入多个字符时,在字符中不要插入空格或其他分隔符。【例4.5】scanf的特殊格式。#include<stdio.h>intmain(){ intc,d; scanf("%3d%*2d%2d",&c,&d); printf("%d%d",c,d); return0;}在格式字符前的数字表示输入数据所占的宽度。在%后加“*”表示跳过它指定的宽度。4.5顺序结构程序应用顺序结构是最简单的程序结构,也是最常用的程序结构。按照解决问题的顺序写出相应的语句,它的执行顺序是自上而下依次执行。【例4.6】输入圆柱体的高和半径,计算圆柱体的底面积和体积并输出结果(结果保留两位小数)。#include<stdio.h>intmain(){ doubler,h,area,volume;

printf("输入圆柱体的半径和高\n"); scanf("%lf%lf",&r,&h);//输入半径、高 area=3.14*r*r;//计算底面积 volume=area*h;//计算体积 printf("圆柱体的底面积为%.2f\n",area); printf("圆柱体的体积为%.2f\n",volume); return0;}本章小结(1)C语言中的语句的作用是使计算机执行特定的操作。C语言的语句主要有六大类,说明语句、表达式语句、函数调用语句、控制语句、复合语句、空语句。需要通过实际编程加强对各种语句的理解和掌握。(2)输入/输出语句实现程序与用户的交互,输入函数实现从键盘获得用户的输入,输出函数实现函数运算结果的显示。第五章选择结构程序设计本章主要内容:掌握关系表达式和逻辑表达式熟练使用各种选择结构语句5.1选择结构早餐吃馒头还是面包?选择结构,是在程序执行中判断给定条件是否满足,确定某些操作是做还是不做,或者确定若干个操作中选择哪个操作来执行。如:“计算圆的面积,必须满足输入的半径大于0,才能得到正确的结果”“输出成绩,必须满足成绩是一个大于0并且小于100的数”。选择结构有三种形式:单分支结构、双分支结构、多分支结构。5.2if语句格式:if(表达式)语句;执行过程:先计算表达式的值,如果为真(非0),则执行“语句”,否则退出if语句,执行下一条语句。说明:表达式可以是任何类型,常用的是关系或逻辑表达式。语句可以是任何可执行语句,可以是单一语句或复合语句。当满足条件(表达式为“真”)要执行多个操作时,就需要使用复合语句。【例5.1】计算一个整数的绝对值。#include<stdio.h>//预处理intmain(){ inta; printf("输入一个整数:\n"); scanf("%d",&a); if(a<0) a=-a;

//若这个数小于0,那它的绝对值为它的相反数 printf("a的绝对值为%d\n",a); return0;}if(a<0);a=-a;if(a<0){a=-a;printf(“%d”,a);}×5.2.2双分支结构在程序中,有时对一个条件进行判断后,根据判断的不同结果,会有两个不同的操作,这种情况需要使用双分支结构if-else。格式:if(表达式)

语句1;else

语句2;执行过程:先计算表达式的值,如果为真(非0),则执行“语句1”,否则执行“语句2”。说明:if-else属于一个语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。if和else后面的“语句1”和“语句2”可以是复合语句。【例5.2】计算两个数的最大值。#include<stdio.h>intmain(){ inta,b,max; printf("输入两个整数:\n"); scanf("a=%d,b=%d",&a,&b); if(a>b) max=a; else max=b; printf("最大值为%d\n",max); return0;}if(a<0)a=-a;printf(“%d”,a);else

a=a;×5.2.3多分支结构格式:if(表达式1)

语句1;elseif(表达式2)

语句2;elseif(表达式3)

语句3;……elseif(表达式(n-1))

语句(n-1);else

语句n;执行过程:首先先计算表达式1的值,如果为真(非0),则执行“语句1”,然后结束if语句;如果表达式1的值为假(0),则计算表达式2的值,如果为真,则执行“语句2”,然后结束if语句;如果表达式2的值为假,再继续往下计算其他表达式的值,如果所有表达式的值都为假,则执行“语句n”。说明:不管有几个分支,依次判断,当某条件满足,执行相应的语句,其余分支不再执行;若条件都不满足,且有else子句,则执行该语句。【例5.3】学校把学生的等级分为5级。90分以上为“A”,80到90分为“B”,70到80分为“C”,60到70分为“D”,60分以下为“E”。编程实现从键盘输入一个分数,输出其等级。#include<stdio.h>intmain(){ intscore; charch=''; printf("输入成绩:\n"); scanf("%d",&score); if(score>=90) ch='A'; elseif(score>=80) ch='B'; elseif(score>=70) ch='C'; elseif(score>=60) ch='D'; else ch='E'; printf("%d等级为%c\n",score,ch); return0;}5.2.4if语句的嵌套格式:(1)if(表达式1)if(表达式2)语句1;else语句2;else语句3;(2)if(表达式1)语句1;elseif(表达式2)语句2;else语句3;(3)if(表达式1)if(表达式2)…….if(表达式n)语句1;else语句2;else语句3;……..else语句n;C语言没有规定if语句的嵌套层数,在具体解题过程中,要根据实际问题选用合适的if语句。注意:C语言规定,else总是与它上面最近的且没有配对的if语句进行匹配。在书写时,应将处于同一层的if和其对应的else缩进对齐以增加程序的可读性。【例5.4】编一个程序,当给x输入任意的正数时,y都输出1;当给x输入任意的负数时,y都输出-1;当给x输入0时,y都输出0。#include<stdio.h>intmain(){ intx,y; printf("请输入x的值。\n"); scanf("%d",&x); if(x>0) y=1; else { if(x<0) y=-1;//当x小于0时 else y=0;//当x等于0时 } printf("x=%d,y=%d\n",x,y); return0;}思考intx,y;if(y==8)if(x==5)printf("@@@@@");elseprintf("#####");printf("$$$$$");printf("&&&&&");5.3switch语句switch语句,适用于条件是整型变量或字符变量的等值判断。比如根据输入的值,决定执行的语句。格式:switch(表达式)

{

case常量表达式1:语句组1;[break];

case常量表达式2:语句组2;[break];

case常量表达式n:语句组n;[break];

[default:语句组n+1];

}执行过程:计算switch后表达式的值,并逐个与case后常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,直到遇到break语句为止。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。说明:(1)switch后表达式的值,可以是字符型或整型,不可以是浮点型;(2)每一个case的常量表达式的值必须互不相同,否则会出现错误;(3)在case后可以有多个语句,不需要用大括号括起来;(4)case后可以不写语句,则表示它与后续case执行相同的语句;(5)各个case和default子句的先后顺序可以变动,一定是先与case后的常量不匹配后才执行default子句;说明:(6)default子句可以不写,如果没有default,当所有case后面的常量表达式的值都没有与switch后的表达式的值匹配,则什么也不执行,直接退出switch语句;(7)C语言中提供了一种break语句,可用于跳出switch语句。在每一个case语句之后都可以添加break语句,当匹配上case后的常量,执行完case后的语句,遇到break,便可跳出switch语句,可以避免程序向下执行。(8)break可以不写,则当匹配上case后的常量,执行完case后的语句,程序继续向下执行下面的case子句。(9)switch语句可以嵌套switch语句。思考inta=1,b=2,c; switch(a) { case0:c=0;break; case1: switch(b) { case1:c=1;break; case2:c=3;break; }break; }【例5.5】输入1到7之间的数字,输出对应的星期几。#include<stdio.h>intmain(){ intn; printf("输入0~7之间的数据:\n"); scanf("%d",&n); switch(n) { case1:printf("星期一。\n");break; case2:printf("星期二。\n");break; case3:printf("星期三。\n");break; case4:printf("星期四。\n");break; case5:printf("星期五。\n");break; case6:printf("星期六。\n");break; case7:printf("星期天。\n");break; default:printf("输入错误!\n"); }return0;}【例5.6】简单的计算器设计。#include<stdio.h>intmain(){ charch;//表示计算符号 intop1=20,op2=10;//表示参加计算的两个数 printf("输入需要计算类型:\n"); scanf("%c",&ch); switch(ch) { case'+':printf("%d\n",op1+op2);break; case'-':printf("%d\n",op1-op2);break; case'*':printf("%d\n",op1*op2);break; case'/':printf("%d\n",op1/op2);break; default: printf("输入的符号错误!\n"); } return0;}5.4选择结构程序应用【例5.7】输入年份和月份,输出该月的天数。解题思路:题目要求根据输入数字的值决定输出。首先判断输入的值是否在1~12之间,则为合法的输入。如果超出范围,则不需要进行计算。当输入值合法时,可能有12种值。当输入的值是4、6、9、11时,执行的操作相同,当输入的值是1、3、5、7、8、10、12时执行的操作相同。本章小结(1)在程序中选择结构有单分支、双分支和多分支三种不同的形式。掌握if语句的简单形式用于单分支选择结构的编程;掌握if-else语句用于双分支选择结构的编程;掌握if语句的嵌套选择结构和switch语句用于多分支选择结构的编程。(2)if语句的简单形式的执行过程是:当条件满足时执行if后的语句,条件不满足则退出if语句。(3)if-else语句的执行过程是:当条件满足时执行if后的语句,条件不满足时执行else后的语句。(4)switch语句的执行过程是:先计算switch后表达式的值,并逐个与case后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,直到遇到break语句为止。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。第六章

循环控制本章主要内容while、do...while、for三种循环语句的使用方法;break,continue两种循环控制语句的使用方法;循环结构程序设计的特点;循环结构程序设计的一般方法。

第六章循环控制循环结构是结构化程序设计中一种很重要的结构,又称为重复结构。循环结构其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种形式不同的循环结构。C语言提供了while语句、do...while语句和for语句实现循环结构。6.1while语句while语句也称为当型循环控制语句,根据条件表达式的值,决定循环体内语句的执行次数。

格式:

while(表达式)

语句;执行过程:先计算循环条件表达式的值,如果为真(非0)则执行循环体语句,然后再进行循环判断,直到循环条件表达式的值为假(0),则结束循环,转去执行while语句后面的语句。6.1while语句说明:(1)循环条件表达式,一般是关系表达式或逻辑表达式。(2)当循环体中语句超过一个语句时,用{}括起来,构成复合语句。(3)应注意循环条件的选择,避免死循环。(4)while语句先进行条件判断,来决定是否执行循环体语句,如第一次条件为假,则循环体语句一次也不执行。(5)循环之前要为有关变量赋初值,对于循环控制变量,一般要设置满足循环条件的初值。循环变量b初始化使循环趋于结束的语句思考:如果在while(i<=100)后加一个分号,程序的运行结果将如何?6.1while语句注意:(1)给出循环的初始条件,如s=1;i=1;(2)循环体如包括一个以上的语句,则必须用{}括起来,组成复合语句。(3)循环体中必须有使循环趋于结束的语句,否则程序将进入“死循环”,如i++;如键盘输入的字符是回车就停止循环对输入字符个数的计数6.2do...while语句在C语句中,直到型循环的语句是do...while。格式:

do{ 语句; }while(表达式);执行过程:先执行循环体语句,然后进行循环条件判断。如循环条件表达式的值为真,则再次执行循环体语句,直到循环条件表达式的值为假,结束循环。

分号不能少6.2do...while语句说明:(1)循环条件表达式,一般是关系表达式或逻辑表达式。(2)在if语句和while语句中,表达式后面都不能加分号“;”,而在do...while语句中,条件表达式后面的分号“;”不能省略。(3)注意循环条件的选择,避免死循环。(4)do...while语句先执行循环体,再进行条件判断,决定是否再次执行循环体,即使第一次条件为假,循环体也要执行一次。这一点和while语句是不同的。(5)循环体中超过一条语句,必须用{}括起来,构成复合语句。(6)循环之前要为有关变量赋初值。6.2do...while语句do...while循环与while循环的不同点?do...while循环先执行循环体中的语句,再判断表达式是否为真,如为真则继续循环;反之,则终止循环。因此,do...while循环至少要执行一次循环语句。6.3for语句

C语言除了提供了典型的当型循环语句(while语句)和一种直到型循环语句(do…while语句)外,还提供了一种功能较强的循环语句(for语句)。for语句实现循环更加灵活:它即可以方便地控制循环体执行指定的次数,又可以用于事先无法确定循环体的执行次数而只给出循环结束条件的情况。6.3for语句

在C语言中,for语句使用最为灵活,它完全可以取代while语句。格式:

for(表达式1;表达式2;表达式3)

循环体语句;在for语句中,可直接处理循环变量的初值、终值、步长,在这方面比while语句和do-while语句都方便。6.3for语句

执行过程:(1)先求解表达式1。(2)求解表达式2,若其值为真(非0),

则执行for语句中指定的内嵌语句,

然后执行下面第3步;若其值为假

(0),则结束循环,转到第5步。(3)求解表达式3。(4)转回上面第2步继续执行。(5)循环结束,执行for语句下面的一个

语句。N表达式2语句组1Y语句组2表达式1表达式36.3for语句

说明:(1)表达式1:通常用来给循环变量赋初值,一般为赋值表达式,表达式1可省略,省略表达式1时,应在循环语句前,给相关循环变量赋初值。(2)表达式2:通常是循环条件,一般为关系表达式或逻辑表达式,表达式2也可省略,当其省略时,应在循环体中用if语句设置退出循环的条件,否则会出现死循环。(3)表达式3:通常用来修改循环变量的值,即处理步长,一般是赋值语句,表达式3也可省略,当其省略时,应在循环体中处理步长,否则会出现死循环。for(循环变量赋初值;循环条件;循环变量增量)语句;思考:如果在for(i=1;i<=100;i++)后加一个分号,程序的运行结果会不会改变?6.3for语句注意:(1)for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但“;”不能缺省。(2)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。6.3for语句(3)省略“表达式2(循环条件)”,则不做其它处理时便成为死循环。 例如:

for(i=1;;i++)sum=sum+i; 相当于: i=1;

while(1) {sum=sum+i; i++;}6.3for语句(4)省略“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。 例如: for(i=1;i<=100;) {sum=sum+i;

i++; }6.3for语句(5)省略“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。 例如: for(;i<=100;) {sum=sum+i; i++; }

i=0;while(i<=100){sum=sum+i; i++;}6.3for语句(6)3个表达式都可以省略。 例如: for(;;)语句(7)表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。 例如:

for(sum=0;i<=100;i++)sum=sum+i;6.3for语句(8)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。for(sum=0,i=1;i<=100;i++)sum=sum+i;或:for(i=0,j=100;i<=100;i++,j--)k=i+j;(9)表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。 例如: for(i=0;(c=getchar())!='\n';i++);

又如: for(;(c=getchar())!='\n';) printf("%c",c);6.43种循环语句的比较

(1)C语言提供的3种循环语句,都可用来处理同一问题,一般情况下,它们可以互相代替。(2)while和do...while循环,在while后面只指定循环条件,需要在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等),而for语句可在表达式3中包含使循环趋于结束的语句,甚至可将循环体中的操作全部移到表达式3中,因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。6.43种循环语句的比较

(3)使用while和do...while语句实现循环时,循环变量赋初值操作应在while和do...while语句之前完成,而for语句可在表达式1中实现。(4)如果循环条件第一次执行时就为假,for和while的循环体一次也不执行,而do...while语句则至少要执行一次循环体。(5)对于循环变量不是呈规则变化(递增或递减)的循环,最好用while或do...while语句。(6)三种循环语句都可用break语句跳出整个循环,用continue语句结束本次循环,break语句和continue语句将在6.6节中详细介绍。6.5循环嵌套在一个循环结构中,又包含另一个完整的循环结构称为循环嵌套。内嵌循环的循环体中还可以出现新的循环,这就构成多重循环。C语言提供的for语句、while语句和do...while语句,不但可以嵌套循环语句自身,而且还可以相互嵌套。6.5循环嵌套三种循环

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论