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();

               }

        }

   }

}

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


 

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

26083. Государственное регулирование экономики: необходимость, сущность, объекты, цели, методы 31 KB
  Особая роль государства в развитии аграрной сферы объективно обусловлена рядом причин. Таким образом активная аграрная политика государства является необходимым условием нормального развития сельского хозяйства в любой стране. Из этой главной двуединой задачи государства в области сельского хозяйства вытекает целый ряд более конкретных задач которые также носят долговременный стратегический характер: содействие научнотехническому прогрессу и росту эффективности производства в сельском хозяйстве; поддержание эквивалентности в...
26084. Органы управления финансами в Российской Федерации 64.5 KB
  Депутаты обеих палат Федерального Собрания Российской Федерации рассматривающие и утверждающие проект закона о федеральном бюджете и отчете о его исполнении другие финансовые и связанные с ними законодательные акты правительственные программы могут обладая правом законодательной инициативы вносить на рассмотрение проекты финансовых законодательных актов поправки в действующее законодательство. Государственная Дума заслушивает отчет Правительства Российской Федерации об исполнении федерального бюджета. Государственная Дума и Совет...
26085. Структура государственных органов управления финансами в РФ 47 KB
  Именно эти органы принимают окончательное решение при утверждении федерального бюджета и отчета о его исполнении. На Министерство финансов возложены следующие задачи: 1 разработка и реализация единой государственной финансовой политики; 2 составление проекта и исполнение федерального бюджета; 3 осуществление финансового контроля за рациональным и целевым расходованием бюджетных средств и средств федеральных внебюджетных фондов; 4 обеспечение устойчивости государственных финансов и осуществление мер по развитию финансового рынка Основными...
26086. Порядок исчисления и уплаты ЕСХН 45.5 KB
  При определении объекта налогообложения налогоплательщики уменьшают полученные ими доходы на следующие расходы: 1 расходы на приобретение сооружение и изготовление основных средств а также на достройку дооборудование реконструкцию модернизацию и техническое перевооружение основных средств; 2 расходы на приобретение нематериальных активов создание нематериальных активов самим налогоплательщиком; 3 расходы на ремонт основных средств в том числе арендованных; 4 арендные в том числе лизинговые платежи за арендуемое в том числе...
26087. Культура и общество, Социальная культура 69.96 KB
  Место и роль культуры в обществе велики. Личность несет печать конкретной культуры и конкретного общества. Кроме того общество создает условия для массового использования ценностей культуры а следовательно порождает потребности в тиражировании и репродуцировании артефактов что в свою очередь превращается в процессы воспроизводства культуры. Понятно что вне общественных форм жизни эти особенности в развитии культуры были бы невозможны.
26088. Семиотическое измерение культуры 15.56 KB
  Явления культуры знаки и совокупность знаков тексты в которых зашифрована социальная информация т. В рамках семиотического подхода культура представляется как система коммуникаций обмена информацией а явления культуры рассматриваются как система знаков. Возможности понимания и трансляции культуры могут реализовываться с помощью различных знаковых систем или языков культуры: естественного языка фольклора традиций предметов быта охоты или другого вида деятельности ритуалов обрядов церемоний этикета типа жилища посредством...
26089. Динамика культуры 16.85 KB
  Законом общественного развития в том числе и законом развития культуры принято называть объективно существующую повторяющуюся необходимую существенную связь явлений общественной жизни или этапов исторического процесса.Вебер до отказа от признания закономерностей развития культуры например О. Кроме того позиции ученых различаются в зависимости от того какой масштаб действия законов развития культуры ими признается: или законы действуют в масштабах всего человечества так считают большинство исследователей За десять тысяч лет своего...
26090. Практикоориентированное освоение потенциала культуры 13.28 KB
  Экспертиза культуры также назначается по делам об экстремистской деятельности когда необходимо установить наличие или отсутствие на объекте фашистской символики пропаганды жестокости насилия вражды по отношению к определенной социальной религиозной национальной группе. Экспертиза памятников культуры проводится для охраны сохранения памятников при необходимости включении данных объектов в реестр объектов культурного наследия или установлении законности его сноса. Экспертиза памятников также актуальна по уголовным делам связанных с...
26091. Тело как феномен 17.04 KB
  Тело всегда наполняет наше сознание или сознание наполняет тело. Исходя из этого положения тело непрерывно выявляет процесс становления сознания. Именно тело является тем что сообщает миру бытие и обладать телом означает для живущего сращиваться с определенной средой сливаться воедино с определенными проектами и непрерывно в них углубляться поэтому тело должно рассматриваться не как объект мира но как средство нашего с ним сообщения.