БлогNot. Блог ПерСа

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

qt c++ программирование список studio учебное памятка php mathcad математика ошибка сказка россия политика время javascript css html язык алгоритм random безопасность ретро шахматы числа реклама личное люди быт маразм игра православие форматы картинка статистика словарь графика браузеры юмор блог анекдот книги эзотерика цензура философия сервис аббревиатура email english дата все теги все комментарии


[1-15] [16-30] ... [1681-1695] [1696-1703]


Прикреплённое сообщение, правила и всё такое

Остеклить балкон, лоджию в Новосибирске? Проверено, Вам сюда

Encoding: Windows-1251 (Russian). Если картинки выключены: Поиск ::: Статистика ::: Помощь ::: E-mail ::: RSS ::: Nickolay.info

Для полноценной работы блога нужны картинки + JavaScript + Cookies. Ссылки, открывающие новое окно (вкладку), подсвечены.

Даже по законам Эрефии этот блог не является СМИ, все сообщения выражают личную точку зрения автора блога и являются оценочными суждениями, при этом любые совпадения мест, имён, названий и действующих лиц далеко не случайны. В блоге нет файлов, способных нанести вред Вашему компьютеру или мобильному устройству. Если Вам не исполнилось 18+, срочно отвалите отсюда, прикиньтесь ветошью и не отсвечивайте покиньте этот блог. Учтите, что читая этот блог, Вы вторгаетесь на мою личную территорию :) Страница статьидалее...
19.01.2038, 15:15 [8216]


QT: работаем со списком строк QStringList

В этой статье про стандартные контейнеры QT не упомянут самый удобный для начинающих контейнер - список строк QStringList, потомок базового списка QList.

Класс QStringList удобен, прежде всего, потому, что имеет дополнительные методы для фильтрации данных и легко взаимодействует со стандартными компонентами QT, "понимающими" строки QString.

Показанный в заметке проект WidgetTemplate - своего рода шаблон приложения для обработки списка строк. Строки выгружаются из многострочного текстового поля QTextEdit в QStringList, а затем обрабатываются удобными методами QStringList и QString, после чего изменённый список загружается обратно. В моём случае обработка сводится к фильтрации строк списка (удаление пустых и состоящих только из разделителей строк, затем сжатие лишних разделителей между словами строк и удаление лишних пробелов в начале или конце строки.

Также пример показывает, как сделать верхнее меню в потомке QWidget, просто прописать всё "ручками", готового в сети не нашёл. В норме QWidget не имеет встроенного меню и не работает, например, "прямой" вызов menuBar() из многочисленных книжных и сетевых примеров. В принципе, проблема решается просто - достаточно сделать виджет наследником QApllication, а не QWidget. Но можно и сделать меню не визуально, а логически, оставаясь наследником QWidget.

Заслуживает внимания и "современный" способ центрирования окна виджета по декстопу с помощью метода setGeometry. Для этого нам пришлось передать в конструктор виджета ссылку на экземпляр родительского приложения QApplication.

Проект виджета создан на основе класса QWidget без создания формы (так как весь интерфейс спроектирован логически в конструкторе). Страница статьидалее...
24.03.2017, 15:27 [7]


C++: индикатор прогресса для консоли :)

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

Вот пример простейшего класса для этой задачи и его вызова. Предполагается, что длина бегунка всегда равна WIDTH символов, где WIDTH - константа класса. Она описана равной 80 символов, такова обычно ширина текстовой консоли.

В конструкторе можно указать позицию бегунка (столбец и строка экрана, счёт строк и столбцов - с левого верхнего угла начиная с единицы) и значение max - номер максимального шага расчёта, номер первого шага всегда ноль.

Метод draw "рисует" бегунок из символов вертикальной черты (16-ричный код 0x7C), а go "ставит" его в нужную позицию, выводя символы '#' (0x23) поверх чёрточек. Предполагается, что go вызывается в цикле с верхней границей max.

Так как заголовочный файл conio.h нестандартен для C++, работу по позиционированию курсора и выводу в консоль выполняет сторонний класс coniow, версию coniow, работающую со Studio 2015, можно взять в архиве из этой заметки.

Стандартный метод round появился только в новом стандарте C++11, поэтому класс включает собственную реализацию округления чисел round1. Вот полный листинг примера, проверенный в Studio 2015. Страница статьидалее...
24.03.2017, 15:23 [8]


Отступать есть куда!

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

На самом деле, пожалуй, всё равно, какого из стилей придерживаться, лишь бы придерживаться. Нередко программист придумывает и собственный способ вложения блоков. Есть ли какие-то "официальные" стили? Конечно. Вот основные из них для моего любимого размера отступа (Indentation), равного 1 пробелу и на примере синтаксиса PHP (отступ перед каждой строкой Starting indentation равен нулю).

Исходный плохо форматированный текст: Страница статьидалее...
23.03.2017, 16:04 [35]


Mathcad: ищем экстремум функции двух переменных

Поиск экстремума функции двух переменных принципиально не отличается от случая одной переменной и выполняется стандартными функциями Minimize и Maximize. Проблема состоит в том, как правильно выбрать начальную точку (x,y), от которой будет выполняться поиск решения. Если у анализируемой функции несколько стационарных точек, может быть найден только "мусор", точней, найдётся ближайшая к начальной стационарная точка, не являющаяся экстремумом, или не найдётся ничего: Страница статьидалее...
22.03.2017, 13:27 [59]


Позитивная сказка для изменения реальности :)

Я - единственный блогер в стране, кто ни строчки не написал про Димона. И не напишу :) Лучше сказочку экспромтом.

В одной сказочной стране правил немолодой, но ещё крепкий диктатор по фамилии Капутин.

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

Едва добравшись до высоких постов, Капутин сразу же начал жёсткие воспитательные меры - он взрывал жителей вместе с многоэтажными домами, напускал на них банды хорошо оплаченных террористов, запрещал собираться на улице больше трёх человек, установил такие зарплаты, над которыми смеялись даже в Бантустане, а на все уровни власти набрал воров, бандитов и негодяев.

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

"Работы ещё непочатый край" - подумал диктатор и организовал себе пожизненное президентство, что, конечно, тоже не помогло. Граждане по-прежнему славили Капутина, прочили его на царство, а всех, кто пытался вякнуть что-либо против, закидывали тортами и помидорами, чего там, богато живём, не жалко.

Но Капутин был действительно умным и упрямым парнем, он придумал такое, до чего дойдёт не каждый.

Пинками вернув из-за океана получившего там образование молодого и шустрого адвокатика Лёшу Овального, диктатор угрозами принудил его делать немыслимое - вслух говорить правду, посулив такую зарплату, какую за океаном Лёша никогда бы не заработал.

Так как патриотически настроенные граждане Лёшу и близко не подпускали к телевидению, стал он строчить в интернете, кто где из капутинских дружков прикупил кроссовок, дворцов или виноградников, а кто где поднимает тарифы ЖКХ, сотовых операторов или придумывает "Платоны" да "капитальные ремонты", чтобы всё это хозяйство достойно содержать.

Однако граждане не могли поверить, что никак не пострадавший от властей Лёша является "борцом за правду", поскольку привыкли, что борец за правду должен быть если не покойником, то хотя бы сидеть в тюрьме.

Сидеть в тюрьме изнеженный Овальный отказался категорически, пришлось сочинить ему заведомо бредовое дело о краже Лёшей 400 миллионов кубометров дров и дать условный срок.

В общем, время шло, столетие революции остроконечников (давно задуманная для протеста дата) было уже не за горами, а дело не двигалось... Страница статьидалее...
20.03.2017, 17:55 [90]


C++: вернуть строку string с датой и временем, отформатированными с учётом локали

Собственно, пример на возможности библиотеки <ctime>, она же <time.h>. Функция gettime возвращает string с нужной информацией, можно форматировать строку для функции strftime и по другому.

Классическая функция localtime, возвращающая указатель, считается в новых версиях Studio небезопасной, вместо неё используем localtime_s. Страница статьидалее...
20.03.2017, 14:02 [92]


Javascript: самый простой способ открыть блок текста при нажатии

То есть, изначально часть текста в разделе скрыта, при нажатии на ссылку он открывается полностью.

Фреймворков не нужно, только чистый HTML+CSS+Javascript, вот листинг примера: Страница статьидалее...
19.03.2017, 21:25 [83]


Умереть нельзя родиться...
В русском языке не менее сотни синонимов и эвфемизмов к слову "умереть", ну-ка, прогоним по алфавиту: вознестись на небеса, врезать (дать) дуба, гигнуться, дух вон, загнуться, заказать место на горбушке, заснуть последним (могильным) сном, издохнуть, испустить дух, испустить последний вздох, кони двинуть, кончить земное поприще (существование), кончиться, лечь в землю, лечь в могилу, лечь костьми, надеть белые тапочки, околеть, окочуриться, опочить (вечным сном), отбросить копыта (коньки), отдать Богу душу, отдать концы, отойти (в вечность, в горняя, в лоно Авраама), отправиться к праотцам, отправиться на тот свет, пасть, перекинуться, переселиться в лучший мир, погибнуть, подохнуть, положить живот, помереть, почить (в Бозе), предать дух, преставиться, прибраться, приказать долго жить, приложиться к предкам, примерить осиновый костюм, присоединиться к большинству, пропасть, пропеть лебединую песню, проститься с жизнью, протянуть ноги, решиться жизни, свернуться, сдохнуть, скапуститься, склеить ласты, скончаться, скопытиться, сойти в могилу, сунуться, сыграть в ящик, угаснуть, уйти в иной (в лучший) мир, уйти в могилу (в землю), уйти из жизни, уйти от нас, упокоиться, уснуть (замолкнуть) навеки, уснуть могильным (последним) сном, усопнуть,.. Страница статьидалее...
19.03.2017, 17:10 [84]


PHP: исключить из массива одинаковые строки независимо от регистра символов

На PHP исключить из массива одинаковые элементы очень легко - есть готовая функция array_unique. Если значения элементов массива это строки и исключать элементы нужно независимо от регистра символов (бАСя = БАСЯ = бася), функция перестаёт быть полезной.

Но, если немного помучиться, легко написать свою функцию для этой цели:

function array_iunique ($array) { 
  //Удаление лишних элементов массива с игнорированием регистра символов
 return array_intersect_key( $array,array_unique (array_map ('toLower',$array)));
}

Здесь к каждому элементу массива применяется пользовательская функция toLower для приведения его к нижнему регистру символов. Настройка локали бывает разная на разных хостах, и если объём данных не слишком велик, лучше не надеяться на стандартную strtolower, а надстроить над ней свою toLower, например, для учёта кириллицы такую: Страница статьидалее...
19.03.2017, 10:28 [82]


QT: может ли виджет посылать сигнал самому себе...

В смысле, если сигнал посылается от this и обработчик - тоже this. Может, почему нет. Не очень ясно, зачем это нужно, если можно просто вызвать метод своего класса, но в учебных целях добавим подобный пример. Если порой такое не компилируется - например, при соединении из конструктора виджета со слотом, добавленным через дизайнер форм (у меня приложение стабильно падало), причина, вероятно, в этом же - на момент установки connect объект ещё не сконструирован.

Проект создан на основе QDialog вместо QWidget (для разнообразия), форма размечена в конструкторе вместо обычного "ручного" добавления, вот макет формы: Страница статьидалее...
17.03.2017, 21:42 [94]


PHP: упаковываем и распаковываем файлы zip на сервере

Неудавшаяся попытка скрипта, запишем для истории :) Сама по себе работа с классом ZipArchive ничего особенного не представляет, проблемы начинаются, когда в именах файлов есть символы национальных алфавитов.

При архивировании особых проблем не возникло. HTML-форма и браузер считают, что имя файла передано в Юникоде, скрипт тоже должен быть сохранён в Юникоде (UTF-8), тогда при упаковке браузер корректно отдаёт файл с именем archive.zip. Если же кириллицу содержит исходное имя архивируемого файла, то заменяем её на латиницу функцией cyr2lat.

При распаковке архивов начинаются проблемы. В формате ZIP имена файлов хранятся в однобайтовой кодировке, в связи с чем возникает известный баг PHP, при котором разархивация "портит" имена извлекаемых файлов, хотя методы getNameIndex и extractTo из кода работают.

Как исправить баг с именами - показано в коде, но попытка переименовать файлы из архива на "правильные" имена с помощью метода renameName всё равно не удалась, так что это не решение, а только набросок, который возможно, пригодится в будущем.

Также не решена проблема, каким образом получить правильные HTTP-заголовки, чтобы "отдать" браузеру сразу кучу файлов (все файлы архива) за одну транзакцию (см. функцию file_download в коде и её закомментаренный вызов). В реальном приложении хранить на сервере множество загруженных юзером файлов, конечно же, не стоит, нужно отдавать файлы браузеру и удалять их с сервера. Скрипт в том состоянии, что выложен, просто выводит ссылки на загруженные файлы, причём, не факт, что они сработают - именно из-за "испорченных" при извлечении классом ZipArchive имён файлов.

Для краткости также не приведено HTML-обрамление, предполагается, что скрипт размещён на хосте в отдельной папке с файлом .htaccess, устанавливающим кодировку UTF-8:

AddDefaultCharset utf-8

и созданной вложенной папкой unpacked для загружаемых файлов: Страница статьидалее...
15.03.2017, 11:05 [132]


QT: делаем метку, реагирующую на клик мышью и динамический список меток

Механизм сигналов и слотов позволяет не только пользоваться готовыми возможностями, но и легко добавлять обработку событий, отсутствующих у оригинальных компонент QT. Рассмотрим эту ситуацию на примере. Оригинальная текстовая метка QLabel не испускает сигнала clicked(), соответственно, не имеет возможности реагировать на нажатия кнопки мыши. Можно использовать другую компоненту, например, QPushButton, но тогда придётся повозиться с её геометрией, чтобы сделать кнопку похожей на текстовую метку. Гораздо проще и логичней написать класс-наследник QLabel, который реагирует на нажатия кнопки мыши.

Добавим в пустой виджет класс ClickableLabel, сделаем его наследником QLabel и предусмотрим в нём обработку сигнала clicked() и события мыши mousePressEvent(). Также предусмотрим ситуацию, когда меток много и надо различать их между собой по какому-то дополнительному свойству, как сделано в C++ Builder, где все компоненты имеют "пользовательское" свойство tag. Вот листинг файла clickablelabel.h: Страница статьидалее...
10.03.2017, 14:15 [182]


Генерируем безопасный пароль на PHP

Многие ресурсы требуют от пользователя иметь "безопасный пароль", включающий в себя как латинские буквы в разных регистрах, так и цифры, да ещё и специальные символы. А программисту иногда требуется автоматизировать задачу генерации такого пароля. Ниже приводится очевидная функция для решения подобной задачи, при необходимости её легко модифицировать под свои нужды, пользуясь комментариями в исходнике.

Метод возвращает строку с паролем нужного вида, а его параметрами являются:

Количество маленьких букв, оставшихся в строке пароля, вычисляется как $l-($c+$n+$s). Вот полный листинг скрипта с функцией и её тестовым вызовом, пользовательская обработка ошибок в значениях параметров сделана удобным методом trigger_error. Страница статьидалее...
09.03.2017, 15:53 [187]


Играющая шахматная программа одним файлом?

Такое возможно, даже если не ковырять исходники "Стокфиша" и не пытаться распутать хитросплетения яваскрипта.

Магнус Лидстрём поддерживает проект Priyome Chess Computer вот здесь.

Чистый Си, но я компилировал в Studio, вставив исходник в пустой файл пустого проекта, так что в начале закомментирована пара директив, не нужных на C++.

Код тоже довольно "чистый" и хорошо иллюстрирует старый добрый процедурный подход к программированию :)

После запуска программа сразу же готова к игре, ввод ? (знака вопроса и Enter) в её командной строке покажет поддерживаемые команды. Чтобы сыграть, вводите ход в виде d2d4, то есть, только начальное и конечное поля.

На всякий случай, ниже прикреплён исходник в архиве .zip, объём кода ~1300 строк. Страница статьидалее...
09.03.2017, 11:08 [200]


[1-15] [16-30] ... [1681-1695] [1696-1703]

  в началопоиск по блогунаписать авторустатистика

Наверх Яндекс.Метрика
© PerS
вход