结构、联合和枚举类型

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

4· 3 结构数组 1·
一个结构变量将若干个主要是不同类型的数据组织在一 起,对于若干个属同一个类型的结构变量可以用数组 组织在一起,叫做结构数组。结构数组的元素都是结 构变量。 定义结构数组的方法与定义普通结构变量的方法相同, 结构数组的初始化与普通结构变量的初始化方法也相 同。在初始化结构数组时,象普通数组一样,也可以 不指定数组元素的个数。系统会根据初值的情况来确 定数组元素的个数。 对结构数组成员的引用格式也与对普通结构变量成员的 引用格式相同: 结构数组名[下标]. 成员名 要逐级书写,只能对最底层的成员进行引用。
例4_4_4一个工人工资管理系统,其内容包括:编 号,姓名,性别,年龄,班组,基本工资,奖金, 保险。共有10名工人。求每一个工人的实发工资, 打印所有工人的全部信息,并打印出实发工资最 高的工人的姓名与实发工资。 分析:这道题与例4_4_1类似,由一个工人的问题 变成10个工人的问题,还需要输出最多的实发工 资项的姓名和工资数。求结构数组元素某一成员 最大值的方法与前面求数组元素最大值的方法相 似,一般都是假设第1个元素是最大的,然后其 余的所有元素都与之比较,如果有比第1个元素 大的,那么它就取代其最大值的位置。当然这里 需要定义一个变量,用于存放最大值的下标。
4· 2 使用结构类型变量 1·
如果在定义结构变量的同时赋值(也称为结构变量的初始 化),那么可以整体赋值。例如: struct WORKER { int iNum, iAge; char cName[20], cSex, cBranch[20]; float fJbgz, fJj, fBx, fSfgz; } w={1001, 35,”Zhang”,’M’,”jsj”,1000,200,100}; /*实发工资fSfgz未赋初值,由程序计算*/ 或者可以分开定义时初始化(类型定义不重复列出): struct WORKER w={1001, 35,”Zhang”,’M’,”jsj”,1000,200,100};
/* 4_4L4.C */ main() { struct WORKER /*定义结构类型WORKER*/ { int iNum; char cName[20], cSex; int iAge; char cBranch[20]; float fJbgz, fJj, fBx, fSfgz; }w[10]; /*定义结构数组w,包含10个结构类型的元素*/ int i,k; for(i=0;i<10;i++) /*该循环读入每个元素的成员值,并计算每个元素的fSfgz成员*/ { scanf("%d%s%c%d%s%f%f%f",&w[i].iNum,w[i].cName,&w[i].cSex,&w[i].iAge, w[i].cBranch,&w[i].fJbgz,&w[i].fJj,&w[i].fBx); w[i].fSfgz=w[i].fJbgz+w[i].fJj-w[i].fBx; } for(i=0;i<10;i++) /*该循环输出每个元素的每个成员*/ printf("%d\t%s\t%c\t%d\t%s\t%f\t%f\t%f\t%f\n",w[i].iNum,w[i].cName,w[i].cSex,w[i].iAge, w[i].cBranch,w[i].fJbgz,w[i].fJj, w[i].fBx,w[i].fSfgz); k=0; /* 赋初值0,假设w[0]的实发工资最高 */ for(i=1;i<10;i++) /* 该循环将实发工资最多的分量下标存入k */ if(w[i].fSfgz>w[k].fSfgz) k=i; printf(“The Max is:%s\t%f\n”,w[k].cName,w[k].fSfgz); /*输出实发工资最多的人的姓名与工资*/ }
只能对每一个结构的最底层成员逐个输入 输出。 结构变量的成员的引用方法是: 结构变量名. 成员名 其中的“.”称为成员运算符。 例如对上面定义的结构变量w:w.iNum 表 示结构变量w的iNum编号成员,ame 表示结构变量w的cName姓名成员……
/* 4_4L1.C */ main() { struct WORKER /* 定义结构类型WORKER */ { int iNum; char cName[20], cSex; int iAge; char cBranch[20]; float fJbgz, fJj, fBx, fSfgz; }w; /* 同时定义结构变量w */ scanf(“%d%s%c%d%s%f%f%f”,&w.iNum,ame,&w.cSex,&w.iAge,w.cBranch, &w.fJbgz,&w.fJj,&w.fBx); w.fSfgz=w.fJbgz+w.fJj-w.fBx; /* 键盘输入8个成员,计算第9个成员 */ printf(“%d\t%s\t%c\t%d\t%s\t%f\t%f\t%f\t%f\n”,w.iNum,ame,w.cSex,w.iAge, w.cBranch,w.fJbgz,w.fJj,w.fBx,w.fSfgz); /* 打印结构变量w的所有成员 */ }
例4_4_3 对候选人得票进行统计的程序。假设有 3个候选人,每次输入一个得票的候选人的名 字,最后输出各人的得票结果。假设共有10人 投票。 分析:定义一个结构数组,包含3个元素,表示 有3个候选人。每个元素有2个成员,一个是名 字,一个是得票数,得票数要初始化为0。根 据输入的名字进行判断,输入是谁的名字,就 给哪个元素的得票数成员加1。全部输入完成 后,输出结构数组的每个元素的每个成员。
作业与练习:
1、下面关于结构数组的描述正确的是: (A)结构数组的元素是结构变量的成员 (B)一个结构数组的元素是各种类型 的结构变量 (C)结构数组元素的成员不能是数组类型 (D)定义结构数组时,可以同时进行 赋值 2、若有定义: struct PERSON { char cName[20]; int iAge; }c[10]={“Zhao”,17,”Qian”,19,”Sun”,20,”Li”,23}; 能打印出字母”L”的语句是: (A) printf(“%c”,c[3].cName); (B) printf(“%c”,c[3].cName[1]); (C) printf(“%c”,c[2].cName[1]); (D) printf(“%c”,c[2].cName[0]); 5、输入一个人的生日和当前日期,计算实足年龄。日期采用结构体类型变 量形式。
结构类型和结构变量同时定义的标准形式是: struct 结构类型名 { 类型名1 成员名表1; 类型名2 成员名表2; …… 类型名n 成员名表n; }结构变量表列;
对引例4_4_1可以定义一个包含有9个不同类型数据的结构类型 并同时定义该类型的变量w。struct WORKER { int iNum, iAge; char cName[20], cSex, cBranch[20]; float fJbgz, fJj, fBx, fSfgz; }w;
例4_4_2 计算一个学生的平均成绩。关于学生 的信息包括:学号、姓名、出生日期、3门考 试成绩,计算平均成绩并输出所有信息。 分析:这道题与引例4_4_1非常相似,只是把计 算第9个成员实发工资改成计算三门课的平均 成绩。定义结构时,出生日期要定义成另一 个结构类型。3门成绩定义成含有3个元素的 float型数组。由于太相似了。故而这里只列出 变量表、NS图,程序只列出计算三门课的平 均成绩的那两句。 for(i=0;i<3;i++) fSum=fSum+stud.fScore[i]; stud.fAve=fSum/3;
第四节 结构、联合和枚举类型
[本节任务] 学会组织大量的不同类型的但又有 关联的数据用于编程。掌握用结构、联合这些 结构类 型构造一个记录,直接使用枚举这种结 构类型表示的数据进行运算。 [学习要点] 理解结构、联合和枚举类型,熟练 地用于程序设计解决实际问题。
4· 结构类型 1
[本段任务] 通过一个工人工资管理系统 的程序,学会结构类型的定义和使用, 体会使用结构类型解决组织大量的具不 同性质的、又有关联的数据参与编程的 问题。 4· 1 结构类型以及结构变量 1· 【引例】4_4_1 一个工人工资管理系统, 其内容包括:编号,姓名,性别,年龄, 班组,基本工资,奖金,保险。求某一 个工人的实发工资,并打印该名工人的 全部信息。
/* 4_4L3.C */ struct PERSON /*定义结构类型,包含两个成员*/ { char cName[20]; int iCount; }; main() { struct PERSON candidate[3]={{“Zhang”,0},{“Wang”,0},{“Li”,0}};/*定义结构数组并赋初值*/ int i,j; /*定义循环控制变量*/ char cName[20]; /*定义字符数组,存放键盘输入的候选 人名字,它与结构类型中的成员同名*/ for(i=0;i<10;i++) /*变量i控制外循环共10次,表示10张选票*/ { scanf(“%s”,cName); /*读入第i张选票上所选举的人的名字*/ for(j=0;j<3;j++) if(strcmp(cName,candidate[j].cName)= =0) candidate[j].iCount++; /*选票上的名字与候选人名比较,相等者得票数加1*/ } for(i=0;i<3;i++) /*依次输出各个候选人的名字和得票数*/ printf(“%s\t%d\n”,candidate[i].cName,candidate[i].iCount); } 这里candidate[i].cName表示为结构数组的第i个分量candidate[i]的cName成员。
下次课再见!Leabharlann
相关文档
最新文档