Паскаль. Обработка массива.
Изменить таблицу, заменив каждый ее элемент на сумму исходных элементов, лежащих не выше и не правее его, а также не ниже и не левее.
Подскажите, пожалуйста, 1) имеет ли смысл в данной задаче использовать рекурсию? 2) начать обработку таблицы лучше всего с конца? или с начала? ведь результат получится разным. |
Вложений: 1
При решении нельзя создавать таблицу таких же размеров, массив должен быть динамическим.
Примерное решение: Вложение 140044 подсчитать сумму элементов в массиве, а значения элементов новой таблицы посчитать как (сумма элементов исходной матрицы - значение самого элемента - сумма элементов, лежащих "выше и правее" - сумма элементов, лежащих "ниже и левее" ). Создать 2 одномерных массива, первый- для подсчета суммы элементов по столбцам, второй- для подсчета суммы элементов по строкам. При реализации этого алгоритма возникают проблемы- не понимаю, как правильно написать это на паскале, использую динамику. |
1)Использовать рекурсию здесь нежелательно. Слишком сложно будет уместить в голове происходящее.
2)На мой взгляд, считать нужно так, чтобы полученные значения не вовлекались в процесс счета. 3)Иногда стоит создать решение типа "лишь бы работало" - без ограничений задачи, а затем, как следует на него насмотревшись, построить решение по всем правилам. |
Long Cat, спасибо.
Без динамики написать получилось, но возникло несколько вопросов. 1)Если в функции массив входно-выходной параметр, как правильно его описать? в var? 2)Если использовать дополнительно одномерный динамический массив, выделять для него память нужно в самой функции? И вообще при работе с динамическими массивами освобождать память под них достаточно один раз? |
Код:
type Подскажите, пожалуйста, что неверно? |
Цитата:
b[m*(d-1)+c]:=summa(a,c,d,n,m); end; ? |
Цитата:
Про динамические переменные: Здесь нужно соблюдать строгий порядок работы: 1) Выделяем память. 2) Работаем. 3) Освобождаем память. Т. е. на каждую операцию new должна в процессе работы должна вызываться соответствующая dispose. (Количество вызовов new и dispose во время работы программы должно совпадать). При форматировании текста программы удобно придерживаться таких правил: 1) begin и парный ему end должны быть напечатаны с одной горизонтальной позиции - тогда меньше придется искать синтаксических ошибок и проще разбирать код. 2) Даже если тело цикла или условного оператора состоит из одной команды, стоит поставить begin и end - лечит огромное количество ошибок. И да, чтобы получить быстрый ответ на вопрос "компилятор там-то выдает ошибку", стоит приводить полный и оригинальный текст сообщения об ошибке. |
Цитата:
С п.1 соглашаюсь абсолютно - но увы, новички народ упрямый. А вот п.2 представляется весьма и весьма спорным. Во всяком случае, я этого правила никогда не придерживаюсь. Потому что, с моей точки зрения, например, заполнять матрицу единицами лучше (читабельнее) так: Код:
for i:=1 to N do Код:
for i:=1 to N do Но это, конечно, дело вкуса и стиля. Ни в коем случае не пытаюсь свою точку зрения кому бы то ни было навязать. |
На вкус и цвет... :-)
|
Спасибо, буду иметь ввиду.
Теперь компиллятор ошибок не выдает, но и исправленная функция не работает. Программа реализована как меню. Первый пункт работает хорошо, когда выбираю второй, ничего не происходит. PHP код:
|
Часовой пояс GMT +4, время: 08:34. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.