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