Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 1032
от 12.01.2008, 12:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 427, Экспертов: 58
В номере:Вопросов: 3, Ответов: 5

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 117219: Здравствуйте уважаемые эксперты по Делфи.Помогите мне с одной проблемкой. значит пишу одну прогу.Там через IdSMTP надо авторизоваться на сервере типа нужна правильная связка(логин-пароль).так вот как мне сделать чтобы в случае неверной связки(лог...
Вопрос № 117228: Здравствуйте и с Наступившим Новым, уважаемые эксперты! Помогите кто сможет: разбираюсь с округленными подсказками в System Tray в Win2k/WinXP, но что-то не получается. MSDN2005 не помог (может плохо искал). Подкиньте примерчики, может статейки какие...
Вопрос № 117287: Здравствуйте, Уважаемые эксперты! Вот пытаюсь решить задачку, но пока выходит что-то не то. Подскажите, что не так? Задачка следующая: «Вывести позицию самой длинной группы одинаковых подряд идущих символов». Заранее всем спасибо!!!:-) ..

Вопрос № 117.219
Здравствуйте уважаемые эксперты по Делфи.Помогите мне с одной проблемкой.
значит пишу одну прогу.Там через IdSMTP надо авторизоваться на сервере типа нужна правильная связка(логин-пароль).так вот как мне сделать чтобы в случае неверной связки(логин проль) процесс коннекта с серваком пошел занова(то есть логин на серваке с новой указанной связкой),и не вылезала ошибка "project rised excepion class EldProtocolReplyError with message : Incorrect authentication data :process stoped.Use step or run to cont.".Пользуюсь Delphi 7

Приложение:

Отправлен: 06.01.2008, 17:15
Вопрос задал: Ренат (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Selya
Здравствуйте, Ренат!
Обрабатывай эту ситуацию через try...except. И делай всё что что хочешь, в т.ч. коннекться с серваком заново...
Ответ отправил: Selya (статус: 3-ий класс)
Ответ отправлен: 07.01.2008, 15:48
Оценка за ответ: 3
Комментарий оценки:
Не помогло почему то( все равно те же ошибки вылетают,но все равно спс за помощь


Вопрос № 117.228
Здравствуйте и с Наступившим Новым, уважаемые эксперты! Помогите кто сможет: разбираюсь с округленными подсказками в System Tray в Win2k/WinXP, но что-то не получается. MSDN2005 не помог (может плохо искал). Подкиньте примерчики, может статейки какие поскажете. Помогите, please.
Отправлен: 06.01.2008, 17:47
Вопрос задал: Beginner (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Louken
Здравствуйте, Beginner!

Да что может быть проще. Вот статья:
Использование подсказки в Tray в виде шара
Код рабочий, сам проверял (ну почти рабочий, навсякий случай в приложении находиться рабочий код).
Если в чем то не разберётесь, то обращайтесь в минифорум.
С Рождеством Христовым.
Ответ отправил: Louken (статус: Студент)
Ответ отправлен: 06.01.2008, 23:01
Оценка за ответ: 4
Комментарий оценки:
Нечто похожее я видел в DRKB.chm c www.drkb.ru. Что-ж попробую...


Вопрос № 117.287
Здравствуйте, Уважаемые эксперты! Вот пытаюсь решить задачку, но пока выходит что-то не то. Подскажите, что не так?
Задачка следующая: «Вывести позицию самой длинной группы одинаковых подряд идущих символов».
Заранее всем спасибо!!!:-)

Приложение:

Отправлен: 07.01.2008, 00:45
Вопрос задала: Krista (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: DimonSoft
Здравствуйте, Krista!

Для начала укажу Вам на ряд неточностей и ошибок, найденных мной в приведённом Вами фрагменте программы. Я немного переформатировал исходник, чтобы сделать его более наглядным для разбора данной программы.

procedure TForm1.Button1Click(Sender: TObject);
var
N,i:Integer;
Str:String;
Count:Integer;
CountFirst:Integer;
begin
Str:=Edit1.Text;
Count:=1;
for i:=1 to Length(Str) do
begin
if Str[i]=Str[i+1] then
begin
N:=i;
Inc(Count);
CountFirst:=Count;
end
else
if Count>CountFirst then
begin
CountFirst:=Count;
Count:=1;
end;
Count:=1;
end;
Label1.Caption:=IntToStr(N);
Label2.Caption:=IntToStr(CountFirst);
end;

Итак, проблема первая. При первой проверке условия "Count>CountFirst" значение переменной CountFirst будет неопределённым. Надеяться на то, что переменная примет нулевое значение по воле компилятора - это дурной тон в программировании, тогда как явная инициализация переменных помогает упростить отладку программы в дальнейшем и избежать появления в ней малозаметных и очень "коварных" ошибок.

Проблема вторая. Цикл для i продолжается до значения i=Length(Str), а в теле цикла используется i+1-й символ строки, что, мягко говоря, не есть хорошо.

Проблема третья. Предполагаю, что CountFirst - это длина искомой подстроки, Count - длина проверяемой в данный момент подстроки (это видно из присвоения значений Caption'ам Label'ов). Давайте проанализируем, что же делает Ваша процедура. Переменную N рассматривать пока не будем (от нас, вообще говоря, по условию ничего, кроме CountFirst, не требуется).

Итак, при первом проходе (т.е. на первом символе заданной строки) Count=1. Мы проверяем, равен ли первый символ второму. Предположим, что Str[1]=Str[2]. Значение Count увеличивается на 1, т.е. теперь Count=2. CountFirst тоже становится равным 2. Ветка "else" пропускается, а за ней идёт присвоение Count:=1;. Нетрудно заметить, что, как бы мы ни старались, больше 2 в ответе по этому алгоритму мы не получим, поскольку при каждом выполнении тела цикла длина текущей подстроки возвращаетс в исходное состояние (1).

Поступлюсь своими принципами и приведу одно из решений, пришедших мне в голову. Код в среде программирования не проверял, могут быть ошибки на стадии компиляции (хотя вряд ли :)).

procedure TForm1.Button1Click(Sender: TObject);
var
N,i:Integer;
Str:String;
Curr,Best:Integer;
begin
Str:=Edit1.Text;
Best:=1; i:=1;
while (i<=Length(Str)) do
begin
N:=i;
while (i<=Length(Str)) and (Str[N]=Str[i]) do Inc(i);
Curr:=i-N; //Длина текущей подстроки
if Curr>Best then Best:=Curr;
if i=N then Inc(i); //Это условие будет истинно, если вложенный while не выполнился ни разу
end;
Label1.Caption:=IntToStr(N);
Label2.Caption:=IntToStr(CountFirst);
end;

Сложность алгоритма по-прежнему O(N), но теперь он работает (даю 99%, не 100% только потому, что я поленился запустить среду программирования:)).

Найти решение, которое будет работать быстрее, чем за линейное время, не удастся, поэтому других способов рассказывать не буду, но если Вам они интересны - поищите в интернете инормацию по темам "Рекуррентные соотношения" и "Хеширование". Использование названных приёмов в этойзадаче не имело смысла, поскольку потребовало бы больших затрат оперативной памяти, но во многих более сложных задачах эти приёмы оказываются очень удобными.

С уважением, DimonSoft.
Ответ отправил: DimonSoft (статус: 3-ий класс)
Ответ отправлен: 07.01.2008, 01:57
Оценка за ответ: 5
Комментарий оценки:
Спасибо Большое ВАМ за подробное объяснение!:-)
С Рождеством ВАС!:-)
Удачи!:-)

Отвечает: Esi
Здравствуйте, Krista!
В вашей программе, не всё учитывается. Например, теряется позиция самой длинной строки, выводятся значения в label внутри цикла... В приложении написал свой вариант. Хотя он может и не всё понравится, имея ввиду использование функции сору(). Данный вариант, я не проверял, потому что рядом нет DELPHI.

Приложение:

Ответ отправил: Esi (статус: 3-ий класс)
Ответ отправлен: 07.01.2008, 02:18
Оценка за ответ: 5
Комментарий оценки:
Огромное ВАМ спасибо!!!:-)
С Рождеством ВАС!:-)
Удачи!:-)

Отвечает: Markedone
Здравствуйте, Krista!
У тебя были ошибки.
Вот, попробуй исправленный вариант:

procedure TForm1.Button1Click(Sender: TObject);
Var N, CountFirst ,Count, i:integer;
Str:string;
begin
Str:=Edit1.Text;
Count:=1;
For i:=1 to Length(Str) do
Begin
If Str[i]=Str[i+1] then
Begin N:=i;
Inc(Count);
CountFirst:=Count; end
else If Count=CountFirst then
Begin CountFirst:=Count;
Count:=1;
end;
Count:=1;
end;
Label1.Caption:=IntToStr(N);
Label2.Caption:=IntToStr(CountFirst);
end;
Ответ отправил: Markedone (статус: 2-ой класс)
Ответ отправлен: 07.01.2008, 17:11
Оценка за ответ: 3


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.69 от 06.01.2008
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное