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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как заменить символ в строке, заменить символ в строке на другой 
V
    Опции темы
valerchi
Дата 17.2.2014, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Помогите, всё обшарил, никак не могу найти решение на вроде бы простой вопрос. Мне нужно заменить символ в определённой ячейке.
Так выдаёт ошибку ([Error] Unit1.pas(185): Incompatible types: 'Char' and 'String').
Код

var a,b:string; i,c:integer;
begin
...
a[i]:=inttostr(strtoint(b)+c);
...
end;

PM MAIL   Вверх
Vas
Дата 17.2.2014, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так в вашем примере
a[i] - char
inttostr(strtoint(b)+c) - string

А чем StringReplace не устраивает? 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Poseidon
Дата 17.2.2014, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

Репутация: 9
Всего: 133



valerchi, IntToStr вернет string, т.е. строку (возможно в несколько символов). a[i] вернет Char, т.е. один символ. Ты своим кодом пытаешься присвоить в один символ целую строку. Даже если изловчится и преобразовать string в char, то что должно произойти, если с будет больше 10? Как ты сможешь в один символ спихнуть двузначное число? Трехзначное? У тебя ошибка изначально в проектировании. Лучше напиши на каком-нибудь примере с многозначными числами что должно получиться, а мы тебе подскажем как это сделать. Хотя бы расскажи что должно быть к примеру при a = 'Hello World', b = '8', c = 5 и i = 2.

Цитата(Vas @  17.2.2014,  19:23 Найти цитируемый пост)
А чем StringReplace не устраивает?  
По всей видимости тем, что заменить символ надо не "где-то там в строке", а на конкретной позиции.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Pawl
Дата 17.2.2014, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Poseidon @  17.2.2014,  21:31 Найти цитируемый пост)
Даже если изловчится и преобразовать string в char

Если получится число от 0 до 9, проблемы тут нет совершенно. В таком случае можно сделать примерно так:
Код

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var a, b: string; i, c: integer;
begin
  a := '9376';
  b := '3';
  i := 2;
  c := 5;
  a[i] := inttostr(strtoint(b) + c)[1];
  write(a);
  readln;
end.

Для наглядности я взял
Цитата(Poseidon @  17.2.2014,  21:31 Найти цитируемый пост)
c = 5 и i = 2

Только b := '3',  потому что при b = '8' таки да, проблема появится smile 

Это сообщение отредактировал(а) Pawl - 18.2.2014, 00:07


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
valerchi
Дата 18.2.2014, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pawl @ 17.2.2014,  23:59)
Цитата(Poseidon @  17.2.2014,  21:31 Найти цитируемый пост)
Даже если изловчится и преобразовать string в char

Если получится число от 0 до 9, проблемы тут нет совершенно. В таком случае можно сделать примерно так:
Код

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var a, b: string; i, c: integer;
begin
  a := '9376';
  b := '3';
  i := 2;
  c := 5;
  a[i] := inttostr(strtoint(b) + c)[1];
  write(a);
  readln;
end.

Для наглядности я взял
Цитата(Poseidon @  17.2.2014,  21:31 Найти цитируемый пост)
c = 5 и i = 2

Только b := '3',  потому что при b = '8' таки да, проблема появится smile

Спасибо, я понял. У меня может такое получиться, что в один символ нужно будет  "запихнуть" двузначное число. Значит, получается, что этот принцип не работает. А как же тогда сделать? Вместо переменной string брать массив string?
PM MAIL   Вверх
Pawl
Дата 18.2.2014, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  18.2.2014,  16:22 Найти цитируемый пост)
А как же тогда сделать? Вместо переменной string брать массив string?

Можно сделать так:
Код

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var a, b, s: string; i, c: integer;
begin
  a := '9376';
  b := '9';
  i := 2;
  c := 5;
  s := inttostr(strtoint(b) + c);
  Delete(a, i, 1);  // удаляет 1 символ из i-й позиции
  Insert(s, a, i);  // вставляет результат суммирования, начиная с i-й позиции
  write(a);
  readln;
end.



--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Poseidon
Дата 19.2.2014, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

Репутация: 9
Всего: 133



Цитата(valerchi @ 18.2.2014,  16:22)
Спасибо, я понял. У меня может такое получиться, что в один символ нужно будет  "запихнуть" двузначное число. Значит, получается, что этот принцип не работает. А как же тогда сделать? Вместо переменной string брать массив string?

Я еще раз повторюсь, расскажи на конкретном примере что именно требуется при многозначных значениях. Потому как не совсем понятно каким образом нужно менять исходную строку. Можно заменять один символ двумя, "раздвигая" при этом исходную строку (так предложил Pawl), а можно заменять два символа исходной строки, тогда ее размерность не поменяется. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
valerchi
Дата 19.2.2014, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Poseidon @ 19.2.2014,  00:01)
Цитата(valerchi @ 18.2.2014,  16:22)
Спасибо, я понял. У меня может такое получиться, что в один символ нужно будет  "запихнуть" двузначное число. Значит, получается, что этот принцип не работает. А как же тогда сделать? Вместо переменной string брать массив string?

Я еще раз повторюсь, расскажи на конкретном примере что именно требуется при многозначных значениях. Потому как не совсем понятно каким образом нужно менять исходную строку. Можно заменять один символ двумя, "раздвигая" при этом исходную строку (так предложил Pawl), а можно заменять два символа исходной строки, тогда ее размерность не поменяется.

В тмм то всё и дело, что нужно не раздвинуть строку и вставить, а именно заменить. А код такой
Код

var buf,h,i:integer; a,rez:string;
begin
...
buf:=strtoint([i])+strtoint([i]);
if buf>=10 then
begin
h:=0;
repeat
buf:=buf-10;
inc(h);
until buf<10;
rez:=inttostr(buf)+rez;
if a[i-1]<>'y' then
a[i-1]:=inttostr(strtoint(a[i-1])+h)
else
a[i-2]:=inttostr(strtoint(a[i-2])+h);
end


Загвоздка в том, что a[i-1] или a[i-2] могут быть от 0 до 9 и в сумме может получиться двузначное число.
PM MAIL   Вверх
Pawl
Дата 19.2.2014, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот блин, инфу надо из вас клещами вытаскивать! То вы говорите про 1 символ:
Цитата(valerchi @  17.2.2014,  17:56 Найти цитируемый пост)
Мне нужно заменить символ в определённой ячейке.

А теперь уже речь идет о нескольких!
Цитата(valerchi @  19.2.2014,  12:48 Найти цитируемый пост)
В тмм то всё и дело, что нужно не раздвинуть строку и вставить, а именно заменить.

Напоминает известную фразу: "хозяйка, дай попить, а то так есть хочется, что аж переночевать негде!" smile 
Но к делу. Вы писали
Цитата(valerchi @  18.2.2014,  16:22 Найти цитируемый пост)
У меня может такое получиться, что в один символ нужно будет  "запихнуть" двузначное число

В коде у вас также заменяется один символ. Если не запихивать несколько символов в 1, а в каждый символ по 1-му, в зависимости от величины strtoint(a[i-1])+h, то можно сделать так (минимально переделав мой код выше):
Код

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var a, b, s: string; i, c: integer;
begin
  a := '9376';
  b := '9';
  i := 2;
  c := 5;
  s := inttostr(strtoint(b) + c);
  // удаляет количество символов, равное числу знаков в сумме, начиная с i-й позиции
  Delete(a, i, length(s));
  Insert(s, a, i);  // вставляет результат суммирования, начиная с i-й позиции
  write(a);
  readln;
end.

И, пожалуйста, в следующий раз внятно формулируйте ТЗ! Кстати, вот ссылка по работе со строками. Может вам пригодиться

Это сообщение отредактировал(а) Pawl - 19.2.2014, 17:17


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
valerchi
Дата 19.2.2014, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pawl @ 19.2.2014,  17:16)
Вот блин, инфу надо из вас клещами вытаскивать! То вы говорите про 1 символ:
Цитата(valerchi @  17.2.2014,  17:56 Найти цитируемый пост)
Мне нужно заменить символ в определённой ячейке.

А теперь уже речь идет о нескольких!
Цитата(valerchi @  19.2.2014,  12:48 Найти цитируемый пост)
В тмм то всё и дело, что нужно не раздвинуть строку и вставить, а именно заменить.

Напоминает известную фразу: "хозяйка, дай попить, а то так есть хочется, что аж переночевать негде!" smile 
Но к делу. Вы писали
Цитата(valerchi @  18.2.2014,  16:22 Найти цитируемый пост)
У меня может такое получиться, что в один символ нужно будет  "запихнуть" двузначное число

В коде у вас также заменяется один символ. Если не запихивать несколько символов в 1, а в каждый символ по 1-му, в зависимости от величины strtoint(a[i-1])+h, то можно сделать так (минимально переделав мой код выше):
Код

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var a, b, s: string; i, c: integer;
begin
  a := '9376';
  b := '9';
  i := 2;
  c := 5;
  s := inttostr(strtoint(b) + c);
  // удаляет количество символов, равное числу знаков в сумме, начиная с i-й позиции
  Delete(a, i, length(s));
  Insert(s, a, i);  // вставляет результат суммирования, начиная с i-й позиции
  write(a);
  readln;
end.

И, пожалуйста, в следующий раз внятно формулируйте ТЗ! Кстати, вот ссылка по работе со строками. Может вам пригодиться

Спасибо, но это чуть не то, что мне нужно. Нужно так, чтобы в ячейке было, например двузначное число, скажем, 22, а не 2 и 2. Наверное,  для этой цели мне лучше подойдёт массив. Я бы и раньше пользовался массивами, но строками удобнее (можно присвоить всё значение строки в другую переменную (a:=a+b;)).  А так нужно запускать цикл, чтобы вывести все значения массива в переменную.
PM MAIL   Вверх
Pawl
Дата 19.2.2014, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(valerchi @  19.2.2014,  18:13 Найти цитируемый пост)
Нужно так, чтобы в ячейке было, например двузначное число, скажем, 22, а не 2 и 2. 

А какая разница? Можно выделить эти 2 и 2 из строки, сделать strtoint и будет вам 22 smile
P. S. Вы вообще мой код запускали?
На входе у меня строка а = '9376'; s = inttostr(strtoint(b) + c) = 14. Таким образом, на выходе будет а = '9146'. Это то, что вы хотите получить? Если нет, поясните, что должно быть на конкретном примере.

Это сообщение отредактировал(а) Pawl - 19.2.2014, 22:23


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
valerchi
Дата 20.2.2014, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pawl @ 19.2.2014,  18:57)
Цитата(valerchi @  19.2.2014,  18:13 Найти цитируемый пост)
Нужно так, чтобы в ячейке было, например двузначное число, скажем, 22, а не 2 и 2. 

А какая разница? Можно выделить эти 2 и 2 из строки, сделать strtoint и будет вам 22 smile
P. S. Вы вообще мой код запускали?
На входе у меня строка а = '9376'; s = inttostr(strtoint(b) + c) = 14. Таким образом, на выходе будет а = '9146'. Это то, что вы хотите получить? Если нет, поясните, что должно быть на конкретном примере.

Спасибо, код интересно придуман, но дело в том, что это всё усложняет, потому, что: 
1.цифры в ячейках которые удаляются, тоже будут прибавляться (заменяться) (они все должны пройти изменения)
2.неизвестно на каком цикле, сколько ячеек нужно выделить (если число больше 10 то 2 ячейки, а если нет, то 1). Так мы имеем одну ячейку с определённой цифрой (двухзначной или однозначной)....
Вот как я решил сделать. Может что-то можно упростить? Посоветуйте.
Код

.....
  masa:array of string;
  masb:array of string;
......
var rez,buf:string; h,buf1,i:integer;
h:=0;
inc(i);
repeat
dec(i);
if masa[i]<>',' then
begin
buf1:=strtoint(masa[i])+strtoint(masb[i]);
if buf1>=10 then
begin
h:=0;
repeat
buf1:=buf1-10;
inc(h);
until buf1<10;
rez:=inttostr(buf1)+rez;
if masa[i-1]<>','then
masa[i-1]:=inttostr(strtoint(masa[i-1])+h)
else
masa[i-2]:=inttostr(strtoint(masa[i-2])+h);
end
else
rez:=inttostr(buf1)+rez;
end
else
rez:=','+rez;
if i-1=0 then
begin
rez:=inttostr(strtoint(masa[i-1])+strtoint(masb[i-1]))+rez;
i:=0;
end;
until i=0;

PM MAIL   Вверх
Агрох
Дата 20.2.2014, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 1
Всего: 6



Прочитал тему немного поверхностно, но всё же выскажу предположение. Человеку надо запомнить массив чисел (не цифр) и он решил что проще будет сделать это через сохранение их в строку. Но тогда вопрос, массив каких чисел вот это: "9238"? 9, 2, 3 и 8? 92, 3 и 8? 9, 23 и 8? 92 и 38?
Варианта три. Либо использовать всё таки нормальный массив. Либо ставить между числами разделители, например "9|23|8" (да да, это было всё таки 9, 23 и 8). Либо использовать N-значную систему исчисления, по аналогии с шестнадцатиричной, где 10 = A, 11 = B и т.д., т.е. такую, где даже двузначное число есть один символ.
А вообще да, нужно описание самой задачи, а не выбранного метода её решения.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Pawl
Дата 20.2.2014, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Агрох @  20.2.2014,  09:31 Найти цитируемый пост)
А вообще да, нужно описание самой задачи, а не выбранного метода её решения.

Согласен.
Цитата(valerchi @  20.2.2014,  00:42 Найти цитируемый пост)
(если число больше 10 то 2 ячейки, а если нет, то 1). Так мы имеем одну ячейку с определённой цифрой (двухзначной или однозначной)

вот сейчас вообще не понял...
Цитата(valerchi @  20.2.2014,  00:42 Найти цитируемый пост)
Вот как я решил сделать. Может что-то можно упростить? Посоветуйте.

Для того, чтобы что-то посоветовать, надо понять, что вам надо. Приведите лучше свой код полностью, чтобы его можно было запустить, с тем, что должно быть на входе и что вы хотите получить на выходе. Если код слишком велик, локализуйте проблему в рабочем примере.

Это сообщение отредактировал(а) Pawl - 20.2.2014, 13:28


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
valerchi
Дата 20.2.2014, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Агрох @ 20.2.2014,  09:31)
Прочитал тему немного поверхностно, но всё же выскажу предположение. Человеку надо запомнить массив чисел (не цифр) и он решил что проще будет сделать это через сохранение их в строку. Но тогда вопрос, массив каких чисел вот это: "9238"? 9, 2, 3 и 8? 92, 3 и 8? 9, 23 и 8? 92 и 38?
Варианта три. Либо использовать всё таки нормальный массив. Либо ставить между числами разделители, например "9|23|8" (да да, это было всё таки 9, 23 и 8). Либо использовать N-значную систему исчисления, по аналогии с шестнадцатиричной, где 10 = A, 11 = B и т.д., т.е. такую, где даже двузначное число есть один символ.
А вообще да, нужно описание самой задачи, а не выбранного метода её решения.

"Но тогда вопрос, массив каких чисел вот это: "9238"? 9, 2, 3 и 8? 92, 3 и 8? 9, 23 и 8? 92 и 38?"...
Хороший вопрос. Мне нужен массив чисел 9, 2, 3, которые можно будет заменить на 99 22 33.
Наверное лучше  "использовать всё таки нормальный массив", но идея "использовать N-значную систему исчисления, по аналогии с шестнадцатиричной, где 10 = A, 11 = B и т.д" очень интересная, но опять же переводить  в одну систему, потом в другую... Не хочется "заморачиваться". Я остановлюсь на массивах. 
Большое спасибо всем за разъяснение.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

1. Публиковать ссылки на вскрытые компоненты

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

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


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

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


 




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


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

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