Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Внимание! Есть замечания модератора по теме: Название темы должно адекватно и полно отражать суть решаемой задачи/проблемы!
Старый 07.08.2012, 10:51   #1
dmitriy20104
Пользователь
 
Регистрация: 21.06.2012
Сообщений: 36
По умолчанию Соединить два массива а и b в массив с так, чтобы его элементы были упорядочены по возрастанию. Поправить код.

Здравствуйте! У меня есть код, но он не правильный. Условие задачи заключается в том, что мне надо соединить два массива а и b в массив с так, чтобы его элементы были упорядочены по возрастанию.
Код:
var m,n,i,j,k:integer;
    a,b,c:array[1..200] of real;
begin
write('введите размер массива А');
read(n);
for i:=1 to n do
read(a[i]);
write('введите размер массива B');
read(m);
for i:=1 to m do
read(b[i]);
i:=1;
j:=1;
k:=0;
while (i<=n) and (j<=m) do
begin
if a[i]<=b[j] then
begin
k:=k+1;
c[k]:=a[i];
i:=i+1;
end
else
begin
k:=k+1;
c[k] := b[j];
j:=j+1;
end;
end;
while (i<=n) do
begin
k:=k+1;
c[k]:=a[i];
i:=i+1;
end;
while (j<=m) do
begin
k:=k+1;
c[k]:=b[j];
j:=j+1;
end;
writeln('результат: ');
for i:=1 to k do
writeln(c[i]:0:3,' ');
readln;
end.
dmitriy20104 вне форума Ответить с цитированием
Старый 07.08.2012, 10:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Вы условие задачи привели полностью? Исходные массивы не являются ли упорядоченными? Если нет - то проще предварительно отсортировать исходные массивы, а потому уже их объединить. Или отсортировать полученный массив C.

Впрочем, есть и другие варианты решения...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.08.2012, 11:03   #3
dmitriy20104
Пользователь
 
Регистрация: 21.06.2012
Сообщений: 36
По умолчанию

Точно! Изначально массивы упорядоченны по возрастанию.
dmitriy20104 вне форума Ответить с цитированием
Старый 07.08.2012, 12:21   #4
Arhangel7
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 90
По умолчанию

Смею заметить, длинна итогового массива стоит сделать длинной вмешающей в себя оба массива (А и В)
как-то так
Arhangel7 вне форума Ответить с цитированием
Старый 07.08.2012, 12:27   #5
dmitriy20104
Пользователь
 
Регистрация: 21.06.2012
Сообщений: 36
По умолчанию

Пожалуй... Что-то я не приметил...
dmitriy20104 вне форума Ответить с цитированием
Старый 07.08.2012, 14:08   #6
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

Код:
uses crt;
var m,n,i,j,k:integer;
    a,b:array[1..200] of real;
      c:array[1..400] of real;
begin
write('введите размер массива А');
read(n);
for i:=1 to n do
read(a[i]);
write('введите размер массива B');
read(m);
for i:=1 to m do
read(b[i]);

for i:=1 to n do
c[i]:= a[i];
for i:=1 to m do
c[n+i]:=b[i];

{добавь, "пузырьковая сортировка" и усё}
writeln('результат: ');
for i:=1 to n+m do
writeln(c[i]:0:3,' ');
readln;
end.

Последний раз редактировалось Madmaxisss; 07.08.2012 в 14:16.
Madmaxisss вне форума Ответить с цитированием
Старый 07.08.2012, 15:17   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Madmaxisss
{добавь, "пузырьковая сортировка" и усё}
в данном случае это будет неэффективное -> НЕприемлимое решение! (т.е. задача явно учебная, и преподаватель может не принять такое решение (я бы не принял).
Массивы изначально отсортированы - поэтому нужно добавлять элементы сравнивая, какой из элементов больше.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.08.2012, 15:46   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Также вместо циклов по перенесению можно использовать готовую процедуру move. real занимает 6 байт.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 08.08.2012, 09:58   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

вообще-то, я имел в виду, что в данной задаче сортировки ВООБЩЕ не должно быть.


я предполагал примерно такое решение:
Код:
const MaxSize = 100;
var 
  a,b : array[1..MaxSize] of real;
  c : array[1..MaxSize*2] of real;
  i, iA, iB, N, M : integer;
begin
  write('введите размер массива А: ');
  repeat
    readln(N);
    if (N<0) or (N>MaxSize)
        then WriteLn('Ошибка! Размер должен быть от 0 до ',MaxSize);
  until (N>=0) and (N<=MaxSize);

  if N>0 then Write('Введите элементы массива A в возрастающем порядке: ');
  for i:=1 to N do begin
     readln(a[i]);
     if (i>1) and (a[i]<=a[i-1]) then begin
       WriteLn('Ошибка! Элементы должны быть в возрастающем порядке!');
       WriteLn('Конец. Выходим из программы по ошибке ввода!');
       Readln;
       Halt(1)
     end;
  end;

  write('введите размер массива B: ');
  repeat
    readln(M);
    if (M<0) or (M>MaxSize)
        then WriteLn('Ошибка! Размер должен быть от 0 до ',MaxSize);
  until (M>=0) and (M<=MaxSize);

  if M>0 then Write('Введите элементы массива B в возрастающем порядке: ');
  for i:=1 to M do begin
     readln(b[i]);
     if (i>1) and (b[i]<=b[i-1]) then begin
       WriteLn('Ошибка! Элементы должны быть в возрастающем порядке!');
       WriteLn('Конец. Выходим из программы по ошибке ввода!');
       Readln;
       Halt(2)
     end;
  end;
  {закончили ввод данных}


  {а вот, собственно и заполнение массива C}
  iA := 1;
  iB := 1;
  for i:=1 to N+M do begin
    if (iA<=N) and (iB<=M) then
         if a[iA]<b[iB] then begin c[i] := a[iA]; inc(iA) end
         else begin c[i] := b[iB]; inc(iB) end
    else
      if iA<=N then begin c[i] := a[iA]; inc(iA) end
      else begin c[i] := b[iB]; inc(iB) end
  end;

  {выведем содержимое массива C на экран для контроля}
  WriteLn('Массив C: ');
  for i:=1 to N+M do
    Write(c[i]:1:4,' ');
  WriteLn;
  Readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.08.2012, 10:05   #10
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Вот как это называется. Собственно, и алгоритм там есть.
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В файле f элементы упорядочены по возрастанию.требуется слить эти файлы в один файл,также упорядоченный по возрастанию ayoka Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2012 21:51
Турбо ассемблер - построить массив путём сдвига исходного массива и умножить все элементы полученного массива на два Александр16 Помощь студентам 5 12.02.2012 20:30
Турбо ассемблер - построить массив путём сдвига исходного массива и умножить все элементы полученного массива на два Александр16 Помощь студентам 1 12.02.2012 19:56
Массивы на pascal (преобразовать массив так, чтобы сначала были единицы, а потом - все остальные) Mercial Помощь студентам 6 18.02.2011 22:07
Проверить, упорядочены ли по возрастанию элементы каждой строки матрицы (Pascal). cosa nostra Помощь студентам 1 11.12.2009 21:26