|
Вопрос # 5 099/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
дана строка из чисел. нужно сделать так чтобы каждый символ в этой строе был увеличен на 1.
я чёта наделал не то, что у меня программа зависает и оперативку забивает.
Приложение: Переключить в обычный режим- var
- i,c,b,f:integer;
- str:string;
- procedure TForm1.codir;
- begin
- b:=1;
- f:=1;
- c:=length(edit1.Text);
- str:=edit1.Text;
- repeat
- i:=ord(str[f]);
- case i of
- 0:inc(i);
- 1:inc(i);
- 2:inc(i);
- 3:inc(i);
- 4:inc(i);
- 5:inc(i);
- 6:inc(i);
- 7:inc(i);
- 8:inc(i);
- 9:i:=0;
- end;
-
- Delete(str, b, 1);
- Insert(inttostr(i),str,b);
- inc(b);
- inc(f);
- until b=c;
- edit2.Text:=str;
- end;
 |
Вопрос задал: Andrew_Cyber (статус: Посетитель)
Вопрос отправлен: 18 марта 2011, 22:01
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Толяныч
Здравствуйте, Andrew_Cyber!
Где-то вот так :
Case здесь ни к чему, а внутри case изменять selectorExpression нельзя. Потому имеем то, что имеем.
Приложение: Переключить в обычный режим-
- var
- stro : string ; i,k,b : integer ;
- begin
- stro := Ed1.Text ; k := Length (stro) ;
- for i := 1 to k do
- begin
- b := Ord(stro[i]) ; Inc (b) ;
- if (b>$39) then b := $30 ;
- stro[i] := Chr(b)
- end ;
- Ed1.Text := stro ;
- end;
-
 |
Ответ отправил: Толяныч (статус: 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 (статус: 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 (статус: 3-ий класс), 19 марта 2011, 19:56 [#4]:
Толяныч, неа, у OP китайская каша вместо кода много круче, чем в твоём посте 
(переменная k лишняя, for вычисляет однократно)
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Толяныч (статус: 4-ый класс), 19 марта 2011, 21:14 [#5]:
Возможно. Но
- я не знаю, кто такой ОР
- привычка ( не помню, то ли из фортрана, то ли из асма ) не писать длинных выражений, а в стиле Маяковского - лесенкой , так что k пускай будет
- а как это for может вычисляться однократно - это уже не for.
Однако тут мы меж собой, а вопрошающий слинял, не оставив ни оценки, ни спасиба.
|
|
min@y™ (статус: Доктор наук), 20 марта 2011, 09:40 [#7]:
Цитата (Толяныч):
- а как это for может вычисляться однократно - это уже не for.
Предел для for вычисляется однократно перед циклом. Так шо переменная k лишняя и компилятор при оптимизации 1хрен её выкинет и перевернёт цикл задом наперёд.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Толяныч (статус: 4-ый класс), 20 марта 2011, 11:54 [#8]:
Все, сдаюсь ! Я же никогда не утверждал, что мой код - образец стиля, и кончно же, вы оба правы, но и не станете спорить, что мой код рабочий. А то, что компайлер выкинет k - дык за то ему и деньги плотять, шоб оптимизировал 
Впредь при ответах и комментариях буду равняться на лучшие образцы, забыв лапидарный ФОРТРАН, как кошмарный сон.
|
|
bugmenot (статус: 3-ий класс), 22 марта 2011, 18:55 [#9]:
> перевернёт цикл задом наперёд
это вы уже фантазируете
Толяныч, это стандартная особенность паскального for`а, она уникальна среди прочих ЯВУ
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 22 марта 2011, 19:44 [#10]:
Цитата (bugmenot):
это вы уже фантазируете
Ну я тя умоляю! 21 год занимаюсь программированием, поверь на слово. Если внутри цикла for нету вычислений с участием параметра цикла, компилятор, как правило, разворачивает цикл задом наперёд, ибо так он выполняется быстрее (на одну команду меньше в каждой итерации).
Не знал? Проверь! За базар отвечаю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 26 марта 2011, 19:39 [#11]:
- У меня степень магистра!
- Ааа, у кого её нет...
Проверил, факт. Но это компиляторно/платформно специфическое, если паскальный счетчик цикла не используется, то оптимизатор заменяет его регистром C, в котором на интелах хранят число предстоящих итераций цикла. Если переменная не используется, то и волноваться о ней не надо, а цикл сводится к повторению тела N раз. Выше просто k выкинет
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 27 марта 2011, 09:20 [#12]:
Цитата (bugmenot):
Проверил, факт. Но это компиляторно/платформно специфическое, если паскальный счетчик цикла не используется, то оптимизатор заменяет его регистром C, в котором на интелах хранят число предстоящих итераций цикла. Если переменная не используется, то и волноваться о ней не надо, а цикл сводится к повторению тела N раз. Выше просто k выкинет
Ну дык я про то и говорил.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 6 апреля 2011, 20:35 [#13]:
Цитата (min@y™):
и перевернёт цикл задом наперёд в примере выше счетчик не выкинет, поэтому эффекта "переворачивания цикла" не будет
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|