Форум «Всё о Паскале» _ Задачи _ слова с повторяющимися символами
Автор: 18192123 14.11.2006 23:53
Дана строка, состоящая из слов, разделенных пробелом. Удалить из строки слова, содержащие повторяющиеся символы. ( c помощью функций, не использовать стандартн. ф-ции и процедуры для строк, кроме lenght,ord,char)
единственное, что пока сделала , нашла количество слов в строке
var st:string[40]; i,k:integer; begin readln (st); for i:=1 to length(st) do if st[i]=' ' then k:=k+1; writeln ('k=', k);
не пойму, как теперь работать с отдельными словами
Автор: volvo 15.11.2006 0:10
Зайди вот сюда: http://forum.pascal.net.ru/index.php?showtopic=6972
и посмотри...
Автор: 18192123 19.11.2006 1:52
Цитата(volvo @ 14.11.2006 20:10)
Зайди вот сюда: http://forum.pascal.net.ru/index.php?showtopic=6972
и посмотри...
а как мне действоавть дальше (после разбиения на слова)? организ. массив из отдельных слов? но я не знаю, как с этим поступить в моём случае, ведь тогда каждый элемент массива будет сост. из символов, и что мне работать с отдельными словами поочереди?
Автор: 18192123 19.11.2006 17:30
Цитата(18192123 @ 18.11.2006 21:52)
а как мне действоавть дальше (после разбиения на слова)? организ. массив из отдельных слов? но я не знаю, как с этим поступить в моём случае, ведь тогда каждый элемент массива будет сост. из символов, и что мне работать с отдельными словами поочереди?
решила разбить строку на слова по этому образцу
const
limits = [#0..#32,'.',',',':',';','!','?','"']; type
TWords = array[1..40] of string;
var text : string; words : TWords;
function GetWords(s : string; var w : TWords) : byte; var i,back,n : byte; begin i := 1; n := 0; while(i<=length(s)) do begin while(i<=length(s)) and (s[i] in limits) do inc(i); if i<=length(s) then begin back := i; while(i<=length(s)) and not(s[i] in limits) do inc(i); inc(n); w[n] := copy(s, back, i-back); end; end;
GetWords := n; end;
а дальше - не знаю, подскажите алгоритм дальнейших действий пожалуйста
Автор: 18192123 19.11.2006 23:55
Цитата(18192123 @ 18.11.2006 21:52)
а как мне действоавть дальше (после разбиения на слова)? организ. массив из отдельных слов? но я не знаю, как с этим поступить в моём случае, ведь тогда каждый элемент массива будет сост. из символов, и что мне работать с отдельными словами поочереди?
помогите пожалуйста с алгоритмом решения, а дальше я сама попробую, только подскажите, как дальше
Автор: 18192123 20.11.2006 1:50
Цитата(18192123 @ 19.11.2006 19:55)
помогите пожалуйста с алгоритмом решения, а дальше я сама попробую, только подскажите, как дальше
ну пожалуйста, помогите, мне эта задача уже чуть ли не снится, а сдать надо уже в четверг
Автор: мисс_граффити 20.11.2006 2:37
а чего она тебе снится? из-за того, что скопировала кусок кода из FAQ? ты сама хоть что-нибудь попробуй делать - тогда поможем.
Автор: 18192123 20.11.2006 2:56
Цитата(мисс_граффити @ 19.11.2006 22:37)
а чего она тебе снится? из-за того, что скопировала кусок кода из FAQ? ты сама хоть что-нибудь попробуй делать - тогда поможем.
проблема в том, что я не знаю, как сделать, поэтому и прошу помочь
Автор: мисс_граффити 20.11.2006 3:41
взяла слово-строчку, считала из нее символ (первый). удалила. смотришь - если он еще раз встречается в строчке, удаляешь ее всю. если нет - читаешь следующий.
Автор: 18192123 20.11.2006 4:18
Цитата(мисс_граффити @ 19.11.2006 23:41)
взяла слово-строчку, считала из нее символ (первый). удалила. смотришь - если он еще раз встречается в строчке, удаляешь ее всю. если нет - читаешь следующий.
а для чего мне удалять первый символ? на каком основании?
Автор: 18192123 20.11.2006 19:29
Цитата(18192123 @ 20.11.2006 0:18)
а для чего мне удалять первый символ? на каком основании?
а как разбить строчку на слова, если мне запрещено использовать любые стандартные процедуры и функции для строк за исключением ord, lenght
Автор: мисс_граффити 20.11.2006 20:29
а где про это сказано???
если запрещено - не разбивай. запоминаешь первый символ. идешь до пробела... если этот символ встретился - удаляешь слово (кусок до пробела. как это сделать - подумай сама). если не встретился - берешь второй символ. идешь до пробела.... и так далее. потом анализируешь промежуток между следующими пробелами.
Автор: 18192123 20.11.2006 21:35
Цитата(мисс_граффити @ 20.11.2006 16:29)
а где про это сказано???
если запрещено - не разбивай. запоминаешь первый символ. идешь до пробела... если этот символ встретился - удаляешь слово (кусок до пробела. как это сделать - подумай сама). если не встретился - берешь второй символ. идешь до пробела.... и так далее. потом анализируешь промежуток между следующими пробелами.
вот... но только не поняла, как применить ко всем словам в строке, мож сначала посчитать их количество или с использованием lenght?
я пока попыталась разобраться с первым словом
uses crt; const p=' '; function one(var st:string; c:char):string; var k,i:integer; begin k:=0; while st[i]<>p do k:=k+1; {хочу посчит. сколько символов в первом слове} c:=st[1]; for i:=1 to k do while st[i]<>p do if st[i]=c then st[0]:=char(ord(st[0]-k); one:=st; end;
Автор: мисс_граффити 20.11.2006 22:21
а зачем тебе их количество? ты же идешь по строке последовательно... просто отслеживай пробелы.
Автор: 18192123 21.11.2006 0:56
Цитата(мисс_граффити @ 20.11.2006 18:21)
а зачем тебе их количество? ты же идешь по строке последовательно... просто отслеживай пробелы.
uses crt; const p=' '; function one(var st:string; c:char):string; var k,i:integer; begin for i:=1 to length(st) do while st[i]<>p do begin k:=0; while st[i]<>p do k:=k+1; c:=st[1]; for i:=1 to k do while st[i]<>p do if st[i]=c then st[0]:=char(ord(st[0])-k); end; one:=st; end; VAR st:string; c:char; BEGIN read (st); write (one(st,c)); readkey; end.
дальше этой строчки компиляция не идет, выдает несоответствие типов
st[0]:=char(ord(st[0]-k);
Автор: мисс_граффити 21.11.2006 3:02
у тебя скобочек в ней не хватает.
Автор: 18192123 21.11.2006 3:38
Цитата(мисс_граффити @ 20.11.2006 23:02)
у тебя скобочек в ней не хватает.
скобочку я доставила, но теперь я ввожу строку и все...... дальше ничего не выдает
Автор: мисс_граффити 21.11.2006 5:51
если ты хочешь делать
c:=st[1];
то исправь вот это:
function one(var st:string; var c:char):string;
Можно использовать такой алгоритм: заводим дополнительную строку - результирующую. Анализируем первое слово в строке (посимвольно сравниваем. то есть берем первый символ и сравниваем с каждым следующим, пока не встретим такой же или пробел). Потом так же со вторым символом, с третьим... Пока не дойдем до пробела. Для того, чтобы отследить, были ли повторы, можно использовать логическую переменную. Запоминаем позицию пробела. Это будет начало нашего следующего исследования. //описанное выше - по сути, 2 цикла. Внешний - пока не встретим пробел, внутренний - пока не встретим пробел или аналогичный символ Смотрим на флажок - если повторов не было, аккуратненько по символам перекидываем кусок до пробела в новую строку. Начинаем анализировать исходную строку с запомненного места.
Автор: 18192123 21.11.2006 22:23
Цитата(мисс_граффити @ 21.11.2006 1:51)
Можно использовать такой алгоритм: заводим дополнительную строку - результирующую. Анализируем первое слово в строке (посимвольно сравниваем. то есть берем первый символ и сравниваем с каждым следующим, пока не встретим такой же или пробел). Потом так же со вторым символом, с третьим... Пока не дойдем до пробела. Для того, чтобы отследить, были ли повторы, можно использовать логическую переменную. Запоминаем позицию пробела. Это будет начало нашего следующего исследования. //описанное выше - по сути, 2 цикла. Внешний - пока не встретим пробел, внутренний - пока не встретим пробел или аналогичный символ Смотрим на флажок - если повторов не было, аккуратненько по символам перекидываем кусок до пробела в новую строку. Начинаем анализировать исходную строку с запомненного места.
я поняла, как нужно действовать в этой задаче, но больше ничего не получается(может опыта не хватает, может и ума...), в общем реализовать не получается. можешь объяснить именно насчет реализации
Автор: мисс_граффити 21.11.2006 22:48
написать за тебя код? нет, не могу. потому что ты даже пробовать не хочешь! я тебе алгоритм подробно расписала. если какие-то моменты неясные - спрашивай.
Автор: 18192123 21.11.2006 23:05
Цитата(мисс_граффити @ 21.11.2006 18:48)
написать за тебя код? нет, не могу. потому что ты даже пробовать не хочешь! я тебе алгоритм подробно расписала. если какие-то моменты неясные - спрашивай.
мне непонятно, как после проверки на стречаемость 1-го символа перейти к проверке 2,3.. получается, мне все-таки нужно определить в нем количество символов? или нет? и ещё: я могу произвольно выбрать количество слов в строке? алгоритм тогда меняется?
Автор: мисс_граффити 21.11.2006 23:22
циклом, разумеется! как же еще? нет... условия выхода из цикла я тебе написала. для самого внешнего (который по словам) - конец строки. смотря как ты будешь проверять. если отлавливать конец строки - то не меняется. главное, чтобы поместилось в string.
Автор: 18192123 21.11.2006 23:38
Цитата(мисс_граффити @ 21.11.2006 19:22)
циклом, разумеется! как же еще? нет... условия выхода из цикла я тебе написала. для самого внешнего (который по словам) - конец строки. смотря как ты будешь проверять. если отлавливать конец строки - то не меняется. главное, чтобы поместилось в string.
спасибо, буду дальше делать!
Автор: 18192123 22.11.2006 1:25
Цитата(мисс_граффити @ 21.11.2006 19:22)
циклом, разумеется! как же еще? нет... условия выхода из цикла я тебе написала. для самого внешнего (который по словам) - конец строки. смотря как ты будешь проверять. если отлавливать конец строки - то не меняется. главное, чтобы поместилось в string.
ещё вопрос: что понимается под "Запоминаем позицию пробела. Это будет начало нашего следующего исследования." это насчет остальных слов, ведь так? тогда как вставить туда запомненный пробел, где учесть "Начинаем анализировать исходную строку с запомненного места"?
Автор: 18192123 22.11.2006 3:45
Цитата(мисс_граффити @ 21.11.2006 1:51)
Можно использовать такой алгоритм: заводим дополнительную строку - результирующую. Анализируем первое слово в строке (посимвольно сравниваем. то есть берем первый символ и сравниваем с каждым следующим, пока не встретим такой же или пробел). Потом так же со вторым символом, с третьим... Пока не дойдем до пробела. Для того, чтобы отследить, были ли повторы, можно использовать логическую переменную. Запоминаем позицию пробела. Это будет начало нашего следующего исследования. //описанное выше - по сути, 2 цикла. Внешний - пока не встретим пробел, внутренний - пока не встретим пробел или аналогичный символ Смотрим на флажок - если повторов не было, аккуратненько по символам перекидываем кусок до пробела в новую строку. Начинаем анализировать исходную строку с запомненного места.
пытаюсь что-то сделать по этому алгоритму, но это все, что смогла, дальше - просто не знаю как реализовывать. помогите.....
uses crt; function one(var st:string;var c:char):string; var i:integer; f:boolean; begin writeln ('vvedite stroky'); read (st); while i<>length(st) do begin f:=true; for i:=1 to ' ' do begin c:=s[1]; while s[i]<>' ' or c:=s[i] do if c=s[i] then f:=true; c:=c+1; end; end;