C语言第七次作业答案ppt课件.ppt

上传人:小飞机 文档编号:1375858 上传时间:2022-11-16 格式:PPT 页数:77 大小:384KB
返回 下载 相关 举报
C语言第七次作业答案ppt课件.ppt_第1页
第1页 / 共77页
C语言第七次作业答案ppt课件.ppt_第2页
第2页 / 共77页
C语言第七次作业答案ppt课件.ppt_第3页
第3页 / 共77页
C语言第七次作业答案ppt课件.ppt_第4页
第4页 / 共77页
C语言第七次作业答案ppt课件.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《C语言第七次作业答案ppt课件.ppt》由会员分享,可在线阅读,更多相关《C语言第七次作业答案ppt课件.ppt(77页珍藏版)》请在三一办公上搜索。

1、第八章 结构体、联合和枚举,8.1 结构体概述8.2 结构体类型定义8.3 结构体变量8.4 结构体数组8.5 指向结构体类型数据的指针8.6 结构体和函数8.7 单链表8.8 联合与枚举8.9 用typedef定义类型,概述,在一些复杂的数据结构中,有时需要将不同类型的数据集合成一个有机的整体。 如:一个学生的情况纪录单可能包括学号、姓名、性别、年龄、成绩、家庭地址等数据项。这样的整体,C语言中称为“结构体”数据结构,简称“结构体” (structure)。结构体是一种较为复杂而又非常灵活的构造型的数据类型。一个结构体类型的数据可以由若干个称为成员(或域)的成分组成。不同的结构体类型其成员也

2、不同。对于一个具体的结构体而言,其成员的数量是固定的,这一点与数组相同,但该结构体中各成员的数据类型可以不同,这是结构体与数组的重要区别。,8.1 结构体类型的定义,结构体类型定义的一般形式: struct 结构体名 结构体成员表列 ; 其中struct是关键字,结构体成员表列也称域表,每个成员也称结构体中的一个域。对每个成员都应进行类型说明。 例如:struct student int num; char name20; char sex; int age; float score; ;,对结构体类型定义的总结,1 结构体类型定义是由程序员根据设计需要自行定义的,因此结构体类型可以有多种,每

3、种结构体类型都可以有自己的结构体名以及包含不同数目的成员。2 若定义了一个结构体类型,那仅仅是定义类型而已,而不分配内存单元。例如上面已经定义了的struct student结构体类型,struct student可以用来定义一个该类型的变量,并不意味着它的那些成员被分配了内存空间。3 成员名可以与程序中的变量名相同,两者不代表同一对象。例如,程序中可以另定义变量num,它与struct student中的num是两回事,互不干扰。,4 结构体成员类型可以是整型、实型、字符型、数组、指针等基本类型或构造类型,还可以是已定义过的结构体类型。struct date int year; int mo

4、nth; int day;,struct student int num; char name20; char sex; struct date birthday; float score4;,8.2 结构体变量,结构体类型的定义只是指出了该结构的组成情况,表明存在有此种类型的结构模型。该结构体类型中不能存放具体的数据,系统也不会为它分配实际的存贮单元。为了能在程序中使用结构体类型的数据,应在定义了某种结构体类型以后,再定义该结构体类型的变量,以便在结构体类型的变量中存放具体的数据。结构体变量的定义有三种形式:,结构体变量定义1,1先声明结构体类型,再定义结构体类型的变量。 struct st

5、udent int num; char name20; char sex; int age; float score4; ; struct student st1, st2;,结构体变量定义2,2在声明结构体类型的同时定义结构体类型的变量。struct student int num; char name20; char sex; int age; float score4;st1,st2;,结构体变量定义3,3直接定义结构体类型变量。struct int num; char name20; char sex; int age; float score4;st1,st2; 在关键字struct

6、后省略了结构体名 。不提倡使用这种形式。,可用sizeof来计算一个结构体类型数据的长度 如:sizeof(struct student) 或 sizeof(st1),结构体变量初始化,初始化就是在定义变量的同时给变量赋初值,例如:struct student int num; char name8, sex; struct date int year, month, day; birthday; float score4;st1=101, “Xu, F, 1975, 9, 12, 83.5, 88, 75.5, 90;在对结构体变量进行初始化时,系统是按每个成员在结构体中的顺序一一对应赋初值

7、的。若只对部分成员进行初始化,则只能给前面的若干成员赋值,而不允许跳过前面的成员给后面的成员赋值。未赋值部分均为0值。,结构体变量的引用,1.结构体变量整体引用如果要将结构体变量整体引用则往往只限于将一个结构体变量直接赋值给另一个具有相同类型的结构体变量。例如有声明语句:struct student stux,stuy;,执行stuy=stux;语句后变量stuy中各成员的值都完全与stux各成员的值相等。,2. 结构体变量成员引用 对结构体成员的引用方式为: 结构体变量名.成员名其中,“.”为结构体成员运算符,它的优先级处于所有运算符优先级的最高级别 。例如:st1.num表示st1变量中的

8、num成员,可以对它赋值st1.num=1001,这时st1.num就相当于一个整型数。,结构体变量引用规则说明,1 结构体变量整体不能直接用来输入输出。如: scanf (%d,%s,%c,%d,%f, 但可逐个全部或部分输入输出。如: scanf(“%d%c%f”, &st1.num, &st1.sex, &st1.score2);2 若成员本身又是一个结构体类型,则必须逐层使用成员名定位,找到最底层的成员。例如在结构体变量st1中对成员year的引用方式为:st1.birthday.year。3 若结构体中的成员是字符型数组时,则可将其看作是“字符串变量”,而直接引用。例如:对st1中n

9、ame的引用可写成:st1.name。4 若结构体中的成员是数值型数组时,则对该数组成员的引用,应该为对该数组元素的引用。例如:对st1中score数组元素的引用可写成:st1.score0,st1.score1,st1.score2,st1.score3。,Wrong!,我们可以将结构体中变量的每个成员当作是同类型的普通变量,对它进行同类变量所允许的任何操作。例如成员变量st1.name是字符串,可以对它进行字符串变量所允许的任何操作,包括输入、输出。同样对于成员中的数组元素也可按同类型的数组元素进行操作。如: scanf(%s, st1.name); /* 对结构体成员name赋值 */

10、for(i=0; i4; i+) scanf(%f, ,float f;for(i=0; i4; i+) /*在TC中的赋值语句*/ scanf(%f, ,例8.1 写程序给结构体变量赋初值。struct student int num; char name20,sex; int age; float score;main() struct student st; printf(please input data:n); scanf(%d %s %c %d %f, ,8.4 结构体数组,结构体数组是同类型结构体变量的集合。 1. 结构体数组的定义和初始化struct student int n

11、um; char name20; char sex; int age; float score; sta 31001,LiLi,m,20,75.0, 1002,“fangfang,m,21,86.0, 1003,“yuanyuan,f,19,91.0;,2.结构体数组的输入和输出 对结构体数组数据的输入或输出可利用for循环结构,例如:int i;for(i=0;i2;i+)scanf (%d %s %c %d %f, 这是给数组sta3的元素赋值操作 。,例1:求30个学生的平均成绩。 main ( ) struct student int num; char name20; char se

12、x; int age; float score; st30; int i; float average=0.;,for (i=0; i30; i+) scanf(“%d %s %c %d%f, ,8.5 (指向结构体类型数据)的指针,定义、初始化引用结构体成员,1.定义和初始化,定义指向结构体类型的数据指针的方法跟定义指向简单类型变量的指针方法相同,只不过数据类型的声明部分用在程序中已定义的结构体数据类型来替代。如: struct student int num; char name20; float score; ; struct student *p, stu;跟任何其他类型的指针一样,要

13、使用定义好的指针变量,在使用前应对它赋值,也就是使它确切地表示某一个变量的地址。例如有上面的定义,可对p进行如下赋值: p=,如果已经定义了结构体数组变量,那么也可以用结构体数组名对同类型的结构体指针赋值。例如: struct student st5,*p; p=st; 指针p是指向struct student 类型的数据,它只能表示一个该结构体类型数据的地址,而不能指向一元素中的某个成员,如下面的两个赋值语句都是错误的:p=,wrong,2 用结构体指针引用结构体成员,在引入指向结构体变量的指针的概念后,原来引用变量成员的方式可以变为以下形式: (*指针变量名). 成员名 等价于 结构体变量

14、名.成员名在C语言中为了使用方便和直观,(*p).num可以改用p-num来代替,“-”称为指向运算符 。因此,下面引用结构体成员的几种方式完全等价: 结构体变量名.成员名(如stu.num) 结构体指针名-成员名(p-num) (*结构体指针名).成员名 (&结构体变量名)-成员名,更地道!,“.”只可用在表示变量名含义的变量的后面,而“-”只可用在表示地址含义的变量的后面。,3 指向结构体数组的指针,例8.3定义一个结构体数组并赋初值,用指针法输出这些数据。struct student int num; char name10; char sex;main() struct student

15、 st3=101,Xu,M,102,Yan,F,103,Ling,F; struct student *p; printf(No Name Sex:n ); for(p=st;pnum,p-name,p-sex);,8.6 结构体与函数,1. 向函数传递结构信息 一、结构体变量成员作函数参数 (见【例8.4】) 只要结构体成员是具有单个值的数据类型(即int等相关类型),就可以把它作为参数传递给一个接受这个特定类型参数的函数。 二、结构体变量作函数参数(见【例8.5】) 三、结构体指针作函数参数(见【例8.6】) 把一个完整的结构体变量作为参数传递,在新的C标准中虽然合法,但要将成员值一一传递

16、,费时间又费空间。如果结构体类型中的成员很多,或有一些成员是数组型,则程序运行效率会降低。在这种情况下,用结构体指针作函数参数能提高些运行效率。2. 结构体指针作为函数返回值 (见【例8.7】),8.7 单链表,链表概述、结点建立链表、输出链表插入结点、删除结点其他链表结构,1 概述,C语言程序为批量的数据集合向操作系统申请存储空间时一般有三种模式: 一、用数组。用数组存放数据时,通过数据类型定义,数组在程序编译期间就申请到了所要求的存储空间,因此必须事先定义好固定的长度,并且连续存放,对于那些数组元素不确定的数组,在定义时就得用可能的最多元素的个数来定义,实际应用中可能会造成大的浪费。(静态

17、存储分配方式) 二、利用C语言提供的动态内存分配函数,在需要使用到某一批数据前分配相应数量的存储空间块,该存储块由一个指针来标识。这个操作过程是在程序运行中完成的,这是一种半动态的存储分配方式。,三、用链表C语言中引入的一种重要的数据结构。 链表是完全动态地进行存储分配的一种结构。它能随时随地根据需要开辟内存单元。链表中的各元素在内存中可以不连续存放,通过指针把它们串连成一个整体,并且被串连的数据个数和顺序关系可以按需改变,因此能方便迅速的插入、删除数据项。,单链表结构,链表有单链表、双链表和循环链表之分,本章重点介绍其中的一种最简单也是最常用的链表:单链表 有关单链表的基本概念链表是一种链式

18、结构,各元素在内存中可以不是连续存放的。 链表中的元素又称为结点,结点必定是结构体变量,它包含两个方面的数据:一为用户要用到的实际数据(图8-6中的A、B、C、D);二为一个表示下一结点的首地址的指针变量(图8-6结点中不加阴影的部分)。单链表一般设有一个头指针变量,用来存放第一个结点的地址,图8-6中用head表示。单链表中尾结点的指针指向NULL(表示空地址)。,2 结点定义,使用链表前首先要定义好该链表的结点类型,链表的结点类型是一个结构体类型,该结构体除了包括用户要用的实际数据成员变量外,还包括一个指向自身类型的指针变量,往往用next给该指针变量命名,顾名思义,next表示下一个结点

19、的地址的意思。通常也称这种结构体类型为自引用结构 。单链表的结点的结构体类型定义的一般形式为: struct 结构体名 结构体其他成员表列; /* 数据域 */ struct 结构体名 指针变量名; /* 地址域 */ ;,例:一个学生链表的结点的结构体类型定义如下: struct st int num; float score; struct st *next; ;定义了结点的类型后就可以用它来定义结点变量或指向该类型数据的指针变量了,比如: struct st stu, *p; p可以用如下语句赋值:p=,其中:指针变量next是struct st类型中的一个成员,是指向自身结构体类型的指

20、针变量。,3 建立链表,建立链表是指在程序执行的过程中从无到有的创建一个链表,意味着反复创建一个一个的结点,并给这些结点建立起前后相连的关系,直到最后一个结点为止。在C程序中用循环结构实现“反复”创建结点的过程。创建每个结点的过程可分为三步:第一步考虑新结点空间的申请,第二步考虑给新申请到的结点的成员赋值,第三步考虑如何把新结点插入到链表已经建好的部分。根据第三步提出的问题,创建单链表的方式可分为三种:第一种方式是新结点总是插到链表已建好部分的表头前;第二种方式是新结点总是接在链表已建好部分的表尾;第三种方式是按结点中某个成员的顺序规则创建一个有序的链表 。,例如现在要建立一个学生信息链表,该

21、链表的结点类型定义如下:struct node int num; float score; struct node *next;该结点类型名称为struct node,它包含两个数据域成员:num(学号)和score(分数)和一个地址域成员:next。下面给出了用三种方法创建学生信息表的三个函数,三个函数的共同点是:它们都是用循环结构实现创建过程,并约定当输入某个学生的学号为0时,结束循环即结束创建链表。,创建链表的方法一(新结点总是插在表头前),struct node* create1( ) /*【例8.8】 */ struct node* head=NULL,*p; float f; wh

22、ile(1) p=(struct node*)malloc(sizeof(struct node); /* 申请新结点空间 */ scanf(%d, /* 返回链表头指针 */ ,创建链表的方法二(新结点总是插在表尾),struct node* create2( ) /*【例8.9】 */ struct node *head=NULL,*tail,*p; float f; while(1) p=(struct node*)malloc(sizeof(struct node); /* 申请新结点空间 */ scanf(%d, /* 返回链表头指针 */,创建链表的方法三(按结点成员的某种次序建表

23、),struct node* create3( ) /*【例8.10】按成绩从低到高排序 */ struct node *head=NULL, *p, *np, *nn; float f; while(1) p=(struct node*)malloc(sizeof(struct node); /* 申请新结点空间 */ scanf(%d, /* 给结点地址成员赋空值 */,if(head=NULL) head = p; /* 创建第一个结点 */ else if(p-scorescore) 新结点成绩小于头结点成绩 */ /* 结点插到表头前 */ p-next=head; head=p;

24、else /* 寻找新结点的插入位置并完成操作 */ np=head;nn=head; for(; nn!=NULL,两点说明:1尽管每次新结点的地址成员都用NULL赋值,但随着新结点的加入,该地址值可能会被后继结点的地址覆盖,即使成为了尾结点,仍然保持原来的空值,恰好不需要重新给地址成员赋空值。2这里是以struct node作为结点类型讨论创建链表的方法,若换成别的结构体类型作结点,那么输入数据时需另写输入结点数据成员值的语句。,4 输出链表,输出链表各结点的值只要知道链表头结点的地址,也就是知道head头指针的值,然后设一个指针p指向第一个结点,输出该结点的数据域数据后使p的指向后移一个

25、结点,继续输出数据并重设p指针,直到p指向空地址为止。使指针p后移的操作可用语句: p=p-next; 实现,因为当前p指向的结点的地址成员p-next存储的正是p的后继结点的地址 。,void print(struct node *head) struct node *p; p=head; printf (Information of list as follows:n); while (p!=NULL) printf(%d %.1fn,p-num,p-score); p=p-next; /* 使指针p指向下一结点 */ printf (Finished printing!n);,5 插入结

26、点,插入结点的操作是在链表已经创建成功的情况下进行的,插入结点的函数的参数应包含:结点将要插入的链表的头指针结点中数据成员的信息(根据结点类型定义而定,这里参照struct node定义)方法可参照建立链表的三种方法:结点插在表头前结点插到表尾结点按有序链表的顺序插入,需寻找插入位置,/*结点插到表头前*/struct node* insert1(struct node *head, int num,float score) struct node *p; p=(struct node*)malloc(sizeof(struct node); /* 申请结点空间 */ p-num = num;

27、 p-score = score; /* 将参数值赋给结点数据域成员 */ p-next = head; /* 将要插入的结点插到表头前 */ head= p; /* 使插入结点成为表头 */ return head;,结点插到表尾struct node* insert2(struct node *head,int num,float score) struct node *p; struct node *tail; tail=head; while(tail-next!=NULL) tail=tail-next; /*找到尾结点*/ p=(struct node*)malloc(sizeof

28、(struct node); /* 申请新结点空间 */ p-num=num; p-score=score; /* 将参数值赋给结点数据域成员 */ tail-next=p; /* 插入的结点接在表尾 */ p-next = NULL; /* 使插入的结点成为尾结点 */ return head;,struct node* insert3(struct node *head,int num,float score)/*按序插入结点*/ struct node *p,*np,*nn; p=(struct node*)malloc(sizeof(struct node); p-num=num; p

29、-score=score; /* 参数值赋给结点数据域成员 */ p-next=NULL; if(p-scorescore) /* 结点插到表头前的情况 */ p-next=head; head=p; return head; np=head;nn=head; /* 找插入位置 */ for(; nn,6 删除结点,删除结点是链表头结点(head=head-next; (head=p2-next;) 删除结点是某个中间结点或尾结点(假设p2指向被删除结点,p1指向该结点的前一结点): p1-next=p2-next;,【例8.15】写一个函数,查找链表中具有某特定学号的学生的结点信息并删除它,

30、假设链表头指针用head表示。struct node* delnode(struct node *head, int num) struct node *p=head, *q; if(head=NULL) /* 空链表不能执行删除操作 */ printf(illegal operationn);return NULL; if(head-num=num) /* 将要被删除的结点是头结点 */ head=p-next; free(p); return head; ,for (q=head;q-next!=NULL;q=q-next ) /* 从第二个结点开始寻找将要被删除的结点 */ p=q-ne

31、xt; /*说明q指向的结点在前,p指向的结点在后*/ if(p-num=num ) /*找到了*/ q-next=p-next; /* 删除p指向的结点,使脱离链表 */ free(p); /* 释放p指向的空间 */ return head; printf(Not found!n); /* 没找到要删除的结点 */ return head;,【例8.16】写一个删除链表的函数,假设链表头指针用head表示。struct node* dellist(struct node *head) struct node *p, *u; p=head; while(p!=NULL) u=p-next;

32、/* 保存要删除结点的下一结点的地址 */ free(p); /* 释放p指向的结点空间 */ p=u; /* 移到下一结点 */ return NULL;,7 综合示例,【例8.18】针对多项式函数如 y=6x5-4x3+3x2+x-7,创建一个链表存放该多项式信息,然后写一个函数求该多项式的导数,仍然在该链表中存放导数信息并输出结果。#include stdio.hstruct poly int coef, n; struct poly *next;,struct poly *create() struct poly *head=NULL,*p; printf(Please input c

33、oef and n(backspace as seperator):n); do p=(struct poly*)malloc(sizeof(struct poly); scanf(%d %d,void daoshu(struct poly *head) struct poly *p=head; int n,coef; while(p!=NULL) if(p-n!=0) /* 对每个不是常数项的结点求导系数和幂次仍存放在原来的位置 */ p-coef=p-coef*p-n; /* 用公式求导数项系数 */ printf(%dx,p-coef); p-n = p-n-1; /* 导数项幂次为原项

34、幂次减1 */ printf(%d .,p-n); p=p-next; /* 使p指向下一结点 */ printf(n);,main() struct poly* head; head=create(); daoshu(head);,*【例2】设计程序,把10进制整数转化成某进制(如2进制、4进制、8进制、16进制或25进制)的数。分析: 采用“除基取余法”,将10进制数n转化成base进制 数,当n!=0时,得商取余: c=n%base; n=n/base; 余数c用字符型数字09或字母AZ来存放。 if(c10) c=c+0; else c=c-10+A; 由于余数的个数不确定,用动态数据

35、结构(链表) 来存放,且新结点总是插在表首。,#include stdio.h#include stdlib.hstruct node char num; struct node *next ;main() struct node *p, *q=NULL; int m, n, base, c; printf(Input n and base:n); scanf(%d%d,while(n) c=n%base; n=n/base; if(cnum=c; p-next=q; q=p; ,printf(Output:n); printf(%d(10)=,m); while(p) printf(%c,p

36、-num); p=p-next; printf(%d)n,base); free(q);,8 其他链表结构,8.8 联合和枚举,联合定义、应用*枚举,1 联合,概述 联合的概念 与结构体定义相似,但其成员共同占用一段内存(空间分配为其成员中最长的),采用覆盖技术,其成员互相覆盖,这样的数据结构称为“联合体”,或称“共用体”。显然,对于一个共用体变量,内存中某时刻只存放着其中的一种成员。,联合类型定义,类型的定义方式跟结构体相似,只是在结构体定义中的关键字“struct”用联合关键字“union”来代替。例如:union data int i; float f; char c6;,由该类型我们可

37、以像定义结构体变量那样定义联合型变量、指向联合型变量的指针或联合型数组。如:union data a,b,c;union data *pu=需要注意的是,联合体成员每一时刻只有一个起作用,该成员是最近一次对联合体存放的成员;变量不可在定义时初始化,【例8.19】 输入一个unsigned long型整数,写一个函数将这个整数的前两字节与后两个字节进行交换,主函数main()进行验证。union data unsigned long n; int b2;unsigned long swapbit(unsigned long k) union data d; int t; d.n=k; t=d.b

38、0; d.b0=d.b1; d.b1=t; return d.n;,main() unsigned long n; printf(Input data: ); scanf(%lx,*2 枚举类型,1)枚举类型的概念 实际应用中,有些变量的取值被限定在一个有限的范围内,如代表星期几的变量,只可能是星期日星期六;性别只可能是男性或女性;逻辑量只能是真或假;有时颜色只要取红黄兰白黑五种;等等。为此,语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中一一列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。,2) 枚举类型及其变量的定义 枚举类型定义的一般形式 enum 枚举

39、名 枚举符表列 ; 例: enum Boolean false, true; enum Day sun, mon, tue, wed, thu, fri, sat; enum Colorred, yellow, blue, white, black; enum Sexmale, female; 其中枚举符也称为枚举元素,是用户定义的标识符,这些标识符并不自动地代表什么含义。例如,。不因为写成sun,就自动代表星期日。, 枚举变量的定义 如同结构和联合一样:可先定义枚举类型再定义 该类型的变量;也可在定义枚举类型的同时定义 该类型的变量。 enum 枚举名 枚举符表列 ; enum 枚举名 变量

40、表; 或 enum 枚举名 枚举符表列 变量表; 或 enum 枚举符表列 变量表; 例:enum Day sun, mon, tue wed, thu, fri, sat; enum Day a, b, c; 或 enum Day sun, mon, tue wed, thu, fri, sata,b,c;,3) 枚举类型变量的赋值和使用 枚举元素是常量,不是变量。不能在程序中用 赋值语句再对它赋值。 例如,不能对上述枚举Day的元素再作以下赋值: sun=0 ; mon=1; sun=mon ; 枚举元素作为常量,本身由系统定义了一个表示 其序号的数值,从0开始顺序定义为0,1,2。 例如

41、,在上述枚举Day中,sun值为0,mon值为1,sat值为6。 枚举元素可赋值给变量。 如:a=sat; 则a变量值为1。, 可以改变枚举元素的值,可在定义时指定,如: enum Day sun=7, mon=1, tue wed, thu, fri, sat; 定义sun为7,mon为1,以后顺序加1,sat为6。 只能把枚举元素赋给枚举变量,不能把枚举元素相当的数值直接赋给枚举变量。如: 正确 a=sat; 错误 a=6; 如一定要把数值赋给枚举变量,则必须用强制类 型转换。如: a=(enum Day)6; 这相当于 a=sat; 枚举值可以应用关系运算。如: if(amon) if(

42、 a=sat ) .,【例1】现有苹果,桔子,香蕉,菠萝,生梨五种水果用来做水果拼盘,每个水果拼盘一定要有三种不同的水果组成,问可以制作出多少种水果拼盘。 对五种水果可以定义成枚举类型: enum combapple,orange,banana,pineapple,pear; 设此类型枚举变量i,j,k是组成拼盘的三种水果。按题意,它们分别是五种水果中的一种,并要求ijk。可用穷举法。,enum fruitapple,orange,banana,pineapple,pear;main() enum fruit i, j, k, pri; int n=0, loop; for(i=apple;

43、i=pear; i+) for(j=i+1; j=pear; j+) for(k=j+1; k=pear; k+) n+; printf(n%-4d,n); for(loop=1; loop=3; loop+) switch(loop) case 1: pri=i; break; case 2: pri=j; break; case 3: pri=k; ,switch(pri) case apple: printf(%-12s,apple); break; case orange: printf(%-12s,orange); break; case banana: printf(%-12s,b

44、anana); break; case pineapple: printf(%-12s,pineapple); break; case pear: printf(%-12s,pear); printtf(ntotal:%d,n);,8.89,*复杂数据类型定义类型标识符的重定义,9 用typedef定义类型,用typedef标识符可以定义新的类型名来代替已有的类型名。习惯上新的类型名用大写字母表示。 格式:typedef 原类型名 新类型名 如:typedef float REAL; /* 用REAL代替float */ 则: float a, b; 与 REAL a, b; 等价。 如定义N

45、UM为整型数组类型: typedef int NUM10; 则: int n10, m10; 与 NUM n, m; 等价。, 如定义STRING为整字符指针类型: typedef char *STRING; 则:char *p,*s10; 与 STRING p,s10; 等价。 如定义POINTER为指向函数的指针类型: typedef int (*POINTER)( ); 则:int (*p)( ); 与 POINTER p; 等价。 如定义NODE为指定的一结构体类型: typedef struct student char num4; float score; NODE; 则:stru

46、ct student st,*p; 与 NODE st,*p; 等价。,上机实验8,1. 书上习题2(求两个分数的和。)/*81.c*/ 提示 如:3/5+4/7=(3*7+5*4)/(5*7)=41/35; 3/5+4/35=(3*7+4)/35=25/35=5/7; 要定义结构体类型, 名为分数 fraction 成员:分子、分母 (numerator、denominator) 变量:分数1、分数2 用一函数frac_add()计算、化简并返回两个分数 的和。 两个相加的分数由键盘输入,输出和的样式为: num1/den1+num2/den2=num/den (或整数),2. 教材上8.17例补充完整并运行体会。/*817.c*/3. 书上习题7(page260) /*82.c*/,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号