Страницы

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

суббота, 28 декабря 2019 г.

Как сделать эффект растущей цены (на подобие таймера)?

#javascript #jquery


На странице указана цена 126 рублей 00 копеек. Нужно эту цену каждую минуту увеличивать
на 1 рубль. И также в течение минуты должны увеличиваться копейки, которые показывают,
что цена растет. Как это можно реализовать? Если с рублями все понятно, используем
setInterval и через каждые 60000мс пребавляем 1, то с копейками не могу сообразить.
    


Ответы

Ответ 1



Решение с неточным таймером. var price = 126.00; updatePrice = function() { document.getElementById("price").innerHTML = XFormatPrice(price); price+=(100/60)/100; } updatePrice(); setInterval(updatePrice, 1000); function XFormatPrice(_number) { var format_string = '# руб.'; var r=parseFloat(_number) var exp10=Math.pow(10,2); r=Math.round(r*exp10)/exp10; rr=Number(r).toFixed(2).toString().split('.'); b=rr[0].replace(/(\d{1,3}(?=(\d{3})+(?:\.\d|\b)))/g,"\$1"+' '); r=(rr[1]?b+ ',' +rr[1]:b); return format_string.replace('#', r); }


Ответ 2



Нужно заякорить момент во времени(начало отсчёта) и связать его с ценой. Потом можно часто вызывать функцию пересчёта, и обновлять цену, в зависимости от пройденного от начала времени. var costEl = document.getElementById('cost'); var velocity = 1/60; // рубль в минуту var start = Date.now(); var startCost = parseFloat(costEl.innerText); setInterval(function(){ var now = Date.now(); var secs = (now - start) / 1e3; var newCost = (startCost + secs*velocity).toFixed(2); costEl.innerText = newCost; }, 100); 100.00

Ответ 3



var velocity = 100; setInterval(function(){ var h = $('#hundredths').text(); var r = $('#roubles').text(); if(++h == 100){ h = 0; r++; } $('#hundredths').text((h < 10 ? '0' : '') + h); $('#roubles').text(r); }, velocity); Цена, руб. 126.00

Ответ 4



Используйте оператор % - остаток от деления: Тест (ускорен): var x=0 setInterval(function(){ x++ console.log(x%100) },60000/1000)

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

#javascript


Нужно создать строку в которой будут числа
12883, 12892-12926

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

Какие варианты еще?
    


Ответы

Ответ 1



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

Ответ 2



var s = "12883, 12892-12926" var res = s.replace(/\s/g, '').replace(/(\d+)-(\d+)/g, function (m, l, r) { var res = l while (++l<=r) { res += "," + l } return res; }) console.log(res)

Ответ 3



var inputStr = '12-13'; var arr = inputStr.split('-'); var start = +arr[0]; var count = (+arr[1] - arr[0]) + 1; var result = Array.from(new Array(count),(val,index)=>index + start); console.log(result);

Генерация случайных чисел без повторений

#cpp #алгоритм #случайные_числа


Сижу, ломаю голову - и все никак не получается. Нужно создать массив из случайных
чисел в диапозоне от 1 до 7 и чтобы там не было повторений. Я знаю, что есть много
вариантов решения, но я выбрал следующий: при генерации числа заносить его в массив,
а при генерации следующего пробегаться по массиву в поисках совпадения. Если найдено,
то генерировать заново. Написал код, вроде бы все легко, но в ответе все равно проскальзывают
повторения. Подскажите, где косяк?

#include "pch.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  

using namespace std;

int main()
{
setlocale(LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

srand(time(0));

int a[7] = {0,0,0,0,0,0,0}; //создаю массив и заполняю нулями
int random; //переменная для случайных чисел

for (int i = 0; i < 7; i++) { //цикл создания случайных чисел
             random = 1 + rand() % 7; //создание случайного числа
             for (int j = 0; j < 7; j++) { //цикл проверки массива на совпадение
                 if (random == a[j]) { //условие совпадения
                     while (random == a[j]) { //цикл для создания нового случайного
числа, пока оно не будет повторяться
                         random = 1 + rand() % 7;
                     }
                 }
                 else {
                     continue; //если повтора нет, переходим к следующей итерации
                 }
            }
             a[i] = random; // присваивание рандомного числа элементу массива
        } 

for (int k = 0; k < 7; k++) { //вывод массива на экран
            cout << a[k];
        }

cout << "Для выхода из консоли нажмите любую клавишу";
    _getch();
    return 0;
}

    


Ответы

Ответ 1



Для такого малого количества просто возьмите массив {1,2,3,4,5,6,7} и случайным образом его перетасуйте (например, с помощью shuffle). Будет быстрее и проще. А ваша проблема в том, что, проверив число на равенство одному a[j] и откорректировав, вы тут же об этом забываете при проверке на следующее значение j. Т.е. ваш цикл должен выглядеть примерно как for (int i = 0; i < 7; i++) { for(;;) { bool good = true; random = 1 + rand() % 7; for (int j = 0; j < 7; j++) { if (random == a[j]) { good = false; break; } } if (good) break; } a[i] = random; // присваивание рандомного числа элементу массива }

Ответ 2



Если размер вашего массива совпадает (или близок) к размеру домена, из которого производится выборка, то ваш подход будет работать катастрофически неэффективно, даже если реализовать его правильно. Для решения этой задачи есть простейший алгоритм Фишера-Йетса, который сразу за один проход генерирует случайно перемешанную последовательность без необходимости каких-то проверок int main() { int a[7] = { 0 }; for (unsigned i = 0; i < 7; ++i) { unsigned j = rand() % (i + 1); a[i] = a[j]; a[j] = i + 1; } for (int i : a) cout << i << " "; cout << endl; }

Ответ 3



Так как std::unordered_map хранит пары с уникальным ключом: const int r = 7; int a[r] = {0}; unordered_map m; for (int i = 0; i < r; ++i) while (!(m.emplace(make_pair(1 + rand()%r, i))).second); //вводим пару, пока попытка ввода не будет удачной for (auto p : m) a[p.second] = p.first; Так быстрее (границы случайных чисел могут быть любыми). Но конкретно для вашего случая, когда элементы массива принимают значения по каким то критериям(например от 1 по r), то можно просто: for (int i = 0; i < r; ++i) a[i] = i + 1; std::random_shuffle(a, a + r);

Как перехватить исключение любого типа в C#

#c_sharp #исключения


Как перехватить исключение любого типа в C#    


Ответы

Ответ 1



Необходимо использовать следующую схему кода try { // Блок кода, где генерируется исключение } catch (Exception e) { // Выполняем обработку исключительной ситуации }

Ответ 2



try { } catch { // Выполняем обработку исключительной ситуации }

Ответ 3



В коде, который использует только c#-библиотеки, достаточно ловить Exception. В C# все исключения отнаследованы от Exception. try { .. } catch (Exception exc) { .. } В коде, который использует библиотеки на других языках, желательно ловить исключения без указания типа. Другие языки могут кидать исключения с типами, отличными от Exception. try { .. } catch { .. } Комбинированный вариант использования перехватывает все исключения и сохраняет информацию для C#-исключений. try { .. } catch (Exception exc) { .. } catch { .. }

Второе рождение JavaScript [закрыт]

#javascript #работа


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                                Закрыт 4 года назад.
            
                    
        
             
                
                        
                            
                        
                    
                        
                            Заблокировано. This question and its answers are locked
because the question is off-topic but has historical significance. It is not currently
accepting new answers or interactions.
                            
                        
                    
                
                            
                    
Правда ли то, что JavaScript сейчас переживает 2-е рождение и его изучение - перспективное
занятие?
Будет ли в ближайшем будущем (3-5 лет) увеличения количества вакансий для JavaScript
программистов, повысится ли на них спрос?    


Ответы

Ответ 1



Я тоже о таком слышал. И, на сколько я понял, ожидается грандиозный фурор в данном направлении. Сейчас ведутся активные разработки для создания оконных приложений при помощи HTML5 CSS3 JavaScript. И некоторые такие проекты (которые создают приложение из html, css, js), уже можно использовать. При том не только для компьютеров,- уже можно создавать кроссплатформенные приложения для мобильных смартфонов! Мало того, где-то краем глаза прочитал (не могу скинуть ссылку), что 14-й офис будет работать уже не с VBA, а именно с HTML5, CSS3 и JavaScript. Так что на сегодня, если только вы не профессиональный программист оконных приложений и к вебу вы вообще не имеете и не будете иметь никакого отношения, то знание JS - должно быть как должное. Да и, если посмотреть, современные возможности HTML5, CSS3 и JavaScript настолько высоки, что можно создать любое красивейшее приложение! И легче, чем предоставленный инструментарий, например, Java Swing. Мало того, на JavaScript возможно писать многофункциональные и сложные приложения. Да и JS язык особый, который предоставляет очень много удобств. Мало того, на сколько я знаю, можно на JS даже строить серверные приложения! Так что, изучив JS, вы в любом случае не прогадаете! Да и сейчас все сайты не обходятся без JS, что является еще одним плюсом в его изучении.

Ответ 2



С точки зрения поиска работы - за день вы его не выучите. Найти работу довольно сложно ( я имею введу на вакансию "чистого" JavaScript разработчика, хотя, может быть - очень скоро это измениться ) А вообще - да, перспективно, спрос повышается уже сейчас, только вот спрос этот, в основном - на JS гуру. Собственно это логично, использовать новые технологии и писать, по сути, полноценный софт, на столь специфичном языке как JS - (типа) javascript программисты, возможности которых заканчиваются на обработке события клика либо конфигурировании jquery плагина, по определению не могут. В любом случае - JS будет править миром :D (собственно уже правит, но мы этого не замечаем). Лично мне очень интересно чем все эти движения закончатся (html5 windows api, IE support (наконецто плеать, еще немного товарисчи!1АДИН1!!), canvas (<3), workers и много-многое другое ). С точки зрения бизнеса язык невероятно выгоден. Заюзав некоторые готовые решения вы можете написать приложение с использованием html, css, js(сервер естественно тоже можно, но это уже по желанию) - покрыть весь рынок мобильных устройств, ну и, естественно - ваше приложение будет доступно всем из браузера. Если увидите смысл - вы можете даже собрать свое приложение в десктоп софтину. Добавить к этому простоту, мощность и удобство предлагаемых технологий, непосредственно, несомненную крутость javascript'a и картина становиться ясной до нельзя. Но для того что-бы писать что-то большее чем onclick и конфига плагина jquery - нужно очень много практики и опыта, само собой, как и везде - стандартная теория программиста. Причем практика и опыт довольно специфичны, как и сам язык собственно. Вообщем с появлением обещанного html5 API под форточками(не соврали, сделали, но пока восьмая винда не вышла =)), с началом поддержки html5 by IE, с "устаканиванием", принятием и приведением в единому виду html5 стандарта - жизнь станет прекрасной (offtop: HTML5 will kill Flash!!!), для javascript разработчик, естественно =). Ну и да, javascript так-же может использоваться на сервере и во многих-многих прикладных задачах. Так-же, например - mongodb shell написан на все том-же javascript'e. Хотя перспектив огромное множество не только в javascript разработке. Языки типа java, C#, C++ (и другие) востребованы всегда (not only guru). Соответственно путь тяжелый и довольно стремный. Но это я о сознательно глубоком и серьезном изучении языка и совместимых с ним технологий и стандартов. Так что начните учить - от базывых знаний вы точно не проиграете. А там будете смотреть по себе интересно ли вам, нужно ли и т.д. ( И сразу - notify: чуда не произойдет, какие-бы технологии не появлялись хз кому много платить не будут и, соответственно, разрывать на части, естественно, тоже )

Ответ 3



С развитием стандарта HTML 5 небольшое увеличение спроса на рынке труда будет! JS программисты ценились всегда, но особенно ценятся не те кто за 2 минуты установят 5-10 плагинов к jquery, а те кто понимает как работает javascript. Те кто сможет писать интерактивные приложения без использования фреймворков. С jquery мы все проффи можем быть )

Ответ 4



Перенос всех ключевых приложений в веб (например, платорфма Google - Chrome), делает Web-интерфейс основным средством взаимодействия человека с компьютером. Вместо Microsoft Outlook - Google Mail, вместо Microsoft Office - Google Docs, и т.п. Как следствие само написание Web-интерфейса и средства по его разработке приобретают первостепенную важность. А JavaScript с развитием HTML5 становится основным средством разработки Web-интерфейса. Поэтому можно сказать и о "втором рождении".

Ответ 5



При чем тут второе рождение? Вы много знаете веб-языков, позволяющих в режиме реального времени взаимодействовать с клиентом? Кроме js'а вспоминается только actionscript и java, но они требуют установки плагинов и запускаются в своем окружении. Поэтому "родной" язык один - javascript.

Присваивание символа const char *

#cpp #c


Добрый день, хочу расставить точки над «i» для себя.

    const char *v = "123d";
    const char *c = "123";  
    c[2] = '5'; // Так нельзя 
    c = v;
    c = "asdfas";


Вопрос в следующем. Почему, когда мы const char * присваиваем строку, он присваивает,
а символ — нет? Может, где-то для const char * перегружен оператор присваивания, и
он ему присваивает новый адрес? А при присваивании литерала мы пытаемся записать по
тому же адресу?
    


Ответы

Ответ 1



Вопрос в следующем. Почему, когда мы const char * присваиваем строку, он присваивает, а символ — нет? Нужно различать константный указатель и указатель на константу. 1) Указатель на константу: нельзя менять содержимое объекта, на который указывает указатель, но можно менять содержимое самого указателя (указатель — это переменная, содержащая адрес другой переменной). char array[] = "string"; const char * с = array; // Указатель на объект, который нельзя менять c[1] = 'a'; // Нельзя, т. к. меняется содержимое указываемого объекта с = "345"; // Можно, т. к. меняется значение самого указателя 2) Константный указатель: можно менять содержимое объекта, но нельзя менять значение самого указателя. Проще говоря, указатель нельзя переназначить на другой объект, но сам указатель поменять можно. char array[] = "string"; char * const с = array; c[1] = 'a'; // можно с = "345"; // нельзя 3) Константный указатель на константу: совокупность первых двух. const char * const с = "123";

Ответ 2



После присваивания const char *c = "123"; в c храниться некий адрес, по которому размещена строка "123". Компилятор обычно размещает ее в памяти, которая "read only" (записать то можно туда, просто операционная система знает, что это неправильно и пресекает попытки записи). Но так как использовать будет только для чтения, то все нормально. Строка c[2] = '5'; пытается записать в эту неизменяемую память. Память только для чтения. Почему так сделано? для оптимизаций и упрощения. Пусть в Вашей программе есть ещё десять мест, где есть константа "123". Компилятор не будет создавать 11 копий, а будет использовать один и тот же адрес. А теперь представьте, что вышеуказанное изменение разрешено:). Старые компиляторы этого не делали и часто наблюдались интересные спецэффекты, когда константы изменяли свое значение. Но компилятор может поступить и по другому. const char * test = "test111"; printf(test); в этом случае может даже выбросить переменную test, а ее значение вывести непосредственно. присваивание c = v; разрешено, так как не изменяются данные по указателю, а только он сам. А указатель не константный. Аналогично и с присваиванием c = "asdfas";.

Ответ 3



Учебник по программированию на С++ говорит, что: Официальный тип строковых литералов, таких как "Привет",- const char []. Строка "Привет" имеет тип const char [7]. Секундочку! Ведь в слове Привет шесть букв, а не семь! Не переживайте, ошибки здесь нет. Дополнительный элемент содержит завершающий пустой символ, ' \0' (значение 0), который сообщает компьютеру длину строки. В конце каждого строкового литерала есть скрытый пустой символ (\0), который позволяет алгоритмам определять длину строки и факт достижения конца строки. Длина строки нужна не всем алгоритмам, но большинству из них. Присвоить строковый литерал переменной типа char* можно следующим образом: char* х = "Привет"; Однако со значением, на которое указывает х, нельзя работать. Если оно не будет постоянным, возникнет ошибка, как в следующем примере: *х = 'Т'; Этот код вызывает ошибку, потому что нельзя изменять значение константы. Чтобы получить строку, которую можно изменять, следует присвоить строковый литерал строковому объекту или символьному массиву. Пример объявления символьного массива, элементы которого могут изменяться: char s[] = "Привет"; s[0] = 'Т'; С этим кодом все в порядке, а новым значением строки будет "Тривет". Многие из стандартных библиотечных функций С принимают в качестве одного из аргументов значение типа char*. Однако если строка хранится в виде указателя на символ, ее длина не может быть определена, как в случае строковых литералов, завершаемых пустым символом. В отсутствие пустого символа невозможно понять, где кончается строка.

Generic и массивы

#java #generics


Доброго всем времени!
Думал, что я знаю, как использовать дженерики, а оказалось xто и нет. Код:
class MyClass {
   T mas[];

   void foo() {
       mas = new T[10]; // ошибка!
   }
}

Вопрос - почему возникает ошибка?    


Ответы

Ответ 1



Это ограничение реализации дженериков в Java. Дело в том, что дженерики — конструкция времени компиляции, информации о настоящем типе в рантайме нет. Это называется type erasure: Java заменяет везде T на Object в скомпилированном коде (если нет дальнейших условий). При создании массива, однако, Java нуждается в информации о типе элементов, но этот тип недоступен, дженерик не имеет возможности узнать тип своего параметра T! Поэтому и создать массив неизвестного (для дженерика) типа T в Java невозможно. В качестве рекламы корпорации мирового зла замечу, что дженерики в C# были разработаны с учётом опыта Java и избежали проблемы, с которой вы столкнулись. На Stackoverflow обсуждаются возможные workaround'ы. Самый простой — передавать T.class в конструкторе MyClass, и конструировать массив следующим образом: mas = (T[])Array.newInstance(TClass, 10);

Ответ 2



@nightin_gale, Еще один вариант так сказать "из жизни": вместо поля TClass объявить абстрактный метод в духе: protected Class getClassDef(); и, переопределяя его в дочерних классах: public class MyStringClass extends MyClass { protected Class getClassDef() { return String.class; } } пользоваться в родительском: mas = (T[])java.lang.reflect.Array.newInstance(getClassDef(), 10);

Ответ 3



А почему бы не сделать вот так: mas = (T[])(new Object[10]);

Ответ 4



Ваш случай попадает под одно из ограничений для дженериков - невозможно создать экземпляр массива или переменной параметризованного типа. Как было описано выше во время компиляции вся информация об использовании параметра типа удаляется и подставляется конкретный, указанный вами тип. Необходимо это для обратной совместимости кода. Поэтому и выходит, что Вы пытаетесь создать экземпляр неизвестного типа, что в принципе невозможно. Но можете передавать массив снаружи, при вызове метода. Мой ответ весьма упрощен, и является неполным, однако все же является одним из решений данной проблемы =) class MyClass { T mas[]; void foo(T arr[]) { mas = arr; } }