qq_33358091 2015-12-13 05:49 采纳率: 0%
浏览 2484

求助,把java转化成C语言

import java.util.*;
import java.io.*;

class Formula {

public Formula(List<Term> termList) {

    this.termList = termList;

}

public String toString() {

    String result = "";
    result += termList.size() + " terms, " + termList.get(0).getNumVars() + " variables\n";
    for(int i=0; i<termList.size(); i++) {

        result += termList.get(i).toString() + "\n";

}
return result;

}

public void reduceToPrimeImplicants() {

    originalTermList = new ArrayList<Term>(termList);
    int numVars = termList.get(0).getNumVars();

ArrayList[][] table = new ArrayList[numVars + 1][numVars + 1];
for(int dontKnows=0; dontKnows <= numVars; dontKnows++) {

for(int ones=0; ones <= numVars; ones++) {

    table[dontKnows][ones] = new ArrayList();

}

}
for(int i=0; i<termList.size(); i++) {

int dontCares = termList.get(i).countValues(Term.DontCare);
int ones      = termList.get(i).countValues((byte)1);
table[dontCares][ones].add(termList.get(i));

}

    for(int dontKnows=0; dontKnows <= numVars - 1; dontKnows++) {

for(int ones=0; ones <= numVars - 1; ones++) {

    ArrayList<Term> left   = table[dontKnows][ones];
    ArrayList<Term> right  = table[dontKnows][ones + 1];
    ArrayList<Term> out    = table[dontKnows+1][ones];
    for(int leftIdx = 0; leftIdx < left.size(); leftIdx++) {

        for(int rightIdx = 0; rightIdx < right.size(); rightIdx++) {

            Term combined = left.get(leftIdx).combine(right.get(rightIdx));
            if (combined != null) {

                if (!out.contains(combined)) {

                    out.add(combined); 

}
termList.remove(left.get(leftIdx));
termList.remove(right.get(rightIdx));
if (!termList.contains(combined)) {

    termList.add(combined);

}

}

}

}

}

}

}

public void reducePrimeImplicantsToSubset() {

    int numPrimeImplicants = termList.size();

int numOriginalTerms = originalTermList.size();
boolean[][] table = new boolean[numPrimeImplicants][numOriginalTerms];
for (int impl=0; impl < numPrimeImplicants; impl++) {

for (int term=0; term < numOriginalTerms; term++) {

    table[impl][term] = termList.get(impl).implies(originalTermList.get(term));

}

}

    ArrayList<Term> newTermList = new ArrayList<Term>();

boolean done = false;
int impl;
while (!done) {

impl = extractEssentialImplicant(table);
if (impl != -1) {

    newTermList.add(termList.get(impl));

} else {

    impl = extractLargestImplicant(table);
    if (impl != -1) {

        newTermList.add(termList.get(impl));

} else {

        done = true;

}

}

}
termList = newTermList;

    originalTermList = null;

}

public static Formula read(Reader reader) throws IOException {

    ArrayList<Term> terms = new ArrayList<Term>();
    Term term;
    while ((term = Term.read(reader)) != null) {

        terms.add(term);

}
return new Formula(terms);

}

private int extractEssentialImplicant(boolean[][] table) {

    for (int term=0; term < table[0].length; term++) {

        int lastImplFound = -1;
        for (int impl=0; impl < table.length; impl++) {

            if (table[impl][term]) {

                if (lastImplFound == -1) {

                    lastImplFound = impl;

} else {

                    // This term has multiple implications
                    lastImplFound = -1;
                    break;

}

}

}
if (lastImplFound != -1) {

            extractImplicant(table, lastImplFound);
            return lastImplFound;

}

}
return -1;

}

private void extractImplicant(boolean[][] table, int impl) {

    for (int term=0; term < table[0].length; term++) {

        if (table[impl][term]) {

            for (int impl2=0; impl2 < table.length; impl2++) {

                table[impl2][term] = false;

}

}

}

}

private int extractLargestImplicant(boolean[][] table) {

    int maxNumTerms = 0;
    int maxNumTermsImpl = -1;
    for (int impl=0; impl < table.length; impl++) {

        int numTerms = 0;
        for (int term=0; term < table[0].length; term++) {

            if (table[impl][term]) {

                numTerms++;

}

}
if (numTerms > maxNumTerms) {

            maxNumTerms = numTerms;
            maxNumTermsImpl = impl;

}

}
if (maxNumTermsImpl != -1) {

        extractImplicant(table, maxNumTermsImpl);
        return maxNumTermsImpl;

}
return -1;

}

private List<Term> termList;
private List<Term> originalTermList;


public static void main(String[] args) {

    try {

        Formula f = Formula.read(new BufferedReader(new FileReader(args[0])));
        f.reduceToPrimeImplicants();
        System.out.println(f.toString());
        f.reducePrimeImplicantsToSubset();
        System.out.println(f.toString());

}
catch(IOException e) {

}

}

}

  • 写回答

3条回答

  • 微wx笑 Java领域优质创作者 2015-12-13 06:16
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)