Функция как параметр функции

Передача функции как параметра функции.

#include <iostream>
int sum(int arg1, int arg2)
{
return arg1 + arg2;
}
int mul(int arg1, int arg2)
{
return arg1 * arg2;
}
int calc(int(*calc_func)(int, int), int arg1, int arg2)
{
return calc_func(arg1, arg2);
}
using namespace std;
int main()
{
cout << "Sum: " << calc(sum, 4, 5) << endl;
cout << "Mul: " << calc(mul, 4, 5) << endl;
return 0;
}

RaspberryPi+OpenCV+Code:Blocks

Устанавливаем на карту памяти Raspbian.
Для этого в Windows:

  1. скачиваем Raspbian https://www.raspberrypi.org/downloads/ и разархивируем его
  2. скачиваем и устанавливаем Etcher https://etcher.io
  3. записываем при помощи Etcher образ на карту памяти
  4. загружаемся в ОС, подключаем RaspberryPi к интернету, обновляем ОС до актуального состояния:
    • apt-get update
    • apt-get upgrade
  5. настраиваем RaspberryPi raspi-config
    • Interfacing Options -> Camera
    • Overclock -> Modest
    • Advanced Options -> Expand Filesystem
    • перезагружаемся и проверяем, что файловая система расширена на весь объем карты памяти df -h
  6. выключаем RaspberryPi, подключаем камеру, включаем питание, проверяем работоспособность и правильность подключения камеры raspistill -o cam.jpg и vcgencmd get_camera
  7. устанавливаем необходимые пакеты apt-get install build-essential cmake pkg-config
  8. устанавливаем библиотеки OpenCV apt-get install libopencv-dev
  9. устанавливаем Code:Blocks apt-get install codeblocks
  10. запускаем и настраиваем Code:Blocks
    • Project -> Build options -> Compiler settings -> Compiler Flags -> C++11 + O3
    • Linker settings -> Link libraries -> Add (/usr/lib/arm-linux-gnueabihf/)
    • узнать расположение библиотек в системе можно выполнив pkg-config --libs opencv или find / -name "libopencv*"
    • наличие пакетов в системе поможет проверить apt search
  11. переводим камеру в режим трансляции modprobe bcm2835-v4l2
  12. возможно придется сделать mknod /dev/video0 c 81 0
  13. проверить корректность распознавания камеры можно при помощи v4l2-ctl --list-devices, а вывести возможные режимы работы камеры поможет v4l2-ctl --list-formats
  14. убеждаемся в работоспособности связки:
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    int main()
    {
    cv::VideoCapture cap(0);
    if (!cap.isOpened()) return 1;
    cv::Mat frame;
    cv::namedWindow("win",1);
    while (cvWaitKey(10)!=32)
    {
    cap >> frame;
    cv::imshow("win", frame);
    }
    return 0;
    }

Генерация новых случайных чисел с каждым перезапуском программы

Не секрет, что если для генерации числовых данных использовать функцию rand, то при перезапуске программы мы будем постоянно получать одни и те же сгенерированные псевдослучайные числа. В большинстве «больших» сред программирования, типа C++ Builder, Visual Studio, есть возможность включить опцию в настройках и избавиться от подобного эффекта. Однако, в Dev C++ такой опции нет.
Можно воспользоваться таким кодом:


#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
	srand(time(NULL));
	int a=rand();
	cout << a;
	return 0;
}

В данном случае srand(time(NULL)) позволяет генерировать значения с привязкой ко времени исполнения.

Типы данных C++

Тип Диапазон значений Размер (байт)
bool true и false 1
signed char -128 … 127 1
unsigned char 0 … 255 1
signed short int -32 768 … 32 767 2
unsigned short int 0 … 65 535 2
int -2 147 483 648 … 2 147 483 647 4
signed long int -2 147 483 648 … 2 147 483 647 4
unsigned long int 0 … 4 294 967 295 4
float 3.4e-38 … 3.4e+38 4
double 1.7e-308 … 1.7e+308 8
long double 3.4e-4932 … 3.4e+4932 10

Реализация sign на C++

Sign позволяет определить знак числа.
sgn(x), при x>0 возвращает 1, при x<0 возвращает −1, при x=0 возвращает 0. Данная функция полезна в робототехнике при граничных переходах.
template short int sgn(T val) {
return (T(0) < val) − (val < T(0));
}
основа взята со stackoverflow.com

Урок физкультуры

Задача L. Урок физкультуры
На уроке физкультуры тренер Андрей Сергеевич выстраивает учеников в одну шеренгу.Вшеренге сначала идут мальчики, а потом девочки. При этом мальчики в шеренге стоят по невозрастанию роста, аналогично девочки тоже стоят по невозрастанию роста. Таким образом, следом за самым низким мальчиком стоит самая высокая девочка. Андрея Сергеевича заинтересовал вопрос, какое максимальное различие в росте двух стоящих рядом учеников. Напишите программу, которая поможет Андрею Сергеевичу ответить на этот важный для него вопрос.
Формат входных данных Первая строка содержит целое число n — число учеников в классе (2 ≤ n ≤ 50). Следующие n строк содержат по два целых числа каждая: ai и hi — пол и рост в сантиметрах i-го ученика (ai равно 0 или 1, 100 ≤ hi ≤ 200). Значение ai = 0 означает, что i-й ученик — мальчик, а значение ai = 1 означает, что i-й ученик — девочка. Формат выходных данных Выведите одно число — максимальное различие в росте стоящих рядом учеников после того, как они выстроятся в шеренгу на уроке физкультуры.
Пример стандартный ввод стандартный вывод
6 //6 учеников
0 120
1 130
1 142
1 115
0 145
0 134
22 //вывод разницы в росте
Continue reading

Исполнитель «Калькулятор»

Исполнитель «Калькулятор» может с заданным числом X выполнить одну из трех операций и получить новое число. Возможные операции:
Прибавить к числу X единицу.
Умножить число X на 2.
Умножить число X на 3.
Определите, какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N.
ВХОДНЫЕ ДАННЫЕ
Программа получает на вход одно число N, не превосходящее 106.
ВЫХОДНЫЕ ДАННЫЕ
Программа должна вывести одно число — наименьшее количество операций, необходимых для получения из числа 1 числа N.
ПРИМЕР

ввод вывод
1 0
5 3
962340 17

Continue reading

Задача про кузнечика

Кузнечик на плоскости. У него есть 2 варианта движения – на одну клетку вправо, на одну клетку вниз. Сколько способов насекомому прийти в клетку (N; M)? Даны N, M (N, M < 20).

#include <iostream> using namespace std; int main() { system("chcp 1251 > nul"); int i,j,n,m; cin>>n>>m; int a[n][m]; for(i=0;i<n;i++) for (j=0;j<m;j++) if (i==0 || j==0) a[i][j]=1; for(i=1;i<n;i++) for (j=1;j<m;j++) a[i][j]=a[i-1][j]+a[i][j-1]; cout <<a[n-1][m-1]; return 0; }

С краткой теорией по динамическому программированию можно ознакомиться по адресу http://habrahabr.ru/post/113108/

ЕГЭ ГИА. Часть 2

Одна из однотипных задач 2-й части ГИА.
Краткий пересказ задачи:
Производится N измерений. Среди результатов необходимо выбрать третий по величине. Одинаковые результаты засчитываются за одно измерение. Если трех различных результатов не набралось — вывести «#». Обеспечить эффективность по памяти.
Continue reading