IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Формирование массива на основе двух других, Использование процедур
ivan
сообщение 24.02.2009 15:23
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Задача-сформировать одномерный массив 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: цел.
  Начало
???
Конец


Сообщение отредактировано: ivan - 24.02.2009 15:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 8)
Lapp
сообщение 24.02.2009 16:14
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Вот как-то так, думаю:
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;


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ivan
сообщение 24.02.2009 16:28
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


А где происходит проверка на повторяющиеся элементы в массиве С?

Сообщение отредактировано: ivan - 24.02.2009 16:40
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 24.02.2009 16:34
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(ivan @ 24.02.2009 16:28) *
А где происходит проверка на повторяющиеся элементы в массиве С?
Они не могут повторяться. Во втором for происходит отсечение повторений.


Добавлено через 3 мин.
Иначе говоря, условие неповторяемости элементов С - лишнее в задаче. Оно следует из предыдущего текста задачи (если принять, что одинаковые элементы неразличимы).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ivan
сообщение 24.02.2009 16:40
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


В обучающих целях не лишнее) Большое спасибо, буду разбираться.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 24.02.2009 16:47
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(ivan @ 24.02.2009 16:40) *
В обучающих целях не лишнее)
Я так не думаю)).
Если тебе скажут: "Найти все четные числа. Найденные числа должны делиться на два." - это тебя не приведет в недоумение? smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ivan
сообщение 24.02.2009 21:07
Сообщение #7





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Меня в Паскале пока что многое приведет в недоумение, к сожалению. Попытка написания кода согласно алгоритму выше (до "Формирования"), но уже сам чувствую что есть ошибки, просьба их указать.
Код
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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 25.02.2009 5:09
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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;


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ivan
сообщение 25.02.2009 8:12
Сообщение #9





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Ок. Спасибо за замечания
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 13:56
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"