Работа с потоками boost::thread

Дата: 2 April, 2015, Автор: admin_kselax

boostЗдорова ребятки, сегодня разберем такую штуку как boost::thread. Эта библиотека предназначена для создания потоков. Как подключить и настроить boost вы можите почитать по ссылке Подключени и работа boost в visual studio 2010.  Разберем несколько примеров как создаются потоки.

>>>Читать далее

Подключение и работа boost в visual studio 2010

Дата: , Автор: admin_kselax

boostЗдорова ребятки! Сегодня разберем как подключить и настроить библиотеку boost под windows для visual studio 2010. И так для начала скачаем библиотеку с сайта http://www.boost.org/ там выбираем последнюю версию как на скрине ниже и скачиваем.

boost download

>>>Читать далее

Книга “visual C++ 2010 полный курс” решение задач глава 13

Дата: 16 August, 2014, Автор: admin_kselax

QIP Shot - Screen 067Мы изучили фундаментальные элементы, предоставляемые библиотекой шаблонов для параллельных вычислений, используемые для программ, которые применяют несколько процессов. Библиотека PPL эффективна лишь при наличии существенных объемов вычислений, выполняемых на машине с несколькими процессорами, однако такие задачи отнюдь не редкость. Большинство инженерных и научных приложений входят в эту категорию наряду с множеством операций обработки изображения, и вы вполне можете найти крупномасштабные коммерческие задачи обработки данных, которые могут извлечь пользу из использования библиотеки PPL.


формула факториала
Упражнение 1

Определите функцию, которая вычислит факториал целого числа типа long long с использованием алгоритма parallel_for. (Факториалом целого числа n является произведение всех целых чисел от 1 до n.) Продемонстрируйте, что функция работает с соответствующей функцией main().

Показать »

#include <iostream>
using std::cout;
using std::endl;
#include <ppl.h>

unsigned long long fakt(size_t n)
{
	long long f(1);
	Concurrency::combinable<unsigned long long> fs;	
	fs.local()=1LL;
	Concurrency::parallel_for(static_cast<size_t>(1),n+1,
		[&fs](size_t i)->void
	{
		fs.local()*=i;
	});
	f=fs.combine(
		[](unsigned long long s1, unsigned long long s2)->unsigned long long
	{ 
		return s1*s2;
	});

	return f;
}

int main()
{
	cout <<fakt(20)<<endl;

	return 0;
}

вывод:

factorial 171

>>>Читать далее

С++ (С++ 11) Лямбда выражения

Дата: 2 August, 2014, Автор: admin_kselax

75fed44f93a20fff0e6db06381cd1717Здорова Господа!!!

От решил написать статью о лямбда выражения в С++, что это такое и как их использовать?!

Лямбда-выражение (в программировании) — это специальный синтаксис для объявления анонимных функторов по месту их использования. Используя лямбда-выражения, можно объявлять функции в любом месте кода. Обычно лямбда-выражение допускает замыкание на лексический контекст, в котором это выражение использовано.

Лямбда-выражение в С++ – это возможность языка С++, предоставляющая альтернативный механизм программирования объектов функций во многих экземплярах.

Лямбда-выражения не специфичны для библиотеки STL, но их можно интенсивно применять в этом контексте. Лямбда-выражения определяет объект функции без названия и без необходимости явного определения класса. Обычно лямбда-выражения используются как средство передачи функции в качестве аргумента другой функции. Лямбда выражение намного проще в использовании и понятней, оно требует меньшего количества кода, чем определение и создание обычного объекта функции. Безусловно, это не замена для объектов функции вообще.

>>>Читать далее

visual C++ 2010 (Глава 10) Решение задач

Дата: 27 July, 2014, Автор: admin_kselax

QIP Shot - Screen 067В этой главе были представлены возможности библиотеки STL в “родном” С++, а также то, как те же средства выглядят в STL/CLR и применяются в программах С++/CLI.

Моей задачей в этой главе было представить библиотеки STL и STL/CLR кратко, но достаточно подробно, чтобы вы могли дальше двигаться самостоятельно. Если еще много такого, что я не имел возможности изложить здесь, так что рекомендую читать документацию.

 

Упражнения 1

Напишите на “родном” С++ программу для чтения некоторого текста из стандартного потока ввода, возможно, состоящего из нескольких строк ввода, сохраняя буквы текста в контейнере list<T>. Отсортируйте буквы в порядке возрастания и выведите их на экран.

Показать »

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <list>
using std::list;
#include <string>
using std::string;

int main()
{
	list<char> l;
	char c;
	string str("");
	while(cin.get(c))
	{
		l.push_back(c);
		if(c=='n')
			break;
	}
	cout <<"l.size()= "<<l.size()<<endl;
	for(auto i=l.begin();i!=l.end();i++)
		cout <<*i;
	l.sort();
	for(auto i=l.begin();i!=l.end();i++)
		cout <<*i;
	cout <<endl;

	return 0;
}

вывод:

QIP Shot - Screen 117

>>>Читать далее

visual C++ 2010 (Глава 9) Решение задач

Дата: , Автор: admin_kselax

QIP Shot - Screen 067В этой главе были раскрыты принципиальные идеи наследования классов “родного” С++ и классов С++/CLI.

Теперь вы изучили все важнейшие языковые средства ISO/ANSI C++ и C++/CLI.Важно, чтобы вы чувствовали себя комфортно с механизмами определения и наследования классов в обеих версиях языка. Программирование для Windows с помощью среды разработки Visual C++ 2010 включает интенсивное использование всех этих концепций.

 

Упражнение 1

Что неправильно в следующем коде?

class CBadClass
{
private:
  int len;
  char* p;
public:
  CBadClass(const char* str):p(str),len(strlen(p)){}
  CBadClass(){}
};

Показать »

Неправильно то что инициируется указатель без выделения памяти, эта программа должна вылететь. Правильно нужно сначала выделить память для указателя char* p используя оператор new затем уже используя функцию strcpy() или другой способ присвоить указателю p значение переменной const char* str.

>>>Читать далее

visual C++ (Глава 8) Решение задач

Дата: , Автор: admin_kselax

QIP Shot - Screen 067В этой главе вы изучили основы определения классов, а также создания и использования объектов классов. Вы также узнали о том, как перегруженные операторы классов могут быть применены к объектам классов.

 

 

 

 

Упражнение 1

Определите класс “родного” С++, представляющий приблизительные целые, такие как “около 40”. Это целые, значения которых могут быть рассмотрены как целое или приблизительное, поэтому класс должен иметь в качестве переменных членов значение и флаг “приблизительности”. Состояние этого флага влияет на арифметические операции, так что “2 умножить на около 40” должно давать “около 80”. Состояние переменных должно быть переключаемым между “приблизительно” и “точно”.Предоставьте один или несколько конструкторов для такого класса. Перегрузите оператор +, чтобы такие числа можно было использовать в арифметических операторах. Хотите ли вы сделать оператор + глобальной функцией или функцией-членом? Нужен ли оператор присвоения? Предложите функцию -член Print(), чтобы можно было распечатывать такие числа, используя предваряющий символ “Е” для указания на то, что  установлен флаг “приблизительности”. Напишите программу для проверки работы вашего класса, особо обращая внимание на правильность операций с флагом приблизительности.

Показать »

#include <iostream>
using std::cout;
using std::endl;

class prib
{
public:
	prib(int n1, bool f)
		:n(n1),
		flag(flag)
	{}
	prib()
		:n(0),
		flag(false)
	{}
	void print()
	{
		if(flag==true)
			cout <<"E"<<n;
		else
			cout <<n;
		cout <<endl;
	}
	prib operator+(int n1)
	{
		n=n+n1;
		return *this;
	}
	prib operator+(const prib& p)
	{
		return prib(n+p.n,p.flag||flag);
	}
private:
	int n;
	bool flag;
};

prib operator+(int n1, const prib& p)
{
	prib temp=p;
	return (temp+n1);
}

int main()
{
	prib b(4,true);
	b.print();
	b=b+4;
	b.print();
	b=4+b;
	b.print();

	return 0;
}

вывод:

QIP Shot - Screen 106

>>>Читать далее

visual C++ 2010 (Глава 7) Решение задач

Дата: , Автор: admin_kselax

QIP Shot - Screen 067Теперь вы понимаете фундаментальные идеи, положенные в основу классов С++. В остальной части книги вы увидите все новые и новые примеры применения классов.

 

 

 

 

 

Упражнение 1

Определите структуру Sample, содержащую два целочисленных элемента данных. Напишите программу, которая объявит два объекта типа Sample с именами а и b. Установите значения для элементов данных, относящихся к объекту а, и затем убедитесь, что можете копировать значения объекта b простым присвоением

Показать »

#include <iostream>
using std::cout;
using std::endl;

struct Sample
{
	int n1;
	int n2;
};

int main()
{
	Sample a,b;
	a.n1=3;
	a.n2=4;
	b.n1=0;
	b.n2=0;
	cout <<"a.n1= "<<a.n1<<" a.n2= "<<a.n2<<endl;
	cout <<"b.n1= "<<b.n1<<" b.n2= "<<b.n2<<endl;
	b=a;
	cout <<"a.n1= "<<a.n1<<" a.n2= "<<a.n2<<endl;
	cout <<"b.n1= "<<b.n1<<" b.n2= "<<b.n2<<endl;

	return 0;
}

Вывод:

QIP Shot - Screen 097

>>>Читать далее

visual C++ 2010 Глава 6 Решение задач

Дата: 17 July, 2014, Автор: admin_kselax

QIP Shot - Screen 067Теперь у вас достаточно знаний, чтобы разрабатывать и использовать функции. В этой главе вы ознакомились также с концепцией перегрузки, позволяющей реализовать набор функций и выполняющей ту же операцию с параметрами разного типа. В следующих главах вы узнаете больше о перегрузке функций.     Вы приобрели также некоторый опыт в использовании нескольких функций в одной программе на примере программы калькулятора. Однако имейте в виду, что все случаи применения функций, рассмотренные до сих пор, находятся в контексте традиционного процедурного подхода к программированию. Когда мы перейдем к рассмотрению объектно-ориентированного программирования, мы по-прежнему будем интенсивно пользоваться функциями, но с иным подходом к структуре программ и дизайну решений проблем.

Упражнение 1

Предположим, имеется функция

int ascVal(size_t i, const char* p)
{
//Печатать значение ASCII символа
if(!p||i>strlen(p))
return -1;
else
return p[i];
}

Напишите программу, которая вызовет эту функцию через указатель и проверит ее работу. Чтобы использовать библиотечную функцию strlen(), в код необходимо включить директиву #include для файла заголовка cstring.

Показать »

#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
using std::strlen;

int ascVal(size_t i, const char* p)
{
	//Печатать значение ascII символа 
	if(!p||i>strlen(p))
		return 1;
	else
		return p[i];
}

int main()
{
	//Обычный вызов
	cout <<static_cast<char>(ascVal(3,"hellow"))<<endl;

	//Создаем указатель на функцию
	//и вызываем через указатель на функцию
	int (*pF)(size_t,const char*);
	pF=ascVal; //присваиваем функцию
	//вызываем функцию через указатель на функцию
	cout <<static_cast<char>(pF(4,"hellow"))<<endl;

	return 0;
}

Вывод:

QIP Shot - Screen 094

>>>Читать далее

visual C++ 2010 (Глава 3) Решение задач.

Дата: 16 July, 2014, Автор: admin_kselax

QIP Shot - Screen 067В этой главе вы изучили все важнейшие механизмы принятия решений в программах С++. Способность сравнивать значения и изменять порядок выполнения программы отличает компьютер от простого калькулятора. Необходимо хорошо понимать все описанные здесь операторы принятия решений, поскольку все они используются очень часто. Вы изучили также все средства повторения группы операторов. Циклы – фундаментальная методика программирования, которую вы будете использовать в каждой программе. Цикл for вы будете использовать чаще всего в базовом языке С++, чуть реже – цикл while. Цикл for each, как правило, более эффективен в языке С++/CLI, поэтому не забывайте о нем.

Упражнение 1

Напишите программу, которая читает из потока cin входные числа и суммирует их, прекращая процесс после ввода нуля. Создайте три версии этой программы с использованием циклов while, do-while и for.

Показать »

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
	for(;;)
	{
		int n;
		cout <<"Enter a number, (enter 0) ... ";
		cin >>n;
		if(n==0)
			break;
		else
			cout <<"you enter n= "<<n<<endl;
	}

	return 0;
}

для while()

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
	int n;
	cout <<"Enter a number, (enter 0) ... ";
	cin >>n;
	while(n!=0)
	{
		cout <<"you enter n= "<<n<<endl;
		cout <<"Enter a number, (enter 0) ... ";
		cin >>n;
	}

	return 0;
}

и do while()

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
	int n;
	cout <<"Enter a number, (enter 0) ... ";
	cin >>n;
	do
	{
		cout <<"you enter n= "<<n<<endl;
		cout <<"Enter a number, (enter 0) ... ";
		cin >>n;
	}while(n!=0);

	return 0;
}

И вывод примерно такой будет:

QIP Shot - Screen 076

 

>>>Читать далее