Помощь - Поиск - Пользователи - Календарь
Полная версия: Динамические струк. данных, модуль
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Анна
Люди, помогите пожалйуйста мне.
Прочитала это: http://forum.pascal.net.ru/index.php?showt...0&st=0&p=26901& и это: http://forum.pascal.net.ru/index.php?showtopic=2706
Очень плохо все поняла unsure.gif

Есть задача:

Все элементы в массиве С [1..30] меньше среднеарифметического положительных чисел заменить на максимальное значение массива.
Организовать это всё с помощью функции или процедуры, находящейся в модуле. Использовать линамические переменные mega_chok.gif


Что-то написала, но имхо чушь
 unit MyMod;
interface
procedure qwe (c: array [1..30] of integer);
var
i,temp: integer;

for i:=1 to 30 do
if c[i] > 0 then temp:=temp+c[i]; {среднеарифметич. .. как дальше?}

=-=-=-=-=-=-=-=-=-=-=-=-=-=

if c[i] > temp then c[i] := max
volvo
blink.gif Там же все написано...
Модуль:
unit module;

interface

type
ParrType = record
arr: ^arrType;
size: integer;
end;
arrType = array[1 .. 65520 div sizeof(integer)] of integer;

procedure getArray(var p: ParrType; const size: integer);
procedure freeArray(var p: ParrType);

procedure do_it(p: ParrType);

implementation

procedure getArray(var p: ParrType; const size: integer);
begin
getmem(p.arr, size * sizeof(integer));
p.size := size;
end;
procedure freeArray(var p: ParrType);
begin
freemem(p.arr, p.size * sizeof(integer));
end;

procedure do_it(p: ParrType);
var
s: real;
i, max: integer;
begin
s := 0; max := -maxint;

for i := 1 to p.size do begin
s := s + p.arr^[i];
if max < p.arr^[i] then max := p.arr^[i];
end;

s := s / p.size;
for i := 1 to p.size do
if p.arr^[i] < s then p.arr^[i] := max;
end;

end.

Основная программа:
uses module;

var
x: ParrType;
i: integer;

begin
getArray(x, 30); { <--- Создаем динамический массив }

for i := 1 to 30 do { <--- Ну, или заполнить массив по-другому }
x.arr^[i] := i;

for i := 1 to 30 do { <--- Печатаем массив ДО изменения }
write(x.arr^[i]:4);
writeln;

do_it(x);

for i := 1 to 30 do { <--- Печатаем массив ПОСЛЕ изменения }
write(x.arr^[i]:4);
writeln;

freeArray(x); { <--- Удаляем динамический массив }
end.
Анна
Модуль не запускается sad.gif
Ругается на "arr: ^arrType;"

И что означает "1 .. 65520 div sizeof(integer)" blink.gif
volvo
Странно... FPC сожрал такое определение... Попробуй так:
type
arrType = array[1 .. 65520 div sizeof(integer)] of integer;
ParrType = record
arr: ^arrType;
size: integer;
end;

Цитата
что означает "1 .. 65520 div sizeof(integer)"
Означает, что используя этот тип, можно будет индексировать максимально возможное количество элементов: всего для массива доступно 65520 байт, если учесть что размер каждого элемента массива не равен 1 (у Integer, например, размер = 2 байта), то делим максимально доступный размер на размер элемента и не нужно отключать проверку индексов, она может пригодиться...
Анна
Не хочу покаказаться наглой .. но нельзя ли упростить модуль ? unsure.gif
volvo
rolleyes.gif Попробуй... Чего там упрощать? Тебе надо динамические переменные? Это КАК МИНИМУМ выделение/освобождение памяти, то есть 2 процедуры, каждая из которых - по 1-2 строки... Тебе действия заданные с массивом надо производить? Надо... Это - процедура do_it...

Упрощай, если найдешь, что...
Анна
Можно, к примеру, обойтись без записей?
p.size и т.п.

Просто я просматриваю программу и офигеваю sad.gif((
volvo
Уберутся записи - придется в каждую процедуру передавать не 1 а 2 параметра (размер массива добавится), тогда точно где-нибудь можно ошибиться... Так что пользуйся, как есть...
klem4
Тотже самое без записи .. если тебе так проще.

unit module;

interface

type
ParrType = ^arrType;

arrType = array[1 .. 65520 div sizeof(integer)] of integer;

procedure getArray(var p: ParrType; const size: integer);
procedure freeArray(var p: ParrType; const size : integer);

procedure do_it(p: ParrType; const size : integer);

implementation

procedure getArray(var p: ParrType; const size: integer);
begin
getmem(p, size * sizeof(integer));
end;
procedure freeArray(var p: ParrType; const size : integer);
begin
freemem(p, size * sizeof(integer));
end;

procedure do_it(p: ParrType; const size : integer);
var
s: real;
i, max: integer;
begin
s := 0; max := -maxint;

for i := 1 to size do begin
s := s + p^[i];
if max < p^[i] then max := p^[i];
end;

s := s / size;
for i := 1 to size do
if p^[i] < s then p^[i] := max;
end;

end.

Анна
Вот модуль ...

unit mass;
interface
type
b=array [1..20] of integer;
A=^b;
int=^integer;
rl = ^real;
procedure mas (var m1,m2:A; ch:rl);

implementation
procedure mas (var m1,m2:A; ch:rl);

var

j,i: integer;
k, temp:^integer;


begin
new (temp);
new (k);
new(m1);
new (m2);
new (ch);

for i:=1 to 20 do begin

if m1^[i]>0 then temp^:=temp^+m1^[i];
k^:=k^+1;
end;
ch^ := temp^/k^;
j:=1;

for i:=1 to 20 do begin
if m1^[i]<0 then begin
m2^[j] := m1^[i]; inc(j); end; end;
dispose (temp);
dispose (k);
dispose (m1);
dispose (m2);
dispose (ch);
end;
end.



Мне этот модуль нужно переделать под свою задачц ... условие выше ..
А то в ваших решениях я заплюхалась sad.gif

Алгоритм составила sad.gif

1) Находим макс. значение
2) Находим среднеарифмитическое среди положит. чисел ..
2) Заменяем числа меньшие средеарифмитичес. полож. чисел на макс. значение

Дальше встала .. не могу sad.gif sad.gif sad.gif
volvo
Ну, если ты считаешь, что тебе легче разобраться с постоянным разыменованием переменных, чем с одной единственной записью, содержащей два (!!!) поля, и делающей работу СОВЕРШЕННО прозрачной, то разбирайся... Для меня, например, этот код - нечитаемый, и нет никакого желания вникать в него ...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.