3662

Алгоритми роботи з багатомірними масивами

Лекция

Информатика, кибернетика и программирование

Алгоритми роботи з багатомірними масивами Поділ;масивів на одномірні і багатомірні носить історичний характер. Ніякої принципової різниці між ними немає. Одномірні масиви - це окремий випадок багатомірних. Можна говорити й по-іншому: багат...

Украинкский

2012-11-05

160.5 KB

26 чел.

Алгоритми роботи з багатомірними масивами

Поділ масивів на одномірні і багатомірні носить історичний характер. Ніякої принципової різниці між ними немає. Одномірні масиви - це окремий випадок багатомірних. Можна говорити й по-іншому: багатомірні масиви є природним узагальненням одномірних. Одномірні масиви дозволяють задавати такі математичні структури як вектори, двовимірні - матриці, тривимірні - куби даних, масиви більшої розмірності - багатомірні куби даних. При роботі з базами даних багатомірні куби, так названі куби OLAP, зустрічаються дуже часто.

У чому особливість оголошення багатомірного масиву? Як у типі вказати розмірність масиву? Це робиться досить просто, за рахунок використання ком. От як виглядає оголошення багатомірного масиву в загальному випадку:

<тип>[, ... ,] <об'явники>;

Число ком, збільшене на одиницю, і задає розмірність масиву. Що стосується об'явників, те все, що сказано для одномірних масивів, справедливо й для багатомірних. Можна лише відзначити, що хоча явна ініціалізація з використанням багатомірних константних масивів можлива, але застосовується рідко через громіздкість такої структури. Простіше ініціалізацію реалізувати програмно, але іноді вона все-таки застосовується. От приклад:

public void TestMultiArr()

{

  int[,]matrix = {{1,2},{3,4}};

  Arrs.PrintAr2("matrix", matrix);

}//TestMultiArr

Не зважаючи , що поділ на одновимірні та багатовимірні масиви часто умовний з точки зору структури даних , алгоритми роботи з двомірними масивами мають свою особливість. Ця особливість в тому, що ,частіше, для перебору елементів масиву використовується два цикли – зовнішній і вложений. При цьому кожна змінна циклу відповідає за номери стовпця і рядка.

Для доступу до елементу масиву вказується його ім'я й у квадратних дужках - індекси потрібного елемента. З елементом масиву можна працювати як зі звичайної змінної, тобто можна прочитати його значення або записати в нього нове значення. Приклади:

a[1,1] := 0;      елементу масиву a з індексом 1.1     привласнюється значення 0;

a[1,0] := a[1,0]*2;     елемент масиву a з індексом      1, 0 подвоюється.

В якості індексів елементів масиву можуть виступати цілі константи та цілі змінні. Використання цілих змінних дає можливість працювати з елементами масиву використовуючи цикли.

А1,1

А1,2

А1,3

А1,4

А1,5

А2,1

А2,2

А2,3

А2,4

А2,5

А3,1

А3,2

А3,3

А3,4

А3,5

А4,1

А4,2

А4,3

А4,4

А4,5

А5,1

А5,2

А5,3

А5,4

А5,5

Рис 12.1. Двовимірний масив.

Розглянемо приклад двовимірного масиву. Загальне імя масиву А. кількість елементів стовбця і рядків по  5. Якщо кількість рядків і стовпців співпадають – такі масиви називаються симетричними. Якщо ні - несиметричними. Перший індекс елемента масиву визначає номер  рядка, другий номер стовпця.

Серед класичних алгоритмів розглянемо наступні:

  •  алгоритм вводу масиву;
  •  алгоритм виводу масиву;
  •  алгоритм пошуку мінімального та максимального елементу;
  •  алгоритм  формування нового масиву за даними критеріями;

та інші.

Для симетричних масивів розрізняють поняття головної діагоналі. Це елементи у яких індекси рядка і стовпця співпадають:

А1,1

А2,2

А3,3

А4,4

А5,5

та побічної діагоналі

А1,5

А2,4

А3,3

А4,2

А5,1

Серед класичних алгоритмів роботи з симетричними масивами розглянемо наступні:

  •  алгоритм пошуку максимального елементу головної та другорядної діагоналі;
  •  алгоритм находження суми елементів , які знаходяться під головною діагоналлю;
  •  алгоритм находження суми елементів між головною і побічною діагоналлю;

та інші.

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

Лістинг 12.1.

       {

     int i = 0, j = 0; // об’явлення змінних

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine()); // введення кількості рядків

           Console.Write("М=");

           int m = Int32.Parse(Console.ReadLine()); // введення кількості стовпців

           int[,] mas = new int[n, m];//  оголошеня масиву

// Блок заповнення двовимірного масиву цілими числами введеними з клавіатури

           for (i = 0; i < n; i++) // початок циклу роботи з рядками

           {

               for (j = 0; j < n; j++) // початок циклу роботи зі стовпцями

               {

                   Console.Write("[" + (i) + "," + (j) + "]="); // вивід  позиції елементу, що вводиться

                   mas[i, j] = int.Parse(Console.ReadLine());// введення  елементу

               }

           }

// Блок пошуку максимального елементу масиву  

           int max = mas[0, 0], i1 = 0, j1 = 0;

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < n; j++)

               {

                   if (max < mas[i, j]) { max = mas[i, j]; i1 = i; j1 = j; }

               }

           }

// Вивід результатів роботи програми

Console.WriteLine("Найбільше число " +  max+ " знаходиться в "+ (i1+1) + "-му рядку." + (j1+1)+ "  стовпцю");

// Вивід мосиву

for (i = 0; i < n; i++)

           {

               for (j = 0; j < n; j++)

                   Console.Write(mas[i, j] + "  ");

               Console.WriteLine();

           }

           Console.ReadKey();

       }

   }

}

Як бачимо , в представленому алгоритмі можна виділити два стандартних блоки: ввід масиву, пошук максимального елементу, вивід масиву.

Приклад заповнення масиву випадковими числами:

Лістинг 12.2.

           for (i = 0; i < n; i++) // початок циклу роботи з рядками

           {

               for (j = 0; j < n; j++) // початок циклу роботи зі стовпцями

               {

                   mas[i, j] = r.Next(100);

               }   }

Приклад заповнення масиву розрахунком функції:

for (i = 0; i < n; i++) // початок циклу роботи з рядками

           {

               for (j = 0; j < n; j++) // початок циклу роботи зі стовпцями

               {

                   mas[i, j] = Math.Cos(i)+ Math.Sin(j);

               }

           }

Розглянемо приклад роботи алгоритму з симетричними масивами.

В симетричному масиві знайти суму чисел, які знаходяться нижче головної діагоналі.

А1,1

А1,2

А1,3

А1,4

А1,5

А2,1

А2,2

А2,3

А2,4

А2,5

А3,1

А3,2

А3,3

А3,4

А3,5

А4,1

А4,2

А4,3

А4,4

А4,5

А5,1

А5,2

А5,3

А5,4

А5,5

Якщо головна діагональ має однакові індекси то нам потрібно знайти суму елементів, які на рисунку жовті.

Лістинг 12.3.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication8

{

   class Program

   {

       static void Main(string[] args)

       {

           int n = int.Parse(Console.ReadLine());

           int[,] mas = new int[n+2,n+2];

           int i,j,sum=0;

           Random r = new Random();

            for (i = 1; i <= n + 1; i++)

               for (j = 1; j <= n + 1; j++)

                   mas[i, j] = r.Next(100);

           // блок підрахунку суми

for (i = 2; i <= n + 1; i++)

                for (j = 1; j <= i; j++)

                {

                    sum = sum + mas[i, j];

                }

            Console.WriteLine(sum);

     }

  }

}

Розглянемо задачу підрахунку суми елементів, які знаходяться вище побічної діагоналі.

А1,1

А1,2

А1,3

А1,4

А1,5

А2,1

А2,2

А2,3

А2,4

А2,5

А3,1

А3,2

А3,3

А3,4

А3,5

А4,1

А4,2

А4,3

А4,4

А4,5

А5,1

А5,2

А5,3

А5,4

А5,5

for (i = 1; i <= n; i++)

                 for (j = 1; j <= n-i; j++)

                {

                    sum = sum + mas[i, j];

                }

            Console.WriteLine(sum);

Ці задачі не складні. Основна дія  знаходження суми(  sum = sum + mas[i, j];) . А циклами необхідно задати ті значення змінних і,j , які нам вибирають необхідні елементи з масиву.

Давайте розглянемо класичне завдання множення прямокутних матриць. Нам знадобиться три динамічних масиви для подання матриць і три процедури, одна із яких буде заповнювати вихідні матриці випадковими числами, інша - виконувати множення матриць, третя - друкувати самі матриці. От тестовий приклад:

public void TestMultiMatr()

{

  int n1, m1, n2, m2,n3, m3;

  Ars.GetSizes("Matr",out n1,out m1);

  Arrs.GetSizes("Matr",out n2,out m2);

  Arrs.GetSizes("Matr",out n3,out m3);

  int[,]Matr = new int[n1,m1], Matr = new int[n2,m2];

  int[,]Matr = new int[n3,m3];

  Arrs.CreateTwoDimAr(Matr);Arrs.CreateTwoDimAr(Matr);

  Arrs.MultMatr(Matr, Matr, Matr);

  Arrs.PrintAr2("Matr",Matr); Arrs.PrintAr2("Matr",Matr);

  Arrs.PrintAr2("Matr",Matr);

}//TestMultiMatr

Три матриці - Matr, Matr й Matr - мають довільні розміри, що з'ясовують у діалозі з користувачем, і використання для їхнього опису динамічних масивів представляється зовсім природним. Метод CreateTwoDimAr заповнює випадковими числами елементи матриці, переданої йому як аргумент, метод PrintAr2 виводить матрицю на печать.

Метод MultMatr виконує множення прямокутних матриць. Це класичне завдання з набору завдань, розв'язуваних на першому курсі. От текст цього методу:

public void MultMatr(int[,]A, int[,]B, int[,]C)

{

  if (A.GetLength(1) != B.GetLength(0))

     Console.WriteLine("MultMatr: помилка розмірності!");

  else

     for(int i = 0; i < A.GetLength(0); i++)

        for(int j = 0; j < B.GetLength(1); j++)

        {

           int s=0;

           for(int k = 0; k < A.GetLength(1); k++)

              s+= A[i,k]*B[k,j];

           C[i,j] = s;

        }

}//MultMatr

В особливих коментарях ця процедура не має потреби. Перш ніж проводити обчислення, виробляється перевірка коректності розмірностей вихідних матриць при їхньому перемножуванні, - число стовпців першої матриці повинне бути рівим числу рядків другої матриці.

Зверніть увагу, як виглядають результати консольного виводу на даному етапі роботи (рис. 12.2).


Рис. 12.2  Множення матриць

Масиви масивів

Ще одним видом масивів C# є масиви масивів, названі також порізаними масивами (jagged arrays). Такий масив масивів можна розглядати як одномірний масив, елементи якого є масивами, елементи яких, у свою чергу, знову можуть бути масивами, і так може тривати до деякого рівня вкладеності.

У яких ситуаціях може виникати необхідність у таких структурах даних? Ці масиви можуть застосовуватися для подання дерев, у яких вузли можуть мати довільне число нащадків. Таким може бути, наприклад, генеалогічне дерево. Вершини першого рівня - Fathers, що представляють батьків, можуть задаватися одномірним масивом, так що Fathers[i] - це i-й батько. Вершини другого рівня представляються масивом масивів - Children, так що Children[i] - це масив дітей i-го батька, а Children[i][j] - це j-й дитина i-го батька. Для подання онуків знадобиться третій рівень, так що GrandChildren [i][j][k] буде представляти к-го онука j-го дитини i-го батька.

Є деякі особливості в оголошенні й ініціалізації таких масивів. Якщо при оголошенні типу багатомірних масивів для вказівки розмірності використалися коми, то для порізаних масивів застосовується більш зрозуміла символіка - сукупності пари квадратних дужок; наприклад, int[][] задає масив, елементи якого - одномірні масиви елементів типу int.

Складніше зі створенням самих масивів і їхньою ініціалізацією. Тут не можна викликати конструктор new int[3][5], оскільки він не задає порізаний масив. Фактично потрібно викликати конструктор для кожного масиву на самому нижньому рівні. У цьому й складається складність оголошення таких масивів. Почну з формального прикладу:

//масив масивів - формальний приклад

//оголошення й ініціалізація

int[][] jagger = new int[3][]

{

  new int[] {5,7,9,11},

  new int[] {2,8},

  new int[] {6,12,4}

};

Масив jagger має всього два рівні. Можна вважати, що в нього три елементи, кожний з яких є масивом. Для кожного такого масиву необхідно викликати конструктор new, щоб створити внутрішній масив. У даному прикладі елементи внутрішніх масивів одержують значення, будучи явно ініціалізовані константними масивами. Звичайно, припустиме й таке оголошення:

int[][] jagger1 = new int[3][]

{

  new int[4],

  new int[2],

  new int[3]

};

У цьому випадку елементи масиву одержать при ініціалізації нульові значення. Реальну ініціалізацію потрібно буде виконувати програмним шляхом. Варто помітити, що в конструкторі верхнього рівня константу 3 можна опустити й писати просто new int[][]. Саме забавне, що виклик цього конструктора можна взагалі опустити - він буде матися на увазі:

int[][] jagger2 =

{

  new int[4],

  new int[2],

  new int[3]

};

А от конструктори нижнього рівня необхідні. Ще одне важливе зауваження - динамічні масиви можливі й тут. У загальному випадку, границі на будь-якому рівні можуть бути вираженнями, що залежать від змінних. Більше того, припустимо, щоб масиви на нижньому рівні були багатомірними. Але це вже "від лукавого" - навряд чи варто користуватися такими складними структурами даних, адже з ними треба буде ще й працювати.

Приведу тепер ледве більше реальний приклад, що описує просте генеалогічне дерево, що умовно назву "батьки й діти":

//масив масивів -"Батьки й діти"

int Fcount =3;

string[] Fathers = new string[Fcount];

Fathers[0] ="Микола"; Fathers[1] = "Сергій";

  Fathers[2] = "Петро";

string[][] Children = new string[Fcount][];

Children[0] = new string[] {"Ольга", "Федір"};

Children[1] = new string[]

  {"Сергій","Валентина","Ира","Дмитро"};

Children[2] = new string[]{"Марія","Ирина","Надія"};

myar.PrintAr3(Fathers,Children);

Тут батьків описує звичайний динамічний одномірний масив Fathers. Для опису дітей цих батьків необхідний уже масив масивів, що також є динамічним на верхньому рівні, оскільки число його елементів збігається із числом елементів масиву Fathers. Тут показаний ще один спосіб створення таких масивів. Спочатку конструюється масив верхнього рівня, що містить посилання зі значенням void. А потім на нижньому рівні конструктор створює дійсні масиви в динамічній пам'яті, з якими й зв'язуються посилання.

Я не буду демонструвати роботу з генеалогічним деревом, обмежуся лише печатанням цього масиву. Тут є кілька повчальних моментів. У класі Array для печатання масиву створений спеціальний метод PrintAr3, якому як аргументи передаються масиви Fathers й Children. От текст даної процедури:

public void PrintAr3(string [] Fathers, string[][] Children)

{

  for(int i = 0; i < Fathers.Length; i++)

  {

     Console.WriteLine("Батько : {0}; Його діти:", Fathers[i]);

     for(int j = 0; j < Children[i].Length; j++)

        Console.Write( Children[i][j] + " ");

     Console.WriteLine();

  }

}//PrintAr3

Приведу деякі коментарі до цієї процедури:

  •  Зовнішній цикл організований по числу елементів масиву Fathers. Помітьте, тут використається властивість Length, на відміну від раніше застосовуваного методу GetLength.
  •  У цьому циклі з тим же успіхом можна було б використати й ім'я масиву Children. Властивість Length для нього повертає число елементів верхнього рівня, що збігає, як уже говорилося, із числом елементів масиву Fathers.
  •  У внутрішньому циклі властивість Length викликається для кожного елементу Children[i], що є масивом.
  •  Інші деталі, сподіваюся, зрозумілі.

Приведу вивід, отриманий у результаті роботи процедури PrintAr3.


Рис. 12. 3 Дерево "Батьки й діти"

В наданих задачах виділіть стандартні блоки та проаналізуйте їх роботу.

Задача 12.1. Дано довільний двомірний масив, парні рядки розмістити  по зростанню, непарні по спаданню.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _28

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.Write("N=");

           int n=Int32.Parse(Console.ReadLine());

           Console.Write("M=");

           int m = Int32.Parse(Console.ReadLine());

           int i = 0, j = 0,max=0,f=1,t=0;

           int[,] mas=new int[n,m];

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

               {

                   Console.Write("[" + i + "," + j + "]=");

                   mas[i, j] = Int32.Parse(Console.ReadLine());

               }

           }

           for (i = 0; i < n; i+=2)

           {

                f = 1;

                  while (f == 1)

                   {

                       f = 0;

                       for (j = 1; j < m; j++)

                       {

                           if (mas[i, j] < mas[i, j - 1]) { t = mas[i, j]; mas[i, j] = mas[i, j - 1]; mas[i, j - 1] = t; }

                       }

                   }

           }

           for (i = 1; i < n; i += 2)

           {

               f = 1;

               while (f == 1)

               {

                   f = 0;

                   for (j = 1; j < m; j++)

                   {

                       if (mas[i, j] > mas[i, j - 1]) { t = mas[i, j]; mas[i, j] = mas[i, j - 1]; mas[i, j - 1] = t; }

                   }

               }

           }

           for (i = 0; i < n; i++)

           {       for (j = 0; j < m; j++)

                   Console.Write(" " + mas[i, j]);

           Console.WriteLine();

           }

           Console.ReadKey();

       }

   }

}

Задача 12.2. Дано довільний двомірний масив, парні  рядки поміняти місцями  з непарними.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _29

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine());

           Console.Write("M=");

           int m = Int32.Parse(Console.ReadLine());

           int i = 0, j = 0,t=0;

           int[,] mas = new int[n, m];

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

               {

                   Console.Write("[" + i + "," + j + "]=");

                   mas[i, j] = Int32.Parse(Console.ReadLine());

               }

           }

           for (i = 1; i < n; i+=2)

           {

               for (j = 0; j < m; j++)

               {

                   t = mas[i - 1, j];

                   mas[i - 1, j] = mas[i, j];

                   mas[i, j] = t;

               }

           }

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

                   Console.Write(" " + mas[i, j]);

               Console.WriteLine();

           }

           Console.ReadKey();

       }

   }

}

Задача 12.3. Дано довільний двомірний масив, видалити рядок і стовпчик де знаходиться максимальний елемент масиву.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _30

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine());

           Console.Write("M=");

           int m = Int32.Parse(Console.ReadLine());

           int i = 0, j = 0, ms=0, mr=0, i1=0,j1=0, f;

           int[,] mas = new int[n, m];

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

               {

                   Console.Write("[" + (i+1) + "," + (j+1) + "]=");

                   mas[i, j] = Int32.Parse(Console.ReadLine());

               }

           }

           for (i = 0; i < n; i++)

           {

               f = 1; mr=mas[i, 0];

               while (f == 1)

               {

                   f = 0;

                   for (j = 1; j < m; j++)

                   {

                       if (mr < mas[i, j]) { mr = mas[i, j]; i1 = i; }

                   }

               }

           }

           for (j = 0; j < n; j++)

           {

               f = 1; ms = mas[0, j];

               while (f == 1)

               {

                   f = 0;

                   for (i = 1; i < m; i++)

                   {

                       if (ms < mas[i, j]) { ms = mas[i, j]; j1 = i; }

                   }

               }

           }

           for (i = 0; i < n; i++)

           {

               if (i == i1) continue;

               for (j = 0; j < m; j++)

               {

                   if (j == j1) continue;

                   Console.Write(" " + mas[i, j]);

               }

               Console.WriteLine();

           }

           Console.ReadKey();

       }

   }

}

Задача 12.4. Дано двомірний масив розмірністю N-M, знайти суму рядка і стовпчика на перетинанні яких знаходиться максимальний елемент масиву.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _31

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine());

           Console.Write("M=");

           int m = Int32.Parse(Console.ReadLine());

           int i = 0, j = 0, ms = 0, mr = 0, i1 = 0, j1 = 0, f;

           int[,] mas = new int[n, m];

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

               {

                   Console.Write("[" + (i + 1) + "," + (j + 1) + "]=");

                   mas[i, j] = Int32.Parse(Console.ReadLine());

               }

           }

           mr = mas[0, 0];

           for (i = 0; i < n; i++)

           {

               f = 1;

               while (f == 1)

               {

                   f = 0;

                   for (j = 1; j < m; j++)

                   {

                       if (mr < mas[i, j]) { mr = mas[i, j]; i1 = i; }

                   }

               }

           }

           ms = mas[0, 0];

           for (j = 0; j < n; j++)

           {

               f = 1;

               while (f == 1)

               {

                   f = 0;

                   for (i = 1; i < m; i++)

                   {

                       if (ms < mas[i, j]) { ms = mas[i, j]; j1 = i; }

                   }

               }

           }

           int sums = 0, sumr = 0;

           Console.WriteLine(i1+" "+j1);

           for (i = 0; i < n; i++)

           {

               sums += mas[i, j1];

               for (j = 0; j < m; j++)

                   Console.Write(" " + mas[i, j]);

               Console.WriteLine();

           }

           for (j=0;j<m;j++)

           sumr += mas[i1, j];

           Console.WriteLine("Сума рядка="+sumr);

           Console.WriteLine("Сума стовбчика="+sums);

           Console.ReadKey();

       }

   }

}

Задача 12.5. Дано двомірний масив розмірністю N-N, знайти суму рядка і стовпчика на перетинанні яких знаходиться максимальний елемент другорядної діагоналі.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace _32

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine());

           int m = n;

           int i = 0, j = 0, i1 = 0, j1 = 0;

           int[,] mas = new int[n, m];

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

               {

                   Console.Write("[" + (i + 1) + "," + (j + 1) + "]=");

                   mas[i, j] = Int32.Parse(Console.ReadLine());

               }

           }

           int max = mas[0, 0];

           for (i = 1; i < n; i++)

           {

               if (max < mas[i - 1, i]) { max = mas[i - 1, i]; i1 = i - 1; j = 1; }

           }

           int sums = 0, sumr = 0;

           Console.WriteLine(i1 + " " + j1);

           for (i = 0; i < n; i++)

           {

               sums += mas[i, j1];

               for (j = 0; j < m; j++)

                   Console.Write(" " + mas[i, j]);

               Console.WriteLine();

           }

           for (j = 0; j < m; j++)

               sumr += mas[i1, j];

           Console.WriteLine("Сума рядка=" + sumr);

           Console.WriteLine("Сума стовбчика=" + sums);

           Console.ReadKey();

           Console.ReadKey();

       }

   }

}

Задача 12.6. Дано двомірний масив розмірністю N-M, перетворити його в одномірний.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication6

{

   class Program

   {

       static void Main(string[] args)

       {

           int i = 0, j = 0, k=0; // об’явлення змінних

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine()); // введення кількості рядків

           Console.Write("М=");

           int m = Int32.Parse(Console.ReadLine()); // введення кількості стовпців

           Random r = new Random();

           int[,] mas = new int[n+1, m+1];//  оголошеня масиву

           int l = 0;

           l = n * m;

           int[] mas1 = new int[l+1];

           for (i = 0; i < n; i++) // початок циклу роботи з рядками

           {

               for (j = 0; j < m; j++) // початок циклу роботи зі стовпцями

               {

                   mas[i, j] = r.Next(100);

               }

           }

           for (i = 0; i < n; i++)

           {

               for (j = 0; j < m; j++)

               {

                   k++; mas1[k] = mas[i, j];

               }

           }

               

               for (i = 1; i < n*m; i++)

             Console.Write(mas1[i] + " ");

               Console.WriteLine();

          }

   }  

   }

Задача 12.7. Заповнити двомірний масив N-N по спіралі числами 1.2.3.4.5..

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication7

{

   class Program

   {

       static void Main(string[] args)

       {

           int i = 0, j = 0; // об’явлення змінних

           Console.Write("N=");

           int n = Int32.Parse(Console.ReadLine()); // введення кількості рядків

           int[,] mas = new int[n + 1, n + 1];//  оголошеня масиву

           int l = 0, k = 0;

           while (l < n * n)

           {

               // заповнення верхнього ряду зліва направо

           k = k + 1;

               i = k;

               for (j = k; j <= n - k + 1; j++)

               {

                   l = l + 1;

                   mas[i, j] = l;

               }

               // заповнення правого стовпця зверху вниз

          j = n - k + 1;

               for (i = k + 1; i <= n - k + 1; i++)

               {

                   l = l + 1;

                   mas[i, j] = l;

               }

               // заповнення нижнього ряду зправа наліво

          i = n - k + 1;

               for (j = n - k; j >= k; j--)

               {

                   l = l + 1;

                   mas[i, j] = l;

               }

               // заповнення лівого стовпця зверху вниз

          j = k;

               for (i = n - k; i >= k + 1; i--)

               {

                   l = l + 1;

                   mas[i, j] = l;

               }

               // вивід заповненого кільця для перевірки

               for (i = 1; i <= n; i++)

               {

                   for (j = 1; j <= n; j++)

                       Console.Write(mas[i, j] + " ");

                   Console.WriteLine();

               }

               Console.ReadLine();

           }

           // вивід результату роботи програми

               for (i = 1; i <= n; i++)

               {

                   for (j = 1; j <= n; j++)

                       Console.Write(mas[i, j] + " ");

                   Console.WriteLine();

               }

        }

   }

}

Проаналізуйте наведені задачі, перевірте їх працездатність в середовищі програмування.  


 

А также другие работы, которые могут Вас заинтересовать

39627. Проектирование шестиэтажного здания с цокольный этажом, техническим чердаком и подвалом 1.69 MB
  Вначале определяем перечень работ подготовительного периода. Для упрощения состава подготовительных работ в номенклатуру вносим укрупненную строку «Внутриплощадочные работы». Далее выделяем следующие работы: срезку растительного слоя; вертикальную планировку поверхности; разработку грунта в отвал и транспорт с дальнейшим добором вручную.
39628. УСТАНОВКА (АТТИТЮД) 44 KB
  В российской психологии разработка общепсихологической теории установки принадлежит Д. Объектом для установки может быть все на что реагирует человек: любой символ фраза лозунг лицо учреждение идея. Можно иметь установки в отношении определенной профессии Организации Объединенных Наций политической партии книги национального меньшинства марки стирального порошка блондинок и т. Новорожденный ребенок имеет установки лишь относительно тех стимулов на которые существует врожденная реакция удовольствие или боль.
39629. Требования и порядок создания информационно-развлекательной системы «Развлекательный портал» 9.07 MB
  Порядок оформления работы Стадии: Техническое задание а Обоснование перспективности реализуемого проекта: постановка задачи; сбор базовых материалов; установка критериев системы; необходимость проведения исследовательских работ; b Исследовательская работа: выбор оптимальных методов решения поставленной задачи; определение требований к техническим средствам; обоснование практической возможности реализации данного проекта; в Разработка и утверждение технического задания: определение требований к проекту; ...
39630. КОНСПЕКТ ЛЕКЦИЙ ПО ОСНОВАМ ОХРАНЫ ТРУДА 3.04 MB
  В соответствии с этой статьёй государство даёт гарантии каждому своему гражданину на надлежащие безопасные и здоровые условия труда и на заработную плату не ниже той которая определена законом. Таким образом в Конституции за государством закреплена забота об условиях труда его научной организации и это является одним из основных направлений его политики. Проблемами связанными с обеспечением здоровых и безопасных условий труда занимается охрана труда.
39631. Расчет газотурбинной установки мощностью 16 МВт 1.06 MB
  темы спроектирован регулируемый сопловой аппарат свободной силовой турбины найдены зависимости различных параметров при повороте сопловых лопаток. Также дипломный проект включает в себя: расчет тепловой схемы двигателя с последующим выбором Gв и к0 газодинамический расчет турбин по среднему диаметру расчет закона закрутки всех ступеней турбины высокого давления и силовой турбины расчеты на прочность рабочей лопатки 3й ступени силовой турбины технологию эксплуатации ГПА описание конструктивных особенностей экономическую частьрасчет...
39632. Компрессор высокого давления турбореактивного двухконтурного двигателя тягой 140 кН 1.65 MB
  Цели работы: ‒ разработка конструкции КВД; ‒ расчет на прочность и колебания основных элементов компрессора; ‒ в технологической части выполнить расчеты режимов резания для одной операции; ‒ в экономическом разделе рассчитать себестоимость затрат на проектирование промежуточного диска КВД; ‒ в разделе по безопасности жизнедеятельности провести оценку безопасности жизнедеятельности пассажиров самолета путем надежности и отказобезопасности КВД. В работе проведен сравнительный анализ конструкций КВД двигателей класса тяги 1218 тонн выбрана...
39633. Горные и маркшейдерские работы при строительстве тоннеля №3 Адлер-горноклиматический курорт «Альпика-Сервис» 21.63 MB
  Маркшейдерская служба призвана заниматься съёмками на земной поверхности и в горных выработках с целью изображения их на чертежах, а также для решения различных горно-геометрических задач, возникающих при освоении месторождения.
39634. Сайт бесплатных объявлений и рекламы 13.12 MB
  Задачей данной работы является реализация размещения объявлений и рекламы, используя Интернет. Структура интерфейса электронной доски объявлений должна быть понятна для обычного пользователя, в то же время необходимо позаботиться об наборе функциональных средств, обеспечивающих удобство работы с набором объявлений
39635. Особенности проведения аварийно-спасательных работ в учреждениях образования на примере Полоцкого государственного университета по адресу г. Полоцк ул. Стрелецкая д.4 305.28 KB
  Боевой участок участок на котором сосредоточены силы и средства объединенные конкретной задачей по тушению пожара. Зона теплового воздействия пожара прилегающая к зоне горения часть пространства в пределах которой протекают процессы теплообмена между поверхностью пламени и окружающей средой. Локализация пожара прекращение дальнейшего распространения пожара и создание условий для его успешной ликвидации имеющимися силами и средствами [3]. Ликвидация пожара прекращение горения на пожаре создание условий при которых нет...