Страницы

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

пятница, 7 декабря 2018 г.

Округление до N знаков после запятой в с++

есть число типа double, например 4.64452675
Как в С++ сделать округление до N знаков после запятой? Либо отсечение? Не нашел нужной функции


Ответ

static const double powerOfTen[] = { 1.0, 10.0, 100.0, ... };
double truncated = std::trunc(d * powerOfTen[N]) / powerOfTen[N]; double rounded = std::floor(d * powerOfTen[N] + 0.5) / powerOfTen[N];

Оператор delete: удаление массива

Здравствуйте. :) Вот такой вопрос возник, почему вот этот после выполнения int *x = new int[2]; delete x; идентичен вот этому int *x = new int[2]; delete []x; Везде где читал, сказано что массив нужно удалять вторым способом.


Ответ

Если вы выделяли память при помощи new[], вы обязаны освободить её с помощью delete[]. Так гласит стандарт.
Освобождение такой памяти как-то по-другому (delete без [] или вообще free) является Undefined Behaviour. Если в программе есть Undefined Behaviour, она имеет право вести себя как угодно: может ничего плохого не делать, может вылететь в любой точке, отформатировать ваш винчестер или выбросить из окна вашего кота.
You have been warned.

Удаление пустых элементов списка python

Извините за глупый вопрос, но как удалить пустые элементы из списка в пайтоне?


Ответ

Для начала стоит формализовать, что такое "пустой" элемент.
"Пустыми" можно считать многие элементы, например,
[], (), {}, set(), ''
в том числе
None, 0, 0.0, 0j, False
Если требуется выбросить из коллекции все такие элементы, то можно воспользоваться генератором списка
[value for value in values if value]
Или, если список не требуется, генераторным выражением:
(value for value in values if value)
Если правило определения "пустого" элемента более сложное, достаточно описать это правило после оператора if в указанных выше выражениях, например,
[value for value in values if value != [None]]
оставит в списке элементы, которыне не равны списку, содержащему None (важно заметить, что такой список будет пропущен в итоговый набор в первых случаях).

Как обработать исключение java.util.ConcurrentModificationException?

Есть код: ссылка на github. В ходе выполнения выбрасывается исключение Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Знающие люди подскажите как побороть проблему. Заранее спасибо)


Ответ

Его не надо обрабатывать. Это исключение значит, что вы в своем коде удаляете элемент напрямую из коллекции во время использования итератора. Т.к. в этом случае появляется неопределенность, откуда итератор должен продолжать и какие последующие элементы должен пройти, выбрасываетс исключение. Для корректного изменения сущности используйте методы итератора, например, iterator.remove()

Найти 2 элемента массива, сумма которых равна заданному числу

Задачка кажется очень простой, но все равно не выходит.
Дан массив целых чисел, упорядоченный строго по возрастанию.
Дано некоторое число X, нужно менее чем за квадратное количество операций(то есть перебор всех пар) найти такие два любых элемента массива, что их сумма равна X, иначе вывести 0.
Как сделать это меньше, чем за квадратное время?
Подкиньте идею какую-нибудь, ну или сам подход?)) Спасибо=)


Ответ

Решение за О(n): Решаем методом "2 указателя" Храним 2 индекса: первый сначала указывает на нулевой элемент, второй - на последний элемент. Цикл - пока индексы не будут равны (то есть пока они не укажут на один и тот же элемент. Если такое случилось - значит, искомых элементов в массиве нет). На каждой итерации цикла сравниваем текущую сумму (сумму элементов, на которые указывают индексы) с искомой. Если сумма меньше - увеличиваем первый индекс, если сумма больше - уменьшаем второй индекс. Если равна - решение найдено.
#include #include
using namespace std;
int main() { int *a; // массив int n; // количество элементов в массиве int sum; // необходимая сумма /// //чтение массива cin >> n; a = new int[n]; for (int i = 0; i < n; i++) cin >> a[i]; cin >> sum; /// // индексы int lt = 0; // первый, то есть левый int rt = n - 1; // второй, то есть правый while (lt != rt) { int cursum = a[lt] + a[rt]; if (cursum < sum) lt++; else if (cursum > sum) rt--; else // if (cursum == sum) { cout << "indexes: " << lt << " " << rt << endl; cout << "values: " << a[lt] << " " << a[rt] << endl; return 0; } } cout << "not found" << endl; return 0; }

Вопрос про абстракцию и полиморфизм в java

Загвоздка такова: по отдельности я более-менее понимаю, о чем эти 2 парадигмы:
Абстрактный класс с методами - своего рода шаблон,который наследуют другие классы. Объект такого класса нет смысла создавать, т.к. он абстрактен, но наследники могут использовать его методы и переопределять их. Полиморфизм - это возможность использовать метод с одним именем в разных классах, но по-разному его реализовывать, переопределяя. Также понимаю,что в принципе одну систему можно построить как на базе абстрактного класса,так и используя полиморфизм.
Но что использовать лучше и чем они отличаются - я не понимаю, не хватает совсем немного,чтобы додумать. Поясните, пожалуйста, что и как, если можно на примерах. Заранее большое спасибо.


Ответ

Это тесносвязанные базовые понятия ООП, они дополняют друг друга. Поэтому нельзя говорить "что использовать лучше". Как вы написали,
абстрактный класс с методами своего рода шаблон,который наследуют другие классы
Так вот, вы задаете определенный шаблон для дальнейшей реализации полиморфизма. Когда от этого абстрактного класса у вас будут 2 или более наследника, реализующие абстрактные методы. Это и будет полиморфизм. Также, часто помогает осознать что это сама расшифровка слова. "поли" - означает много, "морфа" - форма. Полиморфизм - много форм. Есть одна абстракция, и есть много реальных форм этой абстракции. Ещё стоит помнить, что полиморфизм в ООП не ограничивается этим, перегрузка методов - также является полиморфизмом: много форм у одного метода.
Ещё раз, не разделяйте понятия ООП и не пытайтесь выбрать "что лучше" - все базовые принципы ООП - костяк, и только используя все кости сразу вы добьетесь красивого результата (конечно, меру знать нужно, так что злоупотреблять не стоит).
UPD. касательно вашего комментария:
если мы имеем супер-класс,но не абстрактный и наследуем от него другие классы,использующие его метод. можно ведь при этом делать супер-класс не абстрактным. например класс "фигура" и классы-наследники "квадрат", "круг".все будут иметь метод "рисовать".
abstract public class Shape { int Color; Coordinates StartPoint; abstract public void Draw(); }
class Point extends Shape { public void draw() { // Здесь рисуется точка } }
class Circle extends Shape { public void draw() { // Здесь рисуется круг } }
class Square extends Shape { public void draw() { // Здесь рисуется квадрат } }
Если суперкласс будет неабстрактным в данной ситуации, то либо придется писать реализацию draw() для класса Shape, которую не особо понятно как делать, либо же вообще Shape не будет ничего знать про метод draw() и тогда не получится сделать то, что описано ниже.
Зачем все это вообще нужно? Потому что когда-нибудь у вас будет много разных фигур, например, в массиве:
List shapes = shapes(); // Получим откуда-то его. shapes.forEach(Shape::draw);
И всё, мы отрисовали все квадраты, круги, точки. И для каждой фигуры вызвался свой метод draw.
Это так же ответ на вопрос:
а зачем нам выделять из нескольких классов общие черты и плодить еще один дополнительный класс?

Стилизировать первые 3 символа в тексте на css

Как на js или css стилизировать первые 3 символа в тексте? Нужно их скрыть или сделать прозрачными.

  • 1. Анкор (41)

  • Ответ

    Ну коли можно пользоваться скриптами теперь, то: Вариант на jq:
    $('input').on('click', function() { $('.cat-item a').each(function() { var text = $(this).text(); text = '' + text.substr(3, text.length); $(this).html(text); }) });

  • 1. hello!
  • 2. this
  • 3. is
  • 4. a test!