第九章课后9

本文通过一个C++程序实例介绍了如何使用类、对象及静态成员变量来计算商品销售总额和平均销售额。该程序定义了一个名为store的类,包含非静态成员变量和静态成员变量,用于记录每种商品的数量、单价以及所有商品的销售总额和销售数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
using namespace std;
class store
{
public:
	store(int n,int q,double p)
	{
		num=n;
		quantity=q;
		price=p;
	}
	void total();
	static void display();
	static float average();
private:
	int num;
	int quantity;
	float price;
	static float sum;    //总售款
	static int n;       //总销售数
	static double discount;
};
void store::total()
{
	float rate=1.0;
	if(quantity>10)
		rate=0.98*rate;
	sum=sum+quantity*price*rate;
	n=n+quantity;
}
void store::display()
{
	cout<<sum<<endl;
	cout<<average()<<endl;
}
float store::average()
{
	return (sum/n);
}
double store::discount=0.05;
float store::sum=0;
int store::n=0;
int main()
{
	store s[3]={store(101,5,23.5),store(102,12,24.56),store(103,100,21.5)};
	for(int i=0;i<3;i++)
		s[i].total();
	store::display();
	return 0;
}

### 关于编译原理第九章课后题解析 #### 背景概述 编译原理第九章主要涉及 **运行时存储空间组织** 的相关内容,包括活动的概念、参数传递方式、活动记录定义及包含内容、静态链、动态链以及非局部名字访问的方式等内容[^3]。这些知识点通常会通过具体的例子和练习来加深理解。 --- #### 主要知识点回顾 1. **活动 (Activation)** 活动是指程序执行过程中函数调用的一个实例。每次函数被调用都会创建一个新的活动记录。活动记录包含了该次调用所需的信息,如返回地址、形参值、局部变量等。 2. **参数传递方式** 参数传递主要包括按值传递(Call by Value)、按引用传递(Call by Reference)、按名称传递(Call by Name)等方式。不同的传递方式会影响程序的行为和性能。 3. **活动记录的内容** 活动记录一般包括以下几个部分: - 返回地址 - 上一帧指针(用于支持嵌套调用) - 局部变量区 - 形参区 - 临时变量区 4. **静态链与动态链** - 静态链:用于解决嵌套作用域中的非局部变量访问问题。 - 动态链:用于跟踪当前活跃的活动记录栈。 5. **非局部名字访问** 访问非局部名字有两种常见方法:一种是通过静态链逐层查找;另一种是利用显示声明机制提前绑定非局部名字到具体位置。 --- #### 可能的课后题目类型及解答思路 以下是基于第九章核心知识点可能设计的一些典型课后题及其解题思路: ##### 类型 1: 设计活动记录并解释其组成部分 **题目示例**: 给定一段伪代码,要求为其设计一个完整的活动记录,并说明各字段的作用。 **解答思路**: - 明确给定代码中有哪些需要保存的数据项(如返回地址、局部变量、形参等)。 - 结合教材中关于活动记录的标准结构,逐一列出各个字段及其用途。 - 使用表格或图形表示活动记录的具体布局。 ```plaintext | 字段名 | 描述 | |--------------|--------------------------| | 返回地址 | 存储调用者下一条指令的位置 | | 上一帧指针 | 指向父活动记录 | | 局部变量区 | 存放本函数内的局部变量 | | 形参区 | 存放实际传入的参数 | | 临时变量区 | 存放计算过程中的中间结果 | ``` ##### 类型 2: 分析不同参数传递方式的影响 **题目示例**: 对同一段代码分别采用按值传递和按引用传递两种方式进行模拟执行,并比较两者的差异。 **解答思路**: - 构造测试数据,逐步模拟每种参数传递方式下的执行流程。 - 利用图表展示内存变化情况,突出两者的主要区别。 ```python def modify(x, y): x += 10 y = y * 2 return x, y a = 5 b = 3 result_call_by_value = modify(a, b) # 修改不影响原始变量 print(f"Call by value: a={a}, b={b}") # 输出原值不变 c = [5] d = [3] modify(c[0], d[0]) # 修改影响原始列表内容 print(f"Call by reference: c={c}, d={d}") ``` ##### 类型 3: 实现静态链或动态链的功能 **题目示例**: 编写一小段代码实现静态链功能,能够正确访问嵌套作用域中的非局部变量。 **解答思路**: - 定义一个简单的嵌套函数场景。 - 在内部函数中引入外部变量,并通过显式的静态链指向完成访问操作。 ```python class StaticLinkRecord: def __init__(self, static_link=None, local_vars={}): self.static_link = static_link self.local_vars = local_vars def outer(): record_outer = StaticLinkRecord(local_vars={&#39;x&#39;: 10}) def inner(): nonlocal record_outer record_inner = StaticLinkRecord(static_link=record_outer, local_vars={&#39;y&#39;: 20}) # Accessing the non-local variable &#39;x&#39; via static link print(record_inner.static_link.local_vars[&#39;x&#39;]) inner() outer() ``` --- #### 总结 以上是对编译原理第九章课后题相关资料及答案的部分探讨。由于具体题目未提供,仅列举了几类常见的习题形式及其解决方案供参考。如果需要更详细的解析或者特定类型的题目讲解,请进一步明确需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值