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