Board logo

标题: 共同体以及枚举类型 C语言 [打印本页]

作者: 电子工匠    时间: 2011-2-11 09:00     标题: 共同体以及枚举类型 C语言

共同体以及枚举类型 C语言

§10.8 共用体

一、共用体的概念
当需要把不同类型的变量存放到同一段内存单元,或对同一段内存单元的数据按不同类型处理,则需要使用“共用体”数据结构。
例、把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。
共用体的定义形式:
     union 共用体名
     {
       成员列表;
      }变量列表;
例、
union data
{
 int i;
 char ch;
 float f;
}


注意区分:
“共用体”:各成员占相同的起始地址,所占内存长度等于最长的成员所占内存。
“结构体”:各成员占不同的地址,所占内存长度等于全部成员所占内存之和。
二、共用体变量的引用
只能引用共用体变量的成员,如、
  union data a;
  a.i;
  a.ch;
  a.f;
三、共用体类型数据的特点
1、共用体变量中的值是最后一次存放的成员的值,如、
    a.i = 1;
    a.ch = 'a';
    a.f = 1.5;
完成以上三个赋值语句后,共用体边量的值是1.5,而a.i=1a.ch='a'已无意义。
2、共用体变量不能初始化,例、
    union data
    {
     int i;
     char ch;
     float f;
    }a={1,'a', 1.5};
[10.11] 设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务。如图、
   
要求输入人员数据,然后输出。
分析:学生数据的class(班级)和教师数据的position(职务)类型不同,但在同一表格中,使用“共用体”数据结构。
struct
{
 int num;
 char name[10];
 char sex;
 char job;
 union
  {
   int class; /* 班级 */
   char position[10]; /* 职务 */
  }category;
}person[2]; /* 2个人员数据 */
void main()
{
 int i;
 for(i=0;i<2;i++) /* 输入2个人员的数据 */
 {
  scanf("%d %s %c %c", &person.num, &person.name,
              &person.sex, &person.job);
  if(person.job == 'S') /* 学生 */
   scanf("%d", &person.category.class); /* 输入班级 */
  else if(person.job == 'T') /* 教师 */
   scanf("%s", person.category.position); /* 输入职务 */
  else
   printf("Input error!");
 }
 printf("\n");
 printf("No. name sex job class/position\n");
 for(i=0;i<2;i++) /* 输出 */
 {
  if (person.job == 'S')
   printf("%-6d%-10s%-3c%-3c%-6d\n",person.num, person.name,
       person.sex, person.job, person.category.class);
  else
   printf("%-6d%-10s%-3c%-3c%-6s\n",person.num, person.name,
       person.sex, person.job, person.category.position);

 }
}
 

 

§10.9 枚举类型

如果一个变量只有几种可能的值,可以定义为枚举类型。
“枚举”:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。
用关键字enum定义枚举类型:例、
  enum weekday {sun, mon, tue, wed, thu, fri, sat};
weekday是枚举类型名,可以用于定义变量,如、
  enum weekday workday, week_end;
定义了两个枚举变量:workday,week_end, 它们只能取sunsat之一,如、
   weekday = mon;
   week_end = sun;
sunmon....sat称为“枚举元素”或“枚举常量”。
说明:
1、枚举元素是常量。在C编译器中,按定义的顺序取值012...
  例、
  weekday = mon;
  printf("%d", weekday); 输出整数1
2、枚举元素是常量,不是变量,因此不能赋值。
  sun = 0; mon = 1;
  但在定义枚举类型时,可以指定枚举常量的值,如、
  enum weekday {sun=7, mon=1, tue, wed, thu, fri, sat};
  此时,tuewed...的值从mon的值顺序加1。如,tue=2
3、枚举值可以作判断,例、
  if (weekday == mon)....
  if (weekday > sun)....
4、整型与枚举类型是不同的数据类型,不能直接赋值,如、
    workday = 2; /* workday是枚举类型 */
 但可以通过强制类型转换赋值,如、
    workday = (enum weekday)2;
[10.12] 口袋里有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出三个球,打印出三种不同颜色球的可能取法。
分析:球的颜色只可能取五种值,用枚举类型变量处理。
#i nclude "stdio.h"
void main()
{
 enum color {red, yellow, blue, white, black}; /* 枚举类型 */
 enum color i,j,k,pri;
 int n,loop;
 n = 0; /* 不同颜色的组合序号 */
 for(i=red; i<=black; i++)
 for(j=red; j<=black; j++)
  if (i != j)
  {
   for(k=red; k<=black; k++)
    if ((k != i) && (k != j))
     {
      n = n + 1;
      printf("%-4d",n); /* 组合序号 */
      for(loop = 1;loop<=3; loop++) /* 循环输出三个球的颜色 */
      {
       switch(loop)
       {
        case 1: pri = i; break; /* 1个球 */
        case 2: pri = j; break; /* 2个球 */
        case 3: pri = k; break; /* 3个球 */
        default: break;
       }
       switch(pri)
       {
        case red:   printf("%-10s","red"); break;
        case yellow: printf("%-10s","yellow"); break;
        case blue:  printf("%-10s","blue"); break;
        case white:  printf("%-10s","white"); break;
        case black:  printf("%-10s","black"); break;
        default:    break;
       }
      }
      printf("\n");
     }
  }
 printf("\n total:%5d\n", n);






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0