问题的详细信息如下:
#include <stdio.h>
int main() {
int N, i, j, sum, mode, count, f[100], maxf;
float mean, med;
printf("Enter the number of students\n");
scanf("%d", &N);
printf("Number of students:%d\n", N);
int m[N]; // Array to store the marks //
for (i = 0; i < N; i++) {
printf("Enter the marks of student %d\n", i + 1);
scanf("%d", &m[i]);
}
printf("Scores\n");
for (j = 0; j < N; j += 5) {
printf("%d, %d, %d, %d, %d\n", m[j], m[j + 1], m[j + 2], m[j + 3], m[j + 4]);
}
// Sorting the array //
for (i = 0; i < (N - 1); i++) {
for (j = i + 1; j < N; j++) {
if (m[j] < m[i]) {
int temp = m[j];
m[j] = m[i];
m[i] = temp;
}
}
}
if (N % 2 == 0) {
med = (((m[((N / 2) - 1)] + m[(N / 2)])) / 2);
} else
if (N % 2 != 0) {
med = m[((N + 1) / 2)];
}
sum = 0;
for (i = 0; i < N; i++) {
sum += m[i];
}
mean = (((float)(sum)) / (N));
printf("Mean:%f\n", mean);
printf("Median:%d", med);
for (i = 0; i < N; i++) {
for (j = i + 1; j < N; j++) {
if (m[j] != -1) {
if (m[j] == m[i]) {
count += 1;
m[j] = -1;
}
count = f[i]; // Array to store frequency //
}
}
}
maxf = 0;
for (i = 0; i < N; i++) {
if (maxf < f[i]) {
maxf = f[i];
}
}
for (i = 0; i < N; i++) {
if (maxf == f[i]) {
printf("Mode: %d\n", m[i]);
}
}
return 0;
}
我期望中位数会出现一些值,但每次都是0
,而且我总是得到不正确的模式。
最佳答案
代码中存在多个问题:
您没有测试
scanf()
的返回值:如果任何输入丢失或导致转换错误,您将出现未定义的行为。打印值时,您假设
N
是5
的倍数:如果不是这种情况,您将有未定义的行为访问超出数组末尾的元素。在元素数量为偶数的情况下,计算中值作为数组中心元素值的平均值:您应该使用浮点算术进行此计算:将至少一个操作数转换为
float
或double
。例如:med = ((float)m[N / 2 - 1] + m[N / 2]) / 2;
如果元素数量为奇数,则应采用中心元素的值,该元素不位于偏移量
(N + 1) / 2
处但只是在偏移量N / 2
处。您应该用简单的情况检查这些公式,例如 N=1 -> med=m[(1+1)/2] 超出范围!med = m[N / 2];
请注意,您可以使用公式
med = ((float)m[(N - 1) / 2] + m[N / 2]) / 2;
在所有情况下,假设N > 0
.printf("Median:%d", med)
有未定义的行为,因为您传递了float
值(自动转换为double
),其中printf
预计int
用于转换%d
。您应该使用%f
相反:printf("Median: %f\n", med);
要计算众数,您可以使用数组
f[100]
如果N > 100
则太小.你从不存储
count
至f[i]
,而是您阅读count
来自f[i]
这是未初始化的。此外,您不会重置
count
至0
或1
对于m
中的每个不同值.数组的众数是在数组中出现次数多于任何其他数字的数字。您可以通过计算线性扫描中的最大重复次数来确定这一点,而无需额外的数组,并在后续扫描中打印具有此重复次数的值。
关于c - 中位数和众数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77076311/