3662

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

Лекция

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

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

Украинкский

2012-11-05

160.5 KB

24 чел.

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

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

               }

        }

   }

}

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


 

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

75236. Семиотика. Типы и свойства знаков 30 KB
  Знаки имеют многочисленные классификации. Общепринятая система знаков: природные естественные знаки– корочка льда; знаки индексы – в библиотечном деле; знаки сигналы – звонок гудок: знаки символы ; языковые знаки. Все знаки можно изменять кроме языковых знаков. коммуникативность наивысшей степенью обладают естественные знаки.
75238. Классификация знаковых систем: примеры различных видов знаковых систем 46 KB
  Система объект в целом включающий в себя элементы их взаимосвязи. При описании такого объекта учитывается не только его внутренняя организация но и функции объекта в целом а так же его взаимоотношения с другими системами. Система совокупность взаимосвязей элементов образующих сложное единство. Семиотика наука о знаковых системах и способах передачи ими различной информации.
75240. Гипотезы происхождения языков 44.5 KB
  Ни один язык не дошел до нас на стадии становления. Поэтому все факты о происхождении языкатеоретические. Якобы фараон пытался узнать какой же язык главный изолировав не умеющего говорить младенца от общества чтобы с ним никто не разговаривал а потом принести царю.
75242. Системные свойства языка 40.5 KB
  Системность предполагает оптимальное согласование структуры субстанции и функции системы. Это значит что природа и свойства элементов входящих в систему характер их взаимодействия отношения между ними определяют функционирование всей системы в целом какие цели преследуются и какими средствами они достигаются. Описание языка как системы знаков во многом связано с именем швейцарского лингвиста Фердинанда де Соссюра 18571913. Каждый компонент ЯС существует не изолированно а лишь в противопоставлении другим компонентам системы.