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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 18:25   #1
swillrocker
Пользователь
 
Регистрация: 04.05.2011
Сообщений: 44
По умолчанию Одномерные массивы(Pascal)

Даны две упорядоченные по невозрастанию последовательности a(1..m) и b(1..n) . Получить упорядоченную по невозрастанию последовательность длины n+m из членов данных последовательностей.

(Разбить задачу на подзадачи таким образом, чтобы решение каждой подзадачи описывалось подпрограммой, а основная программа состояла бы из последовательности вызовов подпрограмм)

Код:
Program lab4rr;
const
  m=3;
  n=4;
type
  TA = array [1..m] of integer;
  TB = array [1..n] of integer;
  TC = array [1..m+n] of integer;
procedure someproc(a:TA;b:TB;var c:TC);
var
  i:integer;
  ixA,ixB:integer;
begin
  ixA:=1;
  ixB:=1;
  for i := 1 to m+n do
    if (a[ixA]>b[ixB]) or (ixB>n) then
      begin
        c[i]:=a[ixA];
        inc(ixA)
      end
    else
      begin
        c[i]:=b[ixB];
        inc(ixB)
      end
end;
var
  a:TA;
  b:TB;
  c:TC;
  i:integer;
begin
  a[1]:=3;
  a[2]:=2;
  a[3]:=1;
  b[1]:=8;
  b[2]:=5;
  b[3]:=3;
  b[4]:=1;
  someproc(a,b,c);
  writeln;
  for i := 1 to m+n do
    write(c[i],',');
  writeln;
  readln;
end.
Программа работает, но не для всех последовательностей.
Например при a=12 11 10 и b=4 3 2 1 происходит выход за границы.
Исправьте пожалуйста, буду чрезмерно благодарен.
Да и ввод нужно сделать с клавиатуры, а не так:

Код:
begin
  a[1]:=3;
  a[2]:=2;
  a[3]:=1;
  b[1]:=8;
  b[2]:=5;
  b[3]:=3;
  b[4]:=1;

Последний раз редактировалось swillrocker; 19.05.2011 в 18:31.
swillrocker вне форума Ответить с цитированием
Старый 19.05.2011, 18:55   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Да и ввод нужно сделать с клавиатуры, а не так:
Заполнение массива с клавиатуры:
Код:
for i:=1 to n do
   readln(a[i]);
Случайными числами от 0 до 100:
Код:
Randomize //активация генератора случайных чисел, где-нибудь в начале программы
for i:=1 to n do
   a[i]:=random(100);
Странно, что у вас возникла проблема именно с этим. Это же первое что рассматривают в учебниках в соответствующем разделе.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.05.2011 в 18:58.
Alex11223 вне форума Ответить с цитированием
Старый 19.05.2011, 18:59   #3
swillrocker
Пользователь
 
Регистрация: 04.05.2011
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Заполнение массива с клавиатуры
Код:
for i:=1 to n do
   readln(a[i]);
Случайными числами от 0 до 100.
Код:
Randomize //активация генератора случайных чисел, где-нибудь в начале программы
for i:=1 to n do
   a[i]:=random(100);
Странно, что у вас возникла проблема именно с этим. Это же первое что рассматривают в учебниках в соответствующем разделе.
Проблема не в этом... Когда я использую процедуру заполнения массива, почему-то ответ получается совсем другим. Да и главная проблема не в вводе, а в выходе за границы

Последний раз редактировалось swillrocker; 19.05.2011 в 19:01.
swillrocker вне форума Ответить с цитированием
Старый 19.05.2011, 19:28   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Например при a=12 11 10 и b=4 3 2 1 происходит выход за границы.
Вроде бы и при тех, что у вас сейчас (3 2 1, 8 5 3 1) выходит за пределы. Мб проще заполнить ими 3 массив в любом порядке и отсортировать по убыванию? (процедуры заполнения 3 массива первыми двумя и сортировки)

Цитата:
Когда я использую процедуру заполнения массива, почему-то ответ получается совсем другим.
Что за процедура?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.05.2011, 19:36   #5
swillrocker
Пользователь
 
Регистрация: 04.05.2011
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вроде бы и при тех, что у вас сейчас (3 2 1, 8 5 3 1) выходит за пределы. Мб проще заполнить ими 3 массив в любом порядке и отсортировать по убыванию? (процедуры заполнения 3 массива первыми двумя и сортировки)


Что за процедура?
Может быть и проще. ))

Код:
procedure read_arr(var a:array of integer;s:byte);
var i:byte;
begin
  for i:=1 to s do read(a[i]);
end;
begin
read_arr(a,m);
read_arr(b,n);
end.
swillrocker вне форума Ответить с цитированием
Старый 19.05.2011, 20:13   #6
swillrocker
Пользователь
 
Регистрация: 04.05.2011
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
(процедуры заполнения 3 массива первыми двумя и сортировки)
Могли бы вы мне написать процедуру заполнения 3 массива первыми двумя ?
swillrocker вне форума Ответить с цитированием
Старый 19.05.2011, 21:06   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

/del...,,,,,
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.05.2011 в 21:09.
Alex11223 вне форума Ответить с цитированием
Старый 19.05.2011, 21:16   #8
swillrocker
Пользователь
 
Регистрация: 04.05.2011
Сообщений: 44
По умолчанию

Мой вариант такой...
Код:
procedure glue_arr(a:ta;b:tb;var c:tc);
var i:byte;
begin
  for i:=1 to m do a[i]:=c[i];
  for i:=m+1 to m+n do b[i-m]:=c[i];
end;
swillrocker вне форума Ответить с цитированием
Старый 19.05.2011, 21:38   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
procedure glue_arr(a:ta;b:tb;var c:tc);
с самоуничтожится после завершения процедуры.
вот как-то так, исправил то, что было постом выше. Что-то не пойму как это в Паскале лучше сделать. Тут же никакого аналога "передачи по ссылке" в процедуру нет?

Код:
procedure fus(var a:TA; b:TB);
var i:integer;
begin
  for i:=1 to m do
     c[i]:=a[i];
  for i:=1 to n do
     c[i+m]:=b[i];
end;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.05.2011 в 21:42.
Alex11223 вне форума Ответить с цитированием
Старый 19.05.2011, 23:10   #10
swillrocker
Пользователь
 
Регистрация: 04.05.2011
Сообщений: 44
По умолчанию

Аааа помогите я уже не могу xD...

Вот эта программа без процедур и все работает !


Код:
const m=3;n=4;
var
  a:array[1..m] of integer;
  b:array[1..n] of integer;
  c:array[1..m+n] of integer;
  t,i,ch:integer;
begin
   for i:=1 to m do
     begin
        readln(a[i]);
        c[i]:=a[i];
     end;
   for i:=1 to n do
     begin
        readln(b[i]);
        c[i+m]:=b[i];
     end;
 writeln;
 ch:=-1;
    while ch<>0 do
       begin
         ch:=0;
         for i:=2 to m+n do
           if c[i]>c[i-1] then
             begin
                 inc(ch);
                 t:=c[i-1];
                 c[i-1]:=c[i];
                 c[i]:=t
              end
       end;
  writeln('Result:');
  for i:=1 to m+n do
    write(c[i],' ');
  writeln;
  readln;
end.
А вот она же, но с процедурами и не работает...

Код:
const m=3;n=4;
type
  ta = array[1..m] of integer;
  tb = array[1..n] of integer;
  tc = array[1..m+n] of integer;
procedure read_arr(var a:array of integer;const s:byte);
var i:byte;
begin
  for i:=1 to s do readln(a[i]);        
   end;
procedure glue_arr(a:ta;b:tb;var c:tc);
var i:integer;
begin
  for i:=1 to m do c[i]:=a[i];
  for i:=1 to n do c[i+m]:=b[i];
end;     
procedure sort_arr(var c:tc);
var t,i,ch:integer;
begin       
  ch:=-1;
  while ch<>0 do
    begin
      ch:=0;
      for i:=2 to m+n do
       if c[i]>c[i-1] then
      begin
        inc(ch);
        t:=c[i-1];
        c[i-1]:=c[i];
        c[i]:=t
      end;
    end;
end;
procedure write_arr(const a:array of integer);
var i:byte;
begin
  for i:=1 to m+n do
    write(a[i],' ');
  writeln;
end;
var a:ta;b:tb;c:tc;
begin 
read_arr(a,m);
read_arr(b,n);
glue_arr(a,b,c);
sort_arr(c);
writeln('Result:');
write_arr(c);
  readln;
end.
swillrocker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
одномерные массивы. (pascal) Диляра - новичок Помощь студентам 7 01.12.2010 20:42
одномерные массивы. (pascal) Диляра - новичок Помощь студентам 7 16.11.2010 21:17
Одномерные массивы 2 (Pascal) Дима82 Помощь студентам 4 16.02.2009 21:21
Одномерные массивы(Pascal) Дима82 Помощь студентам 7 07.06.2008 15:33
Одномерные массивы - Pascal W_P Помощь студентам 8 27.02.2008 19:24