第09章 结构.ppt_第1页
第09章 结构.ppt_第2页
第09章 结构.ppt_第3页
第09章 结构.ppt_第4页
第09章 结构.ppt_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,程序设计基础,程序设计基础 The C Programming Language,本章要点,结构、结构变量和结构成员变量 如何引用结构成员变量,结构变量如何作为函数参数使用 结构的嵌套 如何定义和使用结构数组 结构指针作为函数的参数,结构,结构是一个或多个变量的集合,这些变量可能是不同的类型,为了处理的方便而将这些变量组织在一个名字之下。 由于结构将一组相关的变量看做一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据。,一、实例导入,例9.1 求二维平面上两点间的距离。,#include #include struct point double x; double y; ; int

2、main() struct point p1, p2; double dist; scanf(%lf%lf%lf%lf, ,例9.2 编写对候选人得票进行统计的程序。设有10个投票人,3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人的得票结果。,struct person char name20; int count; candidate3=Li, 0, Zhang, 0, Fun, 0;,#include #include struct person char name20; int count; candidate3=Li, 0, Zhang, 0, Fun, 0;,int m

3、ain() int i, j; char candi_name20; for(i=0; i10; i+) scanf(%s, candi_name); for(j=0; j3; j+) if(strcmp(candi_name, )=0) candidatej.count+; printf(n); for(i=0; i3; i+) printf(%5s:%dn, , candidatei.count); return 0; ,二、结构的基本知识,结构是用其他类型的对象构造出来的派生数据类型。例如,点是最基本的对象,假设用x与y坐标表示

4、它,可以采用结构存放这两个坐标,其声明如下: struct point double x; double y; ;,(1)关键字struct引入结构声明。 (2)结构声明由包含在花括号内的一系列声明组成。 (3)关键字struct后面的名字是可选的,称为结构标记(这里是point)。结构标记用于为结构命名,在定义之后,结构标记就代表花括号内的声明。 (4)结构中定义的变量称为成员。,说明:,(5)结构成员、结构标记和普通变量(即非成员)可以采用相同的名字,它们之间不会冲突,因为通过上下文分析总可以对它们进行区分。 (6)不同结构中的成员可以使用相同的名字,但是,从编程风格方面来说,通常只有密切

5、相关的对象才会使用相同的名字。,说明:,1、结构变量的定义,(1)在声明结构类型的同时定义变量,struct声明定义了一种数据类型。在标志结构成员表结束的右花括号之后可以跟一个变量表,这与其它基本类型的变量声明是相同的。例如: struct pointx, y, z; 从语法角度来说,这种方式的声明与声明 int x, y, z; 具有类似的意义。这两个声明都将x、y与z声明为指定类型的变量,并且为它们分配存储空间。,(2)先声明结构类型再定义变量,如果结构声明的后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓。 但是,如果结构声明中带有标记,那么在以后定义结构实例时

6、便可以使用该标记定义。例如,对于上面给出的结构声明point,语句 stuct point p; 定义了一个struct point类型的变量p。,2、结构变量的引用,在表达式中,可以通过下列形式引用某个特定结构中的成员: 结构名.成员 其中的结构成员运算符“.”将结构名与成员名连接起来。,3、结构变量的初始化,和数组一样,可以用一个常量成员值列表初始化结构,即在声明结构变量时,在变量名后用等号连接括在花括号中的常量成员值列表初始化该结构变量,初始化值用逗号分隔开。例如: struct point p1=20, 100; 还可以通过调用返回相应类型结构的函数进行初始化。,/* makepoin

7、t函数:通过x、y坐标构造一个点 */ struct point makepoint(int x, int y) struct point temp; temp.x = x; temp.y = y; return temp; struct point p2=makepoint(10, 50);,例如:,提示:,参数名和结构成员同名不会引起冲突。其实,使用重名还可以强调两者之间的关系。,4、对结构变量赋值,虽然C语言规定,结构变量之间一般不能直接赋值,但如果两个结构变量具有相同的类型,那么允许将一个结构变量的值直接赋给另一个结构变量。,例如:,struct point p1=100, 200,

8、p2; p2=p1; /*等同于执行了下列语句: p2.x = p1.x; p2.y = p1.y;*/,提示:,(1)只有在同一个结构类型中的不同结构变量之间才可以直接赋值。 (2)如果两个结构类型不同,即使它们具有相同类型的成员,也不能相互赋值。 (3)除了两个相同类型结构变量之间能进行赋值外,一般情况下,对结构成员的操作主要通过成员来进行,而成员能实施的操作由成员本身的类型决定。 (4)结构之间不可以进行比较。,5、结构的嵌套,结构可以嵌套。例如,用对角线上的两个点来定义矩形 struct rect struct point p1; struct point p2; ; 结构rect包含

9、两个point类型的成员。则: struct rect screen;/*声明screen变量*/ screen.p1.x/*引用screen的成员p1的x坐标*/,三、结构数组,在结构数组中,数组元素的类型是同一个结构类型。 结构数组的定义方法与基本数据类型的数组定义方法类似。,1、结构数组的定义,(1)在声明结构类型的同时定义数组,struct student char num20; char name20; char sex; double score; stu3;,(2)先声明结构类型再定义数组,struct student char num20; char name20; char

10、sex; double score; ; struct student stu3;,2、结构数组的初始化,对结构数组,可以按照结构成员初始化或者赋值的方法进行,只是赋值不是对单一的成员而是对数组进行。,例如:,struct student char num20; char name20; char sex; double score; stu3=99101, Li, M, 87.5, 99102, Zhou Fun, M, 99;,例9.3 有一个结构student,含有学生的学号、姓名、性别和1门课的成绩这4个成员。已知有5个学生,求5个学生该门课的平均成绩,并统计该门课不及格的人数。,输入

11、样例: 1101 Li ping M 45 1102 Zhang ping M 62.5 1103 He fang F 92.5 1104 Cheng ling F 87 1105 Wang ming M 58 输出样例: sum=382.5 average=76.5 count=2,#include struct student char num20; char name20; char sex; double score; boy5=1101, Li ping, M, 45, 1102, Zhang ping, M, 100, 1103, He he, F, 92.5, 1104, Che

12、ng lin, F, 87, 1105, Wan ming, M, 58;,int main() int i, c=0; double ave, s=0; for(i=0; i5; i+) s += boyi.score;/*求总分*/ if(boyi.score60)/*统计不及格人数*/ c += 1; printf(s=%.1fn, s); ave=s/5;/*求平均分*/ printf(average=%.1fncount=%dn, ave, c); return 0; ,提示:,(1)结构数组在初始化过程中,要注意初始化值与各个结构成员的数据类型的匹配。 (2)使用结构数组与使用其他

13、数组一样,采用循环结构比较便利。,四、结构指针,结构指针类似于普通变量指针。声明 struct point *p; 将p声明为一个指向struct point类型对象的指针。*p即为该结构,而(*p).x和(*p).y则是结构成员。 其中,(*p).x中的圆括号是必需的,因为结构成员运算符“.”的优先级高。表达式*p.x的含义等价于*(p.x),因为x不是指针,所以该表达式是非法的。,结构指针,结构指针的使用频率非常高,为了使用方便,C语言提供了另一种简写方式。假定p是一个指向结构的指针,可以用 p-结构成员 这种形式引用相应的结构成员。 运算符.和-都是左结合的,所以,对于下面的声明: st

14、ruct rect r, *rp= 以下4个表达式是等价的: r.pt1.x(r.pt1).x rp-pt1.x(rp-pt1).x,结构指针,又如,有如下的结构声明: struct int len; char *str; *p; 则 +p-len 将增加len的值,而不是增加p的值。 (+p)-len 将先执行p的加1操作,再对len执行操作 (p+)-len 先对len执行操作,然后再将p加1(该表达式中的括号可以省略) *p-str 读取的是指针str所指向的对象的值; *p-str+ 先读取指针str指向的对象的值,然后再将str加1 (*p-str)+ 将指针str指向的对象的值加1

15、; *p+-str 先读取指针str指向的对象的值,然后再将p加1。,#include int main( ) struct point int x, y; a4=1, 2, 3, 3, 5, 10, 12, 8; struct point *p=a; printf(%d , p+ - x); printf(%d , +p - y); printf(%dn, (a+3) - x); return 0; ,例9.4 写出下列程序的运行结果 。,运行过程分析:,(1)p+ - x:先读取指针p指向的对象的值,然后再执行p的加1操作。 (2)+p - y:先读取指针p指向的对象,然后再对p指向的对象

16、执行加1操作。 (3)(a+3) - x:读取相对指针a向下3个单位的对象的值。,注意:,结构的长度不一定等于各成员长度之和。因为不同的对象有不同的对齐要求,所以,结构中可能会出现未命名的“空穴”(hole)。例如,假设char类型占用1个字节,int类型占用4个字节,则下列结构: struct char c; int i; ; 可能需要8个字节的存储空间,而不是5个字节。使用sizeof运算符可以返回正确的对象长度,即sizeof(what)。,五、结构与函数,结构的合法操作只有几种:作为一个整体赋值或复制、通过“ int month; int day; DATE; int calDay(D

17、ATE x);/*函数声明*/ int a13=0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;/*声明全局数组*/ int main() DATE x; int totalDay; scanf(%d/%d/%d, ,int calDay(DATE x) int i; int s=0; for(i=1; i2) s+; return s; ,六、单向链表,在用数组存放数据时,需要事先定义固定好的数组,在数组元素个数不确定时,可能会发生浪费内存空间的情况。 而链表可以动态地进行存储分配,它是一种常见的重要数据结构。,单向链表,由于链表的各个部分

18、可以不连续存放,长度可以不加限定,并根据需要动态地开辟内存空间,可以比较自由方便地插入新元素(节点),因此使用链表可以节省内存,并提高操作效率。链表分为单向链表和双向链表。在此,只介绍单向链表,如图9-1所示。,单向链表,链表有一个“头指针”变量,图中以head表示,它指向链表的第一个元素。链表中每一元素称为“结点”,每个结点都应包括两个部分:用户需要用的实际数据和下一个结点的地址。 链表中的最后一个结点称为表尾,其下一个结点的地址值为NULL(表示为空地址)。 链表的各个结点在内存中可能是不连续存放的,具体存放位置由系统分配。 对单向链表的操作有:建立、遍历、插入与删除等常用操作。,提示:,

19、链表根据需要开辟内存单元。 如果不提供“头指针”(head),则整个链表都无法访问。,1、建立动态链表,所谓建立动态链表是指一个一个地开辟节点和输入各节点数据,并建立起前后相链的关系。有两种方式:从表头创建链表和从表尾创建链表。我们只介绍后一种方式。,首先声明一个结构:,struct student int num; float score; struct student *next; ;,然后,从表尾创建链表,步骤如下:,(1)设单向链表的表头指针为head(它总是指向第一个节点),尾指针为tail(它总是指向最后一个节点),它们的初始值为NULL。 (2)一旦链表中有新的节点加入,把它添加

20、到表尾,即把原来链表的尾节点的next域指向该新增的节点(应该注意的是,建立链表的第一个节点时,整个链表是空的)。 (3)由于每增加一个节点,要申请一个动态存储空间,以便存放相应的数据,故引入一个临时指针变量p。,第1步:建立第1个结点,p = (struct student *)malloc(LEN); p-num = num; p-score = score; p-next = NULL;,head = p;(因为此时head=NULL) tail = p;,第2步:建立第2个结点,p = (struct student *)malloc(LEN); p-num = num; p-scor

21、e = score; p-next = NULL;,tail-next = p;(因为此时head!=NULL) tail = p;,第3步:建立第3个结点,p = (struct student *)malloc(LEN); p-num = num; p-score = score; p-next = NULL;,tail-next = p; tail = p;,#include #include #define LEN sizeof(struct student) struct student int num; float score; struct student *next; ;,建立

22、链表的函数,struct student *creatLink(void) int num; float score; struct student *head, *p, *tail; head=tail=NULL; while(scanf(%d, ,2、输出动态链表,输出动态链表,即将链表中各节点的数据依次输出。首先要知道链表第一个节点的地址,也就是要知道head的值。然后设一个指针变量p,先指向第一个节点,输出p所指的节点,然后使p后移一个节点,再输出,直到链表的尾节点。,void printLink(struct student *head) struct student *p; if(

23、head=NULL) printf(No Records.n); else printf(These records are:n); for(p=head; p!=NULL; p=p-next) printf(%d %.1fn, p-num, p-score); ,输出动态链表的函数,3、对链表的删除操作,从一个动态链表中删去一个结点,即把它从链表中分离开来,撤销原来的链接关系。,现在考虑删除链表中所有符合要求的结点:,(1)需要考虑被删除节点是否为表头。若被删除的节点为表头,则表头要后移。 (2)引入两个辅助指针p1、p2,p2始终指向当前准备删除的节点,而p1则总是指向p2的前一个节点。

24、(3)链表节点删除的原则是:先链接,后断开。,第1种情况:要删的是第一个结点,p2 = head; head = head-next;,free(p2);,第2种情况:要删的不是第一个结点,p1-next = p2-next;,free(p2);,/*删除节点的函数*/ struct student *delLink(struct student *head, int num) struct student *p1, *p2; while(head ,删除结点的函数,p1 = head; /*从表头的下一个节点搜索所有符合删除要求的节点*/ p2 = head-next; while(p2)

25、if(p2-num=num)/*p2所指的节点符合删除要求*/ p1-next = p2-next; free(p2); else p1 = p2; p2 = p1-next; return head; ,删除结点的函数,4、对链表的插入操作,对链表的插入是指将一个节点插入到一个已有的链表中的正确位置。步骤如下: (1)找到正确位置,然后插入新的节点。 (2)引入3个辅助指针p0、p1、p2,p0指向当前准备插入的节点,p1指向第i节点,p2指向第i+1节点。 (3)链表节点插入的原则是:先链接,后断开。,第1种情况:插在表头,(1)查找要插入的位置。 (2)找到了,应该插在表头。 (3)插入

26、。,插在表头,head = p0; p0-next = p2;,第2种情况:插在中间,(1)查找要插入的位置。,插在中间,(2)找到了,应该插在表中间。,插在中间,p1-next = p0; p0-next = p2;,第3种情况:插在表尾,p2-next = p0;,插入结点的函数,struct student *insertLink(struct student *head, struct student *stud) struct student *p0, *p1, *p2; p0 = stud; p2 = head; if(head = NULL) /*原链表为空时插入*/ head

27、= p0; ,插入结点的函数,else/*原链表不为空时插入*/ while(p0-num p2-num) ,5、对链表的综合操作,例9.6 有N个学生(学生信息包括学号、1门课的成绩),要求:,(1)编写一个函数建立一个包含N个学生的单向动态链表,从键盘输入数据,当输入学号为0时,输入结束,并返回链表的头指针。 (2)编写一个函数输出动态链表中的学生数据。 (3)从键盘输入一个成绩,编写一个函数以删除动态链表中所有小于此成绩的节点。 (4)假设链表中的学生记录是按学号由小到大顺序排列的,现在要按顺序插入新的学生记录,编写一个函数实现此功能。,分析:,将以上建立、输出、删除、插入的函数组织在一

28、个C程序中,用main函数作主调函数。,int main() struct student *head, *stu; int num; float score; head=creatLink(); printLink(head); /*链表的删除*/ while(scanf(%d, ,main函数,/*链表的插入*/ while(scanf(%d, ,#include #include #define LEN sizeof(struct line) struct line int num ; struct line *next ; ;,例9.7 写出下列程序的运行结果,程序运行时输入:2 4

29、6 8 10 0。,int main() struct line *p1 , *p2 , *head ; int j, k = 0; p1 = p2 = head = (struct line *) malloc (LEN) ; scanf(%d, ,p1 = head-next; p1 = p1-next; for(j=1; j %d, p1-num); p1 = p1-next ; return 0; ,-6-8-10-2-4,七、联合,联合是指在不同时刻可以保存不同类型和长度的对象的变量,编译器负责跟踪对象的长度和对齐要求。联合提供了一种方式,可以在单块存储区中管理不同类型的数据,而不需

30、要在程序中嵌入任何与机器有关的信息。,联合,联合的目的是一个变量可以合法地保存多种数据类型中任何一种类型的对象。其语法结构如下: union u_tag int ival; float fval; char *sval; u; 变量u必须足够大,以保存这3种类型中最长的一种,具体长度与具体的实现有关。,联合,这些类型中的任何一种类型的对象都可赋值给u,且可以使用在随后的表达式中,但必须保证是一致的:读取的类型必须是最后一次存入的类型。程序员负责跟踪当前保存在联合中的类型,如果保存的类型与读取的类型不一致,其结果取决于具体的实现。,联合,可以通过下列语法访问联合中的成员: 联合名.成员 或: 联

31、合指针-成员 它与访问结构的方式相同。 联合可以使用在结构和数组中,反之亦可。,联合,实际上,联合就是一个结构,它的所有成员相对于基地址的偏移量都为0,此结构空间要大到足够容纳最“宽”的成员,并且,其对齐方式要适合于联合中所有类型的成员。 对联合允许的操作与对结构允许的操作相同:作为一个整体单元进行赋值或复制、取地址及访问其中的一个成员。 联合只能用其第一个成员类型的值进行初始化。因此,上述联合u只能用整数值进行初始化。,例9.8,设有若干个人员的数据,其中有学生和教师。学生的数据中包括:学号、姓名、性别、职业、班级。教师的数据包括:工号、姓名、性别、职业、职务。可以看出,学生和教师所包含的数

32、据是信息不完全相同,现要求对这些数据进行统一的输入输出。,输入样例: 101Lifs501 102Wangmtprof 105Heftinstr 107HumtAprof 108gengfs510 输出样例: Nsexjobbanji/position 101Lifs501 102Wangmtprof 105Heftinstr 107HumtAprof 108gengfs510,分析:,(1)输入数据。读入号码、姓名、性别、职业。如果职业为学生,则读入班级;否则职业为教师,则读入职务。 (2)输出数据。输出号码、姓名、性别、职业。如果职业为学生,输出班级;否则职业为教师,则输出职务

33、。,struct member int num; char name20; char sex; char job; union int banji; char position20; category; person5;,#include int main() int i; for(i=0; i5; i+) scanf(%d %s %c %c, ,printf(No. name sex job banji/positionn); for(i=0; i5; i+) printf(%-4d%-5s%-4c%-4c, personi.num, , personi.sex, p

34、ersoni.job); if (personi.job =s) printf(%-6dn, personi.category.banji); else printf(%-6sn, personi.category.position); return 0; ,八、枚举类型,枚举类型是ANSI C新标准所增加的。如果一个变量只有几种可能的值,则可以定义为枚举类型。 所谓“枚举”是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。,1、枚举类型的声明,枚举类型的声明非常类似于结构,它使用关键字enum来标志一

35、个枚举类型的开始。枚举类型声明的一般形式为: enum 枚举名枚举值表 ; 枚举名是可选的。在枚举值表中应罗列出所有可用值,这些值也称为枚举元素。例如: enum weekdaysun, mon, tue, wed, thu, fri, sat ; 该枚举名为weekday,枚举值共有7 个,即一周中的七天。凡被说明为weekday 类型变量的取值只能是七天中的某一天。,2、枚举变量的定义,设有变量a, b, c 被说明为上述的weekday,可采用下述任一种方式: (1)在声明枚举类型的同时定义枚举变量: enum weekdaysun,mon,tue,wed,thu,fri,sat a,b

36、,c; 或: enumsun, mon, tue, wed, thu, fri, sata, b, c; (2)先声明枚举类型再定义枚举变量: enum weekdaysun, mon, tue, wed, thu, fri, sat ; enum weekday a, b, c;,3、枚举变量的赋值和使用,枚举值是常量,不是变量,不能在程序中用赋值语句再对它赋值。例如,对枚举weekday 的元素再作以下赋值: sun=5; mon=2; sun=mon; 都是错误的。 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0, 1, 2。如在weekday 中,sun 值为0,mo

37、n 值为1, , sat值为6。,枚举变量的赋值和使用,一个整数不能直接赋给一个枚举变量,只能把枚举值赋给枚举变量。例如: a=0; b=1; 是错误的。 而: a=sum; b=mon; 是正确的。 如一定要把数值赋予枚举变量,则必须用强制类型转换。例如: a = (enum weekday)0; 其意义是将顺序号为0 的枚举元素赋予枚举变量a,相当于: a = sun; 枚举值可以用来作判断比较。,注意:,枚举元素不是字符常量也不是字符串常量,使用时不要加单引号或双引号。,例9.9,有一个口袋中有红、蓝、白3种颜色的球若干。每次从口袋中先后取出3个球,问得到3种不同颜色的球的可能取法,输出

38、每种排列的情况。,输入样例: 本题无输入 输出样例: 1 red blue white 2 red white blue 3 blue red white 4 blue white red 5 white red blue 6 white blue red total: 6,#include enum colorRED, BLUE, WHITE; void output(enum color i) switch(i) case RED: printf(%-10s, red); break; case BLUE: printf(%-10s, blue); break; case WHITE: p

39、rintf(%-10s, white); break; ,int main() enum color i, j, k; int n=0; for(i=RED; i=WHITE; i=(enum color)(i+1) for(j=RED; j=WHITE; j=(enum color)(j+1),if(i!=j) for(k=RED; k=WHITE; k=(enum color)(k+1) if(k!=i ,九、类型定义(typedef),关键字typedef可用来建立已定义好的数据类型的别名。例如,语句 typedef int Length; 将Length定义为与int具有同等意义的名字

40、。 类型Length可用于类型声明、类型转换等,它和类型int完全相同,例如: Length len, maxlen; Length *lengths10;,类型定义(typedef),如语句 struct date int month; int day; int year; ; typedef struct date Date; 定义了新的类型名Date,它是类型struct date的别名。,类型定义(typedef),为了省略结构标记,C程序员经常用typedef定义结构类型。如下面的定义不需要用单独的typedef语句就建立了结构类型Date。 typedef struct int m

41、onth; int day; int year; Date;,注意:,(1)typedef中声明的类型在变量名的位置出现,而不是紧接在关键字typedef之后。typedef在语法上类似于存储类extern、static等。 (2)一般以大写字母作为typedef定义的类型名的首字母,以示区别。,注意:,(3)从任何意义上讲,typedef声明并没有创建一种新类型,它只是为某个已存在的类型增加了一个新的名称而已。typedef声明也没有增加任何新的语义,通过这种方式声明的变量与通过普通声明方式声明的变量具有完全相同的属性。 (4)实际上,typedef类似于#define语句,但由于typed

42、ef是由编译器解释的,因此它的文本替换功能要超过预处理器的能力。,注意:,(5)除了表达方式更简洁之外,使用typedef还有另外两个重要原因。 第一个原因是,它可以使程序参数化,以提高程序的可移植性。如果typedef声明的数据类型同机器有关,那么,当程序移植到其他机器上时,只需要改变typedef类型定义就可以了。例如,需要让整数占4个字节的程序在一种系统上可能要用类型int,而在另一种系统上可能要用类型long。为可移植性而设计的程序经常用typedef建立4字节整数的别名(如Integer)。 第二个原因是,typedef为程序提供了更好的说明。,十、应用实例学生成绩管理,学生信息由学

43、号、姓名、性别、3门课的成绩、平均成绩和总成绩构成。学生数不超过100。写一个处理学生信息的程序,要求有如下功能: (1)插入学生信息,命令格式如下: INSERT number name sex score1 score1 score3 表示插入一个学生信息。插入后显示插入的学生信息,格式如下: 学号 姓名 性别 成绩1 成绩2 成绩3 平均成绩 总成绩 说明:数据中间由一个空格分开,成绩保留一位小数。 (2)显示所有学生信息,命令格式如下: LIST 按照学号从小到大的顺序依次显示所有学生信息,每个学生信息一行,格式如下: 学号 姓名 性别 成绩1 成绩2 成绩3 平均成绩 总成绩 说明:

44、数据中间由一个空格分开,所有成绩保留一位小数。 (3)退出程序,命令格式如下: QUIT 输出“Good bye!”后结束程序。输入的最后一条命令总是QUIT。,应用实例学生成绩管理,输入样例: INSERT 09001 zhanghong F 78 82 87.5 INSERT 09003 lisi M 68 62 67.5 LIST INSERT 09002 wangwu M 78 72 77.5 LIST QUIT 输出样例: 09001 zhanghong F 78.0 82.0 87.5 82.5 247.5 09003 lisi M 68.0 62.0 67.50 65.83 197.5 09001 zhanghong F 78.0 82.0 87.5 82.5 247.5 09003 lisi M 68.0 62.0 67.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论