class Mixture//混合物类 { Pure_substance *ps;//用于建立堆区数组,保存各组成物质 int num;//包含组成的种类数目 class Pure_substance//纯物质类 { string name;//物质名称 string formula;//化学式 double weight;//化学式量 double quality;//质量 void Mixture::Append(Pure_substance & x)//添加纯物质对象x {/*在此补充本段代码,如果x是一种新成分,就扩大堆区数组,加入新组成物质,并变更组成的种类数目;否则只需要更变原组成物质的质量。15分*/ }
时间: 2023-08-11 08:03:21 浏览: 35
ps[num] = x; //将新的纯物质对象添加到堆区数组中
bool flag = false; //标记是否为新的成分
for(int i=0; i<num; i++) {
if(ps[i].name == x.name) { //如果已经存在该成分
ps[i].quality += x.quality; //更新原有的成分质量
flag = true;
break;
}
}
if(!flag) { //如果是新的成分
num++; //增加成分数目
}
相关问题
void Mixture::Append(Pure_substance& x)//添加纯物质对象x {/*在此补充本段代码,如果x是一种新成分,就扩大堆区数组,加入新组成物质,并变更组成的种类数目;否则只需要更变原组成物质的质量。15分*/ int i, n = Find(x); if (n == -1) { Pure_substance* p = new Pure_substance[num + 1]; for (i = 0; i < num; i++) p[i] = ps[i]; p[i] = x; if (ps) delete[]ps; ps = p; num++; } else { ps[n].quality += x.quality; } }请检查这段代码哪里有问题
这段代码没有显著的问题,但是有一些可以改进的地方:
1. 在 `for` 循环中,可以使用 `memcpy` 函数来复制数组,而不是使用循环逐一复制。这样可以提高效率。
2. 在 `if (ps) delete[]ps;` 语句中,应该先判断 `ps` 是否为 `NULL`,否则可能会造成程序崩溃。
改进后的代码如下:
```
void Mixture::Append(Pure_substance& x) {
int i, n = Find(x);
if (n == -1) {
Pure_substance* p = new Pure_substance[num + 1];
if (ps) {
// 使用 memcpy 函数复制数组
memcpy(p, ps, num * sizeof(Pure_substance));
delete[] ps;
}
p[num] = x;
ps = p;
num++;
}
else {
ps[n].quality += x.quality;
}
}
```
class Pure_substance//纯物质类 string name;//物质名称 string formula;//化学式 double weight;//化学式量 double quality;//质量 int Mixture::Find(Pure_substance& x)//查询在堆数组中是否包含纯物质对象xi//在此补充本段代码,查询在堆数组中是否包含纯物质对象 ,如果包含 X,返回该物质所在堆区数组中的下标,否则返回-1.
int Mixture::Find(Pure_substance& x) {
for (int i = 0; i < size; ++i) {
if (*heap[i] == x) {
return i;
}
}
return -1;
}
在这段代码中,使用了一次运算符重载,即重载了 == 运算符,用于比较两个 Pure_substance 对象是否相等。这里假设已经对 == 运算符进行了重载。在函数中,遍历了堆数组,如果找到了与 x 相等的 Pure_substance 对象,则返回该对象在堆区数组中的下标,否则返回 -1。