第9章 构造数据类型
程序设计概论期末考试范围答案

第一章程序设计基础知识一、基础题1.以下关于算法的描述中,错误的是(D)A.算法中描述的操作都是用已经实现的基本运算组成的B。
算法必须由计算机程序实现C.算法应该易于理解、易于实现和易于调试D.算法不应该处理输入的非法数据2.以下哪项不属于数据的逻辑结构(A)A.单链表B.输C.图D.集合5.(B)程序设计的基本思想是采用“自顶向下,逐步求精”的程序设计方法和“单入口单出口”的控制结构。
A.面向对象B.结构化C.函数式D.事件驱动6.强调以现实世界中的客观事物为中心来建立问题域模型,这种程序设计方法成为(C)A.事件驱动程序设计B.结构化程序设计C.面向对象程序设计D.函数式程序设计7.以下程序段是用(B)程序设计语言编写的。
MOV AX,ASUB AX,BMOV C,AXHLTA.机器B.汇编C.C#D.Java10.下列关于解决方案的叙述中,不正确的是(B).A.一个解决方案可以包含多个项目B.解决方案可以包含的项目只能是类库C.利用解决方案资源管理器可以管理解决方案D.解决方案可以将多个项目组织在一起形成一个工作单元二、应用题1.简述程序设计的步骤.答:(1)分析问题:明确要解决什么问题(2) 设计算法:数据结构和算法(3)编写程序:将算法用程序设计语言描述出来(4)调试运行:语法错误、语义错误、异常4.简述C#语言的特点.答:(1)完全面向对象:具有面向对象语言的一切特性(2)简单易学:熟悉C、C++或Java即可掌握C#语言(3)安全:避免使用指针;自动内存管理和垃圾回收;使用委托取代函数指针.(4)跨平台:可以运行在不同操作系统上。
(5)跨语言:与任何支持。
NET的语言互相交换信息(6)强大的Web编程能力: Web应用程序第三章数据与变量一、基础题1。
以下不属于C#语言中基本数据类型的是(D)A.整数类型B。
浮点类型C.字符类型D。
枚举类型2.使用变量a存放数据-389,则将变量a定义为(B)类型最为合适.A。
面向对象的程序设计语言――C++(第二版)-习题参考答案

面向对象的程序设计语言――C++(第二版)-习题参考答案课后习题答案以及代码习题参考答案第1章1.填空题C++语言概述(1)函数说明,函数体(2)声明区,主程序区,函数定义区(3)多态性(4)namespace,using(5)std(6)cin,(7)//(8)对数据的操作2.判断题(1)对(2)错(3)错(4)错(5)错3.改错题(1)没有函数体,应改为void main() {};(2)语句没有分号,应改为using namespace myspace;(3)cout和操作符共同完成输出的功能,应改为cout“ Input your name:";(4)应改为#include iostream.h4.简答题5.编程题(略)(略)第2章1.选择题基本数据类型、运算符与表达式(1)B (2)D (3)B (4)D (5)B课后习题答案以及代码2.简答题(1)(a)、(c)(e)、(f)、(g)、(h)、(i)(2)(a)、(g)、(i)、(j)(3)(a)5.5(b)0(c)20(d)0,0(e)1(f)1,2(g)3(h)-40(i)2(j)3(k)s1='0's1='9'(l)N!=03.读程序写结果(1)0,15(2)(1、1、1),(-1、-1、-1)(3)(a)a*a+2*a*b+b*b(b)4.0/3.0*3.__-__R*R*R(c)5.0/9.0*(F-32)(d)b=ab=c(4)364143(5)x=14.编程题(略)第3章1.选择题(1)B (2)A (3)A (4)C2.判断题(1)错(2)对(3)对(4)错3.读程序写结果(1)C++的控制语句5)A 5)错((课后习题答案以及代码12 23 3 34 4 4 45 5 5 5 5(2)11 2 11 2 3 2 11 2 3 4 3 2 11 2 3 4 5 4 3 2 1(3)j的值为0;i的值为2;4.编程题(略)第4章1.填空题函数(1)void(2)静态全局变量,static(3)函数重载(4)inline(5)递归函数(6)宏定义命令,文件包含命令,条件编译命令2.判断题(1)错(2)错(3)错(4)错(5)错(6)对(7)错(8)错(9)对(10)对3.读程序写结果(1)x=7,y=4x=9,y=5(2)34.56101(3)162228(4)12 15 18 21 24课后习题答案以及代码(5)2,1,4,1,3,2,1,4.简答题5.编程题(略)(略)第5章1.选择题构造数据类型(1)C (2)D (3)A (4)B (5)C 2.判断题(1)错(2)对(3)对(4)错(5)错3.读程序写结果(1)153(2)422 5 6 8 10(3)__,21(4)419(5)6904(6)43214.编程题(略)第6章1.填空题(1)类,对象,类(2)数据成员,成员函数(3)不能(4)private,protected,public,private (5)成员函数类和对象课后习题答案以及代码(6)friend(7)类名,作用域运算符(8)对象名.成员名,指针变量名-成员名,(*指针变量名).成员名(9)构造,析构,构造,析构(10)常量数据,引用数据(11)全局,数据类型,所属的类(12)常成员,只读(13)成员,友元(14)类数据成员,类成员函数(15)this(16)浅拷贝2.选择题(1)C (2)C (3)B (4)C (5)B(6)C (7)D (8)B (9)C (10)D(11)A (12)C (13)D (14)D (15)B3.改错题(1)man1.salary=1000.00; 不能在类外访问类的私有成员(2)float r=0;和float c=0; 类本身是抽象的,不能在类的定义体中给其数据成员赋值}后缺少分号“;”(3)成员函数void setdata(float x1,float y1,float r);没有实现(4)构造函数名point()应与类名同名,为Point没有头文件包含#include iostream.h4.读程序写结果题(1)x=0,y=0x=100,y=200(2)x=100,y=200x=1000,y=2022年t=3.14(3)Sta::fun2()=10s.fun2()=11r.a=20(4)Constructor1 called!x=0Constructor2 called!x=100Destructor called!Destructor called!(5)课后习题答案以及代码575.简答题6.编程题(略)(略)第7章1.填空题(1)继承(2)基类,派生类(3)private,protected,public,private (4)不可访问,保护,公有(5)私有(6)单(一),多(重)(7)赋值兼容规则(8)静态,动态(9)抽象类2.选择题继承和派生(1)B (2)A (3)B (4)C (5)B (6)A (7)D (8)B (9)B (10)B(11)D (12)B3.改错题(1)本题的错误主要是数据成员的访问权限问题:基类的私有成员在派生类中不可访问,如fb()函数中的a3=30;语句;类的私有和保护成员在类外不能访问,如main函数中的x.a2 =20;.a3=30; ,y.a2=200; ,y.a3=300; ,y.b2=2022年;和y.b3=3000;语句。
C语言程序设计教程(电子教案)

学习目标
对C语言有一个概括的了解, 能够编写包含键盘输入、计算和 显示输出等操作的简单C程序。
4
主要内容
• C语言的产生与特点 • 简单C程序的组成 • C语言应用程序开发的基本步骤
5
1.1 C语言的产生及特点
C语言是为了编写系统程序而在1968年开始 研发的计算机高级语言
C语言表达能力强,使用灵活,程序结构清 晰,紧凑,可移植性好
指针 类型
17
基本数据类型说明符
整型:int long
字符型:char 实型:float
double long double
18
2.2 常 量
常量∶在程序运行过程中,其值不能被改 变的量。
一. 不同数制整型常量的表示
例如: 12 :十进制数 12
012 :八进制数 12(等于十进 制数10,用前导符0表示八进制数常量)
计算x+y+z,并将结 8果赋给变量sum
显示变量 sum的值
主函数 main()
一般C程序的组成
【例1-2】采用模块结构,改写例1-1的程序。 add(int x,int y,int z )
{ return(x+y+z);
}
函数add()
调用函数 add()
main() { int x,y,z; printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z);
4. 用‘\’ ’表示字符’ ,‘\”’表示字符”, ‘\\ ’表示字符\ 。
5. 用双引号括起来的字符序列表示字符串常量,其 中最后一个字符是字符串结束符‘\0’,不显式 地表示出来。如:“English” 。
结构体与共用体

4、共用体类型的变量如何赋初值,含义是什么?
不能对共用体变量名赋值,也不能在定义共用体变量时初始化。但可以用一个共用体变量为 另一个变量赋值
例:union
{ int i;
char ch;
double f;
}a={1,’a’,1.5}; ()
a=1;
()
m=a;
()
例:float x; union { int i; char ch; double f; }a,b; a.i=1; a.ch=‘a’; a.f=1.5; b=a; () x=a.f; ()
二. 枚举类型的应用
• 1.枚举类型变量的定义 ◆先定义枚举类型,再定义枚举类型变量
enum week{sun,mon,tue,wed,thu,fri,
sat};
enum week weekday,workday; ◆定义枚举类型的同时定义枚举变量 enum color {red,blue,green,black}a,b,c;
共用体类型的关键字
union 联合类型名 { 数据类型 成员名1 数据类型 成员名2
...........
数据类型 成员名n };
例:
union utype {
char ch; int i; float f; };
2、如何定义共用体类型的变量
(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ { int i;
◆直接定义枚举变量 enum {male,female}sex1,sex2;
枚举类型变量的特点
例 enum DAY {
MON=1, TUE, WED, THU, FRI, SAT, SUN };
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
C语言的数据类型介绍

C语言的数据类型介绍C语言的数据类型介绍C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。
下面店铺为大家带来C语言的数据类型介绍,希望大家喜欢!1.基本数据类型基本数据类型最主要的特点是,其值不可以再分解为其它类型。
也就是说,基本数据类型是自我说明的。
2.构造数据类型构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。
也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。
每个“成员”都是一个基本数据类型或又是一个构造类型。
在C语言中,构造类型有以下几种:2.1.数组类型2.2.结构类型2.3.联合类型3.指针类型指针是一种特殊的,同时又是具有重要作用的数据类型。
其值用来表示某个量在内存储器中的地址。
虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
4.空类型在调用函数值时,通常应向调用者返回一个函数值。
这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的max函数定义中,函数头为: int max(int a,int b);其中“int ”类型说明符即表示该函数的返回值为整型量。
又如在例题中,使用了库函数 sin,由于系统规定其函数返回值为双精度浮点型,因此在赋值语句s=sin (x);中,s 也必须是双精度浮点型,以便与sin函数的返回值一致。
所以在说明部分,把s说明为双精度浮点型。
但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。
其类型说明符为void。
在第五章函数中还要详细介绍。
在本章中,我们先介绍基本数据类型中的整型、浮点型和字符型。
其余类型在以后各章中陆续介绍。
对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。
在程序执行过程中,其值不发生改变的量称为常量,取值可变的量称为变量。
它们可与数据类型结合起来分类。
例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。
第9章 结构体、共用体和枚举类型

9.1 结构体类型与结构体变量 9.2 结构体数组 9.3 向函数传递结构体型数据 9.4 链表 9.5 共用体 9.6 枚举类型 9.7 用户自定义类型
9.1 结构体类型与结构体变量
• 结构体类型的定义
–概述:
• 建立单链表的主要步骤为:
– 生成只含有头结点的空链表; – 然后读取数据信息,生成新结点,将数据存放于新结点中, 插入新结点到单链表中 – 重复第二步,直到输入结束。 根据新结点插入到链表的位置的不同,建立链表的方式, 分为在表尾插入的方法和在表头插入的方法。 •表尾插入: 例9.6 •表头插入: 例9.7
• 共用体变量的定义
–用已定义的共用体类型去定义共用体变量 –定义共用体类型的同时定义变量: –定义无名共用体类型的同时定义变量:
• 共用体变量的引用
–引用方式:共用体变量名.成员名 共用体变量名. 共用体变量名 –说明: 对于共用体变量,只能引用它的成员,而不能引用整个 共用体变量。若共用体的成员是构造类型的,则需要逐级引 用至最低级的成员。 –能通过定义指向共用体的指针变量来引用共用体变量。
在实际应用中,一组相关的数据可能是不同类型的。C语 言提供了包含不同类型成员的类型来定义这样的数据,这 种类型就是结构体类型 结构体类型。 结构体类型
– 定义形式:
struct 结构体名 类型名1 成员名1 {类型名1 成员名1; 类型名2 成员名2 类型名2 成员名2; …… 类型名n 成员名n 类型名n 成员名n; };
• 举例
例9.11 上一页
9.6 枚举类型
• 枚举类型的定义–定义来自式:enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n}; •
第9章 列联分析

吸烟 不吸烟 合计
43 13 56
205 134 339
21% 9.7% 16.5%
(一) χ2 统计量
1、用于检验列联表中变量之间是否存在显著性 、 差异,或者用于检验变量之间是否独立。 差异,或者用于检验变量之间是否独立。 2、计算公式为 2 r c ( f ij eij )2 、
χ = ∑∑
i =1 j = 1
eij
其自由度为( r 1)(c 1) 式中: 式中: f ij
关于购买习惯的调查 购买习惯 低收入组 经常购买 不购买 有时购买 合计 25 69 36 130 偏低收入组 偏高收入组 高收入组 40 51 26 117 47 74 19 140 46 57 37 140 合计 158 251 118 527
(二)列联表的分布
1. 观察值的分布
①Hale Waihona Puke 边缘分布行边缘分布
χ
2
步骤四
=
( f ij e ij ) 2 ( f ij e ij ) 2 / e ij
∑
( f ij e ij ) 2 e ij
25 40 47 46 69 51 74 57 36 26 19 37
39 35 42 42 62 56 67 67 29 26 31 31
-14 5 5 4 7 -5 7 -10 7 0 -12 6
1.赞成;2.反对 赞成; 反对 赞成
4. 5.
对品质数据的描述和分析通常使用列联表 可使用 χ2检验
一、列联表的构造与分布
(一) 列联表的构造
1、由两个或两个以上变量进行交叉分类 、 的频数分布表; 的频数分布表; 2、行变量的类别数用 r 表示 列变量的 表示, 、 表示; 类别数用 c 表示; 3、一个 r 行 c 列的列联表称为 r×c 列 、 × 联表
C++_CHAP9_史玉珍

第9章 继承与派生
构造函数
构造函数不能够被继承,因此,派生类的构造函 数必须通过跳动基类的构造函数来初始化函数子 对象,所以,在定义派生类的构造函数时,除了 对自己的数据成员进行初始化外,还必须负责调 用基类构造函数使基类的数据成员得以初始化。 如果派生类汇总还有子对象时,还应包含对子对 象初始化的构造函数。
public protected private
public protected 不可访问 public private 不可访问
protected Private 不可访问
私有继承
保护继承
第9章 继承与派生
9.2 单继承
9.2.1 9.2.2 9.2.3 9.2.4
基类成员的访问权限 构造函数和析构函数 作用域运算符:: 子类型和类型适应
void main() { B obj1; B obj2(5,6); B obj3(7,8,9); obj1.print(); obj2.print(); obj3.print(); }
第9章 继承与派生
派生类构造函数使用中应注意的问题
(1)派生类构造函数的定义中可以省略对基本结 构函数的调用,其条件是在基类中必须有缺省的 构造函数或者根本没有定义的构造函数。当然, 基类中没有定义构造函数,派生类基本不必负责 调用派生类构造函数。 (2)当基类的构造函数使用一个或多个参数时则 派生类必须定义构造函数,提供将参数传递给基类 构造函数的途径。在有的情况下,派生类构造函数 的函数体可能为空,仅起到参数传递作用。
第9章 继承与派生
9.1.2 派生类的定义格式
单继承的定义格式如下:
class <派生类名>:<继承方式><基类名
数据结构第20讲:集合与等价类,查找表(1)-1,2-c

∪
5. 并查集的存储表示方法 位向量
单链表 树型结构
并查集的树型结构表示
以森林F = (T1,T2,…,Tn)表示并查集类型的集合S。 森林的每一棵树Ti(i=1,2,…,n)表示S中的一个元 素—子集Si。 每一棵子树都采用双亲存储表示,树中每一个 结点表示子集Si中的一个成员x。树的根结点的成员 同时也作为子集的名称。 s1={0, 4,7, 2,11}; s2={1,3,5}; 4 s3={6,8,9,10}
{ 1,2,3,8,9 }
{ 2,5,7,9 } {1,2,3,5,7,8,9 }
Intersection (BitVector &s1, BitVector &s2) { //求交 for ( int i = 0; i < MaxSize; i++ )
s1.bitVector[i] = s1.bitVector[i] && s2.bitVector[i];
1. 问题的提出:
在实际应用中时常会遇到这样的问题:要求将一个集合中 的n个不同的元素划分成若干个不同的组,每个组的元素构 成一个子集合。这些子集构成了原来集合的一个划分。 例如:按同年龄关系将某个人群分组。某企业的产品按生 产时间(或价钱)分组。将自然数集合按模n同余分组等。 这类问题的解决办法是:在开始时,让每个元素自成一个 单元素的集合,然后按一定规则(等价关系)将属于同一组 的元素所在的集合合并(等价类)。 这期间需要反复用到的操作是:1.构造一个集合;2.查找 一个元素在哪一个集合中,3.将两个集合合并;具有这三种 集合操作的数据类型就称为并查集。
}
s1
s2
s1
0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0
数据结构-C语言描述(第三版)(陈慧南)章 (9)

第9章 跳表和散列表 typedef int KeyType; typedef struct entry{ KeyType Key; DataType Data ; }Entry; typedef Entry T; typedef struct skipnode{ T Element; struct skipnode* Link[1]; } SkipNode;
函数CreateSkipList同时为表头结点、表尾结点和Last数组 分配空间。表头结点中有MaxLevel+1个用于指向各级链的指针, 它们被初始化为指向表尾结点。
第9章 跳表和散列表
9.2.2 跳表的搜索
本小节中我们介绍两个搜索跳表的函数 Search和SaveSearch。 前者是字典(集合)上定义的函数,后者是为了实现插入和删除 运算而设计的私有函数,并不面向用户。SaveSearch函数除了 包括Search函数的全部功能外,还把每一级遇到的最后一个结 点的地址存放在数组Last中。
第9章 跳表和散列表
例如要在图9-1(c)的跳表中搜索关键字值43。首先由第2层 表头指针开始向右搜索,令22与43比较,因为22<43,向右搜索; 令与43比较,现有≥43,所以下降到1层;令48与43比较,这 时 有 48≥43 , 再 次 下 降 到 第 0 层 ; 最 后 令 43 与 43 比 较 , 这 时 有 43≥43。在第0层的元素关键字值与待查关键字值比较后,还需 最后进行一次比较,以确定两关键字值是否相等,若两者相等, 则搜索成功,否则搜索失败。所以,在搜索过程中,与待查关 键字值43比较的跳表中的关键字值依次为22,,48,43,43。
第9章 跳表和散列表
当我们用C语言描述结点结构类型SkipNode时,我们定义 了长度为1的指针数组struct skipnode* Link[1],事实上,数组 Link的实际长度在动态分配跳表的结点空间时确定。函数 SkipNode* NewSkipNode(int lev)用于在动态创建跳表结点时, 根据所确定的该结点的级数(层次)申请元素域和指定数目的指 针域所需的空间大小。数组名称Link是该数组存储块的地址。
C语言 结构体

}
第六页,编辑于星期三:五点 四十五分。
9.1.2 结构的概念与定义
结构与数组比较:
使用结构来表示学生信息: •都是构造类型,是多个变量
struct student{
的集合
int num;
/* 学号 */
•数组成员类型相同,结构成
char name[10];
/* 姓名 */ 员类型不同
int computer, english, math; /* 三门课程成绩 */
第二十二页,编辑于星期三:五点 四十五分。
9.2.2 结构数组操作
结构数组的初始化
struct student students[50] = { { 101,"zhang", 76, 85, 78 }, {102, "wang", 83,
92, 86} };
students[0] 101 Zhang 76 85 78
struct student{
int num;
/* 学号 */
char name[10];
/* 姓名 */
int computer, english, math; /* 三门课程成绩 */
double average;
/* 个人平均成绩 */
};
struct student s1,s2;
第十二页,编辑于星期三:五点 四十五分。
int main(void)
{ int course, i, n, num, pos, score;
struct student students[50]; /* 定义结构数组 */ … /* 输入n个学生信息 */
在我们的实际生活中,一个较大的实体可能由多个成 员构成,而这些成员中有些又有可能是由一些更小的 成员构成。
数据结构类型定义

数据结构类型定义
数据结构类型定义是计算机存储和组织数据的方式,包括逻辑结构和物理结构。
逻辑结构描述数据元素之间的逻辑关系,主要分为线性结构和非线性结构。
线性结构中,数据元素之间存在一对一的相对关系;而非线性结构中,数据元素之间存在一对多或多对多的相互关系,如树形结构和图形结构。
物理结构则描述数据在计算机中的表示,包括数据元素的机内表示和关系的机内表示。
数据元素的机内表示通常用二进制位的位串表示,称为节点。
数据元素的关系的机内表示可以分为顺序映像和非顺序映像,常用的存储结构有顺序存储结构和链式存储结构。
此外,数据结构还可以根据具体的实现方法分类,如顺序、连接、索引、散列等存储方式。
以上内容仅供参考,如需更专业的定义,可以查阅计算机科学领域相关的教材或资料。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.1.2 结构体类型的声明
struct student 声明了一种新的数据类型; { 该类型的关键字为struct student; int num; 该类型包括5个成员; char name[20]; 可以用该数据类型定义变量、数组、 int age; 指针等。 char sex; 注意: 大括号后的分号不可少。 float score; 问题: }; struct student占用内存吗?
学生信息:姓名、学号、年龄、性别、成绩
如果存储一个学生的信息,可以使用5个变量 如何存储100个学生的信息?
C语言提供了结构体构造数据类型。
9.1.2 结构体类型的声明
一般形式:
struct 结构体名 {成员表列}; 成员表列由若干个成员组成 ; 成员可以是变量、数组等; 成员必须进行类型说明,可以是int、float等任 何已有类型。
例:输入3个学生3门课的成绩,输出:
(1)每个学生的平均成绩; (2)各门课的平均成绩。
#include <stdio.h> struct student { char num[10]; float ch; float en; float ma; };
void main() { struct student s[3]={{"01"},{"02"},{"03"}}; int i; float s_ch,s_en,s_ma; for(i=0;i<3;i++)scanf("%f",&s[i].ch); for(i=0;i<3;i++)scanf("%f",&s[i].en); for(i=0;i<3;i++)scanf("%f",&s[i].ma); for(i=0;i<3;i++)printf("%s:%.2f\n", s[i].num,(s[i].ch+s[i].en+s[i].ma)/3); s_ch=s_en=s_ma=0; for(i=0;i<3;i++)s_ch=s_ch+s[i].ch; for(i=0;i<3;i++)s_en=s_en+s[i].en; for(i=0;i<3;i++)s_ma=s_ma+s[i].ma; printf("chines:%.2f\n",s_ch/3); printf("english:%.2f\n",s_en/3); printf("math:%.2f\n",s_ma/3); }
“->”为指向结构体成员运算符,优先级为1级
#include <stdio.h> struct student { int num; char name[20]; char sex; int score[2]; }; void main() { struct student s={102,"Zhang ping",'M',78,88} ; struct student *p; p=&s; printf("%d %s %c %d %d\n", s.num,,s.sex,s.score[0],s.score[1]); printf("%d %s %c %d %d\n", (*p).num,(*p).name,(*p).sex,(*p).score[0],(*p).score[1]); printf("%d %s %c %d %d\n", p->num,p->name,p->sex,p->score[0],p->score[1]); }
第9章 构造数据类型
基本数据类型提供了对单一数据的表达方 式。 数组可以表示由同类型的多个元素构成的 复合对象。 在实际应用中,存在着许多更为复杂的对 象群体,每个对象个体都需要用多种不同 类型的数据来描述。
例如:学生的基本信息
C语言提供了自定义数据类型,允许用户将 多种数据类型组合在一起,以一个整体的 形式来描述复杂的数据对象。 这种数据类型称为构造数据类型。 本章主要介绍:
共用体变量各成员共享同一段内存单元。 在每一瞬间,只有一个成员能够使用共同的内 存单元。
union data x; x有3个成员:a,b,c a,b,c共享同一段内存单元 在每一瞬间, a、b、c只能有一个使用内存单元
9.3.2 共用体变量
共用体变量所占内存长度等于最长的成员 所需的内存长度。
2.指向结构体数组的指针
指针变量可以指向一个数组,这时指针变 量的值是数组的首地址,即0号元素的地址。 指针变量也可指向数组的一个元素,这时 指针变量的值是该数组元素的地址。 设p为指向数组的指针变量,则:
p指向下标为0的元素 p+i指向下标为i的元素
#include <stdio.h> struct student { int num; char name[20]; char sex; float score; }; void main() { struct student s[5]={ {101,"Zhou wei",'M',65}, {102,"Zhang san",'M',62.5}, {103,"Song fang",'F',92.5}, {104,"Cheng ling",'F',87}, {105,"Wang ming",'M',58},}; struct student *p; for(p=s;p<s+5;p++) printf("%d\t%s\t%c\t%f\t\n", p->num,p->name,p->sex,p->score); }
例:输入3个人的姓名和电话,然后输出。
#include <stdio.h> struct student { char name[main() { struct student s[3]; int i; for(i=0;i<3;i++) scanf("%s%s",s[i].name,s[i].phone); for(i=0;i<3;i++) printf("%s:%s\n",s[i].name,s[i].phone); }
结构体(structure) 共用体(union) 枚举(enum)
学习目标
理解构造数据类型 了解结构体类型、共用体类型、枚举类型
重点
结构体类型、共用体类型、枚举类型的声明 结构体类型、共用体类型、枚举类型的特点
9.1 结构体
9.1.1 结构体类型 在实际问题中,一组数据往往具有不同的 数据类型。
union s { int a; float b; char c; }; sizeof(union s)
值为4
9.3.2 共用体变量
共用体变量与结构体变量的区别:
结构体变量各成员分别占有不同的内存单元, 结构体变量所占内存长度等于各成员所占内存 长度之和; 共用体变量各成员使用相同的内存单元,共用 体变量所占内存长度等于最长的成员所需的内 存长度。
定义指向结构体变量的指针 :
struct 结构体名 *结构体指针变量名 struct student s; struct student *p; p=&s; p指向s,p为结构体指针; 程序中*p与s等价。
1.指向结构体变量的指针
可以根据结构体指针访问结构体变量的成 员。有两种形式:
(*结构体指针变量).成员名 结构体指针变量->成员名
9.3.1 共用体类型
共用体类型声明的一般形式为:
union 共用体名 { 成员表; };
9.3.1 共用体类型
union data { int a; float b; char c; };
声明了一种新的数据类型; 该类型的关键字为union data ; 该类型包括3个成员。 注意:
9.1.3 结构体变量
(3)直接定义结构体变量
struct { int num; char name[20]; int age; char sex; float score; } s1,s2;
9.1.3 结构体变量
2.说明 (1)结构体类型变量所占的内存单元是连续 的,数量是所有成员所占内存单元数量之 和。 (2)程序中其它变量可以与结构体成员具有 相同的名字,互不干扰。
9.1.3 结构体变量
1.结构体变量的定义 (1)先声明结构体类型,后定义结构体变量
struct student s1,s2;
9.1.3 结构体变量
(2)在声明结构体类型时直接定义变量
struct student { int num; char name[20]; int age; char sex; float score; } s1,s2;
2.指向结构体数组的指针
注意:一个结构体指针变量只能指向具有 相同结构体类型的变量、数组元素等,不 能指向其它类型的任何对象。
struct student s,*p,a[10]; struct data d; p可以指向s和数组a的元素 p不能指向d p不能指向s的int、float等类型的成员 p不能指向数组a的元素的int、float等类型成员
9.3.2 共用体变量
2.共用体变量的引用 只能引用共用体变量的成员。 一般形式为:
共用体变量名.成员名