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

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

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

 
 Ответить  Открыть новую тему 
> Удаление повторяющихся элементов массива
redeezko
сообщение 8.12.2009 18:47
Сообщение #1


Новичок
*

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

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


Помогите со следующей задачей: в заданном массиве из n литер удалить все повторяющиеся литеры.
Вот что получилось у меня:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const n=10;
type u=array[1..n] of char;
var x:u;
i,j,l,k:integer;
begin
writeln('vvedite nabor liter');
for i:=1 to n do
read(x[i]);
i:=2;
l:=n;
while i<=l do
begin
for j:=1 to i-1 do
if x[i]=x[j] then
begin
l:=l-1;
for k:=i to n do
x[k]:=x[k+1];
i:=i-1;
end;
inc(i);
end;
for i:=1 to l do write(x[i]);
readln;
readln;
end.

Но она почему то не работает. Вернее не всегда работает. Например если ввести aasdfsyajy то
программа оставит asdjy. Очень прощу помощи.
P.S. Учусь на 1 курсе, так что не знаю что такое процедуры и функции smile.gif . Да и проходим мы сейчас массивы, так что задачу необходимо сделать наподобие как делаю я. Заранее спасибо

Сообщение отредактировано: redeezko - 8.12.2009 19:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 8.12.2009 20:43
Сообщение #2


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

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

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


Цитата(redeezko @ 8.12.2009 18:47) *
в заданном массиве из n литер удалить все повторяющиеся литеры.
Поясни, пожалуйста, поточнее, что это значит. Удалить повторы, идущие подряд, или вообще все? При этом хотя бы одну оставить или тоже удалять? Ставь задачу четче..


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


Новичок
*

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

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


Написал задачу в точности как она была продиктована мне... Но все таки думаю что необходимо оставить по одной литере, то есть из abaadcba сделать abdc. Удалять все повторы.

Сообщение отредактировано: redeezko - 8.12.2009 20:49
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 8.12.2009 21:20
Сообщение #4


Гость






Цитата(redeezko @ 8.12.2009 20:48) *
из abaadcba сделать abdc. Удалять все повторы.
Хорошо, с этим понятно.
Теперь скажи: вы проходили тип set (множество), или еще нет?
 К началу страницы 
+ Ответить 
redeezko
сообщение 8.12.2009 21:34
Сообщение #5


Новичок
*

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

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


Нет, не проходили.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 8.12.2009 22:35
Сообщение #6


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

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


Блин, а я уже со множествами сделал...

const n=10;
var lits:set of char=[];
s:array[1..n] of char;
i,i2:integer;
begin
writeln('Vvedite nabor liter');
for i:=1 to n do readln(s[i]);
for i:=1 to n do
if (s[i] in lits) then s[i]:=#0 else include(lits,s[i]);
for i:=1 to n do writeln(s[i]);
readln;
end.


Пусть будет)


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 8.12.2009 23:21
Сообщение #7


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

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

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


Ну, тогда можно делать примерно так:

program Project1;
{$APPTYPE CONSOLE}
const
n=10;
type
u=array[1..n] of char;
var
x:u;
i,j,l,k:integer;

begin
writeln('vvedite nabor liter');
for i:=1 to n do read(x[i]);
ReadLn;
i:=2;
l:=n;
while i<=l do begin
j:=1;
while (j<i)and(i<=l) {проверять l} do if x[i]=x[j] then begin
Dec(l);
for k:=i to l do x[k]:=x[k+1];
j:=1 {начать снова}
end
else Inc(j);
inc(i);
end;
for i:=1 to l do write(x[i]);
readln;
end.


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


Гость






Цитата
Но она почему то не работает. Вернее не всегда работает.
Потому что вот этот цикл:
      for j:=1 to i-1 do
if x[i]=x[j] then
begin
l:=l-1;
for k:=i to n do { <--- Вот этот самый }
x[k]:=x[k+1];
i:=i-1;
end;
не должен выполняться дважды при одном и том же j ни в коем случае. А у тебя - выполняется: несмотря на то, что ты уменьшил значение i, Паскаль работает со старым, неизмененным значением (это особенности цикла For в Паскале, начало и конец цикла вычисляются один раз, перед выполнением, а не на каждой итерации), что приводит к удалению лишнего символа.

Будем переписывать, или исправлять? smile.gif

P.S. Хм... Опоздал smile.gif Но объяснение, почему не работало - не помешает все же, я думаю...
 К началу страницы 
+ Ответить 

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

 



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