C语言程序设计其他数据类型_第1页
C语言程序设计其他数据类型_第2页
C语言程序设计其他数据类型_第3页
C语言程序设计其他数据类型_第4页
C语言程序设计其他数据类型_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C语言程序设计其他数据类型2.定义枚举变量

enum类型名变量名1,变量名2,…;

enumcolorselect,change,*cp;对枚举变量的定义还可采用缺省类型名的形式。

enum{pen,pencil,book,notebook}learning;也可定义一个枚举类型的数组,例如:enummonth{January,February,March,April,May,June,July,

Augest,September,October,November,December};enummonthmonths[12];第1页/共38页 3.枚举变量的取值 ①枚举变量的取值范围限定在对应的枚举符表中的元素。例如,select和change只能被赋值为color中的五种颜色名的某一种:

select=red;

change=yellow;第2页/共38页 C编译对枚举元素实际上是作为整常量处理的,所以枚举元素又称为枚举常量。当遇到枚举符表时,编译程序就把其中第一个元素赋值为0,以后依次把1,2,3…赋值给第二个元素、第三个元素、第四个元素……。

select=red

中,select被赋值0,并非将字符串“red”赋给select。 应注意,枚举元素不是变量,不能对它们赋值,也不能用“&”运算符取其地址。第3页/共38页 ②可以把某个枚举元素规定为指定的整常数。

enumcolor{red,green,blue=5,yellow,white}; 编译程序对blue之前的枚举元素照常从0开始、递增赋予整常数,并对blue赋予指定值5,而blue之后的各枚举元素则在此基础上递增赋值。 ③当变量取值范围限制在规定的整常数范围内的情况下,就可采用枚举类型。枚举变量的作用域与一般变量的作用域相同。第4页/共38页

例9-2:这是一个儿童游戏程序。孩子们用不同的手势表示三种不同的对象,如伸开手掌象征“布”(cloth,用字符c表示),握成拳头象征“锤子”(hammer,用字符h表示),只伸出食指和中指象征“剪刀”(scissors,用字符s表示)。其胜负规则是“布包锤子,锤子砸剪刀,剪刀剪布”。如手势相同则不分胜负。第5页/共38页#include<stdio.h>#include<stdlib.h>enumgames{cloth,hammer,scissors,game,quit};enumgamesselect();enumgamesmach();intwon(enumgamesplayer,enumgamesmachine);voidresult(intwin,intlose,inttie);第6页/共38页voidmain(){enumgamesplayer,machine;

intwin,lose,tie;

win=lose=tie=0;

printf("\n%s\n%s\n%s\n%s\n%s","cisforcloth",

"hisforhammer","sisforscissors",

"gisforresult","anothercharacterisforquit");第7页/共38页while((player=select())!=quit)switch(player){casecloth:

casehammer:

casescissors:

machine=mach();

if(player==machine){

++tie;

printf("\natie");

}第8页/共38页elseif(won(player,machine)){

++win;

printf("\nyouwon");

}else{

++lose;

printf("\nIwon");

}break;

casegame:

result(win,lose,tie);

break;

}第9页/共38页result(win,lose,tie);

printf("\nBYE!\n");}enumgamesselect(){charc;

enumgamesplayer;

printf("\nInputacharacter:");

while((c=getchar())==''||c=='\n'||c=='\t');

第10页/共38页switch(c){case'c':player=cloth;

break;

case'h':player=hammer;

break;

case's':player=scissors;

break;

case'g':player=game;

break;

default:player=quit;

break;

}return(player);}第11页/共38页enumgamesmach(){staticinti=0;

i=rand()%3;

return((i==0)?cloth:((i==1)?hammer:scissors));}第12页/共38页intwon(enumgamesplayer,enumgamesmachine){intvictory;

if(player==cloth)victory=machine==hammer;

elseif(player==hammer)victory=machine==scissors;

elsevictory=machine==cloth;

return(victory);}第13页/共38页voidresult(intwin,intlose,inttie){printf("\nGAMESTATUS");

printf("\n%-7d%s\n%-7d%s\n%-7d%s\n%-7d%s",win,"gameswonbyyou",

lose,"gameswonbyme",tie,"gamestied",

win+lose+tie,"gamesplayed");}第14页/共38页9.2位段9.2.1字位标志法 有些对象的特征不必用一个字节或多个字节来表示,只用一个或几个二进制位即可。#defineERROR0100000(八进制,下同)#defineCTLRDY0200#defineIENABLE0100#defineREAD04#defineWRITE02#defineRESET01第15页/共38页

利用第3章介绍过的位运算符(如~、^、&、|、>>、<<等)可置上或清除相应的标志,进而判断磁盘机当前的工作状态。

flags|=CTLRDY|IENABLE;第16页/共38页9.2.2位段的定义及其引用 位段是结构或联合中的成员,它们所占存储空间的大小是以二进制位为单位(故称位段)、并且在定义时所占位数被明确指定。例如:

structstatus{unsignederr:2;

unsignedready:1;

unsignedienable:1;

intflag:4;

};第17页/共38页

位段结构类型的一般定义形式是:

struct结构名{

类型位段名1:位数1;类型位段名2:位数2;

……}; “结构名”是标志结构类型的名称;位段名是位段的名称,即标识结构成员的标识符;在位段名后面有一个冒号“:”,冒号后面是表示该位段所占位数的数字。第18页/共38页

对位段的引用方式类似于对结构成员的引用方式。

structex{intx:5;

unsignedk:7;

unsignedm:6;

}tag,*

p;

p=&tag;

tag.x=10;表示将10赋予位段x。

tag.m=tag.k;表示将位段k的值赋予位段m。

p->k=7;表示将数值7赋予p所指向结构变量(即tag)中的位段k。 在执行赋值语句时应注意位段所允许的最大值的范围。第19页/共38页

各位段的类型可以是int、unsignedint或者signedint。 位段可以存放在任何可寻址的存储单元中,要求这个存储单元足以容纳这个位段。如果在一个存储单元中已存放了某个位段,还剩余一部分空间,并且剩余的空间能够容纳该结构中下面紧随的一个位段,那么后者也放入该存储单元中,它们的二进制位是邻接的。好象是把这些位段“打包”,一起放入某个存储单元。如果剩余的空间不足以容纳后随的位段,那么就有两种可能的处理方式:使剩余的那部分空间空闲着,把后随的位段放入下一个存储单元中;或者紧接着存放后随的位段,超出的部分就放入邻接的存储单元中。第20页/共38页

例9-3:下面的程序显示含有位段的结构变量所占用的字节数量,以及结构变量在内存中的地址分配情况。#include<stdio.h>voidmain(){struct{unsignedi:2;

unsignedj:3;

unsignedk:2;

unsignedl:4;

intq:13;

}a;第21页/共38页struct{intm:5;

intn;

into:2;

}b;

printf("%d***%d\n",sizeof(a),sizeof(b));

printf("%lu###%lu\n",(unsignedlong)&a,(unsignedlong)&b);

printf("\n%d###%d\n",sizeof(b),sizeof(b.n));

printf("%lu***%lu\n",(unsignedlong)&b,(unsignedlong)&b.n);}第22页/共38页第23页/共38页第24页/共38页

存在一种无名位段,它没有标识符,只有“:”和其后表示位数的整常数。无名位段占据指定的二进制位,但不能被访问,主要用来填充空间,以满足某种数据类型的格式要求。

structword{unsignedis_keyword:1;

unsigned:8;

unsignedis_extern:1;

unsigned:5;

unsignedis_static:1;

}flags;第25页/共38页例9-4:显示无名位段和长度为0的位段的性质。#include<stdio.h>voidmain(){struct{unsignedi∶1;

unsigned∶5;

unsignedj∶3;

unsigned∶6;

unsignedk∶1;

}a;第26页/共38页struct{intx∶2;

unsignedy∶1;

unsigned∶0;

unsignedz∶1;

intw∶2;

}b;第27页/共38页struct{intx∶2;

unsignedy∶1;

unsigned∶2;

unsignedz∶1;

intw∶2;

}c;

printf("%d***%d***%d\n",sizeof(a),sizeof(b),sizeof(c));

printf("%lu###%lu###%lu\n",(unsignedlong)&a,(unsignedlong)&b,(unsignedlong)&c);}第28页/共38页在我们的机器上,运行结果示例如下所示:2***2***1398000116###398000114###398000112第29页/共38页

在定义和使用位段时,还应注意以下几点: ①定义位段时,位段的长度不能大于整字的长度。 ②位段不能构成数组,不能对它使用&运算符,也就不能用指针变量指向位段。 ③可以在算术表达式中使用位段,系统会自动把它们转换成整型量。 ④在计算含有位段的结构占用存储空间的大小时,一般不能简单地把各成员的位数相加,要使用运算符sizeof,它给出运算分量所占空间的字节数。

sizeof(structx)第30页/共38页9.3用typedef定义类型别名

在C语言中使用typedef定义新的类型名来代替原有的类型名。

typedefintVALUE;

typedef语句的一般形式是:

typedef原类型名新类型名;

typedefstructnode{structnode*n[2];

charcolor[10];

}NODE;第31页/共38页

例9-5:写出实现动态存储分配和释放的函数。这包括三个函数:make_avail(num)负责分配num个结点(即结构类型NODE)所需要的空间,并把它们拉成链;new(ndr)负责从链头摘取一个可用结点,并用ndr指向这个结点;free(ndr)负责释放ndr所指向的结点,并将它重新加入到可用链中。第32页/共38页#include<stdlib.h>#defineNULL0typedefstructnode{structnode*n[2];

charcolor[10];}NODE;typedefNODE*NODE_REF;typedefunionexnode{NODEnd;

unionexnode*link;}EXTNODE;staticEXTNODE*next_avail;第33页/共38页voidmake_avail(intnum)/*makespaceavailablefornumNODES*/{intk;

温馨提示

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

评论

0/150

提交评论