Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - C# (180777)

Узнай цену своей работы

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

Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент. Всё работает,но последнее задание не могу сделать. Сумма неправильно считается, а в чём ошибка не знаю. Помогите,пожалуйста
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            int i, j;//объявление переменных
            Console.WriteLine("Введите строки массива");
            int stroki = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения
            Console.WriteLine("Введите количество столбцов массива:");
            int stolbsi = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения 
            int[,] mat = new int[stroki, stolbsi];//объявление матрицы
            Random random = new Random();//объявление функции Random
            Console.WriteLine("Исходная матрица: ");
            for (i= 0; i < stroki; i++) //организуем цикл по строкам
            {
                for (j = 0; j < stolbsi; j++) //организуем цикл по столбцам
                {
                    mat[i, j] = random.Next(-100, 100);//рандомно присваиваем элементу матрицы значение от -100 до 100
                    Console.Write(mat[i, j] + "\t");//вывод элементов матрицы,которые разделены табуляцией
                }
                Console.WriteLine();
            }
            int[] summ = new int[stolbsi]; //создаём массив характеристик столбцов
            for (j = 0; j < stolbsi; j++)  //организуем цикл по столбцам
            {
                summ[j] = 0;//обнуляем элементы массива характеристик столбцов
                for (i = 0; i < stroki; i++)  //организуем цикл по строкам
                { 
                    if (mat[i, j] < 0 && mat[i, j] % 2 != 0) //проверка на отрицательность и нечётность элемента матрицы
                        summ[j] += Math.Abs(mat[i, j]);//сумма элементов столбца матрицы
                }
                Console.WriteLine("Сумма отрицательных нечётных элементов равна:{0}", summ[j]);
            }
            for (j = 0; j < summ.Length; j++) //организуем цикл для первого элемента
 
                for (i = j + 1; i < summ.Length; i++) //организуем цикл для последующего элемента
                    if (summ[j] < summ[i])
                    {
                        int s = summ[j];//объявление переменной и присваивание ей суммы
                        summ[j] = summ[i];//присваиваем сумме по столбцам сумме по строкам
                        summ[i] = s;//присваиваем сумме по строкам переменную
                        for (int k = 0; k < stolbsi; k++)
                        {
                            s = mat[j, k];
                            mat[j, k] = mat[i, k];
                            mat[i, k] = s;
                        }
                    }
            Console.WriteLine("Новая отсортированная матрица: ");
            for (i = 0; i < stroki; i++)//организуем цикл по строкам
            {
                for (j = 0; j < stolbsi; j++)//организуем цикл по столбцам
                    Console.Write("{0, 1}", mat[i, j] + "\t");
                Console.WriteLine(" Сумма отрицательных нечётных элементов равна: {0}", summ[i]);
            }
            int summ1 = 0;//объявление переменной
            bool jj = true;
            int H = 0;
            summ1 = 0;//присваивание переменной начальное значение
            for (i = 0; i < stroki; i++)//организуем цикл по строкам
            {
              j = 0;
                while
                    (jj==true)
                {   
             
                while 
                ( j < stolbsi)//организуем цикл по столбцам
                { 
                    if (mat[i, j] < 0 && H ==0)//проверка на отрицательные элементы в столбце
                    {
                            jj = true;                          
                            H = j;
                          j = 0;
                            summ1 = 0;
                            break;//прерывание цикла
 } 
                            summ1 += mat[i,j];//вычисляем сумму
                       j++;
                        Console.Write("Сумма столбцов равна: {0}", +summ1);
                        Console.WriteLine();
                        if (j == stolbsi)
                        {
                            jj = false;
                        }  
                    }
                  }   
                }
                Console.ReadKey();
            }
        }
    }

Решение задачи: «Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик»

textual
Листинг программы
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication5
{
    class Program
    {
        /*Характеристикой столбца целочисленной матрицы назовем сумму модулей его
отрицательных нечетных элементов. Переставляя столбцы заданной матрицы,
расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех
столбцах, которые содержат хотя бы один отрицательный элемент.         */
        //FD -> лучше на будущее выносить рандом в глобальное объявление для более устойчивой рандомизации(рекомендации из учебников)
        // в Вашем случае роли особо не играет
        static Random random = new Random();//объявление функции Random
        static List<int> l = new List<int>();//объявляем список для дальнейшей сортировки по возрастанию массива rang
        //объявил глобально, т.к. он нам понадобится в 2-х ф-циях
        static void Main(string[] args)
        {
            int i, j;//объявление переменных
            Console.WriteLine("Введите строки массива");
            int stroki = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения
            Console.WriteLine("Введите количество столбцов массива:");
            int stolbsi = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения 
            int[,] mat = new int[stroki, stolbsi];//объявление матрицы
            //Random random = new Random();//объявление функции Random <-FD
            Console.WriteLine("Исходная матрица: ");
            for (i= 0; i < stroki; i++) //организуем цикл по строкам
            {
                for (j = 0; j < stolbsi; j++) //организуем цикл по столбцам
                {
                    mat[i, j] = random.Next(-100, 100);//рандомно присваиваем элементу матрицы значение от -100 до 100
                    Console.Write(mat[i, j] + "\t");//вывод элементов матрицы,которые разделены табуляцией
                }
                Console.WriteLine();
            }
            int[] summ = new int[stolbsi]; //создаём массив характеристик столбцов
            for (j = 0; j < stolbsi; j++)  //организуем цикл по столбцам
            {
                summ[j] = 0;//обнуляем элементы массива характеристик столбцов
                for (i = 0; i < stroki; i++)  //организуем цикл по строкам
                {
                    if (mat[i, j] < 0 && mat[i, j] % 2 != 0) //проверка на отрицательность и нечётность элемента матрицы
                        summ[j] += Math.Abs(mat[i, j]);//сумма элементов столбца матрицы
                }
                Console.WriteLine("Сумма отрицательных нечётных элементов равна:{0}", summ[j]);
            }
            //FD - > тут не происходит сортировки матрицы по характеристикам столбца, к тому же периодически падает по индексу вне пределов
            //for (j = 0; j < summ.Length; j++) //организуем цикл для первого элемента
            //    for (i = j + 1; i < summ.Length; i++) //организуем цикл для последующего элемента
            //        if (summ[j] < summ[i])
            //        {
            //            int s = summ[j];//объявление переменной и присваивание ей суммы
            //            summ[j] = summ[i];//присваиваемсумме по столбцам сумме по строкам
            //            summ[i] = s;//присваиваем сумме по строкам переменную
            //            for (int k = 0; k < stolbsi; k++)
            //            {
            //                s = mat[j, k];
            //                mat[j, k] = mat[i, k];
            //                mat[i, k] = s;
            //            }
            //        }
            Console.WriteLine("");
            mat = GetRankedMatrix(mat, summ);
            Console.WriteLine("Новая отсортированная матрица: ");
            for (i = 0; i < stroki; i++)//организуем цикл по строкам
            {
                for (j = 0; j < stolbsi; j++)//организуем цикл по столбцам
                    Console.Write("{0, 1}", mat[i, j] + "\t");
                Console.WriteLine("");//FD заменил, у Вас i строки, а Вы выводите характеристики столбцов...
                //если строк больше, чем столбцов - выпадаете в ошибку
                //Console.WriteLine(" Сумма отрицательных нечётных элементов равна: {0}", summ[i]);
            }
            foreach (int a in l)//l уже корректно отсортирован в ф-ции GetRankedMatrix, осталось вывести на печать
                Console.WriteLine("Сумма отрицательных нечётных элементов равна: {0}", a);
            //<-FD
            //FD тут совсем всё плохо, комментарю полностью
            //int summ1 = 0;//объявление переменной
            //bool jj = true;
            //int H = 0;
            //summ1 = 0;//присваивание переменной начальное значение
            //for (i = 0; i < stroki; i++)//организуем цикл по строкам
            //{
            //    j = 0;
            //    while
            //    (jj == true)
            //    {
 
            //        while
            //        (j < stolbsi)//организуем цикл по столбцам
            //        {
            //            if (mat[i, j] < 0 && H == 0)//проверка на отрицательные элементы в столбце
            //            {
            //                jj = true;
            //                H = j;
            //                j = 0;
            //                summ1 = 0;
            //                break;//прерывание цикла
            //            }
            //            summ1 += mat[i, j];//вычисляем сумму
            //            j++;
            //            Console.Write("Сумма столбцов равна: {0}", +summ1);
            //            Console.WriteLine();
            //            if (j == stolbsi)
            //            {
            //                jj = false;
            //            }
            //        }
            //    }
            //}
            //FD-> в новой матрице нужно получить сумму элементов столбца, если есть хотябы 1 отрицательный элемент
            //summ[] - нам больше не нужен - обнулим и задействуем
            summ = new int[stolbsi];//на всякий случай: stolbsi = mat.GetLength(1)
            bool isNegative = false;
            for (j = 0; j < mat.GetLength(1); j++)
            {
                isNegative = false;
                //проверяем на отрицательность элементы
                for (i = 0; i < mat.GetLength(0); i++)
                {
                    if (mat[i, j] < 0)
                    { isNegative = true;}
 
                }
                if (isNegative)
                {
                    for (i = 0; i < mat.GetLength(0); i++)
                        summ[j] += mat[i, j];
                }
            }
            for (j = 0; j < summ.Length; j++ )
                Console.WriteLine("Сумма элементов столбца {0} = {1}", j, summ[j]);
 
                Console.ReadKey();
        }
        //FD ->
        //входящие: матрица и массив характеристик столбцов
        //возвращает матрицу с переставленными согласно возрастанию значений rang столбцами
        static int[,] GetRankedMatrix(int[,] matr, int[] rang) 
        {
            int[,] rangedMatr = new int[matr.GetLength(0), matr.GetLength(1)];//объявляем матрицу, которую будем возвращать
            for (int i = 0; i < rang.Length; i++ )
                l.Add(rang[i]);//заполняем
 
            l.Sort();//сортируем по возрастанию значений
            int k = 0;
            int count = 0;
            foreach(int i in l)
            {
                //находим позицию столбца в исходной матрице
                for(int j = 0; j < rang.Length;j++)
                {
                    if(i == rang[j])
                        k = j;
                }
                //вписываем столбец исходной матрицы в его новое место
                for (int n = 0; n < matr.GetLength(0); n++)
                { rangedMatr[n, count] = matr[n, k]; }
                count++;
            }
            return rangedMatr; 
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы