声明 使用本课件至少128M内存,并使用office 2000以上版本或使用自带播放工具pptview。 使用本课件请配合选用人民邮电出版社出版 的《c/c++程序设计教程》。 如有任何意见和建议请发电子邮件件到 guoxiaogang5381@sina.com或 fengwork.student@sina.com
第一章 绪 论 七、函数初步 八、C/C++程序上机步骤简介
七、函数初步 C/C++程序通过函数运转,函数操作数据和变量。 程序根据源代码出现的先后次序一个一个语句地顺序往 后执行,称为顺序流程结构。 遇到函数调用则流程转入被调用的函数体,然后从被调 函数返回,执行函数调用的下一条语句。 在编辑输入上面的代码时请注意: 新的集成开发环境支 持汉字出现在字符串中,但汉字环境的标点符号与英文环境 的标点符号其编码是不一样的,因此在字符串之外的标点符 号一定要保证在英文环境中输入,否则导致源代码的语法错 误。
#include<stdio.h> //void型函数vf的定义,放置于主控函数前 void vf (int x, int y, int s) // void表示函数没有返回值,形参x,y,z是int型的变量 { printf ("%d, %d\n", x+y, s);} //花括号包含的语句表示函数体 int Add (int ,int ); //Add函数原型说明,表示入口形参为2个int型数据,返回int型数据 void Show() //圆括号中一无所有表示入口无参,void Show()相当于 void Show (void) { printf ("输入两个整数\t"); }
sum = Add (i, j); /*函数调用求和*/ printf ("Sum is %d\t", sum); /*屏幕上显示出和*/ int main (void) //圆括号中的void表示main函数此时没有入口参数,返回int型数据 { int i, j, sum; /*变量定义语句*/ Show () ; /*提示输入两个整数*/ scanf ("%d, %d", &i, &j); /*读入整数分别给变量j,k*/ sum = Add (i, j); /*函数调用求和*/ printf ("Sum is %d\t", sum); /*屏幕上显示出和*/ vf (i, j, Add (i, j)); //vf(i,j,Add(i,j))等价于vf (i, j, sum); return 1; /*返回信息给操作系统是好的编程风格*/ }
int Add (int l, int m) /*定义Add函数,函数的返回类型为整型*/ { /*入口参数 l,m是整型*/ return l+m ; /*直接返回l,m数的和*/ } // 函数调用Add(i,j)根据返回类型确定为int型的表达式 执行程序得到: 输入两个整数 5,6 Sum is 11 11,11
在编辑输入上面的代码时请注意,新的集成开发环境支 持汉字出现在字符串中,但汉字环境的标点符号与英文环境 的标点符号其编码是不一样的,因此在字符串之外的标点符 号一定要保证在英文环境中输入,否则导致源代码的语法错 误。 本程序包括用户定义的函数:主函数main()和普通的函 数Add以及vf。另外借用了系统提供的库函数。 在"stdio.h"给出了标准输入函数scanf标准输出函数 printf的原型说明。 Add函数的作用是求两个整型变量的和,return关键字 所引出的语句将整型变量l和m的和返回给主函数main,返 回值是通过函数调用的方式进行的。
程序主要包括如下6个步骤: 1. 变量的定义 2. 变量的初始化过程 3. 用户与计算机实时交互 4. 算法的模块化处理函数 5. 函数调用的虚实结合匹配 6. 控制权的带信息返回
C/C++程序设计中变量必须明显地定义才能使用,这 一点区别于FORTRAN语言存在变量的隐含说明。 语句"int i, j, sum; "称为变量定义语句,"int"是系统保 留的关键字,"i, j, sum"则是用户引入的变量,变量定义语 句通知编译器为这些变量分配内存空间。 对引入的变量赋予初值,称为变量的初始化。变量初始 化的位置和时刻是灵活的,变量的初始值可以位于本程序段 内、硬盘上或动态交互输入。 函数调用的虚实结合匹配是指函数定义部分的形参与函 数调用时的实参一对一的呼应和结合过程,这一过程涉及到 语言隐含的函数调用机制。
C语言中的函数调用机制为变量的数值传递,因此虚实 结合匹配的时候采用了一个中转站这就是变量的地址。 通过中转站间接的完成被调函数对变量的赋值或改变。 输入语句"scanf ("%d, %d", &i, &j); "在屏幕上读变量i 和j的值,变量i和j之前分别加上了取地址运算符&。 而输出语句"printf ("Sum is %d\n", sum); "的变量 sum前则没有取地址运算符&。 "%d, %d"是输入输出的格式化字符串,用来指示输入 输出的数据类型和格式转换,"%d"表示十进制整数类型, 有了这种格式化转换函数,系统就把内存中的二进制数 据转换成用户可理解的数据类型。
函数是重要的编程手段,其中包括三个相关的 步骤: 1. 函数具体定义 int Add (int l, int m) {return l+m; } //l, m是形参, 2. 函数原型说明 int Add (int l, int m); //形参的初始值在虚实结合时得到 3. 函数调用虚实结合匹配 sum = Add (i, j); //i, j是匹配形参l, m的实参
函数定义对应函数的某种执行动作,函数定义由标题头 和函数体构成,标题头由返回类型、函数名和形参列表构 成。 例如: int Add (int l, int m)是标题头,{return l+m; }是函数体 函数原型表明函数的接口要求,虚实结合匹配在函数调 用点进行,函数调用时将实参i, j 的值赋值给相应形参l, m; 相当于l=i, m=j。 函数的返回类型int与return中的表达式匹配。 一般地,C/C++程序是通过变量和函数来组织的。变量 用于识别内存的数据,函数则对这些数据进行操作和转换处 理。
图 C/C++程序的开发过程 文本编辑器 修改当前 的源文件错误 解决各文件 名称唯一性或遗漏 排除逻辑错 误或越界、 内存冲突等 源文件1.cpp 头文件2.h 头文件1.h 源文件2.cpp 预处理器 编译器 目标文件1.obj 目标文件2.obj 编译错 连接器 库文件.lib 其它目标文件.obj 执行程序.exe 连接错 运行错 成功!! 图 C/C++程序的开发过程
一般地,C/C++程序是通过变量和函数来组织的。变 量用于识别内存的数据,函数则对这些数据进行操作和转换 处理。函数根据返回类型是否有值分两类,其定义格式分两 种: 1. 不返回值的函数,称为void型的函数 void vf (类型1 形参1,类型2 形参2,.…,类型n 形参n) { 语句序列; return; //函数体 } 例: void vf (int x, int y, int s) { printf ("%d, %d\n", x+y, s);
2. 返回确定类型值的函数 type f (T1 v1, T2 v2 ,..., Tn vn) {/*返回类型 函数名(形参列表)*/ 语句序列; return expre; } 例: int Add (int l, int m) { int z=l + m; return z; type表函数的返回类型,T1,T2,Tn表示形参的类型名, 它们可以是int,double 以及结构名等; f, vf, Add是函数名。
"返回类型 函数名(形参列表)" 称为函数定义的标题 头,标题头圆括号中形参类型后的参数 v1,v2,...,vn为形式 参数,简称形参。 类型名、函数名和形参名遵循标识符的命名约定。将标 题头拷贝过来,末尾添一个分号得到函数原型,其中的形参 v1,v2,....,vn可省略,格式为(左边为抽象的原型描述,右边 为具体的举例): type f (T1 v1,T2 v2 ,...,Tn vn); int Add (int , int); 函数的标题头和函数体构成函数定义,紧接着右圆括 号”)”的最外层花括号{}包含的部分为函数体。 函数体由若干语句构成,也可以根本没有语句,此时 称为空函数。
函数定义时标题头的形参可以省略而仅有类型,此时表 示函数简单的提供一个接口准备。 也可以根本没有入口参数。 例如: void Show () {printf ( "输入两个整数\t"); }。 expre是可以转换为 type类型的表达式。type如果是 int,则函数运算的结果返回int型整数。 形参是入口,可以是各种类型的变量,也可以是指向这 些变量的指针。 函数返回的数据为出口,函数可以返回变量,也可以返 回指针,指针是特殊的变量。
如果return之后跟随表达式语句,表示将表达式的值转 送给上层函数,此时函数返回确定类型的数据。 如果return 语句之后紧贴一个分号或函数体中无return 语句,这样的函数的返回类型则写为void,表示函数不返回 值而仅执行特定的运算或动作。 函数调用点实际代替形参的变量或表达式称为实际参 数,简称实参。实参是调用段可以求值的表达式。 函数调用由函数名、圆括号对和逗号依次分隔开的若干 实参构成。函数名与圆括号对是必不可少的,在无参调用时 没有实参。 例如: Show();
函数调用就是用具体的实参代替形参的过程,实参x1, x2,…,xn应与形参列表的形参v1,v2,....,vn在位置、类型和个 数上一一匹配。 实参是形参的数据来源,是形参的初值。 在函数调用点相当于执行了v1=x1,v2=x2,....,vn=xn的 初始化赋值运算。 不返回值的函数vf单独调用 : vf (x1, x2, ...., xn); 例: vf (i, j, sum); vf (i, j, Add ( i, j )); void类型的函数一般仅独立调用,由此构成函数调用 语句。
返回值的函数调用是表达式,简称函数调用是表达式。 返回值的函数调用归属于表达式,可以说C/C++语言是一种 构筑于表达式之上的语言。 表达式是求值的基本单位,变量和常数是最简单的表达 式。变量和常数与运算符的组合可构成复杂的表达式。 例如: l+m, sum=Add (i, j), 7+m/2*3 是表达式。 表达式之后加一个分号形成表达式语句,例如: sum=Add (i , j); 是表达式语句。可多次在赋值运算符 = 左边出现的表达式 是左值表达式,否则是右值表达式。变量是左值,常数是右 值。Add (i, j) 是右值。
返回值的函数调用f (x1, x2 ,.…, xn) 携带 "return expre;"返回的值。表达式expre能够出现的地方, f (x1, x2, …., xn)几乎可以等价的出现。 但C语言返回算术表达式或返回指针表达式的函数调用 构成右值。C++增添了返回左值的函数调用,这才是全部等 价的映射。 出现在函数体中函数调用里的函数名视为被调函数,函 数体所隶属的函数名则称为主控函数。如函数名Add出现在 main函数体中,因此Add函数是main函数的被调函数, main函数是Add函数的主控函数。 如果Add函数体中调用其它的函数如add1,则Add函 数是add1函数的主控函数。
C++中函数调用可以出现在main函数体之外的初始化 语句,此时函数被系统直接调用。主控函数也称为主调函 数。 函数定义或函数原型引入或说明函数名称。函数定义提 供函数体中的执行代码。C/C++中函数名具有全局作用范 围。 函数体中不能定义函数,仅在函数体外定义函数。每一 个函数定义是独立的,函数的定义次序不影响函数调用。 函数可以调用任何函数包括自身。函数调用索引函数名称。 名称先说明后索引。C++中每个函数调用都必须有一个 函数原型,除非函数定义直接放置于主控函数前。
八、C/C++程序上机步骤简介 本节简单介绍用Microsoft Visual C++提供的开发工具 生成console即字符方式的应用程序,如果使用其它厂商的 编译器,细节会略有不同,但编辑、编译、连接和运行的四 个步骤是必不可少的。 可以一气呵成地执行整套动作,也可以选择性地实施其 中一个环节下面简要地说明程序产生的步骤(以微软的 Developer Studio集成应用程序为例): 1. 启动Microsoft Visual C++编译系统 2. 从菜单上选择File->New,或按Ctrl+N打开New对话框
3. 选取或激活New对话框的Projects工程项目,以便. 生成. dsw(Developer Studio workspace)文件。 4. 进一步鼠标点击程序类型 Win32 Console Application,在Project name下键入工程 名如:dosApp1,将该工程文件置于一合适的磁盘路径 Location下,如: c:\mydoc\dosApp, 最后单击New对话框的OK按钮。此时弹出一个对话框。 5. 在四个选项中单选 An empty project ,然后点取 Finish按钮,在弹出的信息对话框中,鼠标点击OK按钮。 到此系统生成并打开一个新项目工作区。
6. 从菜单上选择File->New,或按Ctrl+N打开New对话 框。 7.激活New对话框的Files标签,选择 C++ Source File,在File name下的空白处键入源文件名如: example1,鼠标点击OK按钮。此时进入全屏幕编辑环境, 用户可输入源程序。 8.从菜单上选择Build->compile 即可编译源程序,或 Build->Build直接生成执行程序。 9. 调试程序直到没有编译或连接错误。 10. 直接在集成环境按Ctrl+F5执行该程序且按任意键通 常方便的是空格键结束程序。
请打开“第2章(1).ppt”