我希望得到一些关于如何在C中正确找到排序数组模式的输入。这就是我正在使用的内容。首先,我的freqDistrib
功能:
void freqDistrib(int t[], int num) {
int i, j, x;
static int f[SIZE];
printf("\n\n");
printf("Part C:\n");
printf(" %-5s %-16s\n", "score", "frequency");
printf(" %-5s %-16s\n", "-----", "---------");
for (i = 1; i < num; i++) {
x = t[i];
j = i - 1;
while (j >= 0 && x > t[j]) {
t[j + 1] = t[j];
j = j - 1;
}
t[j + 1] = x;
} // sorts input in descending order
for (i = 0; i < num; i++) {
++f[t[i]];
if (t[i] != t[i + 1])
printf(" %3d %7d\n", t[i], f[t[i]]);
} // finds the frequency of each input and prints
}
和我的模式功能:
void modeScore(int t[], int num) {
int i, j, max, mode;
int f[SIZE];
for (i = 0; i < num; i++) {
f[t[i]]++;
}
mode = 0;
max = 0;
for (j = 0; j < num; j++) {
if (f[j] > max) {
max = f[j];
mode = j;
}
}
printf("\n\n");
printf("Part F:\n");
printf("%3d is mode\n", mode);
}
立即输出:
0是模式
我意识到我需要将当前频率计数与最大值进行比较,如果它高于设定值则等于最大值。我不能为我的生活弄清楚为什么这不起作用。任何意见都将不胜感激。
答案 0 :(得分:2)
如评论中所述,主要问题是您未在函数中初始化f
。
这里的工作代码显示了所有必要的变更:
#include <stdio.h>
enum { SIZE = 100 };
static void modeScore(int t[], int num)
{
int f[SIZE] = { 0 };
for (int i = 0; i < num; i++)
f[t[i]]++;
int mode = 0;
int max = 0;
for (int j = 0; j < num; j++)
{
if (f[j] > max)
{
max = f[j];
mode = j;
}
}
printf("Part F: %3d is mode (count %d)\n", mode, max);
}
int main(void)
{
int data[] =
{
/* random -n 40 0 9 | commalist -b ' ' -l 38 */
7, 8, 3, 8, 5, 9, 5, 8, 9, 6,
8, 0, 1, 8, 2, 0, 3, 4, 3, 3,
3, 0, 2, 7, 5, 4, 6, 5, 9, 0,
1, 9, 1, 7, 8, 0, 5, 4, 0, 8,
};
enum { DATA_SIZE = sizeof(data) / sizeof(data[0]) };
modeScore(data, DATA_SIZE);
return 0;
}
对于给定的数据,输出为:
Part F: 8 is mode (count 7)
(有趣的巧合:我第一次运行它 - 数据略有不同 - 答案回复为Part F: 0 is mode (count 7)
。这实际上是正确的;我将其中一个零改为八来产生当前结果。 )
请注意,我通常会设计函数来返回模态值,而不是让它进行打印。就目前而言,它无法重复使用,因为打印对大多数想要确定模式的代码都不重要。
该代码也不会检查t
中的值是否属于0
.. SIZE-1
范围内(但它应该)。
您使用的参数顺序是传统的,但使用时至少名义上有一些优势:
void modeScore(int num, int t[num])
明确表示数组t
中包含num
个元素。但是,大小必须先于数组dimentson中的使用。
答案 1 :(得分:1)
由于您说数组已排序,因此您无需创建临时数组来计算值。相反,您只需要遍历输入,并计算您在当前运行中看到的相同值的数量。在运行结束时,然后将运行长度与上一次最长运行进行比较,并在新运行时间更新时进行更新。
(实际上,只要当前的运行时间更长,我们就会更新,所以如果模式是最后一个值,我们不会忘记更新。)
请注意,我们不再需要SIZE
来绑定我们的值;如果我们愿意,我们现在可以使用int
的全部范围。
#include <stdio.h>
static void modeScore(const int t[], int num)
{
int start = 0;
int mode = t[0];
int score = 0;
for (int i = 1; i < num; ++i) {
if (i - start > score) {
// a longer run than the previous candidate
score = i - start;
mode = t[start];
}
if (t[start] != t[i])
// we've reached a change in value
start = i;
}
printf("Part F: %3d is mode (count %d)\n", mode, score);
}
你没有提供main()
,所以我改编了Jonathan Leffler:
int main(void)
{
int data[] =
{
/* random -n 40 0 9 | commalist -b ' ' -l 38 */
0, 0, 0, 0, 0, 0, 1, 1, 1, 2,
2, 3, 3, 3, 3, 3, 4, 4, 4, 5,
5, 5, 5, 5, 6, 6, 7, 7, 7, 8,
8, 8, 8, 8, 8, 8, 9, 9, 9, 9,
};
modeScore(data, sizeof data / sizeof data[0]);
return 0;
}