Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизЭффективность алгоритма... А Ты сможешь лучше?? Найти похожие ветки
← →
Unknowing (2005-12-28 16:21) [0]Уважаемые профессионалы!!! Учусь программировать, решаю типовые задачи, а ответить на мои вопросы некому :( Правильно ли составлена логика работы процедуры или можно эффективней??
Процедура возвращает:
- кол-во букв в самом большом слове строки
- в самом маленьком
- кол-во слов в строке.
Вот код:Procedure Parse(Str: String; var Sl: Integer; var Max: Integer; var Min: Integer);
var
N : Integer;
Ch_C,
Ch : Integer;
Flag : Boolean;
begin
N:=1;
Sl:=0;
Max:=0;
Min:=0;
Flag:=False;
if Str<>"" then
while N<>Length(Str)+1 do
begin
if (Str[N]<>" ") and (Flag=False) then
begin
Sl:=Sl+1;
Flag:=True;
Ch_C:=N;
Ch:=0;
while ((Ch_C<>Length(Str)+1) and (Str[Ch_C]<>" ")) do
begin
Ch:=Ch+1;
Ch_C:=Ch_C+1;
end;
if Sl=1 then Min:=Ch;
if Ch>Max then Max:=Ch;
if Ch<=Min then Min:=Ch;
end
else if Str[N]=" " then Flag:=False;
N:=N+1;
end
else Writeln("Нет ни одного слова!");
end;
← →
Курдль © (2005-12-28 16:28) [1]Чтобы оценить правильность логики работы процедуры самому или попросить ее оценить других - надо не код присылать, а блок-схему алгоритма вывешивать.
Дай ссылку на свою блок-схему!
← →
ferr © (2005-12-28 16:31) [2]левое полушарие, правый нейрон на третьей секции снизу)
← →
Ega23 © (2005-12-28 16:31) [3]В предложении "Стой, собака!" сколько символов в самом длинном слове?
← →
Unknowing (2005-12-28 16:33) [4]Уф!! Блок схему создавать лениво, а логику делаю на словах.
Опытным глазом так сразу оценить нельзя?
← →
Игорь Шевченко © (2005-12-28 16:33) [5]
> Опытным глазом так сразу оценить нельзя?
Для опытного глаза слишком непонятный код
← →
Unknowing (2005-12-28 16:35) [6]
> Ega23 © (28.12.05 16:31) [3]
Слова здесь все что между пробелами!! Задача посчитать стоимость телеграммы, которая считается из перечисленных параметров.
← →
ferr © (2005-12-28 16:35) [7]вот такие вещи не почитаемы
(Flag=False)
сионисты вот на такие вещи любят набрасыватьсяSl:=Sl+1;
← →
Ega23 © (2005-12-28 16:37) [8]Рекомендую обратить внимание на функции Copy, ExtractDelimited ичто-то ещё. Сейчас вспомню.
А, ещё Trim.
← →
Unknowing (2005-12-28 16:38) [9]Здесь Flag определяет было ли вхождение "пробела"/
> ferr © (28.12.05 16:35) [7]
А почему эти сионисты такого не любят?
← →
Джо © (2005-12-28 16:39) [10]
> [9] Unknowing (28.12.05 16:38)
> Здесь Flag определяет было ли вхождение "пробела"/
not Flag
> А почему эти сионисты такого не любят?
Потому что каждый раз происходит реаллокация памяти под строку.
← →
Ega23 © (2005-12-28 16:40) [11]
> Здесь Flag определяет было ли вхождение "пробела"/
Речь идёт о том, что вместоif (Flag=False)
обычно пишутif not Flag
А сионисты не любят потому, что в С есть ++
← →
Unknowing (2005-12-28 16:41) [12]
> Ega23 © (28.12.05 16:37) [8]
Задача все сделать без применения готовых функций, так сказать,
на низком уровне..
← →
Джо © (2005-12-28 16:41) [13]
> Потому что каждый раз происходит реаллокация памяти под
> строку.
Тьфу, не так прочитал. В данном случае красивше и понятнее Inc (S1).
П.С. Названия переменных ужасны, голова болит от такого.
← →
ferr © (2005-12-28 16:42) [14]А сионисты не любят потому, что в С есть ++))
звучит!
← →
Lexer © (2005-12-28 16:43) [15]а почему функция
pos
не катит?
← →
ferr © (2005-12-28 16:43) [16]а что искать?
← →
MBo © (2005-12-28 16:44) [17]Используй TStrings.CommaText - код сильно упростится
← →
Unknowing (2005-12-28 16:44) [18]
> Джо © (28.12.05 16:41) [13]
Да, правда! :) Болит даже у меня. Но тем не менее, так ли всё с точки зрения эффективности решения??
← →
Ega23 © (2005-12-28 16:45) [19]
> Задача все сделать без применения готовых функций, так сказать,
>
> на низком уровне..
>
Как ты тогда объяснишь применение функции Length ?
← →
Igorek © (2005-12-28 16:46) [20]> Unknowing (28.12.05 16:21)
Ужас. Учи конечные автоматы.
← →
Курдль © (2005-12-28 16:46) [21]
> Опытным глазом так сразу оценить нельзя?
Можно! .... [censored] на [censored], мать ![censored] :[censored], а не код!
← →
Unknowing (2005-12-28 16:46) [22]
> MBo © (28.12.05 16:44) [17]
Да нет! Опять же: я решаю как бы на "низком уровне". Т.е. ни о каких классах и слыхать не слыхивал.
← →
Unknowing (2005-12-28 16:49) [23]
> Курдль © (28.12.05 16:46) [21]
Спасибо, конечно, но думаю что censored можно назвать учителя который не учит, а показывает свою крутость перед учеником!!
Больше от Вас ответов не требую. Еще раз спасибо!
← →
Джо © (2005-12-28 16:51) [24]
> [23] Unknowing (28.12.05 16:49)
Дык ведь указывают на ошибки, пока не видел, чтобы хоть одну исправил.
← →
Igorek © (2005-12-28 16:52) [25]>
> Unknowing (28.12.05 16:49) [23]
> Спасибо, конечно, но думаю что censored можно назвать учителя
> который не учит, а показывает свою крутость перед учеником!
А также ученика, который в каждом предложении усматривает меряние во крутости. :)
← →
Unknowing (2005-12-28 16:53) [26]
> Джо © (28.12.05 16:51) [24]
Стараюсь на критику реагировать правильно! Но всё же: меня интересует больше не удобочтаемость, а эффективность!.
← →
Курдль © (2005-12-28 16:54) [27]
> Unknowing (28.12.05 16:49) [23]
Последний раз уж отвечу. (Я сёдня добрый :)
Хотел я поведать, как надо создавать процедуры... Про метод последовательной детализации от самого Паскаля, про некоторые приемы оптимизации от Вирта...
Но если Вы из тех вундеркиндов, что пишут код без схемы, проектируют базы без модели, то вряд ли Вам нужна чья-то помощь.
Однако и в серьезную компанию Вас на работу не возьмут, пока не научитесь.
← →
ferr © (2005-12-28 16:55) [28]Курдль © (28.12.05 16:54) [27]
тут достаточно простой автомат, схема и в голове уместится.
← →
Чародей © (2005-12-28 16:56) [29]
> Unknowing (28.12.05 16:21)
> Правильно ли составлена логика работы процедуры или можно
> эффективней??
Если процедура работает правильно то логика не может быть не праыильной. А эффективнее можно сделать всегда (правда после некоторого рубежа это становится не рационально). Можно Length(Str)+1 вычислить один раз до цикла, в конце концовможно обойтись одним циклом вместо двух.
← →
Джо © (2005-12-28 16:56) [30]
> [26] Unknowing (28.12.05 16:53)
>
> > Джо © (28.12.05 16:51) [24]
>
> Стараюсь на критику реагировать правильно! Но всё же: меня
> интересует больше не удобочтаемость, а эффективность!.
А вряд-ли кто-то возьмется забесплатно оценивать непонятно какую "эффективность" плохо написанного и неотформатированного кода. Обычно расценивают как неуважение, со всеми вытекающими.
Вот самый банальный пример. Использование название переменной Sl — очень дурной тон. Потому, что маленькая "l" почти не отличима от "1" во многих моноширинных шрифтах.
← →
Курдль © (2005-12-28 16:58) [31]
> ferr © (28.12.05 16:55) [28]
> тут достаточно простой автомат, схема и в голове уместится.
Я среагировал не на конкретную процедуру, а на исходный пост автора:
> Уважаемые профессионалы!!! Учусь программировать, решаю
> типовые задачи, а ответить на мои вопросы некому :(
Если автор учится программировать, ему бы начать не с кодинга, а с алгоритминга :)
← →
Gero © (2005-12-28 16:59) [32]
> Эффективность алгоритма
По каким критериям оценивать эффективность?
> А Ты сможешь лучше??
Это, что, лозунг?
← →
Unknowing (2005-12-28 16:59) [33]
> Курдль © (28.12.05 16:54) [27]
Спасибо! Я не претендую на звание вундеркинда и уже работаю. Просто решил несколько автоматизировать свою работу... Конечно чтобы написать процедуру я создал нечто вроде блок-схемы, но в виде простых предложений. Собственно, изложил подход на листе фразами.
← →
Курдль © (2005-12-28 16:59) [34]
> Unknowing (28.12.05 16:53) [26]
> меня интересует больше не удобочтаемость, а эффективность!.
Пиши на Аssembler-е!
← →
Unknowing (2005-12-28 17:03) [35]
> Чародей © (28.12.05 16:56) [29]
А вот про один цикл вместо двух это уже интересней!! Но у меня голова не варит как это можно сделать.
И что правильней вводить дополнительную переменную и каждый раз считать в цикле Length(S)+1
← →
Lexer © (2005-12-28 17:09) [36]Unknowing, так почему ты всё-таки решил считывать каждый символ, скорость функции pos не устраивает?
iEndW = Pos(" ", Str)
можно сделать один цикл с постоянным уменьшением строки...
?
← →
ferr © (2005-12-28 17:09) [37]эээээ
← →
Ega23 © (2005-12-28 17:11) [38]
> А вот про один цикл вместо двух это уже интересней!! Но
> у меня голова не варит как это можно сделать.
> И что правильней вводить дополнительную переменную и каждый
> раз считать в цикле Length(S)+1
Ну то, что один цикл - это и ежу понятно.
Просто один проход по исходной строке, этого вполне достаточно.
← →
Digitman © (2005-12-28 17:18) [39]Удалено модератором
Примечание: Следи за словарем
← →
MBo © (2005-12-28 17:18) [40]
procedure ParseString(const s:string; var Longest, Shortest, NumWords:Integer);
const
Delimiters = [" ",",","."];
var
i, CurrLen, LastDelim:Integer;
StateInWord: Boolean;
procedure EndOfWord;
begin
CurrLen:=i-LastDelim;
if CurrLen>Longest then
Longest:=CurrLen;
if CurrLen<Shortest then
Shortest:=CurrLen;
Inc(NumWords);
StateInWord := False;
end;
procedure StartWord;
begin
LastDelim:=i;
StateInWord:=True;
end;
begin
Longest:=0;
Shortest:=MaxInt;
LastDelim:=0;
NumWords:=0;
StateInWord:=False;
for i := 1 to Length(s) do
if (s[i] in Delimiters) then begin
if StateInWord then
EndOfWord
end else
if not StateInWord then
StartWord;
if StateInWord then
EndOfWord;
if NumWords=0 then
Shortest:=0;
end;
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 7.501 c