Archive

Archive for the ‘Перекладені’ Category

Як відрізнити випадкову послідовність від псевдовипадкової.

Прожилки

Чи була послідовність з H та T наведена нижче згенерована підкиданням збалансованої монети 100 разів чи її хтось набрав на клавіатурі в манері, що нагадує випадкову?

HTTTHTHTTHTTHTHTHTHT

TTTHHTHHTHTHTTHHHTHT

HHTHHTTTHHHTHTTHHHHT

THTTHHTHTHTHTHTTHTHH

HTTHHHTHTHHHTHTHHHTH

Тут напевне і не скажеш. Однак. Ця послідовність має характерну рису, яка притаманна для “випадкових” послідовностей згенерованих людьми і незвичайна для насправді випадкових послідовностей: а саме, тут немає тривалих прожилок з H або T. Насправді, жоден символ не з’являється більш як чотири рази поспіль. Наскільки це правдоподібно? Якщо ми підкинемо збалансовану монету 100 разів, яка ймовірність то, що ми не матимемо п’ять аверсів підряд?
Читати далі…

Advertisements

Арифметика рухомої коми

Небагато часу знадобилось, щоб після винайдення комп’ютерів дійти згоди щодо правильного способу представлення дійсних чисел на цифровій машині. Цим способом є арифметика рухомої коми, апаратний аналог експоненці́йного/наукового представлення чисел.

Обмеження цифрового представлення

Оскільки цифрові комп’ютери використовують скінченну кількість бітів для представлення дійсного числа, вони можуть представити лише скінченну підмножину дійсних чисел (або комплексних). Це обмеження вводить дві складності. Перше, представлені числа не можуть бути довільно великими або маленькими. Друге, між ними повинні бути розриви.
Читати далі…

Близько 10 прийомів для зневадження(debugging) у Visual Studio

Знедваження є однією з головних частин процесу розробки. Іноді це виклик, іноді головоломка, одно відомо достеменно – це неминуча частина процесу розробки нетривіальної програми. Розвиток засобів зневадження впродовж останніх років зробив багато задач, які постають під час зневадження, набагато легшими і швидшими.

Ця стаття розглядає десять підходів і прийомів, які ви можете використати під час зневадження і тим самим зберегти час.
Читати далі…

Категорії:C++, Перекладені Позначки:,

Прагнеш швидкості? Передавай за значенням.

Тільки чесно: які почуття викликає в вас наступний код?

std::vector<std::string> get_names();
...
std::vector<std::string> const names = get_names();

Відверто, я б занервував. В принципі, по завершені get_names() ми маємо копіювати вектор рядків. Потім ми маємо копіювати його знов, коли ініціалізуємо names, і маємо знищити першу копію. Якщо в векторі N рядків, кожне копіювання може вимагати аж по N+1 виділень пам’яті і безліч недружнього щодо кешу доступу до даних, коли вміст рядка копіюється.

Радше ніж відчувати цю тривогу, я часто повертався до використання передачі за посиланням, щоб уникнути непотрібних копій:

get_names(std::vector<std::string>& out_param );
...
std::vector<std::string> names;
get_names( names );

На жаль, цей підхід далекий від досконалості.

  • Об’єм коду виріс на 150%
  • Нам довелось поступитись сталістю, бо ми змінюємо names.
  • Як функційні програмісти захочуть нам нагадати, зміна параметра ускладнює розуміння через підривання прозорості посилань і міркувань щодо рівнянь (equational reasoning.).
  • Ми більше не дотримуємось суворої семантики передачі за значенням для names.

Але, чи дійсно конче необхідно так плутати наш код для досягнення дієвості? На щастя, виявляється, що відповідь ні (особливо, якщо ви використовуєте C++0x). Ця стаття перша в серії, що досліджує п-значення (rvalues) та їх вплив на дієвість семантики значень (value semantics) в C++.

Читати далі…

Категорії:Перекладені Позначки:,

Лямбда-вирази, auto та static_assert: C++0x можливості в VC10

Лямбда-вирази

В C++0x, “лямбда-вирази” непрямим чином створюють функцональні об’єкти, які потім поводяться як функціональні об’єкти написані вручну. Наведемо “Hello, World” лямбда-вираз:

#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;

    for (int i = 0; i < 10; ++i)
        v.push_back(i);

    for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
    cout << endl;
}

0 1 2 3 4 5 6 7 8 9
Читати далі…

Категорії:Перекладені Позначки:,

Як розробити простий UDP сервер і клієнт із використанням WinSock.

Цей проект містить прості програми-приклади UDP сервера та клієнта. Якщо ви ніколи не писали програми, що використовують UDP, це прекрасний проект для початку. Сервер виконується на локальному комп’ютері та очікує датаграму із запитом поточного серверного часу з віддаленого комп’ютера. По отриманню такої датаграми сервер повертає свій поточний час клієнту, який відображає його.
Читати далі…

Категорії:Перекладені Позначки:, ,

Вступ у використання рекурсії в C++

1. Вступ

Загалом, рекурсія значить самоповторюваний шаблон. У математиці це може бути функція визначена через себе. Інакше кажучи, це функція, що викликає сама себе. Кожна рекурсивна функція має умову завершення; інакше вона буде викликати себе безперестанку, і цю умову можна назвати базова умова.

Зазвичай, рекурсія це трошки складна для розуміння більшості студентів концепція.

2. Типи рекурсії

У C++, типи рекурсії можна визначити більш ніж за одним виміром. З одного боку, їх можна категоризувати як рекурсії часу виконання і як рекурсії часу компіляції через використання шаблонів.
Читати далі…

Категорії:Перекладені Позначки:,