Помощь - Поиск - Пользователи - Календарь
Полная версия: простая задача на массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
pusha
помогите, пожалуйста, девушке-блондинке... wub.gif )) ни разу не работала с массивами, а здесь придется... программа простая сама понимаю.., но вам же не сложно мне помочь и написать вот это: Даны целые числа а1,а2,...,аn, среди которых могут быть повторяющиеся. Составьте новый массив из чисел, взятых по одному из каждой группы равных членов данной последовательности. Очень прошу..., буду благодарна за любую помощь... give_rose.gif
мисс_граффити
ну раз мало того, что девушке, так еще и блондинке....
если я правильно поняла задание - то что-то вроде такого:
program blondi;
const n=10;
var a,b:array[1..n]of integer;
fl:boolean;
i,j,kol:integer;
begin
randomize;
kol:=0;
for i:=1 to n do
begin
a[i]:=random(10);
fl:=true;
write(a[i], ' ');
for j:=1 to kol do
if b[j]=a[i] then
fl:=false;
if fl then
begin
inc(kol);
b[kol]:=a[i];
end;
end;
writeln;
for i:=1 to kol do
write(b[i],' ');
readln;
end.
pusha
ОГРОМНОЕ СПАСИБО, МИСС_ГРАФФИТИ!!! очень тебе благодарна за помощь!!! good.gif
pusha
ой... еще вопрос: здесь выводятся все члены последовательности без повторений, а как сделать, чтобы выводились только те, которые повторяются, но в единичном экземпляре(без тех, которые не повторяются в первоначальном массиве)? unsure.gif
Lapp
Цитата(pusha @ 1.12.2006 2:03) *
как сделать, чтобы выводились только те, которые повторяются, но в единичном экземпляре(без тех, которые не повторяются в первоначальном массиве)?

Если взять за основу код мисс_граффити, то нужно добавить еще один массив, который заполняется примерно так же. Я очень извиняюсь, но я изменил кое-какие названия переменных для большей корреляции с назначением. Так, выходной массив я назвал Dup (Duplication, дубли), а промежуточный - All (все различные элементы). Признак добавления элемента в массив я назвал Take (брать).
{for pusha, by Miss_Graffity & Lapp}
{to delete all singles and duplications from array}
const
n=10;

var
a,All,Dup:array[1..n]of integer;
i,j,k,l,Count:integer;
Take:boolean;

begin
k:=0;
l:=0;
for i:=1 to n do begin
a[i]:=random(10);
write(a[i],' ');
Take:=true;
for j:=1 to k do if All[j]=a[i] then Take:=false;
if Take then begin
inc(k);
All[k]:=a[i];
end
else begin
Take:=true;
for j:=1 to l do if Dup[j]=a[i] then Take:=false;
if Take then begin
Inc(l);
Dup[l]:=a[i]
end
end
end;
writeln;
for i:=1 to l do write(Dup[i],' ');
readln;
end.

Ниже - другой вариант решения. Он основан на множествах, что несет в себе некие преимущества (проще и быстрее), но и недостатки тоже:
- множества не могут содержать более 255 элементов;
- возможно, вы еще просто не проходили множества..
{for pusha by Lapp}
{to delete singles and duplicates, uses sets}
const
n=20;
r=20; {range, must be < 256}

var
a,b:array[1..n]of integer;
All,Dup:set of byte;
i,j:integer;

begin
for i:=1 to n do a[i]:=Random(r ); {заполняем массив случайными числами}
All:=[]; {готовим множество всех элементов}
Dup:=[]; {готовим множество для дублей}
for i:=1 to n do begin
Write(a[i]:3);
if a[i] in All then Dup:=Dup+[a[i]]; {заполняем множество дублей}
All:=All+[a[i]] {заполняем множество всех}
end;
WriteLn;
j:=0; {готовим счетчик выходного массива}
for i:=1 to n do if a[i] in Dup then begin
Inc(j); {увеличиваем счетчик выходного массива}
b[j]:=a[i]; {заполняем выходной массив}
Dup:=Dup-[a[i]] {убираем элемент из множества дублей}
end;
for i:=1 to j do Write(b[i]:3);
WriteLn;
ReadLn
end.

PS
не вижу доказательств в профиле, что ты блондинка.. smile.gif
мисс_граффити
lapp, да имен переменных мне не жалко. smile.gif просто обзывала их по привычке. fl - это flag...
но я не
Цитата
Miss_Graffity
, а Miss_Graffiti
сорри за офф.

теперь по теме.
если уж брать за основу мой код, то, продолжая следовать женской логике, новый массив создавать не будем.
(переменные оставла, как были... )
program blondi;
const n=10;
var a,b:array[1..n]of integer;
fl:boolean;
i,j,kol:integer;
begin
randomize;
kol:=0;
{отделяем цикл с заполнением - потом будем работать только с готовым массивом}
for i:=1 to n do
begin
a[i]:=random(10);
write(a[i], ' ');
end;

for i:=1 to n do
begin
fl:=false;{изначально считаем, что элемент нам не нужен}
for j:=1 to n do
if (a[i]=a[j]) and (i<>j) then {первая проверка: если элемент повторяющийся...}
fl:=true;{если первый тест пройден, задумываемся о том, что его можно взять}
if fl then {если решили, что предварительно он подходящий}
for j:=1 to kol do
if b[j]=a[i] then {то проверяем - может, мы его уже взяли?}
fl:=false;{второй раз брать не будем}
if fl then {если по всем критериям подходит}
begin
inc(kol);
b[kol]:=a[i];{то берем}
end;
end;
writeln;
for i:=1 to kol do
write(b[i],' ');
readln;
end.

при желании, можно вывод не писать отдельным циклом, а делать сразу после принятия решения о том, что элемент нам подошел... имхо, не очень принципиальный вопрос.
pusha
lapp и мисс_граффити еще раз огромное-преогромное спасибо за помощь!!! что не оставили на произвол... стыдно, конечно, но я вот стала разбираться в программах, вроде все поняла, кроме одного rolleyes.gif , объясните пожалуйста вот эту часть:
например, изначальный массив 1 2 4 5 2 5....,
первый повторяющийся элемент 2,
дойдя до него, получаем, что if (a[i]=a[j]) and (i<>j) это условие выполняется, а значит f1:=true;
далее в этом случае выполняется условие if f1 then
for j:=1 to kol do
if b[j]=a[i] then
f1:=false;
здесь непонятна строка for j:=1 to kol , ведь kol пока еще =0, и тогда цикл for j:=1 to 0 не выполниться ни разу? так что ли...?
Lapp
Цитата
непонятна строка for j:=1 to kol , ведь kol пока еще =0, и тогда цикл for j:=1 to 0 не выполниться ни разу? так что ли...?

Да, именно так smile.gif Если еще ничего не набрано, то и сравнивать не нужно.
В этом дополнительное доказательство правильности совершаемых действий. Алгоритм внутрене согласован.

Однако - WOW! Кажется, ты меня убедила, что это ты сказала не из вежливости:
Цитата(pusha @ 30.11.2006 14:16) *

ни разу не работала с массивами, а здесь придется...

Действительно, работаешь! smile.gif Respect!
Осталось убедить меня еще в одном пункте:
Цитата(lapp @ 1.12.2006 6:01) *

PS
не вижу доказательств в профиле, что ты блондинка.. smile.gif

Поспособствуешь? smile.gif Sorry about offtop..
Lapp
Цитата(мисс_граффити @ 1.12.2006 21:06) *

но я не <...т-ссс!...> , а Miss_Graffiti

2 Miss_Graffiti:
Извиняюсь... smile.gif Слово какое-то не вполне английское, хотя явно пришло из английского, поэтому рука сама набирает "y".. smile.gif Интересно, что по итальянски (предположительный источник) это вообще значит совсем не то: циклевать, скреплять, фальцевать blink.gif
мисс_граффити
самой, что ли, осветлиться?... rolleyes.gif
lapp, я другой перевод встречала - царапать. Граффити (которое рисование) началось с выцарапывания картинок на стеклах в метро. Потом уже в ход пошли маркеры, баллончики и т.д.
y или i - в разных источниках по-разному... но я выбрала i smile.gif

pusha, молодец, что стала разбираться, а не просто распечатала и пошла сдавать.
pusha
Цитата
Осталось убедить меня еще в одном пункте:

PS
не вижу доказательств в профиле, что ты блондинка.. smile.gif


если честно, то в профиле не хочу размещать свое фото...мне кажется,что здесь это не так принципиально, как, например, на сайте знакомств... smile.gif

Цитата
Поспособствуешь? smile.gif


lapp, если тебе интересно (?), как я выгляжу, могу поспособствовать лично: выслать фото на e-mail... rolleyes.gif






Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.