import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.Graphics; import java.lang.Math; import java.util.*; public class LogikFormeln extends Applet { Label l1=new Label("aussagenlogische Formel lautet:"); TextField aufgabe_eingabe=new TextField(100); //在这个文本框里输入要计算的式子 Button normalform=new Button("Ergebniss anzeigen"); //显示总的计算结果的按钮 Label tk_ergebniss=new Label("Die aussagenlogische Formel ist ............."); //显示是Tautologie或者Kontradiktion的标签 Label nf_anzeigen1=new Label("Normalform lautet ............."); //显示用Normalform表示的计算结果 Label nf_anzeigen2=new Label(""); //显示用Normalform表示的计算结果 Label l2=new Label("Bitte hier die Wert der Variablen eingeben:"); TextField var_wert_eingabe=new TextField(100); //在这个文本框里输入逻辑变量的值 Button rechnen=new Button("Die Wert anzeigen"); //对于变量的个别值,显示其结果的按钮 Label wert_anzeigen=new Label("Das Ergebniss lautet:"); //对于变量的个别值,显示其结果的标签 Panel p1=new Panel(); Panel p2=new Panel(); String aufgabe=""; //保存用户输入的逻辑表达式 String nf=""; //保存Normalform的字符串 public void init() { setBackground(Color.white); //背景设成白色 setLayout(new GridLayout(6,1)); //分成6行1列 //布置第一行 add(p1); p1.setLayout(new BorderLayout()); p1.add(l1,BorderLayout.WEST); p1.add(aufgabe_eingabe,BorderLayout.CENTER); p1.add(normalform,BorderLayout.EAST); //布置第二行 add(tk_ergebniss); //布置第三行 add(nf_anzeigen1); //布置第四行 add(nf_anzeigen2); //布置第五行 add(p2); p2.setLayout(new BorderLayout()); p2.add(l2,BorderLayout.WEST); p2.add(var_wert_eingabe,BorderLayout.CENTER); p2.add(rechnen,BorderLayout.EAST); //布置第六行 add(wert_anzeigen); ///////////////////////////////显示总的计算结果的按钮开始//////////////////////////////////////// normalform.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { nf=""; String logikformel=""; //把变量换成相应的0或1 int var_anzahl; //看看有多少个变量 aufgabe=aufgabe_eingabe.getText(); //从文本框中得到字符串,即用户输入的逻辑表达式 aufgabe=leerzeichen_entfernen(aufgabe); //调用这个函数去掉字符串中的空格 umwandeln_1(); //调用这个函数把用户输入的逻辑表达式变换成需要的格式,即把逻辑符号数字化,为了确定计算的优先级别 int schritt=0; //用来保存需要多少计算步骤,即每个不等于0和1的数字就是一步 schritt=wieviele_operator(aufgabe); //这个函数用来数一下表达式中有多少个已经数字化的逻辑符号,即多少步 var_anzahl=wieviel_var(aufgabe); //函数wieviel_var用来确定有多少个变量 int zeile=1; //真值表中有多少行,即2的n次方,n指变量数 //确定真值表有多少行 for(int i=0; i='A')&&(st.charAt(i)<='Z')) wieviel_buchstaben++; char [] buchstabe=new char[wieviel_buchstaben]; for(int i=0, j=0; i='A')&&(st.charAt(i)<='Z')) { buchstabe[j]=st.charAt(i); j++; } } for(char i='A'; i<='Z'; i++) //确定变量字符 { for(int j=0; j=0; i--) { rest=zaehler%2; if(rest==1) wert[i]="1"; else wert[i]="0"; zaehler=zaehler/2; } for(char i='A'; i<='Z'; i++) { for(int j=0; j=0; i--) //必须从后面向前找,因为非门可以有无限个 { if(st_operator[m].equals(eingabe[i])) { index=i; break; } } if(st_operator[m].charAt(st_operator[m].length()-1)=='6') zwischen_ergebniss=f_und(eingabe,index,eingabe[index-1],eingabe[index+1]); if(st_operator[m].charAt(st_operator[m].length()-1)=='5') zwischen_ergebniss=f_oder(eingabe,index,eingabe[index-1],eingabe[index+1]); if(st_operator[m].charAt(st_operator[m].length()-1)=='4') zwischen_ergebniss=f_implikation(eingabe,index,eingabe[index-1],eingabe[index+1]); if(st_operator[m].charAt(st_operator[m].length()-1)=='3') zwischen_ergebniss=f_aequivalenz(eingabe,index,eingabe[index-1],eingabe[index+1]); if(st_operator[m].charAt(st_operator[m].length()-1)=='7') zwischen_ergebniss=f_nicht(eingabe,index,eingabe[index+1]); if(st_operator[m].charAt(st_operator[m].length()-1)=='2') zwischen_ergebniss=f_antivalenz(eingabe,index,eingabe[index-1],eingabe[index+1]); return zwischen_ergebniss; } ///////////////////////////////////////字符串计算处理函数结束/////////////////////////////////////// ///////////////////////////////////antivalenz函数开始/////////////////////////////////// String f_antivalenz(String [] st1, int index, String st2, String st3) { String hilf=""; if(((st2.charAt(st2.length()-1)=='1')&&(st3.charAt(st3.length()-1)=='1'))|| ((st2.charAt(st2.length()-1)=='0')&&(st3.charAt(st3.length()-1)=='0'))) { for(int i=0; im) m=n[j]; } for(int j=0; j int implikation=4; //-> int oder=5; int und=6; int nicht=7; String st=""; for(int i=0; i='A')&&(aufgabe.charAt(i)<='Z')) { st=st+String.valueOf(aufgabe.charAt(i))+" "; } } //end of for aufgabe=st; } ///////////////////////逻辑符号数字化函数结束/////////////////////////////////////// //////////////////////////////用0和1替代变量函数开始//////////////////////////////////////// String umwandeln_2(String st, int n, int m) { int k=0; char [] var_char=new char[m]; //按照从A到Z,从0到m的顺序保存变量字符 int wieviel_buchstaben=0; String logik=""; //用0和1替代后的用户输入的逻辑表达式 String[] wert=new String[m]; //用0和1替代变量的数组 for(int i=0; i='A')&&(st.charAt(i)<='Z')) wieviel_buchstaben++; char [] buchstabe=new char[wieviel_buchstaben]; for(int i=0, j=0; i='A')&&(st.charAt(i)<='Z')) { buchstabe[j]=st.charAt(i); j++; } } for(char i='A'; i<='Z'; i++) //确定变量字符 { for(int j=0; j=0; i--) { rest=zaehler%2; if(rest==1) wert[i]="1"; else wert[i]="0"; zaehler=zaehler/2; } for(int i=0; i='A')&&(st.charAt(i)<='Z')) { for(int j=0; j='A')&&(st.charAt(i)<='Z')) { for(int j=0; j='A')&&(st.charAt(i)<='Z')) wieviel_buchstaben++; char [] buchstabe=new char[wieviel_buchstaben]; wievielvar=wieviel_buchstaben; for(int i=0, j=0; i='A')&&(st.charAt(i)<='Z')) { buchstabe[j]=st.charAt(i); j++; } } int n=-1; for(char i='A'; i<='Z'; i++) //看看有多少变量 { n=-1; for(int j=0; j