Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 6
Регистрация: 01.11.2011
Сообщений: 37
1

Работа с матрицой

06.04.2013, 00:29. Показов 651. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать матрицу АNxM ,вывести ее. В каждом столбце матрицы поменять местами второй отрицательный и минимальный элемент столбца. Если в столбце нет двух отрицательных элементов, то оставить его без изменения.

вот код того что у меня есть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Application
{
    class MainClass
    {
        public static void add (int max, int min, out int su)
        {
            su = min + max;
        }
        
        public static void minimum(int[,] mas, int x, int y,int n,int m, out int min)
        {
                    min = mas[0, 0];
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j <m; j++)
                            if (mas [i,j]< min)
                                min = mas[i,j];
                    }
        }
    
        public static void maximum(int[,] mas, int x, int y,int n,int m, out int max)
        
        {
                    max=mas[0, 0];
                    for (int i = 0; i<n; i++)
                    {
                        for (int j = 0; j < m; j++)
                            if (mas [i, j] > max)
                                max = mas [i, j];
                    }
        }
 
        public static void vvod (int[,] mas,int x, int y, int n,int m)
        {
            Random ran = new Random();
 
                    for (int i = 0; i < n; i++)            //n
                    {
                        for (int j = 0; j < m; j++)        //m
                            mas[i,j] = ran.Next(-50, 50);                   
                    }
        }
 
        public static void vivod (int[,] mas,int x, int y, int n,int m)
        {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < m; j++)
                            Console.Write(mas[i,j] + "\t");
                        Console.WriteLine();
                    }
        }
 
 
        public static void poisk2otrel (int[,] mas, int n, int m,out int otr2el)
        {
            int j,i;
            otr2el = mas [0,0];
            Console.WriteLine();
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                if (mas [i,j] < 0)
                    {
                otr2el = mas [i,j];
                
                Console.WriteLine("i= {0}, j= {1}", i, j);
                Console.WriteLine("otr2el: "+ otr2el);
                    }
                }
            }
 
        }
            static void Main (string[] args)
        {   Int32 n, m, otr2el;
            Console.WriteLine(" введите n: ");
             n = Int32.Parse(Console.ReadLine());
            Console.WriteLine(" введите m: ");
             m = Int32.Parse(Console.ReadLine()); 
            int[,] mas;
            mas = new int[n, m];
            int x = 0, y = 0, max, min,su;
            vvod(mas, x, y, n, m);
            vivod(mas, x, y, n, m);
            maximum (mas, x, y, n, m, out max);
            minimum (mas, x, y, n, m, out min);
            poisk2otrel (mas, n ,m ,  out otr2el);
            add(max, min, out su);
            Console.WriteLine();
            Console.WriteLine("макс элемент: "+ max);
            Console.WriteLine("мин элемент: "+ min);
            Console.WriteLine();
            Console.WriteLine("сумма: "+ su);
            Console.WriteLine();
        //  Console.WriteLine("otr2el: "+ otr2el);
            Console.ReadKey();
        }
    }
}
вот поиск второго отрицательного элемента (пока что просто отрицательного элемента)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void poisk2otrel (int[,] mas, int n, int m,out int otr2el)
        {
            int j,i;
            otr2el = mas [0,0];
            Console.WriteLine();
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                if (mas [i,j] < 0)
                    {
                otr2el = mas [i,j];
                
                Console.WriteLine("i= {0}, j= {1}", i, j);
                Console.WriteLine("otr2el: "+ otr2el);
                    }
                }
            }
проблема в том что поиск идет так:
-21=>-43=>-33
=>25 =>-40=>-10
=>6 =>-44=>11

-21=>-43=>-33=>-40=>-10=>-44

а должен искать не по строкам ,а по столбцам:

-21_-43_-33
↓ __ ↓___ ↓
25__-40_-10
↓ __↓ __ ↓
6__-44__11

-21 => -43 => -40 => -44 => -33 =>-10

и еще я незнаю как сделать так что бы записывать в переменную каждый второй отрицательный элемент..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2013, 00:29
Ответы с готовыми решениями:

Работа с матрицой
Заменить строку матрицы А, содержащую максимальный элемент, массивом В. Вычислить сумму элементов...

Операции с матрицой и работа с вводом-выводом в файл
Здравствуйте. Дали несколько заданий на практике, одно из них следующее: Начиная с центра, обойти...

Операцие с матрицой
Для матрицы K (m, n), 1 &lt;m, n &lt;10, напечатать номера столбцов, содержащих более двух нулей....

Задача с матрицой
Задание звучит так : . Дана целочисленная матрица размера MхN. Удалить строки с отрицательной...

5
740 / 284 / 83
Регистрация: 12.12.2012
Сообщений: 565
06.04.2013, 00:52 2
Цитата Сообщение от sSergeYy Посмотреть сообщение
if (mas [i,j] < 0)
Это 11 строка. Попробуйте i и j поменять местами: mas[j, i]. И в 13 строке тоже. Задач на массивы тут море. Пройдитесь поиском, может ваша уже есть готовая.
1
3 / 3 / 6
Регистрация: 01.11.2011
Сообщений: 37
06.04.2013, 04:39  [ТС] 3
Спасибо, заработало, теперь поиск отрицательных элементов идет по стобам, а не по строкам =)

Добавлено через 2 часа 58 минут
По идее сейчас должно выводится только каждый второй отрицательный элемент, но выводится только первый и все...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Application
{
    class MainClass
    {
        public static void add (int max, int min, out int su)
        {
            su = min + max;
        }
        
        public static void minimum(int[,] mas, int x, int y,int n,int m, out int min)
        {
                    min = mas[0, 0];
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j <m; j++)
                            if (mas [i,j]< min)
                                min = mas[i,j];
                    }
        }
    
        public static void maximum(int[,] mas, int x, int y,int n,int m, out int max)
        
        {
                    max=mas[0, 0];
                    for (int i = 0; i<n; i++)
                    {
                        for (int j = 0; j < m; j++)
                            if (mas [i, j] > max)
                                max = mas [i, j];
                    }
        }
 
        public static void vvod (int[,] mas,int x, int y, int n,int m)
        {
            Random ran = new Random();
 
                    for (int i = 0; i < n; i++)           
                    {
                        for (int j = 0; j < m; j++)       
                            mas[i,j] = ran.Next(-50, 50);                   
                    }
        }
 
        public static void vivod (int[,] mas,int otr2el, int y, int n,int m)
        {
                    for (int i = 0; i < n; i++)
                    {
                        for (int j = 0; j < m; j++)
                            Console.Write(mas[i,j] + "\t");
                        Console.WriteLine();
                    }
        }
 
 
         public static void poisk2otrel (int[,] mas, int n, int m,out int otr2el)
        {
            int j,i,g;
            g = 1;
            otr2el = mas [0,0];
            Console.WriteLine();
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                if (mas [j,i] < 0 && g%2 == 0)
                    {
                otr2el = mas [j,i];
                        Console.Write("otr {0}, g= {1}",otr2el,g);
                        g++;
 
                    }
                }
            }
 
        }
            static void Main (string[] args)
        {   Int32 n, m, otr2el;
            Console.WriteLine(" введите n: ");
             n = Int32.Parse(Console.ReadLine());
            Console.WriteLine(" введите m: ");
             m = Int32.Parse(Console.ReadLine()); 
            int[,] mas;
            mas = new int[n, m];
            int x = 0, y = 0, max, min,su;
            vvod(mas, x, y, n, m);
            vivod(mas, x, y, n, m);
            maximum (mas, x, y, n, m, out max);
            minimum (mas, x, y, n, m, out min);
            poisk2otrel (mas, n ,m ,  out otr2el);
            add(max, min, out su);
            Console.WriteLine();
            Console.WriteLine("макс элемент: "+ max);
            Console.WriteLine("мин элемент: "+ min);
            Console.WriteLine();
            Console.WriteLine("сумма: "+ su);
            Console.WriteLine();
        //  Console.WriteLine("otr2el: "+ otr2el);
            Console.ReadKey();
        }
    }
}
0
740 / 284 / 83
Регистрация: 12.12.2012
Сообщений: 565
07.04.2013, 02:33 4
sSergeYy, как оказалось, я дал вам дурной совет. Такой манец будет работать только с квадратной матрицей. А в общем случае, когда число строк != числу столбцов, индекс выходит за границы массива.
Вот код. Что-то намудрил с вашей задачей. Скорее - подгонял, чем делал осознанно. Проверил. Работает. По столбцам работает.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void ChangeArr(int[,] a)
        {
            int i, j;
            int min; // Значение минимального элемента.
            int idxMin; // Индекс минимального элемента.
            int countNeg; // Счётчик отрицательных элементов.
            int idxSecNeg; // Индекс второго отрицательного элемента.
 
            for (i = 0; i < a.GetLength(1); i++)
            {
                min = int.MaxValue;
                idxMin = -1;
 
                countNeg = 0;
                idxSecNeg = -1;
 
                for (j = 0; j < a.GetLength(0); j++)
                {
                    if (a[j, i] < min) // Нашли очередное минимальное.
                    {
                        min = a[j, i]; // Запоминаем его значение.
                        idxMin = j; // Запоминаем его индекс в столбце.
                    }
 
                    if (a[j, i] < 0) // Нашли очередное отрицательное.
                    {
                        countNeg++;
                        if (countNeg == 2) // Насчитали два отрицательных.
                            idxSecNeg = j; // Запомнили индекс второго отрицательного в столбце.
                    }
                }
 
                if ((idxSecNeg != -1) && (idxSecNeg != idxMin)) // Если второе отрицательное нашлось, и оно не является минимальным элементом столбца.
                {
                    min = a[idxSecNeg, i]; // Переменная min хранит значение минимального элемента. Но, т.к. мы запомнили его индекс, то эту переменную мы можем использовать для обмена.
                    a[idxSecNeg, i] = a[idxMin, i];
                    a[idxMin, i] = min;
                }
            }
 
        }
        
        static void ShowArr2D(int[,] a)
        {
            for (int i = 0; i < a.GetLength(0); i++)
            {
                for (int j = 0; j < a.GetLength(1); j++)
                    Console.Write("{0}\t", a[i, j]);
 
                Console.WriteLine();
            }
        }
 
        static void Main()
        {
            Random rand = new Random();
 
            int i, j;
            bool isValid = false;
 
            do
            {
                Console.Write("Число строк: ");
 
                isValid = int.TryParse(Console.ReadLine(), out i);
 
                if (!isValid)
                    Console.WriteLine("Это не целое число.");
 
                if (isValid && i < 2)
                {
                    Console.WriteLine("Слишком мало строк.");
                    isValid = false;
                }
            } while(! isValid);
 
 
            do
            {
                Console.Write("Число столбцов: ");
 
                isValid = int.TryParse(Console.ReadLine(), out j);
 
                if (!isValid)
                    Console.WriteLine("Это не целое число.");
 
                if (isValid && j < 2)
                {
                    Console.WriteLine("Слишком мало столбцов.");
                    isValid = false;
                }
            } while (!isValid);
 
            
            int[,] arr = new int[i, j];
            
            // Заполняем массив
            for (i = 0; i < arr.GetLength(0); i++)
                for (j = 0; j < arr.GetLength(1); j++)
                    arr[i, j] = rand.Next(-50, 51);
 
            Console.WriteLine("Исходный массив:");
            ShowArr2D(arr);
            Console.WriteLine();
 
            ChangeArr(arr); // Изменяем массив.
 
            Console.WriteLine("Новый массив:");
            ShowArr2D(arr);
            Console.WriteLine();
        }
    }
}
1
3 / 3 / 6
Регистрация: 01.11.2011
Сообщений: 37
07.04.2013, 14:11  [ТС] 5
огромное спасибо, подглядел в вашем коде очень много нового для себя, теперь еще и знаю как делать защиту от дурака в таком случае =)
и еще раз спасибо!
0
740 / 284 / 83
Регистрация: 12.12.2012
Сообщений: 565
07.04.2013, 14:26 6
Не за что. Рад, что смог помочь.
1
07.04.2013, 14:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2013, 14:26
Помогаю со студенческими работами здесь

Задание с матрицой 2
Используется квадратная матрица X (n x n), 4&lt;n&lt;10. При вводе элементов матрицы должна...

Задание с матрицой
Используется исходная матрица X (n x m) , 4 &lt;n&lt;10. 4&lt;m&lt;10 При вводе элементов матрицы должна...

непонятки с матрицой
Найти сумму модулей элементов, расположенных выше главной диагонали у меня проблемы ваще всегда...

програма с матрицой
для заданной матрицы BK вычислить и напечатать суму элементов, расположенных выше главной диагонали

3 задания с матрицой
Для заданий № 1 и № 2 используется исходная матрица X (n x m) , 4 &lt;n&lt;10. 4&lt;m&lt;10. Для задания № 3...

задача с матрицой
Здравствуйте форумчане! помогите дорешить задачу: Вычислить и округлить до 0,1 элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru