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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача: удвоить буквы в строке 
:(
    Опции темы
mr.Anderson
Дата 2.9.2005, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Надо удвоить все символы во введенной строке. Я писал так:
Код

PROGRAM InsertAlphas;
USES CRT;
VAR S: String;
    i: Integer;
BEGIN
 ClrScr; NormVideo;
 Write('Enter your string:> '); ReadLn(S);
 for i:=1 to Length(S) do Insert(S[i],S,i+1);
 Write('New string: ',S);
 WriteLn; WriteLn; Write('Press any key...'); ReadKey;
END.

Я знаю, тут есть ошибка. Она состоит в том, что длина строки с Инсертом символа увеличивается тоже на 1, поэтому добавляется тот же символ, что и раньше. Я только не догадался, как же эту ошибку исправить?
Добавлено @ 18:57
Так. Немного поправок - и я ближе к цели. Не удваиваются только первые две буквы. Почему?
Код

PROGRAM InsertAlphas;
USES CRT;
VAR S: String;
    i: Integer;
BEGIN
 ClrScr; NormVideo;
 Write('Enter your string:> '); ReadLn(S);
 i:=1;
 for i:=i+2 to Length(S) do 
  begin 
   Insert(S[i],S,i+1); 
   Inc(i); 
  end;
 Write('New string: ',S);
 WriteLn; WriteLn; Write('Press any key...'); ReadKey;
END.


Это сообщение отредактировал(а) sim7 - 2.9.2005, 18:54


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
volvo877
Дата 2.9.2005, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



sim7,
попробуй, так не проще?
Код
var
  s: string;
  i, len: byte;

begin
  ReadLn(s);
  len := length(s);
  for i := 1 to len do begin
    s := s + s[1] + s[1]; delete(s, 1, 1);
  end;
  writeln('New string = ', s);
end.


Ну, или твой же (чуть подправленный) вариант:
Код
Program InsertAlphas;
Uses CRT;
Var
  S: String;
  i: Integer;
BEGIN
  ClrScr; NormVideo;
  Write('Enter your string:> '); ReadLn(S);
  For i:=1 to Length(S) Do Insert(S[2*i-1], S, 2*i);
  Write('New string: ',S);
  WriteLn; WriteLn; Write('Press any key...'); ReadKey;
END.


Это сообщение отредактировал(а) volvo877 - 2.9.2005, 19:35
PM MAIL   Вверх
dvamaster
Дата 2.9.2005, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Зачем использвать FOR если можно проще, а FOR тормоз каких еще поискать.

Хотя мне понравилось у volvo877

Теперь подражая ему:

Код

i := 1;
c := Length(s)
while i <> c do
  begin
    insert(s[i * 2 - 1], s, i * 2);
    i := i + 1;
  end;


А так будет быстрее, но это применимо только на практике, а для решения задачек... думаю была поставлена задача изменить существующую строку (без использвания потусторонних):

Код

i := 1;
c := Length(s)
while i <> c do
  begin
    news := news + s[i] + s[i];
    i := i + 1;
  end;
writeln('new string: ', news);



--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 2.9.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



У меня получилось еще и так (как вариант):
Код

PROGRAM InsertAlphas;
USES CRT;
VAR S: String;
    i: Integer;
BEGIN
 ClrScr; NormVideo;
 WriteLn('Programma udvaivaet vse simvoly v stroke.');
 Write('Enter your string:> '); ReadLn(S);
 for i:=1 to Length(S) do
  begin
   Insert(S[i],S,i+1);
   Inc(i);
  end;
 Write('New string: ',S);
 WriteLn; WriteLn; Write('Press any key...'); ReadKey;
END.



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
volvo877
Дата 2.9.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



sim7,
вот это ты зря делаешь:
Код
for i:=1 to Length(S) do begin
  Insert(S[i],S,i+1);
  Inc(i); { <--- Здесь !!! }
end;

вообще-то крайне нежелательно изменять параметр цикла внутри самого цикла:
Цитата
Если оператор,  содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой.

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


Опытный
**


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

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



В Делфе 7 подобная ошибка отлавливается компилятором, очень удобно!

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

А INC(i) всеже быстрее, чем i := i + 1, теперь спасет только ASM


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 3.9.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



А почему это является ошибкой, если у меня все работает?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
volvo877
Дата 3.9.2005, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



Цитата(sim7 @ 3.9.2005, 10:15)
А почему это является ошибкой, если у меня все работает?

То, что это у тебя работает, еще не значит, что так можно делать (dvamaster уже упоминал, что Delphi 7 например, не даст скомпилировать такую программу. FPC по-моему, тоже выдает предупреждение). А нельзя изменять переменную цикла For вот почему:
Код
var
  i: integer;

begin
  for i := 1 to 10 do begin
    writeln(i); inc(i, 3);
  end;
end.

Попробуй ответить НЕ запуская программу, сколько значений будет распечатано? А потом запусти ее, и посмотри, что происходит.

PM MAIL   Вверх
mr.Anderson
Дата 3.9.2005, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Я думаю, будет напечатано 3 значения. Сначала идет инкремент на 3, а также увеличение на 1 в цикле for, значит, следующая итерация произойдет при i:=5. Дальше снова инкремент на 3, затем на 1, итерация при i:=9. Дальше значение i выйдет за пределы 10, и цикл прервется.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
volvo877
Дата 3.9.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



Цитата(sim7 @ 3.9.2005, 11:25)
Дальше значение i выйдет за пределы 10, и цикл прервется.

smile "Если бы задачка так просто решалась - армянское радио ей бы не занималось" (С)
Цикл НЕ прерывается, в этом-то вся проблема !!! Печатаются значения
<13, 17, 21, ... > и т.д. - пока тебе не надоест, и ты не прервешь выполнение программы через Ctrl + Break.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

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

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

2. Публиковать ссылки на варез

3. Оффтопить

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

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

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


 




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


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

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