| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Помогите с циклом |
| Автор: DedMazai 6.7.2009, 01:19 | ||
| Вечер добрый ) Не могли бы вы подсказать как сделать, чтобы цикл:
читал только чётные строки, и как сделать, чтобы он подсчитал в них кол-во символов? |
| Автор: triclosan 6.7.2009, 01:40 | ||
TStringList это точно не по стандарту си++, вы видимо разделом ошиблись
|
| Автор: triclosan 6.7.2009, 01:52 |
это у вас борланд видимо. Покажите определение класса TStringList поясните |
| Автор: Данкинг 6.7.2009, 01:53 | ||
| DedMazai, это по стандарту билдера. http://forum.vingrad.ru/index.php?showtopic=265681&view=findpost&p=1914151 Text.Length() ? Добавлено через 1 минуту и 37 секунд
|
| Автор: DedMazai 6.7.2009, 02:04 | ||
Данный цикл, сейчас проверяет в подключённом файле, наличие цифр. Мне надо тоже самое, только чтобы делал он это в чётных строках. и считал сколько в них символов. Добавлено через 3 минуты и 50 секунд
хах, собственно тема не похожая, а таже Правда он отправился спать, а я вот продолжаю работу над практикой )) |
| Автор: mrbrooks 6.7.2009, 08:16 | ||
ты не читаешь строки - ты все залил в одну строку и ее парсишь (причем не по людски). Внимательно почитай справку по данному классу. |
| Автор: DedMazai 9.7.2009, 20:36 |
| спасибо, нашёл другой способ реализации задания |
| Автор: hsilgos 9.7.2009, 20:52 | ||||
Так быстрее:
|
| Автор: zim22 9.7.2009, 21:40 |
и не понятней для "непосвященных" |
| Автор: GoldFinch 9.7.2009, 21:44 |
| zim22, если ты не понимаешь математику, это твои проблемы |
| Автор: zim22 9.7.2009, 22:04 | ||||
не соглашусь. код должен быть написан как можно понятней. кому как понятней - это уже другой вопрос. все нюансы оформления кода должны быть записаны в "стандартах кодирования". это один из этих случаев. в противном случае программисты будут проверять чётность двадцатью-пятью способами и это затруднит понимание/сопровождение кода. способ 1:
... способ 25:
|
| Автор: GoldFinch 9.7.2009, 23:26 |
| zim22, ты написал бред есть два типа людей, те которые понимают системы счисления, и те которые их не понимают. в данном случае надо было получить четность числа. известно что у числа в двоичном представлении младший разряд определяет его четность соответственно наложение маски выделяющей младший разряд числа позволяет получить число кодирующее четность исходного числа, 0 для нечетных и 1 для четных также известно что оператор if в С\С++ сравнивает численное значение предиката в скобках с нулем, значит достаточно написать ( i&1 ) для программиста это естественный и логичный путь программист не знающий систем счисления конечно тоже программист, но еще его называют быдлокодером конечно тут можно извинить программистов-самоучек не имеющих технического образования, но нормальный программист должен это знать. Добавлено через 53 секунды и да, наложение маски само собой быстрее деления |
| Автор: mes 9.7.2009, 23:56 | ||||
А Вы уверены, что в результативном (асм) коде будет деление, а не наложение маски ?
Да но с лету применять двоичные операции (сейчас уже) большому кругу ЯВУ-программистов не требуется. ага, особенно питоновцам и тому подобным
при условии, что это проходят (а не просто пробегают) по образовательной программе. |
| Автор: Данкинг 10.7.2009, 00:04 | ||||||
Ну так я то же самое ведь написал. |
| Автор: GoldFinch 10.7.2009, 00:21 |
ну их, такие книжки |
| Автор: zim22 10.7.2009, 07:50 | ||
слушаю и повинуюсь. ваши слова для меня - истина в последней инстанции. ну почему же, хорошие книжки. например эта: "http://www.ozon.ru/context/detail/id/1458852/. это ж так просто, возьмём к примеру функцию подсчета единичных битов из этой книги: (стр.78)
тру хакеры должны писать только так, я вас понял. |
| Автор: GoldFinch 10.7.2009, 14:24 |
| zim22, ниче что получить младший разряд числа, и посчитать число ненулевых разрядов в числе - это разные задачи? |
| Автор: zim22 10.7.2009, 15:17 | ||
ниче. т.к. в обоих случаях существуют более наглядные варианты решений. |
| Автор: mes 10.7.2009, 15:21 | ||
кстати вариант %2 тоже не очень наглядный, гораздо лучше, имхо, завести функцию типа bool isOdd() P.S. (в частности для GoldFinch) слово "наглядно" в моем употреблении значит, не чтоб было понятно другим программистам (для них можно и комментарий поставить если требуется), а то что код легко подается модификации и сопровождению. P.S.S. естественно замечание насчет наглядности не относится к "100-строчным" программам. |
| Автор: DedMazai 10.7.2009, 23:07 | ||
| Блин, ### вы тут развели Вопрос. Почему в
у меня всегда насчитывает на 3 символа больше, чем у меня есть в файле? |
| Автор: hsilgos 10.7.2009, 23:24 | ||||||||||
"Непосвященных" в проект не берем.
А что питоновцу делать в коде на С++ ? О_о
То же самое - по логике. Но не каждый оптимизатор оптимизирует это до "наложения маски".
Это серъезная оптимизация, может применяться в особо чувствительных к производительности местах. К тому же её можно оформить как inline функцию и использовать в любом месте. И "тру хакеры" тут нипричем. |
| Автор: mes 10.7.2009, 23:36 | ||
Этой фразой я хотел подчеркнуть что не каждому программисту нужно знание двоичной системы, а так как Cpp позволяет программить как и на Си-уровне, так и на более высоком уровне, то есть очень большой ряд Cpp-программистов, сродных по целям задач к питоновцам, т.е тем кому низкоуровневые знания нужны лишь как общая теория, и не находят применения на практике. Добавлено через 3 минуты и 30 секунд ага, и уже в ней спокойно, если вдруг компилятор не справится ( Добавлено через 5 минут и 3 секунды
И что это за символы ? приведите пример что в файле, и что считывается. |
| Автор: DedMazai 10.7.2009, 23:49 |
| например "otvet" он выдаёт, что в файле не 5 символов, а 8... |
| Автор: mes 10.7.2009, 23:56 |
| Хотелось бы добавить, что именно операция &1 в принципе сама по себе не очень сложная и действительно трудно поверить, что программисту она может представлять трудность, однако такой подход это шаг в сторону низко-уровнего программирования, и хотя этот шаг безболезненный, но как говорится "где шаг, там и два" - то легко переусердствовать на мнимой оптимизации, затруднив этим его поддержку. P.S. для ассемблерщиков использование &1 в крови, и ot %2 их естественно подташнивает поначалу, пока не поймут, что оптимизатор справится не хуже. (говорю на собственном опыте хотя и не ассемблерщик - привычка пришла из прошлой жизни (ну а если опция оптимизации не включена, значит проект и не нуждается в оптимизации ) Вообщем вот такое имхо. Добавлено @ 23:58 перевод строки уже два символа ("\r\n") и вероятно есть пробел еще. Для проверки выведите два раза считанную строку, все что будет между ними и есть Ваши символы. |
| Автор: hsilgos 11.7.2009, 01:32 | ||
Ну, с этим я согласен. Низкоуровневую реализацию нужно оборачивать. Да и вообще, я сторонник того, чтобы на компилятор возлагать "рутинную" работу. Но и явную пессимизацию я не делаю. Добавлено через 1 минуту и 36 секунд DedMazai, Случайно кодировка в файле не utf-8 ? |
| Автор: DedMazai 11.7.2009, 11:43 | ||||||
Нет, не utf-8
Не совсем разобрался, что мне сделать надо
Возможно ли записать чтение этой строки так? При этом всёравно на 1 символ больше выводит.. |
| Автор: GoldFinch 11.7.2009, 12:18 |
| операция И - это не низкоуровневая реализация, а обычная математика =\ |
| Автор: mes 11.7.2009, 13:43 | ||
не обычная, а двоичная . Я считаю, что если операции проводятся над двоичными или шестандцатиричными числами, то вполне уместно использовать двоичные операции, так как они накладываются без изменения логики. А вот для десятиричной системы лучше использовать десятиричные операции. Как я уже говорил выше операция &1 "случайно"по логике подходит для 10ричной сс. Но если чуть развернуть задание, например надо вначале вывести все четные числа, потом кратные трем, потом 4м - то сразу видно что &1 будет выглядеть обособлено. А зачем лишний раз тратить свое внимание на то, что может сделать компилятор ? Добавлено @ 13:49 тут тоже в 28 строке обычная математика: http://forum.vingrad.ru/index.php?showtopic=265949&view=findpost&p=1916322 ну как, с ходу понятно, какое условие зашифровано в этой строке ? однако мне совесть не позволила оставить такой подход и пришлось написать по нормальному : http://forum.vingrad.ru/index.php?showtopic=265949&view=findpost&p=1916495 логика работы примера стала более свободная и понятная, а операции деления в случае возможной замены на битовые операции компилятор сделает сам. Я думаю этот пример как раз показывает преимущества второго подхода над первым. |
| Автор: mes 11.7.2009, 15:31 |
Для начала проверить файл на отсутствие в нем лишних символов, таких как пробел или перевод строки. можно посмотреть его реальный размер и убедиться, что файл со строчкой otvet занимает 5 байт. Вот тут Вы получили длину строки, а потом зачем то инкрементируете это значение. зачем ? покажите полностью участок кода по подсчету длины считанной последовательности. |
| Автор: DedMazai 11.7.2009, 16:38 | ||||
Блин, действительно, глупость сделал
|
| Автор: mes 11.7.2009, 17:11 |
| в файле содержится слово "otvet" из 5 букв ? размер файла 5 байт ? переменная i после приведенного выше кода содержит 8 ? при двойном выводе на экран печатает "otvetotvet" ? так ? |
| Автор: DedMazai 11.7.2009, 17:29 |
| Нет, приведённый выше код работает правильно ) |
| Автор: mes 11.7.2009, 17:42 |
тогда в чем вопрос ?! Добавлено @ 17:45 а понял.. Виной всему то Ваше ++i ?! Добавлено через 4 минуты и 8 секунд не забудьте тогда тему как решенную пометить |
| Автор: DedMazai 11.7.2009, 17:50 |
да, да именно оно А может пока ненадо, вдруг ещё вопросы будут ^^ чтоб тему новую не создавать )) |
| Автор: mes 11.7.2009, 17:57 | ||
Лучше новую создайте, во первых по правилам один вопрос - одна тема, во вторых тут очень много флуда. Всем будет проще в новой, вместо того чтоб разбираться в этой, что и к чему относится. Кстати просьба, при следующем вопросе не надо партизанить, как в этой теме. Старайтесь описать проблему, так чтоб не приходилось собирать обрывки по теме. |
| Автор: DedMazai 11.7.2009, 18:06 |
| ... Добавлено через 4 минуты и 16 секунд спасибо всем ) |