IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> помогите умоляю с задачкой на Pascale, работа со строками
Baturaanna
сообщение 29.06.2007 15:27
Сообщение #1


Гость






Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.

Помогите кто может. Заранее благодарна.Я вообще в этом Паскале слабо соображаю.
 К началу страницы 
+ Ответить 
compiler
сообщение 29.06.2007 16:13
Сообщение #2


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(Baturaanna @ 29.06.2007 15:27) *
Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходную строку. Если строка не содержит символа, то результатом работы будет -1.
проходишь в цикле от последнего элемента до первого и ищешь, если находишь то прирываеш цикл...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Baturaanna
сообщение 29.06.2007 16:36
Сообщение #3


Гость






А если тебе не трудно напиши текст программы. Я вообще не представляю что такое процедура, как её описать и вообще зачем она нужна.
 К началу страницы 
+ Ответить 
compiler
сообщение 29.06.2007 16:38
Сообщение #4


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


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

Сообщение отредактировано: compiler - 29.06.2007 16:39


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Baturaanna
сообщение 29.06.2007 16:52
Сообщение #5


Гость






именно процедура.

Добавлено через 5 мин.
У меня ещё трудности есть с задачей одной. Ты не знаешь как проверить в стречается ли в данном тексте определённая последовательность букв. Например: дан текст: лдвифдиди=-042349348аа84ьтп, проверить есть ли в нём последовательность 'абв', к примеру. Ну это так, если есть мысли напиши. И так уже припахала.
 К началу страницы 
+ Ответить 
compiler
сообщение 29.06.2007 17:21
Сообщение #6


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(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;


Сообщение отредактировано: compiler - 29.06.2007 17:37


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.06.2007 17:29
Сообщение #7


Гость






compiler, чего тебя так тянет лишние условия в программе ставить? На то и придумали Boolean-тип, чтобы сразу можно было присвоить ему или True или False...

function IfInStr (const str,str2:string):boolean;
begin
IfInStr := (pos(str, str2) <> 0);
end;
 К началу страницы 
+ Ответить 
Baturaanna
сообщение 29.06.2007 17:33
Сообщение #8


Гость






Спасибо большое, сейчас попробую. Очень благодарна.
 К началу страницы 
+ Ответить 
compiler
сообщение 29.06.2007 17:34
Сообщение #9


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 29.06.2007 17:29) *
compiler, чего тебя так тянет лишние условия в программе ставить? На то и придумали Boolean-тип, чтобы сразу можно было присвоить ему или True или False...
черт mad.gif , неужели я это опять сделал... незнаю, почему но оно само набирается yes2.gif ... надо от этого уходить.. но как?

сообщение отредактировано.

Сообщение отредактировано: compiler - 29.06.2007 17:36


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Neznaika
сообщение 13.07.2007 13:37
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


[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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
compiler
сообщение 13.07.2007 13:54
Сообщение #11


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


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

Сообщение отредактировано: compiler - 13.07.2007 13:55


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Neznaika
сообщение 13.07.2007 15:50
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


Цитата(compiler @ 13.07.2007 14:54) *

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


compiler, извиняюсь.
Просто мне показалось странным, что Вы предлагаете перебирать все символы строки. Зачем?
Может быть нужный символ - последний в строке. Всего одна проверка и потребовалась бы,
если сканировать строку справа. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 13.07.2007 16:45
Сообщение #13


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата(Neznaika)
Правильное решение:


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

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


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

Цитата(Neznaika)
for I := Length(S) downto 1 do


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Neznaika
сообщение 13.07.2007 18:15
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


Чёрт, вообщето я - он(то есть М, а не Ж).


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;



Нехорошо обманывать девушек - НАПИСАЛ СГОРЯЧА(если в задании написано справа, попробуйте
девушке объяснить, почему ваш алгоритм сканирует строку слева).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 13.07.2007 19:43
Сообщение #15


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


по поводу м/ж извиняюсь, по поводу решения, да окей, 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;


Сообщение отредактировано: klem4 - 13.07.2007 19:45


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Neznaika
сообщение 13.07.2007 20:27
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


Кажется нужно было просто
Цитата
определить позицию самого правого вхождения заданного символа в исходную строку

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


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



Сообщение отредактировано: Neznaika - 13.07.2007 20:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.07.2007 20:33
Сообщение #17


Гость






Цитата
В любом случае проверять все символы строки, по-моему, это ненормально.
Давай, ты не будешь решать, что ДА нормально, а что - НЕТ. Если строка содержит искомый символ первым, то твоя программа будет также проходить по всей строке. Сам себе противоречишь...
 К началу страницы 
+ Ответить 
Neznaika
сообщение 13.07.2007 20:43
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 13.07.2007 21:33) *

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


Если этот символ единственный в строке, то направление сканирования строки не имеет значения.
Нужный символ в начале строки и он входит в строку единожды - это крайний случай.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 14.07.2007 10:54
Сообщение #19


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Я согласен с Neznaika'ой. При случайной расстановке символов в строке сканирование с конца будет более эффективно, безусловно.

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 14.07.2007 12:31
Сообщение #20


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 18:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"