Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Удаление Activity из бэкстека

Есть приложения в котором есть StartActivity в котором загружается данные с сервера. После данные передаются в MainActivity где данные обрабатываются и выводится на экран.
Нужно, чтобы после запроса StartActivity был уничтожен. Но при щелчке назад в MainActivity приложения возвращается назад где просто выводится лейаут StartActivity.
Нужно сделать так, чтобы после передачи данных StartActivity был уничтожен. Как можно реализовать или есть альтернативы?


Ответ

Вся проблема в том, что StartActivity остается в стеке активностей.
Решается все просто: когда из StartActivity вызываете MainActivity достаточно после startActivity() тупо вызвать finish() текущего StartActivity, тогда при нажатии кнопки вы не вернетесь назад.
Intent intent = new Intent(this, MainActivity.class); this.startActivity(intent); this.finish();

Как правильно скрыть часть изображения?

Имеется изображение в формате , как скрыть обрезать угол изображения?
А если изображение будете задано в качестве bg фона?


Ответ

Решение SVG
С помощью техники,- использование mask svg, можно сделать очень сложные вырезы, которые трудно повторить в css
Для этого понадобится минимальные навыки работы в векторном редакторе.
Загружаем нужную картинку в векторный редактор (Inkscape) и рисуем path который будет служить границей вырезанной части.
Рисуем кривую с помощью инструмента -
Далее в меню Inkscape выбираем Контур / оконтурить обводку Сохраняем файл SVG и в любом текстовом редакторе копируем из файла формулу кривой

Вот эта кривая линия и будет границей вырезания части изображения.
Ниже код с маской:

Как избежать определения двух методов/конструкторов с одинаковыми параметрами?

Например, пишу класс Vector. Вполне естественно создавать объект, принимая в конструктор или координаты x и y, или же принимая длину вектора и угол между направлением вектора и положительным направлением оси OX. Однако я не могу написать так:
public class Vector { float x; float y;
public Vector(float x, float y) { this.x = x; this.y = y; }
public Vector(float length, float alpha) { this.x = length*Math.cos(alpha); this.y = length*Math.sin(alpha); } }
Компилятор, конечно, будет ругаться на неоднозначность в определении конструкторов. Я не могу её избежать переставив аргументы местами, так как они одинаковых типов. Что делать в таких ситуациях, когда метод/конструктор должен принимать два разных по смыслу набора параметров, но получается так, что они имеют одинаковые типы?


Ответ

В таких случаях не лишним будет использование статических фабричных методов. С использованием этого шаблона ваш код будет выглядить так:
public static class Vector { public final float x; public final float y;
private Vector(float x, float y) { this.x = x; this.y = y; }
public static Vector coordinate(float x, float y) { return new Vector(x, y); }
public static Vector radian(float length, float alpha) { return new Vector(length * Math.cos(alpha), length * Math.sin(alpha);) } }
Так же, можно воспользоваться шаблоном проектирования builder. Здесь он выглядит немного громоздко, но в принципе, тоже применим:
public static class Vector {
...
public static VectorBuilder builder() { return new VectorBuilder(); }
public static class VectorBuilder { private double length; private double alpha; private float x; private float y;
public VectorBuilder setLength(float length) { this.length = length; compute(); return this; } public VectorBuilder setAlpha(float alpha) { this.alpha = alpha; compute(); return this; } private void compute() { this.x = (float) (length * Math.cos(alpha)); this.y = (float) (length * Math.sin(alpha)); }
public VectorBuilder setX(float x) { this.x = x; return this; } public VectorBuilder setY(float y) { this.y = y; return this; } public Vector build() { return new Vector(x, y); } } }

Стилизация “волны” в кнопке при клике

Как создать эффект волны при клике на кнопку?


Ответ

Навскидку написал скрипт, который анимирует волну от места клика и работает в Safari
var links = document.querySelectorAll("button"); for(var i = 0; i < links.length; i++){ links[i].addEventListener('click', function (event) { event.preventDefault(); // Remove any old one var ripple = document.querySelector('.ripple'); if (ripple) { ripple.remove(); } // Setup var buttonWidth = this.offsetWidth, buttonHeight = this.offsetHeight; // Make it round! if(buttonWidth >= buttonHeight) { buttonHeight = buttonWidth; } else { buttonWidth = buttonHeight; } // Get the center of the element var x = event.offsetX==undefined?event.layerX:event.offsetX - buttonWidth / 2, y = event.offsetY==undefined?event.layerY:event.offsetY - buttonHeight / 2; // Add the element var span = document.createElement('span'); span.className = 'ripple'; s = span.style; s.width = buttonWidth + 'px'; s.height = buttonHeight + 'px'; s.top = y + 'px'; s.left = x + 'px'; this.appendChild(span); }); } button { display: block; color: #fff; background: #232323; padding: 0 50px; position: relative; overflow: hidden; font: 700 18px/46px 'Arial'; border: none; outline: none; user-select: none; cursor: pointer; transition: background .25s; } button:hover, button.active { background: #444; } .ripple { width: 0; height: 0; border-radius: 50%; background: rgba(255,255,255,0.4); transform: scale(0); position: absolute; opacity: 1; animation: ripple 0.5s linear; } @keyframes ripple { 100% { transform: scale(2); opacity: 0; } }

Функции insert()

Вводятся две строки, необходимо в первой строке найти вторую и заключить ее в скобки. "s3.insert(1,s2)" без этой команды программа работает, с этой командой программа зависает. Подскажите в чем проблема.
#include #include #include #include
using namespace std;
int main(){ setlocale(LC_ALL,""); string s1,s2,s3; cout<<"Введите первую строку: "; cin>>s1; cout<<"Введите вторую строку: "; cin>>s2; s3="()"; s3.insert(1,s2);
int size = s2.size();
int x = s1.find (s2); while (x cout<

Ответ

Если нужно найти все вхождения строки s2 в s1, то цикл здесь нужен. Проблема в том, что следующее вхождение нужно искать не с начала строки, как вы это делали здесь:
x = s1.find (s2);
а с определённого индекса, то есть (предыдущий x + длина найденной строки)
x = s1.find(s2, x + s3.size());
Итого:
int x = s1.find(s2); while (x != string::npos) { s1.replace(x, size, s3); x = s1.find(s2, x + s3.size()); }

Как они зарабатывают? [закрыт]

Наверное многие люди, которые имеют отношение к ИТ, хоть раз интересовались каким способом производиться получение прибыли с созданных программируемых объектов. Как зарабатывают на большинстве продуктов созданных такими гигантами как Microsoft или Apple, надеюсь ни у кого не вызывает вопросов(ведь софт они просто продают), а вот как обстоит ситуация с бесплатными программами, которые ко всему прочему не толкают рекламу? Взять к примеру ОС Ubuntu. Ubuntu в настоящее время финансируется Марком Шаттлвортом и основанной им компанией Canonical. Цитата из википедии. Так вот, как Марк получает прибыль или хотя бы компенсирует свои денежные вложения? Пы.Сы.: Я не собираюсь подсчитывать чужие деньги, меня интересует способ заработка на подобных проектах.


Ответ

Приведем пример RedHat. Да, сам линукс от них бесплатный, но продается поддержка. Большие дяди в больших корпорациях любят это. Почему? А все очень просто. Покупает он Линукс у Редхата, все работает и все прекрасно. А в один день админы все резко заболели, а сервера стали. Минута простоя - куча денег. Дядя просто звонит в Редхат и говорит "не работает" и Редхат высылает своих спецов, которые постараются все починить, и админов научить. В любое время суток. И пусть такое может случится раз в год, но платить будут каждый месяц. Понятно, что цены гибкие и максимальное кол-во вызовов зависит от этого. Вариант два. Обнаружена мегауязвимость. Сервера дяди под вопросом. Он звонит в Редхат и говорит "что делать?", а те - "а мы сейчас патчик делаем, через день будет накатывать". Следующим средством прибыли является сертификация и обучение. Тут все понятно. И ещё один способ. Припустим компания X (тут и далее все имена компаний выдуманные и любое совпадение случайно и не преднамеренное) решила сделать суперноутбук. Начинила его самой последней техникой. Поставила туда Linux, а он "из коробки" не работает. Нужно настраивать и настраивать. Понятно, что это очень плохо (ну кроме как для некоторых гиков, которым только дай понастраивать). И они идут в компанию Y, которая делает Linux и говорят "а сделайте так, что бы ваш линукс на нашем ноутбуке заводился с пол пинка, из коробки! Инструкций для старых версий наделайте, патчей. А мы вам за это денежки подкинем". В результате все счастливы. И напоследок, не нужно забывать о благотворительных фондах и пожертвованиях. Вот так, с миру по нитке и зарабатывают производители Linux.

Цвет текста в консоли C#

Как изменить цвет выводимой строки/символа в консоли в C#?


Ответ

Console.ForegroundColor = ConsoleColor.Green; // устанавливаем цвет Console.WriteLine("..."); Console.ResetColor(); // сбрасываем в стандартный

Доступ к полю или свойству по имени

В ActionScript 3 есть такой способ доступа к полям и свойствам экземпляра obj.name = "value1"; // прямой доступ trace(obj.name); // value1 obj["name"] = "value2"; // доступ по имени trace(obj.name); // value2 Какие есть варианты реализации такой штуки на C#? (в догонку - возможно ли итерировать (foreach) по именам/значениям свойств?)


Ответ

Проще всего через reflection: FieldInfo fi = typeof(YourClass).GetField("field_name_here"); object fieldValue = fi.GetValue(yourClassInstance); Итерировать можно тоже, см. пример в самом низу страницы: http://msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.aspx А вообще, обычно такое не нужно. Если вы расскажете, зачем вам это, может быть, мы предложим более удобный и правильный (и быстрый!) вариант.

.bind или .on в jquery

Добрый день. Чем отличается метод .bind() от .on() в jQuery? Например: $('div').on('click',function(){...}) $('div').bind('click',function(){...})


Ответ

.on() - новый метод установки обработчиков событий. Введен в 1.7. Объединяет в себе функциональность .bind(), .live(), .delegate(). Начиная с 1.7 эти три метода считаются устаревшими.

Научиться JavaScript [закрыт]

Здравствуй, сообщество (: Хочу изучить JavaScript, знаю несколько языков, имею огромный опыт веб-разработки, но до JS руки так и не дошли, постоянно брал откуда-то готовые примеры, никогда специфического ничего не требовалось. Но сейчас я хочу закрыть эту большую дыру и творить! (: Мне не нужны начальные теоретические знания: циклы, условия, ооп и тому подобные конструкции - теорию я уже знаю. Я хочу боевых скринкастов / видеоуроков, мануалов, уроков или чего нибудь такого, где сразу без занудства будут описывать анимации, события, применение конкретных фреймворков - и их объектов и методов, или просто что нибудь красивое (: В общем нужны пособия по UI / UX. Английский язык не проблема - если есть что-нибудь стоящее - предлагайте! С удовольствием посмотрю / почитаю. Заранее огромное спасибо! UPD: Прошло чуть меньше года, с момента как я задал этот вопрос, и я до сих пор изучаю все прелести JS. Тем, кто задаётся похожей целью, и тоже считает, что ему не нужны теоретические знания о JS - Вы, как и я раньше, ошибаетесь. JavaScript - прекраснейший язык, в нём много отличий от обычных ОО языков. Тут тебе и сплошь объекты, и прототипы, и события... В общем - начинайте с низов, и будет Вам счастье.


Ответ

Мне не нужны начальные теоретические знания "JavaScript Шаблоны" уже рекомендовали так что: JavaScript Web Applications Learning JavaScript Design Patterns прочее: Что почитать, чтобы повысить свой уровень JavaScript ECMA-262-3 in detail wtfjs по UI / UX. Ководство Психбольница в руках пациентов

Java.Польза от ссылок(SoftReference, WeakReference , PhantomReference)

Используя различные ссылки можно получить большую скорость работы сборщика мусора или для иных целей используются ссылки?


Ответ

Разница не в скорости, разница в том, как сборщик мусора будет работать с объектом по ссылке.
SoftReference — это самая сильная из всех перечисленных ссылок. Если на объект не осталось больше нормальных ссылок, а только SoftReference, объект не будет съеден сборщиком мусора до тех пор, пока реально не возникнет ситуация нехватки памяти.
Хороший пример использования для таких ссылок -- кеш больших картинок в памяти. Если память исчерпалась, картинку выбросит сборщик мусора, и вы сможете перечитать её с диска, когда она снова вам понадобится.
WeakReference слабее: она не увеличивает дополнительно время жизни объекта, на который ссылается, и если на объект есть не более чем слабые ссылки, сборщик мусора может убрать его когда ему вздумается.
Хороший пример использования для таких ссылок -- добавить дополнительную информацию об каком-то объекте. Для этого вы держите в своём контейнере не сам объект, а лишь WeakReference на него, вместе с необходимой информацией, тем самым вы не мешаете объекту умереть вовремя и не меняете свойства остальной части программы.
Имея на руках SoftReference или WeakReference на ещё живой объект, вы можете получить настоящую ("сильную") ссылку, и предотвратить съедение этого объекта сборщиком мусора. Имея сильную ссылку, вы можете работать с объектом как обычно.
PhantomReference ещё слабее. Она не только не предохраняет объект от уборки, она даже не даёт возможности получить сильную ссылку. Вы можете только узнать, что объект собирается умереть, и предпринять какие-то действия по очистке; предотвратить смерть объекта вы не сможете.

При создании SoftReference, WeakReference вы можете, а при создании PhantomReference должны указать ReferenceQueue (хотя тут можно указать null, это обычно бессмысленно). После того, как объект будет убран сборщиком мусора, ссылка попадает в указанную вами ReferenceQueue
Для нефантомных ссылок при добавлении в очередь финализатор уже выполнен и память объекта уже освобождена, но для фантомных добавление происходит после вызова финализатора до очистки памяти. Вы можете по сути не объявлять дорогой финализатор, а воспользоваться фантомной ссылкой из очереди для того, чтобы самостоятельно освободить ассоциированные ресурсы. (Для этого вы не сможете использовать сам объект, т. к. сильную ссылку на него невозможно получить из фантомной ссылки; но вы можете унаследоваться от PhantomReference, чтобы добавить нужную информацию в объект-ссылку.)
Ещё одно отличие, как подсказывает @gstackoverflow в комментариях, состоит в том, что фантомную ссылку вы должны очистить вручную, иначе объект будет оставаться (фантомно) достижим. Только после этого объект будет окончательно удалён.
Источники:
https://stackoverflow.com/q/3329691/276994 https://habrahabr.ru/post/169883/ http://www.javaportal.ru/java/articles/referenceclasses.html

HTML5+JS vs. традиционные языки [закрыт]

Други, коллеги и проч. программерская нечисть :) В последнее время становится все более и более модным новое направление в разработке, то что условно назовем html5+js. Вкратце выглядит это так - есть браузерная среда в которой ведется не только разработка юай, но также и собственно бизнес-логика. Особенно это заметно для мобильной разработки (десктоп пока вынесу за скобки). Взять тот же Tizen OS или почивший уже WebOS, поднимающий голову Chrome OS - все это тот самый html5+js Плюсы в общем то понятны: пресловутый write once - use everywhere, низкий порог вхождения (похапистов то ведь много). К сожалению мои личные познания в браузерной разработке достаточно небольшие, посему и вопрос: возможно есть в форуме двурукие коллеги, одинаково хорошо владеющие и браузерными разработками и традиционными способами. Просьба поделиться своим опытом. Особливо меня интересует как устроена жизнь браузерного разработчика, в частности, с точки зрения доступа к ресурсам ОСи. Я понимаю как можно построить юай на html5+js, но чего не могу совершенно понять как же из браузера можно достучаться до сервисов, до нотификаций, да хотя бы до файловой системы? P.S. Да это холивар :) - минусовать не буду. Все мнения welcome.


Ответ

Ну разработчики допиливают свои методы в мобильное приложение и становится возможным юзать и файловую систему, и нотисы, и многое другое (прим phonehap) Плюсов много - быстрота разработки, дешевизна. Минус тут один - тормоза. Сложно сделать более менее плавную! анимацию средней сложности. У меня например fadeIn картинки на полный экран вроде и нормально отрабатывает, но приложение задумывается на секунду.

Frond-end разработчик за 17 месяцев [закрыт]

Доброго времени суток. Предисловие. У меня есть в запасе 17 месяцев до окончания вуза, после которого я выйду в свободное плавание. И за это время я хочу набраться знаний и опыта в front-end разработке, на такой уровень, чтобы можно было устроиться работать Junior-ом в какую нибудь фирму. До этого момента я не знал, чем хочу заниматься по жизни, метался от одного к другому. В поисках себя я наверно всю свою сознательную жизнь, еще в детстве я умудрялся ходить на три кружка сразу (по собственному желанию). Год назад я открыл для себя веб разработку, начал изучать, но где-то через неделю, я снова переключился на другое занятие как мне тогда показалось, более интересное. Два месяца увлечения прошли быстро и я забросил, к тому моменту про веб я уже и забыл. На просторах интернета все всегда советуют заниматься тем к чему душа лежит, и только тогда будишь счастлив, но сами в большинстве случаев работают на работе не приносящей удовольствия. От веб разработки не сказать, прям, оторваться не могу, но интересно прописывать строчки кода, а потом смотреть результат и если все работает, так как ты написал это конечно приносит удовольствие (да и тема интернета мне очень близка). Можно сказать у меня это получается но прям, большого удовольствия не приносит но интерес есть. Хотя если у меня появиться в будущем дело моей жизни я думаю, оно станет моим хобби, а потом я постараюсь сделать его своей любимой работой. Но времени выбирать нет, его и так слишком мало. У вас я хочу попросить совета, как лучше мне действовать что-бы добиться своих целей, может кто-то поделиться своим опытом становления веб-разработчиком. Ниже я хочу написать список технологий которые я собираюсь "выучить" и источники откуда я буду черпать знания. 1.Основы основ протокол TCP/IP или как работает Интернет Понимание работы HTTP а) http://www.ofnet.ru/osnovy-interneta/tcpip.html(для примера) 2.HTML 4, XHTML, HTML 5 + CSS 2,3 a)Даже боюсь произносить эту фамилию в интернете зная какой бугурт она за собой повлечет, но все же Видео курс Евгения Попова HTML и CSS базовые курсы. Курс по HTML я уже прошел, для новичка очень понятно и доступно все объясняет. б) После собираюсь полностью проштудировать http://htmlbook.ru получая новые знания об HTML и CSS и закрепляя старые после курса Попова. в) Табличная, блочная, адаптивная верстка. 3.JavaScript+jquery а)Видео курс Попова JavaScript+jquery б)http://javascript.ru/ 4.php+mysql самые основы. a) http://www.php5.ru/ б) http://php.net/manual/ru/tutorial.php Вот вроде все, а если может где-то я ошибаюсь, прошу подправить. Надеюсь на ваши советы.


Ответ

Ох, ну ладно, царского пути не скажу, но со своего небольшого опыта могу посоветовать немного: Построение пользовательских интерфейсов: 1) Самые азы HTML учится на сайте постройка: http://www.postroika.ru/html/content2.html 2) Идем на сайт intuit.ru и углубляемся в HTML: Введение в HTML Основы работы с HTML Спецификация языка HTML - это главные знания HTML 4.0 - это итоговый зачет на хорошее владение HTML, надо постараться сдать на 4 или 5 3) Там же в CSS уходим Основы работы с CSS Применение каскадных таблиц стилей (CSS) Основы работы с XHTML и CSS Спецификация CSS2 - это главные знания CSS 1.0 - это итоговый зачет на хорошее владение CSS, надо постараться сдать на 4 или 5. 4) Далее читаем учебник на htmlbook по HTML и по CSS. После этого можно считать, что у вас есть уверенные знания и остается набивать руку в верстке. Так же советую почитать книгу "Не заставляйте меня думать" После этого переходим к программированию, лучше сначала JavaScript: Девид Фланаган - "JavaScript. Подробное руководство" Стефанов - JavaScript. Шаблоны. Маклафлин - Изучаем Ajax. Так же знакомимся с библиотекой JQuery, можно по книге или по документации. После этого можно переходить к изучению PHP + база данных. Д.В.Котеров, А.Ф.Костарев - PHP5 в подлиннике Знакомимся со всякими Joomla, Wordpress, Drupal, DLE и т.д. Знакомимся с фреймворками. (Может кто-то тут предложит лучшие варианты и источники PHP + БД) Насчет Попова - он может Вам помочь понять быстрее что-то, но последней инстанцией его считать не стоит. Посмотрите, но потом все таки доведите знания до годной планки литературой. А так же особо не верьте в его пресловутые 20%/80%, хоть запоминать все наизусть не надо, но прочитать стоит все 99%. По поводу сетей, стоит почитать клиент-серверную архитектуру, но поначалу сильно углубляться не стоит. Т.к. в этом не будет большого смысла. Это начало, дальше уже пойдет более серьезная литература и больше статьи, которую я думаю вы сможете найти сами(алгоритмизация, шифрование, проектирование БД, Apache/nginx, FastCGI, highload и т.д.). Ну и главное не забывать, что практика важнее всякой теории и иметь хоть какое-то более менее потфолио будет плюсом. И еще, не надо все пытаться выучить наизусть, главное прочитать и постаратся запомнить основные моменты. Что-то непременно забудется, именно поэтому самый главный помощник - это справочник под рукой.

Создание шаблона окна в WPF

В WinForms можно было сделать окно с элементами. Потом создать еще одно окно, унаследованное от первого и добавить на него еще элементы. Как в WPF делает такое? Что-то у меня не выходит такое провернуть.


Ответ

Это можно сделать, но довольно сложно, и требует известной технической квалификации.
Давайте рассмотрим пример, где нужно сделать окно с дополнительным текстовым сообщением снизу.
Для начала, вам нужно унаследоваться от класса Window
[TemplatePart(Name = "PART_MessageCountHost", Type = typeof(Panel))] // будет объяснено позже class WindowWithMessage : Window {
и определить переопределение метаданных, чтобы стили, определённые в ResourceDictionary без ключа, подхватывались:
static WindowWithMessage() { DefaultStyleKeyProperty.OverrideMetadata( typeof(WindowWithMessage), new FrameworkPropertyMetadata(typeof(WindowWithMessage))); }
Затем, вам нужен сам текст как свойство окна:
#region dp string MessageText public string MessageText { get { return (string)GetValue(MessageTextProperty); } set { SetValue(MessageTextProperty, value); } }
public static readonly DependencyProperty MessageTextProperty = DependencyProperty.Register( "MessageText", typeof(string), typeof(WindowWithMessage), new UIPropertyMetadata(OnMessageChanged)); #endregion
При изменении MessageText будет вызываться OnMessageChanged
В принципе, нам не особенно нужно знать, где именно будет показываться — это, в конце-концов, вопрос стиля/темплейта. Но предположим, что нам нужна кастомная логика: мы хотим считать, сколько раз message менялся.
int messageCount = 0;
static void OnMessageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { WindowWithMessage self = (WindowWithMessage)d; self.messageCount++; self.UpdateMessageCount(); }
Для этого нам нужно знать, где это отображать. Для этого нам нужно попросить темплейты, чтобы они сообщали нам нужную информацию. Для этого используем объявление TemplatePart перед классом (см. выше).
Panel messageCountHost;
Визуальный элемент для счётчика сообщений может меняться только при применении темплейта.
public override void OnApplyTemplate() { base.OnApplyTemplate(); messageCountHost = GetTemplateChild("PART_MessageCountHost") as Panel; UpdateMessageCount(); }
void UpdateButtons() { if (messageCountHost == null) return;
messageCountHost.Children.Clear();
var textControl = new TextBlock() { Text = messageCount.ToString() };
messageCountHost.Children.Add(textControl); }
}
Окей, это был lookless control. Теперь для него нужно написать визуальную часть.
Для этого вы должны в корне своего проекта создать подкаталог Themes, и в нём ResourceDictionary Generic.xaml. Названия важны, не меняйте их. Если такой файл уже есть, просто добавьте в него стиль.

Теперь можно использовать новое окно как обычно:

Выводит на консоль символы вместо кириллицы.


Хотелось бы навсегда решить эту проблему, а то для ее лечения я каждый раз вставляю это //Console.OutputEncoding = Encoding.UTF8


Ответ

Ситуация обстоит следующим образом: в качестве кодировки по умолчанию в вашей системе установлена 437. Это стандартная кодировка, разработанная в IBM для самых первых персоналок IBM PC предназначенных для США; в целях совместимости дожившая до наших времён. Она содержит только символы английского алфавита и некоторые греческие буквы. Она не содержит символы европейских языков (с умляутами и штрихами), и тем более не содержит символов кириллицы.
Так что, похоже, у Вас американская либо международная версия Windows.
Для того, чтобы показывать русский текст (кириллицу) необходимо переключиться на кодировку 866 (DOS), 1251 (Windows) или 65001 (UTF-8). Последняя кодировка универсальнее, поскольку позволяет показывать также и символы других алфавитов, не только русского и английского.
Вы можете переключить язык даже в английской версии Windows с помощью команды chcp
Однако, это не всегда помогает, поскольку для отображения Unicode-символов необходим шрифт, содержащий глифы для этих символов. То есть помимо кодовой страницы для консоли необходимо установить также шрифт, например Lucida Console, вместо Terminal.
В любом случае, установка шрифтов и кодовой страницы — прерогатива всё-таки пользователя компьютера, а не разработчика программы. Разработчик (то есть Вы) со своей стороны можете сделать следующее:
Вынести текст всех сообщений в отдельный файл ресурсов. В этом файле подготовить все сообщения на английском языке. Это будут ресурсы по умолчанию. Подготовить второй файл ресурсов, куда сохранить сообщения на русском языке.
После этого в английской, международной и прочих не-русских версиях программа будет показывать сообщения на английском. В русской версии Windows, где выбрана культура ru-ru и установлена кодировка CP1251 или CP65001 — программа будет выводить сообщения на русском.
Пользователи-французы, итальянцы, японцы — смогут подготовить ресурсы на своём языке, переведя их с английского. Эти ресурсы могут быть скомпилированы в DLL. Если скопировать эту DLL в каталог программы, она будет показывать сообщения например на итальянском в итальянской версии Windows. Замечу, что для этого не нужно иметь исходного кода Вашей программы, и вообще, от Вас не потребуется ничего — пользователю потребуется EXE или DLL с текстами по-умолчанию, чтобы сделать свой перевод этих текстов.
Выбор английского в качестве языка по умолчанию хорош тем, что этот язык по историческим причинам поддерживается всеми версиями Windows (и не только Windows).

CSS блок поверх всего контента

Есть блок с краю экрана небольшой. При наведении он расширяется. Проблема в том, что он "выезжает" не поверх моего контента, а под него. Точнее только под картинки (скриптовые банеры с прокруткой и тп.) Можно ли сделать так, что бы он выезжал поверх всего? CSS:
div.nav { display: block; position: fixed; right:6px; top: 80%; display:block; height:160px; width:33px; background:url(../img/helpback.jpg) no-repeat; line-height:50px; transition:all .7s ease-out; border: 1px solid #333; border-radius: 2em; }
div.nav:hover { position: fixed; right: 5px; top: 80%; width:347px; height:160px; display: block; }


Ответ

Добавьте правилу div.nav свойство z-index: 999999;
Строго говоря, ваш элемент должен иметь значение z-index большее, чем положение по z-оси других элементов страницы, т. е. и значения z-index: 100; может быть достаточно

Как разложить двузначное число на два однозначных

Например 43 на 4 и 3. В стандартной библиотеке ничего подходящего не нахожу или плохо знаю математику. Кроме костылей, типа перевести число в строку и разбить, ничего путного в голову не приходит.


Ответ

то, что вы хотите получить - это остаток и частное от целочисленного деления на 10

Как определить чётное ли число?

Задача состоит в следующем: Вывести следующее после текущего чётное число. Числа целые.
Пример: Входные данные: 5, Выходные данные: 6. или Входные данные: 6, Выходные данные: 8.
Проблема в том, что использовать конструкцию if или циклы нельзя. При скором размышлении и поиске похожих решений в поисковике ничего полезного не обнаружил. Подскажите пожалуйста, какие алгоритмы бывают?
Язык Java.


Ответ

Если нет никаких суровых ограничений на размер исходных данных, то подошло бы что-то такое
x = x+2 - (x&1);
или
x = (x+2)&(-2)

В чем разница между valueOf и toString

В чем разница между ними? И то, и то выводит нам строку, которую мы указывает в return, при том valueOf, если явно указано, затирает toString Почитал пару источников, но так и не понял разницы. Если можно, поподробнее, пожалуйста.


Ответ

Рискну предположить что Вы имеете ввиду функции valueOf и toString Разница между ними чуть размыта, но понятна:
valueOf используется для численного преобразования объекта (foo + 42, ++bar, etc.). Но есть он далеко не у всех объектов (т. е. есть, но возвращает сам объект, поэтому игнорируется) и обязан возвращать примитив, иначе будет проигнорирован и будет вызван toString toString используется для строкового преобразования объекта (alert(foo)). Есть у всех объектов, обычно не очень информативен ([object Object]), но очень удобен, если нужно перегрузить оператор, например (в JS нет перегрузки/создания операторов). Тоже обязан вернуть примитив.
Читать подробнее У использования этих операторов есть нюансы (как везде в JS, наверное, экой коварный язык однако!), которые проще узнать из спецификации.
www.ecma-international.org whatwg.org ES5 на русском Отличный учебник JS

Как разбить строку в Java?

Есть строка:
String="Moscow,Astana,London";
Нужно получить:
String 1=Moscow; String 2=Astana; String 3=London;


Ответ

Используйте String.split(). Думаю, должно быть что-то типа String.split(","); для получения нужного вам списка.

java - Поднять регистр букв у первого символа строки

Собственно, суть в вопросе. Например, есть строка
String old = "геннадий";
Нужно получить строку Геннадий, то есть первый символ должен подняться в регистре


Ответ

Вариант №1:
String capitalized = old.substring(0, 1).toUpperCase() + old.substring(1).toLowerCase();
Вариант №2:
String capitalized = Character.toUpperCase(old.charAt(0)) + old.substring(1).toLowerCase();
Вариант №3:
StringBuilder sb = new StringBuilder(old.toLowerCase()); sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); String capitalized = sb.toString();

char * и const char *

Решил вернуться к СИ и прочитать книгу K&R, и вот опять споткнулся на теме указателей, по логике вроде все понятно, но вот именно с char * и const char * какие-то проблемы.
Давайте я приведу код и покажу что мне все такие не ясно!
Пример 1:
char *pstr = "Hello, world"; *pstr = 'D'; /// При запуске приложения на этом месте вылетит сбой не понятно! printf(pstr); /// Ну и конечно ничего не выведет, измененную строку я не получу, ой точнее массив из символов
Пример 2:
const char *pstr = "Hello, world"; *pstr = 'D'; /// Сбоя не будет и программа вообще не скомпилируется т.к компилятор сообщит что мы не можем изменять наш константный объект printf(pstr); /// До сюда дело не дойдет
Пример 3:
char str[] = "Hello, world"; char *pstr = str; *pstr = 'D'; /// Все ок мы успешно поменяем наш первый элемент массива printf(pstr); /// Мы получим это: "Dello, world"
Подведем черту над всеми этими примерами: Почему я не могу в первом примере поменять отдельно каждый литерал? (Я же не объявлял объект константным как во втором примере)
P.S Третий пример привел для общей картины чтобы показать что все работает если ввести дополнительный параметр


Ответ

В первом и втором случае вы работаете напрямую со строковым литералом.
В языке С у вас нет никакого контроля над const-квалификацией типа строкового литерала. Эта const-квалификация однозначно определяется языком. Тип строкового литерала в C - char [N]. И несмотря на то, что тип строкового литерала формально не содержит квалификатора const, строковый литерал тем не менее является неизменяемым (немодифицируемым) объектом. Попытки изменения строкового литерала, как и любого другого немодифицируемого объекта, ведут к неопределенному поведению.
Как вы объявляли свой указатель pstr - c const или без - на тип и свойства строкового литерала никакого влияния не оказывает. Ваш указатель не имеет никакого отношения к строковому литералу, как таковому. Ваш указатель - это не более чем путь доступа (access path) к реальному объекту. Константность пути доступа - это не более чем элемент самодисциплины, который в общем случае не связан с константностью объекта, к которому этот путь ведет. Язык С предоставляет вам средства для легального создания как константных путей доступа к модифицируемым объектам, так и неконстантных путей доступа к немодифицируемым объектам
int a = 42; const int *pa = &a; // константный путь доступа к модифицируемому объекту
const int b = 5; int *pb = (int *) &b; // неконстантный путь доступа к немодифицируемому объекту
В конечном итоге возможность легальной модификации объекта определяется именно и только модифицируемостью самого объекта и никак не зависит от константности пути доступа к нему (ибо последняя легко устранима).
Учитывая, что литерал является неизменяемым объектом, указывать на строковые литералы неконстантным указателем (как в вашем первом примере) никакого смысла нет, даже если язык и позволяет формально это делать.
В третьем варианте вы не работаете со строковым литералом напрямую, а создаете собственный модифицируемый массив, который только инициализируется значением строкового литерала. Т.е. ваш массив содержит самостоятельную копию значения строкового литерала. Это ваш собственный массив и вы можете модифицировать его как угодно.

Зачем нужен maven?

Здравствуйте, очень хотелось бы узнать, много пересмотрел и перечитал, но не могу понять. Зачем нужен Maven, если есть IDE - Eclipse, Netbeans и т.д.? В чем его преимущество по сборкам, если и IDE справляются?


Ответ

Не совсем корректный вопрос, нельзя сравнивать Maven и среды разработки. C Maven можно работать и без сред разработки. Зачем нужен? Для управления зависимостями, для сборки проектов, и для кучи всего остального полезного. К примеру, ты пишешь большой проект и используешь в нем много технологий, к примеру, Hibernate, JUnit. Возникает вопрос как подключить все библиотеки? Ответ прост - просто прописать зависимости в pom.xml, а maven их скачает за тебя. Затем возможна такая ситуация, ты хочешь показать проект другу, отправляешь ему, но вот проблема, если это не проект Maven, то твоему другу придется скачивать библиотеки, чтобы проект заработал, а так за него это сделает Maven.С ростом твоих проектов - ты сам оценишь достоинства Maven. IDE справляются - а если нет IDE на твоем компьютере?Что будешь делать? На помощь приходит Maven, он кроссплатформенный и для работы с ним достаточно командной строки.

Как определить что элемент в зоне видимости окна браузера?

Здравствуйте, как определить что элемент в зоне видимости окна браузера. Допустим есть элемент и если пользователь видит его, то отметь элемент как просмотренный. Не знаю как опередить что элемент в зоне видимости.. Подскажите как можно опеределить


Ответ

// Получаем нужный элемент var element = document.querySelector('#target'); var Visible = function (target) { // Все позиции элемента var targetPosition = { top: window.pageYOffset + target.getBoundingClientRect().top, left: window.pageXOffset + target.getBoundingClientRect().left, right: window.pageXOffset + target.getBoundingClientRect().right, bottom: window.pageYOffset + target.getBoundingClientRect().bottom }, // Получаем позиции окна windowPosition = { top: window.pageYOffset, left: window.pageXOffset, right: window.pageXOffset + document.documentElement.clientWidth, bottom: window.pageYOffset + document.documentElement.clientHeight }; if (targetPosition.bottom > windowPosition.top && // Если позиция нижней части элемента больше позиции верхней чайти окна, то элемент виден сверху targetPosition.top < windowPosition.bottom && // Если позиция верхней части элемента меньше позиции нижней чайти окна, то элемент виден снизу targetPosition.right > windowPosition.left && // Если позиция правой стороны элемента больше позиции левой части окна, то элемент виден слева targetPosition.left < windowPosition.right) { // Если позиция левой стороны элемента меньше позиции правой чайти окна, то элемент виден справа // Если элемент полностью видно, то запускаем следующий код console.clear(); console.log('Вы видите элемент :)'); } else { // Если элемент не видно, то запускаем этот код console.clear(); }; }; // Запускаем функцию при прокрутке страницы window.addEventListener('scroll', function() { Visible (element); }); // А также запустим функцию сразу. А то вдруг, элемент изначально видно Visible (element); body { height: 6000px; } #target { margin-top: 3000px; }

Элемент

Задать цвет картинке svg в файле со стилями

Имеется такое изображение в формате svg:



Не получается задать цвет в файле со стилями.
svg { fill: orange; }
В чем может быть ошибка?


Ответ

Как вариант можете добавить изображению тень:
span{ position:relative; display:inline-block; overflow:hidden; } img { transform: translateX(-100px); filter: drop-shadow(100px 0 0 orange); }

Создать массив диапазона чисел

Нужно создать строку в которой будут числа 12883, 12892-12926
Пока что есть идея создать массив и потом его перевести в строку. Думал что можно создать массив просто [12883, 12892-12926] Но ошибся. Как попроще это сделать? "Попроще" в плане минимум кода. К примеру вариант с циклом не очень нравится. Тогда уже лучше наверное как то .map воспользоватся.
Какие варианты еще?


Ответ

arr = [12883, ...Array.from(Array(35).keys(),x=>x+12892)]

Для чего нужны переменные флаги

Я только недавно натолкнулся на этот термин, и я не понимаю для чего они нужны и когда использовать.
Пример
boolean haveFive = false; // флаг наличия 5ки в массиве
int[] a = new int[10]; // массив из 10 элементов
for (int i = 0; i < 10; i++) { a[i] = new Random().nextInt(10); // инициализация массива случайными значениями от 0 до 9 if (a[i] == 5) { // если в массиве есть 5 устанавливаем флаг в true haveFive = true; } }
if (haveFive) { // выполняем некоторые действия }


Ответ

Переменная флаг – это, как правило, переменная логического типа, значение который характеризует состояние некоторого объекта. В примере haveFive переменная которая хранит состояние есть ли в массиве пятерка.
Это переменная, которую вы можете использовать для управления потоком функции, позволяя вам проверять определенные условия во время выполнения вашей функции.
if (haveFive) { // если в массиве есть пятерка // выполняем некоторые действия }

Разница между define и const [дубликат]

На данный вопрос уже ответили: Различие define и const 2 ответа В чем в C++ разница между #define и const? То есть какой из вариантов предпочтительнее и в какой ситуации, есть ли вообще разница?


Ответ

#define - это макрос препроцессора, он просто выполняет замену строки текста на своё содержимой. До c++11 его имело смысл использовать для глобальных численных констант.
const - это квалификатор типа, говорящий, что переменная не должна меняться после инициализации. Но эта инициализация где-то должна произойти, и от константности можно вручную избавиться при помощи const_cast.
В c++11 был добавлен квалификатор constexpr, который указывает на то, что переменная может как-то изменяться только во время компиляции, но не во время выполнения. Детали зависят от версии стандарта. Теперь можно без проблем объявлять статические константы, в том числе сложных типов. Например:
namespace constants{ static constexpr double g = 9.8;
struct minus_fn_impl{ template T operator () (const T& lha, const T& rha){ return lha - rha; } };
static constexpr minus_fn_impl minus_fn; }
...
double v = 5.3; double r = constants::minus_fn(v, constants::g); // не нужно инициализировать функциональный объект, как в случае std::minus

Можно ли улучшить поиск в многомерном списке python

Здравствуйте. Есть многомерный список:
spisok=[{'a':'1','b':'2'},{'a':'3','b':'4'}]
необходимо проверить есть ли в списке ключ 'a' с определенным значением. поискав в интернете смог собрать такую конструкцию:
for i in range(len(spisok)): if spisok[i]['a'] == stroka_poiska: print('True')
Можно ли как то улучшить данный код? И верна ли логика построения алгоритма?


Ответ

Попробуйте так:
def chk_for_val(lst, key, val): for d in lst: if d.get(key) == val: return True return False
При использовании dict.get(key) (вместо dict[key]) - не будут генерироваться исключения для несуществующих ключей
In [138]: chk_for_val(lst, 'a', '3') Out[138]: True
In [139]: chk_for_val(lst, 'X', '3') Out[139]: False

Преобразовать массив в переменную

Доброго всем времени суток господа // PHP echo "

";
print_r($for_x6_uyt);
echo "
";
// HTML (PHP код дает на выходе) Array ( [0] => маша [1] => лена [2] => оля [3] => юля ) Из массива охота получить переменную, в которой все значения записаны через запятую. Что-то вроде: // PHP echo $devki;
// HTML маша,лена,оля,юля В данный момент нагуглил "мсье" способ. Очень надеюсь, что это не единственное решение. В данный момент делаю так: посчитать кол-во элементов массива; в цикле приравнять к одной переменной ее + новый элемент; поскольку в п.2. добавляется запятая в конец - обрезать последний символ. Прошу подсказать, есть ли вариант быстрее, лучше?


Ответ

$devkiString = implode(',',$devki); print($devkiString); Не надо ничего мудрить. $glue = '_клей_'; //Строка, которой склеиваем элементы $elements = array('маша','оля','ксюша'); // массив склеиваемых элементов
implode($glue,$elements); вывод: маша_клей_оля_клей_ксюша

Книга по С++ НЕ для чайника [дубликат]

На данный вопрос уже ответили: Книги и учебные ресурсы по С++ 1 ответ До этого кодил на php, знаю mysql,html,js. Понимаю алгоритмы, мозг повернут правильно и сонаправлен с руками) Нужна книга для обучения C++, без разжевывания и воды но и не сильно крутая, желатьно что бы было в ней побольше примеров. Посоветуйте что-нибудь. Язык: ENG/RUS.


Ответ

Вот ещё ссылки на один интересный блог: Книги для начинающих Книги для продолжающих Да и вообще блог на мой взгляд весьма интересен, рекомендую к ознакомлению.

Закрывающийся тег php ?>

Не раз видел что в файлах пхп нет закрывающегося тега ?> //код
//закрывающегося тега нет С чем это связано и как правильно писать?


Ответ

Дык а документация по php для кого? ;)
Если файл содержит только код PHP, предпочтительно опустить закрывающий тег в конце файла. Это помогает избежать добавления случайных символов пробела или перевода строки после закрывающего тега PHP, которые могут послужить причиной нежелательных эффектов, так как PHP начинает выводить данные в буфер при отсутствии намерения у программиста выводить какие-либо данные в этой точке скрипта.

Преобразование строки в дату

Есть переменная типа стринг s="05.09.2013"; пытаюсь преобразовать в тип Date. Не получается. Подскажите, пожалуйста, в чем ошибка. SimpleDateFormat format = new SimpleDateFormat(); format.applyPattern("dd.mm.yyyy"); Date docDate= format.parse(docDate);


Ответ

dd - День MM - Месяц yyyy - год SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");

Как повернуть треугольник?

Рисую на Canvas равнобедренный треугольник посередине экрана. Рисую от центра треугольника (места пересечения медиан). Соответственно, известны экранные координаты центра треугольника и размер треугольника. Нужно иметь возможность поворачивать треугольник на произвольный (рандомный) угол по часовой стрелке. Делаю так: // Исходные данные float angle = 90; // Угол на который будем поворачивать треугольник final float height = 60; // Высота треугольника final float width = 36; // Ширина треугольника float centerX = 540; // Координаты центра треугольника на экране float centerY = 960;
// Вычисляем экранные координаты всех вершин до поворота // l1, l2, l3 - это расстояние от центра треугольника до вершины // это расстояние вычисляю по формуле √ ((X2-X1)²+(Y2-Y1)²) float x1 = centerX; float y1 = centerY - height / 2; float l1 = (float) Math.sqrt(Math.pow(centerX - x1, 2) + Math.pow(centerY - y1, 2)); float x2 = centerX + width / 2; float y2 = centerY + height / 2; float l2 = (float) Math.sqrt(Math.pow(centerX - x2, 2) + Math.pow(centerY - y2, 2)); float x3 = centerX - width / 2; float y3 = y2; float l3 = l2;
// Вычисляем координаты вершин с учетом поворота треугольника float alpha1 = (float) (Math.atan(y1 / x1) - angle); x1 = (float) (centerX + l1 * Math.cos(alpha1)); y1 = (float) (centerY + l1 * Math.sin(alpha1));
float alpha2 = (float) (Math.atan(y2 / x2) - angle); x2 = (float) (centerX + l2 * Math.cos(alpha2)); y2 = (float) (centerY + l2 * Math.sin(alpha2));
float alpha3 = (float) (Math.atan(y3 / x3) - angle); x3 = (float) (centerX + l3 * Math.cos(alpha3)); y3 = (float) (centerY + l3 * Math.sin(alpha3)); Код сделал развернутым, чтобы было понятнее, в релизе оптимизирую. Проблема в том, что координаты после поворота вычисляются неверно. Что я делаю не так? Как вычислить новые координаты после поворота треугольника?


Ответ

Поворот вокруг начальной точки на угол A, описываемый формулой: Xn = Xc * cos(A) - Yc * sin(A) Yn = Xc * sin(A) + Yc * cos(A) где Xc, Yc - координаты относительно центра поворота; Xn, Yn - новые координаты. Все что остается перейти к новой системе координат с нулевой точкой в центре треугольника выполнить поворот и потом вернуться к старой системе координат. Переход к новой системе координат выполняет по формуле: Xn = X - Ox Yn = Y - Oy Т.е. для Вашего случая получаем для каждой точки нужно сделать преобразования: x1 = (x1 - centerX) * cos(angle) - (y1 - centerY) * sin(angle) + centerX; y1 = (x1 - centerX) * sin(angle) + (y1 - centerY) * cos(angle) + centerY; Для больших подробностей откуда такие формулы и т.д. погуглите тему аффинные преобразования.

Создание макрос-функции в C++

Задача стоит написать функцию-макрос. Сама функция написано и даже один раз корректно срабатывает. Вот она:
#define maximum(x, y, r) int aa=x; int bb=y; r = ((aa) > (bb) ? (aa) : (bb))/* присвойте в r максимум из x и y */
Но при повторном вызове компилятор выдает ошибки вида:
error: redeclaration of 'int aa' error: 'int aa' previously declared here
Помогите разобраться в причине, пожалуйста


Ответ

Прежде всего мне представляется, что вы имели в виду что-то подобное:
#define maximum(x, y, r) \ do { int aa = ( x ); int bb = ( y ); ( r ) = bb < aa ? aa : bb; } while ( false )
Предвидя ваш вопрос, почему используется конструкция do-while, скажу, чтобы, например, этот макрос можно было бы использовать в if-else предложении:
if ( x > 0 && y > 0 ) maimum( x, y, r ); else maximum( x = -x, y = -y, r );
Ниже представлена демонстрационная программа
#include
#define maximum(x, y, r) \ do { int aa = ( x ); int bb = ( y ); ( r ) = bb < aa ? aa : bb; } while ( false )
int main() { int x = -10, y = -5, r;
if ( x > 0 && y > 0 ) maximum( x, y, r ); else maximum( x = -x, y = -y, r );
std::cout << "x = " << x << ", y = " << y << ", r = " << r << std::endl; }
Ее вывод на консоль:
x = 10, y = 5, r = 10
Что касается вашего определения макроса, то он постоянно определяет переменные aa и bb в той области видимости, где макрос вызывается.
#define maximum(x, y, r) int aa=x; int bb=y; r = ((aa) > (bb) ? (aa) : (bb))
Поэтому компилятор выдает сообщение об ошибке, что эти переменные были уже определены, если макрос вызывается более одного раза.
Использование макросов в C++ - это анахронизм. Лучше использовать встраиваемые функции, то есть функции со спецификатором inline. Более того в C++ уже есть стандартная функция std::max. Поэтому вы могли бы просто написать
r = std::max( x, y );
Имейте в виду, что поведение вашего макроса отличается от поведения аналогичной стандартной функции std::max. Ваш макрос в случае равенства x и y возвращает y, тогда как стандартная функция std::max возвращает x. И кроме того вы используете оператор > тогда как стандартная функция использует оператор <. Для фундаментальных типов это может не играть существенной роли, тогда как для определенных пользователем типов это имеет важное значение.
А самое главное - ваш макрос нельзя использовать в выражениях. Это ограничивает его применение.

В чем разница между DISTINCT и GROUP BY?

Читаем:
Оператор SQL DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца. Оператор SQL GROUP BY используется для объединения результатов выборки по одному или нескольким столбцам.
В результате работы с этими предикатами мы получаем уникальные записи по какому либо ключу. Не могу понять в чем их различие.
---- Добалено -----
В моем понимании что GROUP BY - это группировка по какому либо признаку, а то есть например есть поле со значениями:
1 2 3 1 2 3
после GROUP BY они должны стать:
1 1 2 2 3 3
а на деле получаем:
1 2 3
В чем причина?


Ответ

DISTINCT - получить уникальные строки (отличающиеся друг от друга любым отображаемым полем). Работает чуть быстрее.
GROUP BY - сгруппировать по какому-либо признаку, при этом можно использовать агрегатные функции SUM, AVG, MAX и т.д.
Добавлено
Дано
1 2 3 1 2 3
С помощью ORDER BY получим сортировку
1 1 2 2 3 3
С помощью DISTINCT уникальные значения
1 2 3
А с помощью GROUP BY можно посчитать кол-во вхождений
SELECT value, COUNT(*) FROM table_test value COUNT(*) 1 2 2 2 3 2

Шансы и варианты

Есть несколько функций, и меняющиеся шансы для их вызова:
void a() { } void b() { } void c() { }
float aChance = 0.3f; float bChance = 0.1f; float cChance = 0.6f;
Я понимаю, что нужно сгенерировать шанс (0.0f - 1.0f) и сравнить с aChance, bChance и cChance. Но тогда, если шансы двух переменных одинаковы, вызываться будет та функция, которая первой стоит в if-else if-else.
Какой здесь нужен алгоритм? Спасибо!


Ответ

Задача может решаться с помощью стандартного шаблона распределения std::discrete_distribution
std::discrete_distribution<> dist({ список вероятностей }); std::cout << dist(генератор);
Пример использования:
#include #include #include
int main() { std::random_device rd; std::mt19937 gen(rd()); std::discrete_distribution<> dist({ 0.3, 0.1, 0.6 });
std::map m; for (int n = 0; n < 10000; ++n) ++m[dist(gen)];
for (auto p : m) std::cout << p.first << " generated " << p.second << " times
"; }
0 generated 2980 times 1 generated 1002 times 2 generated 6018 times
Ссылка на рабочий пример.

Определение типа

Как определить тип результата арифметического выражения?


Ответ

Операнды арифметических типов в под-выражениях должны быть приведены к общему типу, чтобы можно было выполнить операцию и получить тип результирующего выражения.
Процесс получения общего типа для операндов операций и выведения результирующего типа носит название обычных арифметических преобразований - usual arithmetic conversions
Порядок преобразование типов операндов арифметических типов в выражениях определяется следующим образом, как это описано в разделе 5 Expressions стандарта C++:
—(10.2) If either operand is of type long double, the other shall be converted to long double.
То есть если один из операндов имеет тип long double, то второй операнд приводится к тому типу.
—(10.3) Otherwise, if either operand is double, the other shall be converted to double.
Иначе, если один из операндов имеет тип double, то второй операнд также должен быть приведен к этому типу.
—(10.4) Otherwise, if either operand is float, the other shall be converted to float.
Иначе, если один операнд имеет тип float, то второй операнд также должен быть приведен к этому типу.
—(10.5) Otherwise, the integral promotions (4.5) shall be performed on both operands.61 Then the following rules shall be applied to the promoted operands:
Иначе применяется целочисленное приведение типов.
—(10.5.1) If both operands have the same type, no further conversion is needed.
Если после этого типы совпадают, то дальнейшие преобразования не производятся.
—(10.5.2) Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank shall be converted to the type of the operand with greater rank.
Иначе если оба операнда имеют беззнаковый или знаковый тип, то операнд с меньшем рангом преобразуется к типу операнда с большим рангом.
—(10.5.3) Otherwise, if the operand that has unsigned integer type has rank greater than or equal to the rank of the type of the other operand, the operand with signed integer type shall be converted to the type of the operand with unsigned integer type.
Иначе, если операнд беззнакового целого типа имеет ранг больший или равный рангу знакового целого типа второго операнда, то второй операнд преобразуется к типу беззнакового целого типа первого операнда.
—(10.5.4) Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, the operand with unsigned integer type shall be converted to the type of the operand with signed integer type.
Иначе если операнд знакового целого типа может представить все значения беззнакового целого типа второго операнда, то второй операнд преобразуется к типу первого операнда.
—(10.5.5) Otherwise, both operands shall be converted to the unsigned integer type corresponding to the type of the operand with signed integer type.
Иначе оба операнда должны быть преобразованы к беззнаковому целому типу, соответствующему знаковому целому типу первого операнда.
Вот простой пример
Имеются два объявления
long int x = 0; unsigned int y = 0;
и оба типа, long int и unsigned int, занимают 4 байта
Спрашивается, какой тип будет у варажения
x + y
Уверяю вас, что многие программисты, которые не читали этот раздел стандарта, будут не в состоянии ответить на этот вопрос:)
Ответ: согласно последнему подпункту цитаты типом выражения будет unsigned long int
Имейте в виду, что ранг типа long int всегда больше ранга int и, соответственно, ранга unsigned int

Нужен алгоритм сравнения кастомных объектов

Понадобилось сделать сравнение. Есть 2 листа объектов одного типа (field1 и field2 в примере). У объекта есть 3 строковых параметра (имя, фамилия, отчество). В первом объекте есть записи о 3-х людях со всеми заполненными полями, т.е. он выглядит примерно так:
Имя Фамилия Отчество Юрий Карамазин Александрович Виктор Сушко Григорьевич Саша Князев Альбертович
И второй объект, в котором записи о тех же 3-х людях, но хранятся только имена:
Имя Юрий Виктор Саша
Мне необходимо сравнивать только параметр объекта "имя". Пытаюсь сравнивать как-то так:
for (FieldOfTest x : field1) { for (FieldOfTest y : field2) { Assert.assertTrue(x.getName().equals(y.getName()), "First value: " + x.getName() + " , second value: " + y.getName()); } }
Второй for прокручивает полный список. Как мне сравнивать 1 объект из первого списка с одним объектом второго списка?


Ответ

Если сравнивать нужно только элементы, находящиеся на одинаковых индексах, то достаточно использовать один for, предварительно убедившись, что массивы равной длины:
public static void main(String[] args) { List field1 = new ArrayList<>(); field1.add(new FieldOfTest("Юрий", "Карамазин Александрович")); field1.add(new FieldOfTest("Виктор", "Сушко Григорьевич")); field1.add(new FieldOfTest("Саша", "Князев Альбертович")); List field2 = new ArrayList<>(); field2.add(new FieldOfTest("Юрий", null)); field2.add(new FieldOfTest("Виктор", null)); field2.add(new FieldOfTest("Саша", null)); System.out.println("Data is correct: " + isCorrectData(field1, field2)); }
private static boolean isCorrectData(List field1, List field2) { if (field1.size() != field2.size()) { return false; } boolean isCorrect = true; for (int i = 0; i < field1.size(); i++) { if (!field1.get(i).getName().equals(field2.get(i).getName())) { isCorrect = false; break; } } return isCorrect; }
Реализация на Java.

Почему не декодируется base64 из склеенных строк?

Доброго всем! Есть строка, которая выдает ошибку при конвертации:
0JTQsNGA0LjQvCDRgdC60LjQtNC60YMg0L3QsCDQvdC+0LLQvtCz0L4=0LTQvdC40LUg0L/QvtC00LDRgNC60Lgh
При чем отдельные ее части:
0JTQsNGA0LjQvCDRgdC60LjQtNC60YMg0L3QsCDQvdC+0LLQvtCz0L4=
и
0LTQvdC40LUg0L/QvtC00LDRgNC60Lgh
Декодируются нормально, но если их соединить, то ошибка. Проверял себя через декодер Лебедева https://www.artlebedev.ru/decoder/advanced/
Как это можно решить?


Ответ

Base64 конвертирует 3 байта в 4 символа, соответственно возникает проблема выравнивания длины байтов (набор байтов должен быть кратен 3), для чего и применяется символ (1 или 2) =, который как и написали в комментариях не может стоять в середине, а всегда в конце
Ваша исходная строка Дарим скидку на новогодние подарки! должна конвертироваться в строку:
0JTQsNGA0LjQvCDRgdC60LjQtNC60YMg0L3QsCDQvdC+0LLQvtCz0L7QtNC90LjQtSDQv9C+0LTQsNGA0LrQuCE=
которая, как нетрудно заметить слегка отличается от ваших строчек:
0JTQsNGA0LjQvCDRgdC60LjQtNC60YMg0L3QsCDQvdC+0LLQvtCz0L4= 0LTQvdC40LUg0L/QvtC00LDRgNC60Lgh
Короче говоря, нельзя просто так и взять конкатенировать base64 строки

Как сложить цифры введенные из prompt?

Как сложить цифры введенные из prompt()?
Код JS:
var a = prompt("1", ''); var b = prompt("2", ''); var c = a + b; alert(c);


Ответ

Вы получаете строки, а не числа. Чтобы сложить их как числа, нужно преобразовать их например с помощью функции parseInt
var a = parseInt(prompt("1", '')); var b = parseInt(prompt("2", '')); var c = a + b; alert(c);

Как сделать такие пятиугольники (+адаптивные) через css?

Думаю, что их стоит сделать svg polygon, но как это лучше реализовать, чтобы они и адаптивными были и подгонялись под ширину блока, в котором находятся?


Ответ

Решение SVG
Решение адаптивно. Работает во всех браузерах.
Вёрстка не сломается при изменении масштаба, так как все оформительские элементы: текст, патч, градиент находятся внутри SVG Если будет необходимость поменять начальные размеры блока, то нужно изменить проценты родительского контейнера .container
.container { width: 30%; height: auto; box-shadow: 0 0 4px #131824; }

Standard 24.0 Five User

Не могу найти правильный подход к изучению Java и разработки под Android

я начинающий программист, изучаю Java и хочу изучать разработку под Android. Проблема в том, что я не могу найти правильный подход к изучению, и меня это сбивает с толку. Правильней будет : изучать Java походу разработки Android приложения или прочекать всю теорию Java,а затем начинать что-то разрабатывать в Android Studio?


Ответ

Сначала нужно прочитать любую книгу по java или пройти курс. Советую "Изучаем Java" Кэти Сьерра, Берт Бэйтс.
Советую ее, потому что она максимально быстро вводит в курс дела, читается легко, с картинками, то что нужно для начинающих. Примеры в книге делайте только, если не понимаете код этого примера. Эта книга дает азы java, которых хватит для android. Там есть раздел swing. Пропускайте его. Это 12 и 13 глава. 15 и 18 тоже можете пропустить, а можете и прочитать для развития. В андроиде все это не используется.
Ее можно быстро прочитать, получить основы. Я прочитал за месяц примерно, но читал всю.
Далее начинаете изучать android. Главные критерии ресурса: постоянные обновления и известность. Android очень быстро меняется, поэтому всегда нужно изучать самые свежие ресурсы. Все что старее 2016 лучше не смотреть. Есть три хороших ресурса:
startandroid книга Android для профессионалов курс от гугл на Udacity
Вот плотно изучайте эти ресурсы и параллельно делайте какое-то приложение. Вот и все.
Алгоритм можете быть такой: берете за основу udacity и делайте все по нему. В книгу смотрите, если не понимаете ничего на английском, или хотите решить какую-то специфическую задачу.
Startandroid - на сайте есть отличные пошаговые руководства по новым библиотекам, например: room, dagger , rxjava. В будущем они вам очень понадобятся, потому что сейчас они уже почти везде используются.
P.S. Почему не стоит углубляться в java?
Потому что android довольно однотипный и все нюансы java вам не нужны. Вам главная база, чтобы понимать, что происходит в коде. А нюансы вы уже будете изучать на своих приложениях в андроиде
P.S.S. Мое личное мнение
Старайтесь долго не застревать на обычных активити, фрагментах, интентах. Core Android большой и его можно долго изучать. Достаточно пару приложений на 2-3 экрана. Не делайте огромных приложений,которые вы будете разрабатывать по 3 месяца.Это будет тормозить ваш прогресс.
Стремитесь понять архитектурные паттерны и современные библиотеки, которые облегчат вам разработку больших приложений и помогут устроиться на работу. Вот примерный стек:
Архитектура: MVP, MVVM, SOLID, Clean Architecture, Architecture Components
Библиотеки-боссы(долго изучать): Rxjava2, Dagger
Библиотеки-ништяки: Retrofit, Okhttp, ButterKnife, Room, Picasso, GSON. Их изучать можно сразу же, потому что они облегчат вашу жизнь.

25 / 100 = 0, Почему?

Мне нужно по некой формуле высчитать результат, но это не удается потому что в ней используется деление числа 25 на число 100. Все это выглядит примерно так:
double i = 25 / 100; // В этом случае будет выводиться 0, а мне нужно 0.25
В чём здесь проблема?


Ответ

У Вас в действии int-операнд 25 делится на int-операнд 100. Соответственно и деление происходит целочисленное. Для ожидаемого Вами результата необходимо хотя бы один из операндов привести к типу double. Например: double i = 25 / 100d;

Как разбить число на разряды (тысячи, миллионы и т.д.)?

Фото. Лайки. При достижении 1 000 или 10 000 лайков, цифры выводятся таким образом:
Like 1000 или Like 10000
Интересует, как разделять тысячные, миллионные и т.п значения, чтобы например, было так
Like 10 000.
Возможно, в PHP есть стандартная функция, которая этим занимается?


Ответ

number_format(10000, 0, '', ' ');
http://php.net/manual/ru/function.number-format.php

Как отловить любое исключение

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


Ответ

Нашел способ, все исключения наследники java.lang.Throwable. Все работает, исключение выбрасывается, поток не умирает.
try{ if(run.run(i, us, adminPermission))runer = true; }catch (java.lang.Throwable e){ e.printStackTrace(); }

Часовой пояс в Date

Класс Date в Java может возвращать время в миллисекундах, а из какой timezone он возвращает, текущей или из UTC?


Ответ

Объект Data возвращает вам системное время вашей машины и только. Можно программно изменить время на машине.
Date dataCurrent=new Date();
System.out.println(dataCurrent);
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
Date dataNewZone=new Date();
System.out.println(dataNewZone);
Вывод программы
Wed Sep 21 17:47:40 MSK 2016 Wed Sep 21 07:47:40 PDT 2016
Время в милисекундах одинаково для всех часовых поясов.

подделка сессии

Допустим с помощью php создаю сессию:
$_SESSION['user_id'] = 22;
Браузер я так понимаю, создает cookie с id юзера в зашифрованном виде (скажем с помощью md5). То есть если генерировать с помощью md5 user_id другой (17 к примеру) и заменить cookie, то получается можно получить доступ к юзеру с id 17? Или я что-то не понимаю?


Ответ

У каждой PHP сессии уникальный код который нельзя так просто подобрать, а все данные сессии хранятся только на сервере этот "уникальный код" который устанавливается в cookie т.е работает так
Юзер заходит на сайт (при запросе на скачивание html в HTTP заголовках возвращается запрос на установку в cookie с названием PHPSESSION уникального кода который не зависит от $_SESSION['user_id'] = 22;) Потом браузер просто с этим ключом обращается к серверу
Проще говоря можно представить что $_SESSION это файл сессии, user_id ячейка в этом файле, а 22 это значение ячейки user_id
P.s данные сессии не как нельзя получить на стороне пользователя (если их только самому не отдать ему к примеру выводом через echo $_SESSION['user_id'];)

Как создать полу дугу [закрыт]

Как создать полу дугу, создаю дугу с помощью border-bottom:1px solid #000; это полная дуга, а как сделать ее половинку(или больше половины), идея такая 30% этой дуги желтая, остальная зеленая.


Ответ

.b-circle{ margin: 15px auto; width: 200px; height: 200px; background: #ccc; border-radius: 50%; overflow: hidden; position: relative; } .b-circle:before{ content: ''; position: absolute; top: 10px; left: 10px; width: calc(100% - 20px); height: calc(100% - 20px); background: #fff; z-index: 1; border-radius: 50%; } .b-circle > span{ position: absolute; } .b-circle > span:nth-of-type(1){ top: 0; height: 50%; width: 100%; /*background: #FD6347;*/ } .b-circle > span:nth-of-type(1):before{ content: ''; position: absolute; top: 0; left: 0; width: 30%; height: 100%; background: yellow; } .b-circle > span:nth-of-type(1):after{ content: ''; position: absolute; top: 0; left: 30%; width: 70%; height: 100%; background: green; } .b-circle > span:nth-of-type(2){ top: 50%; height: 50%; width: 100%; background: #008080; }


Java generics как работает?

Я пишу:
Class a = n.getClass();
Метод getClass() должен вернуть объект описывающий класс и присвоить его переменной а
Но вот это часть мне не понятна Class. Что это за тип переменной такой и куда переменную а теперь вообще можно использовать? Хочу понять как это работает. Помогите разобраться. особенно знак вопроса убивает здесь что-то общее с тернарной операцией?


Ответ

Примеры
Обозначение типа параметра

public static double sumOfList(List list) { double s = 0.0; for (Number n : list) s += n.doubleValue(); return s; } public static void printList(List list) { for (Object elem: list) System.out.print(elem + " "); System.out.println(); }
Поле класса и тип возвращаемого значения

public class ClassContainer { private List list;
public ClassContainer(List list){ this.list = list; }
public List getList(){ return this.list; } }

Почему консоль пикает? [закрыт]

static void Main(string[] args) { byte[] data = new byte[] { 8, 8, 3, 8, 5, 6, 7, 8 }; Console.WriteLine(Encoding.UTF8.GetString(data)); Console.ReadLine(); }
С чего бы это?


Ответ

И правда, с чего бы ей пикать при выводе символа с кодом 7 - BEL (Bell, он же звонок)?

Заполнение матрицы квадратной матрицы с конца

Помогите как заполнить матрицу 3х3 такими же числами в таком же порядке. Умею заполнять двумерный массив, но вот такие правила заполнения не имею описывать.
Картинка в качестве примера:

Вот так заполняю и вывожу обычно, как это можно исправить?
int[] number = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[,] matrix = new int[3, 3]; int index = 0; for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) { matrix[i, j] = number[index]; index++; }
for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) if (j == matrix.GetLength(1) - 1) Console.Write(matrix[i, j].ToString() + "
"); else Console.Write( matrix[i, j].ToString() + "\t");


Ответ

Например, так:
const int max = 3; int[,] matrix = new int[max, max]; int curr = 1; for (int diff = 1 - max; diff <= max - 1; diff++) { for (int i = 0; i < max; i++) { int j = i - diff; if (j < 0 || j >= max) continue; matrix[i, j] = curr++; } }
Проверяем:
for (int i = 0; i < max; i++) { for (int j = 0; j < max; j++) Console.Write(matrix[i, j] + " "); Console.WriteLine(); }
Результат:
4 2 1 7 5 3 9 8 6

Пояснение: У клеток каждой диагонали разность координат y и x постоянна. Минимальная разность для «самой верхней» диагонали, в ней лишь клетка (max - 1, 0), разность равна 1 - max. Минимальная разность для «самой нижней» диагонали, в которой клетка (0, max - 1) равна, разумеется, max - 1. Внешний цикл по этим самым диагоналям. Одна разность — одна диагональ.
Затем, в каждой диагонали проводим цикл по x-координате (в коде обозначена как i). Она может быть от 0 до max - 1. Но например для первой диагонали не все x возможны, т. к. в ней только один элемент. Поэтому мы действуем так: вычисляем x, имея разность y - x == diff, вычисляем y (в коде j). Проверяем, чтобы y опадало в промежуток от 0 до max - 1
В каждую найденную клетку записываем следующее число. Текущее число хранится, понятно, в переменной curr, и увеличивается на единицу после каждой записи в матрицу.

Как отсортировать 3 элемента?

Недавно начал учить Java и в качестве практической задачи нужно написать приложение, которое должна сравнивать 3 возраста и выдавать результат, кто самый старший, младший и между ними.
Так же была дана "методичка" в которой изложена суть логики всего этого. Но или я дурак, или лыжи не едут, но именно такое решение задачи мне просто не дается. Я просто путаюсь что с чем уже сравнивал и не могу двинуться дальше.
Я не прошу решения этой задачи, просто подскажите - какие еще варианты решения этой задачи можно использовать ? Метод решения, на котором настаивает учитель мне не подходит.
public class Loader { public static void main(String[] args) { Integer damirAge = 30; Integer tolanAge = 25; Integer uraAge = 55; Integer oldest; Integer youngest; Integer middle;
if (damirAge >= tolanAge && damirAge >= uraAge) oldest = damirAge; else if (tolanAge >= damirAge && tolanAge >= uraAge) oldest = tolanAge; else oldest = uraAge;
if (damirAge <= tolanAge && damirAge <= uraAge) youngest = damirAge; else if (tolanAge <= damirAge && tolanAge <= uraAge) youngest = tolanAge; else youngest = uraAge;
if (damirAge >= tolanAge && damirAge <= uraAge) middle = damirAge;
else if (tolanAge >= uraAge && tolanAge <= damirAge) middle = tolanAge; else middle = uraAge;
System.out.println("Most young " + youngest); System.out.println("Middle " + middle); System.out.println("Most old " + oldest); } }


Ответ

Думаю, что задание предполагало всё-таки освоение логики вложенных операторов if.
По анализу математической подоплёки: Возможных результатов (перестановок) может быть 6 (если не учитывать случаи равенства). На получение 6 исходов нужно по меньшей мере 2.58 бита информации, т.е. эта задача требует в идеале выполнения не более трёх сравнений. Это в данном случае реализуемо - сравнений будет 2 или 3 (в среднем 2.667):
if A > B: if A > C: if B > C: A B C else: A C B else: C A B else: if B > C: if C > A: B C A else: B A C else: C B A

К чему относится оператор разыменовывания в Си?

В разных источниках встречаю разное написание
int *address_0f_x = &longitude; int* address_0f_x = &longitude; int * address_0f_x = &longitude;
Компилируются все варианты, мне нравится второй, но к чему всё-таки правильно относить *?


Ответ

К переменной. Только это не разыменование, а объявление указателя.
Пишите, как хотите, только помните, что
int *p1, *p2;
объявление двух указателей, а
int* p1, p2;
указателя p1 и переменной p2 типа int

Переписать или отлаживать дальше? [закрыт]

Написал прогу, тестовое задание для приема на работу. Код вышел крайне кривой. Т.е. он-то работает, но малейшая ошибка (при изменении исходных данных или еще что-либо) разбивает его вдребезги.
Вот собственно хочу спросить совета у бывалых, что лучше делать в таких случаях: пытаться дописать, довести до ума получившееся "УГ" или все-таки лучше взять и переписать все на чистовик, абы сверкало и не глючило?
Просто я так подумал, если я так все время буду делать, это ж сколько времени уйдет даром, если так вот код переписывать всякий раз, когда мне в нем что-то не нравится.


Ответ

Думаю, что если вы сами не понимаете как ведет себя ваша же программа, то ее обязательно надо переписать. Тем более, что она - тестовое задание. И не просто переписать, а показать, на что вы способны по-максимуму. А за время не беспокойтесь - опыт останется при вас, так что вы даже скорее найдете работу при качественном выполнении тестового заданий.

Паттерн ООП, ограничивающий количество экземпляров класса по аттрибуту

Как организовать невозможность в программе существования нескольких экземпляров одного класса с одинаковым значением определенного атрибута? Как называется такой паттерн ООП (если он есть)? Пишу приложение на JAVA, многопоточное, но примеры интересны на различных языках программирования (естественно с ООП парадигмой).


Ответ

В общем случае наиболее подходит под вашу задачу паттерн Factory. В частном случае, когда разрешен всего 1 объект это классический Singleton. Единственное, я бы не стал возлагать на паттерн задачу безопасности ибо что Singleton, что Factory ломаются на раз-два. Update Применительно к Java такой способ ведь действительно существует и часто используется в реальной жизни - например кэширование пула коннектов (например JDBC). Как известно, коннект ресурс достаточно дорогой и ценный и если по ходу пьесы коннект берется во многих местах имеет смысл организовать кэширование коннектов с ограничением количества оных. Вполне аналогично также и ставится ограничение на количество окон в системе. Да в том же Android'е надысь писал такую штуку. Ставится корневой класс - прародителей всех Activity и вперед создавать списочек, контроль все как надо. Так что надо попроще и без кошачьих завихрений, а то совсем ужо замутили головы boost commiter, перегрузка операторов... P.S. Ну вы млин даёте :)

Поставить троеточие в не вместившейся в поле текст

На многих сайтах видно, что невместившейся текст обрезается, ставится троеточие и ссылка "подробнее".
В CSS нашел свойство text-overflow, но оно обрезает сразу на первой строке. Как добиться того, чтобы текст обрезался на 3 или 4 строке допустим?


Ответ

с помощью PHP можно делать вот так к примеру: $text = "Допустим здесь ваш текст из 1000 символов"; $text = mb_substr($text,0,140, 'UTF-8'); //140 это кол. знаков echo $text.'...'; Это самый простой пример { $text1 = "Допустим здесь ваш текст из 1000 символов"; $text = mb_substr($text1,0,140, 'UTF-8'); //140 это кол. знаков $str_count = substr_count($text," "); // возвращает количество пробелов $text = explode(" ", $text1); //количество слов for($i=0;$i<$str_count; $i++){ echo $text[$i].' '; } echo "..."; }

Запятые и точки в дробных числах в си при вводе чисел

Интересно почему сразу заканчивается выполнение программы при попытке ввода дробных чисел с точкой, а не с запятой, хотя в самом коде используются точки? Не оставляю кода потому что считаю это бессмысленно? Кто-то может мне разъяснить этот вопрос?


Ответ

На самом деле многие библиотечные функции используют текущую локаль. В частности, от текущей локали зависит, какой разделитель целой и дробной части ожидают увидеть функции. При запуске программа наследует системную локаль, похоже в вашем случае это русская локаль. В качестве демонстрации приведу программу: #include #include #include #include
void test(const char* str) { printf("%s => ", str); char* endptr; double num = strtod(str, &endptr); // Checking if whole string parsed if (endptr != str + strlen(str)) { printf("ERROR"); } else { printf("%lf", num); } printf("
"); }
void locale_info() { printf("Current locale: %s
", setlocale(LC_NUMERIC, NULL)); printf("Current delimiter: '%s'
", localeconv()->decimal_point); }
int main() { const char* dot = "10.5"; const char* comma = "10,5"; setlocale(LC_ALL, "en_US.utf8"); locale_info(); test(dot); test(comma); setlocale(LC_ALL, "ru_RU.utf8"); locale_info(); test(dot); test(comma); } У меня программа выводит: Current locale: en_US.utf8 Current delimiter: '.' 10.5 => 10.500000 10,5 => ERROR Current locale: ru_RU.utf8 Current delimiter: ',' 10.5 => ERROR 10,5 => 10,500000 Видно, что в зависимости от локали, программа по разному интерпретирует одни и те же данные. Чтобы избежать таких неожиданностей, можно при запуске программы устанавливать стандартную локаль для числовых данных: setlocale(LC_NUMERIC, "C");