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

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

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

Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент. Всё работает,но последнее задание не могу сделать. Сумма неправильно считается, а в чём ошибка не знаю. Помогите,пожалуйста
Листинг программы
  1. namespace ConsoleApplication5
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. int i, j;//объявление переменных
  8. Console.WriteLine("Введите строки массива");
  9. int stroki = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения
  10. Console.WriteLine("Введите количество столбцов массива:");
  11. int stolbsi = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения
  12. int[,] mat = new int[stroki, stolbsi];//объявление матрицы
  13. Random random = new Random();//объявление функции Random
  14. Console.WriteLine("Исходная матрица: ");
  15. for (i= 0; i < stroki; i++) //организуем цикл по строкам
  16. {
  17. for (j = 0; j < stolbsi; j++) //организуем цикл по столбцам
  18. {
  19. mat[i, j] = random.Next(-100, 100);//рандомно присваиваем элементу матрицы значение от -100 до 100
  20. Console.Write(mat[i, j] + "\t");//вывод элементов матрицы,которые разделены табуляцией
  21. }
  22. Console.WriteLine();
  23. }
  24. int[] summ = new int[stolbsi]; //создаём массив характеристик столбцов
  25. for (j = 0; j < stolbsi; j++) //организуем цикл по столбцам
  26. {
  27. summ[j] = 0;//обнуляем элементы массива характеристик столбцов
  28. for (i = 0; i < stroki; i++) //организуем цикл по строкам
  29. {
  30. if (mat[i, j] < 0 && mat[i, j] % 2 != 0) //проверка на отрицательность и нечётность элемента матрицы
  31. summ[j] += Math.Abs(mat[i, j]);//сумма элементов столбца матрицы
  32. }
  33. Console.WriteLine("Сумма отрицательных нечётных элементов равна:{0}", summ[j]);
  34. }
  35. for (j = 0; j < summ.Length; j++) //организуем цикл для первого элемента
  36. for (i = j + 1; i < summ.Length; i++) //организуем цикл для последующего элемента
  37. if (summ[j] < summ[i])
  38. {
  39. int s = summ[j];//объявление переменной и присваивание ей суммы
  40. summ[j] = summ[i];//присваиваем сумме по столбцам сумме по строкам
  41. summ[i] = s;//присваиваем сумме по строкам переменную
  42. for (int k = 0; k < stolbsi; k++)
  43. {
  44. s = mat[j, k];
  45. mat[j, k] = mat[i, k];
  46. mat[i, k] = s;
  47. }
  48. }
  49. Console.WriteLine("Новая отсортированная матрица: ");
  50. for (i = 0; i < stroki; i++)//организуем цикл по строкам
  51. {
  52. for (j = 0; j < stolbsi; j++)//организуем цикл по столбцам
  53. Console.Write("{0, 1}", mat[i, j] + "\t");
  54. Console.WriteLine(" Сумма отрицательных нечётных элементов равна: {0}", summ[i]);
  55. }
  56. int summ1 = 0;//объявление переменной
  57. bool jj = true;
  58. int H = 0;
  59. summ1 = 0;//присваивание переменной начальное значение
  60. for (i = 0; i < stroki; i++)//организуем цикл по строкам
  61. {
  62. j = 0;
  63. while
  64. (jj==true)
  65. {
  66. while
  67. ( j < stolbsi)//организуем цикл по столбцам
  68. {
  69. if (mat[i, j] < 0 && H ==0)//проверка на отрицательные элементы в столбце
  70. {
  71. jj = true;
  72. H = j;
  73. j = 0;
  74. summ1 = 0;
  75. break;//прерывание цикла
  76. }
  77. summ1 += mat[i,j];//вычисляем сумму
  78. j++;
  79. Console.Write("Сумма столбцов равна: {0}", +summ1);
  80. Console.WriteLine();
  81. if (j == stolbsi)
  82. {
  83. jj = false;
  84. }
  85. }
  86. }
  87. }
  88. Console.ReadKey();
  89. }
  90. }
  91. }

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

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace ConsoleApplication5
  5. {
  6.     class Program
  7.     {
  8.         /*Характеристикой столбца целочисленной матрицы назовем сумму модулей его
  9. отрицательных нечетных элементов. Переставляя столбцы заданной матрицы,
  10. расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех
  11. столбцах, которые содержат хотя бы один отрицательный элемент.         */
  12.         //FD -> лучше на будущее выносить рандом в глобальное объявление для более устойчивой рандомизации(рекомендации из учебников)
  13.         // в Вашем случае роли особо не играет
  14.         static Random random = new Random();//объявление функции Random
  15.         static List<int> l = new List<int>();//объявляем список для дальнейшей сортировки по возрастанию массива rang
  16.         //объявил глобально, т.к. он нам понадобится в 2-х ф-циях
  17.         static void Main(string[] args)
  18.         {
  19.             int i, j;//объявление переменных
  20.             Console.WriteLine("Введите строки массива");
  21.             int stroki = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения
  22.             Console.WriteLine("Введите количество столбцов массива:");
  23.             int stolbsi = Convert.ToInt32(Console.ReadLine());//объявление переменной и ввод её значения
  24.             int[,] mat = new int[stroki, stolbsi];//объявление матрицы
  25.             //Random random = new Random();//объявление функции Random <-FD
  26.             Console.WriteLine("Исходная матрица: ");
  27.             for (i= 0; i < stroki; i++) //организуем цикл по строкам
  28.             {
  29.                 for (j = 0; j < stolbsi; j++) //организуем цикл по столбцам
  30.                 {
  31.                     mat[i, j] = random.Next(-100, 100);//рандомно присваиваем элементу матрицы значение от -100 до 100
  32.                     Console.Write(mat[i, j] + "\t");//вывод элементов матрицы,которые разделены табуляцией
  33.                 }
  34.                 Console.WriteLine();
  35.             }
  36.             int[] summ = new int[stolbsi]; //создаём массив характеристик столбцов
  37.             for (j = 0; j < stolbsi; j++)  //организуем цикл по столбцам
  38.             {
  39.                 summ[j] = 0;//обнуляем элементы массива характеристик столбцов
  40.                 for (i = 0; i < stroki; i++)  //организуем цикл по строкам
  41.                 {
  42.                     if (mat[i, j] < 0 && mat[i, j] % 2 != 0) //проверка на отрицательность и нечётность элемента матрицы
  43.                         summ[j] += Math.Abs(mat[i, j]);//сумма элементов столбца матрицы
  44.                 }
  45.                 Console.WriteLine("Сумма отрицательных нечётных элементов равна:{0}", summ[j]);
  46.             }
  47.             //FD - > тут не происходит сортировки матрицы по характеристикам столбца, к тому же периодически падает по индексу вне пределов
  48.             //for (j = 0; j < summ.Length; j++) //организуем цикл для первого элемента
  49.             //    for (i = j + 1; i < summ.Length; i++) //организуем цикл для последующего элемента
  50.             //        if (summ[j] < summ[i])
  51.             //        {
  52.             //            int s = summ[j];//объявление переменной и присваивание ей суммы
  53.             //            summ[j] = summ[i];//присваиваемсумме по столбцам сумме по строкам
  54.             //            summ[i] = s;//присваиваем сумме по строкам переменную
  55.             //            for (int k = 0; k < stolbsi; k++)
  56.             //            {
  57.             //                s = mat[j, k];
  58.             //                mat[j, k] = mat[i, k];
  59.             //                mat[i, k] = s;
  60.             //            }
  61.             //        }
  62.             Console.WriteLine("");
  63.             mat = GetRankedMatrix(mat, summ);
  64.             Console.WriteLine("Новая отсортированная матрица: ");
  65.             for (i = 0; i < stroki; i++)//организуем цикл по строкам
  66.             {
  67.                 for (j = 0; j < stolbsi; j++)//организуем цикл по столбцам
  68.                     Console.Write("{0, 1}", mat[i, j] + "\t");
  69.                 Console.WriteLine("");//FD заменил, у Вас i строки, а Вы выводите характеристики столбцов...
  70.                 //если строк больше, чем столбцов - выпадаете в ошибку
  71.                 //Console.WriteLine(" Сумма отрицательных нечётных элементов равна: {0}", summ[i]);
  72.             }
  73.             foreach (int a in l)//l уже корректно отсортирован в ф-ции GetRankedMatrix, осталось вывести на печать
  74.                 Console.WriteLine("Сумма отрицательных нечётных элементов равна: {0}", a);
  75.             //<-FD
  76.             //FD тут совсем всё плохо, комментарю полностью
  77.             //int summ1 = 0;//объявление переменной
  78.             //bool jj = true;
  79.             //int H = 0;
  80.             //summ1 = 0;//присваивание переменной начальное значение
  81.             //for (i = 0; i < stroki; i++)//организуем цикл по строкам
  82.             //{
  83.             //    j = 0;
  84.             //    while
  85.             //    (jj == true)
  86.             //    {
  87.  
  88.             //        while
  89.             //        (j < stolbsi)//организуем цикл по столбцам
  90.             //        {
  91.             //            if (mat[i, j] < 0 && H == 0)//проверка на отрицательные элементы в столбце
  92.             //            {
  93.             //                jj = true;
  94.             //                H = j;
  95.             //                j = 0;
  96.             //                summ1 = 0;
  97.             //                break;//прерывание цикла
  98.             //            }
  99.             //            summ1 += mat[i, j];//вычисляем сумму
  100.             //            j++;
  101.             //            Console.Write("Сумма столбцов равна: {0}", +summ1);
  102.             //            Console.WriteLine();
  103.             //            if (j == stolbsi)
  104.             //            {
  105.             //                jj = false;
  106.             //            }
  107.             //        }
  108.             //    }
  109.             //}
  110.             //FD-> в новой матрице нужно получить сумму элементов столбца, если есть хотябы 1 отрицательный элемент
  111.             //summ[] - нам больше не нужен - обнулим и задействуем
  112.             summ = new int[stolbsi];//на всякий случай: stolbsi = mat.GetLength(1)
  113.             bool isNegative = false;
  114.             for (j = 0; j < mat.GetLength(1); j++)
  115.             {
  116.                 isNegative = false;
  117.                 //проверяем на отрицательность элементы
  118.                 for (i = 0; i < mat.GetLength(0); i++)
  119.                 {
  120.                     if (mat[i, j] < 0)
  121.                     { isNegative = true;}
  122.  
  123.                 }
  124.                 if (isNegative)
  125.                 {
  126.                     for (i = 0; i < mat.GetLength(0); i++)
  127.                         summ[j] += mat[i, j];
  128.                 }
  129.             }
  130.             for (j = 0; j < summ.Length; j++ )
  131.                 Console.WriteLine("Сумма элементов столбца {0} = {1}", j, summ[j]);
  132.  
  133.                 Console.ReadKey();
  134.         }
  135.         //FD ->
  136.         //входящие: матрица и массив характеристик столбцов
  137.         //возвращает матрицу с переставленными согласно возрастанию значений rang столбцами
  138.         static int[,] GetRankedMatrix(int[,] matr, int[] rang)
  139.         {
  140.             int[,] rangedMatr = new int[matr.GetLength(0), matr.GetLength(1)];//объявляем матрицу, которую будем возвращать
  141.             for (int i = 0; i < rang.Length; i++ )
  142.                 l.Add(rang[i]);//заполняем
  143.  
  144.             l.Sort();//сортируем по возрастанию значений
  145.             int k = 0;
  146.             int count = 0;
  147.             foreach(int i in l)
  148.             {
  149.                 //находим позицию столбца в исходной матрице
  150.                 for(int j = 0; j < rang.Length;j++)
  151.                 {
  152.                     if(i == rang[j])
  153.                         k = j;
  154.                 }
  155.                 //вписываем столбец исходной матрицы в его новое место
  156.                 for (int n = 0; n < matr.GetLength(0); n++)
  157.                 { rangedMatr[n, count] = matr[n, k]; }
  158.                 count++;
  159.             }
  160.             return rangedMatr;
  161.         }
  162.     }
  163. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы