Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите умоляю с задачкой на Pascale
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Baturaanna
Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.

Помогите кто может. Заранее благодарна.Я вообще в этом Паскале слабо соображаю.
compiler
Цитата(Baturaanna @ 29.06.2007 15:27) *
Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.
проходишь в цикле от последнего элемента до первого и ищешь, если находишь то прирываеш цикл...
Baturaanna
А если тебе не трудно напиши текст программы. Я вообще не представляю что такое процедура, как её описать и вообще зачем она нужна.
compiler
Цитата(Baturaanna @ 29.06.2007 16:36) *
А если тебе не трудно напиши текст программы. Я вообще не представляю что такое процедура, как её описать и вообще зачем она нужна.
зачем нужна? имхо, прийдет со временем когда будеш переходить на ООП, как на зло начнешь мыслить процедурами и функциями mega_chok.gif smile.gif
сейчас постараюсь написать...
а еще тебе нужна именно процедура или можна функцией?
Baturaanna
именно процедура.

Добавлено через 5 мин.
У меня ещё трудности есть с задачей одной. Ты не знаешь как проверить в стречается ли в данном тексте определённая последовательность букв. Например: дан текст: лдвифдиди=-042349348аа84ьтп, проверить есть ли в нём последовательность 'абв', к примеру. Ну это так, если есть мысли напиши. И так уже припахала.
compiler
Цитата(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
compiler, чего тебя так тянет лишние условия в программе ставить? На то и придумали Boolean-тип, чтобы сразу можно было присвоить ему или True или False...

function IfInStr (const str,str2:string):boolean;
begin
	IfInStr := (pos(str, str2) <> 0);
end;
Baturaanna
Спасибо большое, сейчас попробую. Очень благодарна.
compiler
Цитата(volvo @ 29.06.2007 17:29) *
compiler, чего тебя так тянет лишние условия в программе ставить? На то и придумали Boolean-тип, чтобы сразу можно было присвоить ему или True или False...
черт mad.gif , неужели я это опять сделал... незнаю, почему но оно само набирается yes2.gif ... надо от этого уходить.. но как?

сообщение отредактировано.
Neznaika
[quote name='compiler' date='29.06.2007 18:21' post='107326']
держи
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.
Нехорошо обманывать девушек smile.gif
compiler
Цитата
Хммм, ошибочка в компиляторе!
Ты о чем? Ошибочка компилятора? Ошибочка в выборе компилятора? ( lol.gif )
о комментариях...
-----ну замени выделение комментариев, или допиши макросы...
об алгоритме
-----ну, использовал другой, без прирываний..
о const
-----все зависит от компилятора(специально установил TP, в последних версиях(тестировал7.0)работает, в 6.0--нет)
Цитата
Нехорошо обманывать девушек smile.gif
так ты о чем?
Neznaika
Цитата(compiler @ 13.07.2007 14:54) *

Ты о чем? Ошибочка компилятора? Ошибочка в выборе компилятора? ( lol.gif )
о комментариях...
-----ну замени выделение комментариев, или допиши макросы...
об алгоритме
-----ну, использовал другой, без прирываний..
о const
-----все зависит от компилятора(специально установил TP, в последних версиях(тестировал7.0)работает, в 6.0--нет)так ты о чем?


compiler, извиняюсь.
Просто мне показалось странным, что Вы предлагаете перебирать все символы строки. Зачем?
Может быть нужный символ - последний в строке. Всего одна проверка и потребовалась бы,
если сканировать строку справа. smile.gif
klem4
Цитата(Neznaika)
Правильное решение:


крайне спорное утверждение ...

Цитата(Neznaika)
Просто мне показалось странным, что Вы предлагаете перебирать все символы строки. Зачем?


А ты разьве не тоже самое сделала в своем решении ?!?! blink.gif wacko.gif

Цитата(Neznaika)
for I := Length(S) downto 1 do
Neznaika
Чёрт, вообщето я - он(то есть М, а не Ж).


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
по поводу м/ж извиняюсь, по поводу решения, да окей, 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
Кажется нужно было просто
Цитата
определить позицию самого правого вхождения заданного символа в исходную строку

в моём варианте строка и сканируется справа.
Просто это у меня от ассемблера: выбирается самый "оптимальный" вариант(если конечно считать,
что нужные символы сгруппированы в конце строки, а не в её начале).
В любом случае проверять все символы строки, по-моему, это ненормально.


Например строка 100 символов. Нужный символ входит в строку 3 раза и находится
на 1, 2 и 3-м местах. Ну проверили эти три символа, сохранили позицию последнего вхождения
(итого 3 сравнений и 3 присваивания), но всё равно нужно проверить остальные 97 символов
(соответственно ещё 97 сравнений). Но зачем? В этом случае было бы достаточно 97 сравненний
и 1 присваивания.
По-моему так.

volvo
Цитата
В любом случае проверять все символы строки, по-моему, это ненормально.
Давай, ты не будешь решать, что ДА нормально, а что - НЕТ. Если строка содержит искомый символ первым, то твоя программа будет также проходить по всей строке. Сам себе противоречишь...
Neznaika
Цитата(volvo @ 13.07.2007 21:33) *

Давай, ты не будешь решать, что ДА нормально, а что - НЕТ. Если строка содержит искомый символ первым, то твоя программа будет также проходить по всей строке. Сам себе противоречишь...


Если этот символ единственный в строке, то направление сканирования строки не имеет значения.
Нужный символ в начале строки и он входит в строку единожды - это крайний случай.
Lapp
Я согласен с Neznaika'ой. При случайной расстановке символов в строке сканирование с конца будет более эффективно, безусловно.

И почему бы ему не высказать свое мнение относительно нормальности или ненормальности? Фраза "по-моему, это ненормально" совсем не выглядит решением..
klem4
Lapp, безусловно, опять моя невнимательность и чтение "через строчку". Фразу "самого правого" мой мозг интерпритировал как "самого первого" то есть "самого левого" smile.gif

В таком случае рекурсивный вариант будет таким:

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
Цитата(Neznaika @ 13.07.2007 15:50) *
попробуйтедевушке объяснить
помоему она поняла
Цитата
Очень благодарна.

насчет алгоритма -- просто не люблю гото и прирывания, ИМХО они уменьшают читабельность(доказательство -- восприятее klem4-а), а вообще я его описал во втором посте, и если автору было бы интересно то...
Neznaika
Извиняюсь, слона то я и не приметил
Цитата

проходишь в цикле от последнего элемента до первого и ищешь, если находишь то прирываеш цикл...

Но на словах получается одно, а на Pascal'е другое. Не обман, но туман.
И чем не прерывать цикл как не Break, Exit, Halt?
Передать управление на END из начала или середины подпрограммы по-моему проще при помощи Exit,
а не многоступенчатого IF-THEN-ELSE, он то как раз всё и затуманит.
Или в подпрограмме должны быть выполнены все команды? Максимизация использования ресурсов smile.gif
Ну Itanium возможно потянет(но не всё что угодно разумеется), но x86 однозначно нет.
compiler
Цитата(Neznaika @ 14.07.2007 17:41) *
Но на словах получается одно, а на Pascal'е другое. Не обман, но туман.
И чем не прерывать цикл как не Break, Exit, Halt?
Передать управление на END из начала или середины подпрограммы по-моему проще при помощи Exit,
а не многоступенчатого IF-THEN-ELSE, он то как раз всё и затуманит.
Или в подпрограмме должны быть выполнены все команды? Максимизация использования ресурсов smile.gif
Ну Itanium возможно потянет(но не всё что угодно разумеется), но x86 однозначно нет.
а можно только GOTO, и использовать не циклы не разветления не нужны! smile.gif а насчет программы, автору то понравилось...
Neznaika
Кажется уже не по теме, но я всё же отвечу.
Цитата
а можно только 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
ТЕЛО_ЦИКЛА;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.