← 返回独立题面

MIDPOINT / REVIEW AFTER SUBMISSION

评分看行为、对象关系和真实证据。

先保留首次预测、找错说明、源码与运行结果,再使用这一页。教师参考实现只是教材资产;读懂或跑通它,不是你的独立程序验收。

检查窗口内自己根据诊断修正代码,仍可按独立调试记录。读过本页才改正的关键概念,记为“已理解反馈,待等价复测”,不能回填成初次已经掌握。评分后的补学和复测耗时另记。

先完成口述与窄迁移(10分)

这一项在首次源码保存后进行。先用本人代码说明输入、借用和统计值的关系,再领取追问;不要先展开下面的对照答案。

领取本次追问:先回答并保存,再看对照

保留原来的输入合同和total定义,只把count的含义改成“非零项数”。你会改变哪一个更新步骤?对输入[2,0,3],新的两项统计分别是多少?不要求写第二个大程序,用已经学过的条件与循环解释或写最小修改即可。

我的追问回答已经保存:查看4分对照

count从0开始,只在当前元素不为0时增加;total仍对每个元素累计。[2,0,3]得到count=2、total=5。原先直接用input.size()的计数方式需要改动。识别需要条件计数2分,保留总和定义且给出正确结果2分。

如果已经看过这一问及答案,请评审者换一个仍只依赖已授构造的等价追问,或用一个未公布的合同内输入核对实现;不要把同题背诵记为陌生迁移。

口述6分的判断依据

指出main里的容器拥有元素、span只借用2分;解释输入在构造期间必须有效、构造结束后统计对象不依赖输入继续存活2分;指出类内count/total是独立标量,不是原元素的别名2分。应能对应本人代码的成员和访问位置,只背这些句子不能替代解释。

预测:每题5分,共25分

每题结果或状态2分,因果与过程3分。按首次保存的答案评分;正确结果但原因错误,不能得满分。

1 · 表达式

结果:2

7与3先做整数除法,得到int值2;再转换为double保存。接收变量的类型不能把先前丢掉的小数补回来。默认输出显示2,数值上是double中的2。

2 · 循环

结果:0 2

n=0:result初始为0,i=0时条件立即不成立,循环体和更新各执行0次。n=1:0<1成立一次,result变2,++i使i为1,再检查1<1不成立。两次调用有各自的局部状态。

3 · 值参数

结果:4 7

value是从original初始化的形参对象;value += 3把形参从4改为7。original仍为4,返回的7用于初始化result。

4 · 引用赋值

结果:7 9 7

r引用a。r = b把b当时的7写入a,没有让r重新引用b;随后b变9,a仍7,读取r也得到a的7。

5 · 指针寿命

结果:不能承诺合法的确定输出

local在内层右花括号处结束,末行通过p读取已经结束的对象,属于未定义行为。曾经保存非空地址,不足以证明对象现在还存活;不能把一次观察到的4当成正确输出。

独立程序:45分

维度分值核对内容
接口与状态10只保存独立count/total两个标量;构造接收span<const int>;const查询表达只读,外部不能随意破坏状态。
计算与寿命15按输入计算数量和总和,不越界,不保留借用,不硬编码五个结果。
五个用例15每组3分;本人实现实际运行,count和total都正确。
构建与证据5本人源码、命令、退出状态与结果齐全;修改后重编译,并能解释正在运行的产物。

成员仍保存span、裸指针或引用,就不满足“只保存两个独立标量”的合同,不能因为当前查询恰好只读统计值而忽略它。没有发生诊断时可以如实记录“未遇到错误”;不要求人为制造错误。

固定结果

输入counttotal
[]00
[5]15
[2,0,3]35
[0,0]20
[100,100]2200

三份找错说明:20分

1 · reserve与size(7分)

reserve(3)之后size仍为0,容量至少能容纳3项。第0项不存在,第一处非法读取是values[0]。指出size/容量关系2分,定位非法访问2分,提出先创建元素再访问的修法3分。例如改为resize(3)后,第0项已经存在且初始为0。原危险片段不执行。

2 · 返回局部拥有者的view(7分)

构造返回的span时local还活着;函数结束时local及其元素结束,调用者得到的view不能继续读取那些元素。指出拥有者与结束点3分,明确view不延长寿命2分,给出合法的接口修法2分。例如返回拥有数据的vector值,或让调用者提供仍存活的容器,函数只返回借用调用者数据的view。后一方案仍要由调用者保证借用期间不销毁或使元素失效。

3 · 重分配后的引用(6分)

按本题明确条件,push_back这一步发生重分配,旧first从此不能再用于访问。指出失效点2分,说明旧引用与旧存储的关系2分,从仍存活的values重新取得第0项2分。可以在追加后再建立所需引用;不能声称旧引用会自动跟随新存储,也不能靠一次打印出的地址判断有效。原片段不执行。

同时满足这些条件,才记录通过

  • 总分至少80/100;预测至少20/25;独立程序至少36/45。
  • 只保存独立标量的程序合同成立,五个固定用例均由本人程序实际通过。
  • 四项关键概念全对:引用赋值不是改绑;借用不延长拥有者寿命;reserve不创建元素;发生重分配后旧引用失效。
  • 没有给未定义行为指定正确输出,没有把看过实现或代写代码当独立完成。
  • 能口述本人代码中的对象与借用关系,并如实记录追问是否提前见过。

任何一项未满足,记录实际缺口与待复测内容。不要只凭总分、终端截图或示例跑通越过条件。M1通过也不会自动更新G0、设备gate、其他项目进度或简历证据。

教师参考实现:最后才对照

下面完整代码直接读取同一份实际CPP。它用两个标量成员保存统计值,在构造时遍历span;main用普通if逐个检查五组输入,失败返回1,通过返回0。它不处理合同外输入,也不声称证明任意程序的正确性。

batch-summary.cpp · 教材参考
// 教材参考实现;编译运行它不能代替学习者独立完成 M1。
// 输入合同:构造期间输入有效,最多 10 项,每项在 0–100 内。
// textbook:begin implementation
#include <cstddef>
#include <iostream>
#include <span>
#include <vector>

class BatchSummary {
    std::size_t count_;
    int total_;

public:
    explicit BatchSummary(std::span<const int> input)
        : count_{input.size()}, total_{0} {
        for (int value : input) {
            total_ += value;
        }
    }

    std::size_t count() const {
        return count_;
    }

    int total() const {
        return total_;
    }
};
// textbook:end implementation

bool check(const BatchSummary& summary, std::size_t count, int total) {
    std::cout << summary.count() << ' ' << summary.total() << '\n';
    return summary.count() == count && summary.total() == total;
}

int main() {
    {
        std::vector<int> values;
        const BatchSummary summary{std::span<const int>{values}};
        if (!check(summary, 0, 0)) {
            return 1;
        }
    }
    {
        std::vector<int> values{5};
        const BatchSummary summary{std::span<const int>{values}};
        if (!check(summary, 1, 5)) {
            return 1;
        }
    }
    {
        std::vector<int> values{2, 0, 3};
        const BatchSummary summary{std::span<const int>{values}};
        if (!check(summary, 3, 5)) {
            return 1;
        }
    }
    {
        std::vector<int> values{0, 0};
        const BatchSummary summary{std::span<const int>{values}};
        if (!check(summary, 2, 0)) {
            return 1;
        }
    }
    {
        std::vector<int> values{100, 100};
        const BatchSummary summary{std::span<const int>{values}};
        if (!check(summary, 2, 200)) {
            return 1;
        }
    }
    return 0;
}

五行标准输出应依次为:

0 0
1 5
3 5
2 0
2 200

把下载文件放在单独的参考目录,避免覆盖本人实现。危险找错片段只有页面静态展示,不在以下运行下载中。

只补实际缺口,再用等价新题复测

缺口返回位置补练和复测方向
运算类型新02换操作数及接收类型,说明先运算后保存。
循环与函数新03新04零次循环与两次独立调用;换成计数任务。
引用与指针新05新06换改值顺序和作用域,画对象与存活区间。
独立状态新07维护两个标量、只读查询,解释与来源对象的区别。
数量与容量新08改变容量和实际元素数,判断哪些下标有效。
视图与失效新09.3–09.4换拥有者作用域或失效操作,画借用期限。

保存尝试编号、日期、实际分钟、参考使用、分项分数、五用例结果、四概念、口述和下一次复测结果即可,不需要建立另一个进度系统。若综合程序仍不能独立组织,再安排一个同规模新题;不是反复抄同一份实现。

完成第09章并通过M1后,再进入新10:算法与lambda →。尚未通过时先处理这里记录的缺口;日期和页面阅读次数不会代替验收。这个链接只提供导航,不自动记录通过。