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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2017, 12:07   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Мне интересно, зачем все так просят скрин, если очевидно, что 2008 студия не смогет в С++11 нормально?
p51x вне форума Ответить с цитированием
Старый 24.04.2017, 12:09   #12
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Мне интересно, зачем все так просят скрин, если очевидно, что 2008 студия не смогет в С++11 нормально?
ЭЭЭЭЭ..я ни строчки не написал на 11...я так думаю
Неужто std::copy в моем варианте все-же 11?...не уточнял >:

http://www.cplusplus.com/reference/algorithm/copy/

тут нет метки 11

если ошибка в копи, то скорее всего, там не верно random_iterator заделан - не дает +много, да и мой g++ по умолчанию в старый компилит:

lex@moy-super:~/Work/tests$ g++ cards.cpp
alex@moy-super:~/Work/tests$ ./a.out

Исходная колода:
2 3 4 5 6 7 8 9 10 J Q K A
2 3 4 5 6 7 8 9 10 J Q K A
2 3 4 5 6 7 8 9 10 J Q K A
2 3 4 5 6 7 8 9 10 J Q K A
Перемешанная колода:
3 9 7 7 10 2 J 2 K 6 5 A 10
7 8 4 8 A 2 2 8 K 4 4 3 6
10 9 K 4 5 J 3 Q K 9 9 J 5
8 10 6 A Q 5 A 6 Q Q 3 7 J

1й игрок:
3 9 7 7 10 2 J 2 K 6 5 A 10

2й игрок:
7 8 4 8 A 2 2 8 K 4 4 3 6

3й игрок:
10 9 K 4 5 J 3 Q K 9 9 J 5

4й игрок:
8 10 6 A Q 5 A 6 Q Q 3 7 J

Последний раз редактировалось alexzk; 24.04.2017 в 12:12.
alexzk вне форума Ответить с цитированием
Старый 24.04.2017, 12:15   #13
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
я ни строчки не написал на 11
Как минимум using (вместо typedef) и вроде std::array тоже.
Цитата:
Сообщение от alexzk Посмотреть сообщение
вы вообще пробовали в сотне файлов с макросами сменить some* на std::shared_ptr<some> ?
Так это ж разные вещи. Как минимум new/delete все равно придется искать + конвертировать в обычный указатель если где-то нужен именно *.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.04.2017, 12:17   #14
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как минимум using (вместо typedef) и вроде std::array тоже.

Так это ж разные вещи. Как минимум new/delete все равно придется искать + конвертировать в обычный указатель если где-то нужен именно *.
Нет, using есть давно уж. ..я думаю Ну оно точно не 114 линия епт. Помоему с 2003 или какой там.
new/delete искать не пришлось, они там рядом были, а вот указатели раскиданы по ф. и макросам, а добавили потоков и стало все не так радужно.
А где именно * нужны....пришлось буквально кромсать и делать совсем, 100% иначе, да, замыкать в приват члены, который ставят строго мутексы, все контроллят, а от тя берут лямбду, которой дают прямой *. Потому что логика вывернулась - тут ты хочешь прямой указатель, а там уже мейн поток удалил.

Последний раз редактировалось alexzk; 24.04.2017 в 12:20.
alexzk вне форума Ответить с цитированием
Старый 24.04.2017, 12:20   #15
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
using есть давно уж
такой только с С++11
http://en.cppreference.com/w/cpp/language/type_alias
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.04.2017, 12:21   #16
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Нет, код с using компилится, добавляешь лямбды - лоамется, нада ставить -std=c++11
Читайте внимательнее

attr(optional)
attr(C++11) - optional sequence of any number of attributes
alexzk вне форума Ответить с цитированием
Старый 24.04.2017, 12:28   #17
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

я g++ не указываю стандарт 11, по умолчанию, он берет последний перед 11 (потому что, там были багфиксы, но не было кардинальных изменений типа ламбд и прочего). Так что, если VS не взял - то ето баг вс.
...вы не поверите, сколько раз я себя одергивал, чтобы писать не по 11, а по старому, а местами, даже хелпы читал - потому что не помню.
Забейте на старье, пользуйтесь 14 и начинайте учить 17.
Любые новые исправления, в старый код, должны вносится по 14-17, я так считаю. (ну кроме старых платформ - там без вариантов и оплата соотв.).

Последний раз редактировалось alexzk; 24.04.2017 в 12:32.
alexzk вне форума Ответить с цитированием
Старый 24.04.2017, 12:31   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

http://rextester.com/KVU98563
error: expected nested-name-specifier before ‘hand_t’
using hand_t = std::vector<card>;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.04.2017, 12:38   #19
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
http://rextester.com/KVU98563
error: expected nested-name-specifier before ‘hand_t’
using hand_t = std::vector<card>;
уговорили

g++ --std=c++03 cards.cpp
In file included from /usr/include/c++/6.3.1/array:35:0,
from cards.cpp:2:
/usr/include/c++/6.3.1/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support \


но у него не было ошибки в 35 строке. Значит есть следущий стандарт.
Черт....следущий походу 11, которого в 2008 не было...

Последний раз редактировалось alexzk; 24.04.2017 в 12:42.
alexzk вне форума Ответить с цитированием
Старый 24.04.2017, 12:47   #20
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Уговорили, новый код по стандарту 2003
alex@moy-super:~/Work/tests$ g++ --std=c++03 cards.cpp
alex@moy-super:~/Work/tests$ ./a.out

Исходная колода:
2 3 4 5 6 7 8 9 10 J Q K A
2 3 4 5 6 7 8 9 10 J Q K A
2 3 4 5 6 7 8 9 10 J Q K A
2 3 4 5 6 7 8 9 10 J Q K A
Перемешанная колода:
7 8 3 Q 9 4 2 3 6 8 5 8 10
7 9 4 5 10 A 4 4 5 6 Q K 3
K 10 9 10 7 9 J 5 Q 7 6 2 2
A J 6 A 3 2 K J J A K 8 Q

1й игрок:
7 8 3 Q 9 4 2 3 6 8 5 8 10

2й игрок:
7 9 4 5 10 A 4 4 5 6 Q K 3

3й игрок:
K 10 9 10 7 9 J 5 Q 7 6 2 2

4й игрок:
A J 6 A 3 2 K J J A K 8 Q



Код:
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<ctime>


using namespace std;
enum Suit{clubs, diamonds, hearts, spades};
const int jack=11;
const int queen=12;
const int king=13;
const int ace=14;
class card
{
private:
	int number;
	Suit suit;
public:
	card()
	{}
    card(int n, Suit s)
    {
        set(n, s);
    }
	void set(int n, Suit s)
	{ suit=s; number=n;}
	void display() const; //важное дополнение const, позволяет дальше вызывать дисплей, для const объектов
};
void card ::display() const
{
	if(number>=2 && number <=10)
		cout<<number;
	else 
	{
		switch(number)
		{
		case jack: cout<<'J'; break;
		case queen: cout<<'Q'; break;
		case king: cout<<'K'; break;
		case ace: cout<<'A'; break;
		}
	}
	switch (suit)
	{
	case clubs: cout<<static_cast<char>(5); break;
	case diamonds: cout<<static_cast<char>(4); break;
	case hearts: cout<<static_cast<char>(3); break;
	case spades: cout<<static_cast<char>(6); break;
	}
}

typedef std::vector<card> hand_t ; //вектор карт, это как бы массив переменной длины

//массив фиксированой длины из векторов, в отличие от обычного массива, может давать итераторы для стандартных алгоритмов
//это замена авторских card ch1[13], ch2[13], ch3[13], ch4[13];
//раз есть номера - то это уже массив из массивов быть должен (у нас из векторов, что круче, можно раздавать 2 колоды сразу без изменений программы)
typedef  std::vector<hand_t> players_t ;

//можно сделать даже так
//using players_t = std::vector<hand_t>;
//в таком варианте игроков может быть не строго 4

//функция - печать (почти авторская)
void print_hand(const hand_t& what)
{
        //а здесь "трюк" sz = what.size(); j < sz, проверка условия вычисляется при каждом проходе цикла, мы не знаем, как много времени size(), может занять, но он не менятеся в процессе, поэтому мы его "оптимизируем"
        for(size_t j=0, sz = what.size(); j < sz; ++j) //j < sz evaluated on each step, so doing sz = what.size() will speedup
	{
		what.at(j).display(); //используем at, вместо [], т.к. дает const iterator
		cout<<" ";
		if(!((j+1)%13))
			cout<<endl;
	}
}

//функция - перемешатор
void shuffle(hand_t& what)
{
    for(size_t j=0, sz = what.size(); j < sz; ++j) 
	{
		int k=rand()%sz;
                std::swap(what[j], what[k]);		
	}
}


int main ()
{
	setlocale(LC_ALL,"rus");
	srand(time(NULL));
    
    hand_t    deck;
	players_t players;
    
        cout<<endl;
        deck.reserve(52); //ускоряем добавление элементов, говорим, что памяти нам понадобится на 52
	for(size_t i = 0; i < 52; ++i)
		deck.push_back(card( (i%13)+2, Suit(i/13) )); //добавляем элементы, а память уже есть, но там еще нет карт
	
	cout<<"Исходная колода:\n";
	print_hand(deck);    
	
	cout<<"Перемешанная колода:\n";
    shuffle(deck);
    print_hand(deck);    
	
    //деление колоды на 4 части
    players.resize(4); //4 игрока, резервируем пустые места (теперь это вектор, по старому стандарту)
    for (size_t i = 0, hand_sz = deck.size() / players.size(); i < players.size(); ++i) //for std::array method size() is constant, so can use directly on each step
    {        
        players[i].resize(hand_sz); //создаем 12 пустых карт игрока (в отличие от reserve, который только резервирует память)
        //copy принимает 3 параметра - откуда_начало, откуда_конец, куда_начало (все итераторы)
        std::copy(deck.begin() + i * hand_sz, deck.begin() + (i + 1) * hand_sz, players[i].begin());
        cout << std::endl << i + 1 << "й игрок:" << std::endl;
        print_hand(players[i]);
    }
    	deck.clear(); //очищаем колоду - в банке карт теперь нет
        cin.ignore(); //ждем нажатия ENTER, авторский getch работает только на windows
	return 0;
}
alexzk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация htior Помощь студентам 0 25.01.2013 18:50
Оптимизация Красноглаз Паскаль, Turbo Pascal, PascalABC.NET 2 29.09.2011 11:16
Оптимизация... MikeMNN Общие вопросы C/C++ 0 15.12.2010 17:40
Оптимизация Alex Cones Общие вопросы Delphi 9 07.07.2010 08:47
Оптимизация Viper1287 Операционные системы общие вопросы 7 13.09.2009 15:33