第10章--结构和联合

1、当你拨打一个长途电话的时候,电话公司所保存的信息包括你拨打电话的时间和日期。它还包括三个号码,你使用的那个号码,你呼叫的那个号码,以及你付账的那个号码,这些号码的每一个都由三个部分组成:区号,交换台和站号码,请为这些记帐信息编写一个结构声明。

void main()
{
	struct telephone {
		int area;
		int exchange;
		int number;
	};

	struct infomation {
		int year;
		int month;
		int day;
		int time;
		struct telephone use_phone;
		struct telephone call_phone;
		struct telephone pay_phone;
	};

	struct infomation info;
}

2、为一个信息系统编写一个声明,它用于记录每个汽车零售商的销售情况。每份销售记录必须包括下列数据。字符串值的最大长度不包括其结尾的NUL字节。

销售记录声明类型
customer’s namestring(20)
customer’s addressstring (40)
modelstring (20)

销售时可能出现三种不同类型的交易:全额现金销售,贷款销售和租赁。对于全额现金销售,你还必须保存下面这些附加信息:

附加信息声明类型
manufacturer’s suggested retail pricefloat
actual selling pricefloat
sales taxfloat
licensing feefloat

对于租赁,你必须保存下面这些附件信息:

附加信息声明类型
manufacturer’s suggested retail pricefloat
actual selling pricefloat
down paymentfloat
security depositfloat
monthly paymentfloat
lease termint

对于贷款销售,你必须保存下面这些附件信息:

附加信息声明类型
manufacturer’s suggested retail pricefloat
actual selling pricefloat
sales taxfloat
licensing feefloat
down paymentfloat
loan durationint
interest ratefloat
monthly paymentfloat
name of bankstring(20)
void main()
{
	struct fullsale {
		float retail_price;
		float selling_price;
		float sales_tax;
		float lisence_fee;
	};

	struct leasesale {
		float retail_price;
		float selling_price;
		float down_payment;
		float deposit;
		float month_payment;
		int lease_term;
	};

	struct loansale {
		float retail_price;
		float selling_price;
		float sales_tax;
		float lisence_fee;
		float down_payment;
		int loan_term;
		float loan_rate;
		float month_payment;
		char bank_name[20];
	};
	
	union typeinfo {
		struct fullsale full;
		struct leasesale lease;
		struct loansale loan;
	};

	struct saleinfo {
		char customer_name[20];
		char customer_address[40];
		char model[20];
		enum {FULL_SALE, LEASE_SALE, LOAN_SALE} type;
		union typeinfo info;
	};

	struct saleinfo sale;
}

3、计算机的任务之一就是对程序的指令进行解码,确定采取何种操作。在许多机器中,由于不同的指令具有不同的格式,解码过程被复杂化了,在某个特定的机器上,每个指令的长度都是16位,并实现了下列各种不同的指令格式。位是从右向左进行标记的。
你的任务是编写一个声明,允许程序用这些格式中的任何一种形式对指令进行解释。你的声明同时必须有一个名叫addr的unsigned short类型字段,可以访问所有的16位值,在你的声明中使用typedef来创建一个新类型,称为machine_inst。给定下面的声明:
machine_inst x;
下面的表达式应该访问它所指定的位

ExpressionBits
x.addr0-15
x.misc.opcode0-15
x.branch.opcode8-15
x.sgl_op.dst_mode3-5
x.reg_src.src_reg6-8
x.dbl_op.opcode12-15
typedef union {
	unsigned short addr;
	struct {
		unsigned short dst_reg : 3;
		unsigned short dst_mode : 3;
		unsigned short opcode : 10;
	} sgl_op;
	struct {
		unsigned short dst_reg : 3;
		unsigned short dst_mode : 3;
		unsigned short src_reg : 3;
		unsigned short src_mode : 3;
		unsigned short opcode : 4;
	} dpl_op;
	struct {
		unsigned short offset : 8;
		unsigned short opcode : 8;
	} branch;
	struct {
		unsigned short dst_reg : 3;
		unsigned short dst_mode : 3;
		unsigned short src_reg : 3;
		unsigned short opcode : 7;		
	} rag_src;
	struct {
		unsigned short opcode : 16;
	} misc;
} machine_inst;


void main()
{
	machine_inst machine;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值