您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
058_结构体与共用体06_源代码
发布时间:2021-05-07 21:01:30编辑:雪饮阅读()
共用体的概念
使几个不同的变量共占同一段内存的结构称为 “共用体”类型的结构。
应用情况
设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中。
那么具体实现如:
#include <stdio.h>
struct
{
int num;
char name[10];
char sex;
char job;
union
{
int banji;
char position[10];
}category;
}person[3]; //为了方便先假设一个学生一个老师。
void main()
{
int i;
for(i=0; i < 3; i++)
{
printf("Please input the num: ");
scanf("%d", &person[i].num);
printf("Please input the name: ");
scanf("%s", person[i].name);
/*
個人理解:
你从键盘打一个字符,然后按个回车Enter,把输入的字符赋给c变量,这时候你是输入了两个字符的,一个事你打的字符,
另一个就是回车字符,打入的字符赋给了变量c,但回车字符还留在缓存区内,所以等到要输入下个字符的时候,不会让你输
入的,
直接把回车字符付给了c变量,加个getchar(),就是把缓存区里的回车字符拿走,可以让你输入下个字符。
你可以把
这里的getchar()换成fflush(stdin) 清除标准输入设备缓存 也可以的
這裏做了些簡單的測試,發現僅僅在char類型輸入前會有這個緩存,導致不會讓你輸入,直接進入下一個程序語句,例如這裏的:
printf("Please input the job(s/t): ");
官方解释:
fflush(stdin)是一个计算机专业术语,功能是清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);。
此函数仅适用于部分编译器(如VC6),但是并非所有编译器都要支持这个功能(如gcc3.2)。这是一个对C标准的扩充。
一些我比较认同的看法:
fflush(stdin)的前世今生
由Microsoft官方提供的MSDN 文档里也清楚地写着:fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充,注意啊,是Extension!)。
即C 标准中根本没有定义 fflush(stdin),最新的C 11直接删去了曾经打擦边球的fflush(stdin)。
这也就是fflush(stdin)曾经几乎对过一半的原因:fflush()确实也是扩展,这就是几乎对过的意思,在vs 2013之前的版本里,包括 vc++ 6.0 fflush(stdin)也确实管用。
现在即使在vs 2015环境下fflush(stdin)也不再起作用,遑论lunix系统下呢,这就是曾经对一半。
当然,如果毫不在乎程序的移植性,在可用 fflush(stdin)的版本里面这么写也没什么大问题。
*/
fflush(stdin);
printf("Please input the sex(M/F): ");
scanf("%c", &person[i].sex);
fflush(stdin);
printf("Please input the job(s/t): ");
scanf("%c", &person[i].job);
fflush(stdin);
//學生
if( person[i].job == 's' )
{
//班級
printf("Please input the class: ");
scanf("%d", &person[i].category.banji);
fflush(stdin);
}
//教師
else if( person[i].job == 't' )
{
//教师岗位,比如美术老师、数学老师等
printf("Please input the position: ");
scanf("%s", person[i].category.position);
fflush(stdin);
}
else
{
printf("Input Error!!\n");
}
printf("\n");
}
// 以下是打印数据……
printf("No. name sex job class/position\n");
for( i=0; i < 3; i++ )
{
if( person[i].job == 's')
{
printf("%-6d%-10s%-3c%-3c%10d\n", person[i].num,
person[i].name, person[i].sex, person[i].job,
person[i].category.banji);
}
else
{
printf("%-6d%-10s%-3c%-3c%10s\n", person[i].num,
person[i].name, person[i].sex, person[i].job,
person[i].category.position);
}
}
}
编译并运行效果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Please input the num: 1
Please input the name: a
Please input the sex(M/F): m
Please input the job(s/t): t
Please input the position: msls
Please input the num: 2
Please input the name: b
Please input the sex(M/F): m
Please input the job(s/t): t
Please input the position: syls
Please input the num: 3
Please input the name: c
Please input the sex(M/F): m
Please input the job(s/t): t
Please input the position: yyls
No. name sex job class/position
1 a m t msls
2 b m t syls
3 c m t yyls
枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。
例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。
如果把这些量说明为整型,字符型或其它类型显然是不妥当的。
为此,C语言提供了一种称为“枚举”的类型。
那么对于枚举类型严格的定义实际上是除了自定义枚举元素集中的任何元素以外是不能被赋值的。那么具体的实例如下:
#include <stdio.h>
void main()
{
enum weekday{sun, mon, tue, wed, thu, fri, sat}a, b, c;
a = 1; // a = 1;这样是不行的……(据说是在Turbo C中这样写是会报错的)
b = mon;
c = tue;
printf("%d, %d, %d", a, b, c);
printf("\n\n");
}
在gcc中编译并运行的结果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
1, 1, 2
枚举元素作为常量,它们是有值的
枚举元素作为常量,它们是有值的,C语言编译按定义时的顺序使它们的值为0,1,2…
实例如:
#include <stdio.h>
void main()
{
enum boy{Tom, Danny, Gan, LiLei}month[31], j;
int i;
j = Tom;
for( i=1; i <= 30; i++ )
{
month[i] = j;
j++;
if( j > LiLei )
{
j = Tom;
}
}
for( i=1; i <= 30; i++)
{
switch( month[i] )
{
//%4d:表示输出一个整型数值,输出宽度为4,且右对齐
case Tom: printf(" %4d %s\t", i, "Tom");
break;
case Danny: printf(" %4d %s\t", i, "Danny");
break;
case Gan: printf(" %4d %s\t", i, "Gan");
break;
case LiLei: printf(" %4d %s\t", i, "LiLei");
break;
default:
break;
}
if(i%4==0){
printf("\n");
}
}
printf("\n");
}
编译并运行结果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
1 Tom 2 Danny 3 Gan 4 LiLei
5 Tom 6 Danny 7 Gan 8 LiLei
9 Tom 10 Danny 11 Gan 12 LiLei
13 Tom 14 Danny 15 Gan 16 LiLei
17 Tom 18 Danny 19 Gan 20 LiLei
21 Tom 22 Danny 23 Gan 24 LiLei
25 Tom 26 Danny 27 Gan 28 LiLei
29 Tom 30 Danny
关键字词:共用体,枚举