Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
_connect
2 / 2 / 0
Регистрация: 16.05.2013
Сообщений: 16
1

Упростить код

18.05.2015, 21:30. Просмотров 867. Ответов 2
Метки нет (Все метки)

Добрый вечер.

Такая задача.

Исходные данные: вектор размерностью кратной 3
Выходные данные: вектор, получающийся из исходного заменой каждого блока из трех элементов на соответствующий блок из двух элементов.
Код
    {0, 0, 0} => {0, 0}
    {0, 0, 1} => {0, 1}
    {0, 1, 0} => {0, –1}
    {0, 1, 1} => {1, 0}
    {1, 0, 0} => {1, 1}
    {1, 0, 1} => {1, –1}
    {1, 1, 0} => {–1, 0}
    {1, 1, 1} => {–1, 1}
Сделал так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    std::vector<int> ivec({0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1});
 
    std::vector<int> ovec;
 
    for(std::vector<int>::const_iterator it = ivec.cbegin(); it != ivec.cend(); it += 3)
    {
        if(*it == 0)
        {
            if(*(it + 1) == 0)
            {
                if(*(it + 2) == 0)
                {
                    ovec.push_back(0);
                    ovec.push_back(0);
                }
                else
                {
                    ovec.push_back(0);
                    ovec.push_back(1);
                }
            }
            else
            {
                if(*(it + 2) == 0)
                {
                    ovec.push_back(0);
                    ovec.push_back(-1);
                }
                else
                {
                    ovec.push_back(1);
                    ovec.push_back(0);
                }
            }
        }
        else
        {
            if(*(it + 1) == 0)
            {
                if(*(it + 2) == 0)
                {
                    ovec.push_back(1);
                    ovec.push_back(1);
                }
                else
                {
                    ovec.push_back(1);
                    ovec.push_back(-1);
                }
            }
            else
            {
                if(*(it + 2) == 0)
                {
                    ovec.push_back(-1);
                    ovec.push_back(0);
                }
                else
                {
                    ovec.push_back(-1);
                    ovec.push_back(1);
                }
            }
        }
    }
Как бы всю эту конструкцию попроще реализовать?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2015, 21:30
Ответы с готовыми решениями:

Упростить код
Разработать рекурсивную функцию , возвращающую значение : для перевода числа из...

Упростить код
#include&lt;iostream&gt; using namespace std; int main() { int a, b, c, d = 0, g...

Упростить код
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() {...

Упростить код
Добрый вечер! Есть задача: дан вещественный массив, определить номер столбца с...

Упростить код
Имеется код, как можно сделать что бы подщёт шел не с аа а с 0 // 400.cpp:...

2
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
18.05.2015, 23:36 2
Лучший ответ Сообщение было отмечено _connect как решение

Решение

_connect,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    std::vector<int> ivec({0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1});
    std::vector<int> ovec;
    int rec[8][2] = {
        {0, 0},
        {0, 1},
        {0, -1},
        {1, 0},
        {1, 1},
        {1, -1},
        {-1, 0},
        {-1, 1}
    };
    for (unsigned i = 0, idx; i < ivec.size(); i += 3) {
        idx = ivec[i+2] + ivec[i+1] * 2 + ivec[i] * 4;
        assert(idx < 8);
        ovec.push_back(rec[idx][0]);
        ovec.push_back(rec[idx][1]);
    }
1
Mr.X
Эксперт С++
3180 / 1707 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
19.05.2015, 09:55 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/////////////////////////////////////////////////////////////////////////////////////////
//Такая задача.
//
//Исходные данные: вектор размерностью кратной 3
//Выходные данные: вектор, получающийся из исходного заменой каждого блока из трех элементов 
//на соответствующий блок из двух элементов.
//
//{0, 0, 0} => {0, 0}
//{0, 0, 1} => {0, 1}
//{0, 1, 0} => {0, –1}
//{0, 1, 1} => {1, 0}
//{1, 0, 0} => {1, 1}
//{1, 0, 1} => {1, –1}
//{1, 1, 0} => {–1, 0}
//{1, 1, 1} => {–1, 1}
/////////////////////////////////////////////////////////////////////////////////////////
#include <ctime>
#include <iostream>
#include <iterator>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::vector < int   >   T_int_vect;
/////////////////////////////////////////////////////////////////////////////////////////
T_int_vect  get_rand_binary_vect()
{
    int         size    =       (
                                    rand() % 10 + 1
                                )
 
                            *   3;
 
    T_int_vect  res;
 
    for( int  i = 0; i < size; ++i )
    {
        res.push_back( rand() % 2 );
    }
 
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     get_ternary_digit( int  num )
{
    return      num     >   1
                    ?   -1
                    :   num;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_int_vect  get_ternary_vect_from_binary( T_int_vect    vect_binary )
{
    T_int_vect  res;
    int         number  =   0;
 
    for( size_t  i = 0; i < vect_binary.size(); ++i )
    {
        number  <<=     1;
        number  +=      vect_binary[i];
 
        if  (
                i   %   3   ==  3 - 1
            )
        {
            res.push_back(  get_ternary_digit   (   number  /   3   )   );
            res.push_back(  get_ternary_digit   (   number  %   3   )   );
            number  =   0;
        }
    }//for
 
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_vect( T_int_vect  const   &   int_vect )
{
    std::copy
        (
            int_vect.begin              (),
            int_vect.end                (),
            std::ostream_iterator<int>  ( std::cout, " " )
        );
 
    std::cout   <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    srand(unsigned(time(0)));
 
    for(;;)
    {
        T_int_vect  vect_binary     =   get_rand_binary_vect();
        print_vect( vect_binary );
 
        print_vect
            (
                get_ternary_vect_from_binary( vect_binary )
            );
 
        std::cout   <<  std::endl
                    <<  std::endl;
 
        system("pause");
    }//for
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2015, 09:55

Упростить код
доброго времени суток, я совсем новичок в С++ (да и в программировании) сейчас...

Упростить код
Добрый день, подскажите, можно ли упростить код (используя уровень знаний как в...

упростить код
есть решена задача, надо упростить, из того перебора в инструкции switch() на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru