求两个高级会计师选做题题,用C++语言

&&&&C++程序设计学习与实验指导(普通高校本科计算机专业特色教材精...
自营订单满49元(含)免运费
不足金额订单收取运费5元起
邀请好友参加吧
开 本:16开纸 张:胶版纸包 装:平装是否套装:否国际标准书号ISBN:9所属分类:&&&
下载免费当当读书APP
品味海量优质电子书,尊享优雅的阅读体验,只差手机下载一个当当读书APP
本商品暂无详情。
当当价:为商品的销售价,具体的成交价可能因会员使用优惠券、积分等发生变化,最终以订单结算页价格为准。
划线价:划线价格可能是图书封底定价、商品吊牌价、品牌专柜价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品曾经展示过的销售价等,由于地区、时间的差异化和市场行情波动,商品吊牌价、品牌专柜价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:折扣指在划线价(图书定价、商品吊牌价、品牌专柜价、厂商指导价等)某一价格基础上计算出的优惠比例或优惠金额。如有疑问,您可在购买前联系客服咨询。
异常问题:如您发现活动商品销售价或促销信息有异常,请立即联系我们补正,以便您能顺利购物。
当当购物客户端手机端1元秒
当当读书客户端万本电子书免费读当前位置: >>
C++实验指导书(完整版)
C++上机实验指导书 (2015 版)南阳理工学院 软件学院 编制 2015 年 3 月 C++上机实验指导书-----软件学院[2015 版]前言《C++程序设计》是软件工程、网络工程等相关专业最重要的一门专业基础 课程,内容庞大,涉及面广,知识点多,涵盖“过程化设计”、“面向对象程序设 计”二大部分,其中过程化程序设计使用的是功能抽象,而面向对象程序设计不 仅能进行功能抽象,而且能进行数据抽象。“对象”和“类”是 C++语言的基础,数 组、 指针、 类和多文件结构的使用是编程的核心技术。 因而教、 学难度都非常大, 往往费了大量时间而达不到预期教学效果。俗语说:学习的最好方法是实践。本 实验课程正是基于此,力求为学生提供一个理论联系实际的机会,通过实践,锻 炼编写程序、调试程序的能力,学习报告编写规范,培养独立学习的习惯,帮助 学生从全局角度把握课程体系, 提高学生实际动手能力,完成“知识+实践=技能” 的整个学习过程。 本指导书提供了六个实验项目,前三个主要覆盖过程化设计部分 ,后三个则 .............. .... 侧重于面向对象设计体系 。 前三个实验为小型训练题目,后三个实验为大型综合 ........... 实验。任课教师在实际使用时,根据具体的教学大纲要求,有目的地选择实验项 目,未选做部分可作为学生课后提高的练习题。 本书的前三个实验内容涉及四个部分,即“实验目的和要求”、“实验设备及 分组”、“实验内容和步骤”、“课后作业”等。其中“实验内容和步骤”中又设立二个 模块:“验证分析程序”和“完成实验项目”模块。“验证实验程序”模块中针对该次 实验的具体要求与实验的目的,列了一些典型的例题,并给出了详细的解法,有 时故意留了一些漏洞,提了一些问题,帮助同学们理解要掌握的内容。“完成实 验项目”模块要求同学们在读懂、验证过例题之后,独立完成题目要求,写出代 码,调试通过。“课后作业”部分的题目留作同学们自行练习,可以作为理论课作 业或课堂提问。其中打“*”的为选做题,教师可根据实际情况自行选择。 本实验课程的主要成果之一就是实验报告,要严格按照附录 C 中的格式书 写,内容详实,实验数据的采集要准确合理,实验结果的分析及时、全面。I C++上机实验指导书-----软件学院[2015 版]目 录前 言.................................................................................................................... I 实验一 C++开发环境及流操作实践 ........................................................................ 1一、实验目的和要求............................................................................................................... 1 二、实验设备及分组............................................................................................................... 1 三、实验内容和步骤............................................................................................................... 1 四、课后作业........................................................................................................................... 7实验二 数组与结构体................................................................................................ 8一、实验目的和要求............................................................................................................... 8 二、实验设备及分组............................................................................................................... 8 三、实验内容和步骤............................................................................................................... 8 四、课后作业......................................................................................................................... 12实验三 函数重载...................................................................................................... 13一、实验目的和要求............................................................................................................. 13 二、实验设备及分组............................................................................................................. 13 三、实验内容和步骤............................................................................................................. 13 四、课后作业......................................................................................................................... 18实验四 C++函数使用实践 ...................................................................................... 19一、实验目的和要求............................................................................................................. 19 二、实验设备及分组............................................................................................................. 19 三、实验内容和步骤............................................................................................................. 19 四、课后作业......................................................................................................................... 19实验五 类和对象...................................................................................................... 20一、实验目的和要求............................................................................................................. 20 二、实验设备及分组............................................................................................................. 20 三、实验内容和步骤............................................................................................................. 20 四、课后作业......................................................................................................................... 20实验六 继承与多态.................................................................................................. 21一、实验目的和要求............................................................................................................. 21 二、实验设备及分组............................................................................................................. 21 三、实验内容和步骤............................................................................................................. 21 四、课后作业......................................................................................................................... 21附录 A Visual C++6.0 简介 ..................................................................................... 22 附录 B C/C++常用函数...................................................................................... 38 附录 C 实验报告格式....................................................................................... 75II C++上机实验指导书-----软件学院[2015 版]实验一C++开发环境及流操作实践一、实验目的和要求1. 学习 VC++6.0 集成环境,掌握源程序编辑方法; 2. 掌握在 VC++集成开发环境中编译、调试与运行程序的方法; 3. 通过运行简单的 C++程序,初步了解 C++源程序的特点; 4. 熟练掌握基本的数据类型、基本的算术运算符和表达式; 5. 掌握基本的输入、输出方式及流操作。二、实验设备及分组1. Windows XP 以上操作系统; 2. Visual C++ 6.0 语言环境; 3. 每人一台 PC 机。三、实验内容和步骤(一)C++程序的开发步骤C++语言是一种编译性的语言,设计好一个 C++源程序后,需要经过编译、连接、生成 可执行的程序文件,然后执行并调试程序。一个 C++程序的开发步骤可分成如下几个步骤: (1)分析问题。根据实际问题,分析需求,确定解决方法,并用适当的工具描述它。 (2)编辑程序。编写 C++源程序,并利用一个编辑器将源程序输入到计算机中的某一 个文件中。文件的扩展名为.cpp。 (3)编译程序。编译源程序,产生目标程序。文件的扩展名为.obj。 (4)连接程序。将一个或多个目标程序与库函数进行连接后,产生一个可执行文件。 文件的扩展名为.exe。 (5)运行调试程序。运行可执行文件,分析运行结果。若有错误进行调试修改。 在编译、连接和运行程序过程中,都有可能出现错误,此时要修改源程序,并重复以上 过程,直到得到正确的结果为止。(二)C++程序上机操作方法Visual C++6.0 系统包含了许多独立的组件,如编辑器、编译器、调试器以及各种各样 为开发 Windows 环境下的 C++程序而设计的工具。其中最重要的是一个名为 Developer Studio 的集成开发环境(IDE) 。Developer Studio 把所有的 Visual C++工具结合在一起,集 成为一个由窗口、对话框、菜单、工具栏、快捷键及宏组成的和谐系统,通过该集成环境, 程序员可以观察和控制整个开发进程。 使用 Visual C++6.0 调试 C++程序要经过以下几个步骤: 1. 启动 Visual C++6.0 系统 启动 Visual C++6.0 系统有很多种方法,最常见的是通过鼠标单击“开始”菜单,选择 “程序” ,选择“Microsoft Visual Studio 6.0” ,选择“Microsoft Visual C++ 6.0”启动 Visual C++6.0。如果已经在桌面上建立了“Microsoft Visual C++ 6.0”图标,则也可用鼠标双击该 1 C++上机实验指导书-----软件学院[2015 版]图标启动 Visual C++6.0。Visual C++6.0 启动成功后,就产生如图 1.1 所示的 Visual C++集成 环境。图 1.1 典型的 Developer Studio 窗口 图 1.1 显示了一个典型的 Developer Studio 主窗口。它分为几个部分:窗口顶部是菜单 和工具栏, 其中包括 “File (文件) ” 、 “Edit (编辑) ” 、 “View (视图) ” 、 “Insert (插入) ” 、 “Project (项目) ” 、 “Build(编译、连接和运行) ” 、 “Tools(工具) ” 、 “Windows(窗口) ” 、 “Help(帮 助) ”等菜单,分别对应一个下拉子菜单。左面的一个子窗口是工作区窗口,工作区的右面 是编辑子窗口。最下面是输出子窗口。 除了各种对话框外,Developer Studio 显示两种类型的窗口,即文档窗口和停靠窗口。 文档窗口是一般的带边框子窗口,其中含有源代码文本或图形文档。Window 子菜单中列出 了在屏幕上以平铺方式还是以层叠方式显示文档窗口的命令。所有其他的 Developer Studio 窗口,包括工具栏和菜单栏,都是停靠式窗口。 开发环境有两个主要的停靠窗口DDWorkspace(工作区)窗口和 Output(输出)窗口。 另外还有一个 Debugger(调试器)停靠窗口,只在调试过程中显示。 停靠窗口可以固定在 Developer Studio 用户区的顶端、底端或侧面,或者浮动在屏幕上 任何地方。停靠窗口,不论是浮动着的或是固定着的,总是出现在文档窗口的上面。这样, 就保证了当焦点从一个窗口移到另一个时,浮动的工具栏一直都是可见的。但这也意味着, 文档窗口偶尔会看起来像消失了似的。例如,如果正在文本编辑器中编辑源代码,此时打开 一个占据整个 Developer Studio 用户区的停靠窗口,源代码文档就会消失,它隐藏在新窗口 之下。解决方法是要么关了覆盖的窗口,要么把它拖到不挡眼的地方去。 值得注意的是,上述各种部件,包括子窗口、菜单栏和工具栏的位置不是一成不变的, 可以根据个人的喜好重新安排。 2. 创建项目文件 通常都是使用项目的形式来控制和管理 C++程序文件的, C++的项目中存放特定程序的 2 C++上机实验指导书-----软件学院[2015 版]全部信息,包含源程序文件、库文件、建立程序所用的编译器和其他工具的清单。C ++的 项目以项目文件的形式存储在磁盘上。图 1.2 新建项目对话框图 1.3 新建项目向导对话框 生成项目的操作步骤为: (1)选择集成环境中的“ File”菜单中的“New”命令,产生“New”对话框,如图 1.2 所示。 (2)选择对话框中的“Projects”标签,以便生成新的项目。在产生新项目时,系统自 动生成一个项目工作区,并将新的项目加入到该项目工作区中。 3 C++上机实验指导书-----软件学院[2015 版](3)在项目类型清单中,选择“Win32 Console Application”项目,表示要生成一个 Windows 32 位控制台应用程序的项目。 (4) 在 “Location” 文本框中输入存放项目文件的文件夹路径, 如 “C:\DOCUMENTS AND SETTINGS\YU YONG YAN\桌面\新建文件夹” 。 (5)在“Project Name”文本框中输入项目名。例如:Exe1_1。 (6)检查“Platforms”文件框中是否已显示“Win 32” ,表示要开发 32 位的应用程序。 (7)单击“New”对话框中的“OK”按钮。产生一个对话框向导,如图 1.3 所示。 选“An empty project” ,按下“Finish”按钮,显示验证对话框,直接按“OK”按钮, 这时就产生了一个项目文件。系统自动加上文件扩展名“.dsw” 。 3. 创建C++源程序文件并将其加入到项目文件 (1)选择“File”菜单中的“New”命令,则产生“New”对话框,如图 1.4 所示。图 1.4 新建文件对话框 (2)选择对话框中的“Files”标签。 (3)在文件类型清单中,选择“C++ Source File”项目,表示要生成一个C++源程序。 (4)在“File”文本框中输入C++源程序文件名。系统自动加上文件扩展名“.cpp” 。 例如:Exe1_1_1.cpp。 (5)若“Add to project”复选框没有选中,则单击该复选框使其选中,表示系统要将 指定的源程序文件加入到当前的项目文件中。 (6)单击“OK”按钮。这时就建立了一个新的C++源程序文件,并已加入到了当前 的项目文件中。产生如图 1.5 所示的窗口。 该窗口有三个子窗口, 左边的子窗口为项目工作区窗口; 右边的子窗口为源程序编辑窗 口,用于输入或编辑源程序;下边的窗口为信息输出窗口,用来显示出错信息或调试程序的 信息。 4. 输入和编辑源程序 在源程序编辑窗口输入例 1.1 中的源程序代码,如图 1.5 所示。 5. 保存源程序文件4 C++上机实验指导书-----软件学院[2015 版]选择“File”菜单中的“Save”命令,将源程序保存到相应的文件中。 6. 编译和连接图 1.5 Visual C++6.0 工作窗口 选择“Build”菜单中的“Compile”或“Build”命令,将源程序编译或编译连接,产生 可执行文件。系统自动加上文件扩展名“.exe” 。例如:Exe1_1_1.exe。 在编译和连接期间,若出现错误,则在信息输出窗口给出错误或警告信息。改正错误后,重 新编译或编译连接源程序,直到没有错误为止。 7. 运行 选择“Build”菜单中的“Execute”命令,则在VC++集成环境的控制下运行程序。被 启动的程序在控制台窗口下运行,与 Windows 中运行 DOS 程序的窗口类似。见下图。图 1.6 运行结果 注意:也可以单击工具栏中的“! ”按钮(BuildExecute)或者按快捷键“Ctrl+F5” ,直接 编译与运行源程序。 8. 打开已存在的项目文件 可用两种方法打开已存在的项目文件: (1)选择“File”菜单中的“Open workspace”命令,然后在弹出的对话框中选择要打 开的项目文件。 5 C++上机实验指导书-----软件学院[2015 版](2)选择“File”菜单中的“Recent workspaces”命令,然后再选择相应的项目文件。特别提醒:在调试一个应用程序时,Visual C++集成环境一次只能打开一个项目文件。当一个程序调试完成后,要开始输入另一个程序时,必须先关闭当前的项目文件,然后为新 源程序建立一个新的项目文件。否则将出现不可预测的错误。 关闭当前的项目文件的方法是:选择“File”菜单中的“Close workspace”命令。 9. 退出 Visual C++集成环境 选择“File”菜单中的“Exit”命令,可以退出集成环境。(三)验证分析程序1.设计一个 C++程序,输出以下信息: *************** Hello! *************** 解: # include &iostream.h& main() { cout&&& ***************&&&'\n'; cout&&& Hello!&&&'\n'; cout&&& ***************&&&'\n'; } 运行结果: *************** Hello! *************** 2.设计一个程序,从键盘输入一个圆的半径,求其周长和面积。 解: # include &iostream.h& main() { float s,r; cout&&&请输入圆的半径:&&& cin&&r; s=3.14159*r*r; cout&&& 圆的面积为:& &&s&& } 运行结果: 请输入圆的半径:5 圆的面积为:78.53975(四)完成实验项目设计一个程序,从键盘输入一个小写字母,将它转换成大写字母。6 C++上机实验指导书-----软件学院[2015 版]四、课后作业熟悉 VC++6.0 集成调试环境,掌握编写简单的应用程序的步骤与方法。7 C++上机实验指导书-----软件学院[2015 版]实验二一、实验目的和要求数组与结构体1.掌握一维数组、二维数组、字符数组的定义、初始化赋值、数组元素的引用方法; 2.掌握结构体类型、结构体变量的基本概念。二、实验设备及分组1. Windows XP 以上操作系统; 2. Visual C++6.0 语言环境; 3. 每人一台 PC 机。三、实验内容和步骤(一)验证分析程序例 1:应用一维数组,对 10 个数进行冒泡排序,使其按照从大到小的顺序输出。 分析:n 个数冒泡排序的方法是将第一个数与其后面的数逐个进行比较,发现大者进行 交换,完成后最大的数就放到了第一个的位置;第二个数与其后面的数逐个进行比较,发现 大者进行交换,完成后次大的数就放到了第二个的位置;如此循环,直到第 n-1 个数与第 n 个数进行比较,发现大者进行交换。 解: #include &iostream.h& void main() { int a[10]; //A int i,j,t; cout&&&输入数据:&&& for(i=0;i&10;i++) //B { cout&&&a[&&&i+1&&&]=&; cin&&a[i]; } for(i=0;i&=8;i++) { for(j=i+1;j&=9;j++) { if(a[i]&a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; 8 C++上机实验指导书-----软件学院[2015 版]} } } cout&&&排序结果为:&&& for(i=0;i&=9;i++) cout&&&a[&&&i+1&&&]=&&&a[i]&&& &&& } 思考: ? 将 A 行改为下列程序段: int n; cin&&n; int a[n]” 观察运行结果?分析原因。 ? 将 B 行改为“for(i=1;i&=10;i++)”,观察现象。 例 2:应用二维数组打印如图 6-1 所示杨辉三角形。 分析:由杨辉三角形可以看出每行数存在以下规律:每行数据的个数与行序相同;每行 的第一个数和最后一个数均为 1;中间的数为上一行同一列的数和其前一列的数之和。 解: 1 #include &iostream.h& 1 1 void main() 1 2 1 { 1 3 3 1 int y[5][5]; 1 4 6 4 int i,j,n=5; 1 for(i=0;i&n;i++) 图 6-1 杨辉 三 { 角形 y[i][i]=1; y[i][0]=1; } 1 for(i=2;i&n;i++) 1 1 { 1 2 1 for(j=1;j&i;j++) y[i][j]=y[i-1][j-1]+y[i-1][j]; } cout&&&杨辉三角形:&&& for(i=0;i&n;i++) { cout&&& &; for(j=0;j&=i;j++) cout&&y[i][j]&&& &; cout&& } } 思考: ? 添加语句输出如图 6-2 所示杨辉三角形。 例 3:用三种方式定义职工、学生、日期等结构体变量。 解: 9 1图 6-2 角形 杨辉 三1 3 3 1 1 4 6 4 C++上机实验指导书-----软件学院[2015 版]# include &iostream.h& # include &string.h& struct employee //定义职工结构体数据类型 { //职工编号 char name[8]; //职工姓名 char addr[40]; //家庭地址 }; struct student //定义学生结构体数据类型 { //学号 float eng,phy,math, //英语、数学、物理成绩、平均成绩 } stu1,stu2; //定义结构体同时定义结构体变量 stu1、stu2 void main () { employee emp1,emp2; //定义 employ 类型的结构体变量 emp1、emp2。 struct { int year,month, } date1,date2; //直接定义日期结构体类型变量。 emp1.no=100; //赋职工号 strcpy ( emp1.name, &zhang sa&); //赋职工姓名 strcpy( emp1.addr, &Nanging&); //赋家庭地址 emp2=emp1; //将职工 emp1 的信息赋给 emp2 cout&&&no=&&& emp2.no&&'\t' //输出职工信息 &&&name=&&& emp2.name&&'\t' && &addr=&&& emp2.addr&& stu1.no=101; //输入学号与成绩 stu1.eng=90; //输入成绩 stu1.phy=95; stu1.math=100; cout&&&eng=&&&stu1.eng&&'\t' //输出学生成绩 &&&phy=&&&stu1.phy&&'\t' &&&math=&&&stu1.math&& date1.year=1999; //输入入学日期 date1.month=09; date1.day=01; cout&&&year=&&&date1.year&&'\t' //输出入学日期 &&&month=&&&date1.month&&'\t' &&&day=&&&date1.day&& } 例 4:编写程序完成一名职工的姓名、出生年月、奖惩、基本工资的初始化。从键盘输入奖 金金额,输出对应职工的姓名、工龄、奖惩、领取金额等信息。 分析:姓名、出生年月、奖惩、基本工资为不同的数据类型,组成一个有机整体,可以 10 C++上机实验指导书-----软件学院[2015 版]用结构体进行处理,其中出生年月也用结构体来定义。 解: 一个完整的参考程序如下: #include&iostream.h& struct Date { }; struct Person { char name[20]; D char award[20]; }p={&南苯&,{1966,10},&五一劳动奖章&,896,0}; void main() { cout&&p.name&&&,&&&p. cout&&&,基本工资:&&&p.money&&endl&&&请输入奖金金额:&; cin&& p.salary= p. money+ cout&& p.name &&&,年龄&&&2003- p. birth. cout&&&,应领&&& p.salary&&&元&&& } 思考: ? 删去 A 行的“;”号,运行程序,观察结果,分析原因; ? 修改程序,将结构体变量的定义放在 main()函数内,再运行程序,观察结果,分析 原因; ? 修改程序,将结构体类型定义保存为头文件 Person.h,采用#include 命令实现本程 序的功能。 ? 修改程序输出三名职工的姓名、工龄、奖惩、领取金额等信息。 //A(二)完成实验项目某班有 10 个学生,进行了“数学”、“语文”、“英语”、“C++语言”等科目的考试,编 写程序: (1) 将考试成绩输入一个二维数组; (2) 求每门课的平均成绩、 每门课的不及格学生的人数及每门课的最高分与最低分; (3) 求每个学生的平均成绩、总分、不及格门数; (4) 按学生平均成绩的高低排序并输出。 2. 定义一个学生成绩结构体类型,包含“学号” 、 “姓名” 、 “性别” 、 “年龄” 、 “班级” 、 “英语” 、 “数学” 、 “物理” 、 “总分” 、 “名次”等信息。编写 6 个函数分别用于: 1. 11 C++上机实验指导书-----软件学院[2015 版](1) (2) (3) (4) (5) (6)使用结构体数组,输入全班 10 名学生的上述信息; 计算每一个学生的总分、平均分; 计算每一门课程的平均分; 查找成绩有不及格的学生信息; 按学生成绩总分降序排序; 输出全班学生的学号、总分及名次。四、课后作业1. 设 A、B、C 为 m 行 n 列矩阵。设计矩阵加法程序,能完成 C=A+B 的操作。m 与 n 用 define 定义为常量,其值由用户自定义。 2. 撰写实验报告。12 C++上机实验指导书-----软件学院[2015 版]实验三一、实验目的和要求函数重载1. 了解函数的定义方法,理解函数的调用; 2. 初步掌握函数的递归、嵌套调用; 3. 了解函数调用的实参与形参的传递,以及参数默认值的设置。 4. 学习并了解重载函数、内联函数的基本概念。二、实验设备及分组1. 2. 3. Windows XP 以上操作系统; Visual C++6.0 语言环境; 每人一台 PC 机。三、实验内容和步骤(一)验证分析程序例 1:编写一个函数,用递归的方法求 1+2+3+4+?+n 的值。在主函数中进行输入输出。 解: #include &iostream.h& int fun(int n) { if(n&=0) z=0; else z=n+fun(n-1); return(z); } void main(void) { int x, cout&&&请输入 X 的值&&& cin&&x; sum=fun(x); cout&&&求和结果为:&&&sum&& } 运行结果: 请输入 X 的值 10 求和结果为:5513 C++上机实验指导书-----软件学院[2015 版]例 2:编写程序,输入 m 和 n(n&m),求 分析:已知m cn 的值。m cn ?n! m!(n ? m)!m根据公式,只要自定义一个函数计算阶乘,即可通过函数调用求出 c n 的值。 解: 阶乘函数定义如下: double fact(int k) { int p=1; if((k==0)||(k==1)) else { for(int i=1;i&=k;i++) p=p*i; } } 一个完整的参考程序如下: #include &iostream.h& double fact(int); void main() { int m,n; cout&&&please input&&& l1: cout&&&n=&; cin&&n; cout&&&m=&; cin&&m; if (n&m) { cout&&&n must bigger than m!,please reinput:&&& goto l1; } c= fact(n)/( fact(m)* fact(n-m)); cout&&&c=&&&c&& //B } double fact(int k) { int p=1; 14 C++上机实验指导书-----软件学院[2015 版]if((k==0)||(k==1)) else { for(int i=1;i&=k;i++) p=p*i; } } 思考: ? 分别输入 n=0,1,3,m=0,1,2 测试程序。 ? 试用静态存储变量设计阶乘函数。 例 3:编写程序,求两个自然数 m 和 n 的最大公约数和最小公倍数。 分析: 最大公约数就是能同时整除 m 和 n 的最大正整数,可用欧几里德算法(也称辗转相除 法)求解。应用欧几里德算法计算两个数的最大公约数的方法是:求两个数(m、n)相除 的余数 r(r=m/n m&n),当余数不为零时,m 取 n 的值,n 取 r 的值,再求两个数相除的余 数,反复进行直到余数为零,除数 n 是最大公约数。 最小公倍数=m× n/最大公约数。 解: #include &iostream.h& int fun1(int c,int d) { r=c%d; while(r!=0) { c=d; d=r; r=c%d; } } void main() { int m,n,e,d; cout&&&m n=&; cin&&m&&n; e=fun1(m,n); d=m*n/e; cout&&& 最大公约数为:&&&e&& cout&&& 最小公倍数为:&&&d&& } 思考: ? 输入两个数 m=36,n=24 观察程序运行结果。 15 C++上机实验指导书-----软件学院[2015 版]?用递归调用的方法实现程序编写,参考程序如下: # include &iostream.h& int fun1(int c,int d) { r=c%d; if(r!=0) { c=d; d=r; fun1(c,d); } } void main() { int m,n,e,d; cout&&&m n=&; cin&&m&&n; e=fun1(m,n); d=m*n/e; cout&&& 最大公约数为:&&&e&& cout&&& 最小公倍数为:&&&d&& }? 编写计算三个数最大公约数的程序。 例 4:分别输入整数半径和实数半径,使用函数重载计算圆的面积。 分析:由于参数只有一个圆的半径,所以只能对不同类型的参数实现重载。 解: 程序如下 #include &iostream.h& #define PI 3.14 int area(int); float area(float); void main() { int r1; cout&&&输入一个整型半径 r=:&; cin&&r1; cout&&&area=&&&area(r1)&& float r2; cout&&&输入一个实型半径 r=:&; cin&&r2; cout&&&area=&&&area(r2)&& } 16 C++上机实验指导书-----软件学院[2015 版]int area(int x) { return PI*x*x; } float area(float x) { return PI*x*x; } 思考: ? 编写重载函数实现对两个整型数、三个整型数、两个实型数、三个实型数等求最小 值。 例 5:使用内联函数计算长方形的面积。 分析:C++编译器在调用遇到内联函数的地方,会用函数体中的代码替换函数。 解: 一个完整的内联函数参考程序如下: #include &iostream.h& float s(float x,float y); void main() { float a,b; cout&&&Input two float a,b=&; cin&&a&&b; cout&&&s=&&&s(a,b)&& } inline float s(float x,float y) { return x*y; } 思考: ? 将程序中的内联函数进行代码替换,并上机运行,观察结果。(二)完成实验项目1.编写函数求:1?1 2?1 3?1 4?1 5?1 6?1 7???1 n2.用函数调用方法打印九九表乘法。 3.以下函数是用递归方法计算 x 的 n 阶勒让德多项式的值。已有调用语句“p(n,x); ” , 编写 poly 函数。递归公式如下:17 C++上机实验指导书-----软件学院[2015 版]4.已知f ( x) ? cos(x) ? xx 的初始值为 3.14159/4,用牛顿法求解方程 f ( x) ? 0 的近似解,要求精确到 。f ( x) 的牛顿法迭代公式如下:xn?1 ? xn ?cos(xn ) ? xn sin(xn ) ? 1四、课后作业1. 定义子函数如下: sum(int x,int y) { return x+y; } 编写程序使用调用语句 sum()、sum(4)和 sum(5,7)分别对带默认参数值的函数 sum 进行调用。sum 函数声明如下:sum(int x=1,int y=2)。 2. 撰写实验报告。18 C++上机实验指导书-----软件学院[2015 版]实验四一、实验目的和要求1. 2. 3.C++函数使用实践熟练掌握 C++语言的基本知识和技能; 熟练掌握 C++函数的设计方法; 能够利用所学的基本知识和技能,解决简单的程序设计问题。二、实验设备及分组1. Windows XP 以上操作系统; 2. Visual C++6.0 语言环境; 3. 每人一台 PC 机。三、实验内容和步骤设计一个程序,用来实现帮助小学生进行算术运算练习,它具有以下功能: (1) 提供 10 道加、减、乘、除四种基本算术运算的题目,每道题中的操作数是随机 产生的; (2) 加减是 100 以内的数;乘除为乘法表里的;被减数大于减数;除法要求能整除; 被乘数小与乘数; (若不合格重新产生) (3) 练习者根据显示的题目输入自己的答案,程序自动判断输入的答案是否正确并 显示出相应的信息。最后显示做对了几道题; (4) 每次答题要记录做错的题目,下次做题可选择上次做错的题;四、课后作业撰写实验报告。19 C++上机实验指导书-----软件学院[2015 版]实验五一、实验目的和要求类和对象5. 熟练掌握类与对象的声明和使用; 6. 掌握具有不同访问属性的成员的访问方式; 7. 熟悉各种成员函数的定义与使用; 8. 掌握类的组合使用方法。二、实验设备及分组1. Windows XP 以上操作系统; 2. Visual C++6.0 语言环境; 3. 每人一台 PC 机。三、实验内容和步骤利用点、线、面的基本知识,声明 Point,Line,Friangle,PolyAngle 四个类,完成以下功 能。 Point 类功能: (1) 移动一个点; (2) 显示一个点; (3) 可计算这个点到原点的距离。 Line 类功能: (1) 计算点到直线的距离; (2) 直线的斜率; (3) 判断两条直线的关系(平行/相交(交点坐标能够给出来并显示)/垂直); Friangle 类功能: (1) 判断三点能否构成三角形; (2) 判断三角形是等边,等腰或者是直角; (3) 计算三角形的面积。 PolyAngle 类功能: (1) 判断四点能否构成四边形,并判断其是凹的,还是凸的; (2) 判断四边形是否是等腰梯形; (3) 判断四边形是否是平行四边形,菱形; (4) 判断它是否是一个矩形; (5) 计算四边形的面积和周长。四、课后作业撰写实验报告。20 C++上机实验指导书-----软件学院[2015 版]实验六一、实验目的和要求1. 2. 3. 4.继承与多态学习定义和使用类的继承关系,定义派生类; 掌握类派生,类的成员访问权限,派生类中构造和析构的次序; 理解在类的派生中虚函数的作用; 理解并掌握利用虚函数实现动态多态性和编写通用程序的方法;二、实验设备及分组1. Windows XP 以上操作系统; 2. Visual C++6.0 语言环境; 3. 每人一台 PC 机。三、实验内容和步骤下面是相关类的继承关系树图,其中要求: (1) 发挥你的想象力,构想这几个类的功能。可以自选场景,比如农场管理。也可 以模拟农场游戏。 (2) 给定的类图只是个参考,可以自己发挥,可以自己添加。 (3) 必须使用虚基类,虚函数。 (4) 充分体现面向对象的思想。四、课后作业撰写实验报告 21 C++上机实验指导书-----软件学院[2015 版]附录 A Visual C++6.0 简介考虑到目前大多数初学者使用的都是 PC 机和 Windows 操作系统,我们以 Visual C++ 作为推荐的 C++编译器。A.1 Visual C++集成开发环境Visual C++软件包包含了许多独立的组件,如编辑器、编译器、调试器,以及各种各样 为开发 Windows 环境下的 C/C++程序而设计的工具。其中最重要的是一个名为 Developer Studio 的集成开发环境。 Developer Studio 把所有的 Visual C++工具结合在一起,集成为一个 由窗口、对话框、菜单、工具栏、快捷键及宏组成的和谐系统,通过该集成环境,程序员可 以观察和控制整个开发进程。 图 A.1 显示了一个典型的 Developer Studio 主窗口。它分为几个部分:窗口顶部是菜单 和工具栏,左面的一个子窗口是工作区窗口,工作区的右面是编辑子窗口。最下面是输出子 窗口。 值得注意的是, 上述各种部件, 包括子窗口、 菜单栏和工具栏的位置不是一成不变的, 可以根据个人的喜好重新安排。图 A.1 典型的 Developer Studio 窗口(1)菜单和工具栏Developer Studio 中有一个 Menu Bar(菜单栏,通常停靠在开发环境窗口的顶部) ,其 中的菜单项有 File (文件处理) 、Edit(编辑功能) 、View(查看) 、Insert(插入) 、Project (项目管理) 、Built(编译) 、Tools(工具) 、Window(窗口)和 Help(帮助)等,分别对 应一个下拉子菜单。 除菜单栏外, 开发环境中还有几个工具栏, 一般均放在开发环境的顶部, 菜单栏的下方, 如 Standard(标准工具栏,用于文件管理、编辑和查看等) ,Wizard Bar(向导工具栏)和 Build MiniBar(建立工具栏,用于编译、连接等) 。工具栏上有常用命令的图标。一般来说, 22 C++上机实验指导书-----软件学院[2015 版]工具栏上的命令在菜单中均有对应选项, 但工具栏使用更方便, 只要用鼠标左键点击工具栏 中的相应图标即可调用相应的功能。 开发环境的各种菜单栏和工具栏均为停靠式, 可以用鼠标拖动改变它们的位置, 除此之 外,Developer Studio 的所有部分几乎都可响应鼠标右键单击而弹出一个上下文相关菜单。 甚至当 Developer Studio 没有打开窗口时,在空白区右击鼠标也会弹出一个菜单,其中含有 使窗口可见和调整工具栏是否可见的命令。 在工具栏上除标题栏外的任何地方右击鼠标, 同 样可以弹出菜单。在使用集成环境工作时试一试鼠标右键,还会发现许多其他的快捷方式。(2)Developer Studio 窗口除了各种对话框外,Developer Studio 显示两种类型的窗口,即文档窗口和停靠窗口。 文档窗口是一般的带边框子窗口,其中含有源代码文本或图形文档。Window 子菜单中列出 了在屏幕上以平铺方式还是以层叠方式显示文档窗口的命令。所有其他的 Developer Studio 窗口,包括工具栏和菜单栏,都是停靠式窗口。开发环境有两个主要的停靠窗 口DDWorkspace(工作区)窗口和 Output(输出)窗口。另外还有一个 Debugger(调试器) 停靠窗口,只在调试过程中显示。图 A.2 新建一个项目停靠窗口可以固定在 Developer Studio 用户区的顶端、底端或侧面,或者浮动在屏幕上 任何地方。停靠窗口,不论是浮动着的或是固定着的,总是出现在文档窗口的上面。这样, 就保证了当焦点从一个窗口移到另一个时,浮动的工具栏一直都是可见的。但这也意味着, 文档窗口偶尔会看起来像消失了似的。例如,如果正在文本编辑器中编辑源代码,此时打开 一个占据整个 Developer Studio 用户区的停靠窗口,源代码文档就会消失,它隐藏在新窗口 之下。解决方法是要么关了覆盖的窗口,要么把它拖到不挡眼的地方去。(3)菜单选项、快捷键和工具栏Developer Studio 的许多功能都有不只一种调用方法。例如,执行一个编译、连接成功 的可执行文件,既可通过选择菜单选项 Build/Execute.exe 完成,也可以直接使用快捷键 Ctrl+F5,还可以用鼠标点击 Build MiniBar(编译工具栏)上的相应图标来完成。一般来说, 越是常用的功能,可以调用的方法越多、越方便。23 C++上机实验指导书-----软件学院[2015 版](4)用 Developer Studio 编写和调试简单 C++程序在 Visual C++中,C++的程序是存放到以后缀名为.CPP 的文件中,系统是通过 Projects (工程项目)来管理这些文件的。所以要编写和运行 C++程序,首先必须建立一个 Projects。 下面以一个简单的例子来说明如何在 Visual 集成开发环境编写和调试简单 C++程序的 步骤: (1) 首先运行并打开 Developer Studio 系统, 选择菜单选项 File/New 中的 Projects 选项 卡。从卡中选择 Win32 Console Application(Win32 控制台应用程序) 。 (2)为应用项目取一个名字,填写在选项卡右上方的 Project Name(项目名称)处, 并检查下面的 Location (位置) 中列出的路径是否正确。 注意使下面的单选框选择 Create New Workspace(即要建立新工作区) ,然后按下 OK 按钮。如图 A.2。 (3)这时会出现 Application Wizard(应用程序生成向导) ,提问要生成的项目类型。 选择 An Empty Project(空项目) ,按下 Finish(结束)键,会弹出一个窗口,显示新项目的 有关信息。检查无误后按 OK 按钮。如图 A.3 及 1.4图 A.3 确定项目类型图 A.4 项目相关信息(4)这时屏上会显示一个空项目,并生成一个工作区文件(后缀为.DSW) 。再次选择 File 菜单的 New 选项,并选择 Files 选项卡。从卡中选择 C++ Source File(C++源程序) 。 (5)为程序取一个名字(可与项目名相同,也可以不同)填写在选项卡右边的 File 处, 然后按下 OK 按钮。如图 A.5图 A.5 建立文件 24 C++上机实验指导书-----软件学院[2015 版](6)这时开发环境右侧的文件编辑窗口中出现了一个空文件,在此可以键入源程序代 码。如图 A.6 (7)程序输入后,应仔细检查一遍,然后就可以编译了。 (8)选择菜单选项 Build/Compile gravitation.cpp (其中 gravitation 为文件名)编译源 程序。稍候片刻,会在 Output 窗口(通常在屏幕下方)中显示编译结果,如出错信息等(编 译错误的处理在下一节介绍) 。 如果程序正确, 编译结果会生成一个目标文件 (后缀为.OBJ) 。 ( 9 ) 目 标 文 件 还 需 通 过 连 接 才 能 生 成 可 执 行 文 件 。 选 择 菜 单 选 项 Build/Build gravitation.exe 连接目标文件。结果显示在 Output 窗口中。连接的结果为可执行文件(后缀 为. exe) 。 以上两步也可以并为一步,即直接使用菜单选项 Build/Build gravitation.exe。图 A.6 代码的编辑界面 生成的可执行文件可以单独运行, 也可以在开发环境中直接运行, 后一种方法在程序需 要反复调试时更加方便。在集成开发环境中直接运行程序的方法是选用菜单选项 Build/Excute.exe。程序运行结果如图 A.7图 A.7 程序运行结果25 C++上机实验指导书-----软件学院[2015 版]A.2 Visual C++帮助功能MSDN (Microsoft Developer Network) 是使用 Microsoft 开发工具或是以 Windows 和 Internet 为开发平台的开发人员的基本参考资料。通过 MSDN 所提供的 Help 资料,可以对 Visuan C++和 Windows 的工作机制有更全面的了解,可以帮助解决开发者遇到的大多数问 题。 由于 MSDN 库为包括 Visual C++在内的所有的 Visual studio 6.0 开发环境工具提供在线 帮助, 所以它在系统中作为一个应用程序独立运行, 并没有同任何单个开发环境结合在一起。 要从 Visual C++中访问 MSDN,一种方法是从 Visual C++的 Help 菜单中选择 Contents、 Search 或 Index 命令,另一种方法是在 Visual C++开发环境中直接按下 F1 键,系统都会自 动运行 MSDN 帮助程序。 MSDN 界面分为三个窗格,顶端的窗格包含有工具栏。左侧的窗格包含有各种信息定 位方法,通过单击列表中的主题,即可浏览或查找所需的各种信息;右侧的窗格则显示所选 择的主题的具体内容, 这些内容是以超文本形式存在的, 其中的相关内容可以通过超文本链 接连接到其他的相关主题。图 A.8 MSDN 界面 左边窗口中有四个选项卡:目录、索引、搜索和书签,用于提供四种不同的在线帮助浏 览方式。 (1)目录。单击目录选项卡可浏览主题的标题。该目录是依照标题和副标题的排列方 式形成一个包含了 MSDN 中所有可用信息的可扩充目录表。双击列表中的标题,就可在 MSDN 窗口的右栏中打开该文章。 (2)索引。单击索引选项卡可查看索引项的列表,然后可通过该栏左边的滚动条翻阅 整个索引列表。 也可通过在对话框顶部的编辑框中键人关键字来完成查找功能。 找到所要的 索引条目后双击,如果该条目仅对应一篇文章,MSDN 就会立刻在其窗口右栏显示其内容; 否则会出现已找到的主题对话框, 其中列出了该条目可能指向的所有文章, 这时可通过双击 列表中所需要主题,打开相应的一篇文章。 (3)搜索。单击搜索选项卡可查找到包含在某个主题中的所有词组或短语。它是一个 全文本搜索引擎,允许寻找包含指定词或短语的主题。和 MSDN 的索引选项比起来,全文 本搜索所能覆盖范围更宽,它可以提供更多的文章以供选择。 (4)书签。单击书签选项卡可创建或访问书签的列表。用户只需简单地标记书签中的 26 C++上机实验指导书-----软件学院[2015 版]某些主题,即可重新访问它们。A.3 Developer Studio 文本编辑器Developer Studio 提供了一个优秀的程序文本编辑器,它使应用程序的编辑修改和调试 工作混为一体,非常方便。该文本编辑器不仅可编辑程序文本,还可编辑一般的文本文件和 HTML Page。 启动文本编辑器非常简单,只要建立一个新文本文件,或打开一个已存在的文本文件, 文本编辑器就会自动出现。 在文本编辑器中, 用一闪烁的短竖线表示编辑位置, 通过键盘输入的文字在此位置插入 文本。用鼠标左键点击文本中的某个字符可以改变编辑位置。 文本编辑器的基本操作包括: ? →:光标向后移动一个字符。 ? ←:光标向前移动一个字符。 ? ↑:光标向上移动一行。 ? ↓:光标向下移动一行。 ? Home:光标移动到行首。 ? End:光标移动到行尾。 ? Ctrl+Home: 光标移动到文件头。 ? Ctrl+End: 光标移动到文件尾。 ? PgUp:光标向上滚动一屏。 ? PgDn: 光标向下滚动一屏。 ? Ctrl+Y:删除行。 ? Del:删除光标右边字符。 ? Backspace:删除光标左边字符。 ? Ins:插入/改写方式切换。 Developer Studio 的 Edit 子菜单还提供了一批高级编辑功能,大致可分为以下几类: (1)Undo 和 Redo,用于反悔对文本文件所做的修改 (2)剪贴 Cut、复制 Copy、粘贴 Paste 和删除 Delete (3)查找 Find 和替换 Replace (4)书签 (5)高级选项 (6)断点设置 (7)编程指导信息A.4 Developer Studio 文件处理功能Developer Studio 提供了很完整的文件处理功能,可处理程序文本文件、项目文件、 WORD 文档和 EXCEL 文档等。 Developer Studio 的 File 子菜单共有 14 项,分为 6 组,组与组之间用横线隔开。 第 1 组用于建立、打开和关闭文件处理的对象,包括项目、文件、工作区和其他文档: (1)建立新对象(New…,快捷键为 CTRL+N) 。选择该菜单项,可打开一个有若干卡 片的对话框,各卡片的内容分别为: 项目(Projects) :用于建立项目。项目即要开发的应用程序,Developer Studio 可用于开 发各种类型的应用程序,如控制台应用程序(Win32 Console Application) 、32 位 Windows 27 C++上机实验指导书-----软件学院[2015 版]应用程序(Win32 Application)和 MFC 应用向导程序(MFC AppWizard)等。对于不同类 型的项目,建立的具体文件也不同。 文件(Files) :用于建立各种文件,包括源程序文件(Source File,文件名后缀为 cpp) 、 头文件(Header File,文件名后缀为 h) 、文本文件(Text File,文件名后缀为 txt) 、位图文 件(Bitmap File,文件名后缀为 bmp)等。 工作区(Workspaces) :每个正在开发的项目要占用一个工作区。一般来说,在建立项 目的同时即为其建立了工作区。但也可用本选项建立一个空的工作区。 其他文档 (Other Documents) : 用于建立一些文档文件, 如 MS Excel 工作表, MS Excel 图表,MS PowerPoint 演示文稿和 MS Word 排版文档等。 (2)打开已有对象(Open…,快捷键为 CTRL+O) 。用于打开一个已存在的项目、文 件或文档。选择该菜单项,会弹出一个文件路径对话框,用于确定要打开的内容。 (3)关闭文件(Close) 。用于关闭当前打开并激活的文件。 第 2 组用于处理工作区。包括: (1)打开工作区(Open Workspace…) 。用于一个已存在的工作区。工作区的有关参数 (包括应用程序的结构体系,特别是其类、资源、文件和帮助信息等的参数)存放在后缀名 为 dsw 和 mdp 的文件中。 (2)保存工作区(Save Workspace) 。用于保存当前打开的工作区文件。 (3)关闭工作区(Close Workspace) 。用于关闭当前打开的工作区文件。 第 3 组用于处理当前文件,包括: (1)保存文件(Save,快捷键为 CTRL+S) 。用于保存当前正在使用的文件。 (2)另存文件(Save As…) 。将当前文件换一个名字保存,原来的文件内容不变。 (3)保存所有文件(Save All) 。保存当前打开的所有文件。 第 4 组用于打印当前文件,包括: (1)页面设置(Page Setup…) 。设置打印页面格式,为打印当前文件作准备。 (2)打印当前文件(Print…,快捷键为 CTRL+P) 。用于打印当前文件。 第 5 组用于快速打开或切换文件和工作区。包括: (1) 最近使用过的文件 ( Recent Files) 。 用于直接打开最近几次在 Developer Studio 中 使用过的文件,可在弹出的下级菜单中直接选取。 (2)最近使用过的工作区(Recent Workspaces) 。用于直接打开最近几次在 Developer Studio 中打开过的工作区,可在弹出的下级菜单中直接选取。 最后 1 组只有一个菜单项: (1)退出 Developer Studio(Exit) 。选择该菜单项可以关闭当前打开的所有对象,包括 项目、工作区和文件等,退出 Developer Studio,返回 Windows 操作系统界面。A.5 Visual C++程序的编译、连接和运行用于编译、连接和运行应用程序的功能集中在创建(Build)子菜单中,但其中多数功 能也可通过快捷键和工具条调用。 Developer Studio 的 Build 子菜单共有 11 项,分为 4 组,组与组之间用横线隔开。 第 1 组包括编译、连接等功能: 编译当前项目(Compile,快捷键为 Ctrl+F7) 。用于将源程序编译为目标代码。编译结 28 C++上机实验指导书-----软件学院[2015 版]果及编译错误信息在输出窗口(Output)显示。 编译、连接当前项目(Build,快捷键为 F7) 。在对当前项目的源程序编译之后,还进 行连接(Link)操作,即将目标代码与系统或用户类库连接并生成可执行的程序(或动态连 接库.DLL 等) 。 重新编译、连接当前项目(Rebuild All) 。功能与&Build&基本相同,只是无论是否修改 过,对所有文件都重新进行编译和连接工作。 以批处理方式编译、连接当前项目(Batch Build) 。功能与&Build&基本相同,只是同时 产生调试版和发行版执行程序。 清除临时文件( Clean) 。用于清除上一次编译、连接时产生的临时文件和输出文件, 以整理程序目录。 第 2 组用于调试程序,包括开始调试(Start Debug)和远程调试链接(Debugger Remote Connect) 。 第 3 组用于执行当前项目的可执行程序(Execute,快捷键为 Ctrl+F5) 。 第 4 组用于设置编译和连接工作的参数。包括: 设置项目的版本类型(Set Active Configuration…) 。Developer Studio 生成的可执行文件 有两种版本,一种是调试版本(Win32 Debug) ,内含调试代码,体积稍大,主要在编程调 试过程中使用。另一种是发放版本(Win32 Release) ,其中不包含调试代码,体积小,用于 在程序调试结束后提交用户。 管理项目版本(Configuration…) 。用于管理项目的调试版本和发放版本。 Profile。设置、Profile 程序和显示 Profile 数据。A.6 查看和修改编译、连接错误刚编写好的程序含有错误是正常的, 即使是熟练的专业程序员也很难一次就编写出完全 没有错误的源程序来。实际上,重要的不是程序中是否有错误,而是怎样将这些错误找出来 并改正之。一般来说,一段源程序从输入编辑到通过编译,往往要重复若干次编译-修改-再 编译的过程。 如果在编译的过程中发现了错误,则进入编辑查错状态。这时在屏幕下方的 Output 窗 口中会显示出错误的类型、错误发生的位置以及错误的原因。错误信息的格式为: &源程序路径&(行)&错误代码&: &错误内容& 错误有两种,一种是 Error,表示这是一个严重错误,非改不可。另一种是 Warning,表 示源程序这里有可能是错误的,也有可能不是错误,编译程序自己也拿不准。一般来说,如 果只出现警告信息,还是可以继续连接、运行程序,建议在出现编译警告时最好还是仔细检 查一下,设法消除引起警告的原因。 错误发生的位置包括源程序的路径和文件名以及错误所在行。必需说明的是C ++编译 程序的“智力”并不十分高,虽然能够查出错误,但对错误的说明可能并不十分准确,而且一 个实际错误往往会引出若干条错误说明, 使人不容易摸清到底错在什么地方。 错误的原因其 实可能很简单,例如少写了一个括号、分号或拼错了一个单词,都可能引起一连串的错误提 示。真正的错误之处也可能在此之前的某个语句。而且指出的错误条数可能偏多,常常是由 于一处出错而引发了一系列错误提示信息。 用鼠标双击一条错误信息可使文本编辑器作出反应, 其左框上显示一个箭头指出对应的 出错语句,以便修改源程序。 在连接阶段也可能出现一些错误提示。 与编译错误提示信息不同的是连接错误不指出错 误发生的详细位置,这是因为连接的对象是目标程序,和源程序格式有很大差别,不易确定 错误的准确位置。 连接阶段出现的错误一般比较少, 大多数是因为在程序中调用了某个函数, 而连接程序却找不到该函数的定义。这时最有可能的是函数名字拼写错误。另外,如果程序 29 C++上机实验指导书-----软件学院[2015 版]的规模较大, 需要分为若干个源程序文件分别编译然后连接, 则也可能出现全局变量重复定 义或找不到等错误现象。 在找到连接错误的原因并改正以后,一定要重新编译后才能再次连接。否则,虽然源程 序已经修改, 但进行连接的目标程序还是以前有错误的目标程序, 再次连接仍然会产生同样 的错误。A.7 运行错误的判断与调试通常所说的运行错误有两种, 一种是逻辑错误, 即程序的实际运行结果和编程者对程序 结果的期望不符; 另一种仍是程序设计上的错误 , 但是躲过了编译程序和连接程序的检查 , 通常表现为突然死机、自行热启动或者输出信息混乱。 相对于编译和连接错误来说, 运行错误的查找和判断更为困难。 编译和连接错误可以由 编译程序和连接程序检查, 而运行错误就不同了, 很少或根本没有提示信息, 只能靠程序员 的经验来判断错误的性质和位置。下面简单地介绍一些常见运行错误的调试方法。 逻辑错误: 一种逻辑错误是由于在设计程序的算法时考虑欠周引起的, 例如对边界和极 端条件未作处理等。例如以下循环: while(count) { …… count = count? 1; } 程序员的构思是进行 count 次循环。 但是, 如果 count 中原来的值为负数时, 此循环就成 了一个“死循环”而导致无法停机, 显然是错误的。但是编译程序无法查出这类错误, 只有到 了程序运行之后才有可能发现。再如, 在利用海伦公式计算三角型面积时, 首先应该确认给 出的三条边长确实可以构成一个三角形, 否则计算结果是没有意义的; 而在编写求解一般实 系数一元二次方程的程序时, 必须在程序中设计处理复根情况的程序段, 以免对负数求平方 根。 另一种常见的逻辑错误是由于程序输入时的打字错误造成的 , 例如将判断条件中的 “&=”误输入为“&”, 将相等判断“==”误输入为赋值号“=”等。含有这类错误的程序在运行时出 现的现象多种多样, 而且通常很难与错误的原因联系起来。 数组下标越界错误:即使用了并不存在的数组元素。例如有程序段 int a[5]; for(int i=1; i&=5; i++) a[i] = 0; 由于[5]并不存在,而上述程序段试图将数据存放到一个并不存在的数组元素中,这会 引起包括死机在内的严重运行错误。类似错误还有指针和动态存储分配引起的一些运行错 误。A.8 基本调试手段程序的基本调试手段有以下几种: 标准数据检验、程序跟踪、边界检查和简化循环次数 等。 标准数据检验: 在程序编译、连接通过以后, 就进入了运行调试阶段。运行调试的第一 步就是用若干组已知结果的标准数据对程序进行检验。 标准数据的选择非常重要, 一是要有 代表性, 接近实际数据; 二是要比较简洁, 容易对其结果的正确性进行分析。 另外, 对重要的 临界数据也必须进行检验。 程序跟踪 : 对于比较复杂的大型程序来说 , 上述标准数据检验一次就完全通过的可能 30 C++上机实验指导书-----软件学院[2015 版]性很小。通常程序中总是存在许多各种各样的错误,还需要对程序进行细致的调试工作。程 序跟踪则是最重要的调试手段。程序跟踪的基本原理是让程序一句一句地执行, 通过观察和 分析程序执行的过程中数据和程序执行流程的变化来查找错误。就 Visual C++而言, 程序跟 踪可以采用两种方法, 一种是直接利用 Developer Studio 中的分步执行、断点设置、变量内 容显示等功能对程序进行跟踪, 这种方法在后面的编程与调试部分介绍; 另一种是传统的方 法, 通过在程序中直接设置断点、打印重要变量内容等来掌握程序的运行情况。例如,可以 在程序中的关键部位插入这样的代码段: // 调试代码段 cout && &Break Point 10: line 120 --- count & 100& && cout && &Variable count = “ && count && “, x = “ && x && “, sum = “ && sum && _getch ( ) ; // 调试代码段结束 其中的变量可以根据程序的实际情况进行设计。使用_getch ( ) 函数的目的是要程序在 执行到这一行时暂时停下来, 从而可以看清楚调试代码段所显示的信息, 然后选择是否让程 序继续执行,该函数的原型在头文件 conio.h 中。如果到这一断点时尚未发现错误, 则可以 按下任何一个键让程序继续运行到下一个断点; 否则可以使用组合键 Ctrl+Break 键来中断程 序, 再使用编辑器对程序进行修改。在程序中的所有的问题都解决了之后, 再将程序中所有 的调试代码段统统删去。 边界检查: 在设计检查用的数据时, 要重点检查边界和特殊情况。例如, 对于循环: while(count&1000) { … } 就应该设计数据检验 count 等于 999、等于 1000、等于 0 或者负数等情况。如果程序中 有由 if-else 语句、switch 语句等组成的分支结构, 也应该设计相应的数据,使得分支中的每 一条路径都要通过检验。 简化:在调试时, 有时可以通过对程序进行某种简化来加快调试速度。例如减少循环次 数、缩小数组规模、屏蔽某些次要程序段 (如一些用于显示提示信息的子程序) 等。但在进 行简化工作时, 一定要注意这种简化不能太过分, 以致于无法代表原来程序的真实情况。例 如, 对于一个求解 N 元一次方程组的程序来说, 仅将 N 等于 2 的情况调通是不够的,还不能 保证该程序对于较大的方程组也能给出正确的结果。如果对于 N=3 或 4 的情况该程序也能 正常工作, 则在该程序中因为矩阵规模而出错的可能性就大大减少了。A.9 注解号在调试中的作用恰当的注解可以提高程序的可读性,是所有好程序的重要组成部分。不仅如此,在程序 调试阶段, 注解还是一种很有用的调试工具。 在调试比较复杂的程序时, 可以使用将部分程序段落用注解号括起来, 以便于突出调试 重点。例如在调试如下程序时: y = func(x, y); ... ... 如果怀疑某运行错误是出在函数 func()中, 则可以对程序作如下修改(假定 0 是该函 数的预期的输出值之一): y = 0; // func(x, y); ... ... 然后再次运行程序, 如果这次运行结果正常, 没有出现原先的错误现象, 则可以断定问 31 C++上机实验指导书-----软件学院[2015 版]题是出现于函数 func()中; 如果运行结果仍然不正常, 则问题可能出现在后面的某个程序 段落中。 倘若后面的程序结构复杂, 还可以通过在上述程序段落中多更换几种 y 值的方法进 一步确定错误的性质。 又如在调试有数据输入的程序,如 cin && a && b && ... ... 这样的程序时,为了突出测试该段程序对某组输入数据(如 a = 1, b = 2, c= 3)的响应 情况, 同时避免每次输入数据的麻烦, 可以利用注解号将上述程序段落改为: // cin && a && b && a = 1; b = 2; c = 3; ... ... 这样在调试程序时就不必每次停下来等待输入数据了, 可以直接使用步进、 跟踪或设置 断点等手段调试这段程序。等到程序中的所有错误全部修正以后, 再恢复被修改的内容(即 注解中的内容)即可。A.10 条件编译条件编译是编译预处理命令的一种,用于对源程序的内容进行选择性编译。例如, 在调 试程序期间, 常常希望记录输出一些调试用的信息, 而在调试完成后, 就不再需要这些输出 信息了。 要解决这个问题, 一种办法是逐一从源程序中删去这些输出这些调试信息的程序段 落, 或者将这些程序段落用注释标记括起来。显然这样很不方便。另一种方法就是使用编译 预处理中的条件编译命令。条件编译命令的格式为: #if &条件 1& &程序段落 1& #elif &条件 2& &程序段落 2& ... ... #elif &条件 n& &程序段落 n& #else &省缺程序段落& #endif 条件编译中所使用的条件只能是由常数构成的表达式。如果该常数表达式的值不为 0, 就表示条件成立, 否则表示条件不成立。一般情况下, 在#if 中都是使用由#define 指令产生 的符号常数进行测试。 编译预处理命令的一个常见的用途是将调试代码插入应用程序中。 程序员可以定义一个 叫做 DEBUG 的符号常数, 值可以定义为 1 或者 0。在程序中的任何地方,都可用以下方式插 入调试信息: #if DEBUG == 1 &此处为调试代码& #endif 在开发程序时, 将 DEBUG 定义为 1, 则插入的调试代码被编译进目标程序, 可输出帮 助跟踪错误的信息。一旦程序工作正常, 就可将 DEBUG 重新定义为 0 后再次编译程序, 即 可从目标程序中去掉调试代码。 32 C++上机实验指导书-----软件学院[2015 版]C++中还有两个和#if 类似的条件编译命令: #ifdef 和#ifndef。例如 #ifdef DEBUG 则只要定义了 DEBUG(无论将 DEBUG 定义为什么值,包括 0), 甚至什么具体值也 不是: #define DEBUG 则上述条件成立。而在前面没有定义 DEBUG 时 #ifndef DEBUG 成立。A.11 Developer Studio 的跟踪调试功能调试器是 Developer Studio 中最出色的部件之一,可以帮助找到在软件开发中可能遇到 的几乎每个错误。 调试器的主要调试手段有设置断点、跟踪和观察。所谓断点,即程序中的某处。在调试 时使程序执行到断点处停下来,通过观察程序变量、表达式、调试输出信息、内存、寄存器 和堆栈的值来了解程序的运行情况,或进一步跟踪程序的运行。 在当前编辑位置设置一个断点最直接的方式是使用快捷键 F9 ,或用鼠标点击 Build MiniBar 工具条上的手形图标。断点用编辑窗口左边框上的大红圆点表示,非常醒目。取消 一个断点的方法类似,只要在有断点的语句上重新使用快捷键 F9 即可取消已设置的断点。 如果已设置好了断点,则可通过子菜单 Build/Start Debug 调用调试器。该子菜单有 4 个 选项,分别为: A. Go(快捷键为 F5) :从当前语句开始执行程序,直到遇到一个断点或程序结束。用 Go 命令启动调试器时,从头开始执行程序。 B. Step Into(快捷键为 F11) :单步执行每一程序行,遇到函数时进入函数体内单步执 行。 C. Run To Cursor(快捷键为 Ctrl+F10) :运行程序至当前编辑位置。 D. Attach To Process:将调试器与当前运行的其中某个进程联系起来,这样就可以跟踪 进入进程内部, 就象调试项目工作区中当前打开的应用程序一样调试运行中的进程。 当被调试的程序停在某个断点上时, 编辑器左边框上的对应位置会出现一个黄色箭头指 示被中断的语句。此时 Developer Studio 的版面布置会一些发生变化,如菜单栏中以调试 (Debug)菜单项代替了建立(Build)菜单项并出现了一 Debug 工具栏。调试工具栏如图 A.9 所示。图 A.9 Developer Studio 的 Debug 工具栏 Debug 工具栏可分为 4 个区,第 1,2 两个区中是常用的调试命令,包括: (1)Restart(快捷键:Ctrl+Shift+F5) :终止当前的调试过程,重新开始执行程序,停 在程序的第 1 条语句处。 (2)Stop Debugging(快捷键:Shift+F5) :退出调试器,同时结束调试过程和程序运 行过程。 (3)Break Execution:终止程序运行,进入调试状态。多用于终止一个进入死循环的 程序。 (4)Apply Code Changes(快捷键:Alt+F10) :当源程序在调试过程中发生改变,重新 进行编译。 (5)Show Next Statement(快捷键:Alt+Num *) :显示下一语句。 33 C++上机实验指导书-----软件学院[2015 版](6)Step Into(快捷键:F11) :跟踪。如果是一语句,则单步执行;如果是一函数调 用,则跟踪到函数第一条可执行语句。 (7)Step Over(快捷键 F10) :单步执行。如果是一语句,则单步执行;如果是一函数 调用,将此函数一次执行完毕,运行到下一条可执行语句。 (8)Step Out(快捷键:Shift+F11) :从函数体内运行到外,即从当前位置运行到调用 该函数语句的下一条语句。 (9)Run To Cursor(快捷键:Ctrl+F10) :从当前位置运行到编辑光标。 第 3 区有一个眼镜图标(Quick Watch,快捷键为 Shift+F9)用于弹出一个对话框,观察 当前编辑位置的变量的值。 第 4 区有 6 个图标,分别用于激活 6 个调试器窗口: (1)观察窗口(Watch)用于观察指定变量或表达式的值。可任意添加要观察的变量 或表达式,并可用标签的形式(Watch1,Watch2,Watch3 等)增加多组观察对象。 (2)变量窗口(Variables)用于观察断点处或其附近的变量的当前值。Variables 有 3 个标签,Auto 标签显示变量和函数返回值,Locals 标签显示当前函数的局部变量,this 标签 显示 this 指针对象。 (3)寄存器窗口(Register)用于观察在当前运行点的寄存器的内容。 (4)内存窗口(Memory)用于观察指定内存地址内容。 (5)调用栈窗口(Call Stack)用于观察调用栈中还未返回的被调用函数列表。调用栈 给出从嵌套函数调用一直到断点位置的执行路径。 (6)汇编代码窗口(Disassmbly)用于显示被编译代码的汇编语言形式。A.12 如何在程序中使用 MFC 类库如果要在程序中使用 CString、CTime 和 CTimeSpan 等 MFC 类,要在程序首部加上文 件包含命令: #include &afx.h& 此外,还需在 Developer Studio 的菜单选项 project/Settings…的 General 选项卡设置 Microsoft Foundation Classes 项。可选项有三种,分别为 Not Using MFC(不使用 MFC) 、 Use MFC in a Shared DLL(以动态链接库方式用 MFC)和 Use MFC in a Static Library(以静 态库方法使用 MFC) ,后两种选项均可使用。A.13 使用 FileView 标签FileView 标签用于显示当前项目中各项目之间的包含关系和项目中包含的所有文件。 扩 展顶层文件夹就可以显示项目的所有文件,如图 A.10 所示。34 C++上机实验指导书-----软件学院[2015 版]图 A.10 FileView 标签 FileView 的操作功能: 1.定位:双击某个文件名或图标就可以打开相应的源程序编辑窗口。 2 .添加文件:在项目中增加一个文件有多种方法,可以通过 VC++ 的菜单选项 Project/Add Project,也可以在文件列表上单击鼠标右键调出快捷菜单来增加一个文件。 3.删除文件:用鼠标在 FileView 列表中选择要去掉的文件,按删除键(Del)就会把 这个文件从项目列表中去掉。A.14 使用 ClassView 标签默认情况下,当用户打开―个包含有 C++类定义的工程时,ClassView 窗口将作为工程 工作空间的一部分出现,如图 A.11 所示。C1assView 显示代表类和类成员的图标和名称。 通过 ClassView 标签可以使成员函数、 变量的定位和增加类、 类的成员的工作变得较为容易。图 A.11 ClassView 标签 单击 ClassView 标签, 就会在列表框中列出当前开发项目中所包含的类, 用鼠标单击“+” 会打开各子项目,单击“-”会关闭打开的子项。通过该标签可以浏览类的成员。每个成员的 左边都有一个或多个图标, 这些图标表示该成员是数据成员还是成员函数, 以及成员的访问 类型等。如果成员是保护成员,那么它的左边会有一个钥匙图标;如果它是私有成员,那么 它的左边会有一个锁头图标。 ClassView 的操作功能: 1.直接定位到代码处:通过双击某个类或成员,可以在源代码窗口查看相应的源代码。 2.创建新的类:在最高一级的列表项目标题上(如图 A.11 中 vc0805 Classes 处)单击 鼠标右键,调出操作菜单,在菜单中选择 New Class…就会进入图 A.12 所示的对话框。增加 的类可以分为两种,―种是 MFC 继承类,它从 VC++中已有的一些 MFC 类继承而来;另一 种是―般的 C++类。35 C++上机实验指导书-----软件学院[2015 版]图 A.12 增加一般类对话框 在图 A.12 增加类的对话框中从 Class Type 中选择 Generic Class 选项。 单击 Change…按 钮可以修改输入类的头文件和源文件。在 Base Class(es)组合框中输入继承的基类的名称和 继承时的类型。在 Name 编辑框中输人类的名称。按“OK”按钮就可以实现增加一般类的工 作。 3.添加类的成员:这些成员包括数据成员、成员函数,以及可重载的虚函数等。 (1)添加数据成员:在需要增加数据成员的类上单击鼠标右键,就会弹出一个选择菜 单,选择 Add Member Variable,弹出图 A.13 所示的对话框来增加数据成员。图 A.13 增加类的数据成员对话框 在 Variable Type 编辑框中输入变量的类型 (如 int, float, char, 等) , 在 Variable Declaration 编辑框中输人变量的名称,通过按钮选择变量的访问属性即(公有类型、保护类型、私有类 型) ,按 OK 按钮就会完成增加数据成员的工作。 (2)添加成员函数:在需要增加成员函数的类上单击鼠标右键,在弹出的选择菜单上 选择 Add Member Function,就会进入图 A.14 所示的对话框来增加成员函数。成员函数的增 加方法与成员变量类似,增加完毕后,会在类的定义中增加函数的定义,在源文件中增加一 个空函数。36 C++上机实验指导书-----软件学院[2015 版]图 A.14 增加类的成员函数对话框37 C++上机实验指导书-----软件学院[2015 版]附录 BC/C++常用函数在使用 C++语言进行编程时,许多很基本和很重要的功能都由系统的库函数和类库来 实现。为便于学习和使用,本附录列出了一些常用的库函数,供读者查阅。B.1 缓冲区操作函数函数名:_memccpy 函数原型:void *_memccpy(void *dest,const void *src,int c,unsigned int count); 参数:dest 目的指针;sro 源指针;c 拷贝的最后字符;count 字符个数。 所需头文件:&memory.h&或&string.h& 功能:从 src 所指向的地址开始拷贝。个或多个字节到 dest 中。当指定字符 c 已拷贝或已拷 贝 count 个字节后停止。 返回值:如果字符 c 被拷贝,返回 dest 中该字符直接后继字节的指针;如果 c 没有被拷贝则 返回 NULL。 函数名:memchr 函数原型:void *memchr(const void *buf,int c,sizet count); 参数:buf 缓冲区的指针;c 查找的字符;count 检查的字符个数。 所需头文件:&memory.h&或&string.h& 功能:查找 buf 的前 count 个字节中 c 的第一次出现,当找到 c 或已检查完 count 个字节时 停止。 返回值:如果成功,返回 buf 中 c 首次出现的位置的指针;否则返回 NULL 函数名:memcpy 函数原型:void *memcpy(void *dest,const void *src,sizet count); 参数:dest 目的缓冲区;src 源缓冲区;count 拷贝的字符个数。 所需头文件:&memory.h&或&string.h& 功能:从 sro 拷贝 count 个字节到 dest。如果源缓冲区和目的缓冲区重叠,这个函数不能保 证正确拷贝;对于这种情况可使用 memmove 处理。 返回值:返回 dest 的值。 函数名:_memlcmp 函数原型:int _memicmp(const void *buf1,const void *buf2,unsigned int count); 参数:bufl 第一个缓冲区;buf2 第二个缓冲区;count 字符个数。 所需头文件:&memory.h&或&string.h& 功能:比较两个缓冲区 bufl 和 buf2 的前 count 个字符,比较过程是大小写无关的。 返回值:bufl 和 buf2 的前 count 个字节之间的关系: &0:bufl 小于 buf2;=0:bufl 等于 buf2;&0:bufl 大于 bur2 函数名:memmove 函数原型:void *memmove(void *dest,const void *src,sizet count); 参数:dest 目的对象;src 源对象;count 拷贝的字符字节个数。 所需头文件;&string.h& 38 C++上机实验指导书-----软件学院[2015 版]功能:从 src 拷贝 count 个字节到 dest。如果源区域与目的区域有重叠,memmove 也能确保 正确拷贝。 返回值:返回 dest 的值。 函数名:memset 函数原型:void *memset(void *dest,int c,sizet count); 参数:dest 目的指针;c 设置的字符;count 字符个数。 所需头文件:&memory.h&或&string.h& 功能:设置 dest 的前 count 个字节为字符 c。 返回值:返回 dest 的值。 函数名:_swab 函数原型:void _swab(char *src,char *dest,int n); 参数:src 需拷贝和交换的数据;dest 交换结果数据的存储位置;n 拷贝和交换的字节个数。 所需头文件:&stdlib.h& 功能:从 src 拷贝 n 个字节,交换每对相邻的字节,并把结果存储在 dest 中。一般用于为转 换到使用不同字节次序的机器上而准备二进制数据。 返回值:无B.2 字符分类函数本类函数都只有一个 int 型参数,即要测试的整数。 函数名:isalnum 函数原型:int isalnum(int c); 所需头文件:&ctype.h& 功能:测试 c 是否字母或数字。 返回值:如果 c 在 A~Z、a~z 或 0~9 的范围内,则返回一个非 0 值;否则返回 0。 函数名:isalpha 函数原型:int isalpha(int c); 所需头文件:&ctype.h& 功能:测试 c 是否字母。 返回值:如果 c 在 A~Z 或 a~z 的范围内,则返回一个非 0 值;否则返回 0。 函数名:_isascll 函数原型:int _isascll (int c); 所需头文件:&ctype.h& 功能:测试 c 是否 ASCII 字符。 返回值:如果 c 为一个 0x00~0x7F 之间的 ASCII 字符,则返回一个非 0 值:否则返回 0。 函数名:iscntrl 函数原型:int iscntrl(int c); 所需头文件:&ctype.h& 功能:测试 c 是否控制字符, 返回值:如果 c 是一个控制字符(0x00~0xlF 或 0x7F),则返回一个非 0 值,否则返回 0。 39 C++上机实验指导书-----软件学院[2015 版]函数名:_iscsym 函数原型:int _iscsym (int c); 所需头文件:&ctype.h& 功能:测试 c 是否字母、下划线或数字。 返回值:如果 c 是一个字母、下划线或数字,则返回一个非 0 值;否则返回 0。 函数名:_iscsymf 函数原型:int _iscsymf (int c); 所需头文件:&ctype.h& 功能:测试是否字母或下划线。 返回值:如果 c 是一个字母或下划线,则返回一个非 0 值;否则返回 0。 函数名:isdigit 函数原型:int isdigit(int c); 所需头文件:&ctype.h& 功能:测试是否十进制数字。 返回值:如果 c 是一个十进制数字(0~9),则返回一个非 0 值;否则返回 0。 函数名:isgraph 函数原型:int isgraph(int c); 所需头文件:&ctype.h& 功能:测试是否空格外的可打印字符。 返回值:如果 c 是一个非空格的其它可打印字符,则返回一个非 0 值;否则返回 0。 函数名:islower 函数原型:int islower(int c); 所需头文件:&ctype.h& 功能:测试是否小写字母。 返回值:如果 c 是一个小写字母(a~z) 函数名:isprint 函数原型:int isprint(int c); 所需头文件:&ctype.h& 功能:测试是否可打印字符。 返回值:如果 c 是一个可打印字符包括空格字符(0x20~0x7E),则返回一个非 0 值;否则返 回 0。 函数名:ispunct 函数原型:int ispunct(int c); 所需头文件:&ctype.h& 功能:测试是否标点符号。 返回值:如果 c 是一个非空格字符并且是 isalnum 不为真的字符,则返回一个非 0 值;否则 返回 0。 40 C++上机实验指导书-----软件学院[2015 版]函数名:isspace 函数原型:int isspace(int c); 所需头文件:&ctype.h& 功能:测试是否空白。 返回值:如果 c 是一个空白字符(0x09~0x0D 或 0x20) 则返回一个非 0 值;否则返回 0。 函数名:isupper 函数原型:int isupper(int c); 所需头文件:&ctype.h& 功能:测试是否大写字母。 返回值:如果 c 是一个大写字母,则返回一个非 0 值;否则返回 0。 函数名:isxdigit 函数原型:int isxdigit(int c); 所需头文件:&ctype.h& 功能:测试是否十六进制数字。 返回值: 如果 c 是一个十六进制数字(A~F, a~f 或 0~9), 则返回一个非 0 值; 否则返回 0。B.3 数据转换函数函数名:abs 函数原型:int abs(int n); 参数:n 整数值。 所需头文件:&stdlib.h&或&mat} 功能:求绝对值。 返回值:返回 n 的绝对值。 函数名:atof,atoi,atol 函数原型:double atof(const char *string); int atoi(const char *string); long atol(const char *xstring); 参数:string 要转换的字符串。 所需头文件:atof 需要&math.h&和&stdlib.h&,其它需要&stdlib.h& 功能:将字符串转换成 double(atof)、integer(atoi)或 long(ato1)型数据。 返回值:返回转换后的结果值,如果输入不能转换成对应类型的值,返回值为 0.0(atof)或 0(atoi,atol)。溢出情况下返回值不确定。 函数名:_ecvt 函数原型:char *_ecvt (double value,int count,int dec,int *sign); 参数:value 被转换的数;count 存储的数字个数;dec 存储的小数点位置;sign 转换的数的 符号。 所需头文件:&stdlib.h& 功能:将 double 型浮点数转换成指定长度的字符串, 返回值:返回数字字符串的一个指针;没有错误返回41 C++上机实验指导书-----软件学院[2015 版]函数名:_fcvt 函数原型:char *_fcvt (double value,int count,int *dec,int *sign); 参数:value 被转换的数值 lcount 小数点之后的位数;dec 存储的小数点位置的指针;sign 存储的符号指示符的指针。 所需头文件:&stdlib.h& 功能;将 double 型浮点数转换为以空字符结尾的字符串。 返回值:返回一个数字字符的指针;没有错误返回。 函数名:_gcvt 函数原型:char _gcvt (double value,int digits,char *buffer); 参数:value 被转换的值;digits 存储的有效数字位数;buffer 结果的存储位置 所需头文件:&stdlib.h& 功能;将 double 型浮点数转换成字符串,并将其存储在缓冲区中 返回值:返回该数字字符串的指针;没有错误返回。 函数名:_itoa,_ltoa 函数原型:char *_itoa (int value,char *strmg,int radix) char _ltoa (1ong value,char *string,int radix); 参数:value 要转换的数;string 结果字符串;radix value 的基数,必须在 2~36 的范围内。 所需头文件:&stdlib.h& 功能:将 int(_itoa)或 long(_ltoa)型数据转换成一个以空字符结尾的字符串,并将结果存储在 string 中(至多 33 个字节)。如果 radix 等于 10 且 value 为负数,结果字符串的第一个字符是 负号(-)。 返回值:返回参数 string;没有错误返回。 函数名:labs 函数原型:long labs(1ong n); 参数:n 长整数值。 所需头文件:&stdlib.h&和&math.h& 功能:求 long 整数的绝对值。 返回值:返回 n 的绝对值;没有错误返回。 函数名:strtod 函数原型:double strtod(const char *nptr,char **endptr); 参数:nptr 要转换的以空字符结尾的字符串;endptr 停止扫描的字符的指针。 所需头文件:&stdlib.h& 功能:将字符串 nptr 转换成 double 型数据,在遇到第一个不能作为数值识别的字符时停止, 这可能是结尾的空字符。 返回值:返回转换后的结果。如果发生上溢,函数返回十/一 HUGEVAL,HUGEVAL 的符 号与需转换的值符号相同。如果不能进行转换或出现下溢出,则返回 0。 函数名:strtol 函数原型:long strtol(const char *nptr,char **endptr,int base); 参数:nptr 要转换的以空字符结尾的字符串;endptr 停止扫描的字符的指针; 42 C++上机实验指导书-----软件学院[2015 版]base 使用的基数。 所需头文件:&stdlib.h& 功能:将字符串 nptr 转换成 long 型数据。在遇到第一个不能作为数值识别的字符时停止, 这可能是结尾的空字符,或者是第一个大于或等于 base 的数值字符。 返回值:返回转换后的结果。如果发生上溢,函数返回 LONGMAX 或 LONGMIN。如果不 能执行转换,则返回 0。 函数名:strtoul 函数原型:unsigned long strtoul(const char *nptr,char **endptr,int base); 参数:nptr 要转换的以空字符结尾的字符串;endptr 停止扫描的字符的指针;base 使用的基 数。 所需头文件:&stdlib.h& 功能: 将字符串 nptr 转换成 unsignedlong 型数据。 在读到字符串中第一个不能作为数值识别 的字符时停止,这可能是结尾的空字符或者是大于或等于 base 的第一个数值字符。 返回值:返回转换后的结果。如果发生上溢,函数返回 ULONGMAX。如果不能执行转换, 则返回 0。 函数名:_toascii 函数原型:iht _toascii (int c); 参数:c 要转换的字符。 所需头文件:&ctype.h& 功能:将字符转换成 ASCII 码 返回值:返回转换结果。 函数名:tolower 函数原型:int tolower(int c); 参数:c 要转换的字符。 所需头文件:&stdlib.h&和&ctype.h& 功能:将字符转换为小写字母。 返回值:返回转换结果。 函数名:toupper 函数原型:int toupper(int c); 参数:c 要转换的字符。 所需头文件:&stdlib.h&和&ctype.h& 功能:将字符转换为大写字母。 返回值:返回转换结果。 函数名:_ultoa 函数原型:char *_ultoa (unsigned long value,char *string,int radix); 参数:value 要转换的数;string 字符串结果;Radix value 的基数,必须在 2_36 的范围内。 所需头文件:&stdlib.h& 功能:将 value 转换成一个以空字符结尾的字符串,并存储在 string 中(至多 33 个字节),不 执行上溢出检查。 返回值:返回 string 的指针;没有错误返回。 43 C++上机实验指导书-----软件学院[2015 版]B.4 目录控制函数函数名:_chdir 函数原型:int _chdir(const char *dirname); 参数:dirname 新工作目录的路径,必须指向_个现存目录。 所需头文件:&direct.h& 功能:将当前工作目录改变为 dirname 所指定的目录。如果在 dirname 中指定一个新驱动器 字母,这个函数可以改变任何驱动器上的当前目录,缺省驱动器也可以改变。 返回值:如果成功,返回 0;如所指定的路径未找到,则返回一 1。 函数名_chdrive 函数原型:int _chdrive(int drive); 参数:drive 新工作驱动器号,使用一个整数指出新的工作驱动器(1=A,2=B 等等)。 所需头文件:&direct.h& 功能:将当前工作驱动器改变为 drive 指定的驱动器。 返回值:如果工作驱动器成功改变,返回 0 值;否则返回-1。 函数名:_getcwd 函数原型:char *_getcwd(char *buffer,int maxlen); 参数:buffer 路径的存储位置;maxlen 路径的最大长度,以字符为单位。 所需头文件:&direct.h& 功能:获取缺省驱动器上当前工作目录的完整路径,并存储在 buffer 中 (包括结尾的空字符)超过 maxlen,会出现一个错误。 返回值:返回 buffer 的指针,若出错,则返回 NULL。 函数名:_getdcwd 函数原型:char *_getdcwd(int drive,char *buffer,int maxlen); 参数:drive 磁盘驱动器;buffer 路径的存储位置;maxlen 路径的最大长度。 所需头文件:&direct.h& 功能: 获取指定驱动器上当前工作目录的完整路径, 并存储在 buffer 中。 如果路径的长度(包 括结尾的空字符)超过 maxlen,会出现一个错误。 返回值;返回 buffer 的指针:若出错,则返回 NULL。 函数名:_getdrive 函数原型:int_getdrive(void) 参数:无 所需头文件:&direct.h& 功能:获取当前(缺省)驱动器。 返回值:返回当前(缺省)驱动器(1=A,2=B 等等);没有错误返回。 函数名:_mkdir 函数原型;int_mkdir(const char *dirname); 参数:dirname 新目录的路径。 所需头文件:&direct.h& 功能:用指定的 dirname 建立一个新目录。mkdir 每次调用仅建立一个新目录 44 C++上机实验指导书-----软件学院[2015 版]返回值:如果成功地建立了新目录,返回 0:出现错误时,返回-1。 函数名:_rmdir 函数原型:int_rmdir(const char *dirname); 参数:dirname 需删除的目录的路径。 所需头文件:&direct.h& 功能:删除由 dirname 指定的目录,该目录必须为空必须不能是当前工作目录或根目录。 返回值:如果该目录成功删除,返回 0;否则返回-1。 函数名:_searchenv 函数原型:void _searchenv(const char *filename,const cha *varname,char *pathname); 参数: filename 要查找的文件的名称 varname 查找的环境: pathname 存储完整路径的缓冲区。 功能:使用环境路径查找文件。首先在当前工作目录中查找,如果没有找到该文件,接着查 找环境变量指定的目录。找到文件后,将文件的路径存人 pathname 。如果文件未找到, pathname 包含一个空的、以空字符结尾的字符串。 返回值:无B.5 文件处理函数B.5.1 在一个文件句柄指定的文件上进行操作的函数 函数名_chsize 函数原型:int _chsize(int handle,long size); 参数:handle 指向打开文件的句柄;slze 文件的新尺寸,以字节为单位。 所需头文件;&io.h& 功能:以 size 指定的长度扩充或截除与 handle 关联的文件,该文件必须以允许写模式打开。 如果该文件被扩充,要在末尾添加空字符(?\0?);如果文件被}

我要回帖

更多关于 高考数学选做题没涂 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信