文档详情

QM算法源代码和说明.docx

发布:2017-05-09约3.58千字共6页下载文档
文本预览下载声明
QM算法说明 需求分析 本算法要求输入一最小项和无关项的待化简表达式,通过程序处理输出化简后的结果。 算法流程 程序首先要求用户输入待化简表达式的变量数,然后要求用户逐个输入值为1的项,以2表示输入结束,再要求用户逐个输入无关项同样以2结束。程序将用户输入的所有数据储存在一个数据容器vector中,并将相关项单独存在另一个vector中。 然后程序通过循环遍历所有相关项,将相邻的项合并成蕴涵项存入新建的vector中,无法再合并的项显然为本源蕴涵项,存入专门的容器。之后再对新建的vector中的蕴涵项重复上述操作,直到找到所有的本源蕴涵项。由于变量最多为10个,故合并最多进行10次,故所有合并可在一个10元vector数组内完成。 当之前的工作完成时,此时显然已找到所有的本源蕴涵项,此时遍历之前存储的相关项,统计被覆盖的次数并输出只被覆盖一次的项所属的本源蕴涵项(皆为本质本源蕴涵项)。之后再从vector尾部开始输出其他本源蕴涵项直到所有的相关项都被覆盖为止。 运行结果 测试数据采用《现代逻辑设计》(第二版)P86的样例,F=Σm(4,5,6,8,9,10,13)+d(0,7,15); 结果并非最优的,是因为最后没有寻找最小覆盖导致的。 附:C++源代码 #include iostream #include cmath #include cstdlib #include vector //#include fstream using namespace std; //ofstream out(c://a.log); bool comp(int n, char* a, char* b) { for(int i=0; in; i++) { if(a[i]!=b[i] (a[i]!=-b[i]!=-))return false; } return true; } int implicant(int n, char*a, char*b) { int count = 0,temp; for(int i=0; in; i++) { if(a[i]!=b[i]) { count++; temp = i; } } if(count == 1)return temp; else return -1; } bool cointain(int n, char* a, char* b) { for(int i=0; in; i++) { if(a[i]!=b[i] (a[i]!=-))return false; } return true; } int main() { int i,j,k,l,n,count,tmp; char *temp,c; vector char* v[10]; vector char* relative; vector char* prime; vector char* result; bool flag[2]; cout输入变量数:endl; cinn; temp = new char[n]; cout请输入最小项(2结束):endl; flag[0] = true; while(flag[0]) { for(i = 0; in; i++) { cintemp[i]; if(temp[i]!=0 temp[i]!=1) { flag[0] = false; break; } } if(flag[0]) { v[0].push_back(new char[n]); relative.push_back(new char[n]); strcpy(v[0].back(),temp); strcpy(relative.back(),temp); } } cout请输入无关项(2结束):endl; flag[0] = true; while(flag[0]) { for(i = 0; in; i++) { cintemp[i]; if(temp[i]!=0 temp[i]!=1) { flag[0] = false; break; } } if(flag[0]) { v[0].push_back(new char[n]); strcpy(v[0].back(),temp); } } for(i = 0; i10; i++) { if(v[i].empty())break; for(j = 0; jv[i].size(); j++) {
显示全部
相似文档