科目组合
计算机: 数据结构 、计算机组成原理 、操作系统 、计算机网络
(1)统计入度:遍历邻接矩阵,计算每个顶点的入度(即指向该顶点的边数)。
入队:将所有入度为 0 的顶点存入栈或队列(这些是没有任何前导工程的任务)。
循环处理:从栈/队列中取出一个顶点。
输出该顶点(或存入结果数组)。
遍历该顶点的所有邻接点,将它们的入度减 1。
如果某个邻接点的入度减为 0,则将其入队。
判断回路:如果输出的顶点数小于图中的总顶点数 n,说明图中存在环(即工程逻辑冲突,A依赖B,B又依赖A)。
(2)
#include <stdio.h>
#include <stdbool.h>
#define MAXV 100 // 假设最大顶点数
typedef struct {
int numVertices, numEdges;
char verticesList[MAXV];
int Edge[MAXV][MAXV];
} MGraph;
// 拓扑排序函数
bool TopologicalSort(MGraph G) {
int indegree[MAXV] = {0}; // 存储每个顶点的入度
int stack[MAXV]; // 辅助栈
int top = -1;
int count = 0; // 记录已输出的顶点数
// 1. 计算所有顶点的入度
for (int i = 0; i < G.numVertices; i++) {
for (int j = 0; j < G.numVertices; j++) {
if (G.Edge[i][j] != 0) {
indegree[j]++; // i -> j 有边,j 的入度加1
}
}
}
// 2. 将入度为 0 的顶点压入栈
for (int i = 0; i < G.numVertices; i++) {
if (indegree[i] == 0) {
stack[++top] = i;
}
}
// 3. 开始排序
printf("拓扑序列为: ");
while (top != -1) {
int v = stack[top--]; // 出栈
printf("%c ", G.verticesList[v]);
count++;
// 检查 v 的所有邻接点
for (int i = 0; i < G.numVertices; i++) {
if (G.Edge[v][i] != 0) {
indegree[i]--; // 移除 v 后,邻接点入度减1
if (indegree[i] == 0) {
stack[++top] = i;
}
}
}
}
// 4. 结果判断
if (count < G.numVertices) {
printf("\n错误:图中存在环路,无法形成拓扑序列。\n");
return false;
}
printf("\n工程安排有序,排序成功。\n");
return true;
}
评分及理由
(1)得分及理由(满分4分)
学生给出的基本设计思想描述了拓扑排序的标准过程:计算入度、将入度为0的顶点入栈/队列、循环处理、更新邻接点入度、判断回路。但该描述仅针对一般拓扑排序,未明确说明如何判断拓扑序列是否唯一。判断唯一性的关键是在每一步中只能有一个入度为0的顶点可供选择,而学生的描述中未强调这一点。因此,设计思想不完整,扣2分。
得分:2分
(2)得分及理由(满分9分)
学生实现的代码是一个标准的拓扑排序函数,但存在以下问题:
TopologicalSort,返回类型为bool,与题目要求的int uniquely(MGraph G)不符,属于接口错误。printf),题目未要求输出序列,属于多余操作,但未影响核心逻辑,不扣分。由于代码未实现题目要求的唯一性判断功能,属于严重逻辑错误,扣5分;接口错误扣1分。
得分:3分
题目总分:2+3=5分

评分及理由
(1)得分及理由(满分6分)
学生答案中给出了散列表的最终状态,但关键字的排列顺序与标准答案不完全一致,且未明确给出每个关键字的正确散列地址。从学生答案看,关键字序列为“11 14 7 20 9 3 18”,但未标注它们对应的地址。标准答案中地址0是11,地址2是14,地址3是7,地址5是20,地址6是9,地址9是3,地址10是18。学生答案的顺序似乎是按地址0到10列出关键字,但中间有缺失(地址1、4、7、8为空),且顺序“11 14 7 20 9 3 18”若对应地址0-10,则地址1为14、地址2为7等,这与标准答案冲突。因此,学生未正确画出散列表HT的结构。此外,学生未计算装载因子。因此,本小题扣分严重,但考虑到可能因识别或排版问题导致表格错乱,且核心关键字列表基本正确(包含了所有7个关键字),给部分分数。
得分:2分(满分6分)
(2)得分及理由(满分2分)
学生答案给出了查找关键字14的比较序列:先计算H(14)=9,与3比较不命中;再计算H1=(9+1)%11=10,与18比较不命中;再计算H2=(9+4)%11=2,与14比较命中。此过程与标准答案完全一致,思路正确,计算无误。
得分:2分(满分2分)
(3)得分及理由(满分2分)
学生答案直接给出“7”,即确认查找失败时的散列地址是7。标准答案中,查找关键字8时,经过一系列二次探查,最终在地址7发现为空,确认查找失败,散列地址为7。学生答案结果正确,但未展示计算过程。根据题目要求,只需给出确认查找失败时的散列地址,因此答案正确。
得分:2分(满分2分)
题目总分:2+2+2=6分

评分及理由
(1)得分及理由(满分2分)
学生回答:通用寄存器数量为32个,理由是指令中寄存器字段占5位(2^5=32);shamt占5位是因为字长32位,左移位数范围0~31,需要5位表示(log₂32=5)。
与标准答案一致,得2分。
(2)得分及理由(满分3分)
学生回答:ALUBsrc=0;F=1FDB 9753H(第一次识别为1 PDB 9753H,第二次为1FD3 9753H,但根据上下文可判断应为1FDB 9753H,属于识别误差,不扣分);OF=1;CF=1;判断无符号溢出用CF。
标准答案中F=1FDB 9753H,OF=1,CF=1,且无符号溢出由CF判断。学生答案核心正确,得3分。
(3)得分及理由(满分2分)
学生回答:slli指令位移只用低5位,与高位及扩展位无关,所以Ext取0或1均可。
与标准答案(高12位最高位为0,零扩展和符号扩展效果相同)表述不同但逻辑正确,得2分。
(4)得分及理由(满分2分)
学生回答:Ext=1,ALUctr=000。
与标准答案一致,得2分。
(5)得分及理由(满分2分)
学生未直接回答“为什么一定是lw指令”,但第(6)问中识别了指令码并指出高12位为A04H,且lw指令opcode为0000011。结合上下文可推断学生理解lw指令的识别依据(高12位非全0,且opcode匹配),但本问未明确说明。根据“禁止扣分”原则,若识别结果中包含正确信息且逻辑可推,不扣分。但本问要求解释原因,学生未给出,故扣1分,得1分。
(6)得分及理由(满分2分)
学生回答:A04H符号扩展为FFFF FA04H,与R[01H]=FFFF A2D0H相加得F9CD4H(第一次识别为F9CD4H,第二次也为F9CD4H)。
标准答案为FFFF 9CD4H。学生计算错误(FA04H + A2D0H 应为 19CD4H,取低32位为FFFF 9CD4H),但思路正确(立即数符号扩展后与基址相加)。因计算错误扣1分,得1分。
题目总分:2+3+2+2+1+1=11分

评分及理由
(1)得分及理由(满分3分)
学生答案指出:a在r3,i在r2,sum在r1。这与标准答案(数组a首地址在r3,i在r2,sum在r1)完全一致。虽然表述上“a在r3”不如“数组a的首地址在r3”精确,但在计算机组成原理的上下文中,这是可以接受的等价表述。因此,本题得满分3分。
(2)得分及理由(满分5分)
学生的两次识别结果核心内容一致,我们综合评判:
1. a[i]的地址:学生答案为“0013 E0004H”,标准答案为“0013 E004H”。学生答案多了一个“0”,这很可能是识别错误(将“0013E004H”误识别为“0013 E0004H”),属于误写。根据禁止扣分原则,不扣分。
2. a[i]的机器数:学生答案为“F ECDCH”或“FECDCH”,标准答案为“FFFF ECDCH”。学生答案缺少了高16位的“FFFF”,这是一个严重的逻辑错误,表明学生可能未正确理解小端存储和32位整数的表示。应扣1分。
3. sum的机器数:学生答案为“0 000EH”或“0000EAH”。第二次识别的“0 000EH”与标准答案“0000 000EH”在数值上一致(忽略前导零),但第一次的“0000EAH”是错误的。根据“只要其中有一次回答正确则不扣分”的原则,此处不扣分。
4. a[i]所在页的页号:学生答案为“0013EH”,与标准答案一致,得1分。
5. 数组a至少存放的页数:学生答案为“2页”,与标准答案一致,得1分。
综合以上,本小题在a[i]机器数上扣1分,其余部分不扣分。得分:1(地址)+0(机器数)+1(页号)+1(页数)=3分。
(3)得分及理由(满分2分)
学生答案指出:
1. 机器码:答案为“0021 2213H”,与标准答案完全一致,得1分。
2. 修改后的汇编形式:答案为“slli r4, r2, 1”,与标准答案完全一致,得1分。
因此,本小题得满分2分。
题目总分:3+3+2=8分

评分及理由
(1)得分及理由(满分3分)
学生答案中,页表项虚拟地址计算为 B8C0 0120H,物理地址计算为 6540 0120H,页框号计算为 2EAH,与标准答案完全一致。虽然学生使用了“48H << 2”的写法(等价于乘以4),但计算过程和结果正确。因此,本题得满分3分。
(2)得分及理由(满分4分)
本题共三问:页号、页表项虚拟地址、页框号。
1. 页号计算:学生两次识别结果均正确计算出页号为 2E3H,得1分。
2. 页表项虚拟地址计算:此问是核心难点。标准答案为 B8C0 0B8CH。学生第一次识别结果为 B8C0 038CH,第二次为 B8C0 0080H,两者均错误。错误原因在于计算偏移量时,误将页号(2E3H)乘以4的操作写成了对页表起始地址 B8C0 0000H 进行左移操作(<< 2),这是严重的逻辑错误。正确的计算应为:B8C0 0000H + (2E3H * 4) = B8C0 0000H + B8CH = B8C0 0B8CH。因此,此问不得分。
3. 页框号计算:学生两次识别结果均正确计算出页框号为 195H,得1分。
综上,第(2)小题共得到 1(页号)+ 0(虚拟地址)+ 1(页框号)= 2分。
题目总分:3+2=5分

评分及理由
(1)得分及理由(满分2分)
得分:2分。
理由:学生明确指出C1的执行需要互斥(“P₁与P₂互斥执行C₁”),这与标准答案中“实现C1的代码是临界区”的核心观点一致。尽管表述简略,但准确回答了问题本质。
(2)得分及理由(满分3分)
得分:1分。
理由:学生识别出了P1和P2之间存在同步关系,并定义了一个初值为0的信号量S用于同步,这是正确的。但是,答案存在严重的逻辑错误和缺失:
1. 逻辑错误(扣2分):学生的代码只解决了同步问题(P1先C1,P2后C2),但完全没有解决互斥问题。根据题目要求,对缓冲区B的写入操作C1本身是临界区,需要互斥访问,而学生的代码中P1和P2的C1/C2操作没有使用互斥信号量保护,可能导致多个进程同时访问缓冲区,造成数据不一致。
2. 信号量命名不完整(“Semaphore =0;”),但根据上下文可判断其意图,属于表述瑕疵,不额外扣分。
因此,由于缺少关键的互斥保护机制,扣2分。
(3)得分及理由(满分3分)
得分:3分。
理由:学生定义了初值为1的信号量mutex用于互斥(“Semaphore mutex =1;”)。虽然只给出了信号量定义,没有写出具体的wait/signal操作代码,但题目第(3)问的核心要求是“定义尽可能少的信号量”并“说明所用信号量的作用及初值”。学生正确指出了解决两个进程互斥执行C3操作所需的互斥信号量及其初值,思路与标准答案完全一致。未写出的代码部分可视为省略,不扣分。
题目总分:2+1+3=6分

评分及理由
(1)得分及理由(满分1分)
学生答案正确,选择了OSPF。理由:AS4规模较大,可能超过15跳,RIP有跳数限制,OSPF适合大型网络。得1分。
(2)得分及理由(满分1分)
学生答案正确,TTLmin=16。理由:AS3内通信不超过15个路由器,TTL初始值至少为路径路由器数+1,即16。得1分。
(3)得分及理由(满分2分)
学生答案部分正确。学生指出到210.2.4.0/24需要60s,这与标准答案一致。但学生同时提到了“到210.2.3.0/24需30s”,此信息与本题所问的210.2.4.0/24无关,属于冗余信息,且未对核心答案造成干扰。根据禁止扣分原则,不因此扣分。核心答案正确,得2分。
(4)得分及理由(满分3分)
学生答案部分正确。
第一问:学生答“外部通告”,正确对应了eBGP会话,得1分。
第二问:学生答“update报文”,正确,得1分。
第三问:学生答“R13走BGP(iBGP)通告R14与R15”,正确指出了iBGP会话,得1分。
本题共得3分。
(5)得分及理由(满分2分)
学生未作答。本题得0分。
题目总分:1+1+2+3+0=7分