Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - 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;
}
}
}