2013-11-12 3 views
0

Я был бы очень признателен, если кто-то может указать мне в правильном направлении. За последние пару месяцев я изучаю C#, используя книгу Мураха C# 2013, это хорошая книга, однако вовремя она не имеет определенных деталей. Я работаю с массивами и, наконец, собираюсь с многомерными массивами, я написал простую логику, в которой многомерный массив объявляется и заполняется как (4x4) таблица умножения с использованием вложенных «For Loop», которые работают как ожидалось. Проблема в том, что теперь я пытаюсь найти заданное значение int внутри массива 2d, используя вложенный «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 
    } 
} 

спасибо.

+0

А что не работает? Он показывает некоторые результаты в текстовом поле? –

+0

Я понимаю, что 4x4 не большой стол, поэтому я увеличил его до 12x12. Я могу найти любое значение менее 10, и моя текущая логика показывает значение в таблице один раз. Так что скажем, если я ищу 12, я знаю, что 12 появляется больше, чем один раз, но моя логика показывает только, что он появляется только один раз в строках и столбцах. Спасибо. – Combustion007

ответ

2

Единственное, что мне не нравится, это использование GetUpperBound(0) для обеих строк и столбцов, так как вам просто повезло, что они оба 4. Если бы у вас были разные размеры для них, ваш код не удался.

Сказав, что использовать row и column вместо r & c.

Код выглядит так, как будто он должен работать ... Поместите контрольную точку в txtTable.AppendText..., чтобы узнать, есть ли ваша проблема с выходом или с логикой.

Edit: Это действительно выше ответ, с моими именами переменных и выходные изменения
Не upvote его за то, что права ответ, так как вы должны upvote ответа выше.

отредактированный для удобства чтения/лучшего использования имен переменных и четких результатов вывода:

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(); 
    } 
} 
+0

Это скорее комментарий, чем ответ. Вы не предлагаете никаких исправлений, но только предоставляете комментарии к обзору. –

+0

Это хорошая точка может использовать 'GetUpperBound (1)' для второго измерения, цикл столбцов. – user2586804

+0

Спасибо всем за ваш вход. @Noctis, я благодарю вас за то, что указал мне в правильном направлении. Все это теперь делает и чувствует и работает так, как ожидалось. – Combustion007

1

Есть несколько вопросов, с кодом:

  1. таблица умножения должен быть способ - это не будет компилироваться без подписи.
  2. Вам нужно избавиться от «перерыва» во внутреннем цикле - это предотвратит его правильную работу - он вырвется после первого раза.
  3. В методе searchForValue вы можете использовать multiTable как свой размер таблицы, а не умножатьTableArr.GetLength, поскольку он уже определен. Если вы используете multipicationTableArr.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)); 
     } 
    } 
} 
+0

Запуск кода на его 12x12 и ищет 12 возвращает этот массив: (0, 11) (1, 5) (2, 3) (3, 2) (5, 1) (11, 0) – Noctis

+0

Это кажется правильным! Эти клетки будут соответствовать 1 x 12, 2 x 6, 3 x 4, 4 x 3, 6 x 2 и 12 x 1. Все они равны 12. – Baldrick

+0

, что является правильным :). Я только что добавил результат, так как он обновил свой вопрос с 4 до 12. Я немного изменил его (имена переменных) и добавил к моему ответу (с большим Я НЕ ОРИГИНАЛЬНЫм жирным заголовком ...) надеюсь, что все в порядке с вами. – Noctis

Смежные вопросы