使用 void 函数计算 C 中数组中出现频率最高的整数
Using a void function to calculate most frequent integer in an array in C
你好!我正在尝试创建一个程序(学校作业),要求用户输入 0 - 1000 之间的整数序列。当用户输入负整数或超过 100 个整数时,序列停止。
实际输入、保存和创建一个 "counter" 数组,其中包含输入整数的次数。但是,分配的一部分是创建一个 void 函数,该函数使用指向 return 哪个整数出现次数最多以及出现次数的指针变量。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SEQ 100
void analyzeFrequencies(int mainArray[], int counter[], int* mOI, int* numOfOccurences);
int main()
{
int i=0, *mOI=0, *numOfOccurences=0, tempNum=0, mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};
printf("Please enter a integer between 0-1000.\nSequence will stop when you enter negative integer of after MAX_SEQ integers.\n\n");
do
{
if( scanf("%d", &tempNum) == 1)
{
if (tempNum <= 1000)
{
if (tempNum < 0)
{
printf("You decided to exit the sequence. Your array entered is:\n");
}
else
{
mainArray[i] = tempNum;
counter[tempNum]++;
++i;
}
}
else
printf("Please enter a number between 0-1000. Exit sequence by entering negative number.\n");
}
else
printf("\nError.\n");
} while(tempNum > 0 && i < MAX_SEQ);
analyzeFrequencies(mainArray, counter, mOI, numOfOccurences); //This is where the problem occurs.
if (i == 0)
{
printf("You entered no sequence.");
}
else
{
printf("\nSequence:\n");
for(int j=0; j<i; j++)
{
printf("[%d] %d\n", j, mainArray[j]);
}
printf("Most occurred item: %d\nOccurred %d times!", *mOI, *numOfOccurences);
}
return 0;
}
当我 运行 我的代码时,一切正常,直到我执行 analyzeFrequencies() 函数。然后程序停止工作。
void analyzeFrequencies(int mainArray[], int counter[], int* mOI, int* numOfOccurences)
{
for(int i=0; i<MAX_SEQ; i++)
{
if(counter[i] > *numOfOccurences)
{
*mOI = i;
*numOfOccurences = counter[i];
}
}
}
我期望函数 "void analyzeFrequencies" 到 return 通过 "mOI" 和 "numOfOccurences" 的指针变量值。 mOI 是出现次数最多的整数。
相反,程序只是停止工作。我查看我的代码有一段时间了,但似乎无法找到导致此问题的原因。我可能坐着看我的代码太久了,然后就瞎了。会感谢任何帮助,以了解我要去哪里错了!
P.S!我意识到代码根本没有优化,我很乐意收到任何反馈,但我的首要任务是让 analyzeFrequencies 函数开始工作!
int i=0, *mOI=0, *numOfOccurences=0, tempNum=0,
mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};
在您的 main
函数中,您将 mOI
和 numOfOccurences
声明为指针变量,它们都被初始化为 0,这意味着它们是 NULL 指针。然后将这些 NULL 指针传递给您的函数并取消引用它们。取消引用 NULL 指针会调用 undefined behavior.
将这两个变量声明为 int
而不是 int *
并将它们的 地址 传递给 analyzeFrequencies
.
所以这样声明它们:
int i=0, mOI=0, numOfOccurences=0, tempNum=0,
mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};
然后像这样调用你的函数:
analyzeFrequencies(mainArray, counter, &mOI, &numOfOccurences)
你好!我正在尝试创建一个程序(学校作业),要求用户输入 0 - 1000 之间的整数序列。当用户输入负整数或超过 100 个整数时,序列停止。
实际输入、保存和创建一个 "counter" 数组,其中包含输入整数的次数。但是,分配的一部分是创建一个 void 函数,该函数使用指向 return 哪个整数出现次数最多以及出现次数的指针变量。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SEQ 100
void analyzeFrequencies(int mainArray[], int counter[], int* mOI, int* numOfOccurences);
int main()
{
int i=0, *mOI=0, *numOfOccurences=0, tempNum=0, mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};
printf("Please enter a integer between 0-1000.\nSequence will stop when you enter negative integer of after MAX_SEQ integers.\n\n");
do
{
if( scanf("%d", &tempNum) == 1)
{
if (tempNum <= 1000)
{
if (tempNum < 0)
{
printf("You decided to exit the sequence. Your array entered is:\n");
}
else
{
mainArray[i] = tempNum;
counter[tempNum]++;
++i;
}
}
else
printf("Please enter a number between 0-1000. Exit sequence by entering negative number.\n");
}
else
printf("\nError.\n");
} while(tempNum > 0 && i < MAX_SEQ);
analyzeFrequencies(mainArray, counter, mOI, numOfOccurences); //This is where the problem occurs.
if (i == 0)
{
printf("You entered no sequence.");
}
else
{
printf("\nSequence:\n");
for(int j=0; j<i; j++)
{
printf("[%d] %d\n", j, mainArray[j]);
}
printf("Most occurred item: %d\nOccurred %d times!", *mOI, *numOfOccurences);
}
return 0;
}
当我 运行 我的代码时,一切正常,直到我执行 analyzeFrequencies() 函数。然后程序停止工作。
void analyzeFrequencies(int mainArray[], int counter[], int* mOI, int* numOfOccurences)
{
for(int i=0; i<MAX_SEQ; i++)
{
if(counter[i] > *numOfOccurences)
{
*mOI = i;
*numOfOccurences = counter[i];
}
}
}
我期望函数 "void analyzeFrequencies" 到 return 通过 "mOI" 和 "numOfOccurences" 的指针变量值。 mOI 是出现次数最多的整数。
相反,程序只是停止工作。我查看我的代码有一段时间了,但似乎无法找到导致此问题的原因。我可能坐着看我的代码太久了,然后就瞎了。会感谢任何帮助,以了解我要去哪里错了!
P.S!我意识到代码根本没有优化,我很乐意收到任何反馈,但我的首要任务是让 analyzeFrequencies 函数开始工作!
int i=0, *mOI=0, *numOfOccurences=0, tempNum=0,
mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};
在您的 main
函数中,您将 mOI
和 numOfOccurences
声明为指针变量,它们都被初始化为 0,这意味着它们是 NULL 指针。然后将这些 NULL 指针传递给您的函数并取消引用它们。取消引用 NULL 指针会调用 undefined behavior.
将这两个变量声明为 int
而不是 int *
并将它们的 地址 传递给 analyzeFrequencies
.
所以这样声明它们:
int i=0, mOI=0, numOfOccurences=0, tempNum=0,
mainArray[MAX_SEQ] = {0}, counter[MAX_SEQ] = {0};
然后像这样调用你的函数:
analyzeFrequencies(mainArray, counter, &mOI, &numOfOccurences)