Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 099

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
дана строка из чисел. нужно сделать так чтобы каждый символ в этой строе был увеличен на 1.
я чёта наделал не то, что у меня программа зависает и оперативку забивает.

Приложение:
  1. var
  2. i,c,b,f:integer;
  3. str:string;
  4. procedure TForm1.codir;
  5. begin
  6. b:=1;
  7. f:=1;
  8. c:=length(edit1.Text);
  9. str:=edit1.Text;
  10. repeat
  11. i:=ord(str[f]);
  12. case i of
  13. 0:inc(i);
  14. 1:inc(i);
  15. 2:inc(i);
  16. 3:inc(i);
  17. 4:inc(i);
  18. 5:inc(i);
  19. 6:inc(i);
  20. 7:inc(i);
  21. 8:inc(i);
  22. 9:i:=0;
  23. end;
  24.  
  25. Delete(str, b, 1);
  26. Insert(inttostr(i),str,b);
  27. inc(b);
  28. inc(f);
  29. until b=c;
  30. edit2.Text:=str;
  31. end;


Andrew_Cyber Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Andrew_Cyber (статус: Посетитель)
Вопрос отправлен: 18 марта 2011, 22:01
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Толяныч

Здравствуйте, Andrew_Cyber!
Где-то вот так :

Case здесь ни к чему, а внутри case изменять selectorExpression нельзя. Потому имеем то, что имеем.

Приложение:
  1.  
  2. var
  3. stro : string ; i,k,b : integer ;
  4. begin
  5. stro := Ed1.Text ; k := Length (stro) ;
  6. for i := 1 to k do
  7. begin
  8. b := Ord(stro[i]) ; Inc (b) ;
  9. if (b>$39) then b := $30 ;
  10. stro[i] := Chr(b)
  11. end ;
  12. Ed1.Text := stro ;
  13. end;
  14.  


Ответ отправил: Толяныч (статус: 4-ый класс)
Время отправки: 19 марта 2011, 13:25

Ответ #2. Отвечает эксперт: min@y™

Здравствуйте, Andrew_Cyber!
Упрощённый вариантик:

function IncStr(const S: string): string;
var
  i: Integer;
begin
  SetLength(Result, Length(S));
  for i:= 1 to Length(S) do
    Result[i]:= Char((Byte(S[i]) - $2F) mod 10 + $30);
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 марта 2011, 13:41


Мини-форум вопроса

Всего сообщений: 13; последнее сообщение — 6 апреля 2011, 20:35; участников в обсуждении: 3.
Толяныч

Толяныч (статус: 4-ый класс), 18 марта 2011, 22:56 [#1]:

...
bugmenot

bugmenot (статус: 3-ий класс), 19 марта 2011, 07:52 [#2]:

ох лол, ваши сниппеты просто великолепны

for I:=1 to length(S) do
{ пробелы и капитализация убраны в качестве наказания за постинг неформатированного кода }
S[I]:=chr((ord(S[I])-ord('0')+1)mod 10+ord('0'));
виконання програми розпочинається з того самого мiсця, де призупинилося.

Толяныч

Толяныч (статус: 4-ый класс), 19 марта 2011, 13:13 [#3]:

Я так понимаю, это в мой огород. Исходники я, конечно же, форматирую - куда ж без этого, сам запутаешься; но когда код в ответе, так он сам антиформатируется. Пробовал "Вставить код" - код идет в репозитарий кодов, а в текст - ссылка на него( как в вопросе 5085). Когда кода много, тогда понятно, а тут пару строк. Наверно, теги надо применять, но пока не копенгаген.
Слишком не пинайте - я как эксперт ишшо молодой :-)

А мой код хоть и длиннее, но проще в понимании для менее опытных.
Ну вот - переместил из минифорума в ответы - и с форматированием no question .
На звездочку 2 нажал случайно - прошу оценку вопроса не засчитывать.
bugmenot

bugmenot (статус: 3-ий класс), 19 марта 2011, 19:56 [#4]:

Толяныч, неа, у OP китайская каша вместо кода много круче, чем в твоём посте :-)
(переменная k лишняя, for вычисляет однократно)
виконання програми розпочинається з того самого мiсця, де призупинилося.

Толяныч

Толяныч (статус: 4-ый класс), 19 марта 2011, 21:14 [#5]:

Возможно. Но
- я не знаю, кто такой ОР
- привычка ( не помню, то ли из фортрана, то ли из асма ) не писать длинных выражений, а в стиле Маяковского - лесенкой :-), так что k пускай будет
- а как это for может вычисляться однократно - это уже не for.
Однако тут мы меж собой, а вопрошающий слинял, не оставив ни оценки, ни спасиба.
bugmenot

bugmenot (статус: 3-ий класс), 20 марта 2011, 01:57 [#6]:

Original Poster же

вне зависимости от стилистики, копирование результата Length в локальную переменную не даёт ни улучшения читаемости, ни производительности, см. http://docwiki.embarcadero.com/RADStudio/en/Declarations_and_Statements#For_Statements

а рефакторинг типа "explaining var" для значения текущей цифры - годная идея
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 20 марта 2011, 09:40 [#7]:

Цитата (Толяныч):

- а как это for может вычисляться однократно - это уже не for.

Предел для for вычисляется однократно перед циклом. Так шо переменная k лишняя и компилятор при оптимизации 1хрен её выкинет и перевернёт цикл задом наперёд.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 20 марта 2011, 11:54 [#8]:

Все, сдаюсь ! Я же никогда не утверждал, что мой код - образец стиля, и кончно же, вы оба правы, но и не станете спорить, что мой код рабочий. А то, что компайлер выкинет k - дык за то ему и деньги плотять, шоб оптимизировал :-)
Впредь при ответах и комментариях буду равняться на лучшие образцы, забыв лапидарный ФОРТРАН, как кошмарный сон.
bugmenot

bugmenot (статус: 3-ий класс), 22 марта 2011, 18:55 [#9]:

> перевернёт цикл задом наперёд
это вы уже фантазируете

Толяныч, это стандартная особенность паскального for`а, она уникальна среди прочих ЯВУ
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 22 марта 2011, 19:44 [#10]:

Цитата (bugmenot):

это вы уже фантазируете

Ну я тя умоляю! 21 год занимаюсь программированием, поверь на слово. Если внутри цикла for нету вычислений с участием параметра цикла, компилятор, как правило, разворачивает цикл задом наперёд, ибо так он выполняется быстрее (на одну команду меньше в каждой итерации).
Не знал? Проверь! За базар отвечаю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 26 марта 2011, 19:39 [#11]:

- У меня степень магистра!
- Ааа, у кого её нет...

Проверил, факт. Но это компиляторно/платформно специфическое, если паскальный счетчик цикла не используется, то оптимизатор заменяет его регистром C, в котором на интелах хранят число предстоящих итераций цикла. Если переменная не используется, то и волноваться о ней не надо, а цикл сводится к повторению тела N раз. Выше просто k выкинет
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 27 марта 2011, 09:20 [#12]:

Цитата (bugmenot):

Проверил, факт. Но это компиляторно/платформно специфическое, если паскальный счетчик цикла не используется, то оптимизатор заменяет его регистром C, в котором на интелах хранят число предстоящих итераций цикла. Если переменная не используется, то и волноваться о ней не надо, а цикл сводится к повторению тела N раз. Выше просто k выкинет

Ну дык я про то и говорил.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 6 апреля 2011, 20:35 [#13]:

Цитата (min@y™):

и перевернёт цикл задом наперёд
в примере выше счетчик не выкинет, поэтому эффекта "переворачивания цикла" не будет
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:27
Выполнено за 0.03 сек.