C语言自定义totalLulus、nilaiTerbesar函数返回异常问题求助
问题排查及修复方案
核心错误原因
- 数组索引越界:C语言数组下标从0开始,长度为n的数组合法下标范围是
0 ~ n-1,代码中存在两处越界问题:- main函数输入分数的循环从
i=1开始到i<=jumlahSiswa结束,导致nilaiUser[0]未赋值为随机垃圾值,同时写入nilaiUser[jumlahSiswa]时越界覆盖栈内存 totalLulus、totalTidakLulus、nilaiTerbesar三个函数的循环条件写为i <= inputJumlahSiswa,会读取数组外的内存垃圾值,这就是全部分数低于阈值时返回1、人数超过4时返回随机大数字的直接原因
- main函数输入分数的循环从
- 函数声明不规范:顶部的函数声明未指定参数列表,存在参数传递不匹配的隐患
- 平均值计算存在精度损失:两个整数直接相除会先截断为整数再赋值给浮点数,无法得到精确的平均结果
修复后完整代码
#include <stdio.h> // 规范函数声明,明确参数列表 int nilaiRataRata(int inputRataRata, int inputJumlahMahasiswa); int nilaiTerkecil(int *inputNilai, int inputJumlahMahasiswa); int nilaiTerbesar(int *inputNilai, int inputJumlahMahasiswa); int totalLulus(int *inputNilai, int inputJumlahSiswa); int totalTidakLulus(int *inputNilai, int inputJumlahSiswa); int main(){ int i; int jumlahSiswa; printf("Masukan Jumlah Siswa : "); scanf("%d", &jumlahSiswa); int nilaiUser[jumlahSiswa]; int jumlahNilai = 0; // 修复循环下标,从0开始到<jumlahSiswa结束 for( i = 0; i < jumlahSiswa; i++ ){ printf("Masukan Nilai Mahasiswa Ke-%d : ", i+1); scanf("%d", &nilaiUser[i]); jumlahNilai += nilaiUser[i]; } printf("Rata Ratanya adalah : %d\n", nilaiRataRata(jumlahNilai, jumlahSiswa)); printf("Nilai Terkecil : %d\n", nilaiTerkecil(nilaiUser, jumlahSiswa)); printf("Nilai Terbesar : %d\n", nilaiTerbesar(nilaiUser, jumlahSiswa)); printf("Total Tidak Lulus : %d\n", totalTidakLulus(nilaiUser, jumlahSiswa)); printf("Total Lulus : %d\n", totalLulus(nilaiUser, jumlahSiswa)); return 0; } // Function Lulus int totalLulus(int *inputNilai, int inputJumlahSiswa){ int i; const int kkm = 56; // 统一阈值,逻辑更清晰 int totalLulus = 0; // 修复循环条件 for( i = 0; i < inputJumlahSiswa; i++ ){ if (inputNilai[i] >= kkm) { totalLulus++; } } return totalLulus; } // Function Tidak Lulus int totalTidakLulus(int *inputNilai, int inputJumlahSiswa){ int i; const int kkm = 56; // 统一阈值 int totalTidakLulus = 0; // 修复循环条件 for( i = 0; i < inputJumlahSiswa; i++ ){ if (inputNilai[i] < kkm) { totalTidakLulus++; } } return totalTidakLulus; } // Function Nilai Rata - Rata int nilaiRataRata(int inputRataRata, int inputJumlahMahasiswa){ // 修复精度问题,先转浮点数再做除法 float hasilRataRata = (float)inputRataRata / inputJumlahMahasiswa; return (int)hasilRataRata; } // Function Nilai Terkecil int nilaiTerkecil(int *inputNilai, int inputJumlahMahasiswa){ int i = 0; int counter = 100; for( i = 0; i < inputJumlahMahasiswa; i++ ){ if (inputNilai[i] < counter) { counter = inputNilai[i]; } } return counter; } // Function Nilai Terbesar int nilaiTerbesar(int *inputNilai, int inputJumlahMahasiswa){ int i = 0; int counter = 0; // 修复循环条件 for( i = 0; i < inputJumlahMahasiswa; i++ ){ if (inputNilai[i] > counter) { counter = inputNilai[i]; } } return counter; }
验证说明
修复后输入测试用例即可得到预期输出:Total Lulus=2,Nilai Terbesar=88。
内容的提问来源于stack exchange,提问作者Nico A.L
相关产品推荐
相关产品推荐

