Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача с массивом

Автор: Rom1k 30.04.2007 18:16

Даны два упорядоченные массива А и В.Образовать из элементов массива упорядоченный массив С.

Я их ввёл,а объеденить их в упорядоченный-не знаю.Как это попроще сделать?

Program z_1;
Uses Crt;
Const
nmax=10;
Type
mas=array[1..nmax] of integer;
Var
A,B:mas;
C:array [1..2*nmax] of integer;
na,nb,nc:integer;
i,j,k:integer;

{Процедура ввода массивов}
Procedure vvod(var A: mas; n:byte);
begin
Write('Введите количество элементов массива: ');
ReadLn(n);
for i := 1 to n do
begin
read(A[i])
end;
end;{vvod}

Begin
ClrScr;
Writeln;
Writeln('Введите первый массив: ');
vvod(A,Na);
Writeln('Введите второй массив: ');
vvod(B,Nb);
end.


Автор: мисс_граффити 30.04.2007 18:26

Поиск -> сортировка слиянием

Автор: Rom1k 30.04.2007 18:44

искал,но ничего не нашёл(

Автор: 2ral 30.04.2007 18:44

uses crt;
var
a,b,c,d,e,f,m,n,i:integer; bool:boolean;
arn,arm,arf:array [1..100] of integer;
begin
clrscr;
readln(n);
for a:=1 to n do
read(arn[a]);
writeln;
readln(m);
for b:=1 to m do
read(arm[b]);
writeln;
d:=0;
a:=1;
b:=1;
i:=1;
repeat
inc(d);
if (n>=a) and (m>=b) then
begin
if arn[a]<arm[b] then
begin
arf[i]:=arn[a];
inc(a);
end
else
begin
arf[i]:=arm[b];
inc(b);
end;
inc(i);
end
else
begin
if n<a then
begin
arf[i]:=arm[b];
inc(b);
end
else
begin
arf[i]:=arn[a];
inc(a);
end;
inc(i);
end;
until (d=n+m);
for a:=1 to n+m do
write(arf[a]:3);
readln;
readln;
end.




может такой вариант?!

Автор: Rom1k 30.04.2007 18:50

ээм.вообще ничего не понятно.Есть нормальный рабочий вариант слияния двух массивов в один с упорядочиванием?

Автор: Rom1k 30.04.2007 19:30

помогите пожалуйста.оч надо!!!

Автор: volvo 30.04.2007 19:33

http://forum.pascal.net.ru/index.php?showtopic=16911
Скачай исходник, и замени работу с файлами на работу с массивами ...

Автор: 2ral 30.04.2007 19:38

uses crt;
var
a,b,c,d,e,f,h,n,m,max:integer;
bool:boolean;
ar1,ar2,arl:array [1..500] of integer;
begin
clrscr;
randomize;
readln(n,m);
bool:=true;
max:=-1;
f:=1;
for b:=1 to n do
begin
ar1[b]:=random(9);
ar1[b]:=ar1[b]+1;
write(ar1[b]:3);
end;
writeln;
for b:=1 to m do
begin
ar2[b]:=random(9);
ar2[b]:=ar2[b]+1;
write(ar2[b]:3);
end;
writeln;
for b:=1 to n+m do
begin
for c:=1 to n do
if max<=ar1[c] then
begin
max:=ar1[c];
e:=c;
bool:=true;
end;
for c:=1 to m do
if max<=ar2[c] then
begin
max:=ar2[c];
e:=c;
bool:=false;
end;
arl[f]:=max;
inc(f);
max:=-5;
if bool then ar1[e]:=-2 else ar2[e]:=-2;
e:=0;
end;
for b:=1 to n+m do
write(arl[b]:3);
readln;
end.


а так?

Автор: мисс_граффити 30.04.2007 19:45

М
2ral, пользуйся, пожалуйста, тегами для обрамления кода!


Автор: Rom1k 30.04.2007 19:52

Цитата(volvo @ 30.04.2007 16:33) *

http://forum.pascal.net.ru/index.php?showtopic=16911
Скачай исходник, и замени работу с файлами на работу с массивами ...

скачал,посмотрнл,прочитал,попытался понять,но опять же ничего не получается.Вот написал:
только не знаю,почему не правильно работает!!!

Program z_1;
Uses Crt;
Const
n=10;
Type
mas=array[1..n] of integer;
Var
A,B:mas;
C:array [1..2*n] of integer;
i,j,k:integer;
na,nb:byte;
{Процедура ввода массивов}
Procedure vvod(var A: mas; n:byte);
begin
Write('Введите количество элементов массива: ');
ReadLn(n);
WriteLn('Элементы ');
for i := 1 to n do
begin
read(A[i])
end;
end;{vvod}

Begin
ClrScr;
Writeln;
Writeln('Введите первый массив: ');
vvod(A,na);
Writeln('Введите второй массив: ');
vvod(B,nb);
For k := 1 to 2*n do
begin
if (i <= n) and (j <= n) then
if a[i] <= b[j] then
begin
c[k] := a[i];
inc(i)
end
else
begin
c[k] := b[j];
inc(j)
end ;
end;
else
if i > n then
begin
c[k] := b[j];
inc(j)
end
else
begin
c[k] := a[i];
inc(i)
end
end;
{Вывод полученного массива}
Writeln('Массив полученный при объединении массивов А и В: ');
for k:=1 to n*2 do
writeln('C[',k,'] = ',c[k]);
readkey;
End.



Добавлено через 18 мин.
с ума сойти.пол дня с этой задачей,а толку-нет(

Автор: volvo 30.04.2007 20:16

const
size = 10;

type
arrType = array[1 .. size] of integer;
buffer = array[1 .. 2*size] of integer;

procedure merge(var a: buffer; b, c: arrType);
var p, p_b, p_c: integer;
begin
p_b := 1; p_c := 1;
p := 1;

while (p_b <= size) and (p_c <= size) do begin
if b[p_b] < c[p_c] then begin
a[p] := b[p_b]; inc(p); inc(p_b);
end
else begin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;

while p_b <= size + 1 do begin
a[p] := b[p_b]; inc(p); inc(p_b);
end;
while p_c <= size + 1 do begin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;

const
one: arrType = (1, 3, 4, 5, 6, 7, 7, 8, 10, 11);
two: arrType = (1, 2, 4, 5, 5, 7, 8, 11, 11, 11);
var
res: buffer;
i: integer;
begin
merge(res, one, two);
for i := 1 to 2 * size do
write(res[i]:3);
writeln
end.

Так лучше? (вводить массивы сам ты умеешь...)

Автор: Rom1k 30.04.2007 20:50

тут получается,что в обоих массивах надо одинаковое кол-во элементов вводить? это типа обязательное условие???

Автор: volvo 30.04.2007 20:59

Нет, не обязательное... А если тебе это надо было, я как догадаться должен? Передавай количество элементов в процедуру Merge, вот так:

procedure merge(var a: buffer; b, c: arrType;
n_b, n_c: integer);
var p, p_b, p_c: integer;
begin
p_b := 1; p_c := 1;
p := 1;

while (p_b <= n_b) and (p_c <= n_c) do begin
if b[p_b] < c[p_c] then begin
a[p] := b[p_b]; inc(p); inc(p_b);
end
else begin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;

while p_b <= n_b do begin
a[p] := b[p_b]; inc(p); inc(p_b);
end;
while p_c <= n_c do begin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;


Автор: Rom1k 30.04.2007 21:06

крыша у меня едет.Что я ещё мог здесь неправильно сделать???

program n1;
uses crt;
const
size = 10;

type
arrType = array[1 .. size] of integer;
buffer = array[1 .. 2*size] of integer;

procedure merge(var a: buffer; b, c: arrType);
var p, p_b, p_c: integer;
begin
p_b := 1; p_c := 1;
p := 1;

while (p_b <= size) and (p_c <= size) do begin
if b[p_b] < c[p_c] then begin
a[p] := b[p_b]; inc(p); inc(p_b);
end
else begin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;

while p_b <= size + 1 do begin
a[p] := b[p_b]; inc(p); inc(p_b);
end;
while p_c <= size + 1 do begin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;

var
one: arrType;
two: arrType;
res: buffer;
i,j,k,na,nb: integer;
begin
write('kol-vo el 1 mas ');
readLn(na);
for i:=1 to na do
read(one[i]);
write('kol-vo el 2 mas ');
readLn(nb);
for i:=1 to nb do
read(two[j]);
merge(res, one, two);
for i := 1 to 2 * size do
write(res[k]:3);
writeln
end.



Автор: volvo 30.04.2007 21:11

Я не знаю, что ты мог сделать неправильно... Как видно, тебя просто не интересует то, что тебе подсказывают? Ну, так разбирайся сам.

Автор: Rom1k 30.04.2007 21:14

я пытаюсь разобраться.а что я не заметил,почему не интересует,это ведь надо мне...Щас.ещё раз попытаюсь найти ошибки!

Добавлено через 4 мин.
я передал количество элементов в процедуру,но он мне выводит после компиляции в ответе все нули(

Автор: Rom1k 1.05.2007 0:02

не у кого не осталось сил мне помочь?

Автор: klem4 1.05.2007 0:48

Тебе же volvo все написал, измени процедуру merge на последний вариант c заголовком

Цитата
procedure merge(var a: buffer; b, c: arrType; n_b, n_c: integer);


И передавай массивы и их размерности

Цитата
merge(res, one, two, na, nb);

Автор: Rom1k 1.05.2007 0:53

я так и сделал но почему-то процедура не упорядочивает их.и при выходе выводит цифры,а после них очень много нулей

Автор: klem4 1.05.2007 0:59

Приаттач исходник полностью, файлом только, а то и так страница еле грузится.

Автор: Rom1k 1.05.2007 1:01

я всё перепроверил.теперь прога работает правильно только как мне в конце убрать эту кучу нулей? файл прекрепил!!!


Прикрепленные файлы
Прикрепленный файл  KUR_1.PAS ( 1007 байт ) Кол-во скачиваний: 189

Автор: volvo 1.05.2007 1:03

Присоединяй программу полностью, и данные, с которыми тестировал - тоже...

Автор: klem4 1.05.2007 1:05

...

Цитата
for i:=1 to na do
read(one[k]);


blink.gif

Автор: Rom1k 1.05.2007 1:06

не понял что-то?! wacko.gif и ещё..я её тестю с большими числами,она мне не правильно их сортирует

Автор: volvo 1.05.2007 1:07

Кроме этого:
замени

for i := 1 to 2 * size do
write(res[i]:3);

на
for i := 1 to n_a + n_b do
write(res[i]:3);

Автор: klem4 1.05.2007 1:08

Дальше больше

Цитата
for i:=1 to nb do
read(two[j]);


Цитата
не понял что-то?!


Если цикл по i, то и читать видимо надо one[i] а не one[k] .... C two тоже самое

Автор: Rom1k 1.05.2007 1:15

вот полностью переделанный вариант,да и он не работает правильно.
Может сортировка не правильная? или что-то ещё?


Прикрепленные файлы
Прикрепленный файл  KUR_1.PAS ( 1023 байт ) Кол-во скачиваний: 190

Автор: klem4 1.05.2007 1:17

При каких данных-то ?!

Автор: volvo 1.05.2007 1:18

Ты можешь ДАННЫЕ, с которыми тестируешь, привести, или это военная тайна? Почему надо все время по 15 раз одно и то же повторять?

Автор: Rom1k 1.05.2007 1:20

я ввожу 2 массива
массив А: 4 5 77 1
массив В: 76 45 3 2 6 7

вот что он мне выдаёт на выходе : 4 5 76 45 3 2 6 7 77 1 nea.gif

Автор: klem4 1.05.2007 1:23

blink.gif blink.gif

Цитата(Rom1k)
Даны два упорядоченные массива А и В.Образовать из элементов массива упорядоченный массив С.


Ты бы хоть задание прочитал ... nea.gif

Автор: Rom1k 1.05.2007 1:24

блиннннннннннннннннннн.сорри!!!! спасибо большое.с меня пиво! give_rose.gif