Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2014, 02:30   #1
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию Редактирование значений в Memo

Пытаюсь по заданию отредактировать текст в Memo, который содержит любые символы, в том числе и цифры. Удаляю все кроме цифр. Дальше мне нужно перемножить все эти оставшиеся цифры. Для этого (решил, что удобнее в Memo умножать по строкам) вывожу все полученные цифры в столбик (по линиям Memo). Тут у меня вылетает ошибка, но все равно в Memo все заносится как нужно. А вот дальше никак. Вот код:
PHP код:
void __fastcall TForm2::Button1Click(TObject *Sender) {
    
// удаление букв
    
int i;
    
String ok "123456789\n\r"// Эти остаются, '0' удаляю тоже
    
String s Memo1->Text;

    for (
int i s.Length(); 0i--)
        if (!
ok.Pos(s[i]))
            
s.Delete(i1);
    
Memo2->Text s;

    
// удаление переносов (запись в одну строку)
    
Memo2->Text StringReplace(Memo2->Text"\r\n""",
        
TReplaceFlags() << rfReplaceAll);

    
// разнести каждый символ на новую строку
    
AnsiString text;
    
text Memo2->Text;
    
int l text.Length();
    
Memo2->Clear();
    for (
12i++)
        
Memo2->Lines->Add(text[i]);

          
int temp 1;
        
// вот тут вообще не получается :(
    // перемножение строк в цикле
    // for (i = 0; i < Memo2->Lines->Count; i++) {
    // temp= temp*StrToInt(Memo2->Lines->Strings[i]);
    // }
    // Memo2->Clear();
    // Memo2->Lines->Add(IntToStr(temp));


Oleg34 вне форума Ответить с цитированием
Старый 17.01.2014, 08:25   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в мемо строки нумеруются от нуля, поэтому последняя строка имеет индекс Memo2->Lines->Count - 1:


Код:
for (i = 0; i < Memo2->Lines->Count-1; i++) {


весь ваш остальной алгоритм не смотрел, не исключаю, что там ужас-ужас...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.01.2014, 08:42   #3
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

1) Memo2->WordWrap = false; // чтобы переносы строк не появлялись при вставке текста
2) int temp = 1; // диапазон возможных значений типа int: -2147483648..2147483647
Что бы еще такого сделать, чтобы ничего не делать?
DpolenST вне форума Ответить с цитированием
Старый 17.01.2014, 09:49   #4
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
в мемо строки нумеруются от нуля, поэтому последняя строка имеет индекс Memo2->Lines->Count - 1:


Код:
for (i = 0; i < Memo2->Lines->Count-1; i++) {


весь ваш остальной алгоритм не смотрел, не исключаю, что там ужас-ужас...
Я знаю, что с нуля. Но в строке нумерация с единицы. А у меня идет перебор индексов именно по строке которая в переменной text. Сейчас не вываливается в этом куске. Поздно ночью делал. И l у меня была l+2. А нужно, что бы l+1. А вот если выводить в Memo с нулевого индекса, то есть:
PHP код:
for (int i 1l+i++)
        
Memo2->Lines->Add(text[i-1]);//сейчас с '0' и сразу беда 
То сразу вываливается в ошибку.
Oleg34 вне форума Ответить с цитированием
Старый 17.01.2014, 09:56   #5
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от DpolenST Посмотреть сообщение
1) Memo2->WordWrap = false; // чтобы переносы строк не появлялись при вставке текста
2) int temp = 1; // диапазон возможных значений типа int: -2147483648..2147483647
1) Memo2->WordWrap = false; // чтобы переносы строк не появлялись при вставке текста. Вот об этом не знал! Спасибо! А вот, что Вы хотели сказать про диапазон возможных значений типа int: -2147483648..2147483647 я не понял. Сейчас не вываливается в ошибку. Не учел, что счетчик в цикле нужно задавать так
PHP код:
Memo2->Lines->Count-1
Но все равно результат не верный. На калькуляторе перемножил .
Oleg34 вне форума Ответить с цитированием
Старый 17.01.2014, 09:59   #6
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Oleg34 Посмотреть сообщение
А вот, что Вы хотели сказать про [I]диапазон возможных значений типа int: -2147483648..2147483647
то что при перемножении вы можете выйти за этот диапазон, и что у вас при этом получится в ответе никто не предскажет)
Что бы еще такого сделать, чтобы ничего не делать?
DpolenST вне форума Ответить с цитированием
Старый 17.01.2014, 10:06   #7
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от DpolenST Посмотреть сообщение
то что при перемножении вы можете выйти за этот диапазон, и что у вас при этом получится в ответе никто не предскажет)
Понял! Не учел! А все таки, почему неправильно перемножает? Вроде по логике нормально?
Oleg34 вне форума Ответить с цитированием
Старый 17.01.2014, 10:23   #8
Oleg34
Пользователь
 
Регистрация: 09.09.2011
Сообщений: 48
По умолчанию

Посмотрел в отладчике, выяснилось, что не хватает одного цикла. Заменил на это:
PHP код:
for (int i 1Memo2->Lines->Counti++) 
сейчас правильно перемножает. Хотя тут то, как раз идет счет строкам в Memo и по логике надо начинать с i=0 и до i < Memo2->Lines->Count-1. Непонятно.
Oleg34 вне форума Ответить с цитированием
Старый 17.01.2014, 10:25   #9
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString s = Memo1->Text;
 AnsiString filt = "23456789";
 int temp = 1;
 for (int i = 1; i <= s.Length(); i++)
   if (filt.Pos(s[i])) temp = temp*StrToInt(s[i]);
 Memo2->Clear();
 Memo2->Lines->Add(IntToStr(temp));
}
Что бы еще такого сделать, чтобы ничего не делать?
DpolenST вне форума Ответить с цитированием
Старый 17.01.2014, 10:38   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

DpolenST, вот! точно!

я бы лично, если бы умел программить на C, написал бы примерно так:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString s = Memo1->Text;
 int temp = 1;
 for (int i = 1; i <= s.Length(); i++)
   if (s[i]>'1'  && s[i]<='9') temp = temp*StrToInt(s[i]);
 Memo2->Text = IntToStr(temp);
}
но это просто как один из вариантов решения....
ваш вариант вполне адекватный и рабочий!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi.Чтение файла в Memo, вычисление, добавление строк в Memo antonio_sk Помощь студентам 0 26.04.2013 18:01
Перенос значений из ListBox в Memo через разделитель artemavd Общие вопросы Delphi 4 23.12.2011 17:00
Редактирование значений в памяти других программ logitech12 Общие вопросы Delphi 15 07.05.2011 09:53
редактирование значений. regfre Общие вопросы C/C++ 1 08.11.2009 14:54
В Memo сделать так, чтобы текст был разного цвета, разноцветный memo Artem Компоненты Delphi 3 07.09.2007 13:40