Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
SYSMAN Завтра сделаю, если еще будет надо, правда обьектно было бы удобнее, но могу из без ООП
Добавлено спустя 10 часов, 33 минуты, 29 секунд: Мдя вот тебе грубый вариант динами ческого массива, есть добавление , вытаскивание и удаление элемента
это unit для работы с массивом
Код:
unit dynmas;
interface type PWord=^Word; PMyArray=^TMyArray; TMyArray=Array[0..35000] of word; type TDynaMac=record length:longint; data_array:pointer; end;
procedure AddItem(var dyn:TDynaMac; item:word); var tmpStorage:pointer; tmpData:Pword; begin GetMem(tmpStorage,dyn.length*sizeof(Word)+sizeof(Word)); if dyn.length>0 then begin move(dyn.data_array^,tmpStorage^,dyn.length*sizeof(Word)); FreeMem(dyn.data_array,dyn.length* sizeof(Word)); end; dyn.data_array:=tmpStorage; dyn.length:=dyn.length+1; tmpData:=dyn.data_array; inc(tmpData,dyn.length-1); tmpData^:=item; end;
procedure FreeDynamac(var dyn:TDynaMac); begin FreeMem(dyn.data_array,dyn.length*sizeof(word)); dyn.length:=0; end; function GetItem(var dyn:TDynaMac;index:longint):word; var tmpData:Pword; begin if index>(dyn.length-1) then begin GetItem:=0; exit; end; tmpData:=dyn.data_array; inc(tmpData,index); GetItem:=tmpData^; end; procedure DelItem(var dyn:TDynaMac;index:longint); var tmpStorage1:pointer; tmpPointer1,tmpPointer2:Pword; begin if index>(dyn.length-1) then exit; GetMem(tmpStorage1,dyn.length-1); move(dyn.data_array^,tmpStorage1^,index*sizeof(word)); tmpPointer1:=dyn.data_array; tmpPointer2:=tmpStorage1; inc(tmpPointer1,(index+1)); inc(tmpPointer2,(index)); move(tmpPointer1^,tmpPointer2^,(dyn.length-index)*sizeof(word)); FreeMem(dyn.data_array,dyn.length*sizeof(word)); dyn.data_array:=tmpStorage1; dec(dyn.length) end;
end.
Это пример его использования. все писал на Delphi (небыло Паскаля на работе), но по памяти пытался не использовать нововведений так что должно пойти и на досовском паскале.
Код:
program dyntest;
uses dynmas ; var T:TDynaMac; i:longint; begin for i:=1 to 100 do begin AddItem(t,i); end; writeln('Length of dynamic array is ',t.length,#$0a#$0d); writeln('GetItem with index 5 = ',GetItem(t,5)); writeln('GetItem with index 56 = ',GetItem(t,56),#$0a#$0d); writeln('Deleting item with index 56'); DelItem(t,56); writeln('Item with Index 56 now is = ',GetItem(t,56),#$0a#$0d); writeln('Length of dynamic array is ',t.length); readln; FreeDynamac(T); end.
Member
Статус: Не в сети Регистрация: 21.10.2003 Откуда: Брест Фото: 47
На всякий случай, для тех кому понадобится, может быть:
есть очень оптимальный(я над ним потел два года) алгоритм нахождения дружественных чисел методом перебора - на PasCal и на Delphi 3.0...
_________________ А ещё недавно ждали AMD Steamroller на AM3+
Последний раз редактировалось AlexZerg 21.06.2004 23:21, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 21.10.2003 Откуда: Брест Фото: 47
SYSMAN У меня без комментариев - тут не сложные инструкции, но смысл понять трудновато...
Код:
Uses Crt,DOS; Const Con=2; Var l,j,x,xx:longint;
Function Drug(n1:longint):longint; Var i,k,Sq : longint; Begin k:=3+(n1 div 2); Sq:=Trunc(Sqrt(n1)); For i:=3 To Sq-1 Do IF n1 mod i = 0 Then Inc(k,(n1 div i)+i); IF n1 mod Sq = 0 Then If (n1 div Sq)<>Sq then Inc(k,(n1 div Sq)+Sq) else Inc(k,Sq); Drug:=k; End;
Function Drug1(n1:longint):longint; Var i,k,NSq : longint; Begin k:=1; i:=3; NSq:=Trunc(Sqrt(n1)); Repeat IF n1 mod i = 0 Then Inc(k,(n1 div i)+i); Inc(i,2); Until i>NSq-1; IF n1 mod NSq = 0 Then If (n1 div NSq)<>NSq then Inc(k,(n1 div NSq)+NSq) else Inc(k,NSq); Drug1:=k; End; { -> } Begin Clrscr; Repeat Write('Введите число, до которого искать : '); ReadLn(l); If l<=9 then ClrScr; Until l>=9; WriteLn('Дружественные числа : '); {чётные} j:=Con; While j<=l do begin x:=drug(j); if j<x then Begin if x mod 2 = 0 then xx:=drug(x) else xx:=drug1(x); if j=xx then Write('{',j,',',x,'} '); end; inc(j,2); end; {нечётные} j:=Con+1; While j<=l do begin x:=drug1(j); if j<x then Begin if x mod 2 = 0 then xx:=drug(x) else xx:=drug1(x); if j=xx then Write('{',j,',',x,'} '); end; inc(j,2); end; End.
Это мой последний вариант простого алгоритма. Больше я здесь ничего для ускорения не придумал. Проверял на время выполнения, код вычисления которого я отсюда убрал...
Просто есть ещё и сложный, в три раза бюльший, который работает намного быстрее с перебором чётных чисел, особенно больших (это "+"). Но каждый новый поиск этим алгоритмом приходится начинать с самого начала (это "-")... Но сложный алгоритм, думаю, тут не нужен...
_________________ А ещё недавно ждали AMD Steamroller на AM3+
Member
Статус: Не в сети Регистрация: 09.05.2003 Откуда: Краснодар
Помогите решить, я в принципе ее сделал, но препод говорит, что не правильно
и можно короче.
"Задана матрица m*n, в которой некоторые строки образуют арифметическую
прогрессию. Вывести количество строк которые образуют арифметическую
прогрессию. Матрица берется из файла input.txt, а колличество строк выводится в
файл output.txt. (в программе использовать подпрограммы)."
Вот мой вариант этой задачи:
const
m=2;
n=2;
type
massiv=array[1..m,1..n] of integer;
var
inp,out:text; {Ввод, вывод}
i,j,otv:integer;
a:massiv;
procedure readfile(var mas:massiv);
var
i,j,x:integer;
begin
for i:=1 to m do
begin
for j:=1 to n do
begin
read(inp,mas[i,j]);
end;
readln(inp);
end;
end;
function check(arr:massiv; poz:integer):boolean;
var
i,j,sub:integer;
ok:boolean;
begin
ok:=true;
sub:=arr[poz,1]-arr[poz,2];
for i:=2 to n do
begin
if (arr[poz,i-1])-(arr[poz,i])<>sub then
ok:=false;
end;
check:=ok;
end;
begin
otv:=0;
assign(inp,'input.txt');
assign(out,'output.txt');
reset(inp);
rewrite(out);
readfile(a);
for i:=1 to m do
begin
if check(a,i) then
inc(otv);
end;
write(out,otv);
close(inp);
close(out);
end.
Буду очередной раз безмерно благодарен если поможете.
Junior
Статус: Не в сети Регистрация: 21.06.2004 Откуда: Киев
SYSMAN я могу написать такую прогу заново за 15 минут, но разбиратся в чужой могу с пол-года подожди, скоро будет.
Добавлено спустя 10 минут, 54 секунды: Всё уже сажусь писать прогу...
Добавлено спустя 21 минуту, 38 секунд: Вот написал:
Цитата:
program sysman; var m,n:integer; rslt:integer; A:Array [1..100,1..100] of Integer; T:Text; procedure cip_h; var z,z1:integer; ap:boolean; r:integer; begin for z:=1 to n do begin r:=a[1,z]-a[2,z]; ap:=true; for z1:=2 to m do if (a[z1-1,z]-a[z1,z])<>r then ap:=false; if ap then inc(rslt); end;
end; begin assign(T,'input.txt'); reset(T); N:=0; while not eof(T) do begin m:=0; inc(n); while not eoln(T) do begin inc(m); read(T,A[m,n]); end; readln(T); end; close(T); rslt:=0; cip_h; writeln(rslt); assign(T,'output.txt'); rewrite(T); writeln(T,rslt); close(T); end.
Сорри что так долго. Однако теряю форму паскалиста, давно уже да Delphi пишу.
Вроде пашет.
Добавлено спустя 2 минуты, 3 секунды: Кстати. Если будут претензии, то попроси препода подробнее сформулировать задачу. Нужно считать только строки, или строки и столбцы и т.п.
_________________ "А с поцелуями торопиться не будем", - сказал принц, слезая со Спящей красавицы...
Если есть возможность помогите. На паскале необходимо написать программу.
Разбить экран на 3 равные области(640*160, 640*160, 640*160) и вывести произвоьное количество точек. В каждой области есть квадрат со стороной 160*160, который разбит на 5 областей. квадрат находится в левой части экрана и перемещается в правый. При перемещении расчитать в какой из 5 областей квадрата находится максимальное количество точек и в самую дальную (от центра квадрата) точку перенести центр квадрата. при попадании одной и той же точки в области разных квадратов приоритет у того к кому эта точка ближе (расстояние от точки до центра квадрата). В результате посмотреть какое количество точек окажет не охваченное ни одной областью 3 квадратов???
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения