Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - 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;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д