1

Тема: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Кожен рядок матриці A на першій і останній позиції містить індекси відповідно початку і кінця діапазону елементів рядка, які необхідно переписати у відповідний рядок матриці B. Створити матрицю B з необхідною кількістю стовпчиків у кожному рядку та переписати до неї вказані елементи з матриці A. Відсортувати кожен рядок матриці A за зростанням.

2

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

http://s018.radikal.ru/i504/1305/4e/128b3beefcef.jpg

Подякували: koala, navchalkin2

3

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Не можу зрозуміти,саме,як переписаті початковий та кінцевий елемент кожного рядку матриці А у відповідні рядки нової матриці. Початкова матриця ось:

using System;
namespace MyLab02
{
    class MyProgram
    {
        static void Main(string[] args)
        {
            // кількість рядків, кількість стовпчиків і коефіцієнт заповнення матриці A
            int rows, cols, fill;
            // посилання на майбутню прямокутну матрицю A
            int[,] A;
            // посилання на одновимірний масив W та “зубчасту” матрицю B
            int[] W;
            int[][] B;
            Console.Clear();
            Console.WriteLine("Введiть кiлькiсть рядкiв i стовпчикiв матрицi:");
            rows = int.Parse(Console.ReadLine());
            cols = int.Parse(Console.ReadLine());
 
 
            // створення прямокутної матриці
            A = new int[rows, cols];
 
            Console.WriteLine("Введiть коефiцiєнт заповнення матрицi (0...100 %):");
            fill = int.Parse(Console.ReadLine());
            Random Rnd = new Random();
            // заповнення матриці випадковими числами із заданою щільністю
            int fillcount = fill * rows * cols / 100, pos = 0;
            while (pos < fillcount)
            {
                int rpos = Rnd.Next(A.GetLength(0));
                int cpos = Rnd.Next(A.GetLength(1));
                if (A[rpos, cpos] == 0)
                {
                    A[rpos, cpos] = Rnd.Next(2, 10);
                    ++pos;
                }
            }
            // вивід матриці на дисплей
            Console.WriteLine("Вмiст матрицi A:");
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    Console.Write("{0, 4}", A[i, j]);
                }
                Console.WriteLine();
            }
            Console.WriteLine("Натиснiть довiльну клавiшу...");
            Console.ReadKey(true);
        }
    }
}

4

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Не можу зрозуміти,саме,як переписаті початковий та кінцевий елемент кожного рядку матриці А у відповідні рядки нової матриці. Початкова матриця ось:

using System;
namespace MyLab02
{
    class MyProgram
    {
        static void Main(string[] args)
        {
            // кількість рядків, кількість стовпчиків і коефіцієнт заповнення матриці A
            int rows, cols, fill;
            // посилання на майбутню прямокутну матрицю A
            int[,] A;
            // посилання на одновимірний масив W та “зубчасту” матрицю B
            int[] W;
            int[][] B;
            Console.Clear();
            Console.WriteLine("Введiть кiлькiсть рядкiв i стовпчикiв матрицi:");
            rows = int.Parse(Console.ReadLine());
            cols = int.Parse(Console.ReadLine());
 
 
            // створення прямокутної матриці
            A = new int[rows, cols];
 
            Console.WriteLine("Введiть коефiцiєнт заповнення матрицi (0...100 %):");
            fill = int.Parse(Console.ReadLine());
            Random Rnd = new Random();
            // заповнення матриці випадковими числами із заданою щільністю
            int fillcount = fill * rows * cols / 100, pos = 0;
            while (pos < fillcount)
            {
                int rpos = Rnd.Next(A.GetLength(0));
                int cpos = Rnd.Next(A.GetLength(1));
                if (A[rpos, cpos] == 0)
                {
                    A[rpos, cpos] = Rnd.Next(2, 10);
                    ++pos;
                }
            }
            // вивід матриці на дисплей
            Console.WriteLine("Вмiст матрицi A:");
            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    Console.Write("{0, 4}", A[i, j]);
                }
                Console.WriteLine();
            }
            Console.WriteLine("Натиснiть довiльну клавiшу...");
            Console.ReadKey(true);
        }
    }
}
0xDADA11C7 написав:

http://s018.radikal.ru/i504/1305/4e/128b3beefcef.jpg

5

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Уважніше читайте умову: там нічого не сказано про "переписаті початковий та кінцевий елемент кожного рядку", там "на першій і останній позиції містить індекси відповідно початку і кінця діапазону елементів рядка". Тобто якщо A[0,0] == 3, а A[0,A.Length(1)-1] == 5, то вам треба взяти елементи A[0,3],A[0,4],A[0,5] і переписати їх у B[0][0], B[0][1] і B[0][2] відповідно. Щось на кшталт

for( int i = 0; i < A[ row, A.Length(1) ] - A[ row, 0 ]; ++i)
{
  B[ row ][ i ] = A[ row, A[ row, 0 ] + i ];
}

Звісно, перший і останній елементи треба генерувати окремо, а не так, як у вас.

Подякували: burlakad1

6

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

що означає

koala написав:

генерувати окремо,

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

7

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

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

Подякували: burlakad1

8

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

koala написав:

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

ви не могли б навести якийсь найпростіший приклад,будь ласка)

9

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

З рядку [1 3 5 8 2] треба взяти елементи 1 та 2, тобто [3 5].

Подякували: burlakad1

10

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

using System;

namespace Ex06
{
  class Program
  {
    static int[,] A;
    static int[][] B;
    public static void Main(string[] args)
    {
      Console.WriteLine("Hello World!");      
      // TODO: Implement Functionality Here
      SetA();
      ShowA();
      SetB();
      ShowB();
      SortA();
      ShowA();
      Console.Write("Press any key to continue . . . ");
      Console.ReadKey(true);
    }
    /// <summary>
    /// Заповнити масив A
    /// </summary>
    static void SetA()
    {
      int rows, cols, fill;
      Console.Clear();
      Console.WriteLine("Введiть кiлькiсть рядкiв i стовпчикiв матрицi:");
      rows = int.Parse(Console.ReadLine());
      cols = int.Parse(Console.ReadLine());
      A = new int[rows, cols];
      // кількість рядків, кількість стовпчиків і коефіцієнт заповнення матриці A
      Console.WriteLine("Введiть коефiцiєнт заповнення матрицi (0...100 %):");
      fill = int.Parse(Console.ReadLine());
      Random Rnd = new Random();
      // заповнення матриці випадковими числами із заданою щільністю
      int fillcount = fill * rows * cols / 100, pos = 0;
      while (pos < fillcount)
      {
        int rpos = Rnd.Next(A.GetLength(0));
        int cpos = Rnd.Next(A.GetLength(1));
        if (A[rpos, cpos] == 0)
        {
          A[rpos, cpos] = Rnd.Next(2, 10);
          ++pos;
        }
      }
    }
    
    static void SetB()
    {
      int rowsCount = A.GetLength(0);
      B = new int[rowsCount][];
      int startPos = 0, endPos = 0;
      
      for (int i = 0; i < rowsCount; i++)
      {
        int colsCount = A.GetLength(1);
        startPos =  A[i,0];
        endPos = A[i,colsCount - 1];
        int lengthRowB = endPos - startPos;
        
        if ((lengthRowB < 1)||(lengthRowB > colsCount))
        {
          B[i] = new int[0];
          continue;
        }
        
        endPos--;
        startPos--;
        
        if ((endPos >= colsCount)||(startPos >= colsCount))
        {
          B[i] = new int[0];
          continue;
        }
        
        if ((endPos < 0)||(startPos < 0))
        {
          B[i] = new int[0];
          continue;
        }
        
        B[i] = new int[lengthRowB];
                
        int count = 0;
        for (int col = startPos; col < endPos; col++)
        {          
          B[i][count] = A[i,col];
          //Console.WriteLine("r={0},B={1}",i,B[i][count]);
          count++;
        }        
      }
    }
    
    
    /// <summary>
    /// вивід матриці на дисплей
    /// </summary>
    static void ShowA()
    {
      // вивід матриці на дисплей
      Console.WriteLine("Вмiст матрицi A:");
      for (int i = 0; i < A.GetLength(0); i++)
      {
        for (int j = 0; j < A.GetLength(1); j++)
        {
          Console.Write("{0, 4}", A[i, j]);
        }
        Console.WriteLine();
      }
    }
    
    static void ShowB()
    {
      Console.WriteLine("---Матриця B--");
      for (int i = 0; i < B.GetLength(0); i++)
      {
        for (int j = 0; j < B[i].Length; j++)
          Console.Write("{0, 4}", B[i][j]);
        
        if (B[i].Length > 0)
          Console.WriteLine();
      }
      Console.WriteLine("---Матриця B--");
    }
    
    static void SortA()
    {
      for (int i = 0; i < A.GetLength(0); i++)
      {
        int rowLength = A.GetLength(1);
        int[] arrayRow = new int[rowLength];
        for (int j = 0; j < rowLength; j++)
        {
          arrayRow[j] = A[i,j];
        }
        Array.Sort(arrayRow);
        for (int j = 0; j < rowLength; j++)
        {
          A[i,j] = arrayRow[j];
        }
      }
    }
  }
}
Подякували: burlakad1

11

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

дякую Вам,велике) але матрицю В чомусь не будує так,як потрібно,щоб виводило елементи кожного рядка,у яких індекси відповідають значенням першого і останнього елемента

Post's attachments

Безымянный.png 17.91 kb, 280 downloads since 2015-04-20 

12 Востаннє редагувалося olmovc (01.05.2015 04:09:46)

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

burlakad написав:

дякую Вам,велике) але матрицю В чомусь не будує так,як потрібно,щоб виводило елементи кожного рядка,у яких індекси відповідають значенням першого і останнього елемента

там спеціально зроблено щоб пусті строки(null)  не виводилися на екран - я вважав що так потрібно - у умові задачі досконально не прописано. яким чином виводити строки значенням null - цеж не нуль 0запропонуйте як повинно виглядати результат - все зроблю. пишіть...

Подякували: burlakad1

13

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

olmovc написав:

запропонуйте як повинно виглядати результат - все зроблю. пишіть...

Дякую) Уявімо,що матриця А виглядає так:

3 5 6 4 7 3 5
2 6 8 5 4 0 3
3 5 7 2 9 8 3
5 4 3 1 1 9 6

ми дивимося на значення першого та останнього елементів кожного рядку(перший елемент повинен бути меншим,ніж останній) і у матрицю В переписуємо ті елементи,у яких індекси відповідають значенню першого та останнього елементу матриці А та елементі,що знаходяться між ними,тобто матриця В повинна виглядати так:

4 7 3
8 5
2
9 6

14

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

burlakad написав:

4 7 3
8 5
2
9 6

Матриця з рядками змінної довжини - таке є в С/C++, але в С# здається немає...
Маю наступні варіанти:
0. двовимірний масив із максимальною кількістю стовпчиків
1. список списків, тоді доступ буде відповідно здійснюватись як [і][j]
2. власний клас-масив, із описаним індексатором, і доступ можна зробити як [і,j]

Подякували: burlakad1

15

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Звісно, таке є в C#, і навіть зручніше, ніж в C++. Звичайний int[][] різнодовжинний, на відміну від багатовимірного прямокутного int [,].

16

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

koala написав:

Звісно, таке є в C#, і навіть зручніше, ніж в C++. Звичайний int[][] різнодовжинний, на відміну від багатовимірного прямокутного int [,].

vitia444 написав:

1. список списків, тоді доступ буде відповідно здійснюватись як [і][j]

Погодьтесь, що, в принципі, це те ж саме

Подякували: burlakad1

17

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

        static int[][] GetB(int[,] A)
        {
            int columnsAtA = A.GetLength(1);
            int [][] B = new int[columnsAtA][];

            int currentColumnsCount;

            for (int i = 0; i < columnsAtA; i++)
            {
                currentColumnsCount = A[i, columnsAtA - 1] - A[i, 0] + 1;
                B[i] = new int[currentColumnsCount];

                for (int j = 0; j < currentColumnsCount; j++)
                {
                    //не зебуваємо, що нумерація з 0, тому третій стовпчик насправді 2-ий
                    B[i][j] = A[i, A[i, 0] - 1 + j];
                }
            }

            return B;
        }

Це я написав за 5 хв, не тестував

Подякували: burlakad1

18

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Список і масив - не одне й те саме.

Подякували: burlakad1

19 Востаннє редагувалося vitia444 (01.05.2015 11:08:45)

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

koala написав:

Список і масив - не одне й те саме.

Я й не кажу, що воно одне й те саме, я кажу що воно в принципі майже одне й те саме, і одне і інше - колекція

Подякували: burlakad1

20 Востаннє редагувалося burlakad (01.05.2015 22:53:23)

Re: Створити матрицю B та переписати до неї вказані елементи з матриці A.

Ви маєте на увазі, замість цієї частини коду:

olmovc написав:
    static void SetB()
    {
      int rowsCount = A.GetLength(0);
      B = new int[rowsCount][];
      int startPos = 0, endPos = 0;
      
      for (int i = 0; i < rowsCount; i++)
      {
        int colsCount = A.GetLength(1);
        startPos =  A[i,0];
        endPos = A[i,colsCount - 1];
        int lengthRowB = endPos - startPos;
        
        if ((lengthRowB < 1)||(lengthRowB > colsCount))
        {
          B[i] = new int[0];
          continue;
        }
        
        endPos--;
        startPos--;
        
        if ((endPos >= colsCount)||(startPos >= colsCount))
        {
          B[i] = new int[0];
          continue;
        }
        
        if ((endPos < 0)||(startPos < 0))
        {
          B[i] = new int[0];
          continue;
        }
        
        B[i] = new int[lengthRowB];
                
        int count = 0;
        for (int col = startPos; col < endPos; col++)
        {          
          B[i][count] = A[i,col];
          //Console.WriteLine("r={0},B={1}",i,B[i][count]);
          count++;
        }        
      }
    }
    
   

вставити цю:

static int[][] GetB(int[,] A)
        {
            int columnsAtA = A.GetLength(1);
            int [][] B = new int[columnsAtA][];
 
            int currentColumnsCount;
 
            for (int i = 0; i < columnsAtA; i++)
            {
                currentColumnsCount = A[i, columnsAtA - 1] - A[i, 0] + 1;
                B[i] = new int[currentColumnsCount];
 
                for (int j = 0; j < currentColumnsCount; j++)
                {
                    //не зебуваємо, що нумерація з 0, тому третій стовпчик насправді 2-ий
                    B[i][j] = A[i, A[i, 0] - 1 + j];
                }
            }
 
            return B;
        }

?