Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощ с процедурой, процедура удаления 
V
    Опции темы
BTCY
Дата 23.6.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Цитата(morpheyushka @ 23.6.2008,  17:40)
Цитата(BTCY @  23.6.2008,  17:25 Найти цитируемый пост)
Кто нибуть как нибуть может показать как сделаны функции TrimLeft И TrimRight ? А то что-то я у себя их в VCL не нахожу o_O 



тебе же уважаемый ama_kid дал исходник функции...одна ее половина (первая) делает TrimLeft, а вторая - последняя - TrimRight. Просто нужно обратно будет развернуть строку

Можете расписать там по строчкам мне объяснения? Мне не только принести код надо будет,но и объяснить его =( За одно может строки развернете про которые говорили? а то я вообще не понимаю)
PM MAIL   Вверх
ama_kid
Дата 23.6.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(BTCY @  23.6.2008,  17:25 Найти цитируемый пост)
Это процедура? Или всётаки функция?
В данном случае - это функция. Если тебе надо именно процедурой (а ты понимаешь разницу между этими понятиями?) - тогда просто заголовок немного переделать надо...
Цитата(BTCY @  23.6.2008,  17:54 Найти цитируемый пост)
За одно может строки развернете про которые говорили?
Разворачивать вроде ничего не надо smile
Цитата(BTCY @  23.6.2008,  17:54 Найти цитируемый пост)
Можете расписать там по строчкам мне объяснения?
Код
function TrimOwn(const Param:string):string; // Объявление функции. 
var   // Объявление локальных переменных
 p:integer; // Временная переменная для хранения позиции первого непробельного символа
 tmp_str:string;  //временная строчная переменная
 i:integer;  // локальная переменная цикла
begin   // начало тела функции
 Result:='';   //Result - это переменая, которая хранит возвращаемое функцией значение. Инициализируем её
 tmp_str:='';  // инициализируем временную переменную
 p:=1;  // аналогично
 while Param[p]=' ' do inc(p);  // пока встречаются пробелы - увеличиваем счетчик
 for i:=length(Param) downto p do tmp_str:=tmp_str+Param[i]; // от последнего символа до первого 
                     //непробельного символа копируем во временный результат
                     //получаем инвертированную строку с отсеченными первыми пробелами
 p:=1;  // еще раз инициализируем 
 while tmp_str[p]=' ' do inc(p); // делаем второй раз увеличение счетчика пробелов
 for i:=length(tmp_str) downto p do Result:=Result+tmp_str[i]; // от последнего символа до первого 
                     // непробельного символа копируем в результат
                     // в итоге строка опять перевернется и исходные завершающие пробелы отсекутся...
end; // окончание тела функции

Цитата(BTCY @  23.6.2008,  17:25 Найти цитируемый пост)
а то я вообще не понимаю
Разбирайся и спрашивай...  smile 


Это сообщение отредактировал(а) ama_kid - 23.6.2008, 19:04


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
BTCY
Дата 23.6.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Мега спасибо!!! smile  smile 
Мне нужна процедура. Что там вверху заменить и на что?


PM MAIL   Вверх
ama_kid
Дата 23.6.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(BTCY @  23.6.2008,  20:04 Найти цитируемый пост)
Мне нужна процедура. Что там вверху заменить и на что?
примерно так:
Код
procedure TrimOwn(const Param:string; var Result: string); // Объявление процедуры




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Beltar
Дата 24.6.2008, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Код

procedure MyTrim(var S:String);
var S1:String;
    i,L:Integer;
begin
i:=1;
L:=Length(S);
S1:='';
while ((i<=L) and (S[i]=' ')) do inc(i);
while ((i<=L) and (S[i]<>' ')) do
  begin
  S1:=S1+S[i];
  inc(i);
  end;
S:=S1;
end;


Вот еще простейший вариант, чуть менее громоздкий, всего 2 цикла и все-таки
Код

procedure TrimOwn(const Param:string; var Result: string);


для меня выглядит немного странно, преподы дают, конечно, глупости, но если уж мутить процедуру, то пусть уж она изменяет переменную.
Однако при использовании этого простейшего варианта убедись, что включена короткая схема вычисления лог. выражений, иначе можешь AV схлопотать. smile


PS А вместо var Result логичнее out Result указать, но это уже тонкости, которые студенту не нужны. smile

Это сообщение отредактировал(а) Beltar - 24.6.2008, 07:18


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
ama_kid
Дата 24.6.2008, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(Beltar @  24.6.2008,  07:18 Найти цитируемый пост)
Вот еще простейший вариант
Код
while ((i<=L) and (S[i]<>' ')) do
  begin
  S1:=S1+S[i];
  inc(i);
  end;
Вроде как будет работать только до первого пробела в середине строки. Этот цикл надо организовать от конца строки в сторону уменьшения...
Цитата(Beltar @  24.6.2008,  07:18 Найти цитируемый пост)
Однако при использовании этого простейшего варианта убедись, что включена короткая схема вычисления лог. выражений, иначе можешь AV схлопотать
Я конечно дал такое объявление функции навскидку (чтобы не изменять тело процедуры, у меня нет сейчас дельфи под рукой), но поясни плз данный тезис, я что-то его не догнал. В каком месте там может быть AV?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Beltar
Дата 24.6.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

Вроде как будет работать только до первого пробела в середине строки. Этот цикл надо организовать от конца строки в сторону уменьшения...


Признаю свою неправоту. Оптимизировать не получилось, абыдна.

Цитата

о поясни плз данный тезис, я что-то его не догнал. В каком месте там может быть AV?



Код

(i<=L) and (S[i]<>' ')

Когда i станет больше длины, S[i] будет выходом за границу строки.
В твоем варианте я проблем не вижу.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
ama_kid
Дата 24.6.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(Beltar @  24.6.2008,  08:42 Найти цитируемый пост)
Когда i станет больше длины, S[i] будет выходом за границу строки
Когда i станет больше длины строки - сработает условие (i<=L) и до условия (S[i]<>' ') не дойдет, так что "выхода" быть не должно.

Добавлено через 1 минуту и 52 секунды
Цитата(Beltar @  24.6.2008,  08:42 Найти цитируемый пост)
Оптимизировать не получилось, абыдна.
Оптимизировать там можно раза в два по объему кода, но пусть топиккастер сам попробует подумать на эту тему smile



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
morpheyushka
Дата 24.6.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: 2
Всего: 8



по моему тему уже можно закрывать...лучше бы это сделал модератор, а то от хозяина темы не дождёшься smile 


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Beltar
Дата 24.6.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

Когда i станет больше длины строки - сработает условие (i<=L) и до условия (S[i]<>' ') не дойдет, так что "выхода" быть не должно.


Именно. Это и называется вычислением по короткой схеме, но в опциях проекта в разделе Compiler можно включить полное вычисление.
Конечно, я знаю, что там стоит по умолчанию, но думал пусть топикстартер попугается. Вопросов позадает. Впрочем бояться ему оказывается нечего, :( я забыл, что в конце строки еще нолик есть и S[Length(S)+1] как раз на него и покажет.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
BTCY
Дата 24.6.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Всем БОЛЬШОЕ спасибо кто принимал участие в дискуссии!!! Отдельное МЕГА спасибо ama_kid !
Сдал на 5 эту задачу.  smile 

Это сообщение отредактировал(а) BTCY - 24.6.2008, 14:18
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.