![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
redeezko |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите со следующей задачей: в заданном массиве из 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 курсе, так что не знаю что такое процедуры и функции ![]() Сообщение отредактировано: redeezko - 8.12.2009 19:26 |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
в заданном массиве из n литер удалить все повторяющиеся литеры. Поясни, пожалуйста, поточнее, что это значит. Удалить повторы, идущие подряд, или вообще все? При этом хотя бы одну оставить или тоже удалять? Ставь задачу четче..-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
redeezko |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Мужской Репутация: ![]() ![]() ![]() |
Написал задачу в точности как она была продиктована мне... Но все таки думаю что необходимо оставить по одной литере, то есть из abaadcba сделать abdc. Удалять все повторы.
Сообщение отредактировано: redeezko - 8.12.2009 20:49 |
Гость |
![]()
Сообщение
#4
|
Гость ![]() |
|
redeezko |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 22 Пол: Мужской Репутация: ![]() ![]() ![]() |
Нет, не проходили.
|
Unconnected |
![]()
Сообщение
#6
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Блин, а я уже со множествами сделал...
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.
Пусть будет) -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Ну, тогда можно делать примерно так:
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.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#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 в Паскале, начало и конец цикла вычисляются один раз, перед выполнением, а не на каждой итерации), что приводит к удалению лишнего символа.Будем переписывать, или исправлять? ![]() P.S. Хм... Опоздал ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 10:19 |