| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Memo1->Lines и переменные |
| Автор: mr.Anderson 2.8.2005, 16:16 | ||||||
| Задача такая: нужно найти в тексте, написанном в объекте TMemo с именем Memo1, все русские буквы и преобразовать их в цифры, равные порядковому номеру буквы в алфавите. Я пробовал код:
А потом перебор через цикл for:
Однако, выдается ошибка даже в первом фрагменте кода. Пишет вот это:
Я даже не знаю, что делать. Подскажите, как решить эту задачку? P.S. Только желательно с объяснением каждой строчки кода, т.к. я еще начинающий. |
| Автор: Void 2.8.2005, 21:01 |
| sim7 Ругается потому, что свойство Lines объекта TMemo возвращает указатель на TStrings. А метод у указателя на объект вызывается через "->", а не через ".". Впрочем, метода ToString у класса TStrings я тоже не заметил... Дальше. Если допустить, что в str все-таки попала строка, то на такое сравнение: str[i] = "в" компилятор будет сильно ругаться, потому что слева char, а справа char*. Символы в Си заключаются в одинарные кавычки. Присваивание str[i] = "3" неверно по той же причине. Код раскритиковал, а рабочий не приведу |
| Автор: codelord 2.8.2005, 21:02 | ||||
| Для примера забей в мемо такой текст
и вот где-то таким кодом получи код каждого символа в Memo
для этого на форме д.б. ListBox и Memo. и в том месте где проверка digit вставляй свои if хотя я бы советовал сохранять в файл, и там уже проводить свои операции будет быстрее в десятки раз. |
| Автор: mr.Anderson 3.8.2005, 05:37 |
| Спасибо, попробую. |
| Автор: mr.Anderson 3.8.2005, 05:59 | ||
Не-а...
Что скажете? Да, а как с файлом сделать? |
| Автор: mr.Anderson 3.8.2005, 13:19 | ||||
| Вот, решил сделать с файлами, как советовали. Написал вот это:
Это код в событии OnClick кнопки Button1. А теперь надо в этом файле заменить все русские буквы на их порядковый номер, а затем переписать файл, записав в него измененный текст. Но я никак не могу понять, как это сделать. Может, поможете? Я начал вот так:
Что подскажете? |
| Автор: codelord 3.8.2005, 13:41 | ||||||
Видимо билдер у тебя не шестой, у меня идет, но не страшно, способ всеравно тормозной
Для примера если вствишь скажем в обработчик кнопки вот такой код.... в Мемо должен быть какой нибудь текст.
то в соответствующем new.txt, ты увидишь буквы находящиеся в твоем мемо и коды соответственно им, для того чтобы печатать просто цифры, можно оставить fprintf(out,"%d \n",c); но пока это будут только таблица кодов, для того чтобы тебе печатать твои, и нужны проверки перед выводом в файл, т.е. до fprintf. например if(c==223) c=33; //для 'Я' это в общем смотря какой ты хочешь дать код каждой букве? есть таблица кодов, так тебе будет легче реализовать твою идею. но можешь, с помощью примера выше сам определять код каждой буквы. Ну надеюсь понял, т.е. 223 это буква Я согласно таблице кодов wind1251. а ты ей даешь 33(свой). если таблицы кодов нет, возьми выше я давал, стандартный набор забей в мемо и этим обработчиком ты его получишь. Успехов. |
| Автор: Vyacheslav 3.8.2005, 13:51 | ||
|
| Автор: codelord 3.8.2005, 15:27 |
| Vyacheslav , я не критикую, но попробуйте в свое мемо загрузить текст скажем в килобайт хотябы 500-600,..... у себя я так и не дождался. |
| Автор: Vyacheslav 3.8.2005, 16:10 |
| Вы название темы видели? |
| Автор: mr.Anderson 3.8.2005, 16:53 |
| codelord, хм... С двумя файлами? Я как-то и не догадался... Сейчас буду пробовать. Билдер у меня действительно не шестой. Пятая версия. Да они не особо отличаются, я думаю... Vyacheslav, ваш код тоже попробую, но только для того, чтобы в нем попытаться разобраться (что у меня вряд ли получится - можете свой код прокомментировать построчно?), постольку поскольку тормозная прога мне не нужна. Про название темы вы правы, но название о чем-либо не значит, что отвечающие должны давать код только для решения проблемы. Предлагаемый вами код должен быть еще и полезным, а не только "самым худшим вариантом из того, что я знаю". В общем, сейчас пойду пробовать. Что получится, напишу. Добавлено @ 17:02 Всегда меня кто-то опережает в ответе, да что такое. codelord, мне нужно обрабатывать именно большие объемы текста. Поскольку реальная задача у меня вовсе не "перевод букв в цифры", а немного другая... |
| Автор: codelord 3.8.2005, 16:53 |
| Видел шучу. Vyacheslav очень умный способ, я и не знал, что так можно, но это долго для большого текста, хотя может автору это и не нужно. |
| Автор: Vyacheslav 3.8.2005, 17:04 | ||
Комментировать пять строчек? Ну Вы даете.
Добавлено @ 17:11 Насчет худшего варианта: я решил задачу в четыре строчки. Причем количество строчек не увеличится , если загрузку сделать из файла минуя Memo. Я не знаю, какие у Вас машины, но лаконичность кода одно из немаловажных факторов. Кстати, о птичках, другого реально работающего кода я здесь не вижу |
| Автор: mr.Anderson 3.8.2005, 17:30 | ||
| Ладно, проверю ваш код... Но сначала перепробую все остальное. Написал вот такой код (по аналогии с кодом codelord'a):
codelord, я у вас одной вещи не понял. Почему у вас переменная c, которой присваиваются символы, объявлена как int? В своем скрипте я это исправил, может, зря? Проблема: у меня вообще не создается файл с новым текстом, несмотря на способ открытия "w+" (он подразумевает создание для чтения и записи). Просто не создается, и все. И никаких действий, разумеется, программа с ним не делает. Однако, и предупреждений не выдает... В чем ошибка? |
| Автор: codelord 3.8.2005, 17:57 | ||||||
так писать нельзя, во первых что такое с='20' с-это у тебя char а '20' это неизвестно что, если ты хотел приравнять к 20 то так и пиши c=20, а если ты хотел приравнять к строке "20", то это невозможно она в него не влезет. второе fprintf(out,"%s",c) невозоможно потому как c - у тебя символ поэтому надо писать %c. а не %s. поэтому учитывая вышесказанное приводим твой код:
извиняюсь за каракули. |
| Автор: Vyacheslav 3.8.2005, 18:01 | ||
Не угадал. С фаловым чтением-записью на три строчки все же поболее вышло
|
| Автор: mr.Anderson 3.8.2005, 18:08 |
| codelord, я уже говорил об этом. У меня просто не создается файл newtext.txt! Почему он не создается? И c вашим кодом тоже не создается! |
| Автор: codelord 3.8.2005, 18:47 |
| sim7, мне трудно ответить на твой вопрос, у меня все создается. Могу лишь посоветовать указать точное место файла например "c:\\newtext.txt", у меня как-то было такое, что программа создавала файлы не в своем каталоге. |
| Автор: mr.Anderson 3.8.2005, 19:31 | ||
| Да что такое! Не могу понять! Код-то верный, чего этому компайлеру еще надо! codelord, посмотрите, может, я чего не так списал:
Явное указание пути, по вашему совету, ни к чему не приводит. Файл упорно не создается. Но, что самое интересное, даже если я вручную создам этот файл (до запуска программы), а способ открытия сменю на "w", с файлом все равно ничего не происходит! То есть, никаких изменений в него не записывается, и нового текста там тоже нет! Прога просто его "не видит"! Что за напасть?! |
| Автор: codelord 3.8.2005, 19:43 |
| sim7 А первый мой вариант с файлами работает? |
| Автор: mr.Anderson 3.8.2005, 20:16 |
| Нет, второй файл упорно не создается... Может, какой файл заголовочный надо подключить? Может, просто функции вызова файла не работают? |
| Автор: mr.Anderson 3.8.2005, 20:40 | ||
| Ой, не могу! А суть была вот в чем: функцию работы с файлом я написал (кстати, вот еще раз ее код):
Ну, функцию-то написал. А вызвать ее забыл! Но проблема работы с файлом остается актуальной. Вместо преобразованного текста в новом файле отображаются только квадратики... По крайней мере, через просмотр "Блокнотом". В принципе, и через Word, скорее всего, то ж самое будет. Почему это может быть? Может, из-за присутствия русских букв? Но мне крайне надо, чтобы русские буквы были преобразованы... Добавлено @ 20:44 Да, сейчас только что проверил - русские буквы не преобразовываются. В Word они просто не отображаются (т.е. они преобразованы, но их не видно...), а в Блокноте квадратики вместо символов. Как сделать, чтобы прога понимала кириллицу? Я так понимаю, надо локаль настроить, но как? Я о понятии "локаль" знаю из PHP, а в С++ я с ней вообще никогда не сталкивался. Прошу помочь! |
| Автор: codelord 3.8.2005, 22:53 | ||
| Ладно написал сам, в общем как я понял тебе вместо русских букв нужны их порядковые номера в русском алфавите, только вот про большие и маленькие буквы ты ничего не сказал, ниже код, делает, то, что тебе надо, причем специально я сдал так, что на большую и маленькую букву будет показываться одна и таже цифра т.е а или А будет 1., сделал символы через зяпятую иначе, не видно смысла.
кодировка win1251. проверки на NULL думаю сам добавишь. |
| Автор: codelord 3.8.2005, 23:03 |
| Vyacheslav Ради интереса сравни быстродействие со своим кодом. |
| Автор: mr.Anderson 4.8.2005, 10:11 |
| codelord, а по какому принципу вы все это делали? |
| Автор: codelord 4.8.2005, 10:24 |
| Добавлено @ 10:29 sim7, что из русского алфавита тебе еще нужно?. Не понял почему не весь. там должно быть ровненько 66 букв. А по какому принципу, советую перечитать предыдущие посты, я раньше это уже объяснял, с буквой Я. это сделано согласно кодировке win1251. Что именно не понятно?. |
| Автор: codelord 4.8.2005, 10:49 | ||||
| Ладно давай еще разок, есть строка
в ней компилятору объясняется если с>=192(код буквы А) и c<=197(код буквы Е) то вычитаем 191 получаем соответственно 1,2,3,4,5,6 буквы. дальше в кодировке идет не Ё а Ж поэтому дальше уже вычитаем 190. т.е а Ё проверим отдельно в строке
а дальше то же самое делаем с маленькими буквами. смотри прикрепленный файл, это соответствие кодов, русским др. символам, думаю все поймешь. |
| Автор: Vyacheslav 4.8.2005, 11:17 | ||||
Добавлено @ 11:19
Ну что будем по быстродействию и по лаконичности сравнивать? |
| Автор: mr.Anderson 4.8.2005, 11:39 |
| Для меня бы лучше по быстродействию. Добавлено @ 11:44 codelord, ваш файл не скачивается. Ни браузером, ни флэшгетом. Вместо него качается "index.php", в котором ничегошеньки нетуть... |
| Автор: codelord 4.8.2005, 11:51 | ||
будем ваш последний код будет работать не правильно, где ваши буквы ё,Ё ?. и поэтой причине порядок будет нарушен т.е Ж=8 а у вас она скорей всего будет 6. а с маленькими буквами совсем беда(но тут автор умолчал.). Добавлено @ 11:52 sim7 попробуй скачачть еще раз. !!! |
| Автор: Vyacheslav 4.8.2005, 12:11 |
| Вы часто видели последний раз букву Ё ё. А маленкие просто отсчитываются по порядку. Остается отметить, что предложенный Вам к С++ отношения не имеет (это чистый С) А использование continue в блоке if-else выглядит весьма любопытно :масло-масленное |
| Автор: codelord 4.8.2005, 12:49 | ||
Ладушки, я решил все-таки протестировать (свой и свой Каждая функция вызывалась 20 раз. 48:14:927-48:24:821 (9 sec, 894 msec ) с continue 48:24:821-48:35:26 (10 sec 493 msec) без continue вот и масло-масляное, и это логично. забыл написать текст размером 572 кб. |
| Автор: Vyacheslav 4.8.2005, 13:28 | ||
| Ну все приходится разъяснять Нет смысла использовать одновременно continue и else. Тогда уж
|
| Автор: mr.Anderson 4.8.2005, 13:37 |
| codelord, файл скачался, только в нем одни квадратики. И Word его тож квадратиками показывает. |
| Автор: codelord 4.8.2005, 13:42 | ||||||
| Vyacheslav интересно чем ты объяснишь бoльшее быстродействие?? на мой взгляд continue отправляет компилятор считывать следующий символ а не заглядвать - что же идет после блока if-else if. и только после этого отправляться туда, куда я его отправляю раньше. Чем же объяснишь это ты?
опять таки на мой взгляд есть. Тем не менее хочу услышать ответ, откуда взялось лишее быстродействие? Добавлено @ 13:47
там не могут быть одни квадратики, там все сиволы от 0 до 255, какие -то невидимые символы вот они и квадратики и пустоты, но там еще есть русские буквы и английские буквы и символы и т.д. ты скролом то вниз поработай или создай сам вот таким кодом.
|
| Автор: codelord 4.8.2005, 14:14 | ||
| Vyacheslav Оказался Вы Оказались Правы конструкция ниже, оказалась на 16% быстрее нежели первый вариант.
|
| Автор: codelord 4.8.2005, 15:22 | ||
ты бы нормальными редакторами пользовался таким. http://www.astonshell.ru/bred3/ файл я переделал (если тебе он еще нужен )адаптировав его под блокнот: |
| Автор: codelord 4.8.2005, 19:52 |
| sim7 ты бы ответил ради приличия У тебя там все нормально?. |
| Автор: Void 4.8.2005, 21:13 | ||
Есть способ определить, является ли буква символом кириллицы и не закладываясь на магические числа и определенную кодировку - с помощью локалей C++.
А вот определить однозначно порядковый номер буквы в алфавите так просто уже не получится. Локаль можно использовать как функтор для сравнения строк => следовательно можно отсортировать символы в алфавитном порядке. Однако я проверил на VC 7.1 и оказалось, что в полученное таким образом множество попадают специфические символы с закорючками из славянских алфавитов. Да, и ни слова про быстродействие! Premature optimization is root of сами_знаете_что |
| Автор: mr.Anderson 5.8.2005, 16:36 |
| codelord, да нет, не все в порядке. В смысле, ваш-то файл в норме, а вот моя прога - нет. void, ого-го, вот это код. |
| Автор: codelord 5.8.2005, 17:40 | ||
sim7 это как??. Код который я дал все ведь делает!!!. В чем то проблема, он у тебя работает?. Только что попробовал, ни одной русской буквы в преобразованном тексте я не нашел. Все ведь уже сделал |
| Автор: codelord 5.8.2005, 17:54 |
| Показывай как ты используешь код. |
| Автор: mr.Anderson 5.8.2005, 18:19 |
| Один момент. Я его тут случаем стер... Глюки у меня одни с этим кодом. |
| Автор: mr.Anderson 6.8.2005, 18:44 | ||
Вот код (ваш):
Пишет ошибку в линии 25. К слову, раз уж в тексте используется MessageBox, какие значения кроме MB_ICONEXCLAMATION могут быть? |
| Автор: codelord 6.8.2005, 19:27 | ||||||||
если ты изменил хотя бы одну строку, так писать нельзя. кто же так пишет:
h++ никогда не сработает!!! поэтому поменяй местами continue и h++, Кстати даже при том, что ты напутал, код у меня текст всеравно преобразует, только пишет ноль преобразований
на будущее ошибку тоже надо описывать, я же не Экстрасенс |
| Автор: mr.Anderson 7.8.2005, 11:35 | ||
Это я потом подредактировал сообщение, а эту строчку исправить забыл. Ежу ясно, что код не ваш в данном случае. Все равно странно. У меня работает "выборочно". Может, это билдер виноват? Он у меня постоянно какие-то ошибки пишет. То при открытии самого билдера, то при открытии проектов... Когда есть ошибки, когда нет. Глючный, зараза. Может, поэтому проблемы? |
| Автор: codelord 8.8.2005, 05:08 | ||
раз так конечно поставь шестой, тем более есть повод в подтверждение работоспособности кода цепляю кусочек кникги K&R Это классическая книга по Языку С.аторов Kernighan Brian W. and Ritchie Dennis M., |
| Автор: mr.Anderson 8.8.2005, 16:05 |
| Поставил шестой. Но код пока не проверял. Глюков в нем, правда, и впрямь меньше. А что это за файл, так и не понял? Перевод текста из книги, что ль? |