var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-37320067-1']); _gaq.push(['_setDomainName', 'fenec.net']); _gaq.push(['_setAllowLinker', true]); _gaq.push(['_setCampNameKey', 'Fenec team']); _gaq.push(['_setCampSourceKey', 'fenec.net']); _gaq.push(['_setCampTermKey', 'Fenec']); _gaq.push(['_setCampContentKey', 'Technologie']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();

Algorithme de Quine-McCluskey en C++

Maths, électronique numérique, Logique ...etc. Touts ces domaines ont besoin de simplifier des fonctions logiques pour une raison ou une autre , cela est possible avec cet algorithme. Après d'être sollicité par la demande d'un amis je vous présente la méthode de simplification par l'algorithme de McCluskey en langage C++ . pour éviter l'épuisement des yeux je vous conseils de copier le code qui suit et de le coller dans notepad++.


#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
using namespace std;

int MIN_BITS = 4;
vector<unsigned> input_values;
bool show_mid = false;

struct B_number{
    unsigned number;
    unsigned dashes;
    bool used;
};

vector<vector<B_number> > table;
vector<vector<B_number> > p_group;
vector<vector<B_number> > final_group;
vector<B_number> printed_numbers;

//----------------------------------------------------------
unsigned count_1s(unsigned number);
void print_binary(unsigned number);
void create_table();
void print_table();
B_number init_B_number(unsigned n,int d, bool u);
void create_p_group();
void print_p_group();
void print_p_binary(unsigned n, unsigned d);
void create_final_group();
void print_final_group();
bool is_printed(B_number n);
void init();
void getinput();
unsigned count_bits(unsigned n);
//----------------------------------------------------------

int main(int argc, char *argv[]) {

    cout<<"\nQMCS - Quine McCluskey Simplifier\n";
    if(argc >= 2)
    {
        string arg = argv[1];
        if(arg.find("-m") != -1) {
            show_mid = true;
            if(argc>=3) {
                arg = argv[2];
                if(arg.find("-b") != -1)
                    MIN_BITS = atoi(argv[3]);
            }
        }
        else if(arg.find("-h") != -1) {
            cout<<"-b X\tminimum bits should be X.\n"
                <<"-m  \tshow mid process computation.\n"
                <<"-h  \tshow this.\n";
            return 0;

        }
        else {
            if(arg.find("-b") != -1  && argc >=3)
                MIN_BITS = atoi(argv[2]);

            if(argc >=4) {
                       arg = argv[3];
                if(arg.find("-m") != -1)
                    show_mid = true;
            }
            else
            {
                cout<<"Invalid argument\n"
                    <<"-b X\tminimum bits should be X.\n"
                    <<"-m  \tshow mid process computation.\n"
                    <<"-h  \tshow this.\n";
                return 0;
            }
        }
    }

    getinput();
    init();

    return 0;

}


unsigned count_1s(unsigned number) {
    short bit =0;
    int count = 0;
    while(number>0)    {
        bit = number%2;
        number>>=1;
        if(bit) {
            count++;
        }
    }
    return count;
}

void print_binary(unsigned number) {
    unsigned bits[MIN_BITS];
    int count = 0;

    while(number>0||count<MIN_BITS)    {
        bits[count] = number%2;
        number>>= 1;
        count++;
    }
    for(int i=count-1;i>=0;i--)
        cout<<bits[i];
}

void create_table() {
    short tmp;
    B_number temp_num;
    for(int i=0;i<input_values.size();i++) {
        tmp = count_1s(input_values[i]);
        if(tmp+1>table.size())
            table.resize(tmp+1);

        temp_num = init_B_number(input_values[i],0,false);
        table[tmp].push_back(temp_num);
    }
}

void print_table() {

    cout<<endl<<"COMPUTING:"<<endl;
    for(int i=0;i<table.size();i++)    {
        cout<<i;
        for(int j=0;j<table[i].size();j++) {
            cout<<"\tm"<<table[i][j].number<<"\t";
            print_binary(table[i][j].number);
            cout<<endl;
        }
        cout<<"\n-------------------------------------"<<endl;
    }
}

B_number init_B_number(unsigned    n,int d, bool u) {
    B_number num;
    num.number = n;
    num.dashes = d;
    num.used = u;
    return num;
}

void create_p_group() {
    short tmp;
    B_number temp_num;
    unsigned temp_number, temp_dashes;
    for(int i=0;i<table.size()-1;i++) {
        for(int j=0;j<table[i].size();j++) {
            for(int k=0;k<table[i+1].size();k++) {
                temp_number = table[i][j].number & table[i+1][k].number;
                temp_dashes = table[i][j].number ^ table[i+1][k].number;

                if(count_1s(temp_dashes)==1) {
                    table[i][j].used = true;
                    table[i+1][k].used = true;


                    tmp = count_1s(temp_number);

                    if(tmp+1>p_group.size())
                        p_group.resize(tmp+1);

                    temp_num = init_B_number(temp_number, temp_dashes, false);
                    p_group[tmp].push_back(temp_num);
                }
            }
        }
    }
}

void print_p_group() {
    cout<<endl<<"MID PROCESS COMPUTATION:"<<endl;

    for(int i=0;i<p_group.size();i++) {
        cout<<i;
        for(int j=0;j<p_group[i].size();j++) {
            cout<<"\t\t";
            print_p_binary(p_group[i][j].number,p_group[i][j].dashes);
            cout<<endl;
        }
        cout<<"\n-------------------------------------"<<endl;
    }

}

void print_p_binary(unsigned n, unsigned d) {
    unsigned bits[MIN_BITS];
    int count = 0;

    while(n>0||count<MIN_BITS) {
        if(!(d%2))
            bits[count] = n%2;
        else
            bits[count] = 2;

        n >>= 1;
        d >>= 1;
        count++;
    }
    for(int i=count-1;i>=0;i--) {
        if(bits[i]!=2)
            cout<<bits[i];
        else
            cout<<"-";
    }
}

void create_final_group() {
    short tmp;
    B_number temp_num;
    unsigned temp_number, temp_dashes;
    for(int i=0;i<p_group.size()-1;i++) {
        for(int j=0;j<p_group[i].size();j++) {
            for(int k=0;k<p_group[i+1].size();k++) {
                if(p_group[i][j].dashes == p_group[i+1][k].dashes) {
                    temp_number = p_group[i][j].number & p_group[i+1][k].number;
                    temp_dashes = p_group[i][j].number ^ p_group[i+1][k].number;
                    if(count_1s(temp_dashes)==1) {
                        temp_dashes^= p_group[i][j].dashes;

                        p_group[i][j].used = true;
                        p_group[i+1][k].used = true;

                        tmp = count_1s(temp_number);

                        if(tmp+1>final_group.size())
                            final_group.resize(tmp+1);

                        temp_num = init_B_number(temp_number, temp_dashes, true);
                        final_group[tmp].push_back(temp_num);
                    }
                }
            }
        }
    }
}

void print_final_group() {
    cout<<endl<<"FINAL:\n-------------------------------------"<<endl;
    int i,j;
    for(i=0;i<final_group.size();i++) {
        for(j=0;j<final_group[i].size();j++) {
            if(!is_printed(final_group[i][j])) {
                print_p_binary(final_group[i][j].number,final_group[i][j].dashes);
                cout<<endl;
                printed_numbers.push_back(final_group[i][j]);
            }
        }
    }
    for(i=0;i<p_group.size();i++) {
        for(j=0;j<p_group[i].size();j++) {
            if(!p_group[i][j].used) {
                print_p_binary(p_group[i][j].number,p_group[i][j].dashes);
                cout<<endl;
            }
        }
    }
    for(i=0;i<table.size();i++) {
        for(j=0;j<table[i].size();j++) {
            if(!table[i][j].used) {
                print_p_binary(table[i][j].number,table[i][j].dashes);
                cout<<endl;
            }
        }
    }
    cout<<"-------------------------------------"<<endl;
}
bool is_printed(B_number n) {
    for(int i=0;i<printed_numbers.size();i++)
        if(n.number==printed_numbers[i].number && n.dashes == printed_numbers[i].dashes)
            return true;

    return false;
}

void init() {
    table.resize(1);
    p_group.resize(1);
    final_group.resize(1);
    create_table();
    print_table();
    create_p_group();
    if(show_mid)
        print_p_group();
    create_final_group();
    print_final_group();
}

void getinput() {
    unsigned in;
    int num_bits=0;
    cout<<"\nInput value followed by ENTER[^D ends input]\n> ";
    while(cin>>in) {
        input_values.push_back(in);
        num_bits = count_bits(in);
        if(num_bits>MIN_BITS)
            MIN_BITS = num_bits;
        cout<<"> ";
    }
}

unsigned count_bits(unsigned n) {
    short bit =0;
    int count = 0;
    while(n>0) {
        bit = n%2;
        n>>=1;
        count++;
    }
    return count;
}

0 commentaires:

Enregistrer un commentaire