描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787515402789
随着苹果iPhone、iPad等移动终端的持续热销,苹果AppStore上面的应用程序下载已超过400亿次,这些应用程序的开发,所使用的正是苹果iOS平台。iOS平台是苹果智能设备使用的操作系统,其界面美观、简洁,稳定性高,与硬件配合度极高。“苹果iOS6开发从入门到实战”是一本详细介绍苹果iOS6**平台软件开发应用的书籍。
该教程分四部分:
第一部分从开发基础语言入手,深入浅出的讲解了C语言和面向对象的Object_C语言,详细介绍了开发苹果iOS应用所需要的基础知识,其中大量实际案例帮助读者深入理解基础开发语言和后续开发之间的关联。
第二部分,iOS开发中高级进阶,这一部分详细阐述了苹果iOS开发工具、基本视图、UI框架,帮助读者掌握使用苹果优秀的开发工具XCode来进行苹果应用程序的开发流程,并详细介绍了苹果iOS框架下的一些高级应用,如音频、视频、照相机使用、极速其使用、地图框架、短信、邮件等应用,并介绍了苹果真机调试的技巧。
第三部分,项目实训,这一部分选取了睿峰科技公司承担的几项重大项目,如中国工商银行移动智慧银行、中国人寿移动保险系统等,通过对从项目策划到设计开发,再到测试部署等环节的具体分析,引导读者了解掌握苹果iOS平台开发的整体流程和技术要点。
第四部分,专题讲座,这部分教程分专题向读者介绍了在iOS开发领域的高级知识,如色彩搭配、体验设计、原型设计等,帮助读者迅速掌握该领域的高级知识。
第一部分 C语言基础
第一章数据类型、运算符、表达式
1.1 C语言的字符集
1.2 语言词汇
1.3 数据类型
1.3.1 常量与变量
1.3.2 常量和符号常量
1.4 算术运算符和算术表达式
1.4.1 C运算符简介
1.4.2 算术表达式
第二章结构化程序设计
2.1 C语句概述
2.2 赋值语句
2.3 分支结构程序
2.4 if语句的嵌套
2.5 switch语句
2.6 循环控制
2.6.1 goto语句以及用goto语句构成循环
2.6.2 while语句
2.6.3 do-while语句
2.6.4 for语句
2.6.5 循环的嵌套
2.6.6 几种循环的比较
2.7 break语句
2.8 continue语句
第三章数组、函数、指针
3.1 一维数组的定义
3.2 一维数组元素的引用
3.3 一维数组的初始化
3.4 二维数组的定义
3.5 二维数组元素的引用
3.6 二维数组的初始化
3.7 字符数组
3.7.1 字符数组的定义
3.7.2 字符数组的初始化
3.7.3 字符数组的引用
3.8 字符串和字符串结束标志
3.9 函数概述
3.10 函数定义的一般形式
3.11函数的参数和函数的值
3.11.1 形式参数和实际参数
3.11.2 函数的返回值
3.12 函数的调用
3.12.1 函数调用的一般形式
3.12.2 函数调用的方式
3.12.3 被调用函数的声明和函数原型
3.12.4 函数的嵌套调用
3.12.5 函数的递归调用
3.13 局部变量和全局变量
3.13.1 局部变量
3.13.2 全局变量
3.14 指针
3.15 地址指针的基本概念
3.16 变量的指针和指向变量的指针变量
3.16.1 定义一个指针变量
3.16.2 指针变量的引用
3.17 数组指针和指向数组的指针变量
3.17.1 指向数组元素的指针
3.17.2 通过指针引用数组元素
3.18 函数指针变量
3.19 指针型函数
3.20 指针数组和指向指针的指针
3.20.1 指针数组的概念
3.20.2 指向指针的指针
3.21 有关指针的数据类型的小结
3.22 指针运算的小结
3.23 void指针类型
第四章结构体、共用体、枚举、预处理
4.1 定义一个结构的一般形式
4.2 结构类型变量的说明
4.3 结构变量成员的表示方法
4.4 结构变量的赋值
4.5 结构变量的初始化
4.6 结构数组的定义
4.7 结构指针变量的说明和使用
4.7.1 指向结构变量的指针
4.7.2 指向结构数组的指针
4.8 枚举类型
4.8.1 枚举类型的定义和枚举变量的说明
4.8.2 枚举类型变量的赋值和使用
4.9 宏定义
4.9.1 无参宏定义
4.9.2 带参宏定义
4.10 类型定义符typedef
4.11 用extern声明外部变量
4.12 用static声明局部变量
4.13 用const声明常量
第五章数据结构与算法简介
5.1 数据结构基本概念和术语
5.2 程序的灵魂—算法
5.2.1 算法的概念
5.2.2 算法的特点
5.2.3 简单算法举例
第二部分 Objective-C语言
第六章 Objective–C基础
6.1 Objective-C概述
6.2 开发工具Xcode
6.3 HelloWorld解析
6.3.1 #import
6.3.2 NSLog()
6.3.3 @”字符串”
6.3.4 注释
6.3.5 #progma mark
6.4面向对象和面向过程
第七章类和对象
7.1认识对象
7.2 认识类
7.3 OC中类的定义
7.3.1 接口(interface)
7.3.2 实现(implementation)
7.3.3 Struct和Class比较
7.4 创建对象
7.4.1 类方法和实例方法
7.4.2 内存分配
7.4.3 初始化
7.4.4 便利构造器
第八章属性及点语法
8.1 属性
8.2 属性关键字
8.3 点语法
第九章字符串、集合
9.1 数据类型
9.1.1 与C共有的数据类型
9.1.2 OC扩展的数据类型
9.2 字符串(NSString)
9.2.1 NSString 对象初始化
9.2.2 字符串长度获取
9.2.3获取字符串的子串
9.2.4字符串的比较
9.2.5类型转换
9.2.6 字符串(NSMutableString)
9.3 数组
9.3.1 NSArray
9.3.2 NSArray简化
9.3.3 NSMutableArray
9.4 字典
9.4.1 NSDictionary
9.4.2 NSMutableDictionary
9.5 集
9.5.1 NSSet
9.5.2 NSMutableSet
9.6 快速枚举
第十章内存管理
10.1 程序内存分配
10.2 Objective-C内存管理
10.2.1所有权机制
10.2.2 内存管理黄金法则
10.2.3 便利构造器内存管理
10.2.4 设置器,访问器内存管理
10.2.5 常见错误
10.2.6 规则总结
10.2.7 ARC(Automatic Reference Counting)机制
第十一章封装、继承、多态
11.1 封装
11.2 继承
11.3 多态
第十二章类目、延展、协议、单例
12.1 类目Category
12.1.1 类目的声明和实现
12.1.2 类目的使用
12.1.3 举例
12.1.4 类目的局限性
12.2 延展Extension
12.3 协议Protocol
12.3.1 协议的定义
12.3.2 协议的作用
12.3.3 协议的特点
12.4 单例Singleton
第三部分核心框架
第十三章程序基本结构
13.1 Main函数
13.2 创建工程
13.3 应用程序的委托
13.4 UIWindow
第十四章视图
14.1 UIView的初始化方式
14.2 UIView的常见属性及含义
14.3 UIView的常用方法
14.4 自定义UIView
第十五章简单视图控件
15.1 按钮UIButton
15.1.1 UIButton的初始化
15.1.2 事件与回调
15.1.3 设置背景和文字
15.1.4 自定义按钮
15.2 标签UILabel
15.2.1 UILabel的常用属性
15.2.2 UILabel的初始化
15.2.3更好的文本展示
15.3 其他简单控件
15.3.1 开关控件UISwitch
15.3.2 滑块控件UISlider
15.3.3 多选控件UISegmentedControl
第十六章视图控制器
16.1 基本视图控制器
16.1.1 UIViewController的初始化
16.1.2 常用方法和执行顺序
16.1.3 自定义视图控制器
16.1.4 视图控制器的切换
16.2导航控制器
16.2.1 导航控制器的推送和返回
16.2.2 导航栏的自定义
16.3 标签控制器
16.3.1 标签控制器的切换关系
16.3.2 标签控制器的初始化
16.3.3 设置文字与图片
16.3.4 UITabBarController的自定义
16.4自动布局
16.4.1 AutoLayout简介
16.4.2 创建约束条件
16.4.3添加约束条件
第十七章 UIView动画以及触摸手势
17.1 UIView动画简述
17.2 建立UIView动画
17.3 动画回调
17.4 过渡动画
17.5 动画Blocks的使用
17.6图像视图动画
17.7 触摸事件
17.8 手势
第十八章滚动视图的使用
18.1 UIScrollView滚动视图
18.1.1 UIScrollView的工作机制
18.1.2 UIScrollView的常用属性
18.1.3 UIScrollView的实际使用
18.2 UIPageControl页面指示器控件
18.3 构建UIPickerView多轮表格
18.3.1 创建UIPickerView
18.3.2 创建基于视图的选取器
18.4 使用UIDatePicker时间选取器
第十九章创建和管理表格视图
19.1 UITableView和UITableViewController简介
19.2 创建表格
19.4 字体表格实例
19.5 使用内置单元格类型
19.5.1 修改内置单元格
19.6 定制自己的单元格
19.7 修改单元格的选中样式
19.8 记住定制单元格的控制状态
19.9 移出单元格选中时的高亮显示状态
19.10 单元格的配件样式
19.11 编辑单元格
19.11.1 处理删除请求
19.11.2 滑动单元格
19.11.3 对单元格重新排序
19.12 表格数据排序
19.13 创建分段表格
19.13.1 创建标题
19.13.2 创建分段索引
19.13.3 定制表头和脚注
19.14 创建分组表格
19.15 创建搜索表格
19.16 下拉刷新(ios6新特征)
19.17 UICollectionView(ios6新特征)
19.17.1 配置数据源
19.17.2 使用UICollectionViewFlowLayout
19.17.3 删除和添加项
19.17.4 使用UICollectionViewLayout
第二十章输入控件
20.1 文本输入
20.2 取消键盘
20.3 输入控制
第二十一章网络开发
21.1 检查网络状态
21.2 同步请求
21.3 异步请求
21.4 GET与POST
21.5 数据上传与下载
21.5.1 XML与XML解析
21.5.2 JSON与JSON解析
21.6 ASIHTTPRequest简介
21.7 网页视图
第二十二章音频与视频
22.1音频
22.2 视频
第四部分高级应用
第二十三章高级动画
23.1 图层
23.1.1图层的坐标系
23.1.2 指定图层的几何
23.1.3 图层的几何变换
23.1.4 变换函数
23.1.5 修改变换的数据结构
23.1.6 通过键值路径修改变换
23.2 使用Core Animation Transitions
23.3 深入了解 Core Animation
23.3.1 基本概念
23.3.2 CALayer及时间模型
23.3.3 显式动画Animation
23.3.4 CABasicAnimation的实际使用
23.3.5 CAKeyframeAnimation的实际使用
23.3.6 CAAnimationGroup组合动画的使用
第二十四章使用相册和照相机
24.1 使用图像拾取器
24.2 使用照相机
24.3 图像的存储
24.4 图像的重构
第二十五章数据持久性
25.1 应用程序的沙盒
25.2 获取文件路径
25.3 属性列表序列化
25.4 对象归档
25.4.1 遵守并实现NSCoding
25.4.2 对对象进行归档
25.4.3 读取归档的数据
25.5 文件管理
25.6 Core Data的使用
第二十六章多线程
26.1 线程与多线程
26.2 开辟子线程
26.3 定时器NSTimer
26.4 通知
第二十七章地图
27.1 定位
27.2 地图视图
27.3 地图注解
27.4 自定义地图注解
第二十八章真机调试
第二十九章访问设备能力(真机)
29.1 加速计
29.1.1 加速计的物理特性
29.1.2 访问加速计
29.2 控制屏幕的亮度
29.3 获取当前设备信息
29.4 监控电池状态
29.5 启用和禁用接近传感器
29.6 检测设备晃动
2012年开始,移动互联行业呈爆炸式的增长,智能移动终端数量在中国已突破6亿,大量移动应用的出现在很大程度上改变了人们生活、沟通以及获取信息的方式。苹果在2012年推出了ipad
mini,这款产品迅速成为销售增速最快的产品。究其原因,轻巧便携,体验良好,相对低廉的价格等等,都成为用户选择的原因。与此同时,企业级应用越来越被中国企业所接受,BYOD(Bring
Your
OwnDevice)已成为一种新的趋势,大型企业,如银行、保险、医院、物流等行业越来越多地把自己的业务搬到移动终端上来。行业移动应用的广泛出现,又从另一个层面将移动互联产业推向了一个全新的高度。
苹果iOS平台,由于其良好的体验,完善的生态体系,使其成为当下最流行的操作系统。由于苹果采用了良好的分账体系,使得i
平台上的应用开发者能有良好的回报,大量优秀的应用得以在这个平台上出现和发展。在企业级市场,因架构完善、安全可控、成熟等特点,i
已逐渐成为企业应用的首选平台。
2013年苹果i
开发势必迎来新一波增长高峰,一方面苹果iphone、ipad等已有了庞大的市场基础,需要更多的应用来满足人们多方面的需求;另一方面,越来越多的企业选用i
设备来部署企业应用,众多企业建立起自己的应用市场,每个企业都对通过移动互联改变自己的商业模式有着自己的理解和方式,每个企业都需要开发适合自己的应用。因此,i
开发需求在2013年出现井喷
随着行业的深入发展,现在i
开发不再局限于一些小型应用,更多地需要以ios设备特性为基础,开发一些互动体验良好、运行稳定、前后端密切协作的大型应用。尤其是企业级的应用,更需要开发者深刻理解苹果i
开发的精髓,并具有扎实的基本功和创新能力。
睿峰科技作为中国最大的苹果iOS平台开发企业,为众多行业客户开发了苹果iOS平台行业级应用,通过多年的实践,建立了完整的iOS开发体系。我们对这个行业理解深刻,也深知在该领域缺乏真正有价值、实用的教程。很多翻译过来的开发教程,并不能很好地贴合中国的实际,对国内开发者最需要的知识缺乏必要的梳理。因此,我们结合国内开发实际,推出了此书。本书对iOS开发体系所用到的知识,从基础到实践的全过程进行了全面的梳理。
本书作者全部来自于行业的一线开发工程师,他们参加过银行、保险、邮政、电信等行业的大型应用程序开发,不仅对前端有深刻的理解,对前后台数据的交互和优化,如何将ios设备效能发挥到极致有着丰富的经验。本书所涉及的所有代码和实例均来自于睿峰科技实际项目,来自于国内iOS行业开发的第一线,具有一定的参考价值。
由于本书成书时间短和作者知识水品有限,其中错误之处难免出现,恳请读者提出宝贵意见。
马泳宇
2013年4月18日
第一章数据类型、运算符、表达式
1.1 C语言的字符集
字符是组成语言的最基本的元素,C语言字符集由字母,数字,空格,标点和特殊字符组成,字符串常量和注释中还可以使用汉字或其它可表示的图形符号。
1.字母
小写字母a~z共26个
大写字母A~Z共26个
2.数字
0~9共10个
3.空白符
空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。
4.标点和特殊字符
1.2 语言词汇
在C语言中使用的词汇分为六类:标识符、关键字、运算符、分隔符、常量、注释符。
1.标识符
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。
以下标识符是合法的:
a,x,x3,XXL_1,sum1
以下标识符是非法的:
3s 以数字开头
A*T 出现非法字符*
-5x 以减号开头
boy-1 出现非法字符-(减号)
在使用标识符时还必须注意以下几点:
(1)标准C不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的限制。例如在某版本C中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如name和NAME是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于阅读理解,做到“顾名思义”。
2.关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。C语言的关键字分为以下几类:
(1)类型说明符
用于定义、说明变量、函数或其它数据结构的类型。如int,double等。
(2)语句定义符
用于表示一个语句的功能。如if else就是条件语句的语句定义符。
(3)预处理命令字
用于表示一个预处理命令。如include。
3.运算符
C语言中含有相当丰富的运算符。运算符与变量,函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。
4.分隔符
在C语言中采用的分隔符有逗号和空格两种。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,作为间隔符。在关键字,标识符之间必须要有一个以上的空格符作间隔,否则将会出现语法错误,例如把int
a;写成inta;C编译器会把inta当成一个标识符处理,其结果必然出错。
5.常量
C语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种。在后面章节中将专门给予介绍。
6.注释符
C语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使编译跳过不做处理,待调试结束后再去掉注释符。
1.3 数据类型
程序中使用的各种变量都应预先加以定义,即先定义,后使用。对变量的定义可以包括三个方面:数据类型、存储类型、作用域。
在本章中,我们只介绍数据类型的说明。其它说明在以后各章中陆续介绍。所谓数据类型是按被定义变量的性质,表示形式,占据存储空间的多少,构造特点来划分的。在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。
1.基本数据类型:基本数据类型最主要的特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。
2.构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在C语言中,构造类型有三种:数组类型、结构体类型、共用体(联合)类型。
3.指针类型:指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
4.空类型:在调用函数值时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明,例如函数头为:int
max(int a,int b);其中“int
”类型说明符即表示该函数的返回值为整型量。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”,其类型说明符为void,在后面函数中还要详细介绍。
1.3.1 常量与变量
对于基本数据类型,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。整型量包括整型常量、整型变量。
1.3.2 常量和符号常量
在程序执行过程中,其值不发生改变的量称为常量。
直接常量(字面常量):
整型常量:12、0、-3;
实型常量:4.6、-1.23;
字符常量:‘a’、‘b’。
标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。
符号常量:用标识符代表一个常量。在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
1.4 算术运算符和算术表达式
C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。这也是C语言的主要特点之一。
C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。
1.4.1 C运算符简介
C语言的运算符可分为以下几类:
算术运算符 —
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种。
关系运算符
—用于比较运算。包括大于(>)、小于(=)、小于等于(<=)和不等于(!=)六种。
逻辑运算符 —用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
位操作运算符
—参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<>)六种。
赋值运算符
—用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
条件运算符 —这是一个三目运算符,用于条件求值(?:)。
逗号运算符 —用于把若干表达式组合成一个表达式(,)。
指针运算符 —用于取内容(*)和取地址(&)二种运算。
求字节数运算符 —用于计算数据类型所占的字节数(sizeof)。
特殊运算符 —有括号(),下标[],成员(->,.)等几种。
下表列出了运算符的优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明
1 [] 数组下标 数组名[常量表达式] 左到右
() 圆括号 (表达式)/函数名(形参名)
. 成员选择(对象) 对象.成员名
-> 成员选择(指针) 对象指针->成员名
2 – 负号运算符 -表达式 右到左 单目运算符
(类型) 强制类型转换 (数据类型)表达式
++ 自增运算符 ++变量名/变量名++ 单目运算符
— 自减运算符 –变量名/变量名– 单目运算符
* 取值运算符 *指针变量 单目运算符
& 取地址运算符 &变量名 单目运算符
! 逻辑非运算符 !表达式 单目运算符
~ 按位取反运算符 ~表达式 单目运算符
sizeof 长度运算符 sizeof(表达式)
3 / 除 表达式/表达式 左到右 双目运算符
* 乘 表达式*表达式 双目运算符
% 余数(取模) 整型表达式/整型表达式 双目运算符
4 + 加 表达式+表达式 左到右 双目运算符
– 减 表达式-表达式 双目运算符
5 << 左移 变量<
>> 右移 变量>>表达式 双目运算符
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式 双目运算符
< 小于 表达式
<= 小于等于 表达式<=表达式 双目运算符
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!=表达式 双目运算符
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1?表达式2:表达式3 右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左
/= 除后赋值 变量/=表达式
*= 乘后赋值 变量*=表达式
%= 取模后赋值 变量%=表达式
+= 加后赋值 变量+=表达式
-= 减后赋值 变量-=表达式
<<= 左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&= 按位与后赋值 变量&=表达式
^= 按位异或后赋值 变量^=表达式
|= 按位或后赋值 变量|=表达式
15 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算
同一优先级的运算符,运算次序由结合方向所决定,简单记就是:! > 算术运算符 > 关系运算符
>&&> || > 赋值运算符。
1.4.2算术表达式
表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。
算术表达式是用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子。
以下是算术表达式的例子:
a+b
(a*2)/c
(x+r)*8-(a+b)/7
++i。
小结:
通过本章的学习,我们初步了解了C程序的一些概念知识,包括字符集、基本数据类型以及算数运算符和表达式。
数据类型有:基本类型,构造类型,指针类型,空类型。
基本类型的分类及特点:
常量类型有:整数,长整数,无符号数,浮点数,字符,字符串,符号常数转义字符。
一般而言,单目运算符优先级较高,赋值运算符优先级低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
第二章结构化程序设计
从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构。这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。本章介绍这些基本语句及其在顺序结构中的应用,使读者对C程序有一个初步的认识,为后面各章的学习打下基础。
2.1 C语句概述
C程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的,C语句可分为五类:
1.表达式语句
表达式语句由表达式加上分号“;”组成,其一般形式为:
表达式;
执行表达式语句就是计算表达式的值。
例如:
x=y+z; 赋值语句;
y+z; 加法运算语句,但计算结果不能保留,无实际意义;
i++; 自增1语句,i值增1。
2.函数调用语句
由函数名、实际参数加上分号“;”组成,其一般形式为:
函数名(实际参数表);
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值(在后面函数中再详细介绍)
。
例如:
printf(“C Program”);调用库函数,输出字符串。
3.控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。C语言有九种控制语句。可分成以下三类:
条件判断语句:if语句、switch语句;
循环执行语句:do while语句、while语句、for语句;
转向语句:break语句、goto语句、continue语句、return语句。
4.复合语句
把多个语句用括号{}括起来组成的一个语句称复合语句,在程序中应把复合语句看成是单条语句,而不是多条语句。
例如:
{
x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
是一条复合语句。
复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
5.空语句
只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。
例如:
while(getchar()!=’n’);
本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
2.2赋值语句
赋值语句是由赋值表达式再加上分号构成的表达式语句。
其一般形式为:
变量=表达式;
赋值语句的功能和特点都与赋值表达式相同,它是程序中使用最多的语句之一。在赋值语句的使用中需要注意以下几点:
1.由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式:
变量=(变量=表达式);
是成立的,从而形成嵌套的情形。其展开之后的一般形式为:
变量=变量=…=表达式;
例如:
a=b=c=d=e=5;
按照赋值运算符的右接合性,因此实际上等效于:
e=5;
d=e;
c=d;
b=c;
a=b;
2.注意在变量说明中给变量赋初值和赋值语句的区别。
给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。
例如:
int a=5,b,c;
3.在变量说明中,不允许连续给多个变量赋初值。
如下述说明是错误的:
int a=b=c=5;
必须写为
int a=5,b=5,c=5;
而赋值语句允许连续赋值。
4.注意赋值表达式和赋值语句的区别。
赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
下述语句是合法的:
if((x=y+5)>0) z=x;
语句的功能是,若表达式x=y+5大于0则z=x。
下述语句是非法的:
if((x=y+5;)>0) z=x;
因为x=y+5;是语句,不能出现在表达式中。
2.3分支结构程序
用if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。
1.第一种形式为基本形式:if
if(表达式) 语句
其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。
【例2.1】
main(){
int a=1,b=2,max=0;
if (a
printf(“max=%d”,max);//输出max=2
}
上面的代码程序中用if语句判别a和b的大小,如a小于b,则把b赋予max,最后输出max的值。
2.第二种形式为: if-else
if(表达式)
语句1;
else
语句2;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。
【例2.2】
main(){
int a, b;
printf(“input two numbers: “);
scanf(“%d%d”,&a,&b);
if(a>b)
printf(“max=%dn”,a);
else
printf(“max=%dn”,b);
}
输入两个整数,输出其中的大数。
改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。
3.第三种形式为if-else-if形式
前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为:
if(表达式)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
…
else if(表达式m)
语句m;
else
语句n;
其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。
在使用if语句中还应注意以下问题:
1.在三种形式的if语句中,在if关键字之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。
例如:
if(a=5) 语句;
if(b) 语句;
都是允许的。只要表达式的值为非0,即为“真”。
如在:
if(a=5)…;
中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如,有程序段:
if(a=b)
printf(“%d”,a);
else
printf(“a=0”);
本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
2.在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
3.在if语句的三种形式中,所有的语句应为单个语句,如果想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。
例如:
if(a>b)
{
a++;
b++;
}
else
{
a=0;
b=10;
}
2.4 if语句的嵌套
当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。其一般形式可表示如下:
if(表达式)
if语句;
或者为
if(表达式)
if语句;
else
if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。
例如:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
其中的else究竟是与哪一个if配对呢?
应该理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
还是应理解为:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
为了避免这种二义性,C语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。在一般情况下较少使用if语句的嵌套结构。以使程序更便于阅读理解。
2.5 switch语句
C语言还提供了另一种用于多分支选择的switch语句,其一般形式为:
switch(表达式){
case常量表达式1: 语句1;
case常量表达式2: 语句2;
…
case常量表达式n: 语句n;
default :
语句n+1;
}
其语义是:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
【例2.3】
main(){
int a;
printf(“input integer
number: “);
scanf(“%d”,&a);
switch (a){
case 1:printf(“Mondayn”);
case 2:printf(“Tuesdayn”);
case 3:printf(“Wednesdayn”);
case 4:printf(“Thursdayn”);
case 5:printf(“Fridayn”);
case 6:printf(“Saturdayn”);
case 7:printf(“Sundayn”);
default:printf(“errorn”);
}
}
本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case
常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一个case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。
【例2.4】
main(){
int a;
printf(“input integer number:
“);
scanf(“%d”,&a);
switch (a){
case 1:printf(“Mondayn”);break;
case 2:printf(“Tuesdayn”); break;
case 3:printf(“Wednesdayn”);break;
case 4:printf(“Thursdayn”);break;
case 5:printf(“Fridayn”);break;
case 6:printf(“Saturdayn”);break;
case 7:printf(“Sundayn”);break;
default:printf(“errorn”);
}
}
在使用switch语句时还应注意以下几点:
1)在case后的各常量表达式的值不能相同,否则会出现错误。
2)在case后,允许有多个语句,可以不用{}括起来。
3)各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4)default子句可以省略不用。
2.6 循环控制
循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。
1)用goto语句和if语句构成循环;
2)用while语句;
3)用do-while语句;
4)用for语句;
2.6.1 goto语句以及用goto语句构成循环
goto语句是一种无条件转移语句,与BASIC中的goto语句相似。goto语句的使用格式为:
goto 语句标号;
其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。
goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理。
【例2.5】用goto语句和if语句构成循环,求1+2+3+…+100的和。
main()
{
int i,sum=0;
i=1;
loop:if(i<=100)
{
sum=sum+i;
i++;
goto loop;
}
printf(“%dn”,sum);
}
2.6.2 while语句
while语句的一般形式为:
while(表达式)语句
其中表达式是循环条件,语句为循环体。
while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。
【例2.6】用while语句求1+2+3+…+100的和。
main()
{
int i,sum=0;
i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
printf(“%dn”,sum);
}
使用while语句应注意:while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环,循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。
2.6.3 do-while语句
do-while语句的一般形式为:
do
语句
while(表达式);
这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句。
【例2.7】用do-while语句求1+2+3+…+100的和。
main()
{
int i,sum=0;
i=1;
do
{
sum=sum+i;
i++;
}
while(i<=100);
printf(“%dn”,sum);
}
同样,当有许多语句参加循环时,要用”{“和”}”把它们括起来。
2.6.4 for语句
在C语言中,for语句使用最为灵活,它完全可以取代while语句。它的一般形式为:
for(表达式1;表达式2;表达式3) 语句
它的执行过程如下:
1)先求解表达式1。
2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3步;若其值为假(0),则结束循环,转到第5步。
3)求解表达式3。
4)转回上面第2步继续执行。
5)循环结束,执行for语句下面的一个语句。
for语句最简单的应用形式也是最容易理解的形式如下:
for(循环变量赋初值;循环条件;循环变量增量) 语句
循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值。循环条件是一个关系表达式,它决定什么时候退出循环。循环变量增量,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用“;”分开。
例如:
for(i=1;i<=100;i++)
sum=sum+i;
先给i赋初值1,判断i是否小于等于100,若是则执行语句,之后值增加1。再重新判断,直到条件为假,即i>100时,结束循环。
相当于:
i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
对于for循环中语句的一般形式,就是如下的while循环形式:
表达式1;
while(表达式2)
{
语句
表达式3;
}
使用for循环时注意以下几点:
1)for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但“;”不能缺省。
2)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。
3)省略了“表达式2(循环条件)”,则不做其它处理时便成为死循环。
……
评论
还没有评论。