gpt4 book ai didi

c - 为什么我的程序显然没有读取所有输入数字,我如何检测非数字输入?

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:07 25 4
gpt4 key购买 nike

对于一项作业,我必须编写一个程序来处理哈希表。我已经做到了,它似乎工作得很好,只是如果我在特定点输入一个变量,它不会产生预期的输出,如果我改变它,它会起作用(让我相信它与读取数字的顺序)。

它会在开始时读取与用户输入一样多的数字,然后对它们进行哈希处理并将它们添加到哈希表中。然后计算出该数字出现的次数,如果它大于用户输入的阈值(假设用户输入 4 作为阈值,333 出现 5 次)它将打印出该数字。

在我的程序中,它应该打印出 333,根据我的计数,它出现了 8 次,我将阈值设置为 4。但事实并非如此。如果我改变输出,让它出现在输入的前半部分,它就可以工作。这让我觉得它只是读取数组中 LEN/2 之前的数字(LEN 是我们被赋予设置为宏的值)。

代码如下:

#include <stdio.h>

#define LEN 31

int main(int argc, char *argv[]) {
int keys[LEN];
int values[LEN];
int numAmount, threshold, i, j, num, index, counter, count, n, advance = 1;

// Set all indices of the arrays keys and values to 0
for (i = 0; i < LEN; i++) {
keys[i] = 0;
values[i] = 0;
}

scanf("%d %d", &numAmount, &threshold);
if (numAmount <= 0 || threshold <= 0) {
printf("\nLength of array and/or threshold is not a positive integer.");
advance = 0;
}

// Main loop for adding numbers to the hash table
for (i = 0; i < numAmount && advance == 1; i++) {
counter = 0;
for (j = 0; j < LEN; j++) {
if (keys[j] != 0) {
counter++;
}
}
if (counter > LEN / 2) { // Load factor is greater than 1/2
printf("Load factor causes program to exit.");
break;
}

scanf("%d", &num);

// Illegal character detection
// if (!num > 0) {
// printf("Illegal character entry. Must be an integer from 0-9.");
// break;
// }

index = num % LEN;

if (keys[index] == 0) { // empty
keys[index] = num;
values[index] = 1;
}
else if (keys[index] == num) {
values[index]++;
}
else if (keys[index] != 0 && keys[index] != num) { // Collision
count = 0, n = 1;

while (keys[index] != 0 || keys[index] != num) { // Collision solver
if (count > LEN) {
break;
}
index = (index + n) % LEN;
n++;
count++;
}
}
}

// Only prints the results out if program went through with creating the hash table
if (advance == 1) {
for (i = 0; i < LEN; i++) {
if (values[i] >= threshold) {
printf("%d ", keys[i]);
values[i] = 0;
}
}
}
printf("\n");
}

如果我将其复制并粘贴为输入:

40 4
105 50 3 55 100
532 550 100 55 100
550 55 100 240 42
100 99 105 333 120
333 333 100 315 333
120 333 240 550 333
302 100 333 240 333
42 55 42 55 3

它返回100 55,这只是期望输出的2/3;它缺少 333。

但是如果我把333放在输入的开头附近,比如:

40 4
105 333 3 55 100
53 550 100 55 100
550 55 100 240 42
100 99 105 333 120
333 333 100 315 333
120 333 240 550 50
302 100 333 240 333
42 55 42 55 3

它按预期工作,并输出 100 333 55

我已经仔细研究了一段时间的代码,但我似乎无法弄清楚为什么数字的这种放置对于程序的正常运行如此重要。

另外,快速的第二个问题,我们被要求做的一件事是确保没有非法字符输入,基本上是任何非数字的字符。我如何检测到这个?我知道我可以使用 if 语句(我在上面的代码中注释掉了一个 if 语句的结构),但我不确定 if 语句的条件应该是什么。我知道正则表达式,但是使用 C 的正则表达式让我非常困惑。

最佳答案

我发现您的代码有几个问题。排名不分先后:

  • 你永远不会对 index 做任何事情和 num以及在碰撞求解器循环之后发生的诸如此类的事情,因此碰撞值会被简单地丢弃。

  • keys[index] != 0 || keys[index] != num 时让碰撞求解器循环将导致它拒绝任何已经对应于 num 的索引,因为这样的索引在 keys 中已经有一个非零值;更改 ||&& .

  • 正在做 index = (index + n) % LEN原因index继续累积偏移量,这(对于 LEN = 31,至少)导致一些索引被检查不止一次而其他索引根本不被检查。做index = (index + 1) % LEN相反并免除 n完全。

至于检测无效输入,简单的检测是否scanf返回 0(表示输入的下一部分未能匹配 "%d" )或不返回。

关于c - 为什么我的程序显然没有读取所有输入数字,我如何检测非数字输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724508/

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