C ++在线性搜索中查找最后一次出现的int
C++ Finding the last occurrence of an int in a linear search
这周的作业 我的任务是加载一个包含 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;
}
既然是作业,我至少应该说得模糊一点,绝对不应该使用代码。
您不应将第二个循环嵌套在第一个循环中。它的缩进级别应与第一个循环的右括号之后相同。
另外,几乎在所有情况下,您都不应搜索回 0,而应搜索到您在线性搜索中找到该元素的位置,或者您找到它的位置,而不是进一步搜索。
是的,请注意 Beta 写的内容。
此外,每次找到您要查找的内容时,您不应该跳出循环吗?
for (int i = 0; i < 1000; i++)
{
input >> linSearch[i];
这是一个好的开始。您启动了一个循环以将 1000 个数字读入您的数组。
for (i = 1000; i > 0; i--)
你不觉得这有点为时过早吗?您尚未完成读取文件中 1000 个数字的循环,并且您已经在搜索尚未完全读取的数组。这个逻辑错误有一个非常专业的术语:"putting the cart before the horse"。首先,您需要完成循环才能读取 1000 个数字。只有这样你才能执行第二个循环。
{
if (find == linSearch[i])
好的,现在让我们回顾一下。您使用 i=1000
开始循环。现在,就在这里,如果 i
的第一个值是多少?是 1000。你没看出这里有问题吗?如您所知,1000 个元素的数组 "linSearch" 包含编号为 0 到 999 的值。总共有 1000 个元素。 i
从值 1000 开始,访问不存在的 linSearch[1000] 是未定义的行为,并且是一个错误。
您可以调整此处的逻辑,使其正确。但甚至没有必要这样做。您已经有了一个完美的工作循环,可以从文件中读取 1000 个数字。而且您知道要搜索哪个号码。
因此,每次您从文件中读取下一个数字时,如果它是您要查找的数字,您只需存储它的位置。因此,总而言之,存储在该变量中的最后位置将是您要搜索的数字最后一次出现的位置。简单的逻辑。您所要做的就是设置一个标志,表示您正在搜索的号码已找到。
一旦您决定这样做,您会发现一开始甚至不再需要任何类型的数组。您所要做的就是从文件中读取 1000 个数字,一次一个数字,检查每个数字是否是您要搜索的数字,如果是,则保存其位置。然后,在循环结束时,比较笔记。
这周的作业 我的任务是加载一个包含 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;
}
既然是作业,我至少应该说得模糊一点,绝对不应该使用代码。
您不应将第二个循环嵌套在第一个循环中。它的缩进级别应与第一个循环的右括号之后相同。
另外,几乎在所有情况下,您都不应搜索回 0,而应搜索到您在线性搜索中找到该元素的位置,或者您找到它的位置,而不是进一步搜索。
是的,请注意 Beta 写的内容。
此外,每次找到您要查找的内容时,您不应该跳出循环吗?
for (int i = 0; i < 1000; i++)
{
input >> linSearch[i];
这是一个好的开始。您启动了一个循环以将 1000 个数字读入您的数组。
for (i = 1000; i > 0; i--)
你不觉得这有点为时过早吗?您尚未完成读取文件中 1000 个数字的循环,并且您已经在搜索尚未完全读取的数组。这个逻辑错误有一个非常专业的术语:"putting the cart before the horse"。首先,您需要完成循环才能读取 1000 个数字。只有这样你才能执行第二个循环。
{
if (find == linSearch[i])
好的,现在让我们回顾一下。您使用 i=1000
开始循环。现在,就在这里,如果 i
的第一个值是多少?是 1000。你没看出这里有问题吗?如您所知,1000 个元素的数组 "linSearch" 包含编号为 0 到 999 的值。总共有 1000 个元素。 i
从值 1000 开始,访问不存在的 linSearch[1000] 是未定义的行为,并且是一个错误。
您可以调整此处的逻辑,使其正确。但甚至没有必要这样做。您已经有了一个完美的工作循环,可以从文件中读取 1000 个数字。而且您知道要搜索哪个号码。
因此,每次您从文件中读取下一个数字时,如果它是您要查找的数字,您只需存储它的位置。因此,总而言之,存储在该变量中的最后位置将是您要搜索的数字最后一次出现的位置。简单的逻辑。您所要做的就是设置一个标志,表示您正在搜索的号码已找到。
一旦您决定这样做,您会发现一开始甚至不再需要任何类型的数组。您所要做的就是从文件中读取 1000 个数字,一次一个数字,检查每个数字是否是您要搜索的数字,如果是,则保存其位置。然后,在循环结束时,比较笔记。