C语言学习第八章结构体与共同体_第1页
C语言学习第八章结构体与共同体_第2页
C语言学习第八章结构体与共同体_第3页
C语言学习第八章结构体与共同体_第4页
C语言学习第八章结构体与共同体_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

第8章结构体与共用体8.1结构体类型的定义8.2结构体类型变量的定义、引用和初始化8.3结构体数组8.4结构体指针变量8.5链表8.6共同体、枚举和用户自定义类型8.7程序举例数组-----同类型数据的有序集合有时,需要将不同类型的数据组合成一个整体,以便于引用例:学生的信息学号、姓名、性别、年龄、成绩、家庭住址显然,上述数据类型是不相同的,但都是学生的信息,应作为一个整体进行考虑。C:允许用户自己定义一种数据结构------结构体结构体:不同数据类型成员的集合使用时:定义类型用类型定义变量给变量赋值引用变量的值8.1结构体类型的定义格式:

struct

结构体名

{类型成员1;类型成员2;

类型成员n;

};成员:可以是基本类型,也可以是结构类型。可与程序中其他变量同名,代表不同对象,互不干扰。例:设计一个学生的情况登记表要求有学号、姓名、性别、年龄、家庭地址和三门课成绩三门课是语文、数学和英语structscore{floatchinese;floatmath;floatenglish;};注:structscore、structstudent是类型名,不占内存,不能存放具体数据只有定义了变量,系统才会给变量分配内存,才能往内存里存放数据structstudent{intnumber;charname[9];charsex;

intage;charaddress[30];

structscoreachie;};8.2结构体类型变量的定义、引用和初始化8.2.1结构体类型变量的定义1.先定义结构体类型,再定义结构体类型变量例:structstudentNa,Nb,Nc;2.定义结构体类型同时定义该结构体类型变量例:structstudent{intnumber;……

structscoreachie;}Na,Nb,Nc;3.

直接定义无结构名的结构体类型变量(少用)

例:struct

{intnumber;……

structscoreachie;}Na,Nb,Nc;8.2.2结构体变量的引用及初始化引用方式:结构体类型变量名.成员名例:Na.age=18;

scanf(“%d”,&Na.age);Total=Na.age+Nb.age+Nc.age;

strcpy(Na.address,”Zhongshanroad”);

scanf(“%s”,N);gets(N);

Nc=Na;

//C允许将一个结构变量直接赋值给另一个具有相同结构的结构变量

注:若成员本身又是结构体类型,则要用若干成员运算符一级级引用下去,直到最低的一级成员。例:

Na.achie.math=86.0;

scanf(“%f”,&Nc.achie.chinese);结构变量的初始化:(定义时赋初值,方法类似于数组初始化)例:structstudentNa={1001,”Zhangsan”,’M’,19,”Zhongshanroad”,78.0,67,90};【例8.1】对结构变量进行初始化,并输出各成员值。#include<stdio.h>structscore{floatchinese;floatmath;floatenglish;};structstudent{

intnumber;charname[9];charsex;

intage;charaddress[30];

structscoreachie;};main(){structstudentNa={10001,"wanli",'M',19,"zhongshanroad",78.0,67.0,90.0};

structstudentNb={10002,"lifang",'F',18,"huajinroad",80.0,77.0,86.0};

structstudentNc={10003,"huhai

li",'F',20,"beijinroad",58.0,68.0,93.0};printf("%d,%s,%c,%d,%s,%.1f,%.1f,%.1f\n",Na.number,N,Na.sex,

Na.age,Na.address,Na.achie.chinese,Na.achie.math,Na.achie.english);printf("%d,%s,%c,%d,%s,%.1f,%.1f,%.1f\n",Nb.number,N,Nb.sex,

Nb.age,Nb.address,Nb.achie.chinese,Nb.achie.math,Nb.achie.english);printf("%d,%s,%c,%d,%s,%.1f,%.1f,%.1f\n",Nc.number,N,Nc.sex,

Nc.age,Nc.address,Nc.achie.chinese,Nc.achie.math,Nc.achie.english);}8.3结构体数组结构体数组:每个数字元素都是一个结构体类型的数据1.定义结构体数组(类似于结构体变量的定义)三种方法:(1)先定义结构体类型,再定义结构体类型数组

struct

类型名数组名[常量表达式];

例:structstudentstu[45];(2)定义结构体类型同时定义该结构体类型数组例:structstudent{intnumber;……}stu[45];(3)

直接定义无结构名的结构体类型变量(少用)

例:struct

{intnumber;……}stu[45];2.结构体数组的初始化可将初值写在一对大括号:structstudentstu[]={…};也可采用分行初始化:structstudentstu[]={{…},{…},{…}};可以对数组全部或部分的元素赋初值例:structstudent{charname[20];longnumber;floatscore[4];};structstudentstu[4]={{“liping”,1,67,72,65},{“zhaoming”,2,77,73,80}.{…},{…}};

例:对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include<string.h>structperson{charname[20];

intcount;

}leader[3]={"Li",0,"Zhang",0,"Fun",0};main(){int

i,j;

char

leader-name[20];

for(i=1;i<=10;i++){scanf("%s",leader-name);

for(j=0;j<3;j++)

if(strcmp(leader-name,leader[j].name)==0)leader[j].count++;}

printf("\n");

for(i=0;i<3;i++)

printf("%5s:%d\n",leader[i].name,leader[i].count);}

输入:LiLiFunZhangZhangFunLiFunZhangLi结果:Li∶4Zhang∶3Fun∶3例:计算学生的平均成绩和不及格的人数struct

stu{intnum;char*name;charsex;floatscore;};main(){

student[5]={{101,”liping”,’m’,45},{102,”zhangping”,’m’,62.5},{103,”hefang”,’f’,92.5},{104,”chengling”,’f’,87},{105,”wangming”,’m’,58}}

inti,c=0;floatave,s=0;

for(i=0;i<5;i++){s+=

;if(

<60)c++}

ave=s/5;

printf(“average=%f\ncount=%d”,ave,c);}struct

stustudent[i].scorestudent[i].score【例8.2】设某组有4个人,填写如下的登记表,除姓名、学号外,还有三科成绩,编程实现对表格的计算,求解出每个人的三科平均成绩,求出四个学生的单科平均,并按平均成绩由高分到低分输出。#include<stdio.h>struct

stu{charname[20];longnumber;floatscore[4];};voidout_row(struct

stu

arr[],intn){floatrow[4]={0,0,0,0};

int

i,j;

for(i=0;i<4;i++){for(j=0;j<n;j++)

row[i]=row[i]+arr[j].score[i];

row[i]=row[i]/n;}printf("|%19c|",'');

for(i=0;i<4;i++)printf("%7.2f|",row[i]);

printf("\n----------------------------\n");}voidorder(struct

stu

arr[],intn){struct

stutemp;

int

i,j,x,y;

for(i=0;i<n-1;i++)

for(j=0;j<n-1-i;j++)if(arr[j].score[3]>arr[j+1].score[3]){temp=arr[j];

arr[j]=arr[j+1];arr[j+1]=temp;}}voidoutput(struct

stu

arr[],intn){

int

i,j;

printf("***********************TABLE************************\n");

printf("----------------------------------------------------\n");printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","mathema","physics","average");

printf("----------------------------------------------------\n");

for(i=0;i<n;i++){printf("|%10s|%8ld|",arr[i].name,arr[i].number);

for(j=0;j<4;j++)printf("%7.2f|",arr[i].score[j]);

printf("\n");

printf("---------------------------------------------------\n");}}voidaver(struct

stu

arr[

],intn){int

i,j;

for(i=0;i<n;i++){arr[i].score[3]=0;

for(j=0;j<3;j++)arr[i].score[3]+=arr[i].score[j];arr[i].score[3]/=3;}}main(){struct

stustud[4]={{"liping",1,67.0,72.0,65.0},{"yaoming",2,77.0,73.0,80.0},{"liudong",3,81.0,79.0,90.0},{"zhangwei",4,68.0,78.0,89.0}};floatrow[3];//去掉aver(stud,4)order(stud,4);output(stud,4);out_row(stud,4);}8.4结构体指针变量结构体变量的指针:结构体变量所占内存段的起始地址结构体指针变量:存放结构体变量的首地址----指向结构体变量也可指向结构体数组中的元素

8.4.1结构体指针变量的说明和使用1、定义:struct

结构体类型名*结构体指针变量名;

3种定义方法:例:①structstudent*p1,*p2;

structstudent{intnumber;……}*p1,*p2;③

struct

{intnumber;……}*p1,*p2;

2、赋值例:structstudent{intnumber;charname[9];charsex;

intage;charaddress[30];

structscoreachie;}Ny,stu[4],*p1,*p2;p1=&Ny;p2=stu;或p2=&stu[0];问:p1=&Ny.number?p1=(structstudent*)&Ny.number3、引用两种方式:①

(*结构体指针变量名).成员项名例:(*p1).age=19;即Ny.age=19;

(*p2).number=1001;即stu[0].number=1001;②结构体指针变量->成员项名例:p1->age=19;p2->number=1001;【例8.3】指向结构体变量的指针变量的使用。#include<stdio.h>voidmain(){structtest{int

i,j;charm,n;};

structtesta,b;

structtest*pa,*pb;pa=&a;

pb=&b;pa->i=pa->j=10;pa->m=pa->n='H';

printf("%d,%d,%c,%c\n",pa->i,pa->j,pa->m,pa->n);b=a;

printf("%d,%d,%c,%c\n",pb->i,pb->j,pb->m,pb->n);

printf("%d,%d,%c,%c\n",++pa->i,pa->j--,--pa->m,pa->n++);

printf("%d,%d,%c,%c\n",pb->i,pb->j,pb->m,pb->n);

pb=pa;

printf("%d,%d,%c,%c\n",++pa->i,pa->j--,--pa->m,pa->n++);

printf("%d,%d,%c,%c\n",pb->i,pb->j,pb->m,pb->n);}8.4.2结构体数组指针变量结构体数组名:结构体数组所占内存段的起址

指针变量

(可通过它使用数组元素)例:structstudentstu[4],*p;p=stu;即p=&stu[0];//指针p就指向了结构体数组stu对数组元素的引用可采用三种方法:1、地址法:&stu[i]stu+i

p+istu[i].name(stu+i)->name(p+i)->name2、指针法p=stu;使用p->name等p++3、指针的数组表示法p=stu;p[i]stu[i]则p[i].name

stu[i].name

【例8.4】指向结构体数组的指针变量的使用#include<stdio.h>structdata{intyear,month,day;};struct

stu{charname[20];longnum;

structdatabirthday;};voidmain(){inti;

struct

stu*p;

struct

stustudent[4]={{"zhouping",1,1983,7,2},{"wangling",2,1984,3,24},{"hubo",3,1982,5,16},{"huaqiang",4,1982,7,21}};p=student;printf("\n1----Outputname,number,year,month,day\n");

for(i=0;i<4;i++)printf("%16s%7ld%8d/%d/%d\n",(p+i)->name,(p+i)->num,

(p+i)->birthday.year,(p+i)->birthday.month,(p+i)->birthday.day);printf("\n2----Outputname,number,year,month,day\n");

for(i=0;i<4;i++,p++)printf("%16s%7ld%8d/%d/%d\n",p->name,p->num,

p->birthday.year,p->birthday.month,p->birthday.day);printf("\n3-----Outputname,number,year,month,day\n");

for(i=0;i<4;i++)printf("%16s%7ld%8d/%d/%d\n",(student+i)->name,(student+i)->num,

(student+i)->birthday.year,(student+i)->birthday.month,(student+i)->birthday.day);p=student;printf("\n4-----Outputname,number,year,month,day\n");

for(i=0;i<4;i++)printf("%16s%7ld%8d/%d/%d\n",p[i].name,p[i].num,

p[i].birthday.year,p[i].birthday.month,p[i].birthday.day);}8.4.3结构体指针变量作函数参数

实参形参

值传递结构体变量同类型变量的定义

&结构体变量地址传递结构体指针变量同类型结构体指针变量的定义结构体数组名例:structstudenta,stu[4],*p

p=&a;p=stu;实参:ap/&ap/stu

值拷贝地址传递形参:structstudentbstructstudent*ptr【例8.5】将例8.2改用结构体指针变量作函数参数实现。#include<stdio.h>struct

stu{charname[20];longnumber;floatscore[4];};voidaver(struct

stu*ptr,intn){int

i,j;

for(i=0;i<n;i++){(ptr+i)->score[3]=0;

for(j=0;j<3;j++)(ptr+i)->score[3]+=(ptr+i)->score[j];(ptr+i)->score[3]/=3;}}voidorder(struct

stu*ptr,intn){struct

stutemp;

int

i,j,x,y;

for(i=0;i<n-1;i++)

for(j=0;j<n-1-i;j++)if((ptr+j)->score[3]>(ptr+j+1)->score[3]){temp=*(ptr+j);*(ptr+j)=*(ptr+j+1);*(ptr+j+1)=temp;}}voidoutput(struct

stu*ptr,intn){int

i,j;

printf("*******************TABLE***********************\n");

printf("----------------------------------------------------\n");printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","mathema","physics","average");

printf("----------------------------------------------------\n"

for(i=0;i<n;i++){printf("|%10s|%8ld|",(ptr+i)->name,(ptr+i)->number);

for(j=0;j<4;j++)printf("%7.2f|",(ptr+i)->score[j]);

printf("\n");

printf("---------------------------------------------------\n");}}voidout_row(struct

stu*ptr,intn){floatrow[4]={0,0,0,0};

int

i,j;

for(i=0;i<4;i++){for(j=0;j<n;j++)

row[i]=row[i]+(ptr+j)->score[i];

row[i]=row[i]/n;}printf("|%19c|",'');

for(i=0;i<4;i++)

printf("%7.2f|",row[i]);

printf("\n----------------------------------------------------\n");}main(){struct

stustud[4]={{"liping",1,67.0,72.0,65.0},{"yaoming",2,77.0,73.0,80.0},{"liudong",3,81.0,79.0,90.0},{"zhangwei",4,68.0,78.0,89.0}};aver(stud,4);order(stud,4);output(stud,4);out_row(stud,4);}8.5链表8.5.1

链表的概述存储一批同类型但个数不确定的数据:①数组:静态分配内存方式即使用前需说明数组大小,所占内存空间连续需定义足够大-------浪费内存②

链表:动态分配内存的方式允许用户根据需要随时增减数据项数据项在内存中不必连续链表:结点:①数据域:存放用户需要的实际数据②指针域:存放下一个结点的地址

头指针:存放表中第一个结点的地址单链表示意图头指针head:指向链表中第一个结点链表的尾节点:由于无后续节点,其指针域为空,写作NULL链表中的各结点在内存的存储地址不是连续结点类型的定义:structnode{intnum;floatscore;

structnode*next;};1.malloc函数函数的原型声明为:void*malloc(unsigned

size);函数的功能:分配大小为size(最大65535)个字节的内存单元,成功返回所分配内存单元的首地址(void类型地址)失败时,则返回NULL(空)例:structnode*p1,*p2,*p3,*head,*p;p1=(structnode*)malloc(sizeof(structnode));p1->num=1;p1->score=67;p2……p3……p1->next=p2;p2->next=p3;p3->next=NULL;head=p1;p=headwhile(p!=NULL){printf(“%d:%f\n”,p->num,p->score);p=p->next;}2.calloc函数函数的原型声明:void*calloc(unsigned

n,unsignedsize);函数的功能:分配n个size大小的连续内存单元成功返回所分配内存单元的首地址(void类型地址)失败,返回NULL。例:为有10个的浮点型数据分配内存:float*p;…p=(float*)calloc(10,sizeof(float));3.free函数函数的原型声明为:voidfree(void*ptr);函数的功能:释放ptr指向的由calloc

或malloc分配的内存空间函数无返回值释放后的空间可以再次被使用例:free(p);对链表的操作主要有以下几种:(1)建立并初始化链表:从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。(2)索引操作:按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。(3)插入操作:在结点ki-1与ki之间插入一个新的结点k’,使线性表的长度增1,且ki-1与ki的逻辑关系发生如下变化:插入前,ki-1是ki的前驱,ki是ki-1的后继;插入后,新插入的结点k’成为ki-1的后继、ki的前驱,如图8-3所示。(4)删除操作:删除结点ki,使线性表的长度减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变化:删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1成为ki+1的前驱,ki+1成为ki-1的后继,如图8-4所示。8.5.2创建并输出单链表【例8.6】创建一个存放整数(输入-999做结束标志)的单链表,并打印输出。#include<stdlib.h>#include<stdio.h>structnode{ intnum;

structnode*next;};voidmain(){ structnode*create(); voidprint();

structnode*head; head=NULL; head=create(head); print(head);}structnode*create(structnode*head{ structnode*p1,*p2; p1=p2=(structnode*)malloc(sizeof(structnode)); scanf("%d",&p1->num); p1->next=NULL; while(p1->num!=-999) { if(head==NULL)head=p1; elsep2->next=p1; p2=p1; p1=(structnode*)malloc(sizeof(structnode)); scanf("%d",&p1->num);

p1->next=NULL; } returnhead;}voidprint(structnode*head){ structnode*temp; temp=head;

while(temp!=NULL) { printf("%6d",temp->num); temp=temp->next; }}

8.5.3单链表的删除和插入【例8.7】创建包含学号、姓名结点的单链表。其结点数任意个,表以学号为序,低学号的在前,高学号的在后,以输入姓名为空作结束。在此链表中,要求删除一个给定姓名的结点,并插入一个给定学号和姓名的结点。#include"stdlib.h"#include"malloc.h"structnode{ intnum; charstr[20];

structnode*next;};voidmain(){ structnode*create();

structnode*insert();

structnode*delet(); voidprint();

structnode*head; charstr[20];

intn; head=NULL; head=create(head);

print(head);

printf("\ninputinsertednum,name:\n");

gets(str); n=atoi(str);

gets(str); head=insert(head,str,n);

print(head);

printf("\ninputdeletedname:\n");

gets(str); head=delet(head,str);

print(head); }structnode*create(structnode*head){ chartemp[30];

structnode*p1,*p2; p1=p2=(structnode*)malloc(sizeof(structnode));

printf("input

num,name:\n");

printf("exit:doubletimesEnter!\n");

gets(temp); gets(p1->str); p1->num=atoi(temp); p1->next=NULL; while(strlen(p1->str)>0){ if(head==NULL)head=p1; elsep2->next=p1; p2=p1; p1=(structnode*)malloc(sizeof(structnode));

printf("input

num,name:\n");

printf("exit:doubletimesEnter!\n");

gets(temp); gets(p1->str); p1->num=atoi(temp); p1->next=NULL; } returnhead;}structnode*insert(structnode*head,char*pstr,intn){ structnode*p1,*p2,*p3; p1=(structnode*)malloc(sizeof(structnode)); strcpy(p1->str,pstr); p1->num=n; p2=head; if(head==NULL) {head=p1;p1->next=NULL;}else {while(n>p2->num&&p2->next!=NULL) {p3=p2;p2=p2->next;} if(n<=p2->num) if(head==p2) {head=p1;p1->next=p2;} else {p3->next=p1;p1->next=p2;}else {p2->next=p1;p1->next=NULL;} }

return(head);}structnode*delet(structnode*head,char*pstr){ structnode*temp,*p; temp=head; if(head==NULL)

printf("\nListisnull!\n"); else { temp=head;

while(strcmp(temp->str,pstr)!=0&&temp->next!=NULL)

{p=temp;temp=temp->next;}

if(strcmp(temp->str,pstr)==0) {if(temp==head){head=head->next;free(temp);}else{p->next=temp->next;

printf("delete

string:%s\n",temp->str);

free(temp);} } elseprintf("\nnofindstring!\n"); }

return(head);}voidprint(structnode*head){ structnode*temp; temp=head;

printf("\noutputstrings:\n");

while(temp!=NULL){ printf("\n%d----%s\n",temp->num,temp->str); temp=temp->next; }}8.6共用体、枚举和用户自定义类型8.6.1共用体类型共用体:不同数据类型的变量(成员)共占同一段内存1、定义类型形式:union共用体名

{类型成员1;类型成员2;

类型成员n;

};例:unionshare{inti;charc;floatf;};2、定义变量三种方式:①

unionsharev1,v2,v3;②

unionshare{inti;charc;floatf;}v1,v2,v3;③union{inti;charc;floatf;}v1,v2,v3;系统为v1、v2、v3各分配多少字节?注:①结构体变量所占字节数为各成员所占字节数之和②共用体变量所占字节数则是各成员中的最大长度也可以定义指向共用体变量的指针变量例:unionshare*p;

p=&v1;3、共用体变量的引用引用共用体变量成员的方式:①共用体变量名.成员名:v1.f②共用体指针名->成员名:p->f或(*p).f注意:①共用体变量中起作用的成员是最后一次存放的成员值例:v1.i=3;v1.c=‘a’;②共用体变量的地址和它的各成员的地址都是同一地址

p1=&v1等价于

p1=(unionshare*)&v1.iv1.cv1.f③不能对共用体变量赋值,也不能通过引用共用体变量名来得到其成员的值,也不能在定义共用体变量时对它进行初始化。④不能把共用体变量作为函数参数,也不能使函数返回共用体变量,但可以使用指向共用体变量的指针。【例8.8】上机运行该程序,并请分析得到的结果。

#include<stdio.h>unionshare{inti;

intj;floatf;}sh;voidmain(){sh.f=10.5;

sh.i=20;

sh.j=30;printf("%.1f,%d,%d\n",sh.f,sh.i,sh.j);

sh.f=1387.5;

sh.j=30;

sh.i=20;printf("%d,%d,%.1f\n",sh.i,sh.j,sh.f);

sh.j=200;

sh.i=20;

sh.f=1357.5;printf("%d,%d,%.1f\n",sh.i,sh.j,sh.f);}8.6.2枚举类型若变量只有几个可能的值-----可定义为枚举类型例:一个星期内有7天,一年有12月枚举:将变量的值一一列举出来变量的值仅限于列举出来的值的范围内------枚举变量枚举类型仍是一种基本数据类型1、定义枚举类型形式:enum

枚举类型名{枚举元素列表};例:enumweek{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

2、定义枚举类型变量的方法①先定义类型,再定义变量例:enumweekfirst,second;

②定义类型同时定义变量例:enum

week{Sun,Mon,Tue,Wed,Thu,Fri,Sat}first,second;

③定义类型省掉类型名同时定义变量(少用)

例:enum{Sun,Mon,Tue,Wed,Thu,Fri,Sat}first,second;常量,值不可变枚举变量的使用同普通变量,但其值只能是枚举常量例:first,second是二个enumweek类型的枚举变量,其值只能取sun---sat之一first=Wed;second=Fri;3、说明①C编译时,对枚举元素按常量处理-----枚举常量(值不可改变)系统给枚举常量按定义时的顺序编号:由0开始,从小到大自动取0~n-1整数值例:enumweek{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

Sun是0,Mon是1,…Sat是6;也可在定义枚举元素表时,指定各某些枚举元素的序号,其后元素的值将按顺序自动加一递增。例:enumweek{Sun=1,Mon,Tue,Wed=8,Thu,Fri,Sat};Sun是1,Mon是2,Tue是3,

Wed是8,Thu是9,Fri是10,Sat是11。若first=Wed;则first的值为8可用printf(“%d”,first);可不可直接first=8?②不能把一个整数直接赋给枚举变量例:first=Wed;√first=8;×

如果要用整型值赋必须通过强制类型转换:

first=(enumweek)8;√③枚举元素可用来判断比较比较的规则:按其在定义时的顺序号比较大小

例:if(first==Sat)printf(“双休日到了\n”);first>=second枚举变量可进行算术运算例:first++;first的值为Tue(在顺序号上加减)④枚举元素是常量,不是变量。不能在程序中用赋值语句再对它赋值。例:Mon=2;×【例8.9】口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中取出3个球,问得到3种不同色的球的可能取法,打印出每种组合的3种颜色。#include<stdio.h>voidmain(){enumcolor{red,yellow,blue,white,black}x,y,z,p;

intcount=0,i;

for(x=red;x<=black;x++)

for(y=red;y<=black;y++)

if(x!=y){for(z=red;z<=black;z++)

if(z!=x&&z!=y) {count++; printf("No.%-4d",count);

for(i=1;i<=3;i++) {switch(i) {case1:p=x;break; case2:p=y;break; case3:p=z;break; }

switch(p){casered:printf("%-10s","red");break; caseyellow:printf("%-10s","yellow");break; caseblue:printf("%-10s","blue");break; casewhite:printf("%-10s","white");break; caseblack:printf("%-10s","black");break; }}

printf("\n"); }}printf("\ntotal:%5d\n",count);}8.6.3用户自定义类型

在说明数据的类型时,可以使用基本类型、构造类型、指针类型和空类型等。但在用结构体、共用体、枚举类型等定义变量时比较麻烦。C语言:允许用户自己定义类型说明符即允许由用户为系统原有的数据类型换名字通过typedef给已经存在的系统类型或用户构造的类型重新命名1、格式:typedef

原类型名用户自定义类型名;例:①typedef

intINTEGER; INTEGERi,j=100; 等价于:inti,j=100②typedef

structstudentSTUDENT;STUDENTna,nb;等价于:structstudentna,nb;③typedeffloatARRAY[10]; ARRAYa,b; 等价于:floata[10],b[10];2、定义新类型名的方法①

先按定义变量的方法写出定义体②

将变量名换成新类型名③在最前面加typedef④用新类型名定义变量定义一个字符指针类型:①

char*s;②char*STRING;③Typedefchar*STRING;④STRING

str; 等价于:char*str;说明:①

typedef只可定义类型名,不可定义变量②typedef只是给已存在的类型增加一类型名,而没有创造新类型③

typedef与#define

相似:typedef

intCOUNT;#define

温馨提示

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

评论

0/150

提交评论