Форум программистов, компьютерный форум CyberForum.ru

Дана таблица с булевыми выражениями, некоторые элементы которой утеряны. Требуется восстановить таблицу - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сокеты: после вызова send программа зависает на функции recv http://www.cyberforum.ru/cpp-beginners/thread1247001.html
Извеняюсь за такое назание темы, но уже перепробовал 100 вариантов и постоянно выкидывает данное предупреждение, уже и не знаю что блин написать)) Проблема в следующем: Изучаю сокеты и столкнулся с небольшой проблемой, в данном коде я соеденяюсь с локкал хостом на порту 2222 дабы , и прописую данный порт в прокси в браузере, дабы отлавливать его заголовки, проблема в следующем, 1) после...
C++ Запуск командной строки VS из конкретного каталога Подскажите плиз, как запустить командную строку Visual Studio Command Promt (vsvars32.bat) из необходимого каталога, так как надоело постоянно использовать инструкцию cd.. для возврата из корневого каталога этого bat-файла. Я так понимаю, надо создать bat.файл и как-то указать путь, но все мои попытки завершились безуспешно. http://www.cyberforum.ru/cpp-beginners/thread1246995.html
C++ Json c++ send end write - существует ли готовая библиотека
Здрасте, нужна такая штука которая бы умела посылать json обьекты методом post на кукую-нить страницу и получать оттуда json обьект в виде std::string т.е. у нас есть какой-нить string std::string pal = "{\"planet\":\"Tirella\"}" Мы его отправляем методом post на страницу localhost/core.php Там че-то обработать и вернуть ответ ввиде json//эт я и сам могу сделать std::string otvet =...
В дочерних классах компилятор сообщает об Undefined reference to pure virtual functions C++
Здравствуйте! Имеется базовый класс с чисто виртуальным деструктором (virtual ~Service() = 0). Однако в дочерних классах мне компилятор сообщает об undefined reference to ...::~Service(). Service (шаблон) целиком объявлен и реализован в hpp файле. Как это понимать?
C++ Cannot convert from 'wchar_t' to 'const wchar_t *' http://www.cyberforum.ru/cpp-beginners/thread1246981.html
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L"abvgdee ziyklmnoprstuf 'e " ; wchar_t TranslatedWord ; wcscat(TranslatedWord,english ) ;
C++ Нужен пример рекурсивной функции для понимания ее назначения и практической пользы Не могу понять пользу рекурсии, может ли кто привести код в пример. подробнее

Показать сообщение отдельно
olegoner
 Аватар для olegoner
159 / 73 / 4
Регистрация: 22.04.2012
Сообщений: 221
26.08.2014, 18:07     Дана таблица с булевыми выражениями, некоторые элементы которой утеряны. Требуется восстановить таблицу
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
* Пояснение к решению:
* Что-бы не возится с символами, переведём строку в бинарный вид, заменяя T на 1,
* а F соответственно на 0 в соответсвующем бите. Таким образом, вся строка представляется
* одним байтом.
* Пример: TFFTTF = bin 100110 = dec 38 = hex 0x26
* Теперь над строками можно выполнять побитные операции.
* Т.к. независимых переменных в таблице истиности будет только две, то строки могут принимать только 4 значения
* 00 000 001 = 0x01
* 00 010 111 = 0x17
* 00 100 110 = 0x26
* 00 111 101 = 0x3D
* их мы и заносим в константный массив line
* для каждой считанной строки мы формируем три переменные:
* mask - маска заполненных символов (для F????? => mask = 00 100 000; для ??T??? mask = 00 001 000)
* positive - все знаки вопроса заменяются 1 (F????? positive = 00 011 111)
* negative - все знаки вопроса заменяются 0 (F????? negative = 00 000 000)
* далее устанавливается побитовая эквивалетность между (positive ~ line[i]) и (negative ~ line[i])
* после чего выполняется побитовая конъюнкция к полученным числам. В результате, получаем маску совпадения строки
* таблицы истиности и востанавливаемой. Если эта маска при побитной дисъюнкции с отрицанием mask даст 00 111 111 = 0x3F,
* то это означает, что строка таблицы на 100% совпадает с шаблоном исследуемой строки.
* После приобразований алгебры логики получаем выражение, описывающее данные операции:
* p_line[i] = (~(((line[i] ^ positive) | (line[i] ^ negative)) & mask)) & 0x3F;
* здесь, что бы "погасить" два старших бита дополнительно наложена маска 00 111 111 = 0x3F.
* Каждой строке таблицы истиности мы присвоили уникальный код: 1,2,4,8 соответсвенно.
* После вычисления p_line[i], если найдено 100% совпадение line[i] с шаблоном, мы прибавляем код строки к
* ключу key, который является уникальным для любой комбинации строк, удволетворяющих шаблону (из-за свойств степени двойки).
* Запоминаем последнюю шаблонную (100%) строку в pos. Из неё будем востанвливать символы.
* Теперь мы можем получить "маску вывода" по ключу, т.е. символы, которые мы будем выводить из сохранённой строки таблицы истиности.
* Предварительно эти маски были подсчитаны (из комбинаторики их 15).
* Теперь просто переводим число обратно в строку, используя массив masks_f, элементы которого - маски на отдельне биты (например 00 001 000 или 00 000 010)
* Исходя из ограничений на N, выполнение программы не должно привысить 1 сек (хотя не испытовал)
* Для увелечения скорости выполнения, можно сделать ввод - вывод в стиле С.
*/
 
 
 
#include <fstream>
int main()
{
    const char code[4] = {1,2,4,8};//коды строк таблицы истиности
    const char line[4] = {0x01,0x17,0x26,0x3D};//таблица истиности
    
    char masks[16];//массив масок вывода
    char masks_f[6] = {0x20,0x10,0x08,0x04,0x02,0x01};// маски на отдельные биты для конвертирования строки в число и обратно
    
    
    masks[1] = 0x3F;
    masks[2] = 0x3F;
    masks[4] = 0x3F;
    masks[8] = 0x3F;
 
    for (int i = 0; i < 3; i++)
        for (int j = i+1; j < 4; j++)
            masks[code[i]+code[j]] = ~(line[i] ^ line [j]);
 
    for (int i = 0; i < 2; i++)
        for (int j = i+1; j < 3; j++)
            for (int k = j+1; k < 4; k++)
                masks[code[i]+code[j]+code[k]] = ~((line[i] ^ line [j]) | (line[i] ^ line [k]) | (line[k] ^ line [j]));
    masks[15] = 0x00; 
 
 
    char p_line[4];
    char mask;
    
    char positive, negative;
    char key;
    char pos;
    int N;
    
    std::ifstream inFile("input.txt");
    std::ofstream outFile("out.txt");
 
    if (! inFile.good()) 
    {
        outFile << "Can't open file 'input.txt'";
        return -1;
    }
 
 
    inFile >> N;
    inFile.get();
    char str[7];
 
    for (int count = 0; count < N; count++)
    {
 
        inFile.getline(str,7);
 
        mask = 0x00;
        positive = 0x00;
        negative = 0x00;
    
        //переводим строку в число
        for (int i = 0; i < 6; i++) 
            switch(str[i])
            {
                case 'F': mask |= masks_f[i]; break;
                case 'T': mask |= masks_f[i]; positive |= masks_f[i]; negative |= masks_f[i];break;
                default: positive |= masks_f[i];
            }
        if (mask == 0x00) 
        {
            outFile<<str<<std::endl;
            break;      
        }
    
 
        pos = 0;
        key = 0;
        //вычисляем ключ маски вывода
        for (int i = 0; i < 4; i++)
        {
            p_line[i] = (~(((line[i] ^ positive) | (line[i] ^ negative)) & mask)) & 0x3F;
            if (p_line[i] == 0x3F) 
            {
                key += code[i];
                pos = i;
            }
        }
        mask = masks[key];
 
        //востанавливаем строку по маске
        if (key != 0)
        {
            for (int i = 0; i < 6; i++)         
                if (str[i] == '?')
                    if ((mask & masks_f[i]) != 0x00)        
                        if ((masks_f[i] & line[pos]) != 0x00) str[i] = 'T';
                        else str[i] = 'F';
            str[6] = '\0';
        }
        else
            strcpy(str,"ERROR");
 
        outFile << str<<std::endl;
    }
    
    inFile.close();
    outFile.close();
    return 0;
}
 
Текущее время: 03:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru