IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Динамические струк. данных, модуль, спасите :-(
сообщение
Сообщение #1


Бывалая
***

Группа: Пользователи
Сообщений: 290
Пол: Женский
Реальное имя: Анютка

Репутация: -  7  +


Люди, помогите пожалйуйста мне.
Прочитала это: 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалая
***

Группа: Пользователи
Сообщений: 290
Пол: Женский
Реальное имя: Анютка

Репутация: -  7  +


Модуль не запускается sad.gif
Ругается на "arr: ^arrType;"

И что означает "1 .. 65520 div sizeof(integer)" blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Странно... 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 байта), то делим максимально доступный размер на размер элемента и не нужно отключать проверку индексов, она может пригодиться...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалая
***

Группа: Пользователи
Сообщений: 290
Пол: Женский
Реальное имя: Анютка

Репутация: -  7  +


Не хочу покаказаться наглой .. но нельзя ли упростить модуль ? unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






rolleyes.gif Попробуй... Чего там упрощать? Тебе надо динамические переменные? Это КАК МИНИМУМ выделение/освобождение памяти, то есть 2 процедуры, каждая из которых - по 1-2 строки... Тебе действия заданные с массивом надо производить? Надо... Это - процедура do_it...

Упрощай, если найдешь, что...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалая
***

Группа: Пользователи
Сообщений: 290
Пол: Женский
Реальное имя: Анютка

Репутация: -  7  +


Можно, к примеру, обойтись без записей?
p.size и т.п.

Просто я просматриваю программу и офигеваю sad.gif((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Уберутся записи - придется в каждую процедуру передавать не 1 а 2 параметра (размер массива добавится), тогда точно где-нибудь можно ошибиться... Так что пользуйся, как есть...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Тотже самое без записи .. если тебе так проще.

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.



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалая
***

Группа: Пользователи
Сообщений: 290
Пол: Женский
Реальное имя: Анютка

Репутация: -  7  +


Вот модуль ...

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 22:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name