不需要的输出重复和矩阵搜索问题

问题描述:

此代码尝试在硬编码值的5x5矩阵中搜索目标值(项目)。它向用户查询要搜索的值。问题是,当我运行代码时,它会告诉我“发现项目!”不管用户输入。此外,它似乎在重复用户输入。例如,当我使用“87”作为用户输入时,这是我的输出:不需要的输出重复和矩阵搜索问题

您希望搜索什么值? 878787找到了!

我对C++相当陌生,所以原谅我,如果我做了一些愚蠢的事情。代码如下:

#include <iostream> 
#include <algorithm> 
#include <array> 

using namespace std; 

int main() 
{ 
    int target; 
    int flag; 
    int mat[5][5]= //hardcoded the matrix data 
    { 
     {1,2,3,4,5}, 
     {6,7,8,9,10}, 
     {11,12,13,14,15}, 
     {16,17,18,19,20}, 
     {21,22,23,24,25} 
    }; 

    cout<<"What is the value you'd like to search for? "; 
    cin>>target; 

    for(int x=0;x<5;x++) 
    { 
     for(int y=0;y<5;y++) 
     { 
      if (mat[x][y]==target) 
      { 
       flag=1; 
       break; 
      } 
      else 
      { 
       //do nothing 
      } 
     } 
    } 
    if(flag == 1) 
    { 
     cout<<"Item found!"; 
    } 
    else 
    { 
     cout<<"Item not found."; 
    } 

    return 0; 
} 
+2

你for循环中的所有' NathanOliver

+0

正如Nathan指出的那样,您正在对阵列进行无效访问。可能发生的情况是,程序正在读取其中一个访问中的'target'变量,因此总是“找到该项目”。顺便说一下,你的'break'语句只能从内部循环中出来,而不能从外部循环中出来。所以通过每次迭代设置'flag = 0',即使你修复了Nathan指出的问题,你仍然会遇到问题。 – aslg

+0

你可以失去其他部分,也不需要将标志设为0 –

正如他的评论你打破只有你的内循环中提到aslg,你需要喙外for(int x=0;x<5;x++)循环为好。你可以在内部循环之后做如下说明:

if(flag==0){ 
    break; 
} 

但是,这不是一个特别优雅的解决方案。我建议你让标准库来完成这项工作。

int* end = mat[0]+25; 
int* found = std::find(mat[0],end,target); 

if(found!=end) 
{ 
    cout<<"Item found!"; 
} 
else 
{ 
    cout<<"Item not found."; 
} 

请告诉我这里发生了:实际上静态多维5x5的阵列被存储为尺寸25。mat[0]指向其开始和mat[0] + 25到其端部的一维阵列。 std::find(start,end,target)返回指向目标的指针,如果它可以在[开始,结束[]内找到,否则返回end