0

enter image description here

I am creating a program that asks users diagnostic questions and then asks a another question, the new question being selected based on their previous answer. It is based on the image which was taken from a Chapter assignment in a textbook. I have gotten the program to work, but to me my solution seems inefficient, I am wondering if there is a more efficient means of completing my task. The goal of the program is to take in user symptoms and then provide a diagnosis based on those symptoms. To me having that many switches inside of each other looks messy.

  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);

}
}
Matt.Ea
  • 21
  • 1

1 Answers1

1

There are lots of good ways to do it, I think nesting switches isn't one. For this kind of application it is better to use a data-driven model, as you can transform that later more easily. Just consider the current code, transforming it back to the graph in the textbook cannot be automated in an easy way. I attempt to show a better way. With this structure with the model in memory, you could even write a program to generate the above nested Java code. So I suggest something like this:

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();
    }

}

This code basically builds up the same graph in the memory as in the textbook, and interprets it as if it were a computer program. We do this kind of interpretation all the time when our aim is to write a clear and maintainable (but a bit slower) code.

Tamas Hegedus
  • 28,755
  • 12
  • 63
  • 97
  • A nice demonstration. One small issue with the OP's provided diagram is that it contains one example where a "no" results in two different questions, so the graph must handle such a case. Not a big deal to extend the example. – KevinO Mar 29 '16 at 23:13
  • I haven't learnt about states yet, as I am trying to self teach myself Java. Could you recommend any good resources for learning a little more about states? – Matt.Ea Mar 29 '16 at 23:36