VC程序设计电子_第1页
VC程序设计电子_第2页
VC程序设计电子_第3页
VC程序设计电子_第4页
VC程序设计电子_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、Visual C程序设计授课专业:计算机科学技术授课年级:2002级本科授课方式:课堂讲授;实验课教学方式:多媒体教学课程教学总学时数:48学分数3课时分配:课堂讲授 32 学时;实验课 16 学时教材:Visual C与面向对象程序设计(第二版),吕军等,高教出版社,2003年8月参考书目:C+程序设计教程,钱能,清华大学出版社Visual C+程序设计与软件技术基础,马建红 沈西挺,中国水利水电出版社Visual C+图形用户界面开发指南,李博轩, 清华大学出版社新编Visual C+6.0 教程,北京科海培训中心 编著C+ PRIMER (3RD)中文版Stanley .Lippman,

2、Josee Lajoie,中国电力出版社C+程序设计语言(特别版)(美)Bjarne Stroustrup,机械工业出版社常用网址:1.2.3. et目录第一章 C+入门1.1 软件开发与C+语言1.2 算法与程序1.3 输入、编译、调试和运行一个C+程序1.4 C+语言的输入与输出命令1.5 程序设计语言的发展1.6 C+程序的基本要素1.6.1 标识符、关键词和标点符号1.6.2 注释1.6.3 源程序1.7 编译预处理1.7.1 宏定义1.7.2 文件包含1.8 Visual C+的集成开发环境1.8.1 菜单和工具栏1.8.2 Developer Studio窗口1.8.3用Devel

3、oper Studio编写和调试简单C+程序1.8.4 菜单选项、快捷键和工具栏第二章 控制结构2.1 程序的基本控制结构2.2 C+的控制结构2.2.1 顺序结构2.2.2 选择结构2.2.3 循环结构2.3 结构化程序设计2.4 伪代码2.5 结构化程序设计方法简介2.6 C+的其他控制转移语句2.6.1 switch语句2.6.2 goto语句和语句标号2.6.3 break语句和continue语句2.6.4 exit()函数和abort()函数2.7 Developer Studio的文本编辑器第三章 基本数据类型3.1 数据类型3.1.1 整型数据的表示方法3.1.2 实型数据的表

4、示方法3.2 常量3.2.1 整型常量3.2.2 实型常量3.2.3 字符常量3.2.4 字符串常量3.3 变量3.3.1 变量的声明3.3.2 变量的初始化3.4 数组3.5 字符型数组和字符串处理库函数3.6 类型修饰符和常量修饰符3.7 枚举类型3.8 typedef语句3.9 Develper Studio的文件处理功能3.10 Visual C+程序的编译、链接和运行3.11 查看和修改编译、链接错误第四章 表达式4.1 算术运算符和算术表达式4.2 逻辑运算符和逻辑表达式4.3 赋值运算符和赋值表达式4.4 自增运算符4.5 表达式中各运算符的运算顺序4.6 其他具有副作用的运算符

5、4.7 问号表达式和逗号表达式4.8 类型不同数据之间的混合算术运算4.9 运行错误的判断与调试4.10 基本调试手段4.11 注释号在调试中的作用4.12 条件编译第五章 函数5.1 函数的定义5.2 函数的调用5.3 函数原型5.4 函数间的参数传递5.4.1 值调用5.4.2 引用调用5.5 函数重载5.6 局部变量和全局变量5.7 内联函数5.8 带有默认参数的函数5.9 C+的库函数5.10 函数模板5.11 变量的存储类别5.12 Develooper Studio的跟踪调试功能第六章 指针6.1 指针与地址6.1.1 地址6.1.2 指针6.2 指针运算6.3 指针与数组6.4

6、动态存储分配6.5 指针与函数6.5.1 指针作为函数的参数6.5.2 返回指针的函数6.5.3 指向函数的指针6.6 指针的数组6.7 指针的初始化6.8 Visual C+的帮助功能第七章 类和对象7.1 面向对象的思想7.2 面向对象程序设计的特点7.3 类与对象7.3.1 类的定义7.3.2 成员函数的定义7.3.3 内联成员函数7.3.4 对象7.4 构造函数与析构函数7.5 数据成员的初始化7.6 对象与指针7.7 const修饰符7.8 MFC的CString类7.9 MFC的CTime类和CTimeSpan类7.9.1 CTime类7.9.2 CTimeSpan类7.9.3 C

7、Time类和CTimeSpan类的运算7.10 类的嵌套7.11 如何在程序中使用MFC类库7.12 使用FileView标签第八章 继承与派生8.1 继承与派生8.1.1 为什么使用继承8.1.2 派生类的定义8.1.3 派生类中的变化8.2 派生类的继承方式8.2.1 公有继承8.2.2 私有继承8.2.3 保护继承8.3 派生类的构造函数和析构函数8.3.1 构造函数8.3.2 析构函数8.4 显式访问基类成员8.5 静态成员8.6 类模板8.7 使用Class View标签第九章 多态性9.1 多态性概述9.2 派生类对象替换基类对象9.3 虚函数9.3.1 虚函数定义9.3.2 虚函

8、数的使用限制9.4 抽象类9.5 运算符重载9.6 文件处理9.7 异常处理机制第一章 C+入门教学目的:了解+程序的基本特点, 熟悉Visual C+集成开发环境的基本使用方法。重点:了解+程序的基本特点,Visual C+的集成开发环境。难点:C语言、+、VC之间的关系1.1 软件开发与C+语言一、C语言的发展历程B->C->C+ Vc+B是无类型语言(需解释)C+是面向对象的语言(解释),使开发软件的可重用性、可维护性和可靠性,具有了极大的优势。C是C+的子集,C+是C的超集。VC是可视化的C+集成环境二、本课程的目的1.C+的程序结构(面向过程)2.VC集成环境的使用3.面

9、向对象的构成思想4.学习利用系统提供的对象进行面向对象的编程(简单)1.2 算法与程序算法:解决问题的方法和步骤程序:用计算机语言对算法的描述例1:1.根据算法特性,至少要有一个输出,如果使用C语言的printf和scanf函数完成输入输出,则必须打开stdio.h头文件。c+中数据的输入输出通过cin和cout与>>、<<配合实现,但cin和cout均不是语句,也不是函数,是流对象。因此只要使用这两个(数据)流对象,就必须打开iosteam.h头文件。2. c+规定任何函数必须有函数类型(没有缺省类型),由于main函数不能被其他函数调用,所以不需要存放返回值的空间,

10、因此通常将main函数的类型设为void。3.endl是iostream.h中的一个标准符号常量“换行”。4.利用输入输出流对象进行输入输出时,没有必要说明需输出输入数据的数据类型,系统会根据相关变量,按变量定义时的类型自动处理。(整型数据只能按整型格式输出,而不能按字符类型输出)5.c+提供的注释方式为/,也支持c的注释方式/* */1.3 输入、编译、调试和运行一个C+程序基本步骤与C一样P4,但是继承环境所提供的界面、操作略有不同。不同点:C源程序文件扩展名为c,C+源程序文件扩展名为cpp1.4 C+语言的输入与输出命令一、输入:cin>>v1>>v2>&

11、gt;>>vn;1. >>:提取运算符2.提供数据时,数据间用空格(广义)分开。3.所提供数据应与变量类型相一致,若不一致,会导致操作失败或数据错误。(感兴趣者可以仔细研究)。二、输出:cout<<e1<<e2<<<<em;1.<<:插入运算符2.系统会根据输出数据的类型,自动以相应的格式输出1.5 程序设计语言的发展自学1.6 C+程序的基本要素1.6.1 标识符、关键词和标点符号一、标识符:程序中变量、类型、函数和标号的名称1.区分大小写2.组成规则,字母(含下划线)开头的字母数字串二、关键字关键字:具有特

12、定作用,不能作为自定义标识符的字符组合。标准标识符:系统提供具有特定功能的常量、函数等,与关键字的区别是,关键字不能作为用户自定义标识符,而标准标识符则可以,但是最好不要将其作为用户自定义标识符。1.6.2 注释编译器把一个注释作为一个空格字符处理。1.6.3 源程序一个C+源程序由一个或多个源文件构成。习惯上,通常将变量、类型、宏和类等的定义放在一个源文件中(扩展名用.h),然后在其他源文件中引用这些定义量。在编制大型程序时尤其需要这样,在学习阶段,由于程序很小,所以可以不采用这种方法。1.7 编译预处理1.7.1 宏定义无参宏格式:#define <宏名> <替换序列&g

13、t;说明:1.习惯上宏名采用大写字母 2.宏替换是一个机械过程有参宏格式:define <宏名> <带有参数的替换序列>说明:1.有参宏与函数的本质不同2.为防止宏替换出现问题,最好将参数和整个宏都用括号括起1.7.2 文件包含格式:#include <文件名> 或 #include "文件名"说明:1.文件包含的作用是将被包含文件嵌入到包含文件中 2.<>在系统指定的目录查找被包含文件;"首先在当前目录中查找,若找不到,再到指定目录查找采用文件包含的方式,从物理角度是两个文件,但是对于C语言系统而言,仍然是“一个”

14、文件。1.8 Visual C+的集成开发环境Visual C+软件包包含了许多独立组件,如编辑器、编译器、链接器、实用程序生成器、调试器。我们运行VC所看到的界面是VC系统所提供的一个叫做Developer Studio的集成开发环境。开发环境会根据用户使用的需要,自动调用一些相应组件。1.8.1 菜单和工具栏开发环境提供的界面与windows下的其他软件的界面窗口基本一样,由标题栏、菜单栏、快捷图标栏及编辑窗口和其他窗口等组成。1.除标题栏外,其他栏目均为停靠式,可以用鼠标拖动改变它们的位置。2.快捷图标栏由多种工具栏组成,缺省状态下由标准工具栏(Stdandard Bar),向导工具栏(

15、Wizard Bar),建立(编译)微型栏(Build MiniBar)组成,如果希望在工具栏中出现其它栏目,可以通过 工具/定制/工具栏 进行有目的的设置。1.8.2 Developer Studio窗口整个集成环境的窗口中有多个窗口,分为两种类型,一种是文档窗口(带边框),多个窗口时以平铺或层叠方式显示;一种是停靠窗口,缺省状态有两个停靠窗口,一个是工作区(Workspace),一个是输出窗口(Output)。其他窗口在需要时会自动出现,或者通过菜单命令,指定显示某个窗口。1.8.3用Developer Studio编写和调试简单C+程序编写简单程序的步骤:1.选择菜单 文件(File)/

16、新建(New)中的工程(Projects)选项卡,选择Win32 Console Application(32控制台应用程序。C+开发不同的程序需要选择不同的工程项目,对于简单的编程,选择Win32 Console Application即可。2.为该工程项目起一个名字,填在右上方project name上。下面的location指明项目文件的存储位置,用户可自己设定。3.此时应用程序生成向导会提问要生成的项目类型。选择An empty project(空项目),点击finish、ok。系统会自动产生目录和一个工作区文件(.dsw),一个.dsp,一个.ncb文件。4.再次选择菜单 文件(Fi

17、le)/新建(New)中的文件选项卡,从中选择C+ Source File,为该程序文件命名,单击OK。5.在编辑窗口内编辑程序、编译、调试、运行。仅编译:compile Ctrl+F7编译加链接:build F7执行:execute Ctrl+F5产生的文件均存放在相应源程序文件下的debug目录中。1.8.4 菜单选项、快捷键和工具栏第二章 控制结构教学目的:掌握结构化程序设计方法的基本思想和+的几种基本控制转移语句,熟悉使用伪代码的编程方法。重点:C+的控制结构。难点:分支循环结构2.1 程序的基本控制结构结构化的基本结构结构化的程序设计方法:以模块化设计为中心,将需解决的问题划分为若干

18、个相互独立的模块。模块的大小2.2 C+的控制结构2.2.1 顺序结构相互间具有先后顺序关系的模块组合2.2.2 选择结构1.概念选择结构又称分支结构。两个模块都有被执行的可能,但每次只能有且只有一个被执行。2.格式if (表达式) 语句1 else 语句23.注意事项(1)表达式必须用括号括起(2)表达式不对类型作任何要求(单变量方式)(3)复合语句的使用4.应用方式(1)逐情况判断(2)假定(3)嵌套 嵌套既可以嵌在then子句上,也可以嵌在else子句上。注意:为了明确的表示嵌套关系,消除二义性,可以采用三种方法:1)将嵌套嵌在else子句上。2)写齐所有子句。没有语句的分支可以使用空语

19、句。3)使用复合语句。当分支数在34个或更多一些,一般使用if语句,若更多时,往往使用switch语句。逐情况法常见于初学者,假定法常用于熟练编程者。嵌套法则是熟练又希望程序比较高效者。2.2.3 循环结构1.语句格式while (表达式) 语句do 语句while(表达式);for (表达式1;表达式2;表达式3)语句2.语句功能1)while和for均是当型循环,do while是直到型循环。2)所有的表达式均对类型没有特定要求。3)所有的循环体均为一条语句(复合语句)。4)所有的语句都是当条件成立时运行,不成立时退出。3.for语句for语句是C语言中极为灵活的一种语句,当省略第一和第三

20、表达式时,与while语句完全等效。2.3 结构化程序设计自顶向下、逐步细化、模块化2.4 伪代码类语言,接近语言,但又不是真正的语言,若需要转化成语言时,只要作简单的修改即可。与具体语言相比,语法不像具体语言的要求那么严格。2.5 结构化程序设计方法简介解决大型软件生产设计的设计基础和方法。2.6 C+的其他控制转移语句2.6.1 switch语句格式注意事项1)switch表达式虽然没有类型要求,但最好不要是实型。2)case后的常量只能是一个常量表达式。3)当执行符合条件的分支后,如无break则继续执行下续语句。4)循环中含switch语句,或switch中含switch,内部的bre

21、ak仅仅自内部跳出,不能跳出外部控制体。continue只对循环起作用。2.6.2 goto语句和语句标号goto语句是无条件转移语句,它可以将程序流程控制无条件地转移到由标号所指定的语句处继续执行。使用goto构成的结构不一定是非结构化的,但非结构化的程序往往由于goto的因素。#include "iosteam.h"void main() int i,j,k=0; for (i=1;i<=10;i+) for (j=1;j<=10;j+) in:k+=i*j; if (k>100) goto out; out: cout<<"i=

22、"<<i<<",j="<<j<<",k="<<k<<endl;if (k<500) goto in;2.6.3 break语句和continue语句1.break作用:中止执行循环,使流程控制退出该循环控制结构,执行该循环语句的下一语句。(还可用于switch,但不能用于使用if构成的循环)虽然break属于非结构化的语句,但它对程序可读性的破坏不严重,某种意义上,还容易提高程序的可读性。2.continue作用:仅实现从该语句位置将流程控制转移到本次循环的结束位置。

23、它结束的是本次循环,而不是跳出整个循环语句。几乎所有出现该语句的地方,都可以通过改变算法而取消该语句的使用。对于多重循环,这两条语句都只能对包含它的语句起作用。2.6.4 exit()函数和abort()函数作用:中止整个程序的运行。exit():结束程序前做一些善后工作。abort():强制结束程序。要求使用整数参数表示退出的原因。习惯上用0表示正常退出,非0值表示非正常退出(程序调试)。2.7 Developer Studio的文本编辑器一、基本操作通用的键盘操作方式二、高级编辑Windows环境下的一些操作第三章 基本数据类型教学目的:掌握几种基本数据类型, 包括字符型、整型、长整型、浮

24、点和双精度数据类型的基本概念, 以及常数、变量和数组的使用方法。重点:C+基本数据类型。难点:数组3.1 数据类型数据类型定义了变量可接受值的集合以及对它所能执行的操作。类型的定义决定了三个方面的性质:a.该类型数据所占据内存空间的大小(数据的取值范围)b.数据在内存中的存储格式(定点、浮点)c.定义可以施加在该类型数据上的操作3.1.1 整型数据的表示方法整型数据在内存中的表示方法(补码),字符型数据也可以认为是补码方式。3.1.2 实型数据的表示方法实型数据在内存中的表示方法(浮点数)3.2 常量3.2.1 整型常量十进制:yyy十六进制:0xyyy八进制:0yyy3.2.2 实型常量格式

25、:±(x).(x)e(E)±xx规定:小数点先后必须有一位数字e的左面必须有数字(上面的要求),右面必须是整数尾数必须为十进制数说明:c中的实型常量为双精度型,如果需要特别指明为单精度型,可在实数后面加f或F3.2.3 字符常量定义:用单引号括起来的一个字符。c语言支持扩展ASCII字符集,因此共包含256个字符注意:1.转义ASCII码没有十进制数,只有十六进制和八进制,没有X就是八进制。X打头时不能有0。其取值范围为ff,3772.任何字符都可以转义方式给出,一些常用控制字符给出了转义字母,如n,t,b,(',"在不引起误解的情况下可以不用,如&quo

26、t;what's",'"')3.非转义字母前面加,不起任何作用3.2.4 字符串常量字符串是用双引号括起来的一系列字符。注意:当字符串中包含转义字符时,转义符后的数值后面不能跟随引起误解的符号。八进制数后面不能跟07,十六进制不能跟09和a-f(A-F)。3.3 变量3.3.1 变量的声明1.基本类型int 整型(4byte) char 字符型 (1byte) float 实型(4byte)验证:cout<<"size="<<sizeof(int);注意:不同的语言版本在不同类型的机器上其所占据空间不同3.

27、类型的前缀signed unsigned long short注意:double即为long float原则:a.不能自相矛盾 short long intb.不能没有实际意义 long char、unsigned float3.3.2 变量的初始化C+允许在说明变量的同时对变量赋一个初值。两种格式:int a=3;int a(3);3.4 数组1.概念数组:数组是具有同一类型数据项(数组元素)的有序集合。其所属数据的类型称作基类型或成分类型。数组由一组连续的存储空间构成。2.数组说明格式:存储类别 类型说明符 数组名常量表达式;二维注意:1)数组占据的是连续的存储空间2)下标的取值范围0n-

28、13)允许越界4)数组名为指针常量,其表示的是地址5)给定初值时可以省略第一维的下标3.数组初始化1)初始化格式一维数组:int a5=1,2,3,4,5;二维数组:int b23=1,2,3,4,5,6; 1,2,3,4,5,6;2)数组的初值static extern存储类别无初值及初值不足时,无初值元素初值自动为零auto类别无初值时为随机数,初值不足时,无初值元素为零。3.5 字符型数组和字符串处理库函数1.概念字符数组:基类型为字符的数组。字符串:以双引号括起来的一系列字符(结束标志)。关系:字符串借助字符数组来存放。区别:串必定有结束标志,数组不能保证有结束标志;串常量不能以下标方

29、式访问(利用指针指向后可以)。串常量是没有数组名的数组。2.字符数组的初始化性质与数值数组一致格式:char str10='a','b','c' "abc""abc"省略下标的特殊说明:char str='a','b','c'无结束标志,下标为>=4的值时则有结束标志。没有初值时为随机字符,所以也没有结束标志。3.字符数组的输入输出1)单字符输入输出以单字符方式读取时,应注意添加结束标志(讲一个读不定长度字符串的例子)2)以字符串方式输入输出注意:(1)

30、读取时不需要人为添加结束标志(2)以空格(广义)为字符串的分隔标志4.相关的几个函数strcpy(array,str) strcat(arraystr,str) strcmp(str1,str2) strlen(str)strlwr() strupr()strchr() 字符串中查找字符strrev() 反转字符串strstr() 在字符串中查找字符串说明:array数组(必须有足够的空间),str字符串(数组、常量串、指针)在C中array可以为指针,VC中只能是数组(教材中有错误)3.6 类型修饰符和常量修饰符自学内容检查验证_intxx方式定义类型的大小3.7 枚举类型格式:enum 枚

31、举类型名枚举元素表;说明:枚举元素的序号自0开始,按照先后顺序排列,也可指定序号。指定序号时应预留足够编码空间,若不足,或者系统报错,或者两个元素具有相同的序号。枚举量可以进行比较(如同字符,比较的是它们的序号)。枚举元素是标识符,不是字符串,不能直接以串方式输出,但枚举变量可以直接输出,输出的是该元素的序号。3.8 typedef语句1.方法:1)按定义变量的方法写出定义体2)将变量名换成类型名3)在最前面加上typedef4)用新类型名定义变量2.说明类型定义仅仅是为一种类型起了一个别名,并不能产生新的类型。3.9 Develper Studio的文件处理功能主要讨论了集成环境file菜单

32、的各个菜单的功能3.10 Visual C+程序的编译、链接和运行3.11 查看和修改编译、链接错误第四章 表达式教学目的:熟练掌握+的各种表达式, 特别是赋值表达式及其他有副作用的表达式。重点:逻辑运算符和逻辑表达式难点:运算符的优先级和结合性总体注意:1.运算符的书写方法。(与数学运算符的区别)2.运算符的功能。(单一功能还是多种功能,有没有副作用)3.运算符的适用对象。4.运算符的优先级和结合性。4.1 算术运算符和算术表达式1.运算符及优先级+:加 -:减 *:乘 /:除和整除 %:取余*/%高于+-2.运算规则:操作数的类型应当一致,若不一致则需要进行自动的类型转换。转换规则:字符型

33、和单精度型只要参与运算则自动转换为整型和双精度型,其它类型的转换总是向参与运算的高级别类型转换。3.注意:有符号字符型(含整型)和无符号字符型参与运算对结果的影响。%运算要求运算数据必须为整型(含字符型),当操作数中含有负数时,结果的符号与被除数一致。/运算当操作数均为整型时,为整除运算,否则为除运算。表达式的类型由表达式计算的最终结果决定。(unsigned) char c=-1; int i;i=2*c;cout<<i;当c为signed(缺省)时,i的值为-2,当c为unsigned char时,i的值为510。4.2 逻辑运算符和逻辑表达式1.运算符关系:>、>

34、=、<、<=、=、!=逻辑:&&、|、!2.运算规则操作数类型应当一致,若不一致则按照转换规定进行转换,然后进行运算。关系和逻辑运算的结果为bool型,其值为true(1)或false(0)3.说明运算级别问题关系运算符级别不等,=、!=级别低于>、<逻辑运算符&&和|级别相同(教材有误)int a,b,c,d; a=b=1; c=0; d=a+|b+&&c+; cout<<"a="<<a<<"b="<<b<<"c

35、="<<c<<endl;输出为2 1 0尽量避免对实型数进行等于或不等于的判断,如果需要则采用|x-y|<1e-4的方式C语言采用短路算法当运算不需继续计算即可判断计算结果的时候,可以不再继续后续计算。(简化运算过程)与运算的前项为假,后项被短路如:a+&&b+|c+ 当首项为假时,b+被短路,但是c+不能被短路 对于全与表达式,第一项为假,后面全部不再计算或运算的前项为真,后项被短路如:a+|b+&&c+当首项为真时,b+被短路,c+也被短路a=1; b=1; c=0; d=a+|b+&&c+; cout

36、<<"a="<<a<<"b="<<b<<"c="<<c<<"d="<<d<<endl;输出为2 1 0 1按理c+不应当被短路,但是特例:d=a+|b+&&c+;当首项为真时,后面的计算均被短路。(先或后与,首项为真,后面不算)若首项为假,将上例a初始为0,则输出结果为1 2 1 0,c+没有被短路。应用意义:if (n!=0&&m%n=0)如果不短路将会出现除以零的错误4.3

37、 赋值运算符和赋值表达式1.运算符=、+=等,任何一个双目运算符均可以和“=”结合组成复合运算符。2.作用计算赋值运算符右侧表达式的值,将该值写入该变量所对应的存储空间。3.说明赋值运算符的级别极低(倒数第二)。结合性为自右向左。4.赋值转换c语言允许不同类型数据间可以相互赋值,由于他们存储格式和取值范围的不同,在赋值过程中会产生一些问题。字符型与短整型数据的赋值转换c=s 长送短:截高送低(会引起符号位的变化)s=c 短送长:无、有正:送低高补0有负:送低高补1溢出的处理:对256取余,若大于127,转换二进制,求负数值2.短整型与整型数据的赋值转换3.整型与实型数据的赋值转换f=i 无转换

38、误差i=f 小数点后截掉(截断误差),超出整型数所能表示范围的溢出(溢出误差)4.4 自增运算符1.格式i+ (+i)2.作用在完成参加表达式运算的同时还完成自身的增量操作。3.分析i+:先用后增,先参与表达式的计算,然后自身完成增量操作。+i:先增后用,先完成自身的增量操作,然后参与表达式的计算。4.注意i+j问题:先满足左侧变量的需求(左倾主义)在输出语句(实参表)中出现时,按表达式自右向左解释i=3;cout<<i+<<i<<endl;将输出3 3 显然后一个i的值并没有受到前面i+的任何影响。组合增量运算的理解分析i=3; j=(i+)+(i+)+(

39、i+); tc2.0 vc6.0+: i=6 j=9tc3.0+: i=6 j=12若仍然i=3;cout<<(i+)+(i+)+(i+); cout<<i; /不能在上一行直接输出i,否则自右向左解释输出表达式的值是9,i的值是6,都遵从“先用后增”的原则,采用printf也是如此,但是如果在TC 2.0和tc3.0+中采用printf时将会是printf("%d",i+i+i+); i:6 j:12再分析i=3;j=(+i)+(+i)+(+i); tc: i=6 j=18 先完成i的三次增量运算,再计算三个i相加tc+: i=6 j=15 增一个

40、算一个vc+:i=6 j=16 前两个先增,后面的增一个算一个tc、tc+:printf("%d",(+i)+(+i)+(+i); i:6 j:15vc+仍然是16再如:(VC)i=3;j=(+i)*(-i); 9j=(+i)*(-i)*(+i); 364.5 表达式中各运算符的运算顺序在前面的讲述中已讨论,课下自己看看,并琢磨琢磨。4.6 其他具有副作用的运算符除了自增运算有副作用以外,赋值语句也有一些副作用,例如:i=3; j=(i=i+2)+(i=8);这类问题不作要求。4.7 问号表达式和逗号表达式1.条件运算符1)结合性问题教材中为右结合性,实际上为左结合性。in

41、t i=4,j;j=i+>3?i+>4?'L':'R':'N'2)和+运算合作问题ch=a+<atc2.0 vc6.0+: 0tc3.0+: 1在关系表达式中出现时,c,vc中视整体为一个表达式。tc+视关系运算符两侧各为表达式ch=a+<a?'Y':'N'tc2.0 tc3.0+: Y(1)vc6.0+: N(0)当关系式出现在条件运算符的第一个表达式中时,关系运算符两侧各为一个表达式。tc和tc+都是如此(tc+是统一的)。但vc+仍然视为一个表达式。2.逗号表达式格式:用逗号将多个表达

42、式连接起来的式子。计算:按先后顺序逐个计算,整个逗号表达式的值是逗号表达式中最后一个表达式的的值。(一定要注意运算符的优先级)4.8 类型不同数据之间的混合算术运算c语言系统类型转换有两种形式1.隐式转换在计算过程中系统会根据需要自动进行转换,如计算时的转换、赋值转换等。2.显式转换格式:(类型名)变量名 或(类型名)(表达式)说明:类型的强制转换只能转换表达式的值的类型,不能转换变量的类型。变量的类型是不可能被转换的。4.9 运行错误的判断与调试4.10 基本调试手段4.11 注释号在调试中的作用4.12 条件编译格式:#if <条件> #ifdef #ifndef #else

43、#endif第五章 函数教学目的:熟练掌握+函数的编写和调用方法,以及内联函数、函数重载和递归函数的概念。重点:+函数的编写和调用方法难点:函数重载和递归函数5.1 函数的定义1.函数的格式存储类别 函数类型 函数名(形式参数表)函数体2.函数的类别性质:标准库函数,用户自定义函数构成形式:有参函数,无参函数3.基本性质有且只有一个主函数。函数之间为平行关系,没有位置的要求。函数定义不能嵌套(调用可以嵌套)。除了main函数,任何一个函数都不能独立地在程序中存在。4.说明:函数类型规定了函数返回值的类型。函数的返回值需要一个存储空间来存放,函数类型决定了这个空间的大小与格式。因此当返回值的类型

44、与函数类型不一致时,存在一个自动的类型转换问题,可以理解为:函数(变量)返回表达式。如果一个函数不需要返回值,通常将其定义为void,此时系统不为函数开辟存放函数返回值的空间。return语句的作用:返回主调函数、将返回表达式的值写入函数类型空间(参考赋值运算的作用)。对于void类型函数,仍然可以使用return语句,但是后面不能跟任何的表达式,return语句仅起到返回主调函数的作用。5.2 函数的调用1.格式表达式语句函数实参2.调用形式嵌套调用与递归调用3.说明主调函数调用被调用函数后,主调函数被压入堆栈,调用被调用函数的程序代码,当被调用函数执行完毕,主调函数从堆栈中弹出,继续执行主

45、调函数中的下续语句。因为这个原因,被调用函数并不能直接访问主调函数中的各个变量。5.3 函数原型1.调用原则任何被调用函数必须在主调函数调用前进行声明。函数声明也就是函数原型。2.函数原型格式:<函数类型> 函数名(<函数参数>);说明:函数声明是一个完整的函数首部+“;”与函数相比,只是缺少函数体。3.声明的形式被调函数在主调函数前定义。此时函数定义和函数声明为一体。在主调函数中对被调函数进行声明。在主调函数前,对被调函数进行全局声明。特例:c语言中函数类型为int型时可以不声明。(c+中必须声明)说明:当函数定义与函数声明分开时,函数声明中必须有形参类型,形参名可以

46、省略,函数定义中c+不可省略函数参数(c中可省)。c中函数类型为整型时可以省略函数声明。float max(float,float);void main()cout<< max(42,21);float max(float x,float y) return (x>y?x:y);5.4 函数间的参数传递5.4.1 值调用1.形参与实参的关系过程:实参向形参传递数据。传递数据时,首先为形参开辟相应的存储空间,然后计算实参的值,然后将实参的值写入形参的空间中。可以理解为相当于执行了一个赋值操作:形参实参,所以形参必须是个变量,而实参则可以是一个表达式。2.值传递与址传递通常将实参

47、对形参的数据传递分为数值传送(值传送)和地址传送(址传送),但c语言中可以理解为都是值传送。对于址传送而言,由于此时的形参是存储地址的量,实参的计算结果是个地址值,所以传送的是地址。3.举例swap()函数5.4.2 引用调用1.引用格式:类型 &引用名;例:int i,&yy=i;说明:引用的定义类似一个指针变量,指针变量的特征符号是*,而引用的特征符号是&。引用只能在定义时建立和变量的对应关系,在程序中不允许再次建立关系。举例:int i,j,&yy=i,*p;i=3;j=4;p=&i;cout<<i;cout<<yy;cou

48、t<<*p;p=&j;cout<<*p;yy=j;(错误)概念:引用是为一个量规定一个别名。说明:引用一般不在程序中使用,主要在参数传递中应用。2.引用作为函数参数引用形参:函数定义的参数表中,名字前面加上符号&的参数为引用形参。说明:引用的实参必须是同种类型的变量,不能是表达式。实参传递给引用形参的是实参的地址。引用是常值地址(借用这个概念,这里主要强调的是该值不允许改变,与教材中的常值指针变量意义不同)。引用没有相应的存储空间,函数中对形参的访问,实质上是对实参空间的访问。使用引用时,与使用变量相同,不需要加引用符。函数执行完毕,引用和实参的对应关系

49、即中止。引用的主要用途是将实参的地址传给形参,而且不允许改变形参的指向。举swap的例子5.5 函数重载1.问题的提出具有相似作用的函数,由于一些细小的差别,不得不定义很多函数。如绝对值函数。2.函数重载定义同名且功能相仿的函数。函数重载实际上是函数名重载,即支持多个不同的函数采用相同的名字。3.重载条件参数表中对应的参数类型不同。int max(int,int) float max(float,float)参数表中参数的个数不同。int max(int,int,int) int max(int,int)参数表中不同类型参数的次序不同。float max(float,int) float ma

50、x(int,float)4.重载的匹配函数重载要求编译器能够唯一地确定调用一个函数时应具体执行哪个函数的代码。当调用重载函数时,系统如何确定应当调用哪个函数呢?匹配原则:按照参数类型严格匹配通过内部类型转换寻求匹配通过用户定义的转换进行转换寻求匹配(用户定义转换不讨论)5.说明仅仅函数类型不同不能重载。int max(int,int) float max(int,int)重载不能引起二义性。long max(long,long) float max(float,float)调用时max(c1,c2),字符型可以转换为整型,但是由于long不是基本类型,系统内一般不定义整型和实型的自动转换。所以

51、系统会不知道该调用哪一个函数而报错。重载体现了对多态性的支持。5.6 局部变量和全局变量1概念局部变量:在函数内部定义的变量。全局变量:在函数外部定义的变量。2.变量的作用范围局部变量:仅在定义该变量的函数内部(甚至复合语句内部)。全局变量:自定义位置以下部分的函数(暂时)。3.说明局部变量与全局变量重名时,在局部变量有效的范围内,全局变量无效。小范围的局部变量与大范围的局部变量重名时,在小范围内,大范围的局部变量无效。尽管全局变量提供了一种各个模块间相互联系的渠道,但是由于它破坏了程序的模块化结构,降低了程序的可读性,因此尽量避免使用。为了在重名的情况下能够访问全局变量,c+提供了:域作用符

52、,以访问全局变量。5.7 内联函数1.格式inline 函数2.说明内联函数的关键字必须在说明中出现,否则不会把函数作为内联函数来处理。定义中有没有inline不作为是否是内联函数的依据。内联函数的函数体必须短小(15个语句),结构简单(if的复杂嵌套、switch、循环都不行)。5.8 带有默认参数的函数c+允许在声明或定义函数时给形参预赋默认值,调用有默认值的函数时如果给实参,则实参传递给形参,如果不给实参,则以默认值为实参值。说明:1.默认值只能自右向左给出。2.声明与定义分开时,只能在声明中指定默认值,定义中不能有默认参数。3.既有默认参数,又有函数重载时,注意不要产生二义性。例如:m

53、ax(int a,int b) max(int a,float b=4) max(float a=3,int b=4)5.9 C+的库函数5.10 函数模板讲完类后再讲5.11 变量的存储类别局部量的存储属性:static auto全局量的存储属性:static externstatic,extern为静态区,auto为动态区区别:时机。动态区数据的初始化在运行时完成,静态区数据在编译时完成。初值。没有初值时,动态区仅分配存储空间,变量的值为随机数,静态区变量自动初始为0。生命期。动态区变量的生命期同它所在的函数,静态区变量的生命期为整个程序的生命期。初始化次数。动态区变量每执行一次,则初始化

54、一次,静态区变量仅在程序执行前初始化一次。全局变量的存储类别问题:(1)全局变量的缺省类别为extern(函数的缺省类别也是extern)(2)全局变量的类别为static时只能被本文件的函数访问,为extern时可以被所有文件的函数访问。(3)访问本文件的全局变量:若全局变量在函数前面定义,不需声明,否则必须声明(加extern,无论该全局变量为什么类别)。(4)访问其它文件中的全局变量也必须进行声明。注意:若使用多文件的全局变量,此时定义位置不能随便使用extern,否则系统搞不清楚哪个是定义(有初值),哪个是声明(无初值)。例:静态局部量与动态局部量的区别main() int k=4,m

55、=1,p; p=func(k,m); printf("%d,",p); p=func(k,m); printf("%dn",p);func(int a,int b)static int m=0;int i=2;i+=m+1;m=i+a+b;return(m); 输出结果8,165.12 Develooper Studio的跟踪调试功能第六章 指针教学目的:理解和掌握指针的基本概念,以及指针型变量的声明方法、怎样通过指针类型的变量去访问某个变量或数组元素的值;引用的概念和用法。重点: 指针的使用方法难点:指针与数组和函数理解和掌握指针的基本概念,以及指针型变量的声明方法、怎样通过指针类型的变量去访问某个变量或数组元素的值;引用的概念和用法。6.1 指针与地址6.1.1 地址1.概念地址:存储空间的编号。变量名:地址空间的符号地址。2.表示地址的量变量的地址:可以通过运算符获取&a。数组名:数组所占据连续空间的起始地址。函数的入口地址:函数名隐含了两个地址,一个是函数的入口地址,一个是函数存储数据的存储地址。6.1.2 指针1.概念指针:即地址,C语言中对于地址的一种称呼方式

温馨提示

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

评论

0/150

提交评论