0

如果有人能指出我正确的方向,我将不胜感激。在过去的几个月里,我一直在使用 Murach 的 C# 2013 书学习 C#,这是一本好书,但是有时它缺乏某些细节。我一直在使用数组,最后开始使用多维数组,我编写了一个简单的逻辑,其中使用嵌套的“For Loop”将多维数组声明并填充为(4x4)乘法表,该表按预期工作。问题是我现在正在尝试通过使用嵌套的“For Loop”在二维数组中搜索给定的 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
    }
}

谢谢你。

4

2 回答 2

2

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

话虽如此,使用rowandcolumn而不是r& 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();
    }
}
于 2013-11-12T08:43:00.830 回答
1

代码有几个问题:

  1. MultiplicationTable 必须是一种方法 - 没有签名就无法编译
  2. 您需要摆脱内部循环中的“中断” - 这将阻止它正常运行 - 它会在第一次通过后中断。
  3. 在您的 searchForValue 方法中,您可以使用 multiTable 作为您的表维度,而不是 multiplicationTableArr.GetLength,因为它已经定义了。如果您确实使用 multiplicationTableArr.GetLength,请确保添加 1,否则它将在最后一行/列之前停止。
  4. 您实际上需要调用 MultiplicationTable 来填充表格。您可以从类构造函数中执行此操作。

这是您的代码的控制台应用程序版本,上面应用了更正。

搜索 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));
        }
    }
}
于 2013-11-12T08:52:41.040 回答