《嗨翻C语言》随书练习四 5章 结构、联合与位字段
编辑时间:2017-03-26 作者:金满斗 浏览量:2076 来源:原创

简单的结构体定义及练习

/* 《嗨翻C语言》随书练习 5章 结构   2016-12-04
	xiousheng@126.com 
*/ 
#include <stdio.h>
 
//定义简单的结构体
struct turtle{
	const char *name;
	const char *species;
	int age;
} ;
 
void happy_birthday(turtle t){
	t.age += 1;
	printf("Happy Birthday %s!You are now %i years old!\r\n",t.name,t.age); 
} ;
//结构体传参是用的复制数据,要改变结构体数据必须传指针 
void happy_birthday1(turtle *t){
	(*t).age += 1;
	printf("Happy Birthday %s!You are now %i years old!\r\n",(*t).name,(*t).age);    //注意t->age 就是(.t).age ,是为了好看 
} ;
 
//保险箱窃贼 要组合得到字符串"GOLD" 
//结构体重命名 
typedef  struct{
	const char *description;
	float value;
} swag;
 
typedef  struct{
	swag *pswag;
	const char *sequence;
} combination;
 
 
typedef  struct{
	combination numbers;
	const char *make;
}  safe;
 
//保险箱窃贼例子函数实现 
int  baoxian(){
	swag gold = {"GOLD",10000000.0};
	combination numbers = {&gold,"6502"}; 
	safe s = {numbers,"RAMACO250"};
	printf("密码description是%s\r\n",s.numbers.pswag-> description);     
	return 0;
} 
 
int main(){
	turtle myrtle = {"Myrtle","Leatherback sea turtle" ,99};
	//结构体传参是用的复制数据 
	happy_birthday(myrtle);
	printf("%ss age is now %i\n",myrtle.name,myrtle.age);
	//看上面代码并没有改变结构体的数据 
	
	//必须传指针才行 
	happy_birthday1(&myrtle);
	printf("%ss age is now %i\n",myrtle.name,myrtle.age);
	baoxian();
	
	return 0;
 
}

联合体

/* 《嗨翻C语言》随书练习 5章 联合   2016-12-04
    xiousheng@126.com 
    联合体应用场景,比如记录多个单位的数值,而单位是不定的,如斤,两等 
*/ 
#include <stdio.h>
 
//定义简单的联合体
//union 是定义联合体的关键字 
typedef union{
    short count;
    float weight;
    float volume;
} quantity;
 
//联合体赋值,注意用{}默认的是表示第一个联合体字段的只
//其余的用.名字 = 值 的表示法。
//注意,联合体只能保存一条数据 
 
 
 
//联合一般和结构一起用
typedef struct{
    const char *name;
    const char *country;
    quantity amount;
} fruit_order;
 
 
//创建枚举记录联合体里保存的值
 
 
//定义枚举,enum为枚举关键字 ,枚举型用逗号分隔数据 
typedef enum{
    COUNT,POUNDS,PINTS
} unit_of_measure;  
 
typedef union {    //定义联合体 
    short count;
    float weight;
    float volume ;
} woquantity;
 
typedef struct{
    const char *name;
    const char *country;
    woquantity amount;
    unit_of_measure units;
}fruit_order1;
 
void display(fruit_order1 order){
    printf("This order contains\r\n");
    if(order.units == PINTS){
        printf("%2.2f pints of %s\r\n",order.amount.volume,order.name);
        
    }else if(order.units == POUNDS){
        printf("%2.2f lbs of %s\r\n",order.amount.weight,order.name);
        
    }else{
        printf("%i %s\r\n",order.amount.count,order.name);
    }
        
} 
 
int main(){
    //联合例子 
    //fruit_order apples = {"apples","England", .amount.weight = 4.2};    //书上是这样定义的,但我的编译器不支持,改成下面的
    fruit_order apples = {"apples","England"}; 
    apples.amount.weight = 4.2 ;
    printf("This order contains %0.2f 1bs of %s\r\n",apples.amount.weight,apples.name); 
    
    //枚举例子
    //fruit_order1 apples1 = {"apples","England",.amount.count = 144,COUNT};   //问题处在 .amount.count = 144,我编译器不支持,如何改写 
    /*下面的结构体是在c++环境下不能编译的定义试验,能通过*/
    fruit_order1 apples1;
    apples1.name = "apples" ;
    apples1.country = "England" ;
    apples1.amount.count = 144;
    apples1.units = COUNT ;
    
    //继续正常定义模式
    
    fruit_order1 mylist = {"mylist","ni de ",.amount.weight = 17.6,POUNDS}; 
    fruit_order1 mylist2 = {"mylist2","ni de 2",.amount.volume = 12.6,PINTS}; 
    
    display(apples1);   
    display(mylist);
    display(mylist2);
    
    return 0;
}

1.jpg

知识点

2.jpg


来说两句吧