这周的家庭作业 我的任务是加载一个包含 1,000 个数字的文本文件,并对用户输入的数字进行线性搜索。我已经完成了线性搜索部分,但我必须找到并打印该整数的最后一次出现。我认为最简单的方法是从末尾运行数组并打印最后一次出现并打破循环。我已经开始编写代码,但在查找最后一次出现时遇到了一些麻烦。
我知道我的第二个 for 循环 向后运行数组是错误的,我只是不确定它错在哪里。任何帮助表示赞赏!谢谢!
#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;
}
最佳答案
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 个数字,一次一个数字,检查每个数字是否是您要搜索的数字,如果是,则保存其位置。然后,在循环结束时,比较笔记。
关于C++在线性搜索中查找最后一次出现的int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40230302/