Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.
Помогите кто может. Заранее благодарна.Я вообще в этом Паскале слабо соображаю.
compiler
29.06.2007 16:13
Цитата(Baturaanna @ 29.06.2007 15:27)
Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.
проходишь в цикле от последнего элемента до первого и ищешь, если находишь то прирываеш цикл...
Baturaanna
29.06.2007 16:36
А если тебе не трудно напиши текст программы. Я вообще не представляю что такое процедура, как её описать и вообще зачем она нужна.
compiler
29.06.2007 16:38
Цитата(Baturaanna @ 29.06.2007 16:36)
А если тебе не трудно напиши текст программы. Я вообще не представляю что такое процедура, как её описать и вообще зачем она нужна.
зачем нужна? имхо, прийдет со временем когда будеш переходить на ООП, как на зло начнешь мыслить процедурами и функциями сейчас постараюсь написать... а еще тебе нужна именно процедура или можна функцией?
Baturaanna
29.06.2007 16:52
именно процедура.
Добавлено через 5 мин. У меня ещё трудности есть с задачей одной. Ты не знаешь как проверить в стречается ли в данном тексте определённая последовательность букв. Например: дан текст: лдвифдиди=-042349348аа84ьтп, проверить есть ли в нём последовательность 'абв', к примеру. Ну это так, если есть мысли напиши. И так уже припахала.
compiler
29.06.2007 17:21
Цитата(Baturaanna @ 29.06.2007 16:52)
именно процедура.
держи
procedure GetPosition(const str:string; ch:char; var int:integer); //ищет в строке str символ ch и возращает позицию int var i:integer; begin int:=-1; for i:=1 to length(str) do if str[i]=ch then int:=i; end;
Цитата(Baturaanna @ 29.06.2007 16:52)
У меня ещё трудности есть с задачей одной. Ты не знаешь как проверить в стречается ли в данном тексте определённая последовательность букв. Например: дан текст: лдвифдиди=-042349348аа84ьтп, проверить есть ли в нём последовательность 'абв', к примеру. Ну это так, если есть мысли напиши. И так уже припахала.
для этого есть pos
function IfInStr (const str1,str2:string):boolean; //если в строке str1 есть str2 тогда возращает истинну в противном случае ложь begin IfInStr := (pos(str2, str1) <> 0); end;
volvo
29.06.2007 17:29
compiler, чего тебя так тянет лишние условия в программе ставить? На то и придумали Boolean-тип, чтобы сразу можно было присвоить ему или True или False...
function IfInStr (const str,str2:string):boolean; begin IfInStr := (pos(str, str2) <> 0); end;
Baturaanna
29.06.2007 17:33
Спасибо большое, сейчас попробую. Очень благодарна.
compiler
29.06.2007 17:34
Цитата(volvo @ 29.06.2007 17:29)
compiler, чего тебя так тянет лишние условия в программе ставить? На то и придумали Boolean-тип, чтобы сразу можно было присвоить ему или True или False...
черт , неужели я это опять сделал... незнаю, почему но оно само набирается ... надо от этого уходить.. но как?
procedure GetPosition(const str:string; ch:char; var int:integer); //ищет в строке str символ ch и возращает позицию int var i:integer; begin int:=-1; for i:=1 to length(str) do if str[i]=ch then int:=i; end;
Хммм, ошибочка в компиляторе! [quote]Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.[/quote]
Правильное решение:
procedure GetRightChPosition( S : String; Ch : Char; var Position : Integer ); var I : Integer; begin for I := Length(S) downto 1 do if S[I] = Ch then { Нашли! } begin Position := I; Exit end; Position := -1 { Не нашли! } end;
По моему так.
P.S. Нехорошо обманывать девушек
compiler
13.07.2007 13:54
Цитата
Хммм, ошибочка в компиляторе!
Ты о чем? Ошибочка компилятора? Ошибочка в выборе компилятора? ( ) о комментариях... -----ну замени выделение комментариев, или допиши макросы... об алгоритме -----ну, использовал другой, без прирываний.. о const -----все зависит от компилятора(специально установил TP, в последних версиях(тестировал7.0)работает, в 6.0--нет)
Цитата
Нехорошо обманывать девушек
так ты о чем?
Neznaika
13.07.2007 15:50
Цитата(compiler @ 13.07.2007 14:54)
Ты о чем? Ошибочка компилятора? Ошибочка в выборе компилятора? ( ) о комментариях... -----ну замени выделение комментариев, или допиши макросы... об алгоритме -----ну, использовал другой, без прирываний.. о const -----все зависит от компилятора(специально установил TP, в последних версиях(тестировал7.0)работает, в 6.0--нет)так ты о чем?
compiler, извиняюсь. Просто мне показалось странным, что Вы предлагаете перебирать все символы строки. Зачем? Может быть нужный символ - последний в строке. Всего одна проверка и потребовалась бы, если сканировать строку справа.
klem4
13.07.2007 16:45
Цитата(Neznaika)
Правильное решение:
крайне спорное утверждение ...
Цитата(Neznaika)
Просто мне показалось странным, что Вы предлагаете перебирать все символы строки. Зачем?
А ты разьве не тоже самое сделала в своем решении ?!?!
Цитата(Neznaika)
for I := Length(S) downto 1 do
Neznaika
13.07.2007 18:15
Чёрт, вообщето я - он(то есть М, а не Ж).
procedure GetRightChPosition( S : String; Ch : Char; var Position : Integer ); var I : Integer; begin for I := Length(S) downto 1 do if S[I] = Ch then { Нашли! } begin Position := I; Exit end; Position := -1 { Не нашли! } end;
Нехорошо обманывать девушек - НАПИСАЛ СГОРЯЧА(если в задании написано справа, попробуйте девушке объяснить, почему ваш алгоритм сканирует строку слева).
klem4
13.07.2007 19:43
по поводу м/ж извиняюсь, по поводу решения, да окей, exit я не приметил ... и все-же, а чем pos то не подходит ? Какраз первое вхождение находит ... Ну а если бес pos то можно покороче, вот так:
function first_pos(const s: string; const ch: char): Integer; var i: byte; begin i := 1; while (i <= length(s)) and (s[i] <> ch) do inc(i); if (i <= length(s)) then first_pos := i else first_pos := -1; end;
Добавлено через 14 мин. или вот еще вариант
function first_pos(s: string; ch: char; i: Byte): Integer; begin if i > length(s) then first_pos := -1 else if s[i] = ch then first_pos := i else first_pos := first_pos(s, ch, succ(i)); end;
Neznaika
13.07.2007 20:27
Кажется нужно было просто
Цитата
определить позицию самого правого вхождения заданного символа в исходную строку
в моём варианте строка и сканируется справа. Просто это у меня от ассемблера: выбирается самый "оптимальный" вариант(если конечно считать, что нужные символы сгруппированы в конце строки, а не в её начале). В любом случае проверять все символы строки, по-моему, это ненормально.
Например строка 100 символов. Нужный символ входит в строку 3 раза и находится на 1, 2 и 3-м местах. Ну проверили эти три символа, сохранили позицию последнего вхождения (итого 3 сравнений и 3 присваивания), но всё равно нужно проверить остальные 97 символов (соответственно ещё 97 сравнений). Но зачем? В этом случае было бы достаточно 97 сравненний и 1 присваивания. По-моему так.
volvo
13.07.2007 20:33
Цитата
В любом случае проверять все символы строки, по-моему, это ненормально.
Давай, ты не будешь решать, что ДА нормально, а что - НЕТ. Если строка содержит искомый символ первым, то твоя программа будет также проходить по всей строке. Сам себе противоречишь...
Neznaika
13.07.2007 20:43
Цитата(volvo @ 13.07.2007 21:33)
Давай, ты не будешь решать, что ДА нормально, а что - НЕТ. Если строка содержит искомый символ первым, то твоя программа будет также проходить по всей строке. Сам себе противоречишь...
Если этот символ единственный в строке, то направление сканирования строки не имеет значения. Нужный символ в начале строки и он входит в строку единожды - это крайний случай.
Lapp
14.07.2007 10:54
Я согласен с Neznaika'ой. При случайной расстановке символов в строке сканирование с конца будет более эффективно, безусловно.
И почему бы ему не высказать свое мнение относительно нормальности или ненормальности? Фраза "по-моему, это ненормально" совсем не выглядит решением..
klem4
14.07.2007 12:31
Lapp, безусловно, опять моя невнимательность и чтение "через строчку". Фразу "самого правого" мой мозг интерпритировал как "самого первого" то есть "самого левого"
В таком случае рекурсивный вариант будет таким:
function first_pos(s: string; ch: char; i: Byte): Integer; begin if i < 1 then first_pos := -1 else if s[i] = ch then first_pos := i else first_pos := first_pos(s, ch, pred(i)); end;
var s: string; ch: char;
begin s := 'rqwerqty'; ch := 'r'; writeln(first_pos(s, ch, length(s))); end.
compiler
14.07.2007 15:20
Цитата(Neznaika @ 13.07.2007 15:50)
попробуйтедевушке объяснить
помоему она поняла
Цитата
Очень благодарна.
насчет алгоритма -- просто не люблю гото и прирывания, ИМХО они уменьшают читабельность(доказательство -- восприятее klem4-а), а вообще я его описал во втором посте, и если автору было бы интересно то...
Neznaika
14.07.2007 17:41
Извиняюсь, слона то я и не приметил
Цитата
проходишь в цикле от последнего элемента до первого и ищешь, если находишь то прирываеш цикл...
Но на словах получается одно, а на Pascal'е другое. Не обман, но туман. И чем не прерывать цикл как не Break, Exit, Halt? Передать управление на END из начала или середины подпрограммы по-моему проще при помощи Exit, а не многоступенчатого IF-THEN-ELSE, он то как раз всё и затуманит. Или в подпрограмме должны быть выполнены все команды? Максимизация использования ресурсов Ну Itanium возможно потянет(но не всё что угодно разумеется), но x86 однозначно нет.
compiler
14.07.2007 19:37
Цитата(Neznaika @ 14.07.2007 17:41)
Но на словах получается одно, а на Pascal'е другое. Не обман, но туман. И чем не прерывать цикл как не Break, Exit, Halt? Передать управление на END из начала или середины подпрограммы по-моему проще при помощи Exit, а не многоступенчатого IF-THEN-ELSE, он то как раз всё и затуманит. Или в подпрограмме должны быть выполнены все команды? Максимизация использования ресурсов Ну Itanium возможно потянет(но не всё что угодно разумеется), но x86 однозначно нет.
а можно только GOTO, и использовать не циклы не разветления не нужны! а насчет программы, автору то понравилось...
Neznaika
16.07.2007 13:25
Кажется уже не по теме, но я всё же отвечу.
Цитата
а можно только GOTO, и использовать не циклы не разветления не нужны!
К сожалению(или к счастью) одним только GOTO нельзя ограничиться - получится ЛИНЕЙНАЯ операторов, которую можно переписать, выбросив всё GOTO. Например goto 2; 1: Write('1'); goto 3; 2: Write('2'); goto 1; 3: Write('3') заменяется соответственно на Write('2'); Write('1'); Write('3'); Это возможно, если последовательность операторов конечна, то есть нет бесконечных циклов: 1: ... goto 1; Поэтому без ветвлений(то есть без оператора IF-THEN-ELSE) не обойтись. А циклы - это просто надстройка над IF+GOTO. Например цикл WHILE:
Label_НАЧАЛО_ЦИКЛА: if not УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА then goto Label_ПОСЛЕ_ЦИКЛА; ТЕЛО_ЦИКЛА; goto Label_НАЧАЛО_ЦИКЛА; Label_ПОСЛЕ_ЦИКЛА:
Разумеется вместо этого лучше написать while УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА do ТЕЛО_ЦИКЛА;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.