|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
10.12.2009, 22:12 | #1 (permalink) |
Member
Регистрация: 01.11.2009
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Паскаль. Обработка массива.
Подскажите, пожалуйста, 1) имеет ли смысл в данной задаче использовать рекурсию? 2) начать обработку таблицы лучше всего с конца? или с начала? ведь результат получится разным. |
10.12.2009, 22:12 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Рекомендую вам сразу пользоваться поиском схожих тем на форуме Паскаль. Обработка натурального числа Турбо Паскаль или Фри Паскаль. Задание по теме Типизированный файл Обработка txt Обработка матриц. Паскаль Сортировка массива |
19.12.2009, 16:26 | #2 (permalink) |
Member
Регистрация: 01.11.2009
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
При решении нельзя создавать таблицу таких же размеров, массив должен быть динамическим.
Примерное решение: подсчитать сумму элементов в массиве, а значения элементов новой таблицы посчитать как (сумма элементов исходной матрицы - значение самого элемента - сумма элементов, лежащих "выше и правее" - сумма элементов, лежащих "ниже и левее" ). Создать 2 одномерных массива, первый- для подсчета суммы элементов по столбцам, второй- для подсчета суммы элементов по строкам. При реализации этого алгоритма возникают проблемы- не понимаю, как правильно написать это на паскале, использую динамику. |
19.12.2009, 16:57 | #3 (permalink) |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
1)Использовать рекурсию здесь нежелательно. Слишком сложно будет уместить в голове происходящее.
2)На мой взгляд, считать нужно так, чтобы полученные значения не вовлекались в процесс счета. 3)Иногда стоит создать решение типа "лишь бы работало" - без ограничений задачи, а затем, как следует на него насмотревшись, построить решение по всем правилам. |
19.12.2009, 17:57 | #4 (permalink) |
Member
Регистрация: 01.11.2009
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Long Cat, спасибо.
Без динамики написать получилось, но возникло несколько вопросов. 1)Если в функции массив входно-выходной параметр, как правильно его описать? в var? 2)Если использовать дополнительно одномерный динамический массив, выделять для него память нужно в самой функции? И вообще при работе с динамическими массивами освобождать память под них достаточно один раз? |
19.12.2009, 19:58 | #5 (permalink) |
Member
Регистрация: 01.11.2009
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Код:
type TInt=integer; MyType=real; Matrix=array[1..1] of MyType; PMatrix=^Matrix; {cтроки} MyArray=array[1..1] of PMatrix; PMyArray=^MyArray; {массив указателей на строки} {-------------------------------------------------} Function Summa( a:PMyArray; c,d,n,m: TInt): MyType; {вх.параметр a-динамический двумерный массив, c,m-счетчики по столбцам, n,d- по строкам, функция считает сумму элементов, лежащих не выше и не правее и не ниже и не левее данного} var i,j: TInt; s: MyType; begin s:=0; for i:=1 to d do for j:=1 to c do s:=s+a^[i]^[j]; for i:=d to n do for j:=c to m do s:=s+a^[i]^[j]; summa:=s-2*a^[d]^[c]; end; {------------------------------} Function Tabl (a:PMyArray; n,m: TInt): Boolean; var b: Matrix; {дополнительный массив для хранения новых элементов} c,d,e,i,j: TInt; begin if(m<0) or (n<0) or (a=nil) then Tabl:=false else begin for c:=1 to m do begin for d:=1 to n do b[m*(d-1)+c]:=summa(a,c,d,n,m); end; begin for i:=1 to n do begin for j:=1 to m do begin for e:=1 to m*n do a^[i]^[j]:=b[e]; end; end; end; end; Подскажите, пожалуйста, что неверно? Последний раз редактировалось Long Cat; 20.12.2009 в 00:20 |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
19.12.2009, 21:20 | #6 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
b[m*(d-1)+c]:=summa(a,c,d,n,m); end; ? |
|
20.12.2009, 00:38 | #7 (permalink) | |
Banned
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
|
Цитата:
Про динамические переменные: Здесь нужно соблюдать строгий порядок работы: 1) Выделяем память. 2) Работаем. 3) Освобождаем память. Т. е. на каждую операцию new должна в процессе работы должна вызываться соответствующая dispose. (Количество вызовов new и dispose во время работы программы должно совпадать). При форматировании текста программы удобно придерживаться таких правил: 1) begin и парный ему end должны быть напечатаны с одной горизонтальной позиции - тогда меньше придется искать синтаксических ошибок и проще разбирать код. 2) Даже если тело цикла или условного оператора состоит из одной команды, стоит поставить begin и end - лечит огромное количество ошибок. И да, чтобы получить быстрый ответ на вопрос "компилятор там-то выдает ошибку", стоит приводить полный и оригинальный текст сообщения об ошибке. Последний раз редактировалось Long Cat; 20.12.2009 в 00:42 |
|
20.12.2009, 08:47 | #8 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
С п.1 соглашаюсь абсолютно - но увы, новички народ упрямый. А вот п.2 представляется весьма и весьма спорным. Во всяком случае, я этого правила никогда не придерживаюсь. Потому что, с моей точки зрения, например, заполнять матрицу единицами лучше (читабельнее) так: Код:
for i:=1 to N do for j:=1 to M do A[i,j]:=1; Код:
for i:=1 to N do begin for j:=1 to M do begin A[i,j]:=1; end; end; Но это, конечно, дело вкуса и стиля. Ни в коем случае не пытаюсь свою точку зрения кому бы то ни было навязать. Последний раз редактировалось Long Cat; 20.12.2009 в 08:58 |
|
20.12.2009, 11:20 | #10 (permalink) |
Member
Регистрация: 01.11.2009
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо, буду иметь ввиду.
Теперь компиллятор ошибок не выдает, но и исправленная функция не работает. Программа реализована как меню. Первый пункт работает хорошо, когда выбираю второй, ничего не происходит. PHP код:
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|