Помогите пожалуйста с решением. Заранее Спасибо.
![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
unNamed |
![]()
Сообщение
#1
|
Гость ![]() |
Цитата Из заданной матрицы Am*n исключить строки, содержащие хотябы 1 нулевой элемент. Помогите пожалуйста с решением. Заранее Спасибо. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
С решением обязательно поможем, когда Вы проясните ситуацию, и скажете, что значит "исключить строку из матрицы"... Как задается матрица? (не является ли она динамической, потому что исключить строку из обычной матрицы будет затруднительно)...
Или Вам нужно просто распечатать матрицу без тех строк, которые содержат нулевые элементы? Так это не значит "исключить", матрица останется прежней... |
Guest |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата(volvo @ 14.03.05 10:45) С решением обязательно поможем, когда Вы проясните ситуацию, и скажете, что значит "исключить строку из матрицы"... Как задается матрица? (не является ли она динамической, потому что исключить строку из обычной матрицы будет затруднительно)... Или Вам нужно просто распечатать матрицу без тех строк, которые содержат нулевые элементы? Так это не значит "исключить", матрица останется прежней... Знал бы я сам что вкладывал автор задачи в эти слова... Но как мне кажется нужно просто вывести матрицу без строк, содержащих нулевые элементы. И поясните, пожалуйста, что значит "динамическая матрица"? |
unNamed |
![]()
Сообщение
#4
|
Гость ![]() |
А так сама матрица по-идее просто рандомится.
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата(Guest @ 14.03.05 10:00) как мне кажется нужно просто вывести матрицу без строк, содержащих нулевые элементы. Тогда вот так: Код Const n = ...; m = ...; Type ma3x = array[1 .. n, 1 .. m] of integer; var mx: ma3x; i, j: integer; no_null: boolean; begin { тут заполняем матрицу } for i := 1 to n do begin no_null := true; for j := 1 to m do no_null := no_null and (arr[i, j] <> 0); if no_null then begin for j := 1 to m do write(arr[i, j]:4); writeln end; end; end. С заполнением скорее всего проблем не будет... ;) Цитата(Guest @ 14.03.05 10:00) И поясните, пожалуйста, что значит "динамическая матрица"? Это матрица, которая хранится в "куче" (динамической памяти), и ее размеры задаются не во время компиляции, а во время работы программы... Вот из нее можно исключить строку... |
Guest |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(volvo @ 14.03.05 11:54) Это матрица, которая хранится в "куче" (динамической памяти), и ее размеры задаются не во время компиляции, а во время работы программы... Вот из нее можно исключить строку... Спасибо за код, но похоже у меня все-таки динамическая матрица. Если не составит труда напишите пожалуйста вариант для такой матрицы. |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Ну, если динамическая, тогда:
Исходный код const n: integer = 5; m = 8; type pvector = ^vector; vector = array[1 .. maxint] of integer; pmatrix = ^matrix; matrix = array[1 .. maxint div sizeof(pvector)] of pvector; procedure print(p: pmatrix); var i, j: integer; begin for i := 1 to n do begin for j := 1 to m do write(p^[i]^[j]:4); writeln end; end; var mx: pmatrix; i, j: integer; no_null: boolean; size: integer; begin size := n; getmem(mx, size * sizeof(pvector)); for i := 1 to n do begin getmem(mx^[i], m * sizeof(integer)); for j := 1 to m do mx^[i]^[j] := random(20) end; writeln('before:'); print(mx); for i := 1 to n do begin no_null := true; for j := 1 to m do no_null := no_null and (mx^[i]^[j] <> 0); if not no_null then begin freemem(mx^[i], m * sizeof(integer)); mx^[i] := nil; end; end; i := 1; while i <= n do begin if mx^[i] = nil then begin move(mx^[i+1], mx^[i], (n - i)*sizeof(pvector)); dec(n) end else inc(i) end; writeln('after:'); print(mx); for i := 1 to n do freemem(mx^[i], m * sizeof(integer)); freemem(mx, size * sizeof(pvector)) end. |
unNamed |
![]()
Сообщение
#8
|
Гость ![]() |
2Volvo: Спасибо за помощь )
|
unNamed |
![]()
Сообщение
#9
|
Гость ![]() |
Щас сел наконец за задачу, и все-таки первый вариант наверное мне больше подходит. Второй пример назватьт легеньким язык не повернется)
Только у меня все-равно возникли сложности. Если переписать полностью ваш вариант, то выдает ошибку на "arr", так как она никак не описана. И есть пару вопросов: что делает MX, и зачем его описывать как ma3x, можно подредактировать этот код, чтобы n и m небыли постооянными, а вводились бы при запуске программы(write('vvedite n..'), read(n) и тп). Ещё мне надо чтобы таблица генерировалась с помощью random'а. |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата(unNamed @ 14.03.05 21:42) Если переписать полностью ваш вариант, то выдает ошибку на "arr", так как она никак не описана. И есть пару вопросов: что делает MX, и зачем его описывать как ma3x, можно подредактировать этот код, чтобы n и m небыли постооянными, а вводились бы при запуске программы(write('vvedite n..'), read(n) и тп). Ещё мне надо чтобы таблица генерировалась с помощью random'а. По порядку: 1. mx - заменить на arr... это я просто перепутал ![]() 2. Если M и N не будут постоянными (а я об этом говорил), то нельзя описать такую матрицу. Все размеры должны быть известны на этапе компиляции, а не после запуска. Но сейчас кое-что сделаю ;) Добавлено: Вот что получилось: Исходный код var n: integer; m: integer; Type ma3x = array[1 .. 100, 1 .. 100] of integer; var arr: ma3x; i, j: integer; no_null: boolean; begin { в принципе надо бы вставить проверку на введенные числа, чтобы они не были больше макс. возможного значения = 100 } write('n = '); readln(n); write('m = '); readln(m); for i := 1 to n do for j := 1 to m do arr[i, j] := random(20); writeln('before:'); for i := 1 to n do begin for j := 1 to m do write(arr[i, j]:4); writeln end; writeln('after:'); for i := 1 to n do begin no_null := true; for j := 1 to m do no_null := no_null and (arr[i, j] <> 0); if no_null then begin for j := 1 to m do write(arr[i, j]:4); writeln end; end; end. |
Guest |
![]()
Сообщение
#11
|
Гость ![]() |
2Volvo: Во! Спасибо большое, все заработает, все вроде понятно.
|
Lesnik |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 23 Пол: Мужской Репутация: ![]() ![]() ![]() |
А можно объяснить эту строчку из первого примера?
no_null := no_null and (arr[i, j] <> 0); Недопонял ![]() Спс. |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Эта строчка не имеет смысла без предыдущей:
no_null := true;
Кроме того, она выполняется в цикле (проход по строке матрицы)... В результате если хотя бы один элемент строки матрицы равнялся 0, то (arr[i, j] <> 0) будет равняться False, естественно, no_null тоже примет значение False (учитывая что False and {неважно_что} = False), и больше no_null никогда в этом цикле не сможет стать равным True (именно из-за операции and). Что нам и нужно... Результат - если no_null = False, то в строке был нулевой элемент... |
![]() ![]() |
![]() |
Текстовая версия | 14.03.2025 5:00 |