《C语言程序设计》第九章:群体类和群体数据的组织

合集下载

《C程序设计》课程标准

《C程序设计》课程标准

《C程序设计》课程标准一、课程说明:1.本课程的性质:C程序设计是近年来在国内外得到迅速推广应用的一种现代程序设计语言,它以丰富灵活的控制和数据结构,简洁而高效的语句表达、良好的移植性,已被广泛的应用于系统软件和应用软件的开发中。

2.本课程教学目的及任务:教学目的:通过学习C程序设计课程,使学生掌握 C语言的基本内容及程序设计的算法思想与编程技巧,了解进行科学计算的一般思路,培养学生应用计算机解决和处理实际问题的思维方法与基本能力,为以后学习数据结构、操作系统等后继课程创造必备的条件,并为今后从事软件开发打下良好基础。

教学任务:通过理论学习和编程训练,使学生了解C语言特点,理解C语言的基本概念,掌握C语言的语法规则和结构化程序设计的特点、方法及开发工具的使用,激发学生底层编程方向的兴趣,培养学生的编程能力。

3.本课程教学与其他课程的关系:先修课程:《计算机文化基础》后继课程:《数据结构》、《操作系统》、《数据库原理及应用》4.教学时数分配:总学时72,理论52,实验20。

教学时数分配表5.建议教材与参考书谭浩强·《C程序设计》(第三版)·清华大学出版社谭浩强·《C语言程序设计》(第二版)·清华大学出版社·2008主要参考书:谭浩强·《C程序设计》(第三版)·清华大学出版社谭浩强·《C语言程序设计》(第二版)·清华大学出版社谭浩强·《C程序设计题解与上机指导》(第三版)清华大学出版社谭浩强·《C程序设计教程实习指导与模拟试题》6.考核模式:考试二、课程内容:第一章 C语言概述【教学要求】:熟悉TURBO C2.0/VisualC++6.0集成环境的使用了解用计算机解决实际问题的基本步骤掌握C程序的构成和C程序的运行过程。

【本章重点】:C程序的构成和C程序的运行过程【本章难点】:用计算机解决实际问题的基本步骤【教学内容】:第一节:C语言出现的历史背景第二节:C语言的特点第三节:简单的C程序介绍第四节:C程序的上机步骤和方法【参考书目】:谭浩强·《C语言程序设计》(第二版)·清华大学出版社第二章数据类型、运算符与表达式【教学要求】:掌握C语言中的各种数据类型及变量的定义方法。

c“加”“加”9群体类和群体数据的组织

c“加”“加”9群体类和群体数据的组织
动态数组由一系列位置连续的,任意数量 相同类型的元素组成。 – 优点:其元素个数可在程序运行时改变 。
动态数组类模板:例9-3(9_3.h)
#ifndef ARRAY_CLASS #define ARRAY_CLASS using namespace std;
•动态数组类模板程 序
#include <iostream>
求绝对值函数的模板
• 函数模板
#include<iostream> using namespace std; template<typename T> T abs(T x) { return x<0?-x:x; }
int main() { int n=-5;
double d=-5.5; cout<<abs(n)<<endl; cout<<abs(d)<<endl; }
item中已存入数值 item = x; // 将x值存入item }
•11
int main() { Student g= {1000, 23};
Store<int> S1, S2; Store<Student> S3; Store<double> D;
S1.PutElem(3); S2.PutElem(-7); cout << S1.GetElem() << " " << S2.GetElem() << endl;
S3.PutElem(g); cout << "The student id is " << S3.GetElem().id << endl;

面向对象程序设计(3.3.6)--群体类和群体数据的组织实验

面向对象程序设计(3.3.6)--群体类和群体数据的组织实验

实验九 群体类和群体数据1、 实验目的1. 了解节点类的声明与实现,学习其使用方法;2. 了解链表类的声明与实现,学习其使用方法;3. 了解栈类的声明与实现,学习其使用方法;4. 了解队列类的声明与实现,学习其使用方法;5. 掌握对数组元素排序的方法;6. 掌握对数组元素查找的方法;2、 实验任务1. 编写程序Node.h 实现例9-5的节点类,并编写测试程序lab9_1.cpp 实现链表的基本操作。

2. 编写程序link.h 实现例9-6的链表类。

在测试程序lab9_2.cpp 中声明两个整型链表A 和B ,分别插入5个元素,然后把B 中的元素加入A 的尾部。

3. 编写程序queue.h ,用链表实现队列(或栈)类。

在测试程序lab9_3.cpp 中声明一个整型队列(或栈)对象,插入5个整数,压入队列(或栈),再依次取出并显示出来。

4. (选做)声明course (课程)类,有属性:课程名char name[21]、成绩short score ;在实验七中的student 类中增加属性:所修课程courses ,为课程类对象的链表。

在测试程序中测试这个类。

学生类与课程类关系如图9-1所示。

图9-1 类图5. 将直接插入排序、直接选择排序、冒泡排序、顺序查找函数封装到第9章的数组类中,作为成员函数。

实现并测试这个类。

第 9 章 群体类和群体数据的组织•2•6. (选做)声明一个对people类对象数组按编号排序的函数,一个按编号查找people对象的函数。

在测试程序中使用前面实验得到的结果声明教师数组和学生数组,分别对教师数组和学生数组进行排序和查找。

三、实验步骤提示见《C++语言程序设计(第4版)学生用书》,郑莉等编著,清华大学出版社。

C语言程序设计-杨路明第9章课件

C语言程序设计-杨路明第9章课件
现在定义了一个结构体数组students,它有3个元素,又定义了一个结构体变量 student1,则下面的赋值合法。 student1=students[0]; students[2]=students[1]; students[1]=student1;
9.3.3 结构体数组的使用
(3) 不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成 员对象进行输入输出。例如:
/*学号*/
char name[20]; /*姓名*/
char sex;
/*性别*/
int age;
/*年龄*/
float score;
/*C成绩*/
char addr[40];
};
注:‘;’不能省
结构体类型定义描述结构 的组织形式,不分配内存
9.1 结构体类型的定义
例如,考虑10门课程成绩, 加上总成绩与平均成绩,可作如下定义:
struct是关键字,不能省略
struct
[结构体类型名] {
成员说明列表: ……….
}
成员类型可以是 基本型或构造型
9.1 结构体类型的定义
实例:定义结构体类型,描述下列数据 (1) 学生情况: 包含学生的学号、 姓名、 性别、 年龄、C语言课程成绩,地址:
struct student
{ int num;
输出stud变量,应该使用如下方式:
应该如何输出stud变量?
printf(″%s,%s,%ld\n″,,stud.addr,stud.num); 输入stud变量的各成员值,则用:
scanf(″%s%s%ld″,,stud.addr,&stud.num);
9.3 结构体类型数组
9.4.2 指向结构体数组元素的指针

c语言程序设计教程

c语言程序设计教程

C语言程序设计教程C语言是一种通用的、面向过程的程序设计语言,被广泛应用于软件开发和系统编程。

学习C语言需要掌握一些基本的语法规则和编程技巧。

以下是一个简单的C语言程序设计教程的大致内容:1 .C语言的基本语法和数据类型:学习C语言的基本语法,如语句的结构和控制流程,了解C语言的数据类型,如整型、字符型等。

2 .变量和常量:了解C语言中的变量和常量的概念,学习如何声明和使用变量,以及常量的使用。

3 .运算符:了解C语言中的运算符,如算术运算符、关系运算符、逻辑运算符等,学习它们的使用方法和优先级。

4 .控制语句:学习C语言中的控制语句,如条件语句(if语句)、循环语句(for循环、Whi1e循环)和跳转语句(break 语句、COntinUe语句)等。

5 .数组和字符串:学习C语言中的数组和字符串的概念,了解它们的声明和使用方法,学习一些常用的数组和字符串操作函数。

6 .函数:学习C语言中的函数的概念,了解函数的定义和调用方法,学习函数的参数和返回值的使用。

7 .指针:学习C语言中的指针的概念,了解指针的声明和使用方法,学习指针和数组、指针和函数之间的关系。

8 .结构画口联合体:学习C语言中的结构体和联合体的概念,了解它们的定义和使用方法,学习如何使用结构体和联合体来组织复杂的数据。

9 .文件操作:学习C语言中的文件操作,包括文件的打开、读写操作和关闭文件。

10 .动态内存分配:学习C语言中的动态内存分配,了解如何使用ma11oc函数和free函数来动态分配和释放内存。

以上是一个简单的C语言程序设计教程的大致内容,希望对你学习C语言有所帮助。

当然,C语言是一个很庞大的编程语言,除了以上内容外还有很多其他的知识点和技巧需要学习和掌握。

《C语言程序设计与数据结构》课件第09章结构体与共用体

《C语言程序设计与数据结构》课件第09章结构体与共用体

C语言程序设计与数据结构
C编译程序按照每个成员在结构体中声明的顺 序一一对应赋值,不可以跳过前面的成员直接给后 面的成员赋值,但是可以只给前面若干成员赋值, 后面没有赋值的成员由系统赋予默认值。
C语言程序设计与数据结构
3.结构体变量的引用 (1) 一般结构体变量的引用 一般结构体变量的引用是通过成员运算符“.”来实 现的,形式如下: 结构体变量名.成员名
学习重点: 结构体的概念; 结构体成员的引用。
C语言程序设计与数据结构
结构体概念的引入 (为什么需要结构体?)
C语言程序设计与数据结构
已经学习过的数据类型: 整形、实型、字符型 ,另外还有数组。 问题: 以上数据类型和数组是否完全满足编程需要? (例如:如何定义一个工人变量?)
C语言程序设计与数据结构
C语言程序设计与数据结构
上述五个数据项组成了工人的整体,这就是一 个结构体类型的数据,我们可以给这个数据命名为 worker,只要是worker类型的数据,都包括这五个 数据项。
C语言程序设计与数据结构
9.1 结构体类型的说明
C语言程序设计与数据结构
结构体类型是包含若干个相同或不同数据类型数 据项的集合,我们把这些数据项称之为结构体成员, 声明结构体类型的一般形式为: struct 结构体标识名 { 数据类型名1 结构体成员名表1; 数据类型名2 结构体成员名表2; ..... 数据类型名n 结构体成员名表n; };
C语言程序设计与数据结构
与同一类型的普通变量一样,结构体变量中的各个成 员也可以进行相应的各种运算,如: worker1.sex =„F‟; worker1. age++; worker1.salary=3000f;

面向对象程序设计(3.3.1)--群体类和群体数据的组织(一二)

面向对象程序设计(3.3.1)--群体类和群体数据的组织(一二)

const int A_COUNT = 8, B_COUNT = 8, C_COUNT = 20;
int a [A_COUNT] = { 1, 2, 3, 4, 5, 6, 7, 8 };
// 定
义 int 数组
double b[B_COUNT] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 };// 定义 double 数组
#include <iostream> using namespace std; template<typename T> T abs(T x) {
return x < 0? -x : x; } int main() {
int n = -5; double d = -5.5; cout << abs(n) << endl; cout << abs(d) << endl; return 0; }
9.1 函数模板与类模板
9
9.1.2 类模板
• 类模板的作用
使用类模板使用户可以为类声明一种模式,使得类中 的某些数据成员、某些成员函数的参数、某些成员函 数的返回值,能取任意类型(包括基本类型的和用户 自定义类型)。
C++ 语言程序设计(第 4 版),郑莉,清华大学
9.1 函数模板与类模板 —— 9.1.2 类模板
C++ 语言程序设计(第 4 版)
第九章 群体类和群体数据的组织 (一 二)
2
目录
9.1 函数模板与类模板 9.2 线性群体 9.3 群体数据的组织 9.4 综合实例——对个人银行账户管理程序的改
进 9.5 深度探索 9.6 小结

《C语言程序设计》 课后习题答案 高等教育出版社

《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语言的各个方面,提升我们的编程能力和解决问题的能力。

希望本文对读者有所帮助。

c语言程序设计双色版答案

c语言程序设计双色版答案

c语言程序设计双色版答案C语言程序设计是计算机科学与技术专业的基础课程之一,通过学习该课程,学生可以掌握C语言的基本语法和编程技巧。

本文将针对C语言程序设计的双色版答案进行详细的讲解。

以下是各章节的答案内容:第一章:C语言概述与开发环境1. C语言是一种通用的高级程序设计语言,具有良好的可移植性和高效性。

2. 开发环境包括编译器、集成开发环境(IDE)等,可以根据个人习惯选择适合自己的开发环境。

第二章:C语言基本语法和数据类型1. C语言的基本语法包括标识符、关键字、运算符、表达式、语句和注释等。

2. 数据类型分为基本数据类型(整型、浮点型、字符型)和派生数据类型(数组、结构体、枚举、指针)。

第三章:C语言运算符和表达式1. 运算符包括算术运算符、关系运算符、逻辑运算符、赋值运算符等。

2. 表达式是由运算符、操作数和运算符优先级组合而成的。

第四章:C语言流程控制1. 流程控制分为顺序结构、选择结构和循环结构。

2. 选择结构包括if语句、switch语句,循环结构包括while循环、do-while循环和for循环。

第五章:C语言函数1. 函数是一段完成特定任务的独立代码块,可以重复使用。

2. 函数的定义包括函数名、参数、返回值类型和函数体。

第六章:C语言数组1. 数组是一组相同类型的元素集合,可以通过下标访问元素。

2. 数组可以是一维数组或多维数组,使用二维数组可以表示矩阵等数据结构。

第七章:C语言指针1. 指针是保存内存地址的变量,可以用于操作内存中的数据。

2. 指针的操作包括取地址操作、指针运算、指针与数组的关系等。

第八章:C语言字符和字符串处理1. 字符是编程语言中的基本单元,可以用于表示文本和符号等。

2. 字符串是字符的数组,可以用于表示文本、姓名等较长的数据。

第九章:C语言结构体与共用体1. 结构体是将不同类型的数据组合在一起形成一个新的数据类型。

2. 共用体是一种特殊的数据类型,不同成员共享同一块内存地址。

C语言程序(第四版)(谭浩强编)教程-第9章_用户自己建立数据类型

C语言程序(第四版)(谭浩强编)教程-第9章_用户自己建立数据类型

#include <stdio.h> int main() {struct Student { long int num; char name[20]; char sex; char addr[20]; }a={10101,“Li Lin”,„M‟, “123 Beijing Road”}; a.num=10010; 对
9.2 使用结构体数组
9.2.1定义结构体数组
9.2.2 结构体数组的应用举例
9.2.1定义结构体数组
例9.3 有3个候选人,每个选民只能 投票选一人,要求编一个统计选票的 程序,先后输入被选人的名字,最后 输出各人得票结果。
9.2.1定义结构体数组
解题思路:
设一个结构体数组,数组中包含3个元素
3. 不指定类型名而直接定义结构体类型变量
其一般形式为:
struct
{ 成员表列 }变量名表列;
指定了一个无名的结构体类型 。
9.1.2 定义结构体类型变量
(1) 结构体类型与结构体变量是不同的概 念,不要混同。只能对变量赋值、存取 或运算,而不能对一个类型赋值、存取 或运算。在编译时,对类型是不分配空 间的,只对变量分配空间。
#include <stdio.h> int main() {struct Student { long int num; char name[20]; char sex; char addr[20]; }a={10101,“Li Lin”,„M‟, { } “123 Beijing Road”}; printf("NO.:%ld\nname:%s\n sex:%c\naddress:%s\n", a.num,,a.sex,a.addr); return 0; }

《C语言程序设计教程》全册教案完整版教学设计

《C语言程序设计教程》全册教案完整版教学设计

《C语言程序设计教程》第一章教案一、教学目标1. 让学生了解C语言的发展历程和特点。

2. 掌握C语言的基本语法和结构。

3. 学会使用C语言编写简单的程序。

二、教学内容1. C语言的发展历程和特点2. C语言的基本语法和结构3. C语言程序的基本框架4. 简单的C语言程序示例三、教学方法采用讲授法、示例法、练习法相结合的方式进行教学。

四、教学步骤1. 引入话题:介绍C语言的发展历程和特点。

2. 讲解C语言的基本语法和结构,包括数据类型、变量、常量、运算符、表达式等。

3. 讲解C语言程序的基本框架,包括主函数、变量定义、函数体等。

4. 通过示例程序,让学生了解和掌握C语言编程的基本方法。

5. 布置练习题,让学生课后巩固所学知识。

五、教学评价通过课堂提问、练习题、课后作业等方式对学生的学习情况进行评价。

《C语言程序设计教程》第二章教案一、教学目标1. 让学生掌握C语言的运算符和表达式。

2. 学会使用C语言进行基本的输入输出操作。

3. 了解C语言的控制语句,包括条件语句和循环语句。

二、教学内容1. C语言的运算符和表达式2. C语言的输入输出操作3. C语言的控制语句三、教学方法采用讲授法、示例法、练习法相结合的方式进行教学。

四、教学步骤1. 复习C语言的基本语法,引入运算符和表达式的概念。

2. 讲解各种运算符的用法和优先级,通过示例让学生掌握运算符和表达式的使用。

3. 讲解C语言的输入输出操作,包括printf函数和scanf函数的使用。

4. 讲解C语言的控制语句,包括if语句、switch语句、for循环、while循环等。

5. 通过示例程序,让学生掌握控制语句的使用方法。

6. 布置练习题,让学生课后巩固所学知识。

五、教学评价通过课堂提问、练习题、课后作业等方式对学生的学习情况进行评价。

《C语言程序设计教程》第三章教案一、教学目标1. 让学生掌握C语言的函数概念和作用。

2. 学会自定义函数,并了解函数的调用方式。

程序设计-群体类和群体数据的组织(三 四)

程序设计-群体类和群体数据的组织(三 四)

C++语言程序设计(第4版),清华大学
9.2 线性群体 —— 9.2.2 直接访问群体——数组类
15
Array类的应用
• 例9-4求范围2~N中的质数,N在程序运行时由键 盘输入。
C++语言程序设计(第4版),清华大学
9.2 线性群体 —— 9.2.2 直接访问群体——数组类
16
#include <iostream> #include <iomanip> #include "Array.h"
//返回当前对象中私有数组的首地址
例9-3(续)
C++语言程序设计(第4版),清华大学
9.2 线性群体 —— 9.2.2 直接访问群体——数组类
5
template <class T>
Array<T>::operator const T * () const {
return list; //返回当前对象中私有数组的首地址
T &Array<T>::operator[] (int n) {
assert(n >= 0 && n < size); //检查下标是否越界
return list[n];
//返回下标为n的数组元素
}
template <class T>
const T &Array<T>::operator[] (int n) const {
}
//取当前数组的大小
template <class T>
int Array<T>::getSize() const {

C程序设计(第四版)教案第九章

C程序设计(第四版)教案第九章

学习好资料欢迎下载教案首页第9章用户自己建立数据类型9.1 定义和使用结构体变量9.1.1 自己建立结构体类型用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系声明一个结构体类型的一般形式为:struct 结构体名{ 成员表列 };说明:(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如struct Teacherstruct Workerstruct Date等结构体类型各自包含不同的成员(2) 成员可以属于另一个结构体类型。

struct Date{ int month; int day; int year; };struct Stu{ int num;char name[20];char sex;int age;struct Date birthday;char addr[30];};前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。

相当于设计好了图纸,但并未建成具体的房屋。

为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。

9.1.2 定义结构体类型变量1. 先声明结构体类型,再定义该类型变量声明结构体类型struct Student,可以用它来定义变量struct Student student1,student2;2.在声明类型的同时定义变量struct Student{ int num;char name[20];char sex;int age;float score;char addr[30];} student1,student2;3. 不指定类型名而直接定义结构体类型变量其一般形式为:struct{ 成员表列 }变量名表列;指定了一个无名的结构体类型。

锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街

锟节撅拷锟斤拷 群锟斤拷锟斤拷锟饺猴拷锟斤拷锟斤拷莸锟斤拷锟街

声明一个实现任意类型数据存取的类模板Store,然后通过具体 数据类型参数对类模板进行实例化,生成类,然后灰再被实例 化具体对象
using namespace std; // 结构体Student struct Student { int id; //学号 float gpa; //平均分 };
template <class T> //类模板:实现对任意类型数据进行存取 class Store { private: T item; // 用于存放任意类型的数据 int haveValue; // 用于标记item是否已被存入内容 public: Store(void); // 默认形式(无形参)的构造函数 T GetElem(void); //提取数据函数 void PutElem(T x); //存入数据函数 };
}
int main() { int n=-5; double d=-5.5; cout<<abs(n)<<endl; cout<<abs(d)<<endl; }
运行结果: 5 5.5
求绝对值函数的模板分析
函 数 模 板
编译器从调用abs()时实参的类型, 推导出函数模板的类型参数。例如, 对于调用表达式abs(n),由于实参n 为int型,所以推导出模板中类型参 数T为int。 当类型参数的含义确定后,编译器将 以函数模板为样板,生成一个函数: int abs(int x) { return x<0?-x:x; }
函数模板
函数重载通常是对于不同的数据类型完成类似的操 作。很多情况下,一个算法是可以处理多种数据类 型的。但是用函数实现算法时,即使设计为重载函 数也只是使用相同的函数名,函数体仍然要分别定 义 int abs(int x) { return x<0?-x:x;} double abs(double x) { return x<0? -x:x;}

第9章 群体类和群体数据的组织

第9章 群体类和群体数据的组织
4
C++语言程序设计
模板的概念
1、模板概念 – 模板是对具有相同特性的函数或类的再抽象, 模板是一种参数多态性的工具,可以为逻辑 功能相同而类型不同的程序提供一种代码共 享的机制。 – 一个模板并非一个实实在在的函数或类,仅 仅是一个函数或类的描述,是参数化的函数 和类。 2、模板分类
– 函数模板 – 类模板
21
C++语言程序设计
模板参数
1、模板参数的转换问题 C++在实例化函数模板的过程中,只是 简单地将模板参数替换成调用实参的类 型,并以此生成模板函数,不会进行参 数类型的任何转换。
22
C++语言程序设计
函数模板的实例化
【例2】 求两个数最大值的普通函数。 #include <iostream> using namespace std; double max(double a,double b){return (a>b)?a:b;} void main(){ double a=2,b=3.4; float c=5.1,d=3.2; cout<<"2, 3.2 的最大值是: "<<max(2,3.2)<<endl; cout<<"a, c 的最大值是:"<<max(a,c)<<endl; cout<<"'a', 3 的最大值是: "<<max('a',3)<<endl; }
12
C++语言程序设计
函数模板的定义
1、函数模板的定义 template <class T1, class T2,…>返回类型 函数名(参数 表){ …… //函数模板定义体 }

群体类和群体数据

群体类和群体数据

(二〇一一年 十 一月《面向对象的程序设计》实验报告 学校代码: 10128 学 号:题 目:群体类和群体数据 学生某: 学 院:理学院 系 别:数学系 专 业:信息与计算科学 班 级: 任课教师:一、实验目的1、了解节点类的声明和实现,学习其使用方法2、了解链表类的声明和实现,学习其使用方法3、了解栈类的声明和实现,学习其使用方法4、了解队列类的声明和实现,学习其使用方法5、掌握对数组元素排序的方法6、掌握对数组元素查找的方法二、实验内容1.、编写程序Node.h实现例9-5的节点类,并编写测试程序lab9_1.cpp,实现链表的基本操作2、编写程序link.h实现例9-6的链表类,在测试程序lab_2.cpp中声明两个整型链表A和B,分别插入5元素,然后把B中的元素加入A的尾部3、编写程序queue.h,用链表实现队列(或栈),在测试程序lab9_3.cpp中声明一个整型队列(或栈)对象,插入5个整数,压入队列(或栈),再依次取出并显示出来。

4、将直接插入排序、直接选择排序、冒泡排序、顺序查找函数封装到第九章的数组类中,作为成员函数,实现并测试这个类。

三、实验程序及结果1.程序一//9_5.h#ifndef NODE_CLASS#define NODE_CLASS//类定义部分template <class T>class Node{private:Node<T> *next; //指向后继节点的指针public:T data; //数据域// 构造函数Node (const T& item, Node<T>* ptrnext = NULL);// 在本节点之后插入一个同类节点pvoid InsertAfter(Node<T> *p);// 删除本节点的后继节点,并返回其地址Node<T> *DeleteAfter(void);// 获取后继节点的地址Node<T> *NextNode(void) const;};// 类的实现部分// 构造函数,初始化数据和指针成员template <class T>Node<T>::Node(const T& item, Node<T>* ptrnext) :data(item), next(ptrnext){}// 返回私有的指针成员template <class T>Node<T> *Node<T>::NextNode(void) const{return next;}// 在当前节点之后插入一个节点ptemplate <class T>void Node<T>::InsertAfter(Node<T> *p){p->next = next; //p节点指针域指向当前节点的后继节点next = p; //当前节点的指针域指向p}// 删除当前节点的后继节点,并返回其地址template <class T>Node<T> *Node<T>::DeleteAfter(void){Node<T> *tempPtr = next; //将欲删除的节点地址存储到tempPtr中if (next == NULL) //如果当前节点没有后继节点,则返回NULLreturn NULL;next = tempPtr->next; //使当前节点的指针域指向tempPtr的后继节点return tempPtr; //返回被删除的节点的地址}#endif // NODE_CLASS//Node.h#ifndef NODE_LIBRARY#define NODE_LIBRARY#include <iostream>#include <cstdlib>#include "9_5.h"using namespace std;// 生成结点:创建一个结点,数据成员值为item,指向后继结点的指针值为nextPtr template <class T>Node<T> *GetNode(const T& item, Node<T> *nextPtr = NULL){Node<T> *newNode;// 为新结点分配内存空间,然后将item和NextPtr传递给构造函数newNode = new Node<T>(item, nextPtr);if (newNode == NULL) //如果分配内存失败,程序中止{cerr << "Memory allocation failure!" << endl;exit(1);}return newNode;}enum AppendNewline {noNewline,addNewline};// 输出链表template <class T>void PrintList(Node<T> *head, AppendNewline addnl = noNewline){// currPtr初始指向表头结点,用于遍历链表Node<T> *currPtr = head;// 输出结点数据,直到链表结束while(currPtr != NULL){// 如果换行标志addl == addNewline,则输出换行符if(addnl == addNewline)cout << currPtr->data << endl;elsecout << currPtr->data << " ";// 使currPtr指向下一个结点currPtr = currPtr->NextNode();}}//查找结点//在指针head所指向的链表中查找数据域等于item的结点//找到则返回TRUE及其前趋结点的地址,否则返回FALSEtemplate <class T>int Find(Node<T> *head, T& item, Node<T>* &prevPtr){Node<T> *currPtr = head; //从第一个结点开始遍历prevPtr = NULL;// 通过循环遍历链表,直到表尾while(currPtr != NULL){//将item与结点的数据域比较,如果相等,则返回,否则继续处理下一个结点if (currPtr->data == item)return 1;prevPtr = currPtr; //记录下当前结点的地址currPtr = currPtr->NextNode();}return 0; //找不到时}//在表头插入结点template <class T>void InsertFront(Node<T>* & head, T item){// 建立新结点,使其指针域指向原链表头结点head,然后更新headhead = GetNode(item,head);}//在表尾添加结点template <class T>void InsertRear(Node<T>* & head, const T& item){Node<T> *newNode, *currPtr = head;// 如果链表为空,则插入在表头if (currPtr == NULL)InsertFront(head,item);else{// 寻找指针域为NULL的结点while(currPtr->NextNode() != NULL)currPtr = currPtr->NextNode();// 建立新结点并插入在表尾(在currPtr之后)newNode = GetNode(item);currPtr->InsertAfter(newNode);}}// 删除链表的第一个结点template <class T>void DeleteFront(Node<T>* & head){Node<T> *p = head; //取得将被删除的结点的地址if (head != NULL) // 确认链表不空{head = head->NextNode(); // 将表头指针head移向第二个结点 delete p; //删除原第一个结点}}// 删除链表中第一个数据域等于key的结点template <class T>void Delete (Node<T>* & head, T key){// currPtr用于遍历链表,prevPtr跟随其后Node<T> *currPtr = head, *prevPtr = NULL;// 如果链表为空,则返回if (currPtr == NULL)return;//通过循环遍历链表,直到找到数据域为key的结点,或达到表尾while (currPtr != NULL && currPtr->data != key){// currPtr前行,prevPtr跟随其后prevPtr = currPtr;currPtr = currPtr->NextNode();}//若 currPtr != NULL,则currPtr指向的结点数据域为keyif (currPtr != NULL){if(prevPtr == NULL) //找到的是链表第一个结点head = head->NextNode();else// 如果找到的是第二个以后的结点,调用前趋结点的成员函数删除之 prevPtr->DeleteAfter();delete currPtr; //释放被删除的结点所占的内存空间}}// 在有序链表中插入一个结点template <class T>void InsertOrder(Node<T>* & head, T item){// currPtr用于遍历链表,prevPtr跟随其后Node<T> *currPtr, *prevPtr, *newNode;// prevPtr == NULL 标志着应插入在表头prevPtr = NULL;currPtr = head;// 通过循环遍历链表,寻找插入点while (currPtr != NULL){// 如果item < 当前结点数据,则插入点应在当前结点之前if (item < currPtr->data)break;// currPtr前行,prevPtr跟随其后prevPtr = currPtr;currPtr = currPtr->NextNode();// 完成插入if (prevPtr == NULL) //如果插入点在表头InsertFront(head,item);else{// 在prevPtr指向的结点之后插入新结点newNode = GetNode(item);prevPtr->InsertAfter(newNode);}}//清空链表--删除链表中的所有结点template <class T>void ClearList(Node<T> * &head){Node<T> *currPtr, *nextPtr;// 边遍历边删除结点currPtr = head;while(currPtr != NULL){// 记录下一个结点的地址,删除当前结点nextPtr = currPtr->NextNode();delete currPtr;currPtr = nextPtr; //使指针currPtr指向下一个结点 }head = NULL; //将头结点置为NULL,标志着链表为空}#endif // NODE_LIBRARY//lab9_1.cpp#include <iostream>#include "9_5.h"#include "node.h"using namespace std;int main(){// 将表头指针置为 NULLNode<int> *head = NULL, *prevPtr, *delPtr;int i, key, item;// 输入10个整数依次向表头插入for (i=0;i < 10;i++){cin>>item;InsertFront(head, item);// 输出链表cout << "List: ";PrintList(head,noNewline);cout << endl;// 输入需要删除的整数cout << "请输入一个需要删除的整数: ";cin >> key;// 查找并删除结点prevPtr = head;while (Find(head,key,prevPtr) != NULL){if(prevPtr == NULL) //找到的是链表第一个结点head = head->NextNode();else// 如果找到的是第二个以后的结点,调用前趋结点的成员函数删除之 delPtr=prevPtr->DeleteAfter();delete delPtr;}// 输出链表cout << "List: ";PrintList(head,noNewline);cout << endl;//清空链表ClearList(head);}实验结果如下:2程序二//lab9_2.cpp#include "link.h"int main(){LinkedList<int> A, B;for(int i=0;i<5;i++){A.InsertRear(2*i+1);B.InsertRear(2*i+2);}A.Reset();cout << "链表A的元素为:" ;while(!A.EndOfList()){cout << A.Data() << " ";A.Next();}cout << endl;B.Reset();cout << "链表B的元素为:" ;while(!B.EndOfList()){cout << B.Data() << " ";B.Next();}cout << endl;cout << "把B中的元素插入A中..." << endl;B.Reset();while(!B.EndOfList()){A.InsertRear(B.Data());B.Next();}A.Reset();cout << "此时,链表A的元素为:" ;while(!A.EndOfList()){cout << A.Data() << " ";A.Next();}cout << endl;}//link.h#ifndef LINKEDLIST_CLASS#define LINKEDLIST_CLASS#include <iostream>#include <cstdlib>using namespace std;#ifndef NULLconst int NULL = 0;#endif // NULL#include "9-3.htemplate <class T>class LinkedList{private://数据成员:// 表头和表尾指针Node<T> *front, *rear;// 记录表当前遍历位置的指针,由插入和删除操作更新Node<T> *prevPtr, *currPtr;// 表中的元素个数int size;// 当前元素在表中的位置序号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档