共用體類型,枚舉類型的使用

在進行某些算法的C語言編程的時候,需要使幾種不同類型的變量存放到同一段內存單元中。也就是使用覆蓋技術,幾個變量互相覆蓋。這種幾個不同的變量共同佔用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體。注:在某些書籍中可能稱之爲“聯合體”,但是“共用體”更能反映該類型在內存的特點。

一般定義形式

  union 共用體名

  { 

       成員表列  

       }變量表列;

1.同一個內存段可以用來存放幾種不同類型的成員,但是在每一瞬間只能存放其中的一種,而不是同時存放幾種。換句話說,每一瞬間只有一個成員起作用,其他的成員不起作用,即不是同時都在存在和起作用。 

2.共用體變量中起作用的成員是最後一次存放的成員,在存入一個新成員後,原有成員就失去作用。  

3.共用體變量的地址和它的各成員的地址都是同一地址。  

4.不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,並且,不能在定義共用體變量時對它進行初始化。  

5.不能把共用體變量作爲函數參數,也不能是函數帶回共用體變量,但可以使用指向共用體變量的指針。  

6.共用體類型可以出現在結構體類型的定義中,也可以定義共用體數組。反之,結構體也可以出現在共用體類型的定義中,數組也可以作爲共用體的成員。

書上例題:

//對候選人得票的統計程序,設有3個候選人,每次輸入一個得票的候選人的名字,要求輸出個人得票的結果
#include<stdio.h>
#include<string.h>
struct person
{
	char name[20];
	int count;
}leader[3]={{"Li",0},{"Wang",0},{"Ma",0}};

void main()
{
	int i,j;
	char leader_name[20];
	for(i=0;i<10;i++)
	{
		scanf("%s",&leader_name);
	for(j=0;j<3;j++)
		if(strcmp(leader_name,leader[j].name)==0)
			leader[j].count++;
	}
	for(j=0;j<3;j++)
		printf("%s:%d\n",leader[j].name,leader[j].count);
}


#include<stdio.h>
struct 
{
	int num;
	char name[20];
	char sex;
	char job;
	union 
	{
		int banji;
		char position[10];
	}category;
}person[2];

void main()
{
	int i;
	for(i=0;i<2;i++)
	{
		scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);
		if(person[i].job=='s')
			scanf("%d",&person[i].category.banji);
		else if(person[i].job=='t')
			scanf("%s",&person[i].category.position);
		else  printf("error!");
	}
	printf("\n");
	printf("No     Name  sex  job  class/position\n");
	for(i=0;i<2;i++)
		if(person[i].job=='s')
			printf("%d %s %c %c %d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.banji);
		else
		{
			printf("%d %s %c %c %s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
		}

}

枚舉在C/C++中,是一個被命名的整型常數的集合, 枚舉在日常生活中很常見。   

例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,   SATURDAY, 就是一個枚舉。   

枚舉的說明與結構和聯合相似, 其形式爲:  

 enum 枚舉名

    {  

    標識符[=整型常數],  

    標識符[=整型常數],

  ...   

      標識符[=整型常數]  

    } 枚舉變量;

書上例題

#include<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("-4f",n);
						for(loop=1;loop<=3;loop++)
						{
							switch (loop)
							{
							      case 1:pri=i;break;
							      case 2:pri=j;break;
								  case 3:pri=k;break;
								  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("\nTotal:%5d\n",n);

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章