Форум программистов, компьютерный форум, киберфорум
Van111
Войти
Регистрация
Восстановить пароль
Оценить эту запись

аналитический метод карт карно

Запись от Van111 размещена 30.03.2012 в 11:00
Обновил(-а) Van111 16.12.2012 в 18:42

Эту программу я написал когда клиент попросил реализовать карты карно, пытаться сделать, это как в викепедии - не получилось, с помощью строк - тоже провал. Потом наткнулся на аналитический метод, ПРАВИЛЬНО ПРЕДСТАВИЛ ДАННЫЕ и получил результат!!!
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
//1 и 0 = -
//0 и - = 0
//1 и - = - 
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#define capacity 3 //количество знаков в терме
#define SIZE_BEGIN 3 //количество термов
typedef std::vector<int> container_type;//обёртка - один терм
 
void print(std::vector<container_type> term,int SIZE)
{
   
 for (int i = 0; i < SIZE; ++i)
    {
        for (int j = 0; j < capacity; ++j)
        {
            std::cout << term[i][j] << ' ';
        }
       
        std::cout << std::endl;
    }   
        std::cout << std::endl;
    
}
 
int perebor (  std::vector<container_type> term,int &SIZE) //функция получа  нобор термов(векторов) состоящих из чисел(int) 
//1=большая буква терма, 0=маленькая буква терма, -1=отсутствие буквы
{
    int result=0;//количество сокращений
    SIZE--;//уменьшаем для цикла так как допусти между тремя термами можно произвести две операции
    std::vector< std::vector< int > > ::iterator iter;
    //temp - отвечает за каличество различий между двумя термами    nomer - номер терма
    for (int nomer=0,temp=0;nomer<SIZE;nomer++,temp=0,iter=term.begin())
    {
        for (int i=0;i<capacity;i++)//ищём количество различий между термами
        {
            if(term[nomer][i] !=term[nomer+1][i])
                temp++;
        }
        if(temp>1)// если сократить нельяз то continue
        {
            continue;
        }
        else
        {
            for (int i=0;i<capacity;i++)//проход по всем символам терма
            // в любой ситуации обновляется терм с индекос -nomer
            // терм с индекос nomer+1 удаляется
            {
                
                if(  ((term[nomer][i]==0) && (term[nomer+1][i]==1)) || ((term[nomer][i]==1) && (term[nomer+1][i]==0)) )    
                    {
                        term[nomer][i]=-1;
                        break;
                    }
               
               
                if(  ((term[nomer][i]==-1) && (term[nomer+1][i]==1)) || ((term[nomer][i]==1) && (term[nomer+1][i]==-1)) )    
                    {
                        term[nomer][i]=-1;
                        break;    
                    }
                
                    
             }
             iter+=nomer +1;
             term.erase(iter);//удаляем term[nomer+1], обновления мы всегда записываем в term[nomer]
             SIZE--;//колво термов уменьшилось
             nomer--;//естественно рас обновления записываются в первый терм,
             // то мы его должны сравнить с третьим термом(который стал вторым)
             print( term, SIZE+1);//возращаем SIZE его размер
             result++;
        }
        
        
 
    }
  
    
 
         
return result;    
}
 
 
 
 
 
 
int main()
{
   
   int SIZE=SIZE_BEGIN;
   int array[SIZE_BEGIN][capacity]={ {1,1,0} , {1,1,1}, {1,-1,-1}};
   std::vector<container_type> vec(SIZE,std::vector< int > (capacity));
   
   std::vector<container_type>::iterator iter = vec.begin();
  
   for (int i = 0; i < SIZE; ++i)
        for (int i2 = 0; i2 < capacity; ++i2)
             iter[i][i2]=array[i][i2];
    
     
 
 
 
    
    while(perebor(vec,SIZE));
   
  
 
 
 
    
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
уважаемые коллеги оставляйте Коментарии, а то просмотров много, а комментов нет.
Размещено в Без категории
Показов 6486 Комментарии 4
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Аватар для MuslimPalit
    нельзя по проще сделать без векторов и прочих библиотек, не понятно вообще
    Запись от MuslimPalit размещена 02.11.2015 в 23:03 MuslimPalit вне форума
  2. Старый комментарий
    Аватар для MuslimPalit
    кто нибудь напишите на человеческом с использованием динамического массива
    Запись от MuslimPalit размещена 13.11.2015 в 00:17 MuslimPalit вне форума
  3. Старый комментарий
    Аватар для Avazart

    Не по теме:

    Цитата:
    нельзя по проще сделать без векторов и прочих библиотек, не понятно вообще
    И вот как тебе должны ответить что бы не обидеть?

    Запись от Avazart размещена 13.11.2015 в 00:57 Avazart вне форума
  4. Старый комментарий
    Аватар для Avazart
    Van111, Вероятно вектора то стоило передавать бы по ссылке..
    Запись от Avazart размещена 13.11.2015 в 00:59 Avazart вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru