本周家庭作业我的任务是加载一个包含1,000个数字的文本文件,并对用户输入的数字进行线性搜索。我已完成线性搜索部分,但我必须找到并打印该整数的最后一次出现。我认为从最后运行数组并打印最后一次出现并打破循环是最容易的。我已经启动了代码,但在查找最后一次出现时遇到了一些麻烦。
我知道我的第二个 for loop 向后运行数组是错误的,我只是不确定它是错的。任何帮助表示赞赏!谢谢!
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
int main()
{
ifstream input("A1.txt");
int find;
cout << "Enter a number to search for: ";
cin >> find;
if (input.is_open())
{
int linSearch[1000];
for (int i = 0; i < 1000; i++)
{
input >> linSearch[i];
for (i = 1000; i > 0; i--)
{
if (find == linSearch[i])
{
cout << find << " is at position " << i << ". " << endl;
}
}
}
}
_getch();
return 0;
}
答案 0 :(得分:1)
既然是作业,我应该至少有点模糊,我绝对不应该使用代码。
您不应该在第一个循环中嵌套第二个循环。它应该与第一个循环的结束括号处于相同的缩进级别。
此外,几乎在所有情况下都不应该回到0,而是返回到在线性搜索中找到元素的位置,或者找到它的位置,而不是更进一步。
是的,请注意Beta写的内容。
另外,每当你找到你想要的东西时,你不应该突破循环吗?
答案 1 :(得分:1)
for (int i = 0; i < 1000; i++)
{
input >> linSearch[i];
这是一个好的开始。您开始循环以将1000个数字读入阵列。
for (i = 1000; i > 0; i--)
你觉得这有点不成熟吗?你尚未完成循环读取文件中的1000个数字,但是,你已经在搜索尚未完全读取的数组。这个逻辑错误有一个非常技术性的术语:“把车放在马前”。首先,您需要完成循环以读取1000个数字。只有这样你才能执行第二次循环。
{
if (find == linSearch[i])
好的,现在让我们稍微回顾一下。您使用i=1000
启动了循环。现在,就在这里,如果i
,第一个值是多少?这是1000.你不觉得这里有问题吗?如你所知,1000元素数组“linSearch”包含编号为0到999的值。总共1000个元素。当i
以值1000开始时,访问不存在的linSearch [1000]是未定义的行为,并且是一个错误。
你可以在这里调整逻辑,以使其正确。但它甚至没有必要这样做。您已经有一个完美的循环,可以从文件中读取1000个数字。并且您知道要搜索的号码。
因此,每次从文件中读取下一个数字时,如果它是您要查找的数字,您只需存储其位置即可。因此,当完成所有操作后,存储在该变量中的最后一个位置将是您要搜索的数字的最后一个位置。简单的逻辑。您所要做的就是设置一个标志,表示您找到的号码已被找到。
一旦你决定这样做,你会发现它不再需要首先拥有任何类型的数组。您所要做的就是从文件中读取1000个数字,一次读取一个数字,检查每个数字是否是您要搜索的数字,如果是,请保存其位置。然后,在循环结束时,比较注释。