Страницы

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

вторник, 23 апреля 2019 г.

Какая разница между id и class в css

Сообственно говоря, вопрос сформулирован в названии темы?


Ответ

id имеет более высокий приоритет в css, чем class. id должен быть уникальным на весь html документ. class можно комбинировать с другими классами, через пробел, а id нет. id создаёт объект с таким же именем в пространстве window, доступ к которому можно получить через js. Например:

Мир

Привет

Что означает -lstdc++ в C++?

Есть такая строчка в cmd:
gcc test.cpp -o test555 -lstdc++
Что означает -lstdc++ и как расшифровывается?


Ответ

параметр -l говорит компоновщику подключить библиотеку. В данном случае - libstdc++. Библиотеки указываются без префикса"lib" Эту команду можно сократить, если использовать g++
g++ test.cpp -o test
g++ подключает libstdc++ автоматически

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

Нужна проверка на присутствие в строке символов. Строка должна содержать только символы кириллицы, латиницы, пробелы и ничего кроме. Пробовал как в js регулярку составить, но почему-то работает совсем неправильно!
if (preg_match("/[^A-zА-я]/","daksks sdsd ывыв1234234") == 0) { echo "Да"; }


Ответ

preg_match( "/[^a-zа-яё ]/iu", $text );
Только кириллица, латиница и пробел.

Как передать массив в varargs?

Я использую AsynTask и он принимает на параметр на вход varargs
Как передать массив в varargs?


Ответ

Класс AsyncTask использует дженерики при создании класса наследника - первый параметр - тип входных данных, второй - данные для оповещения о прогрессе задачи, третий - тип выходных данных.
private class MyAsyncTask extends AsyncTask {
@Override protected String doInBackground(String... params) {
List list = new ArrayList<>(); for (int i=0; i return null; } }
Передать массив в AsyncTask можно так
String[] arr = new String[] {"one", "two", "three"}; new MyAsyncTask().execute(arr);
либо
new MyAsyncTask().execute("one", "two", "three", "four");

Нужно сделать автоматическое увеличение числа

Хочу сделать игровой проект, где будет своя внутренняя валюта. Хочу сделать, чтобы при проигрыше внутренней валюты, она автоматически начала пополняться и останавливаться на фиксированном ограничении.
Допустим, у игрока 50 фишек, он их проиграл, стало 0 - в этот момент они должны начать пополняться и останавливаться, допустим, на 50. Можно по 10 каждые 10 минут, можно по 1 каждую минуту, непринципиально,если кто понял о чем речь, подкиньте, пожалуйста, код. Можно формальный, хотя бы чтобы разобраться. Заранее спасибо)


Ответ

Нужно как-то отметить время, когда всё потрачено до нуля и включить игроку временный режим «накопление денег за время».
Далее количество валюты становится функцией времени:
start = XXX; // время когда упало до 0 mode = "earning"; // игрок находится в режиме накопления за время now = (new Date).getTime(); // время сейчас money = Math.floor((now - start) / N) * K; if( money > 50) { mode = "game"; // больше нет режима накопления money = 50; }
Продумайте момент, когда во время накопления за деньги, игрок как-то ещё умудрился заработать несколько монет – что делать тогда?

Поясню строку money = Math.floor((now - start) / N) * K;. Это школа, линейная алгебра – нам нужна функция, растущая от 0 в точке start. В простом варианте это y = k * (x - start), где k некий коэф. скорости роста. Но так будут дробные значения, а вы пишете в вопросе про дискретные – «по 10 каждые 10 минут, можно по 1 каждую минуту».
Т.е. график роста не наклонная линия, а ступеньки по целым значениям. Поэтому добавлено округление:

Как подобрать коэффициенты N и K. Не углубляясь в объяснение, вот рецепт. Если надо чтобы раз в минуту (60 секунд) на 1, делим на N=60 и можно не умножать. Если раз в 10 минут (600 секунд) на 10, делим на N=600, и умножаем на K=10

Double to Binary

Подскажите пожалуйста методы для перевода чисел в двоичный вид. Для чисел типа Integer есть статический метод toBinaryString(int I). А теперь очень нужен метод для перевода чисел типа Double, однако похожего метода в Double я не нашел.


Ответ

Ссылаясь на ответ на enSO
Long.toBinaryString(Double.doubleToRawLongBits(d)) должно прекрасно работать.
System.out.println("0: 0b" + Long.toBinaryString(Double.doubleToRawLongBits(0D))); System.out.println("1: 0b" + Long.toBinaryString(Double.doubleToRawLongBits(1D))); System.out.println("2: 0b" + Long.toBinaryString(Double.doubleToRawLongBits(2D))); System.out.println("2^900: 0b" + Long.toBinaryString(Double.doubleToRawLongBits(Math.pow(2, 900)))); System.out.println("Double.MAX_VALUE: 0b" + Long.toBinaryString(Double.doubleToRawLongBits(Double.MAX_VALUE)));
/* выведет: 0: 0b0 1: 0b11111111110000000000000000000000000000000000000000000000000000 2: 0b100000000000000000000000000000000000000000000000000000000000000 2^900: 0b111100000110000000000000000000000000000000000000000000000000000 Double.MAX_VALUE: 0b111111111101111111111111111111111111111111111111111111111111111 */

Не изменяется указатель в Delphi

ToDel := root^.right; ToDel := ToDel^.right;
После этих 2 строчек кода root^.right не изменяется.
root^.right := root^.right^.right;
А после этой изменяется , как сделать что бы в первом случае также изменялось ?
TNode = ^Node; Node = record key :TKey; data :TData; left, right,parent:TNode; end; root : TNode; ToDel: TNode;


Ответ

Все логично. ToDel := root^.right; копирует указатель из right в ToDel. Указатель в root и не должен поменяться. Если вам нужно поменять root, делайте так:
ToDel := root^.right; root^.right := ToDel^.right; // здесь нужно освободить память, на которую указывает ToDel, если она вам больше нужна.

P.S. Типы для структур лучше называть с буквой T в начале (от слова Type), а типы для указателей называть с буквой P в начале (от слова Pointer). тогда будет проще и вам и другим разбираться в вашем коде.
PNode = ^TNode; TNode = record key: TKey; data: TData; left: PNode; right: PNode; parent: PNode; end;