Помощь - Поиск - Пользователи - Календарь
Полная версия: Формирование массива на основе двух других
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ivan
Задача-сформировать одномерный массив C, содержащий элементы, встречающиеся в массиве А несколько раз, которые есть в массиве В в одном экземпляре. Элементы в массиве C не должны повторяться.
Вопрос в написании алгоритма "Формирование" и соответствующему ему кода на языке Паскаль.
Код
Алгоритм  “Формирование массива”
Внутренние переменные:
    nA: цел.
    nB: цел.
    nC: цел.
    A, B, C : : массив [1..20]:цел.
Начало
    Вывод (‘Задание.’)
    Ввод (A,na,’A’)
    Ввод (B,nb, ’B ’)
    Формирование(A,na,B,nb,C,nc)
    Вывод (A,na, ’A ’)
    Вывод (B,nb, ’B ’)
    Вывод (C,nc, ’C ’)
Конец

Алгоритм “Ввод ”
Входные переменные:
Name: символ;
Выходные переменные:
n : цел. {количество элементов  во вводимом массиве }
Mas [1..20] : массива : цел
Внутренние переменные:
i : цел.
Начало
      Цикл
           Вывод (‘Введите число элементов массива ’,name,’ <=20’)
           Ввод(n)
                 Кцикла-до (n>1) и (n<=20)
     Вывод (‘Элементы массива ’,name,’ – целые числа’)
     Цикл-для I от 1 до n
           Вывод (name,’[',i,']=')
           Ввод (Mas[i])
     Кцикла
Конец


Алгоритм “Вывод ”
Входные переменные:
n : цел. {количество элементов в выводимом массиве}
Mas [1..20] : массива : цел {Выводимый массив}
Name : символ
Внутренние переменные:
i: цел.
Начало
      Если n>=1 то
           Вывод (‘Число элементов массива ’,name,’ = ’, n);
           Вывод (‘Массив ’,name);
           Цикл-для  i от 1 до x
                  Вывод (Mas[i])
           Кцикла
     Иначе
           Вывод (‘Нет элементов, удовлетворяющих условию!’)
      Кесли
Конец


Алгоритм “Формирование ”
Входные переменные:
nA : цел. {количество элементов массива A}
nB : цел. {количество элементов массива B}
A [1..20] : массива : цел {массив A}
B [1..20] : массива : цел {массив B}
Выходные переменные:
nC: цел. {количество элементов массива C}
C [1..20] : массива : цел {массив C}
Внутренние переменные:
  i: цел.
  j, kol,  z: цел.
  Начало
???
Конец
Lapp
Вот как-то так, думаю:
kC:=0;
for i:=1 to nA do begin
kA:=0;
for j:=1 to i-1 do if A[i]=A[j] then Inc(kA);
if kA=0 then begin
for j:=i+1 to nA do if A[i]=A[j] then Inc(kA);
if kA=0 then begin
kB:=0;
for j:=1 to nB do if A[i]=B[j] then Inc(kB);
if kB>1 then begin
Inc(kC);
C[kC]:=A[i]
end
end
end
end;
ivan
А где происходит проверка на повторяющиеся элементы в массиве С?
Lapp
Цитата(ivan @ 24.02.2009 16:28) *
А где происходит проверка на повторяющиеся элементы в массиве С?
Они не могут повторяться. Во втором for происходит отсечение повторений.


Добавлено через 3 мин.
Иначе говоря, условие неповторяемости элементов С - лишнее в задаче. Оно следует из предыдущего текста задачи (если принять, что одинаковые элементы неразличимы).
ivan
В обучающих целях не лишнее) Большое спасибо, буду разбираться.
Lapp
Цитата(ivan @ 24.02.2009 16:40) *
В обучающих целях не лишнее)
Я так не думаю)).
Если тебе скажут: "Найти все четные числа. Найденные числа должны делиться на два." - это тебя не приведет в недоумение? smile.gif
ivan
Меня в Паскале пока что многое приведет в недоумение, к сожалению. Попытка написания кода согласно алгоритму выше (до "Формирования"), но уже сам чувствую что есть ошибки, просьба их указать.
Код
uses crt;
var
nA,nB,nC:integer;
A,B,C:array [1..20] of integer;

procedure vvod (var Mas:array[1..20] of integer; n:integer; Name:char);
var
I:integer;
  begin
   repeat

     writeln('vvedite 4islo elementov massiva  ',name,' <=20');
     read(n);
    until (n>1) and (n<=20);
   writeln('Elementi massiva ',name,' - zelie 4isla');
   for I:=1 to n do
    begin
     write(name,'[',i,']=');
     read(Mas[i]);
    end;
  end;

procedure vivod (const Name: char; Mas: array of integer; n: integer);
var
i:integer;
begin
     if n>=1 then
     begin
     Writeln('Chislo elementov massiva',name,' = ', n);
     Writeln('Massiv ',name);
     for i:=1 to n do
     write(Mas[i]:4)
     end
     else
     Writeln('Net elementov, ydovletvorayshih ysloviy!');
     end;
Lapp
Цитата(ivan @ 24.02.2009 21:07) *
чувствую что есть ошибки,

Так не пойдет.. Типа другие должны проверять твой код по мере его написания, в реальном времени? dry.gif Извини, но это просто нечестно. Будет конкретный вопрос по языку или по программе - пожалуйста, милости просим. А подметать за тобой мусор - не нанимались..

Хотя бы _допиши_ свой код и _попробуй_скомпилить_. Синтаксические ошибки тебе скажет компилятор. Можешь даже нажать F9, не дописав - большая часть ошибок (если они есть) будет найдена. Останутся вопросы или просто непонимание, что происходит - you're always welcome! Насколько я понял, по алгоритму у теья больше вопросов нет. Но если появятся - тоже неси smile.gif.

Добавлено через 16 мин.
М
Для Паскаля просьба использовать паскалевские тэги [cоde=pas] ... [/cоde]



Пара замечаний по стилю..

1. Желательно цикл или условный оператор не обрывать на do, then или else. То есть вот это:
    for i:=1 to n do
write(Mas[i]:4)
- лучше записать так:
    for i:=1 to n do write(Mas[i]:4)
- или по крайней мере сместить нижнюю строку вправо:
    for i:=1 to n do
write(Mas[i]:4)


2. Если после do, then, else идет begin, то, в соответствии с вышесказанным, лучше писать его на той же строке.

3. После begin, repeat, case следующие строки смещай вправо до закрытия блока (end, until)
    for i:=1 to n do begin
write(Mas[i]:4);
....
end;
ivan
Ок. Спасибо за замечания
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.