Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2008, 11:58   #1
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию Строки в паскале

Нужно из введённой строки вычленить те символы, которые в ней не повторяются. Причём в том порядке, в котором они идут в строке

Вот мой вариант, но он не рабочий... ЧТо у меня не так?
Код:
Program text;
Var a,i,r,j:integer;
	s,e,b,st:string;
Begin
 Writeln('Vvedite tekst');
 Readln(s);
 a:=length(s);
 r:=0;
 st:='';
 For i:=1 to a do
   Begin
	 b:=s[i];
	 For j:=i to a do if b=S[j] then r:=r+1;
	 If r=0 then st:=st+copy(s,i,1);
	 r:=0;
   end;
 writeln(st);
 readln;
End.
Exact вне форума Ответить с цитированием
Старый 06.02.2008, 12:18   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Очень уж ты намудрил. Нужно просто создать еще одну такую стороку и затем посимвольно с конца строки сравнивать символы. Если символ совпадает, а порядковые номера его в обеих строках не совпадают, этот символ удаляем. В строке остаются только символы, которые не повторябтся и в том порядке, как они были написаны.
Код:
uses crt;
var a,i,j:integer;
    s,st:string;
begin
clrscr;
write('stroka: ');readln(s);
a:=length(s);
st:=s;
for i:=a downto 1 do
for j:=a downto 1 do
if (s[i]=st[j])and(i<>j)then
  begin
    delete(s,i,1);
  end;
writeln('s: ',s);
readln
end.
puporev вне форума Ответить с цитированием
Старый 06.02.2008, 12:25   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дарю, я сеня добрый )
Код:
   var s:string;a:array[1..255] of integer;i:integer;
begin
s:='123w4567895we61';
for i :=1  to length(s)  do
begin
 a[ord(s[i])]:=a[ord(s[i])]+1;
end;

for i :=1  to 255  do
begin
 if a[i]=1 then write(char(i));
end;
readln;




  { TODO -oUser -cConsole Main : Insert code here }
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.02.2008, 12:35   #4
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию

puporev твоя прога не прошла испытания, слагав уже на слове qwertyqwe
Stilet Привет твоя прога работает, но я запутался в ней, можешь объяснить суть работы и что означает вот эта штучка
a[ord(s[i])]:=a[ord(s[i])]+1;

И объясните если не сложно, почему моя программа не работает?

Последний раз редактировалось Exact; 06.02.2008 в 12:40.
Exact вне форума Ответить с цитированием
Старый 06.02.2008, 12:48   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Суть работы проста: используется фильтрация методом индексов, т.е. символов всего 255 эт я условно говорю, значит организуем массив 255 клеточек, далее в цикле получим код символа, допустим символ "а"- имеет код 34, значит в 34-ю клеточку массива мы запишем значение на единицу больше, таким образом получим карту твоей строки.
Далее пройдем по циклу и посмотрим если элементик массива по номеру 34 содержит число большее чем единица, значит буква "а" повторялась.

Яснышко?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.02.2008, 13:16   #6
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию

Вообще понтяно, но хотелось бы разобраться в моей программе, что в ней не правильно? Если работать компилятором (в уме обрабатывать каждую команду) всё должно работать... ПОчему не работает не могу понять...
Exact вне форума Ответить с цитированием
Старый 07.02.2008, 22:18   #7
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Код:
......
b:=s[i];
For j:=i to a do if b=S[j] then r:=r+1;
If r=0 then st:=st+copy(s,i,1);
......
В данном случае r никогда не будет равной нулю. Ведь s[i] = S[j] уже на первой итерации (т.к. j=i), значит r хотя-бы раз увеличиться на единицу. Возможно, стоит начинать цикл с i+1.
Jeni вне форума Ответить с цитированием
Старый 08.02.2008, 08:36   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ПОчему не работает не могу понять...
Наверное, пардон за флуд, ты просто неверный подход к решению выбрал
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.02.2008, 20:45   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Код:
Program text;   
Var a,i,r,j:integer;   
    s,{e,b,}st:string;   //переменные b,e не нужны
Begin   
 Writeln('Vvedite tekst');   
 Readln(s);   
 a:=length(s);   
 {r:=0;}    //убрать, рано еще
 st:='';   
 For i:=1 to a do  
   Begin   
     r:=0;  //вот здесь вставить
     {b:=s[i];}   //не нужно
     For j:=1 to a do 
     if s[i]=S[j] then 
        begin
           r:=r+1; 
       end;   
     If r=1 then st:=st+copy(s,i,1); //символ встречается только один раз
  { r:=0;}   //не нужно
   end;   
 writeln(st);   
 readln;   
End.
puporev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки в паскале Вввова Помощь студентам 10 08.06.2010 14:10
Строки в Паскале istragon Помощь студентам 6 28.12.2009 18:18
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Строки в Паскале Обработка текста quqer Помощь студентам 3 11.03.2008 11:22
Помогите решить задачку на строки в Паскале. TakeR Помощь студентам 8 26.12.2007 00:09