在多维数组中查找int值?

时间:2013-11-12 08:27:54

标签: c# multidimensional-array

如果有人能指出我正确的方向,我将非常感激。在过去的几个月里,我一直在使用Murach的C#2013书籍学习C#,这是一本好书,但是在时间上,它缺乏某些细节。我一直在使用Arrays并最终使用多维数组,我编写了一个简单的逻辑,其中声明了多维数组,并使用嵌套的“For Loop”填充为(4x4)乘法表,它按预期工作。问题是我现在试图通过使用嵌套的“For循环”来搜索2d数组中的给定int值,我想通过循环遍历所有行和列并使用它来获取其位置来找到int值数组索引。我已经待了几天,我在网上搜索但是找不到稳固的方向。

目标:一旦填充了乘法表,现在我想在所有列和行中找到“9”。

如果有人可以让我继续使用它会很棒。这是我的代码。

//CONSTANT ARRAY LENGTH
const int multiTable = 4;

//ARRAY
int [ , ] multiplicationTableArr = 
      new int[multiTable, multiTable];  // 4 x 4 table 

//MULTIPLICATION METHOD
private void MultiplicationTable
{
    int r; //ROW
    int c; //COLUMN
    int result;

    for (r = 0; r < multiplicationTableArr.GetUpperBound(0); r++)
    {
        //NESTED FOR LOOP
        for (c = 0; c < multiplicationTableArr.GetUpperBound(0); c++)
        {
            result = (r + 1) * (c + 1); 
            multiplicationTableArr[r, c] = result; 
            break;
        }//NESTED FOR LOOP ENDS
    }
}

// SEACHFORVALUE METHOD
private void seachForValue()
{
    int r; //ROW
    int c; //COLUMN
    int intSearchNumber;

    txtTable.Clear(); //clear the text box

    intSearchNumber = int.Parse(txtSearchNumber.Text); 

    for (r = 0; r < multiplicationTableArr.GetLength(0); r++)
    {
        for (c = 0; c < multiplicationTableArr.GetLength(1); c++)
        {
            if (intSearchNumber == multiplicationTableArr[r,c])
            {
                txtTable.AppendText(r + ", " + c.ToString());
            }
        }//NESTED FOR LOOP ENDS
    }
}

谢谢。

2 个答案:

答案 0 :(得分:2)

我不满意的一件事是对行和列使用GetUpperBound(0),因为你很幸运,他们都是4.如果你有不同的大小,你的代码会失败。

话虽如此,请使用rowcolumn代替r&amp; c

代码看起来应该可行......在txtTable.AppendText...中放置一个断点,看看你的问题是出现在输出中,还是出现在逻辑中。

编辑:这实际上是上面的答案,我的变量名称和输出更改
不要因为正确答案而赞成它,因为你应该提出上述答案。

编辑易于阅读/更好地使用变量名称,以及更清晰的输出结果:

internal class Program
{
    public static void Main(string[] args)
    {
        var test = new ConsoleTest();
        var v = test.seachForValue(12);
        Console.WriteLine(v);


        Console.ReadLine();
    }
}

public class ConsoleTest
{
    public ConsoleTest()
    {
        MultiplicationTable();
    }

    //CONSTANT ARRAY LENGTH
    public const int TableSize = 12;
    //ARRAY
    public int[,] multiplicationTableArr = new int[TableSize, TableSize];  


    //MULTIPLICATION METHOD
    // this will intialize your array to your multiplication table 
    private void MultiplicationTable()
    {
        for (int row = 0; row < TableSize; row++)
        {
            //NESTED FOR LOOP
            for (int column = 0; column < TableSize; column++)
            {
                multiplicationTableArr[row, column] = (row + 1) * (column + 1);
            }//NESTED FOR LOOP ENDS
        }
    }

    // SEACHFORVALUE METHOD
    public string seachForValue(int intSearchNumber)
    {
        var result = new StringBuilder();

        for (int row = 0; row < TableSize; row++)
        {
            for (int col = 0; col < TableSize; col++)
            {
                if (intSearchNumber == multiplicationTableArr[row, col])
                {
                    result.AppendLine("(" + row + ", " + col + ") -> " + (row + 1) + "*" + (col + 1 )+ "=" + intSearchNumber);
                }
            }//NESTED FOR LOOP ENDS
        }

        return result.ToString();
    }
}

答案 1 :(得分:1)

代码存在一些问题:

  1. MultiplicationTable需要是一种方法 - 它不会在没有签名的情况下进行编译
  2. 你需要摆脱“休息”。在内循环中 - 这将阻止它正常运行 - 它将在第一次通过后爆发。
  3. 在searchForValue方法中,您可以使用multiTable作为表维度,而不是multiplicationTableArr.GetLength,因为它已经定义了。如果您确实使用multiplicationTableArr.GetLength,请确保添加1,否则它将停在最后一行/列之外。
  4. 您实际上需要调用MultiplicationTable来填充表格。您可以从类构造函数中执行此操作。
  5. 以下是您的代码的控制台应用版本,并对其应用了上述修正。

    搜索9,输出为:

    2, 2
    

    代码是:

    using System;
    
    namespace MultiplyTest
    {
        public class ConsoleTest
        {
            //CONSTANT ARRAY LENGTH
            public const int multiTable = 4;
            //ARRAY
            public int[,] multiplicationTableArr = new int[multiTable, multiTable];  // 4 x 4 table 
    
            public ConsoleTest()
            {
                MultiplicationTable();
            }
    
            //MULTIPLICATION METHOD
            private void MultiplicationTable()
            {
                for (int r = 0; r < multiTable; r++)
                {
                    //NESTED FOR LOOP
                    for (int c = 0; c < multiTable; c++)
                    {
                        multiplicationTableArr[r, c] = (r + 1) * (c + 1);
                    }//NESTED FOR LOOP ENDS
                }
            }
    
            // SEACHFORVALUE METHOD
            public string seachForValue(int intSearchNumber)
            {
                var result = string.Empty;
    
                for (int r = 0; r < multiTable; r++)
                {
                    for (int c = 0; c < multiTable; c++)
                    {
                        if (intSearchNumber == multiplicationTableArr[r, c])
                        {
                            result = result + r + ", " + c;
                        }
                    }//NESTED FOR LOOP ENDS
                }
    
                return result;
            }
        }
    
        internal class Program
        {
            public static void Main(string[] args)
            {
                var test = new ConsoleTest();
                Console.WriteLine(test.seachForValue(9));
            }
        }
    }