gpt4 book ai didi

c - 程序显示一个数字出现 (N/2 + 1) 次

转载 作者:行者123 更新时间:2023-11-30 19:07:31 25 4
gpt4 key购买 nike

我是编程初学者。我写了一个程序来显示一个数字出现了(N/2 + 1)次。但每次我运行它时,我的cmd都会崩溃。我想我的数组可能有错误。

我的文本文件 - values3.txt 包含数字 {2, 3, 2, 2, 2, 3, 2, 1}

#include <stdio.h>

#define range_of_nums 3

int main(void)
{
int i;
int num_of_values = 8;
int a[num_of_values];
int freq[range_of_nums];
int current = 0;
int found_number = 0;

FILE *fp;

fp = fopen("values3.txt", "r");

for (i=0;i<num_of_values;i++)
{
fscanf(fp, "%d", &a[i]);
}

fclose(fp);

for (i=0;i<num_of_values;i++)
{
current = a[i] - 1;
freq[current] += 1;
}

num_of_values = num_of_values / 2;

for(i=0;i<range_of_nums;i++)
{
if (freq[i] > num_of_values)
{
found_number = i+1;
}
}

if (found_number != 0)
{
printf("The number %d occurs more than N/2 %d times \n", found_number, num_of_values);
}

else
{
printf("No number occurs more than N/2 times\n");
}

return 0;
}

最佳答案

您实际上走在正确的道路上,只是由于未能验证文件是否打开以及最后在循环逻辑中而失败。您还存在一个问题,即无法验证您是否确实获得了 num_of_values文件中的值。

我们首先删除“values3.txt 文件在哪里?”问题。 main()为您提供传递参数(例如文件名)的能力,并使用它。 main 的声明接受参数是:

int main (int argc, char *argv[])  /* where argc arguments are passed in argv */

这消除了 values3.txt 的硬编码在你的程序中。只需将文件名作为第一个参数传递,然后

FILE *fp = fopen (argv[1], "r");

或者,更好一点,使用三元运算符打开 argv[1] 中的文件如果给出,否则从 stdin 读取(默认):

FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

始终验证您的文件是否打开以供读取,如果没有打开则处理错误,例如

if (!fp) {  /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}

您遇到的另一个重大问题是初始化失败 freq为零。当你开始freq[current] += 1;在您的代码中,freq[current]必须事先设置为零才能使其有意义。您只需要简单的初始化即可:

    freq[range_of_nums] = {0},      /* you must initialize freq */

关于逻辑问题。您想要读取的最大num_of_values整数值转换为a ,但仅此而已。再读 1 个就会调用未定义的行为。不能保证永远有8文件中的整数。如果有6怎么办? ?如果有26怎么办? ?您必须处理所有案件。因此,不要使用 for (i = 0; i < num_of_values; i++)循环为什么不直接读取所有值并确保您读取的内容不超过 num_of_values ?像这样的东西:

/* read each value up to num_of_values */
while (i < num_of_values && fscanf (fp, "%d", &a[i]) == 1)
i++;

如果你只读6,你该如何调整?值(value)观?也许:

if (i != num_of_values)             /* validate 8 values read */
num_of_values = i; /* if not adjust number */

(注意:您已经知道它不可能更多来自您在 fscanf 前面的测试)

您不一定要更改保存数组中元素数量的变量(保留这一点很重要)。为什么我们不使用一个新变量来保存 N/2 (比如 num_by_2 。然后你可以这样做:

num_by_2 = num_of_values / 2;       /* you need another var */

同时仍然保留num_of_values以便稍后在您的代码中使用。

最后,如果我理解正确的话,您想要识别出现超过 N/2 的所有数字。时间。您的循环布局存在逻辑问题。查找所有大于 N/2 的值次,printf需要处于该循环中,例如

for (i = 0; i < range_of_nums; i++)
{
if (freq[i] > num_by_2)
{
found_number = i + 1;
printf ("The number %d occurs more than N/2 %d times \n",
found_number, num_by_2);
}
}

现在你知道是否 found_number有一个值,找到一个值。所以你的最后一个测试可能只是:

if (found_number == 0) 
printf("No number occurs more than N/2 times\n");

总而言之,您可以使用类似于以下内容的内容来清理逻辑:

#include <stdio.h>

#define range_of_nums 3

int main (int argc, char **argv)
{
int i = 0,
num_of_values = 8, /* you have 8 values */
a[num_of_values], /* otherwise your VLA is wrong */
freq[range_of_nums] = {0}, /* you must initialize freq */
num_by_2 = 0,
found_number = 0;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}

/* read each value up to num_of_values */
while (i < num_of_values && fscanf (fp, "%d", &a[i]) == 1)
i++;

if (fp != stdin) fclose (fp); /* close file if not stdin */

if (i != num_of_values) /* validate 8 values read */
num_of_values = i; /* if not adjust number */

for (i = 0; i < num_of_values; i++) /* set frequency array vals */
freq[a[i] - 1] += 1;

num_by_2 = num_of_values / 2; /* you need another var */

for (i = 0; i < range_of_nums; i++)
{
if (freq[i] > num_by_2)
{
found_number = i + 1;
printf ("The number %d occurs more than N/2 %d times \n",
found_number, num_by_2);
}
}

if (found_number == 0)
printf("No number occurs more than N/2 times\n");

return 0;
}

示例使用/输出

$ echo "2 3 2 2 2 3 2 1" | ./bin/numby2freq
The number 2 occurs more than N/2 4 times

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 程序显示一个数字出现 (N/2 + 1) 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46753254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com