Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Memo1->Lines и переменные 
:(
    Опции темы
mr.Anderson
Дата 2.8.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Задача такая: нужно найти в тексте, написанном в объекте TMemo с именем Memo1, все русские буквы и преобразовать их в цифры, равные порядковому номеру буквы в алфавите.
Я пробовал код:
Код

char str[]=Memo1->Lines.ToString();

А потом перебор через цикл for:
Код

int i=0;
for(i=0;i<=(strlen(str)-1);i++)
{
  if(str[i]=="в") str[i]="3";
}

Однако, выдается ошибка даже в первом фрагменте кода. Пишет вот это:
Цитата
[C++ Error] Unit1.cpp(23): E2294 Structure required on left side of . or .*

Я даже не знаю, что делать. Подскажите, как решить эту задачку?

P.S. Только желательно с объяснением каждой строчки кода, т.к. я еще начинающий.

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


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

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


λcat.lolcat
****


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

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



sim7
Ругается потому, что свойство Lines объекта TMemo возвращает указатель на TStrings. А метод у указателя на объект вызывается через "->", а не через ".". Впрочем, метода ToString у класса TStrings я тоже не заметил...
Дальше. Если допустить, что в str все-таки попала строка, то на такое сравнение:
str[i] = "в"
компилятор будет сильно ругаться, потому что слева char, а справа char*. Символы в Си заключаются в одинарные кавычки. Присваивание str[i] = "3" неверно по той же причине.

Код раскритиковал, а рабочий не приведу smile Потому что совершенно забыл, как работают операции над строками в билдере smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
codelord
Дата 2.8.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



Для примера забей в мемо
такой текст
Цитата

ё1234567890-=йцукенгшщзхъ\фывапролджэячсмитьбю.Ё!"№;%:?*()_+ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ


и вот где-то таким кодом получи код каждого символа в Memo
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int lines;
int string=0;
int digit;
for(lines=0;lines<Memo1->Lines->Count;lines++)
        {
        for(string=1;string<=Memo1->Lines->operator [](lines).Length();string++)
                {
                digit=Memo1->Lines->operator [](lines)[string];
                ListBox1->Items->Add(IntToStr(digit));
                }
        }
}
// Только не надо меня бить палками это пример :)

для этого на форме д.б. ListBox и Memo.

и
в том месте где проверка digit
вставляй свои if

хотя я бы советовал сохранять в файл, и там уже проводить свои операции
будет быстрее в десятки раз.






--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
mr.Anderson
Дата 3.8.2005, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Спасибо, попробую.


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

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


iOS Lead Developer
****


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

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



Не-а... smile Ругается на 8 строчку в вашем коде. Пишет:
Цитата
[C++ Error] Unit1.cpp(26) E2316 'operator[]' is a not a member of 'TStrings'

Что скажете?

Да, а как с файлом сделать?


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

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


iOS Lead Developer
****


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

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



Вот, решил сделать с файлами, как советовали.
Написал вот это:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2=new TForm2(this);
if(Form2->ShowModal()==mrCancel) return;
Form2->TextToCode->Lines->SaveToFile("data.txt"); //TextToCode - это новое имя Memo1
if(operationfile()!=0) MessageBox(NULL,"Все прошло успешно!","Сообщение",MB_OK|MB_ICONEXCLAMATION);
if(operationfile()==0) MessageBox(NULL,"Не было выполнено ни одного преобразования!","Сообщение",MB_OK|MB_ICONEXCLAMATION);
}

Это код в событии OnClick кнопки Button1.
А теперь надо в этом файле заменить все русские буквы на их порядковый номер, а затем переписать файл, записав в него измененный текст.
Но я никак не могу понять, как это сделать. Может, поможете? Я начал вот так:
Код

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
int operationfile(void)
{
FILE *fp;
if((fp=fopen("coder.txt","a+"))==NULL) return 0;
//Вот тут надо с файлом поработать, но как?
fclose(fp);
if(h!=0) return 1;
else return 0;
}

Что подскажете?

Это сообщение отредактировал(а) sim7 - 3.8.2005, 13:20


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

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



Цитата(sim7 @ 3.8.2005, 05:59)
Что скажете?

Видимо билдер у тебя не шестой, у меня идет, но не страшно, способ всеравно тормозной smile



Цитата(sim7 @ 3.8.2005, 05:59)
Да, а как с файлом сделать?


Для примера если вствишь скажем в обработчик кнопки вот такой код.... в Мемо должен быть какой нибудь текст.
Код

Memo1->Lines->SaveToFile("c:\\test.txt");
FILE *in, *out;
in=fopen("c:\\test.txt","rb");
out=fopen("c:\\new.txt","wb");
//int i=0;
int c=0;
while ((c=getc(in))!=EOF)
        {
        fprintf(out,"%c,%d \n",c,c);
        }
fclose(in);
fclose(out);

то в соответствующем new.txt, ты увидишь буквы находящиеся в твоем мемо
и коды соответственно им,
для того чтобы печатать просто цифры,
можно оставить

fprintf(out,"%d \n",c);

но пока это будут только таблица кодов,
для того чтобы тебе печатать твои, и нужны проверки перед выводом в файл, т.е. до fprintf.
например
if(c==223) c=33; //для 'Я' это в общем смотря какой ты хочешь дать код каждой букве?
есть таблица кодов, так тебе будет легче реализовать твою идею.
но можешь, с помощью примера выше сам определять код каждой буквы.
Ну надеюсь понял, т.е. 223 это буква Я согласно таблице кодов wind1251. а ты ей даешь 33(свой).
если таблицы кодов нет, возьми выше я давал, стандартный набор забей в мемо и этим обработчиком ты его получишь. Успехов.

Это сообщение отредактировал(а) codelord - 3.8.2005, 13:44


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Vyacheslav
Дата 3.8.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString text = Memo1->Lines->Text;
    for (char i = 'а'; i <= 'я'; i++) {
          text = AnsiReplaceText(text, AnsiString(i), AnsiString(int(i-'а')));
    }
    Memo1->Lines->Text = text;
}



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
codelord
Дата 3.8.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



Vyacheslav , я не критикую,
но попробуйте в свое мемо загрузить текст скажем в килобайт хотябы 500-600,.....
у себя я так и не дождался.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Vyacheslav
Дата 3.8.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Вы название темы видели?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 3.8.2005, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



codelord, хм... С двумя файлами? Я как-то и не догадался... Сейчас буду пробовать.
Билдер у меня действительно не шестой. Пятая версия. Да они не особо отличаются, я думаю...
Vyacheslav, ваш код тоже попробую, но только для того, чтобы в нем попытаться разобраться (что у меня вряд ли получится - можете свой код прокомментировать построчно?), постольку поскольку тормозная прога мне не нужна. Про название темы вы правы, но название о чем-либо не значит, что отвечающие должны давать код только для решения проблемы. Предлагаемый вами код должен быть еще и полезным, а не только "самым худшим вариантом из того, что я знаю". smile smile
В общем, сейчас пойду пробовать. Что получится, напишу.
Добавлено @ 17:02
Всегда меня кто-то опережает в ответе, да что такое. smile
codelord, мне нужно обрабатывать именно большие объемы текста. Поскольку реальная задача у меня вовсе не "перевод букв в цифры", а немного другая...

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


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

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



Видел smile , там вроде "можно предлагать тормозные способы" не написано.

шучу. smile

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




--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Vyacheslav
Дата 3.8.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Комментировать пять строчек? Ну Вы даете.

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // получаем содержимое Memo  в виде AnsiString
    // в принципе  здесь в text можно элементарно загрузить содержимое из файла 
    
    AnsiString text = Memo1->Lines->Text;
   
    // меняем в тексте все 'а' на 'a' - 'a' = 0
    // меняем в тексте все 'б' на  'б' - 'а' = 1
    // ...
    // меняем в тексте все 'я' на 'я' - 'а' = ...
    for (char i = 'а'; i <= 'я'; i++) {
          text = AnsiReplaceText(text, AnsiString(i), AnsiString(int(i-'а')));
    }
    // заменяем содержимое Memo модифицированным текстом
    Memo1->Lines->Text = text;
}






Добавлено @ 17:11
Насчет худшего варианта: я решил задачу в четыре строчки. Причем количество строчек не увеличится , если загрузку сделать из файла минуя Memo. Я не знаю, какие у Вас машины, но лаконичность кода одно из немаловажных факторов. Кстати, о птичках, другого реально работающего кода я здесь не вижу


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 3.8.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Ладно, проверю ваш код... Но сначала перепробую все остальное. smile
Написал вот такой код (по аналогии с кодом codelord'a):
Код

void operationfile(void)
{
FILE *in,*out;
if((in=fopen("oldtext.txt","r"))==NULL) MessageBox(NULL,"Ошибка открытия файла!","Сообщение",MB_ICONEXCLAMATION);
if((out=fopen("newtext.txt","w+"))==NULL) MessageBox(NULL,"Ошибка открытия второго файла!","Сообщение",MB_ICONEXCLAMATION);
int h=0;
char c;
while ((c=getc(in))!=EOF)
{
 if(c=='а') {c='1';fprintf(out,"%s",c);h++;}
 if(c=='3') {c='в';fprintf(out,"%s",c);h++;}
 if(c=='s') {c='20';fprintf(out,"%s",c);h++;}
}
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Сообщение",MB_ICONEXCLAMATION);
}

codelord, я у вас одной вещи не понял. Почему у вас переменная c, которой присваиваются символы, объявлена как int? В своем скрипте я это исправил, может, зря?
Проблема: у меня вообще не создается файл с новым текстом, несмотря на способ открытия "w+" (он подразумевает создание для чтения и записи). Просто не создается, и все. И никаких действий, разумеется, программа с ним не делает. Однако, и предупреждений не выдает... В чем ошибка?


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

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



Цитата(sim7 @ 3.8.2005, 17:30)
сodelord, я у вас одной вещи не понял. Почему у вас переменная c, которой присваиваются символы, объявлена как int?
я это сделал вместо компилятора, он это все равно делает сам.

Код

if(c=='s') {c='20';fprintf(out,"%s",c);h++;}

так писать нельзя, во первых что такое с='20'
с-это у тебя char а '20' это неизвестно что,
если ты хотел приравнять к 20 то так и пиши c=20,
а если ты хотел приравнять к строке "20", то это невозможно она в него не влезет.

второе fprintf(out,"%s",c) невозоможно потому как
c - у тебя символ поэтому надо писать %c. а не %s.
поэтому учитывая вышесказанное приводим твой код:

Код

void operationfile(void)    
{
FILE *in,*out;
if((in=fopen("oldtext.txt","rb"))==NULL) MessageBox(NULL,"Ошибка открытия файла!","Сообщение",MB_ICONEXCLAMATION);
if((out=fopen("newtext.txt","w+"))==NULL) MessageBox(NULL,"Ошибка открытия второго файла!","Сообщение",MB_ICONEXCLAMATION);
int h=0;
int c;
while ((c=getc(in))!=EOF)
{
 if(c=='а') {c='1';fprintf(out,"%c",c);h++;}
 if(c=='3') {c='в';fprintf(out,"%c",c);h++;}
 if(c=='s') {c=20 ;fprintf(out,"%c",c);h++;}
}
fclose(in);
fclose(out);
if(h==0) MessageBox(NULL,"Не было преобразований!","Сообщение",MB_ICONEXCLAMATION);
}

извиняюсь за каракули.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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