Работа с матрицой - C#

Формулировка задачи:

Создать матрицу АNxM ,вывести ее. В каждом столбце матрицы поменять местами второй отрицательный и минимальный элемент столбца. Если в столбце нет двух отрицательных элементов, то оставить его без изменения. вот код того что у меня есть:
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Application
{
    class MainClass
    {
        public static void add (int max, int min, out int su)
        {
            su = min + max;
        }
        
        public static void minimum(int[,] mas, int x, int y,int n,int m, out int min)
        {
                    min = mas[0, 0];
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j <m; j++)
                            if (mas [i,j]< min)
                                min = mas[i,j];
                    }
        }
    
        public static void maximum(int[,] mas, int x, int y,int n,int m, out int max)
        
        {
                    max=mas[0, 0];
                    for (int i = 0; i<n; i++)
                    {
                        for (int j = 0; j < m; j++)
                            if (mas [i, j] > max)
                                max = mas [i, j];
                    }
        }
 
        public static void vvod (int[,] mas,int x, int y, int n,int m)
        {
            Random ran = new Random();
 
                    for (int i = 0; i < n; i++)            //n
                    {
                        for (int j = 0; j < m; j++)        //m
                            mas[i,j] = ran.Next(-50, 50);                   
                    }
        }
 
        public static void vivod (int[,] mas,int x, int y, int n,int m)
        {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < m; j++)
                            Console.Write(mas[i,j] + "\t");
                        Console.WriteLine();
                    }
        }
 
 
        public static void poisk2otrel (int[,] mas, int n, int m,out int otr2el)
        {
            int j,i;
            otr2el = mas [0,0];
            Console.WriteLine();
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                if (mas [i,j] < 0)
                    {
                otr2el = mas [i,j];
                
                Console.WriteLine("i= {0}, j= {1}", i, j);
                Console.WriteLine("otr2el: "+ otr2el);
                    }
                }
            }
 
        }
            static void Main (string[] args)
        {   Int32 n, m, otr2el;
            Console.WriteLine(" введите n: ");
             n = Int32.Parse(Console.ReadLine());
            Console.WriteLine(" введите m: ");
             m = Int32.Parse(Console.ReadLine()); 
            int[,] mas;
            mas = new int[n, m];
            int x = 0, y = 0, max, min,su;
            vvod(mas, x, y, n, m);
            vivod(mas, x, y, n, m);
            maximum (mas, x, y, n, m, out max);
            minimum (mas, x, y, n, m, out min);
            poisk2otrel (mas, n ,m ,  out otr2el);
            add(max, min, out su);
            Console.WriteLine();
            Console.WriteLine("макс элемент: "+ max);
            Console.WriteLine("мин элемент: "+ min);
            Console.WriteLine();
            Console.WriteLine("сумма: "+ su);
            Console.WriteLine();
        //  Console.WriteLine("otr2el: "+ otr2el);
            Console.ReadKey();
        }
    }
}
вот поиск второго отрицательного элемента (пока что просто отрицательного элемента)
public static void poisk2otrel (int[,] mas, int n, int m,out int otr2el)
        {
            int j,i;
            otr2el = mas [0,0];
            Console.WriteLine();
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                if (mas [i,j] < 0)
                    {
                otr2el = mas [i,j];
                
                Console.WriteLine("i= {0}, j= {1}", i, j);
                Console.WriteLine("otr2el: "+ otr2el);
                    }
                }
            }
проблема в том что поиск идет так: -21=>-43=>-33 =>25 =>-40=>-10 =>6 =>-44=>11 -21=>-43=>-33=>-40=>-10=>-44 а должен искать не по строкам ,а по столбцам: -21_-43_-33 ↓ __ ↓___ ↓ 25__-40_-10 ↓ __↓ __ ↓ 6__-44__11 -21 => -43 => -40 => -44 => -33 =>-10 и еще я незнаю как сделать так что бы записывать в переменную каждый второй отрицательный элемент..

Код к задаче: «Работа с матрицой - C#»

textual
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void ChangeArr(int[,] a)
        {
            int i, j;
            int min; // Значение минимального элемента.
            int idxMin; // Индекс минимального элемента.
            int countNeg; // Счётчик отрицательных элементов.
            int idxSecNeg; // Индекс второго отрицательного элемента.
 
            for (i = 0; i < a.GetLength(1); i++)
            {
                min = int.MaxValue;
                idxMin = -1;
 
                countNeg = 0;
                idxSecNeg = -1;
 
                for (j = 0; j < a.GetLength(0); j++)
                {
                    if (a[j, i] < min) // Нашли очередное минимальное.
                    {
                        min = a[j, i]; // Запоминаем его значение.
                        idxMin = j; // Запоминаем его индекс в столбце.
                    }
 
                    if (a[j, i] < 0) // Нашли очередное отрицательное.
                    {
                        countNeg++;
                        if (countNeg == 2) // Насчитали два отрицательных.
                            idxSecNeg = j; // Запомнили индекс второго отрицательного в столбце.
                    }
                }
 
                if ((idxSecNeg != -1) && (idxSecNeg != idxMin)) // Если второе отрицательное нашлось, и оно не является минимальным элементом столбца.
                {
                    min = a[idxSecNeg, i]; // Переменная min хранит значение минимального элемента. Но, т.к. мы запомнили его индекс, то эту переменную мы можем использовать для обмена.
                    a[idxSecNeg, i] = a[idxMin, i];
                    a[idxMin, i] = min;
                }
            }
 
        }
        
        static void ShowArr2D(int[,] a)
        {
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                    Console.Write("{0}\t", a[i, j]);
 
                Console.WriteLine();
            }
        }
 
        static void Main()
        {
            Random rand = new Random();
 
            int i, j;
            bool isValid = false;
 
            do
            {
                Console.Write("Число строк: ");
 
                isValid = int.TryParse(Console.ReadLine(), out i);
 
                if (!isValid)
                    Console.WriteLine("Это не целое число.");
 
                if (isValid && i < 2)
                {
                    Console.WriteLine("Слишком мало строк.");
                    isValid = false;
                }
            } while(! isValid);
 
 
            do
            {
                Console.Write("Число столбцов: ");
 
                isValid = int.TryParse(Console.ReadLine(), out j);
 
                if (!isValid)
                    Console.WriteLine("Это не целое число.");
 
                if (isValid && j < 2)
                {
                    Console.WriteLine("Слишком мало столбцов.");
                    isValid = false;
                }
            } while (!isValid);
 
            
            int[,] arr = new int[i, j];
            
            // Заполняем массив
            for (i = 0; i < arr.GetLength(0); i++)
                for (j = 0; j < arr.GetLength(1); j++)
                    arr[i, j] = rand.Next(-50, 51);
 
            Console.WriteLine("Исходный массив:");
            ShowArr2D(arr);
            Console.WriteLine();
 
            ChangeArr(arr); // Изменяем массив.
 
            Console.WriteLine("Новый массив:");
            ShowArr2D(arr);
            Console.WriteLine();
        }
    }
}

9   голосов, оценка 4.111 из 5


СОХРАНИТЬ ССЫЛКУ