好吧我在这里做错了什么?
该程序应该读取20个整数,然后输出不重复的整数数组(仅输出每个整数一次)。
//Program to read 20 integers and return each integer only once (no duplicates).
#include <stdio.h>
int main()
{
int a, b, count=0, temp, array1[20];
printf("Enter 20 array elements between 1 and 10 inclusive\n");
for (a=0; a<20; a++) //Loop to enter 20 elements
{
scanf("%d", &temp);
for (b=0; b<=20; b++) //Loop to test each new element against all previous entered elements
{
if (array1[b] == temp) //If duplicate increment count
{
count++;
}
else if (count == 0 && b == 20) //If there have been no duplicates and 20 numbers have been tested... add entered number to the array
{
array1[a] = temp;
}
}
}
for (a=0; a<20; a++)
{
printf("%d\t", array1[a]);
}
return 0;
}
答案 0 :(得分:2)
这里有以下错误。
在内部循环中,在第一次检查期间,您将与20个元素进行比较。收到第一个元素后,您没有任何要比较的元素。我添加了一个变量size
来表示数组的大小。 size
初始化为0。
if (count == 0 && b == 20)
应移至for循环之外,并可简化为if (count == 0)
将一个元素添加到数组时,它会在array1[size]
添加,size
会增加。
您需要在每个外部for循环重新初始化count
,如下所示。
打印将打印不重复的size
个元素。
代码如下。
//Program to read 20 integers and return each integer only once (no duplicates).
#include <stdio.h>
int main()
{
int a, b, count=0, temp, array1[20];
int size = 0;
printf("Enter 20 array elements between 1 and 10 inclusive\n");
for (a=0; a<20; a++) //Loop to enter 20 elements
{
scanf("%d", &temp);
count = 0;
for (b=0; b<size; b++) //Loop to test each new element against all previous entered elements
{
if (array1[b] == temp) //If duplicate increment count
{
count++;
}
}
if (count == 0) //If there have been no duplicates and 20 numbers have been tested... add entered number to the array
{
array1[size] = temp;
size++;
}
}
for (a=0; a<size; a++)
{
printf("%d ", array1[a]);
}
return 0;
}
此代码将接受20个元素并存储和显示尽可能多的非重复元素(可以是1-20)。如果你想存储20个非重复元素(输入可能超过20个),可以很容易地修改它。
答案 1 :(得分:1)
您有多个未初始化变量的读取,这是未定义的行为。您还可以访问超出范围的数组。
for (b=0; b<=20; b++)
^^
This will result in b in the range [0..20]
{
if (array1[b] == temp) //If duplicate increment count
^^^^^^^^^
array1[b] is uninitialized
and when b is 20 you access out of range
此外,只有当count为0且b为20
时,才会写入数组 else if (count == 0 && b == 20)
{
array1[a] = temp;
}
请注意,您永远不会重置count
,因此在第一次匹配后您将永远不会再次编写数组
BTW - 你打印:
Enter 20 array elements between 1 and 10 inclusive
但是你永远不会检查输入值是否在该范围内。