Помогите со следующей задачей: в заданном массиве из 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.
Написал задачу в точности как она была продиктована мне... Но все таки думаю что необходимо оставить по одной литере, то есть из abaadcba сделать abdc. Удалять все повторы.
Нет, не проходили.
Блин, а я уже со множествами сделал...
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.
Ну, тогда можно делать примерно так:
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.
for j:=1 to i-1 doне должен выполняться дважды при одном и том же j ни в коем случае. А у тебя - выполняется: несмотря на то, что ты уменьшил значение i, Паскаль работает со старым, неизмененным значением (это особенности цикла For в Паскале, начало и конец цикла вычисляются один раз, перед выполнением, а не на каждой итерации), что приводит к удалению лишнего символа.
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;