C++程序设计第八章
《C++程序设计》学习笔记总结 - 第八章 文件操作

第八章文件操作一、文件基本概念和文件流类文件基本概念和文件流类从不同的角度来看待文件就可以得到不同的文件分类。
C++根据文件数据的编码方式不同分为文本文件和二进制文件。
根据存取方式不同分为顺序存取文件和随机存取文件所谓“文本文件”和“二进制文件”是从文件格式的角度进行分类,是约定俗成的、从计算机用户角度出发进行的分类。
所谓的“顺序存取文件”和“随机存取文件”是根据访问文件中数据的方式来划分的。
顺序存取文件就是按照文件中数据存储次序进行顺序操作,为访问第i 个数据,就首先要访问第i-1个数据,在整个文件操作过程中,将移动位置指针的工作交给系统自动完成。
磁带文件就是一个典型的顺序存取文件。
随机访问文件是根据应用的需要,通过命令移动位置指针直接定位到文件内需要的位置并进行数据操作。
对文件的基本操作分为读文件和写文件。
所谓“读文件”就是将文件中的数据读入内存之中,也称为“输入”。
所谓“写文件”就是将内存中的数据存入文件之中,也称为“输出”。
C++标准类库中有3个流类可以用于文件操作,这3个类统称为文件流类,分别如下:1)ifstream:用于从文件中读取数据。
2)ofstream:用于向文件中写入数据。
3)fstream:既可用于从文件中读取数据,又可用于向文件中写入数据。
使用这3个流类时,程序中需要包含fstream头文件。
类ifstream和类fstream都是从类istream派生而来的,因此类ifstream拥有类istream的全部成员函数。
同样,类ofstream和类fstream也拥有类ostream的全部成员函数。
这3个类中有一些十分熟悉的成员函数可以使用,如operator<<、operator>>、peek( )、ignore( )、getline( )、get( )等。
在程序中,要使用一个文件,必须包含3个基本步骤:打开(open)文件——操作文件——关闭(close)文件。
《C语言程序设计教程》第三版课后习题参考答案

《C语言程序设计教程》第三版课后习题参考答案C语言程序设计教程第三版课后习题参考答案第一章:C语言概述1.1 C语言的特点答案:C语言是一种通用的、面向过程的程序设计语言,具有高效、简洁、灵活等特点。
它提供了丰富的程序设计元素和功能,适用于各种不同的应用领域。
1.2 C语言程序的基本结构答案:C语言程序由预处理指令、函数声明、函数定义、变量声明和语句组成。
其中,预处理指令用来引入头文件或定义宏,函数声明用来声明函数的名称和参数,函数定义用来实现函数的功能,变量声明用来声明变量的类型和名称,语句用来表达具体的计算过程。
1.3 C语言的数据类型答案:C语言提供了多种数据类型,包括基本类型(整型、浮点型、字符型等)和派生类型(数组、指针、结构体等)。
每种数据类型在内存中占据一定的存储空间,并具有特定的取值范围和操作规则。
1.4 C语言的运算符和表达式答案:C语言支持各种运算符和表达式,例如算术运算符(+、-、*、/等)、关系运算符(>、<、==等)、逻辑运算符(&&、||、!等)等。
通过运算符和表达式可以进行各种数值计算和逻辑判断。
第二章:基本数据类型与运算2.1 整型数据类型答案:C语言提供了不同长度的整型数据类型,包括有符号整型(int、long等)和无符号整型(unsigned int、unsigned long等)。
整型数据类型可以表示整数值,并具有不同的取值范围。
2.2 浮点型数据类型答案:C语言提供了浮点型数据类型(float、double等),用来表示带小数部分的实数值。
浮点型数据可以表示较大或较小的数值,并具有一定的精度。
2.3 字符型数据类型答案:C语言提供了字符型数据类型(char),用来表示单个字符。
字符型数据可以用于表示各种字符(包括字母、数字、符号等)。
2.4 布尔型数据类型答案:C语言不直接支持布尔型数据类型,但可以使用整型数据类型来表示布尔值(0表示假、非零表示真)。
《C程序设计》(第三版)第8章 函数(嵌套及递归调用)

递归算法必须有结束递归条件,否则会产生死机现象! 递归算法必须有结束递归条件,否则会产生死机现象!
11
2.递归函数的执行过程
【例】编一递归函数求n!。 编一递归函数求 。
思路:以求 的阶乘为例 的阶乘为例: 思路:以求4的阶乘为例 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 , , , , 。 递归结束条件: 递归结束条件:当n=1或n=0时,n!=1。 或 时 。 递归公式: 递归公式:
2
(4)函数fun的功能是计算x2-2x+6,主函数中将调用fun函数计算: (4)函数 函数fun的功能是计算 2x+6,主函数中将调用fun函数计算 的功能是计算x 函数计算: y1=(x+8)2-2(x+8)+6 y2=sin2x-2sinx+6 请填空。 请填空。 #include<math.h> fun(double x) double ; main() { double x,y1,y2; scanf(“%lf”,&x); x+8 y1=fun( ); sin(x) ); y2=fun( printf(“y1=%lf,y2=%lf\ printf(“y1=%lf,y2=%lf\n”,y1,y2); } double fun(double x) { return (x*x-2*x+6); } (x*x3
C语言程序设计 第八章 查表

何谓查找表?查找表是由同一类型的数据元素(或记录)构成的集合。
由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。
对查找表经常进行的操作:•1)查询某个“特定的”数据元素是否在查找表中;•2)检索某个“特定的”数据元素的各种属性;•3)在查找表中插入一个数据元素;•4)从查找表中删去某个数据元素。
查找表可分为两类:静态查找表仅作查询和检索操作的查找表。
动态查找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。
若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。
若此关键字能识别若干记录,则称之谓“次关键字”。
查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。
若查找表中存在这样一个记录,则称“查找成功”。
查找结果给出整个记录的信息,或指示该记录在查找表中的位置;否则称“查找不成功”。
查找结果给出“空记录”或“空指针”。
如何进行查找?查找的方法取决于查找表的结构。
由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。
为了提高查找的效率,需要在查找表中的元素之间人为地附加某种确定的关系,换句话说,用另外一种结构来表示查找表。
9.1 静态查找表9.2 动态查找树表9.3 哈希表9.1静态查找表数据对象D :数据关系R :D 是具有相同特性的数据元素的集合。
每个数据元素含有类型相同的关键字,可唯一标识数据元素。
数据元素同属一个集合。
ADT StaticSearchTable {基本操作P:Create(&ST, n);Destroy(&ST); Search(ST, key);Traverse(ST, Visit()); } ADT StaticSearchTable构造一个含n 个数据元素的静态查找表ST 。
%AB%98级语言C++程序设计(第一版)-第八章

202第八章继承与派生(Inheritance and Derive)第八章 继承与派生(Inheritance and Derive) C++程序用不同的类定义来表示一组数据及对这些数据的操作,往往在不同的类之间有某种关系,除了上一章介绍的包含关系和友元关系之外,更多的是继承与派生关系。
例如,一个公司或工厂的计算机管理系统,与设备有关的数据,如设备登号、设备购入时间、设备价值等数据及若干操作的可以构成一个类。
交通工具是设备中的一类,它除了作为设备具有一般性之外,又会有一些作为交通工具的特定数据及操作,如它应有由公安机关发给的牌照号等。
又如汽车,它是交通工具的一种。
司机姓名、牌号,可能是它特有的数据。
而货车、轿车、大客车又是汽车中的不同集合,与它们分别相关的又会有不少数据,如轿车的使用人姓名、货车的吨位、客车的载人数等等,都是它们特有的数据项。
把与设备,交通工具,汽车,轿车,货车,客车相关的数据及操作定义为互不相关的独立的类是不科学的,同时,也会造成许多重复内容,例如,所有这些类,都包括同一个数据成员:设备登记号、购入时间等等。
不同类的定义应反映出类之间的相关关系,反映出上面例子中的层次关系。
C++语言中提供了类定义的派生和继承的功能,很好地解决了上面提出的问题。
两个类之间的继承关系,若类A是类B的基类,则类B是类A的派生类。
我们首先从下面的实例中学习如何建立类与类之间的继承关系。
8.1 公司雇员档案的管理 公司中的雇员档案的管理是整个公司的管理系统的一个组成部分,其雇员的档案数据内容一般根据雇员在公司中的不同职责和位置而有所区别。
除了一般雇员之外,可能还有管理人员、工程技术人员和高级主管,这些人员也是雇8.1 公司雇员档案的管理203员,但他们又有其特殊性,在数据库中又必须保存某些特定的信息,例如管理人员有级别信息,技术人员有学位、专业信息等等。
因此,在管理软件中所设计的类应反映其层次关系和特殊性,下面的程序是一个简化了的层次模块结构。
C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计
1 指针与字符串(5)
1.2 使用字符串指针变量与字符数组的区别(续) 例2 分析下面程序的运行结果
main() { char *a="I Love China!";
a=a+7; printf(“%s\n",a); }
运行结果: China!
9
项目八 优化学生成绩分析系统-指针
C语言程序设计
int a,b,c;
例sc6an将f(给"%出d的,%程d"序,&修a,改&b为);使用函数指针变量定义
的c=方m式ax(a,b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
指针数组,有4个元素,每个元素 都是指向整型变量指针变量
Int (*p)[4];
由4个整型变量组成的数组的指针
21
项目八 优化学生成绩分析系统-指针
#include <stdio.h> ma3in指()针数组 (2)
C语言程序设计
p[0]
11
{ 3.1 指针数组(续)
22
static int
33
a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,1224,4133}};
【项目分析】
为了保存一个班的C语言成绩需要借助于一维数组,通过指针对其数 据进行操作。将本项目分成两部分,首先借助于指针对一维数组进 行访问,然后介绍一种新的排序算法—选择排序。
C语言程序设计 第3版 第8章 函数

s=a+b;
return s;
}
main()
//主函数
{
int s;
s=sum();
printf("s=%d\n",s);
}
运行结果
2 3↙ s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名(形式参数表列) {
函数体; return 表达式; }
调用方式
函数调用的一般形式:
函数名(实际参数表) 实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。
调用方式:
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。 例如:s=sum(x,y);把sum的返回值赋予变量s。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。 例如:sum(x,y);以函数语句的方式调用函数。
void sum(int a,int b) //自定义函数
{
int s;
s=a+b;
ห้องสมุดไป่ตู้
printf("s=%d\n",s);
} main()
//主函数
{
int x=2,y=3;
sum(x,y);
}
运行结果
s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名( ) {
函数体; return 表达式; }
注意说明:
(1)函数的类型实际上是函数返回值的类型。
《C语言程序设计》 课后习题答案 高等教育出版社

《C语言程序设计》课后习题答案高等教育出版社《C语言程序设计》课后习题答案高等教育出版社第一章:C语言概述1. C语言的特点C语言是一种以处理底层任务和系统编程为目标的高级编程语言。
其特点包括语法简洁、执行效率高、可移植性强等。
第二章:C语言基本数据类型1. C语言中的基本数据类型C语言中的基本数据类型包括整型、字符型、浮点型等。
整型可以进一步细分为有符号整型和无符号整型。
第三章:C语言运算符1. C语言中的运算符C语言中常见的运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符等。
这些运算符用于执行各种数学和逻辑操作。
第四章:C语言控制语句1. C语言中的条件语句C语言提供了if语句和switch语句来实现条件判断。
if语句用于执行基于布尔表达式的条件分支,而switch语句用于根据不同的值执行不同的代码块。
第五章:C语言函数1. C语言中的函数定义和调用函数是C语言中的基本模块,用于封装可重用的代码。
函数定义包括函数返回类型、函数名、参数列表和函数体等部分。
第六章:C语言数组1. C语言中的数组定义和使用数组是一组相同类型的数据元素的集合。
C语言中可以使用数组来存储和操作大量数据。
第七章:C语言指针1. C语言中的指针概念指针是一种变量,它存储了内存地址。
通过指针,可以直接访问和修改对应内存地址中的数据。
第八章:C语言字符串1. C语言中的字符串操作字符串是由一系列字符组成的数据类型。
C语言通过字符数组来表示和操作字符串。
第九章:C语言结构体1. C语言中的结构体定义和使用结构体是一种自定义的复合数据类型,它可以包含多个不同类型的成员变量。
第十章:C语言文件操作1. C语言中的文件读写操作文件操作是一种重要的数据输入和输出方式。
C语言提供了一系列函数来实现文件的读写操作。
总结:通过解答以上习题,我们可以更好地掌握C语言的各个方面,提升我们的编程能力和解决问题的能力。
希望本文对读者有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第八章
多态性和虚函数
8.1多态性
静态联编所支持的多态性称为编译时的多态性。
动态联编所支持的多态性称为运行时的多态性,
8.1.1静态联编中的赋值兼容性及名字支配规律
8.1.2 动态联编的多态性
如果让编译器动态联编,也就是在编译“point*P=&c;”语句时,只根据兼容性规则检查它的合理性,也就是检查是否符合“派生类对象的地址可以赋给基类的指针”的条件。
至于“p->area()”
调用哪个函数,等程序运行到这里时再决定。
就要使类point的指针p指向派生类函数area的地址。
假设使用关键字virtual声明point的类area 函数,将这种函数称为虚函数。
当编译系统编译含有虚函数的类时,将为它建立以个虚函数表,表中的每个元素都指向一个虚函数地址。
编译器为类增加一个数据成员,这个数据成员是一个指向该虚函数表的指针,通常称为vptr。
虚函数的地址翻译取决于对象的内存地址。
编译器为含有虚函数的类的对象建立一个入口地址,这个地址用来存放指向虚函数表的指针vptr,然后按照类中的虚函数声明次序,一一填入函数指针。
派生类能继承基类的虚函数表,而且只要是和类同名(参数也相同)的成员函数,无论是否使用virtual 声明,它们都自动成为虚函数。
如果派生类没有改写基类的虚函数,则函数指针调用基类的虚函数。
如果派生改写了基类的函数,编译器将重新为派生类的虚函数建立地址,函数指针会调用改写过的虚函数。
虚函数的调用规则是:根据当前对象,优先调用对象本身的虚成员函数。
8.2 虚函数
一旦基类定义了虚函数该基类的派生类中的同名函数也自动成为虚函数。
8.2.1 虚函数
函数只能是类中的一个成员函数,但不能使静态成员,
8.2.2 虚函数实现多态的条件
关键字virtual指示C++编译器对调用虚函数进行动态联编。
这种多态性是程序运行到需要的语句处才动态确定的,所以称为运行时的多态。
(1)类之间的继承关系满足赋值兼容规则。
(2)改写同名虚函数
(3)根据赋值兼容性规则使用指针
满足钱联条件不一定产生动态编译,必须同时满足第3条才能保证实现动态编译。
第3友分为两种情况:第1中是已经演示过的按赋值兼容性规则使用基类指针(或引用)访问虚函数;第2种是把指针(或引用)作为函数参数,即这个函数不一定是类的成员函数,可以是普通函数,而且可以重载。
8.2.3构造函数和析构函数调用虚函数
在构造函数和析构函数中调用虚函数采用静态联编,
在建立类C的对象c时,它所包含的基类对象在派生类中定义的成员建立之前被建立。
在对象撤销时,该对象所包含的在派生类中定义的成员要先于基类对象之前撤销。
目前推存的C++标准不支持虚构函数。
有于析构函数不允许有参数,因此一个类只能有一个虚析构函数。
虚析构函数使用vitual说明。
Delete运算符合析构函数一起工作(new和构造函数一起工作),当使用delete删除一个对象时,delete 隐含着对析构函数的一次调用,如果析构函数为虚函数,则这个调用采用动态联编。
8.2.4纯虚函数与抽象
Virtual 函数类型函数名(参数列表)=0;
一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类。
如果通过同一个基类派生一系列的类,则将这些类总称为类族。
抽象至少含有一个虚函数,而且至少有一个虚函数是纯虚函数,
8.3 多重继承于虚函数
8.4类成员函数的指针与多态
在派生类中,当一个指向某基类成员的指针向一个虚函数,并且通过指向对象的基类指针(或引用)访问这个虚函数时,仍发生多态性。