2015-12-24 9 views
0

Я некоторое время искал эту идею. Принятие массива с пробелами не является прямым в C#. Как мы принимаем массив 2d, размер которого задан пользователем? Я попробовал это, но что-то не так. Помощь очень ценится. Спасибо.Принятие матрицы «n x n» в C#

 Input: 
      4 
      1 2 3 4 
      2 3 4 5 
      3 4 5 6 
      4 5 6 7 

Если первая строка определяет значение «п» в «п х п»

Ну, код я попытался было это. Это может выглядеть глупо для некоторых из вас:

 string input; 
     string[] inputArray; 
     int[] inputInt; 

     int MxM = Convert.ToInt32(Console.ReadLine()); //MxM = First Line=n 
     int[,] array = new int[MxM, MxM]; 
     for (int i = 0; i < MxM; i++) 
     { 
      for (int j = 0; j < MxM; j++) 
      { 
       input = Console.ReadLine(); 
       inputArray = input.Split(' '); 
       inputInt = new int[MxM]; 
       for (int k = 0; k < MxM; k++) 
       { 
        inputInt[k] = int.Parse(inputArray[k]); 
        array[i, j] = inputInt[k]; 
       } 
      } 
     } 

Будем надеяться, что ответ на это также будет ответом на выход матрицы. Спасибо

+0

Как «что-то не так» выражает себя? – SBI

+0

Я думал, что логика правильная. И у меня нет ошибок сборки. Но вход не происходит. Cheers –

+0

Следует отметить, что самый внутренний 'for-loop' выполняет итерацию над' k gmiley

ответ

0

Если я понять, что вы хотите правильно:

Вы хотели бы принять вход N, в вашем примере 4, с этим - создать массив 4 х 4. Затем для каждого индекса в первом измерении попросите пользователя ввести значение, равное N, число целых чисел, разделенных пробелами. Прочитайте этот ввод и поместите его в массив с соответствующим 2d-индексом. Так с 4 как первый вход, то пользователю будет предложено что-то вроде:

Please input 4 integers(separated by spaces): 

Пользователь должен ввести, например:

Please input 4 integers(separated by spaces): 1 2 3 4 

и нажмите клавишу ВВОД ,Опять же пользователю предлагается:

Please input 4 integers(separated by spaces): 1 2 3 4 
Please input 4 integers(separated by spaces): 

И так далее, пока:

Please input 4 integers(separated by spaces): 1 2 3 4 
Please input 4 integers(separated by spaces): 2 3 4 5 
Please input 4 integers(separated by spaces): 3 4 5 6 
Please input 4 integers(separated by spaces): 4 5 6 7 

Вы могли бы использовать что-то вроде следующего в этом случае:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int size; 
     Console.WriteLine("Please enter the size of the matrix:"); 
     if (!int.TryParse(Console.ReadLine(), out size)) 
     { 
      Console.WriteLine("The value provided for the size was not a proper integer value."); 
      Console.WriteLine("Press ESC to quit..."); 
      while (Console.ReadKey().Key != ConsoleKey.Escape) { } 
      return; 
     } 

     int[,] matrix = new int[size, size]; 

     for (int i = 0; i < size; ++i) 
     { 
      bool complete = false; 
      while (!complete) 
      { 
       Console.WriteLine(string.Format("[{0}] - Please input {1} integers(separated by spaces):", i, size)); 
       string[] input = Console.ReadLine().Split(' '); 
       if (input.Count() != size) 
       { 
        Console.WriteLine("The input was invalid, try again..."); 
        continue; 
       } 
       for (int j = 0; j < size; ++j) 
       { 
        if (!int.TryParse(input[j], out matrix[i, j])) 
        { 
         complete = false; 
         Console.WriteLine("The input was invalid, try again..."); 
         break; 
        } 
        complete = true; 
       } 

      } 
     } 
     Console.WriteLine("Output: \n"); 
     WriteMatrix(matrix, size); 
     Console.ReadKey(); 
    } 

    private static void WriteMatrix(int[,] matrix, int size) 
    { 
     string output = string.Empty; 
     for(int i = 0; i < size; ++i) 
     { 
      string line = string.Empty; 
      for (int j = 0; j < size; ++j) 
       line += string.Format("{0} ", matrix[i, j]); 
      output += string.Format("{0}\n", line.Trim()); 
     } 
     Console.WriteLine(output); 
    } 

} 

T код выше должен быть в основном безопасным для пользователя, набирающего недопустимые значения, но вы, вероятно, потратите некоторое время, чтобы его очистить или улучшить. Основная идея есть.

+0

Отличная работа! Хотя я не хочу, чтобы он был слишком удобным для пользователя, это самое безопасное из них! Спасибо, что поделился. ура –

0

Вы можете попробовать использовать такой код:...

Console.ReadLine() Split() Выбрать (ул => Convert.ToInt32 (ул)) ToArray()

, чтобы получить массив int из строки.

Я думаю, вы поняли эту идею.

+0

Я понял это. его замена для 6 строк кода внутри двух для циклов. Но это не делает мой код успешным. Cheers –

1

Либо:

for (int i = 0; i < MxM; i++) 
    for (int j = 0; j < MxM; j++) 
    array[i, j] = Convert.ToInt32(Console.ReadLine()); 

или:

for (int i = 0; i < MxM; i++) 
{ 
    inputArray = Console.ReadLine().Split(' '); 
    for (int j = 0; j < MxM; j++) 
    array[i, j] = Convert.ToInt32(inputArray[j]); 
} 

, который, конечно, может потерпеть неудачу, если вы не входите в правильном формате.

+0

Ну второй работает точно! Спасибо. –

0
public static int[,] MatrixConstructor() 
{ 
    int N = Convert.ToInt32(Console.ReadLine()); 
    int[,] matrix = new int[N, N]; 
    for (int i = 0; i < N; i++) 
    { 
     String[] line = Console.ReadLine().Split(' '); 
     for (int j = 0; j < N; j++) 
     { 
      matrix[i,j] = Convert.ToInt32(line[j]); 
     } 
    } 

    return matrix; 
} 

Это соответствует вашим требованиям.

+0

Это, безусловно, работает. Cheers –

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