Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

c# удалить строки матрицы с отрицательными элементами

76K
17 декабря 2011 года
kefirkamm
5 / / 16.12.2011
помогите, пожалуйста, ребятки с мозгами!! своих не хватает уже!!
нужно удалить в матрице строки, в которых все элементы отрицательные
я пришла к этому, у меня куча ошибок и проверить на правильном ли я пути не могу
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication7
{
    class Program
    {
        // функция
        public static void SumStolb(int[,] a, int n, int m, int p, int[] sb)
        {
            int i, j;
            int s = 0;
            int smax = 0;
             
            for (j = 0; j < m; j++)
            {
                s = 0;
                for (i = 0; i < n; i++)
                    if (a[i, j] > 0)
                    {
                        // нахожд. суммы пол.эл-в каждого столбца
                        s = s + a[i, j];
                    }
                //нах-е столбца с макс суммой
                if (j == 0)
                {
                    smax = s;
                }
                else
                {
                    if (s > smax)
                    {
                        smax = s;

                    }
                }
                sb[j] = s; // определение одномерного массива


            }



            for (i = 0; i < p - 1; i++) //вывод матрицы без столбца макс. суммой элементов
            {
                while (i <= m) ;





                int k = 0;
                for (j = 0; j < n; j++)
                {
                    if (a[i, j] < 0)
                    {
                        k++;
                        if (k == n)
                        {
                            if (i == m)
                            {
                                m = m - 1;
                               
                            }
                            else
                            {
                                for (p = i; p < m; p++)
                                {
                                    for (j = 1; j < n; j++)
                                    {
                                        a[p, j] = a[p + 1, j];
                                        m = m - 1;
                                    }
                                }
                            }

                        }
                        else i++;

                    }


                }

            }


        }

        // головная программа
        static void Main(string[] args)
        {
            int n, m;
            Console.Write("n=");
            n = Convert.ToInt32(Console.ReadLine());
            Console.Write("m=");
            m = Convert.ToInt32(Console.ReadLine());
            int[,] a = new int[n, m];
            int[] ss = new int[m]; //формирование нового массива из сумм пол. эл-в  столбцов
            int i, j, p;
            //ввод элементов
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    Console.Write("a[{0},{1}]=", i, j);
                    a[i, j] = Convert.ToInt32(Console.ReadLine());
                }
            }
            p = n;
            int[,] b;


            //вывод элементов
            System.Console.WriteLine("Out Array");//текст в консоли
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    Console.Write(a[i, j] + "\t");
                }

                Console.WriteLine();
            }


            SumStolb(a, n, p, m, ss);// обращение к функции
            System.Console.WriteLine("Out sum pol columns");// текст в консоли

            //Вывод массива одномерного
            for (i = 0; i < n; i++)
                Console.Write(ss + "\t");
            Console.WriteLine();

            //вывод нового двумерного массива
            System.Console.WriteLine("Out Array");//текст в консоли
            for (p = 0; p < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    if (m==0)
                    {
                        Console.Write("все строки удалены");
                    }
                    else

                    Console.Write(a[p, j] + "\t");
                    Console.WriteLine();
                }

                //Вывод конечных результатов в явном виде
                //окончание
                Console.Write("Press any key for continue");
                Console.ReadKey();

            }

        }
    }

}
2.1K
17 декабря 2011 года
Norgat
452 / / 12.08.2009
Оформите код тегами CODE.
76K
17 декабря 2011 года
kefirkamm
5 / / 16.12.2011
спасибо, отредактировала. поможете?
14
17 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
как задаете матрицу? обычным двумерным массивом? как планируете "удалять" строки?
2.1K
17 декабря 2011 года
Norgat
452 / / 12.08.2009
Ну первое, что тебе нужно сделать - добавить

[CODE="C#"] using System;[/CODE]

в начало файла.

Второе:

[CODE="C#"]
// функция
public static void SumStolb(int[,] a, int n, int m, int p, int[] sb, out int indexmax, out int smax, out int[,] b)
{
...
int[,] b;
...
}
[/CODE]

Тут напутано с именами, две переменные b объявляются.


П.С. советую почитать книжки по C#, того же Троелсена. Ну потому что сейчас код мягко говоря не лучший. А решение с удалением строк матрицы (матрицу задаём через int[][]), в которых нет не отрицательных элементов, можно сделать хотя бы так (используется LINQ, что это можешь поискать в гугле или в книжке):

[CODE="C#"]
var m = from line in matr
where line.Any(e => e >= 0)
select line;
[/CODE]


П.С.С. логику вообще не смотрел.
76K
17 декабря 2011 года
kefirkamm
5 / / 16.12.2011
да, Phodopus!) обычный двумерный массив. просто хотела вывести новую матрицу без тех строк, в которых все элементы отрицательные
14
18 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Насколько я помню, в C# такие массивы immutable. Т.е кол-во элементов после создания не изменить. Сл-но можно:
- при удалении строки создавать временный массив меньшего (на 1) размера, переписывать туда построчно все строки кроме удаляемой и заменять этим временным основной массив
- затирать строку в основном массиве in-place и где-то запоминать что настоящее кол-во строк теперь меньше и пользоваться им
- сменить тип массива

т.к. задачка студенческая, возможно последнее не допускается
76K
18 декабря 2011 года
kefirkamm
5 / / 16.12.2011
вот, я переделала код. теперь без создания новой матрицы. но он что-то не хочет выводить матрицу без отрицательных строк. посмотрите, пожалуйста!! может я вывод неправильно пишу?
14
18 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Ну у вас n и m меняются разве по ходу программы?
76K
22 декабря 2011 года
kefirkamm
5 / / 16.12.2011
ну помогите, пожалуйста!! как бы вы это решили?? может код другой написать? охота мужскую логику увидеть
297
22 декабря 2011 года
koodeer
1.2K / / 02.05.2009
Ну, если хотите мужскую логику, [COLOR="silver"]TITS or GTFO![/COLOR] то вот она:
Код:
using System;
using System.Linq;

namespace Example
{
    class Program
    {
        static void PrintMatrix(int[][] matrix)
        {
            for (int i = 0; i < matrix.Length; ++i)
            {
                for (int j = 0; j < matrix.Length; ++j)
                    Console.Write("{0,5} ", matrix[j]);
                Console.WriteLine();
            }
            Console.WriteLine();
        }

        static void Main()
        {
            int[][] source = {
                new int[] {  81, -68, -29, -47,  63 },
                new int[] {  10,  -2,  -9,  93, -56 },
                new int[] { -63, -42, -74, -26, -16 },
                new int[] { -95, -55,  91,  78, -18 },
                new int[] { -75, -62, -32, -65,  -4 },
                new int[] {  34,  62,  28,  51,  54 }
            };

            PrintMatrix(source);

            var result = (from line in source
                          where line.Any(e => e >= 0)
                          select line).ToArray();

            PrintMatrix(result);

        }
    }
}

В данном примере 3-я и 5-я строки содержат только отрицательные числа, и будут удалены.

LINQ предложил использовать Norgat. Одна проблема: многомерные массивы не реализуют интерфейс IEnumerable, поэтому пришлось использовать jagged array - массив массивов.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог