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

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

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

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


Гость






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

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


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

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

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


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


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


Гость






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


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

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

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


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

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


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


Гость






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

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


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


Гость






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

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


Гость






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


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

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

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


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

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

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


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


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

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

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


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

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


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


Пионер
**

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

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


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

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


compiler, извиняюсь.
Просто мне показалось странным, что Вы предлагаете перебирать все символы строки. Зачем?
Может быть нужный символ - последний в строке. Всего одна проверка и потребовалась бы,
если сканировать строку справа. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -


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


Пионер
**

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

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


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

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


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



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


Гость






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


Пионер
**

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

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


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

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


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


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

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

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


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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 19.09.2020 20:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name