离散数学这门课的实践作业,为什么要用Java给自己徒增难度呢?
题目实例如下:
主类:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//第一部分:
//处理输入的数据以及交互界面
//输入变量个数的交互:
System.out.print("请输入变量个数:");
int varNum;//定义输入的变量
Scanner scanner = new Scanner(System.in);
varNum = scanner.nextInt();
int lineNum = (int)Math.pow(2,varNum);
//将元素读入一个String
System.out.println("请输入"+lineNum+"个元素数目<用T,F表示>:");
Scanner scannerItem = new Scanner(System.in);
String items = scannerItem.nextLine();
//将刚读入的String转换成char数组,方便之后同二维表联动
char[] itemChar =new char[lineNum] ;
int counts =lineNum-1;
for (int i = 0; i < items.length(); i++) {
if (items.charAt(i)=='T'||items.charAt(i)=='F'){
itemChar[counts] = items.charAt(i);
counts-=1;
}
}
//第二部分:
//用另一个类处理逻辑部分
//首先将用户的输入使用构造函数载入类中
TheTurevalueTable theTurevalueTable = new TheTurevalueTable(varNum,itemChar);
theTurevalueTable.FillTheLine();//初始化一个二维表类型为boolen
theTurevalueTable.PrintTable();//打印整个真值表
theTurevalueTable.PrintMinItem();//输出极小项
theTurevalueTable.PrintMaxItem();//输出极大项
}
}
逻辑处理类:
public class TheTurevalueTable {
private int varNum;
//求出真值表的行数
private int lineNum;
Boolean[][] line;
char[] item;
char[] varname = { 'P','Q','R','S','D','M','N','L','J','K' };
public TheTurevalueTable(int varNum,char[] item){
this.varNum = varNum;//将变量个数传递到类的里面
this.lineNum= (int) Math.pow(2,varNum);
//设置整体的数据结构,一张Bollen表
this.line = new Boolean[lineNum][varNum];
this.item = item;
}
public void FillTheLine(){
int counts = lineNum;
System.out.println("输出真值表:");
for (int i = 0;i<lineNum;i+=1){
int TrueOrFalse = i;
for (int j=varNum-1;j>=0;j-=1){
int TestTrueOrFalse = TrueOrFalse%2;
if (TestTrueOrFalse==1){
line[i][j] = true;
}else {
line[i][j] = false;
}
TrueOrFalse/=2;
}
}
}
public void PrintTable(){
for (int i = 0; i < varNum; i++) {
System.out.print(varname[i]+" ");
}
System.out.println("A");
for (int i = 0; i < varNum; i++) {
System.out.print("------");
}
System.out.println("");
int counts =0;
for (int i = 0; i < lineNum; i++) {
for (int j = 0; j < varNum; j++) {
if (line[i][j]){
System.out.print("T ");
}else {
System.out.print("F ");
}
}
System.out.print(item[counts]);
System.out.println("");
counts++;
}
}
public void PrintMinItem(){
System.out.println("输出主析取范式:");
for (int i = 0; i < lineNum; i+=1) {
if (item[i]=='T'){
if (i!=0) System.out.print("∨ ");
System.out.print("<");
for (int j = 0; j < varNum; j++) {
if (line[i][j]) {
System.out.print(" "+varname[j]);
} else {
System.out.print(" ┐" + varname[j]);
}
if (j != varNum - 1) {
System.out.print("∧");
}
}
System.out.print("> ");
//if (i!=lineNum-1) System.out.print("∨ ");
}
}
System.out.println("");
}
public void PrintMaxItem(){
System.out.println("输出合取范式:");
for (int i = 0; i < lineNum; i+=1) {
if (item[i]=='F'){
if (i!=0) System.out.print("∧ ");
System.out.print("<");
for (int j = 0; j < varNum; j++) {
if (line[i][j]) {
System.out.print(" ┐"+varname[j]);
} else {
System.out.print(" " + varname[j]);
}
if (j != varNum - 1) {
System.out.print("∨");
}
}
System.out.print("> ");
}
}
}
}
唯一的难点在于什么时侯输出负号,解决办法是放在上一句末尾输出符号,这样特判就有了条件
if (i!=0) System.out.print("∧ ");
if (i!=lineNum-1) System.out.print("∨ ");