3662

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

Лекция

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

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

Украинкский

2012-11-05

160.5 KB

25 чел.

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

Поділ масивів на одномірні і багатомірні носить історичний характер. Ніякої принципової різниці між ними немає. Одномірні масиви - це окремий випадок багатомірних. Можна говорити й по-іншому: багатомірні масиви є природним узагальненням одномірних. Одномірні масиви дозволяють задавати такі математичні структури як вектори, двовимірні - матриці, тривимірні - куби даних, масиви більшої розмірності - багатомірні куби даних. При роботі з базами даних багатомірні куби, так названі куби 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();

               }

        }

   }

}

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


 

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

37491. Философия: Учебник. 4.63 MB
  ru Рецензенты: кафедра социальной философии Российского университета Дружбы народов им. редактора журнала Вопросы философии доктор филос. Учебник содержит изложение истории философии и рассмотрение ее основных областей. При этом многие вопросы входящие в вузовский курс философии освещены достаточно подробно что позволит студентам и преподавателям специализированных вузов углубленно изучить философские проблемы применительно к своей специальности.
37492. ФИЛОСОФИЯ КУЛЬТУРЫ. Становление и развитие 2.07 MB
  На протяжении всей истории философская мысль обсуждала проблему фундаментального различия между тем, что существует независимо от человека — миром, природой, натурой и тем, что создано человеком как во внешнем, так и в собственном, физическом и духовном, бытии. Уже в древнегреческой философии зародились представления о «техне» как искусной практической деятельности, мастерстве, создающем необходимый человеку предметный мир (отсюда понятие «техника» во всех европейских языках)
37493. Философия педагогики. Учебное пособие для вузов 1.06 MB
  Она лаконично излагает системную суть философии культурологии психологии религиоведения развернуто дает этическую и эстетическую системы знаний в их неотрывной и прямой значимости для педагогической практики параллельно освещая проблемы образования и реальной жизни школы с установкой на их действительное и творческое решение. Философские аспекты образования и воспитания Философия как наука о всеобщих закономерностях жизни и мира является опорой для всех наук в познании изучаемых ими частных закономерностей это же касается педагогики....
37494. Философия Рене Декарта 32 KB
  Декарт сформулировал четыре правила: признавать истинными только ясные и отчетливые положения; расчленять сложную проблему на более простые менее сложные задачи; постепенно переходить от доказанного и известного к недоказанному и неизвестному; не допускать никаких пробелов в логической цепочке рассуждений. На это Декарт отвечал что нельзя полагаться на очевидность наших чувств как это делают эмпирики. Декарт пробует на самоочевидность тезисы о бытии мира Бога и нашего Я.
37495. Конспект лекций по курсу «Философия» для студентов заочной формы обучения 1.33 MB
  Философия как форма мировоззрения ее роль в жизни общества и человека. Бытие человека. В этой ситуации проблемы мировоззренческой ориентации человека осознание им своего места и роли в обществе цели и смысла социальной и личной активности ответственности за свои поступки и выбор форм и направлений своей деятельности становятся главными жизненными ценностями. В становлении и формировании мировоззренческой культуры человека философия всегда играла особую роль связанную с ее многовековым опытом...
37496. Философия. Учебник для вузов. В. В. Миронова 3.74 MB
  Природа человека. Происхождение человека и уникальность его бытия. Природа сущность и существование человека. Смысл жизни и назначение человека.
37497. Основные философские учения 1.95 MB
  Религиозноидеалистическая картина мира: эволюционный космизм тема 12 Природа человека и смысл его существования 12. Проблемы методологии научного познания в позитивизме и неопозитивизме тема 15 Современный философский иррационализм: решение проблем бытия познания человека и личности в различных школах и течениях 15. Вовторых мы считаем мудрым того кто способен познать трудное и нелегко постижимое для человека ведь воспринимание чувствами свойственно всем а потому это легко и ничего мудрого в этом нет. Но пожалуй труднее всего...
37498. ФИЛОСОФИЯ, ЛИТЕРАТУРА И ВОЕННАЯ СЛУЖБА. (отражение философских идей в литературно-художественном творчестве и военно-профессиональной деятельности офицера-ракетчика) 1.71 MB
  Сегодня к сожалению не так часто можно увидеть человека читающего книгу тем более философского содержания в транспорте на отдыхе Молодежь предпочитает иные источники информации электронные носители интернет плейеры айфоны забывая известную мудрость что всякое новое – хорошо забытое старое Свободный доступ к информации восприятие истины на веру без труда целенаправленное зомбироание сознания нового поколения поверхностное знание объективной реальности основанные на трафаретах клише массовой поликультуре порождают...
37499. Религиозная философия 46 KB
  Русская религиозная философия ориентирует человека на 1.становления человека 4.социализации человека 4.Гуманизм представляет собой философскую идею о томчто смысл бытия человекаэто 1.