Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2016, 22:23   #1
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию Работа со списками STL - C++

Задание: Задан список. Преобразовать его в два списка. Первый должен содержать только простые числа, а второй – остальные.
Подскажите, пожалуйста, что я делаю не так?

Код:
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include <iostream>
#include <ctime>
#include <list>

using namespace std;

bool check(int num) {
	for (int i = 2; i*i <= num; i++)
		if (num % i == 0)
			return false;
	return num > 1;
}

int main()
{
	srand(time(0));
	list<int> ilist;
	list<int> l_1;
	list<int> l_2;
	int N = 7;
	for (int i = 0; i<N; ++i)
	{
		ilist.push_back(rand() % 100 - 50);
	}
	cout << endl;
	for (auto i : ilist)
	{
		cout << i << " ";
	}
	cout << endl;
	
	int flag = 0;
	int k = 1;
	for (auto i : ilist)
	{
		if (i == 1)
		{
			flag = 1;
			break;
		}
		else
		{
			++k;
		}

	}
	cout << endl;
	if (flag)
		cout << "Poziciya el-ta 1: " << k << endl;
	else
		cout << "Poziciya el-ta 1: Takogo el-ta net!!!" << endl;
	cout << endl << endl;
	for (auto i : ilist)
	{
		if (check(i))
			l_1.push_back(i);
		else
			l_2.push_back(i);
	}
	cout << "Pologit: ";
	for (auto i : l_2)
	{
		cout << i << " ";
	}
	cout << endl << endl;
	cout << "Otric.: ";
	for (auto i : l_1)
	{
		cout << i << " ";
	}
	cout << endl;
	ilist.clear();
	system("pause");
	return 0;
}
Novichok2016 вне форума Ответить с цитированием
Старый 02.06.2016, 23:26   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Проблемы была в check(int num). У меня Visual Studio 2013 начало ругатбся на #include "stdafx.h" и я его закомментировал


Код:
//#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include <iostream>
#include <ctime>
#include <list>

using namespace std;

bool check(int num) {
	num = int(sqrt(num*num));
	for (int i = 2; i*i <= num; i++)
	if (num % i == 0)
		return true;
	return false;
}

int main()
{
	setlocale(LC_ALL, "Russian");
	list<int> ilist;
	list<int> l_1;
	list<int> l_2;
	int N = 17;
	for (int i = 0; i < N; ++i)
	{
		ilist.push_back(rand() % 100 - 50);
	}
	
	cout << "Сам список:" << endl;  // Вывод списка на экран
	for (auto i : ilist)
	{
		cout << i << " ";
	}
	cout << endl;
	bool flag = false;
	int k = 1;
	for (auto i : ilist)
	{
		if (i == 1)          // Единица не простое ни составное число
		{
			flag = true;			
			break;
		}
		else
		{
			++k;
		}

	}
	cout << endl;
	if (flag)
		cout << "Позиция элемента 1: " << k << endl;
	else
		cout << "Позиция элемента 1: Такого элемента нет!!!" << endl;
	cout << endl;
		
	for (auto i : ilist)     // Разделение чисел на простые/составные
	{
		if (check(i))
			l_1.push_back(i);
		else
			l_2.push_back(i);
	}

	cout << "Простые числа: ";
	for (auto i : l_2)
	{
		cout << i << " ";
	}
	cout << endl << endl;
	cout << "Составные числа: ";
	for (auto i : l_1)
	{
		cout << i << " ";
	}
	cout << endl << endl;
	ilist.clear();
	system("pause");
	return 0;
}



Последний раз редактировалось ura_111; 02.06.2016 в 23:28.
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 00:01   #3
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию

Большое Вам спасибо!
Novichok2016 вне форума Ответить с цитированием
Старый 03.06.2016, 00:26   #4
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию процентное отношение длин

Не могу найти, как обозначается длина списка, чтобы найти процентное отношение длины получившихся списков к длине исходного списка. Типа:
Код:
pr = (l_1 / ilist) * 100;
Novichok2016 вне форума Ответить с цитированием
Старый 03.06.2016, 00:41   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

int kol_l_1 = l_1.size();
int kol_ilist = ilist.size();
double pr_1 = double(kol_l_1) / double(kol_ilist) * 100;
ura_111 вне форума Ответить с цитированием
Старый 03.06.2016, 01:00   #6
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
int kol_l_1 = l_1.size();
int kol_ilist = ilist.size();
double pr_1 = double(kol_l_1) / double(kol_ilist) * 100;
Спасибо! Я Вам очень благодарна!
Novichok2016 вне форума Ответить с цитированием
Старый 04.06.2016, 00:05   #7
Novichok2016
Пользователь
 
Регистрация: 02.06.2016
Сообщений: 15
По умолчанию

А Вы не могли бы еще помочь мне с этим заданием...
Приближенное вычисление определенного интеграла
Задание: Функция f(x)=x*x*arcctg(x/2)/x, отрезок a=1, b=2, точность E=0,005. Использовать квадратурную формулу трапеция, язык программирования С++, многопоточное программирование.

Вопрос: Подскажите,пожалуйста, что я делаю неправильно, почему результат уходит в бесконечность?


Код:
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <ctime>
#include <fstream>

using namespace std;

double f(double x)
{
	return (x*x*(atan(-x / 2) + 3.14 / 2) / x);
}

bool func1(double a, double b, double e, double *func)
{
	double f1, f2, fsr, s1, s2, sl;
	double sr = (a + b) / 2;
	double h = b - a;
	f1 = f(a);
	f2 = f(b);
	fsr = f(sr);
	s1 = 0.5*h*(f1 + f2);
	sl = 0.25*h*(f1 + fsr);
	sr = 0.25*h*(fsr + f2);
	s2 = sl + sr;
	*func = s2;
	if (fabs(s1 - s2)<e)
		return true;
	else
		return false;
}

double func2(double a, double b, double e, int T)
{
	if (T == 1)
	{
		double fx;
		if (func1(a, b, e, &fx))
			return fx;
		double m = (a + b) / 2;
		double e1 = e / 2;
		double a1, b1;
		a1 = func2(a, m, e1, T);
		b1 = func2(m, b, e1, T);
		return a1 + b1;
	}
	else
	{
		T = T / 2;
		thread func_thread1(func2, a, b, e, T);
		thread func_thread2(func2, a, b, e, T);
		if (func_thread1.joinable())
			func_thread1.join();
		if (func_thread2.joinable())
			func_thread2.join();
	}
}

int main(int argc, char *argv[])
{
	setlocale(0, "");
	srand(time(0));
	int T, n = 100;
	double a = 1, b = 2, e = 0.005, I = 0.0, h;
	cout << "Введите кол-во потоков: ";
	cin >> T;
	h = (b - a) / n;
	//n--;

	I = func2(a, b, e, T);
	cout << "I= " << I << endl;

	cout << endl << endl;
	system("pause");
	return 0;
}
Novichok2016 вне форума Ответить с цитированием
Старый 04.06.2016, 00:37   #8
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я посмотрю.
ura_111 вне форума Ответить с цитированием
Старый 04.06.2016, 08:26   #9
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я посмотрел. Я так и не понял смысла потоков.
Сделал задачу методом тыка. Основная проблема была в том, что поток ничего не возвращает (в данном случае ф-ция func2 ничего не возвращала). Нужно было использовать ссылку. Теперь выводит, но

плохо что потоки создаются не в main(), - первый успевает закрыться, а на вывод в main() посылает только 2-й. Короче: не продемонстрировать работу сразу двух потоков одновременно. В этом свете появляется 3-и решения задачи.

Решение №1. Т.к. 1-й поток не вывод результатов, то и его создавать бессмысленно


Код:
//#include "stdafx.h"
#include <iostream>
#include <thread>
#include <ctime>
#include <fstream>

using namespace std;

double f(double x)
{
	return (x*x*(atan(-x / 2) + 3.14 / 2) / x);
}

bool func1(double a, double b, double e, double *func)
{
	double f1, f2, fsr, s1, s2, sl;
	double sr = (a + b) / 2;
	double h = b - a;
	f1 = f(a);
	f2 = f(b);
	fsr = f(sr);
	s1 = 0.5*h*(f1 + f2);
	sl = 0.25*h*(f1 + fsr);
	sr = 0.25*h*(fsr + f2);
	s2 = sl + sr;
	*func = s2;
	if (fabs(s1 - s2)<e)
		return true;
	else
		return false;
}

void func2(double a, double b, double e, int T, double &a_b_1)
{
	if (T == 1)
	{
		double fx;
		if (func1(a, b, e, &fx))
		{
			a_b_1 = fx;
			return;
		}
		double m = (a + b) / 2;
		double e1 = e / 2;
		double a1, b1;
		func2(a, m, e1, T, a1);
		func2(m, b, e1, T, b1);
		a_b_1 = a1 + b1;
		return;
	}
	else
	{
		T = T / 2;
		thread func_thread1(func2, a, b, e, T, ref(a_b_1));
		func_thread1.join(); 
	}
}

int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "Russian");
	int T, n = 100;
	double a = 1, b = 2, e = 0.005, I = 0.0, h;
	cout << "Введите кол-во потоков: ";
	cin >> T;
	h = (b - a) / n;
	//n--;
	
	func2(a, b, e, T, I);


	cout << "I= " << I << endl;

	cout << endl << endl;
	system("pause");
	return 0;
}

Решение №2 Оставить два потока, но выводить на экран не в main(), а в ф-ции void func2. Каждый поток характеризуется id, поэтому можно вывести и его (см. рис)

Код:
//#include "stdafx.h"
#include <iostream>
#include <thread>
#include <ctime>
#include <fstream>

using namespace std;

double f(double x)
{
	return (x*x*(atan(-x / 2) + 3.14 / 2) / x);
}

bool func1(double a, double b, double e, double *func)
{
	double f1, f2, fsr, s1, s2, sl;
	double sr = (a + b) / 2;
	double h = b - a;
	f1 = f(a);
	f2 = f(b);
	fsr = f(sr);
	s1 = 0.5*h*(f1 + f2);
	sl = 0.25*h*(f1 + fsr);
	sr = 0.25*h*(fsr + f2);
	s2 = sl + sr;
	*func = s2;
	if (fabs(s1 - s2)<e)
		return true;
	else
		return false;
}

void func2(double a, double b, double e, int T, double &a_b_1)
{
	if (T == 1)
	{
		double fx;
		if (func1(a, b, e, &fx))
		{
			a_b_1 = fx;
			return;
		}
		double m = (a + b) / 2;
		double e1 = e / 2;
		double a1, b1;
		func2(a, m, e1, T, a1);
		func2(m, b, e1, T, b1);
		a_b_1 = a1 + b1;
		return;
	}
	else
	{
		T = T / 2;
		thread func_thread1(func2, a, b, e, T, ref(a_b_1));
		thread func_thread2(func2, a, b, e, T, ref(a_b_1));
		if (func_thread1.joinable())
		{
			cout << "Id потока 1: " << func_thread1.get_id() << "  I= " << a_b_1 << endl;
			func_thread1.join();
		}
		if (func_thread2.joinable())
		{
			cout << "Id потока 2: " << func_thread2.get_id() << "  I= " << a_b_1 << endl;
			func_thread2.join();
		}
	}
}

int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "Russian");
	int T, n = 100;
	double a = 1, b = 2, e = 0.005, I = 0.0, h;
	cout << "Введите кол-во потоков: ";
	cin >> T;
	h = (b - a) / n;
	//n--;


	func2(a, b, e, T, I);
	
	if(T==1)
		cout << "I= " << I << endl;

	cout << endl << endl;
	system("pause");
	return 0;
}




Решение №3. Перенести создания потоков в main().
ura_111 вне форума Ответить с цитированием
Старый 04.06.2016, 13:12   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Смотрел, смотрел. Тупил, тупил... Так и не понял, нахрена здесь список? С векторами, куда проще? Ага. Создаём себе проблемы, а потом - героически их преодолеваем!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со списками LeNZZZ Microsoft Office Excel 1 21.11.2012 17:36
Работа со списками C# Serg94 Помощь студентам 4 04.05.2012 22:29
Работа со списками методами STL JeyKip Общие вопросы C/C++ 5 17.12.2009 02:13
Работа со списками. radist Паскаль, Turbo Pascal, PascalABC.NET 4 07.05.2007 00:05