none
Вновь прошу совета по оптимизации кода в C# RRS feed

  • Вопрос

  • Доброго всем времени суток. Если не трудно, подскажите как можно было оптимизировать код к следующему заданию?

    В матрице Z(5,6) первый отрицательный элемент каждого столбца заменить суммой оставшихся. Отрицательные элементы до замены вывести в массив B. Вывести исходную и преобразованную матрицы, полученный массив.

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Lab03_3
    {
        class Program
        {
            static void Main(string[] args)
            {
                long[,] inputArray = new long[5, 6];    //массив 5х6
                #region Заполнение массива
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("Введите {0}-ую строку массива, разделяя элементы пробелом: ", i+1);
                    string inputString = Console.ReadLine();
                    string[] tempString = inputString.Split(' ');
    
                    for (int k = 0; k < tempString.Length; k++)
                    {
                        inputArray[i, k] = Convert.ToInt64(tempString[k]);
                    }
                }
                #endregion
    
                long[] otricArray = new long[6];
                #region Находим первый отрицательный элемент и скидываем его в отдельный массив
                int arrayVar = 0;
                for (int k = 0; k < 6; k++)             //сперва проверяем 1-ый стобец, и в нём шерстим строки
                {
                    for (int i = 0; i < 5; i++)
                    {
                        if (inputArray[i, k] < 0)
                        {
                            otricArray[arrayVar] = inputArray[i, k];
                            arrayVar += 1;
                            break;
                        }
                    }
                }
                #endregion
    
                long[,] endArray = new long[5, 6];
                #region Копируем старый массив в новый и находим сумму каждого стобца
                long[] sum = new long[6];
                for (int k = 0; k < 6; k++)
                {
                    for (int i = 0; i < 5; i++)
                    {
                        endArray[i, k] = inputArray[i, k];
                        sum[k] += inputArray[i, k];
                    }
                }
    
                #endregion
    
                #region Работаем с новым массивом.
                for (int k = 0; k < 6; k++)
                {
                    for (int i = 0; i < 5; i++)
                    {
                        if (endArray[i, k] < 0)
                        {
                            endArray[i, k] = sum[k] + Math.Abs(otricArray[k]);
                            break;
                        }
                    }
                }
    
                #endregion
    
                #region вывод матриц
                Console.WriteLine("Исходная матрица: ");
                for (int k = 0; k < 5; k++)
                {
                    for (int i = 0; i < 6; i++)
                    {
                        Console.Write("{0, 5}", inputArray[k, i]);
                    }
                    Console.WriteLine();
                }
    
                Console.WriteLine("\n\nПреобразованная матрица: ");
                for (int k = 0; k < 5; k++)
                {
                    for (int i = 0; i < 6; i++)
                    {
                        Console.Write("{0, 5}", endArray[k, i]);
                    }
                    Console.WriteLine();
                }
    
                Console.WriteLine("\n\nМассив отрицательных чисел: ");
                for (int k = 0; k < 6; k++)
                {
                    Console.Write("{0, 5}", otricArray[k]);
                }
                #endregion
                Console.ReadKey();
            }
        }
    }
    
    


    MSDN AA User
    15 октября 2011 г. 10:09

Ответы

  • 1. Если сделать вывод на экран изначальной матрицы сразу, то не нужно будет её запоминать и копировать (-1 цикл циклов)

    2. Нахождение первого отрицательного, запись его в вектор и запись на его место оставшейся суммы можно сделать в одном цикле (будет тройной, но на ещё один for будет меньше).

    3. Печать матрицы можно сделать отдельной функцией, кода станет поменьше.

    4. "заменить суммой оставшихся" - у вас делается не сумма оставшихся, а сумма всех.

    • Помечено в качестве ответа Abolmasov Dmitry 17 октября 2011 г. 5:51
    15 октября 2011 г. 14:24
    Отвечающий
  • Первый цикл - по столбцам. Второй (вложеный) - по строкам - находите попутно первый отрицательный. Как только нашли, запускаетете третий цикл (внутри первых двух) и суммируете. В зависимости от условия, будете суммировать все кроме того, индеск с которым воспал, или будете суммировать все начиная с найденого индекса.
    • Помечено в качестве ответа asdfxcbneftyherwe 17 октября 2011 г. 11:48
    17 октября 2011 г. 5:38
    Отвечающий

Все ответы

  • Насчёт оптимизации ничего не скажу, зато поворчу на безопасность. Размер массива задан жёстко: 5 на 6, между тем пользователь может ввести сколько угодно значений за раз, и если их будет больше шести, то мы словим исключение.

    Также поворчу на нейминг. otricArray - заменить щас же! Например, на negArray. По-английски отрицательный - negative.

    15 октября 2011 г. 11:18
  • В задании чётко прописано: 5х6, а исключение... Ну вылезет оно и вылезет, программа закроется. Уж лучше чем неправильные результаты. Можно конечно добавить try - catch блок на весь код с отловом любых исключений, но а) лень б) в задании ничего не прописано на эту тему в) кстати исключение не вылезет, а просто будет написано что "программа завершила работу. Выполняется поиск информации об этой ошибке".

     

    А по поводу нейминга - спасибо, я вот всё пытался вспомнить как оно называется :)


    MSDN AA User
    • Изменено asdfxcbneftyherwe 15 октября 2011 г. 11:29 очепятка
    15 октября 2011 г. 11:26
  • 1. Если сделать вывод на экран изначальной матрицы сразу, то не нужно будет её запоминать и копировать (-1 цикл циклов)

    2. Нахождение первого отрицательного, запись его в вектор и запись на его место оставшейся суммы можно сделать в одном цикле (будет тройной, но на ещё один for будет меньше).

    3. Печать матрицы можно сделать отдельной функцией, кода станет поменьше.

    4. "заменить суммой оставшихся" - у вас делается не сумма оставшихся, а сумма всех.

    • Помечено в качестве ответа Abolmasov Dmitry 17 октября 2011 г. 5:51
    15 октября 2011 г. 14:24
    Отвечающий
  • 1. Если сделать вывод на экран изначальной матрицы сразу, то не нужно будет её запоминать и копировать (-1 цикл циклов)

    2. Нахождение первого отрицательного, запись его в вектор и запись на его место оставшейся суммы можно сделать в одном цикле (будет тройной, но на ещё один for будет меньше).

    3. Печать матрицы можно сделать отдельной функцией, кода станет поменьше.

    4. "заменить суммой оставшихся" - у вас делается не сумма оставшихся, а сумма всех.


    1) ок, спасибо

    2) как? я так и не понял как проскочить именно первое отрицательное. Если делать break или continue то он ж на все отрицательые сработает, а их может быть и не одно

    3) функции пока что нежелательно использовать, отчёт по этому всему печатать неудобно будет

    4) Но как ни странно оно даёт верное значение. У меня сумма всех элементов, а так как первое отрицательное тоже суммируется, то чтобы исключить его из операции я после этого прибавляю модуль этого отрицательного числа и получается что -3 + |-3| = 0 (первый отрицательный элемент как бы исключается из операций). Хотя если пойму как сделать второй пункт, то четвёртый вопрос отпадёт.


    MSDN AA User
    15 октября 2011 г. 16:33
  • Прочитал условие и понял, что я его не понял. Суммой оставшихся чего заменить? Суммой оставшихся отрицательных элементов? Суммой всех элементов, идущих после этого первого отрицательного числа? Суммой всех элементов столбца за исключением самого элемента?

    Но в любом случае это делается с помощью 3-х вложенных циклов. Подумай как это сделать ;) В общем то, если исключить ввод и вывод данных, то останется только 3 цикла.

    16 октября 2011 г. 13:09
    Отвечающий
  • Ой, вот Вы сказали про условие и я сам заметил что тут неоднозначная трактовка... Значит сдам преподу в первоначальном виде - пускай разбирается :D Точнее задание давать надо :-)

     

    "Но в любом случае это делается с помощью 3-х вложенных циклов. Подумай как это сделать ;) В общем то, если исключить ввод и вывод данных, то останется только 3 цикла."

    Подскажите хотя бы как сделать сумму ВСЕХ чисел столбца кроме первого отрицательного? А то я себе весь мозг сломал.

     


    MSDN AA User
    16 октября 2011 г. 17:47
  • Первый цикл - по столбцам. Второй (вложеный) - по строкам - находите попутно первый отрицательный. Как только нашли, запускаетете третий цикл (внутри первых двух) и суммируете. В зависимости от условия, будете суммировать все кроме того, индеск с которым воспал, или будете суммировать все начиная с найденого индекса.
    • Помечено в качестве ответа asdfxcbneftyherwe 17 октября 2011 г. 11:48
    17 октября 2011 г. 5:38
    Отвечающий