Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
БогданДан
0 / 0 / 1
Регистрация: 21.05.2011
Сообщений: 7
#1

Найти в матрице нулевые рядки и переместить - C#

26.05.2011, 00:24. Просмотров 658. Ответов 1
Метки нет (Все метки)

Дана матрица, в которой n рядков и m столбиков. В каком-то i-том из n рядков одни нули. Этот рядок надо убрать. Аналогично со столбиками. Количество нулевых рядков и столбиков от нуля до n и m соответственно.
Я сделал, но не работает, если первая строка состоит из нулей. Почему?
Где ошибка в коде?

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2
{
    class Program
    {
 
        static void Main(string[] args)
        {
            int[,] A;    //матриця, яку треба стиснути
            int i, j;
            try
            {
                i = 0; j = 0;
                Console.WriteLine("Введіть кількість рядків n");
                int n = int.Parse(Console.ReadLine());
                Console.WriteLine("Введіть кількість стовпчиків m");
                int m = int.Parse(Console.ReadLine());
                A = new int[n, m];
                A = EnterMatrix(n, m);
                WriteMatrix(A);
                NullRow(i, j, A);
                NullCol(i, j, A);
                WriteMatrix2(A);
            }
            catch (Exception e) //Помилка
            {
                Console.WriteLine("Помилка!!!: {0}", e.ToString());
            }
        }
        //метод введення матриці
        static int[,] EnterMatrix(int n, int m)
        {
            int[,] A;
            A = new int[n, m];
            for (int i = 0; i < A.GetLength(0); i++)   //Зчитування матриці
            {
                Console.WriteLine("Введіть елементи {0} рядка", i + 1);
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    int k;
                    k = int.Parse(Console.ReadLine());
                    A[i, j] = k;
                }
            }
            return A;
        }
        //метод виводить матрицю на екран
        static void WriteMatrix(int[,] A)
        {
            Console.WriteLine("Введена матриця");
            for (int i = 0; i < A.GetLength(0); i++)   //Виведення матриці
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    Console.Write("{0} ", A[i, j]);
                }
                Console.WriteLine(); //Перехід на наступний рядок
            }
        }
        //метод знаходить нульовий рядок і переміщає його вкінець
        static int[,] NullRow(int i, int j, int[,] A)
        {
            int n, m;//довжина і ширина матриці (кількість рядків і стовпчиків)
            n = A.GetLength(0);
            m = A.GetLength(1);
            while (i < n)
            {
                while (j < m)//пошук першого нульового рядка
                    if (A[i, j] == 0)
                        j++;
                    else
                    {
                        i++;
                        j = 0;
                        if (i == A.GetLength(0))
                            break;
                    }
                break;
            }
            int nullR = i;//нульовий рядок
            Console.WriteLine("Номер нульового рядка = {0}", nullR + 1);
            j = 0;
            if (n - 1 < nullR)
                return A;
            else
            {
                if (n > nullR + 1)//переміщення нульового рядка на місце останнього ненульового
                {
                    while (j < m)//пошук останнього ненульового
                    {
                        if (A[n - 1, j] == 0)
                        {
                            //Console.WriteLine(A[n - 1, j]);
                            j++;
                        }
                        else
                        {
                            n--;
                            j = 0;
                        }
                        //Console.WriteLine(n - 1);
                    }
                    //else
                    {
                        j = 0;
                        while (j < m)//присвоєння нульовому рядку значень наступного рядка
                        {
                            if (n > 3)
                            {
                                if (nullR + 1 < n)
                                {
                                    A[nullR, j] = A[nullR + 1, j];
                                    //Console.WriteLine(A[nullR, j]);
                                }
                                else
                                {
                                    A[nullR, j] = A[n - 1, j];
                                }
                                j++;
                            }
                            else
                            {
                                A[nullR, j] = A[nullR + 1, j];
                                j++;
                            }
                        }
                        j = 0;
                        while (j < m)//присвоєння останньому ненульовому рядку нулів
                        {
                            if (n > 3)
                            {
                                A[n - 2, j] = 0;
                                Console.WriteLine(A[n - 2, j]);
                                j++;
                                if (j >= m)
                                {
                                    Console.WriteLine("Матриця після переміщення рядочків");
                                    for (i = 0; i < A.GetLength(0); i++)   //Виведення матриці
                                    {
                                        for (j = 0; j < A.GetLength(1); j++)
                                        {
                                            if (i != nullR)//
                                            {
                                                if (i != n - 1)
                                                    Console.Write("{0} ", A[i, j]);
                                                else
                                                    Console.Write("{0} ", A[n - 2, j]);
                                            }
                                            else
                                                Console.Write("{0} ", A[nullR, j]);
                                        }
                                        Console.WriteLine(); //Перехід на наступний рядок
                                    }
                                }
                            }
                            else
                            {
                                int p = n;
                                //A[p, j] = A[n, j];
                                while (j < m)
                                {
                                    A[p, j] = 0;
                                    j++;
                                }
                                //Console.WriteLine(A[n - 1, j]);
                                if (j >= m)
                                {
                                    Console.WriteLine("Матриця після переміщення рядочків");
                                    for (i = 0; i < A.GetLength(0); i++)   //Виведення матриці
                                    {
                                        for (j = 0; j < A.GetLength(1); j++)
                                        {
                                            //if (i != nullR)//
                                            //{
                                            //if (i != A.GetLength(0) - 1)
                                            Console.Write("{0} ", A[i, j]);
                                            //else
                                            //Console.Write("{0} ", A[p, j]);
                                            //}
                                            //else
                                            //Console.Write("{0} ", A[nullR + 1, j]);
                                        }
                                        Console.WriteLine(); //Перехід на наступний рядок
                                    }
                                    break;
                                }
                            }
                        }
                        //break;
                    }
                    A = NullRow(i, j, A);
                }
                return A;
            }
        }
        //метод знаходить нульовий стовпчик і переміщає його вкінець
        static int[,] NullCol(int i, int j, int[,] A)
        {
            int n, m;
            n = A.GetLength(0);
            m = A.GetLength(1);
            while (j < m)
            {
                while (i < n)
                    if (A[i, j] == 0)
                        i++;
                    else
                    {
                        j++;
                        i = 0;
                        if (j == m)
                            break;
                    }
                break;
            }
            int nullC = j;
            i = 0;
            if (m - 1 < nullC)
                return A;
            else
            {
                if (m > nullC + 1)
                {
                    while (i < n)
                    {
                        if (A[i, m - 1] != 0)
                        {
                            m--;
                            i = 0;
                        }
                        else
                            i++;
                    }
                    i = 0;
                    while (i < n)
                    {
                        if (m > 3)
                        {
                            if (nullC + 1 < m)
                            {
                                A[i, nullC] = A[i, nullC + 1];
                            }
                            else
                            {
                                A[i, nullC] = A[i, n - 1];
                            }
                            i++;
                        }
                        else
                        {
                            A[i, nullC] = A[i, nullC + 1];
                            j++;
                        }
                    }
                    i = 0;
                    while (i < n)
                    {
                        if (m > 3)
                        {
                            A[i, m - 2] = 0;
                            i++;
                            if (i >= n)
                            {
                                Console.WriteLine("Матриця після переміщення стовпчиків");
                                for (i = 0; i < A.GetLength(0); i++)   //Виведення матриці
                                {
                                    for (j = 0; j < A.GetLength(1); j++)
                                    {
                                        if (j != nullC)//
                                        {
                                            if (j != m - 1)
                                                Console.Write("{0} ", A[i, j]);
                                            else
                                                Console.Write("{0} ", A[i, m - 2]);
                                        }
                                        else
                                            Console.Write("{0} ", A[i, nullC]);
                                    }
                                    Console.WriteLine(); //Перехід на наступний рядок
                                }
                            }
                        }
                        else
                        {
                            int p = m;
                            while (i < n)
                            {
                                A[i, p] = 0;
                                i++;
                            }
                            if (i >= n)
                            {
 
                                Console.WriteLine("Матриця після переміщення стовпчиків");
                                for (i = 0; i < A.GetLength(0); i++)   //Виведення матриці
                                {
                                    for (j = 0; j < A.GetLength(1); j++)
                                    {
                                        //if (j != nullC)//
                                        //{
                                        //if (j != m - 1)
                                        Console.Write("{0} ", A[i, j]);
                                        //else
                                        //Console.Write("{0} ", A[i, m - 1]);
                                        //}
                                        //else
                                        //Console.Write("{0} ", A[i, nullC]);
                                    }
                                    Console.WriteLine(); //Перехід на наступний рядок
                                }
                                break;
                            }
                        }
                    }
                }
                A = NullCol(i, j, A);
            }
            return A;
        }
        /*static int A[,] WriteMatrix2(A)
        {
            Console.WriteLine("Стиснена матриця");
            for (int i = 0; i < A.GetLength(0); i++)   //Виведення матриці
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    if (A[i, j] != 0)
                        Console.Write("{0} ", A[i, j]);
                }
                Console.WriteLine(); //Перехід на наступний рядок
            }
        }*/
        static void WriteMatrix2(int[,] A)
        {
            Console.WriteLine("Стиснена матриця");
            for (int i = 0; i < A.GetLength(0); i++)   //Виведення матриці
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    Console.Write("{0} ", A[i, j]);
                }
                Console.WriteLine(); //Перехід на наступний рядок
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2011, 00:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти в матрице нулевые рядки и переместить (C#):

В заданной матрице А, в каждой строке найти минимальный элемент и переместить его в конец строки
Вывести результат в табличном виде.

В заданной матрице удалить все строки, содержащие нулевые элементы
В заданной матрице удалить все строки, содержащие нулевые элементы. Удаление...

В матрице 5х7 в каждой строке переместить макс элемент в конец строки
в матрице 5х7 в каждой строке переместить макс элемент в конец строки ...

Найти количество столбцов матрицы, содержащих хотя бы одни нулевые элементы
Дана целочисленная прямоугольная матрица. Определить: 1. Количество столбцов,...

В одномерном массиве необходимо найти отрицательные, положительные, нулевые и кратные числу К элементы
Помогите пожалуйста отладить программу. В одномерном массиве необходимо найти...

Найти минимальный по модулю не нулевой элемент и заменить на него нулевые элементы массива
Длина массива должна быть введена в ручную, границы чисел Найти минимальный по...

1
bagby
15 / 15 / 7
Регистрация: 18.01.2010
Сообщений: 24
27.05.2011, 03:59 #2
lenm - кол-во строк
lenn - кол-во столбцов
mm - заполненная матрица

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
int[,] Func1(int[,] mm, int lenm, int lenn)
        {
            int lenM = lenm, lenN = lenn;
            int[,] m = mm;
 
            //проверяем строки
            for (int i = 0; i < lenM; i++)
            {
                bool bRow = false;
                for (int j = 0; j < lenN; j++)
                {
                    if (m[i, j] != 0)
                    {
                        bRow = true;
                        break;
                    }
                }
 
                if (!bRow) // ряд i весь нулевой
                {
                    m = RemoveRow(m, i, lenM, lenN);
                    lenM--;
                    i--;
                }
            }
 
            //проверяем столбцы
            for (int j = 0; j < lenN; j++)
            {
                bool bCol = false;
                for (int i = 0; i < lenM; i++)
                {
                    if (m[i, j] != 0)
                    {
                        bCol = true;
                        break;
                    }
                }
 
                if (!bCol) // столбец j весь нулевой
                {
                    m = RemoveCol(m, j, lenM, lenN);
                    lenN--;
                    j--;
                }
            }
 
            return m;
        }
Добавлено через 19 часов 11 минут
пардон, забыл про эти функции
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
        int[,] RemoveRow(int[,] m, int nRemovedRow, int lenM, int lenN)
        {
            if (lenM <= 0)
                return new int[0, 0];
 
            int[,] mm = new int[lenM - 1, lenN];
 
            for (int i = 0; i < lenM; i++)
            {
                for (int j = 0; j < lenN; j++)
                {
                    if (i == nRemovedRow)
                        continue;
                    if (i < nRemovedRow)
                        mm[i, j] = m[i, j];
                    if (i > nRemovedRow)
                        mm[i - 1, j] = m[i, j];
                }
            }
 
            return mm;
        }
 
        int[,] RemoveCol(int[,] m, int nRemovedCol, int lenM, int lenN)
        {
            if (lenN <= 0)
                return new int[0, 0];
 
            int[,] mm = new int[lenM, lenN - 1];
 
            for (int i = 0; i < lenM; i++)
            {
                for (int j = 0; j < lenN; j++)
                {
                    if (j == nRemovedCol)
                        continue;
                    if (j < nRemovedCol)
                        mm[i, j] = m[i, j];
                    if (j > nRemovedCol)
                        mm[i, j - 1] = m[i, j];
                }
            }
 
            return mm;
        }
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2011, 03:59
Привет! Вот еще темы с решениями:

Найти в каждой строке матрицы максимальный и минимальный элементы и переместить их
Дана матрица F(N,M). Найти в каждой строке матрицы максимальный и минимальный...

Найти самый маленький по размеру файл и переместить в другую папку
Здравствуйте. Мне нужно вывести на экран содержимое двух папок и в первой папке...

Найти нулевые строки и столбцы в матрице
Доброго всем дня)) помогите сделать часть кода на проверку строк и столбцов...

В двумерной матрице найти минимальный элемент и переместить его на место заданного
Есть двумерный массив размерностью n заполненный с помощью датчика случайных...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru