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

Метод Квайна-Мак'Класки - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти длину окружности и площадь круга заданного радиуса R http://www.cyberforum.ru/cpp-beginners/thread698062.html
Помогите решить задачи. Найти длину окружности и площадь круга заданного радиуса R. В качестве значения Pi использовать 3.14. Вывести полученные значения. Выяснить, принадлежит ли точка с координатами (х, у) кругу радиуса r с центром в начале координат
C++ Ошибка открытия файла Доброго времени суток! Пытаюсь сделать программу под свои нужны, для копирования фоток с телефона. Принцип таков: 1)выуживание имени файла из целефой папки 2)проверка на совпадения в library.txt a)если есть - пропуск б)если нет - копирование побитовым методом(не знаю как красиво сделать через апи) вот исходник: #include <stdio.h> #include <iostream> http://www.cyberforum.ru/cpp-beginners/thread698051.html
Составить программу для вычисления произведения чисел из диапазона от а до b, кратных 6 C++
Решить задачу с циклом For. Составить программу для вычисления произведения чисел из диапазона от а до b, кратных 6.
C++ Проверка ввода - число ли это, и целое ли
Как правильно сделать проверку ввода так, чтобы вводимое проверялось на то, число ли это, и целое ли, и если да, записывалось в переменную без повторного ввода? Делал так: ... int n; ... if (!(cin>>n)) cout << "Invalid input"; else cin>>n; ...
C++ Игры с массивом http://www.cyberforum.ru/cpp-beginners/thread698039.html
Здравствуйте, подскажите как решить следующую задачу? Есть одномерный массив array типа int, состоящий из 18 элементов. Требуется : каждый элемент этого массива проверить на повторяемость, и если элемент повторяется, то вычислить его значение по формуле array=array], где z- номер итерации от 1..18 Пример: есть массив int array={0,1,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; Начинаем...
C++ Объясните пожалуйста эту програм #include <stdio.h> #include <conio.h> #include <iostream> void main() { int i, n=0, k=0; char str; подробнее

Показать сообщение отдельно
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
10.05.2013, 18:13     Метод Квайна-Мак'Класки
Анна2405, Вот он! говнокод ! но работает !! на вход подаётся список термов
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <set>
 
using namespace std;
 
void print_def(int n, char symb){
    for (int i = 0; i < n; i++) {
        cout << symb;
    }
}
 
int pos(const string &v1, const string &v2){
    int cnt = -1;
    if (v1.size() != v2.size())
        return -1;
    for (int i = 0; i < v1.size(); i++) {
        if (v1[i] != v2[i]) {
            if (cnt != -1)
                return -1;
            cnt = i;
        }
    }
    return cnt;
}
 
bool check(const string &v1, const string &v2) {
    if (v1.size() != v2.size())
        return false;
    for (int i = 0; i < v1.size(); i++) {
        if (v1[i] != v2[i] && v1[i] != '*' && v2[i] != '*')
            return false;
    }
    return true;
}
 
int main(){
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int n = 10;
    vector <string> term;
    vector< vector < string > > d(n);
    string str;
    while (cin >> str) {
        int cnt = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str[i] == '1') {
                cnt++;
            }
        }
        term.push_back(str);
        d[cnt].push_back(str);
    }
    vector < vector <string> > scn(n);
    for (int t = 0; t < n - 1; t++) {
        printf("Board #%d\n", t); 
        if (d[t+1].size() == 0 || d[t].size() == 0)
            continue;
        print_def(d[t+1][0].size(), '-');
        for (int j = 0; j < d[t+1].size(); j++) {
            printf(" | ");
            cout << d[t+1][j];
        }
        printf(" | ");
        puts("");
        for (int i = 0; i < d[t].size(); i++) {
            cout << d[t][i]; 
            printf(" | ");
            for (int j = 0; j < d[t+1].size(); j++) {
                int k = pos(d[t][i], d[t+1][j]);
                if (k == -1)
                    print_def(d[t][i].size(), '-');
                else {
                    char tmp = d[t][i][k];
                    d[t][i][k] = '*';
                    scn[t].push_back(d[t][i]);
                    cout << d[t][i];
                    d[t][i][k] = tmp;
                }
                printf(" | ");
            }
            puts("");
        }
        puts("");
    }
    printf("---------------------\n"); 
    map <string, int> implic;
    vector <string> perv_impl;
    for (int t = 0; t < n - 1; t++) {
        printf("Board #%d\n", t); 
        if (scn[t+1].size() == 0 || scn[t].size() == 0)
            continue;
        print_def(scn[t+1][0].size(), '-');
        for (int j = 0; j < scn[t+1].size(); j++) {
            printf(" | ");
            cout << scn[t+1][j];
        }
        printf(" | ");
        puts("");
        for (int i = 0; i < scn[t].size(); i++) {
            cout << scn[t][i]; 
            printf(" | ");
            for (int j = 0; j < scn[t+1].size(); j++) {
                int k = pos(scn[t][i], scn[t+1][j]);
                if (k == -1)
                    print_def(scn[t][i].size(), '-');
                else {
                    char tmp = scn[t][i][k];
                    scn[t][i][k] = '*';
                    implic[scn[t][i]]++;
                    if (implic[scn[t][i]] == 2) { 
                        perv_impl.push_back(scn[t][i]);
                    }
                    cout << scn[t][i];
                    scn[t][i][k] = tmp;
                }
                printf(" | ");
            }
            puts("");
        }
        puts("");
    }
    map <string, int> finale;
    printf("\nimplicanti:\n");
    for (int i = 0; i < perv_impl.size(); i++) {
        finale[perv_impl[i]]++;
        cout << perv_impl[i] << "\n";
    }
    printf("---------------------\n"); 
    if (perv_impl.size() == 0 || term.size() == 0)
        return 0;
    print_def(perv_impl[0].size(), '-');
    printf(" | ");
    for (int j = 0; j < term.size(); j++) {
        cout << term[j];
        printf(" | ");
    }
    puts("");
    vector <int> flags(term.size(), -1);
    for (int i = 0; i < perv_impl.size(); i++) {
        cout << perv_impl[i] << " | ";
        for (int j = 0; j < term.size(); j++) {
            if (check(perv_impl[i], term[j])) {
                if (flags[j] == 0) { 
                    flags[j] = i;
                } else 
                    flags[j] = -2;
                print_def(perv_impl[i].size(), '*');
            }else 
                print_def(perv_impl[i].size(), '-');
            printf(" | ");
        }
        puts("");
    }
    vector <string> sim;
    for (int j = 0; j < term.size(); j++) {
        if (flags[j] > -1) {
            sim.push_back(perv_impl[flags[j]]);
            finale[perv_impl[flags[j]]]++;
        }
    }
    printf("---------------------\n"); 
    printf("\nsushestvennie implicanti:\n");
    for (int i = 0; i < sim.size(); i++) {
        cout << sim[i] << "\n";
    }
    printf("---------------------\n"); 
    printf("final answer:\n");
    for (map <string, int>::iterator it = finale.begin(); it != finale.end(); ++it) {
        if (it->second == 1) {
            cout << it->first << "\n";
        }
    }
    return 0;
}
Добавлено через 9 минут
Анна2405, если будет нужно, то я перепишу чтобы чисто было, а то я писал код, пока вы мне его объясняли

Добавлено через 16 часов 8 минут
Анна2405, Вот переписал покрасивей
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <set>
 
using namespace std;
 
void print_chars(int n, char symb){
    for (int i = 0; i < n; i++) {
        cout << symb;
    }
}
 
int pos(const string &v1, const string &v2){
    int cnt = -1;
    if (v1.size() != v2.size())
        return -1;
    for (int i = 0; i < v1.size(); i++) {
        if (v1[i] != v2[i]) {
            if (cnt != -1)
                return -1;
            cnt = i;
        }
    }
    return cnt;
}
 
bool check(const string &v1, const string &v2) {
    if (v1.size() != v2.size())
        return false;
    for (int i = 0; i < v1.size(); i++) {
        if (v1[i] != v2[i] && v1[i] != '*' && v2[i] != '*')
            return false;
    }
    return true;
}
 
vector <string> print_table(int num, vector <string> & row, const vector <string> & col) {
    vector <string> implicants;
    printf("\nTable %d - %d \n", num, num + 1);
    vector <string> ans;
    if (row.size() == 0 || col.size() == 0) {
        printf("--- Table is empty ---");
        return implicants;
    }
    int len = col[0].length();
    print_chars(len, ' ');
    printf(" | ");
    for (int i = 0; i < col.size(); i++) {
        cout << col[i] << " | ";
    }
    printf("\n");
    for (int i = 0; i < row.size(); i++) {
        cout << row[i] << " | ";
        for (int j = 0; j < col.size(); j++) {
            int k = pos(row[i], col[j]);
            if (k == -1) {
                print_chars(len, '-');
            } else {
                char tmp = row[i][k];
                row[i][k] = '*';
                implicants.push_back(row[i]);
                cout << row[i];
                row[i][k] = tmp;
            }
            printf(" | ");
        }
        printf("\n");
    }
    printf("\n");
    return implicants;
}
 
vector <string> total_board(const vector <string> & term, const vector <string> & primary_implicants) {
    vector <string> answer;
    printf("\n###Total Board###\n");
    vector <string> ans;
    if (term.size() == 0 || primary_implicants.size() == 0) {
        printf("--- Total Board is empty ---");
        return answer;
    }
    int len = term[0].length();
    print_chars(len, ' ');
    printf(" | ");
    for (int i = 0; i < term.size(); i++) {
        cout << term[i] << " | ";
    }
    printf("\n");
    vector <int> cols(term.size(), -1);
    for (int i = 0; i < primary_implicants.size(); i++) {
        cout << primary_implicants[i] << " | ";
        for (int j = 0; j < term.size(); j++) {
            if (!check(primary_implicants[i], term[j])) {
                print_chars(len, '-');
            } else {
                if (cols[j] == -1) {
                    cols[j] = i;
                } else 
                    cols[j] = -2;
                print_chars(len, '+');
            }
            printf(" | ");
        }
        printf("\n");
    }
    vector <bool> ch(primary_implicants.size(), true);
    for (int i = 0; i < term.size(); i++) {
        if (cols[i] > -1) {
            ch[cols[i]] = false;
        }
    }
    printf("\nCommited Implicants: \n");
    for (int i = 0; i < primary_implicants.size(); i++) {
        if (ch[i])
            answer.push_back(primary_implicants[i]);
        else {
            cout << primary_implicants[i] << endl;
        }
    }
    printf("\n");
    return answer;
}
 
int main(){
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int n;
    vector <string> term;
    vector< vector < string > > d;
    string str;
    while (cin >> str) {
        if (d.size() == 0) {
            n = str.length() + 1;
            d = vector< vector < string > > (n);
        }
        int cnt = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str[i] == '1') {
                cnt++;
            }
        }
        term.push_back(str);
        d[cnt].push_back(str);
    }
    printf("Input file : \n");
    for (int i = 0; i < n; i++) {
        printf("Group number %d (%d): ", i, d[i].size());
        for (int j = 0; j < d[i].size(); j++) {
            cout << d[i][j];
            if (j != d[i].size() - 1)
                printf(", ");
        }
        printf("\n");
    }
    printf("\n");
    vector < vector <string> > scn(n);
    for (int t = 0; t < n - 1; t++) {
        scn[t] = print_table(t, d[t], d[t+1]);
    }
    printf("\n---------------------\n"); 
    vector <string> temp, primary_implicants;
    map <string, int> implicants;
    for (int t = 0; t < n - 1; t++) {
        temp = print_table(t, scn[t], scn[t+1]);
        for (int i = 0; i < temp.size(); i++) {
            implicants[temp[i]]++;
            if (implicants[temp[i]] == 2) { 
                primary_implicants.push_back(temp[i]);
            }
        }
    }
    printf("\n\nPrimary Implicants : \n");
    for (int i = 0; i < primary_implicants.size(); i++) {
        cout << primary_implicants[i] << "\n";
    }
    vector <string> ans = total_board(term, primary_implicants);
    printf("\nFinal answer:\n");
    for (int i = 0; i < ans.size(); i++) {
        cout << ans[i] << endl;
    }
    return 0;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru