谭浩强C程序设计课件完整版第8章
课件谭浩强C++程序设计第8章(带特殊条款)

课件谭浩强C++程序设计第8章(带特殊条款)课件:谭浩强《C++程序设计》第8章概述:第8章主要介绍了C++中的继承和多态性。
继承是面向对象编程中的一种重要特性,它允许我们创建一个新的类(称为派生类),该类继承另一个类(称为基类)的属性和方法。
多态性则允许我们使用一个接口来定义多种不同类型的对象的行为。
本章将详细介绍这两个概念,并通过实例来演示它们的应用。
一、继承的概念与定义1.继承的基本概念继承是面向对象编程中的一种机制,允许我们创建一个新的类(派生类),该类继承另一个类(基类)的属性和方法。
派生类可以添加新的属性和方法,也可以覆盖基类的方法。
2.继承的定义在C++中,继承通过使用冒号和访问权限关键字(如public、protected和private)来定义。
例如,如果我们要创建一个派生类Student,它继承自基类Person,可以如下定义:cppclassPerson{public:stringname;intage;};classStudent:publicPerson{public:stringstudentId;};二、继承的访问权限1.公共继承(public)当一个类使用public关键字进行继承时,基类的public成员在派生类中仍然是public,protected成员在派生类中仍然是protected。
2.保护继承(protected)当一个类使用protected关键字进行继承时,基类的public和protected成员在派生类中都变为protected。
3.私有继承(private)当一个类使用private关键字进行继承时,基类的public和protected成员在派生类中都变为private。
三、继承中的构造函数和析构函数1.构造函数的继承在派生类中,构造函数会调用基类的构造函数,然后执行派生类自己的构造函数。
如果基类有默认构造函数,则可以省略基类构造函数的调用。
11803_谭浩强《C程序设计》课件第8章PPT课件

如何处理文件读写错误?
2024/1/27
04
在进行文件读写操作时,需要判断返回值是否成功,如果 失败则需要使用perror()等函数输出错误信息。
05
如何实现文件的追加写入?
06
在使用fopen()函数打开文件时,使用追加模式"a"或"a+" 可以实现文件的追加写入。
29
拓展延伸:高级文件操作技术探讨
文本文件的读写操作
使用fscanf()、fprintf()等函数进行文 本文件的读写操作。
2024/1/27
文本文件的打开与关闭
使用fopen()函数打开文本文件,使 用fclose()函数关闭文本文件。
文本文件的定位与修改
使用fseek()、ftell()等函数进行文本 文件的定位与修改。
24
二进制文件操作实例
学习要求
认真听讲,理解文件操作的基本概念 和原理;多动手实践,通过编写程序 加深对文件操作的理解和掌握;注意 细节和规范,养成良好的编程习惯。
6
02
文件类型与指针
2024/1/27
7
标准文件类型
2024/1/27
文本文件
存储字符数据,每个字符对应一个ASCII码,Байду номын сангаас于阅读和编辑。
二进制文件
存储二进制数据,适用于非字符数据或需要高效存储和读取的场 景。
write
将指定的数据块写入到指定的文件描述符中(低级I/O函数)。
2024/1/27
14
04
随机访问文件内容
2024/1/27
15
文件定位函数
01
fseek()
用于设置文件位置指针,可以实 现在文件中的任意位置进行读写 操作。
21420_谭浩强C第八章

学生、教师、管理员
明确系统功能
学生信息管理、课程管理、成绩管理、用户管理等
2024/1/25
50
系统需求分析与设计思路
• 分析系统数据:学生信息、课程信息、成绩信息、用户信 息等
2024/1/25
51
系统需求分析与设计思路
设计思路
1
2
采用模块化设计,将系统划分为多个功能模块
3
使用结构体等数据结构,实现数据的存储和操作
2024/1/25
C语言文件操作具有跨平台性 ,可以在不同的操作系统上使 用相同的代码进行文件操作。
C语言文件操作支持二进制文 件和文本文件的读写,可以处 理各种类型的数据。
5
本章学习目标和要求
01
掌握文件的基本概念和 作用,了解文件在程序 中的重要性。
2024/1/25
02
03
熟悉C语言提供的文件操 作函数,能够熟练地进 行文件的读写操作。
while (ch != EOF) {
2024/1/25
17
字符读写函数fgetc和fputc
2024/1/25
putchar(ch);
ch = fgetc(fp);
18
字符读写函数fgetc和fputc
}
2024/1/25
fclose(fp);
```
01
03 02
19
字符串读写函数fgets和fputs
要点一
文件位置指针概念
文件位置指针是一个在程序中用于标识文件当前读写位置 的内部指针。
要点二
文件位置指针作用
通过文件位置指针,程序可以实现对文件的顺序访问和随 机访问。
2024/1/25
谭浩强《C程序设计》课件第8章-讲义

8.1.2 面向对象程序设计的特点
传统的面向过程程序设计是围绕功能进行的,用一 个函数实现一个功能。所有的数据都是公用的,一 个函数可以使用任何一组数据,而一组数据又能被 多个函数所使用(见图8.3)。
图8.3
面向对象程序设计采取的是另外一种思路。它面对 的是一个个对象。实际上,每一组数据都是有特定 的用途的,是某种操作的对象。也就是说,一组操 作调用一组数据。
程序设计者的任务包括两个方面: 一是设计所需的
各种类和对象,即决定把哪些数据和操作封装在一 起;二是考虑怎样向有关对象发送消息,以完成所 需的任务。这时他如同一个总调度,不断地向各个 对象发出命令,让这些对象活动起来(或者说激活这 些对象),完成自己职责范围内的工作。各个对象的 操作完成了,整体任务也就完成了。显然,对一个 大型任务来说,面向对象程序设计方法是十分有效 的,它能大大降低程序设计人员的工作难度,减少 出错机会。
精品
谭浩强《C程序设计》课 第8章
第8章 类和对象
8.1 面向对象程序设计方法概述 8.2 类的声明和对象的定义 8.3 类的成员函数 8.4 对象成员的引用 8.5 类的封装性和信息隐蔽 8.6 类和对象的简单应用举例
8.1 面向对象程序设计方法概述
到目前为止,我们介绍的是C++在面向过程的程序设 计中的应用。对于规模比较小的程序,编程者可以 直接编写出一个面向过程的程序,详细地描述每一 瞬时的数据结构及对其的操作过程。但是当程序规 模较大时,就显得力不从心了。C++就是为了解决编 写大程序过程中的困难而产生的。
清华谭浩强C语言课件教学PPT-第8章 函数

2.函数体:函数首部下用一对{}括起来的部 分。如果函数体内有多个{},最外层是函 数体的范围。
函数体一般包括声明部分、执行部分两部 分。
1)声明部分:在这部分定义本函数所使用 的变量和进行有关声明(如函数声明)。
2)执行部分:程序段,由若干条语句组成 (可以在其中调用其它函数)。
例:输入三个整数,求三个整数中的最大值 不使用函数(除main外)
(2) 连接f(x1)和f(x2)两点,此线(即弦)交x轴于x.
x点坐标可用下式求出:
y
f(x2)
xx1 f(x2)x2 f(x1) x1 x
x2
f(x2)f(x1)
x
再从x求出f(x)。
f(x1) f(x)
3) 若f(x)与f(x1)同符号,则根必在(x,x2)区间内, 此时将x作为新的x1。如果f(x)与f(x2)同符号, 则表示根在(x1,x2)区间内,将x作为新的x2.
3)如果被调函数的值是整型或字符型, 可不必声明类型,系统自动按整型说明。
4)如果在所有被调函数定义之前、在文件 的开头、在函数的外部已对被调函数作了 类型说明,则在各主调函数中可不必说明 其类型。见P166例。
char letter( );
float f( );
一开始就将所有要被
int i( );
系统而定。Turbo C 和 MS C 是按自右至左的顺序求值。 见P162 例8.4
8.4.2 函数调用的方式
按照函数在程序中出现的位置,可以有以下三种调用方式:
1)函数语句:C语言中的函数可以只进行某些操作而不返回
函数值,这时的函数调用可作为一条独立的语句。如 printf( “C pragram”) gets(s);
谭浩强第二版C语言必备课件第08章

注意:多维数组名同样可以作函数的实参和形参,其中
在对形参数组定义时可以指定每一维的大小,也可以省略第 一维的大小说明。
8.7 内部变量与外部变量
C语言中所有的变量都有自己的作用域。变量 说明的位置不同,其作用域也不同,据此将C语言中 的变量分为内部变量和外部变量。 8.7.1 内部变量
8.7.2 外部变量
注:编译系统不检查参数名,因此参数名是什么都无
所谓。 函数原型与函数首部的写法应当一致,即函数类型、 函数名、参数个数、参数类型和参数顺序必须相同。
8.4.2 函数的调用 在程序中,是通过对函数的调用来执行函数体的,其过程与其它 语言的子程序调用相似。 C语言中,函数调用的一般形式为: 函数名([实际参数表])
8.5.1 函数的嵌套调用 函数的嵌套调用是指,在执行被调用函数时,被调用函数又调 用了其它函数。这与其它语言的子程序嵌套调用的情形是类似的, 其关系可表示如图8-1。
[案例8.4] 计算s=1k+2k+3k+……+N k /*案例代码文件名:AL8_4.C*/ /*功能:函数的嵌套调用*/ #define K 4 #define N 5 long f1(int n,int k) /*计算n的k次方*/ { long power=n; int i; for(i=1;i<k;i++) power *= n; return power; }
[案例8.3] 实参对形参的数据传递。 /*实参对形参的数据传递。*/ /*案例代码文件名:AL8_3.C*/
void main() { void s(int n); /*说明函数*/ int n=100; /*定义实参n,并初始化*/ s(n); /*调用函数*/ printf("n_s=%d\n",n); /*输出调用后实参的值,便于进行比较*/ getch(); } /* */ void s(int n) { int i; printf("n_x=%d\n",n); /*输出改变前形参的值*/ for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/ printf("n_x=%d\n",n); /*输出改变后形参的值*/ }
2022年C语言程序设计教程(第3版) 谭浩强 课件 最新 8

程序数据区
输入缓冲区 输出缓冲区
外部介质
一般说,二进制文件节省存储空间而且输入输出的速 度快(因为在输出时不需要把数据由二进制形式转换为字 符代码,在输入时也不需要把字符代码先转换成二进制形 式然后存入内存)。如果存入磁盘中的数据只是暂存的中 间结果数据,以后还要调入继续处理的,一般用二进制文 件以节省时间和空间。如果输出的数据是准备作为文档供 给人们阅读的,一般用字符代码文件,它们通过显示器或 打印机转换成字符输出。一般高级语言都能提供字符代码 文件(ASCII文件)和二进制文件,用不同的方法来读写这 两种不同的文件。
f:\\exe3\\file1.txt 文件名是文件的主要标志,它必须符合C语言关于标 识符的规定。 文件名后缀,用于对文件进行补充说明,一般不超过 三个字符,通常用特定的后缀表明文件的类型。例如.txt 表明是纯字符文件,用.c表示是C语言源程序文件, 用.exe表示是可执行文件等。
8.1.3 文件的位置指针与读写方式
fp1 文 件 1 fp2 文 件 2 fp3 文 件 3
的信息
的信息
的信息
区
区
区
8.2.3 文件的打开与关闭——流的创建与 撤销
1. 文件的打开 fopen (文件名,文件操作方式); 说明:
(1)文件名应当包含文件路径、主文件 名和文件后缀,即提供找到文件的有关信 息。
(2)应当理解文件操作用方式的意义。
FILE * fp; char name[20]; int num; float score; if ((fp=fopen(“f:\\C3exe\\file3.txt”,”w”))==NULL) {
谭浩强版C++程序设计 第8章 类和对象

长方形类
class CRect { private: char color[10]; int left; int top; int length; int width; public: void SetColor(char *c); void SetSize(int l, int w); void Move(int t,int l); void Draw(); };
成员函数定义
void CRect::SetColor(char *c) void CRect::SetSize(int l, int w) { { strcpy(color, c); length=l; } width = w; void CRect::Move(int t,int l) } { top = t; left = l; } void CRect::Draw() { cout << "矩形左上角坐标为(" << left << "," << top << ")" << endl; cout << "矩形长和宽分别为" << length << "," << width << endl; cout << "矩形的颜色是" << color << endl; }
int main( ) { Time t1; cin>>t1.hour; cin>>t1.minute; cin>>t1.sec; cout<<t1.hour<<″:″<<t1.minute< <″:″<<t1.sec<<endl; return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.1 结构体
8.1.2结构体变量的定义 结构体变量的定义
定义了结构体类型之后,就可以在此基础上定义结构体类型的变量, 结构体变量的定义可以采用以下三种方法: 1.先定义结构体类型再定义变量,例如上面已定义了一个结构体类 型 struct date,可以用它来定义变量: struct date birthday; 2.在定义类型的同时定义变量上面可改写为: 例如 struct date { int year; int month; int day; } student1,student2; 即在结构体类型定义后直接写出变量名.
以上定义了一个数组stu,数组有3个元素,均为struct student 类 型数据.也可以直接定义一个结构体数组,例如: struct student { int num; ... }stu [3] [3]; 或者 struct { int num; ... }stu[3];
8.2结构体数组 结构体数组
8.1 结构体
8.1.3结构体变量的引用 结构体变量的引用
在定义结构体变量以后,可以引用这个变量中的成员.但是怎 样引用?在C语言中一般不整体引用.对结构体变量的使用主要是 对其成员的操作, 引用成员的一般形式为: 结构体变量名.成员名 其中"."是成员运算符,它优先级别最高, 引用结构体变量应遵守以下规则: 1.不能将一个结构体变量作为一个整体加以引用,只能引用结构体 变量中的成员.经常把结构体变量名.成员名看作一个整体进行操作. 例如: student1.year=2008; student1.month=8;
8.1 结构体
2)对结构体变量中的成员,可以单独使用,其作用与地 位相当于普通变量. 3)结构体类型的成员可以是一个已定义的结构体类型变 量.如 结构体类型struct student中的struct date birthday; 这样先定义了一个struct date类型,它包括三个成 员,然后在定义结构体类型struct student时,成员 birthday被定义为struct date类型. 4)结构体类型中的成员可以与程序中的变量同名,二 者不代表同一对象.
8.2结构体数组 结构体数组
定义数组stu时,元素个数可以不指定,即写成以下形式: stu[ ]={{…},{…},{…}};数组成员见图8-1 num
10101 10102 10104
name
LiLin ZhangFun WangMing
sex age score
M M F 18 19 20 87.5 99 78.5
第八章
结构体和共用体
本章目录
8.1 结构体 8.2结构体数组 结构体数组 8.3指向结构体类型数据的指针 指向结构体类型数据的指针 8.4链表 链表 8.5 共用体
前面已经介绍了C语言中的大部分数据类型,包括基本 前面已经介绍了 语言中的大部分数据类型, 语言中的大部分数据类型 类型,数组类型,指针类型等. 类型,数组类型,指针类型等.但在实际生活中有许多 需要由不同类型的数据共同描述的实体, 需要由不同类型的数据共同描述的实体,比如通讯录可 由姓名,地址,电话,邮政编码等组成; 由姓名,地址,电话,邮政编码等组成;一个学生的情 况可由姓名,性别,年龄,成绩, 况可由姓名,性别,年龄,成绩,家庭住址等数据项组 成.C 语言提供了这样一种数据结构,它们是结构体类 语言提供了这样一种数据结构, 型和共用体类型. 型和共用体类型.源自8.2结构体数组 结构体数组
一个结构体变量中可以存放一组数据(如一个学生的考号,姓名,成绩等 数据).如果有10个学生的数据需要参加运算,显然应该用数组,这就是 结构体数组.结构体数组与以前介绍过的数值型数组不同之处在于每个数 组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项.
8.2.1
8.1 结构体
2.如果成员本身又属于一个结构体类型,则需要再次使用取成员运 算符".",这样逐级的应用成员运算符找到最低级的成员. 例如: student1.birthday.year 3.对结构体类型变量的成员所能执行的操作,与具有相同类型的普 通变量所能执行的操作相同,包括赋值,输入输出,运算等. 例如: student1.year++; 4. C语言允许两个同类型的结构体变量之间相互赋值.在执行 "student2=student1;" 不允许用赋值语句将一组常量直接赋给一个结构体变量.输入下面 语句不合法: Student1 = {〃Wang Li〃,18,M′,12,15,1974,89101,89.5}; 下面通过程序来应用结构体变量的成员.
8.2结构体数组 结构体数组
程序定义一个全局的结构体数组leader,它有3个元素,每一个元 素包含两个成员name(姓名)和 count( 票数).在定义数组时 使之初始化,使3位候选人的票数都先置零. 在主函数中定义字符数组leader_name,它代表被选人的具体人名, 然后把它与3个候选人姓名相比,看它和哪一个候选人的名字相同. 注意leader_name是和结构体数组中的leader[j].name相比, leader[j]是结构体数组中的字符数组leader的第j个元素,它包含 两个成员项,leader_name应该和leader数组第j个元素的name 成员相比.若j为某一值时,输入的姓名与leader[j].name相等, 就执行"leader[j].count++",由于成员运算符"."优先于自增运 算符"++",因此它相当于(leader[j].count)++,使leader[j] 的成员count的值加1.在输入和统计结束之后,将3人的名字和得 票数输出.
8.1 结构体
3.直接定义结构体类型变量,即不定义结构体类型名,在写出结构 体类型后直接写出变量名 struct { int year; int month; int day; } student1,student2; 定义变量后,编译系统会为它分配存储空间,存储空间的大小是 结构体各成员变量所占内存单元的总和. 结构体类型变量说明: 1)类型与变量的概念不同.对结构体类型变量来说,在定义时一般 先定义结构体类型,然后再定义该结构体类型的变量.只能对结构 体类型的变量赋值,存取或运算,而不能对结构体类型赋值,存取 或运算.在编译时对类型是不分配存储空间的,只对变量分配存储 空间.
8.1 结构体
在C语言中,基本类型数据在系统已经有系统定义好了,编程人员 只要直接应用它们就可以了.但是结构体是一种构造类型,在使用 该类型的数据之前必须先给出类型定义即先定义后使用.
8.1.1结构体类型的定义 结构体类型的定义
1. 结构体类型的定义的一般形式为: struct 结构体类型名 { 数据类型1 成员名1; 数据类型2 成员名2; ┋ 数据类型n 成员名n; }; 结构体名的命名应该遵守标识符的命名规则.打括号内可以包 含若干个成员,每个成员应有具体的数据类型.
8.1 结构体
例如 struct student { char name[8]; char sex[2]; struct date birthday; }; 结构体类型struct student的定义中,成员birthday是结构 体类型,这就形成了结构体的嵌套. 结构体类型的定义完成后,我们就可以应用该结构体类型的变量, 它的使用和int ,float等相同,如上例中定义了struct date结构体 类型,在struct student结构体定义中用到了struct date结构体类 型的变量birthday.
定义结构体数组
和定义结构体变量的方法相仿,只需说明其为数组即可.例如: struct student { int num; char name[20]; char sex; int age ; float score; char addr[30]; } struct student stu[3];
8.2结构体数组 结构体数组
8.2.2结构体数组的初始化 结构体数组的初始化
1. 与其他类型的数组一样,对结构体数组可以初始化.结构体数组 初始化的一般形式是在定义数组的后面加上"={初值表列};" 例如: struct student { int num; char name[20]; char sex; int age; float score; char add[30]; }stu[3]={{10101,"li lin", 'M' ,18,87.5," 103 Bei jing Road"},{10102,"Zhang fun",'M',19,99,"130 Shanghai Road"},{10104," Wang Min",'F', 20,78.5,"1010 Zhongshan Road"}};
8.2结构体数组 结构体数组
2. 举一个简单的例子来说明结构体数组的定义和引用. 例8.2 对候选人得票的统计程序.设有3个候选人,每次输入一个 得票的候选人的名字,要求最后输出各人得票结果. 程序如下: #include <stdio.h> #include <string.h> struct person { char name[20]; int count; } leader[3]={"Li",0,"Zhang",0,"Fun",0}; main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++)
8.1 结构体
例8.1 学生信息输出. struct date { int month; int day; int year; }; struct stud_type { char name[20]; int age; char sex; struct date birthday; long num; float score; }; main ( ) {