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 10:19
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"