Pascal期末成绩统计函数返回0,dtmhs.akhir记录无值问题排查
问题原因
- 核心问题:期末成绩
akhir字段的计算逻辑仅封装在output(查看数据列表)过程中,只有主动调用菜单的【2. Tampilan Data Mahasiswa】功能时,才会触发计算给dtmhs[i].akhir赋值。如果输入完数据直接调用最值、平均统计功能,所有记录的akhir字段都是未赋值的默认值0,因此统计结果全部为0.00。 - 次要bug:
minimum函数的输出文案全部错误写为“Nilai terbesar”(最大值),和功能实际逻辑不符。
修复方案
- 抽取期末成绩计算逻辑为独立公共过程,确保所有需要用到期末成绩的功能都能读取到最新计算结果:
// 新增公共过程:统一计算所有学生的期末成绩 procedure hitung_nilai_akhir; begin for i:=1 to a do begin dtmhs[i].akhir := (0.1*dtmhs[i].tugas) + (0.3*dtmhs[i].uts) + (0.3*dtmhs[i].uas) + (0.3*dtmhs[i].prak); end; end;
- 修改
input过程,在所有学生数据输入完成的末尾调用一次hitung_nilai_akhir;,保证后续所有功能都能直接读取到已计算的期末成绩。 - 修改
output过程,删除原来冗余的akhir计算逻辑,避免重复运算。 - 修复
minimum函数的文案错误,修改后代码如下:
function minimum(): Integer; var chose: Char; begin clrscr; writeln('a. Nilai UTS '); writeln('b. Nilai UAS '); writeln('c. Nilai Tugas '); writeln('d. Nilai Praktikum'); writeln('e. Nilai Akhir '); write ('Masukkan Pilihan [a/b/c/d/e] ? : ');readln(chose); case chose of 'a': writeln('Nilai terkecil UTS adalah ',utsmin()); 'b': writeln('Nilai terkecil UAS adalah ',uasmin()); 'c': writeln('Nilai terkecil Tugas adalah ',tugasmin()); 'd': writeln('Nilai terkecil Praktikum adalah ',prakmin()); 'e': writeln('Nilai terkecil NA adalah ',namin():0:2); end; end;
可选优化:如果后续有修改学生成绩的需求,可以在
maksimum、minimum、rerata_semua三个统计函数的开头也调用一次hitung_nilai_akhir,确保每次统计结果都是最新值。
内容的提问来源于stack exchange,提问作者Dio Brando
相关产品推荐
相关产品推荐

