我正在创建一个程序,该程序询问用户诊断问题,然后询问另一个问题,根据他们先前的答案选择新问题。它基于从教科书中的章节分配中获得的图像。
我已经使该程序开始工作,但是对我来说,我的解决方案似乎效率不高,我想知道是否有更有效的方法来完成任务。该程序的目标是吸收用户症状,然后根据这些症状提供诊断。对我来说,彼此之间有那么多开关看起来很混乱。
import java.util.*;
public class Diagnostic2 {
//main(): application entry point
public static void main(String[] args) {
System.out.println("\nFever Diagnostic Tool");
System.out.println("=====================");
System.out.println("\nDisclaimer: This tool is meant primarily to act as an indicator ");
System.out.println("of possible causes of fever symptoms. It is not meant to replace");
System.out.println("professional medical advise. If you believe you are sick ");
System.out.println("consult with your doctor about your symptoms.");
Scanner stdin = new Scanner(System.in);
System.out.print("\nDo you have a fever? (y/n): ");
char fever = stdin.next().trim().charAt(0);
String diagnosis = "Insufficient information to make diagnosis\n";
char cough = 'n';
char wheeze = 'n';
char headache = 't';
char achyJoints = 'n';
char rash = 'n';
char soreThroat = 'n';
char backPain = 'n';
char urinaryPain = 'n';
char tooHot = 'n';
char diarrhea = 'n';
char vomit = 'n';
switch (fever) {
case 'y':
System.out.print("\nAre you coughing? (y/n): ");
cough = stdin.next().trim().charAt(0);
switch (cough) {
case 'y':
System.out.print("\nAre you short of breath, wheezing, or coughing up phlegm? (y/n): ");
wheeze = stdin.next().trim().charAt(0);
switch (wheeze) {
case 'y':
diagnosis = "Possibilites include pneumonia or infection of airways.\n";
break;
case 'n':
System.out.print("\nDo you have a headache? (y/n): ");
headache = stdin.next().trim().charAt(0);
switch(headache) {
case 'y':
diagnosis = "Possibilites include viral infection.\n";
break;
case 'n':
System.out.print("\nDo you have a aching bones or joints? (y/n): ");
achyJoints = stdin.next().trim().charAt(0);
switch(achyJoints) {
case 'y':
diagnosis = "Possibilites include viral infection.\n";
break;
case 'n':
System.out.print("\nDo you have a rash? (y/n): ");
rash = stdin.next().trim().charAt(0);
switch(rash) {
case 'y':
diagnosis = "Insufficient information to list possibilities, consult with doctor.\n";
break;
case 'n':
System.out.print("\nDo you have a sore throat? (y/n): ");
soreThroat = stdin.next().trim().charAt(0);
switch(soreThroat) {
case 'y':
diagnosis = "Possibilites include throat infection.\n";
break;
case 'n':
System.out.print("\nDo you have back pain just above the waist with chills and fever? (y/n): ");
backPain = stdin.next().trim().charAt(0);
switch(backPain) {
case 'y':
diagnosis = "Possibilites include kidney infection.\n";
break;
case 'n':
System.out.print("\nDo you have pain urinating or are urinating more often? (y/n): ");
urinaryPain = stdin.next().trim().charAt(0);
switch(urinaryPain) {
case 'y':
diagnosis = "Possibilites include urinary tract infection.\n";
break;
case 'n':
System.out.print("\nHave you spent the day in the sun or hot conditions? (y/n): ");
tooHot = stdin.next().trim().charAt(0);
switch(tooHot) {
case 'y':
diagnosis = "Possibilites include sun stroke or heat exhaustion.\n";
break;
case 'n':
break;
}
}
}
}
}
}
}
}
break;
case 'n':
System.out.print("\nDo you have a headache? (y/n): ");
headache = stdin.next().trim().charAt(0);
switch(headache) {
case 'y':
System.out.println("\nAre you experiencing any of the following: pain when");
System.out.println("bending your head forward, nausea or vomiting, bright");
System.out.print("light hurting your eyes, drowsiness, or confusion? (y/n): ");
vomit = stdin.next().trim().charAt(0);
switch(vomit){
case 'y':
diagnosis = "Possibilites include meningitis.\n";
break;
case 'n':
System.out.print("\nAre you vomiting, or have had diarrhea? (y/n): ");
diarrhea = stdin.next().trim().charAt(0);
switch(diarrhea) {
case 'y':
diagnosis = "Possibilites include digestive tract infection.\n";
break;
case 'n':
System.out.print("\nDo you have a aching bones or joints? (y/n): ");
achyJoints = stdin.next().trim().charAt(0);
switch(achyJoints) {
case 'y':
diagnosis = "Possibilites include viral infection.\n";
break;
case 'n':
System.out.print("\nDo you have a rash? (y/n): ");
rash = stdin.next().trim().charAt(0);
switch(rash) {
case 'y':
diagnosis = "Insufficient information to list possibilities, consult with doctor.\n";
break;
case 'n':
System.out.print("\nDo you have a sore throat? (y/n): ");
soreThroat = stdin.next().trim().charAt(0);
switch(soreThroat) {
case 'y':
diagnosis = "Possibilites include throat infection.\n";
break;
case 'n':
System.out.print("Do you have back pain just above the waist with chills and fever? (y/n): ");
backPain = stdin.next().trim().charAt(0);
switch(backPain) {
case 'y':
diagnosis = "Possibilites include kidney infection.\n";
break;
case 'n':
System.out.print("\nDo you have pain urinating or are urinating more often? (y/n): ");
urinaryPain = stdin.next().trim().charAt(0);
switch(urinaryPain) {
case 'y':
diagnosis = "Possibilites include urinary tract infection.\n";
break;
case 'n':
System.out.print("\nHave you spent the day in the sun or hot conditions? (y/n): ");
tooHot = stdin.next().trim().charAt(0);
switch(tooHot) {
case 'y':
diagnosis = "Possibilites include sun stroke or heat exhaustion.\n";
break;
case 'n':
break;
}
}
}
}
}
}
}
}
break;
case 'n':
System.out.print("\nDo you have a aching bones or joints? (y/n): ");
achyJoints = stdin.next().trim().charAt(0);
switch(achyJoints) {
case 'y':
diagnosis = "Possibilites include viral infection.\n";
break;
case 'n':
System.out.print("\nDo you have a rash? (y/n): ");
rash = stdin.next().trim().charAt(0);
switch(rash) {
case 'y':
diagnosis = "Insufficient information to list possibilities, consult with doctor.\n";
break;
case 'n':
System.out.print("\nDo you have a sore throat? (y/n): ");
soreThroat = stdin.next().trim().charAt(0);
switch(soreThroat) {
case 'y':
diagnosis = "Possibilites include throat infection.\n";
break;
case 'n':
System.out.print("\nDo you have back pain just above the waist with chills and fever? (y/n): ");
backPain = stdin.next().trim().charAt(0);
switch(backPain) {
case 'y':
diagnosis = "Possibilites include kidney infection.\n";
break;
case 'n':
System.out.print("\nDo you have pain urinating or are urinating more often? (y/n): ");
urinaryPain = stdin.next().trim().charAt(0);
switch(urinaryPain) {
case 'y':
diagnosis = "Possibilites include urinary tract infection.\n";
break;
case 'n':
System.out.print("\nHave you spent the day in the sun or hot conditions? (y/n): ");
tooHot = stdin.next().trim().charAt(0);
switch(tooHot) {
case 'y':
diagnosis = "Possibilites include sun stroke or heat exhaustion.\n";
break;
case 'n':
break;
}
}
}
}
}
}
}
}
case 'n':
break;
}
System.out.println("--------------------------------------------------------------");
System.out.println("\nSymptoms");
if(fever == 'y') {
System.out.println("*\tFever");
}
if(cough == 'y') {
System.out.println("*\tCough");
}
if(wheeze == 'y') {
System.out.println("*\tWheezing");
}
if(headache == 'y') {
System.out.println("*\tHeadache");
}
if(achyJoints == 'y') {
System.out.println("*\tAchy joints or bones");
}
if(rash == 'y') {
System.out.println("*\tRash");
}
if(soreThroat == 'y') {
System.out.println("*\tSore throat");
}
if(backPain == 'y') {
System.out.println("*\tBack pain");
}
if(urinaryPain == 'y') {
System.out.println("*\tFrequent urination or pain urinating");
}
if(tooHot == 'y') {
System.out.println("*\tDay spent in hot conditions");
}
if(diarrhea == 'y') {
System.out.println("*\tDiarrhea");
}
if(vomit == 'y') {
System.out.println("*\tPain when bending head forward, nausea or vomiting,");
System.out.println("\tbright light hurting eyes, drowsiness or confusion.");
}
System.out.println("\nDiagnosis");
System.out.println("\t" + diagnosis);
}
}
最佳答案
有很多好的方法可以做到这一点,我认为嵌套开关不是一个。对于这种应用程序,最好使用数据驱动的模型,因为以后可以更轻松地对其进行转换。仅考虑当前的代码,就无法通过简单的方法将其转换回教科书中的图形。我试图显示一种更好的方法。通过将模型存储在内存中,您甚至可以编写一个程序来生成上述嵌套的Java代码。所以我建议像这样:
package hu.hege;
import java.util.Scanner;
public class State {
public final boolean terminal;
public final String message;
public final State positive;
public final State negative;
public State(boolean terminal, String message, State positive, State negative) {
this.terminal = terminal;
this.message = message;
this.positive = positive;
this.negative = negative;
}
public State(String message) {
this(true, message, null, null);
}
public State(String message, State positive, State negative) {
this(false, message, positive, negative);
}
public static State buildGraph() {
// It's recommended to engineer some file format, and read the graph
// structure from a resource file here
State insufficient = new State("Insuficcient information to list possibilities");
State further = new State("Continue to ask questions here...");
State qCough = new State("Are you coughing?", further, insufficient);
State qFever = new State("Do you have a fever?", qCough, insufficient);
// return entry question
return qFever;
}
public static void main(String[] args) {
State current = buildGraph();
Scanner stdin = new Scanner(System.in);
for (;;) {
System.out.println(current.message);
if (current.terminal)
break;
String choice = stdin.next().trim();
if (choice.startsWith("y")) {
current = current.positive;
} else if (choice.startsWith("n")) {
current = current.negative;
} else {
System.out.println("Unrecognized answer");
}
}
stdin.close();
}
}
这段代码基本上在内存中建立了与教科书相同的图形,并将其解释为计算机程序。当我们的目标是编写清晰且可维护(但速度稍慢)的代码时,我们始终会进行这种解释。