Advertisement
Zidinjo

Taschenrecher 3.0

Nov 20th, 2014
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.94 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.text.DecimalFormat;
  3. import java.util.Locale;
  4. import java.util.InputMismatchException;
  5.  
  6. public class Taschenrechner2 {
  7.  
  8.         public static void main(String[] args){
  9.                
  10.                 DecimalFormat df = new DecimalFormat("###,###,###.###"); // Fuer die Uebersichlichkeit sont zu lange Nachkommastellen
  11.                 Locale.setDefault(Locale.GERMAN); // Deutsche Tastatur anstatt . jetzt , moeglich
  12.                
  13.                 String wert = null; char vorzeichen = 0; Boolean while_schleife = true;  // String/Char/Boolean Variablen
  14.                 double berechneter_wert = 0; double wert_double = 0; // Double Variablen
  15.                 int pruefung_Werte = 0; int counter = 0; int hilfe = 1;
  16.                 Scanner scanner, scanner2; // Scanner Variablen
  17.                
  18.                 System.out.println("Hallo beim Taschenrechner, die Operatoren + , - , * , ! = Fakultaet , ^ = Potenz / sind erlaubt. Parameter e für Beendigung \n");
  19.                
  20.                 while(while_schleife) // Schleifenbedinung ist true außer wenn wir ein e eingeben dann wird der Boolean auf false gesetzt
  21.                 {
  22.                         try
  23.                         {
  24.                             if(counter ==0)
  25.                             {
  26.                                 System.out.println(eingabeHilfe(wert));
  27.                                 counter= 1;
  28.                             }
  29.                                 System.out.println("Ihr Wert ist  " + df.format(berechneter_wert)+" | e=ende c=clear |");
  30.                                 scanner = new Scanner(System.in); // Konsolen eingabe
  31.                                
  32.                                 wert = scanner.nextLine();
  33.                                 vorzeichen = wert.charAt(0); // char vorzeichen den 0ten Wert zuweisen. z.b + - * /
  34.                                
  35.                                 scanner2 = new Scanner(wert.substring(1)); // substring nach der Stelle 1 der rest in Typ Scanner verweisen
  36.                                
  37.                                 switch (vorzeichen)
  38.                                 {
  39.                                         case 'e': // | "" fuer String |  '' für char | int, double andere werte ist zahl nötig
  40.                                                 while_schleife=false; // Schleife Beendigt !
  41.                                         case 'c':
  42.                                                 berechneter_wert = 0.0;
  43.                                                 break; // break sonst Fehlermeldung wegen Methode vom Scanner !
  44.                                         case '!':
  45.                                                 pruefung_Werte = ganzZahl(berechneter_wert);
  46.                                                 if(pruefung_Werte == 0)
  47.                                                 {
  48.                                                     throw new NotNaturalNumberException();
  49.                                                 }
  50.                                                 else
  51.                                                 {
  52.                                                 berechneter_wert = fakultaet_berechnung(pruefung_Werte);
  53.                                                 }
  54.                                                 break;
  55.                                         case '^':
  56.                                                 wert_double = scanner2.nextDouble();
  57.                                                 berechneter_wert = potenz(berechneter_wert ,wert_double);
  58.                                                 break;
  59.                                         case '+':
  60.                                                 wert_double = scanner2.nextDouble();
  61.                                                 berechneter_wert = berechneter_wert + wert_double;
  62.                                                 break;
  63.                                         case '-':
  64.                                                 wert_double = scanner2.nextDouble();
  65.                                                 berechneter_wert = berechneter_wert - wert_double;
  66.                                                 break;
  67.                                         case '*':
  68.                                                 wert_double = scanner2.nextDouble();
  69.                                                 berechneter_wert = berechneter_wert * wert_double;
  70.                                                 break;
  71.                                         case '/':
  72.                                                 wert_double = scanner2.nextDouble();
  73.                                                 if(wert_double != 0) // Wenn nextDouble keine 0 vom Substring dann geht if sonst else -> Fehlermeldung
  74.                                                 {
  75.                                                         berechneter_wert = berechneter_wert / wert_double;
  76.                                                         break;
  77.                                                 }
  78.                                                 else
  79.                                                 {
  80.                                                         throw new DivisionByZeroException();
  81.                                                 }
  82.                                         default: // Wenn nichts eingeben wird, dann wird eine Fehlermeldung geworfen mit Verweis auf die Klasse Invalid...
  83.                                                 throw new InvalidOperatorException();
  84.                                 }
  85.                         }
  86.                         catch(DivisionByZeroException e)  // Auffangen (engl. catch) sonst Fehlermeldung nicht möglich
  87.                         {
  88.                                 System.out.println("Fehler --- "+ e +": Division durch 0 \n");
  89.                         }
  90.                         catch(InvalidOperatorException e)
  91.                         {
  92.                                 System.out.println("Fehler --- "+ e +": Unbekannter Operator \n");    
  93.                         }
  94.                         catch(InputMismatchException e)
  95.                         {
  96.                              System.out.println("Fehler --- "+ e +": Falsches Eingeabeformat \n");
  97.                         }
  98.                         catch(NotNaturalNumberException e)
  99.                         {
  100.                             System.out.println("Fehler --- "+ e +": Fakultäten können nur mit natürlichen Zahlen gebildet werden \n");
  101.                         }
  102.                         catch(Exception e)
  103.                         {
  104.                                 System.out.println("Fehler --- unbekannter Fehler \n");
  105.                         }
  106.                 }
  107.         }      
  108.         static String eingabeHilfe(String a) // EingabeHilfe -> nur 1 mal deshalb oben If Abfrage
  109.         {
  110.                 a ="Bitte Operationen z.B +9 eingaben oder *8 \n";
  111.                 return a;
  112.         }
  113.        
  114.         static int ganzZahl(double berechneter_wert) // Methode ganzZahl bekommt ein double und gibt ein Int zurück
  115.         {
  116.                 double pruefung = berechneter_wert / (int)berechneter_wert;
  117.                 if(pruefung < (1.0 + Math.pow(10.0,-15.0))) // Pruefung der Bedingung -> Double / int = 1,0
  118.                 {  
  119.                     return (int)berechneter_wert;
  120.                 }
  121.                 else
  122.                 {
  123.                     int hilfe = 0; // Eine Variable die für die If Abfrage im oberen segment wichtig ist bei !
  124.                     return hilfe; // gibt hilfe back !
  125.                 }      
  126.         }
  127.        
  128.         static  int fakultaet_berechnung(int berechneter_wert)
  129.         {
  130.             int fakultaet = 1; // wie bei der Fakultaet -  muss 1 sein ! Sonst nicht Matherror bro how blow
  131.             Boolean forschleife = false; // Abschluss der If Abfrage mit Integer.Max_Value -> sonst zu oft eingezeigt wenn mehr als overflow ist
  132.             for(int i =1; i <= berechneter_wert && forschleife == false; i++) // Fakultaet Bedingung i <= eingabe; Bei 5 nur 5 durchläufe
  133.             {
  134.                 try
  135.                 {
  136.                     if((Integer.MAX_VALUE/i)<fakultaet) //Int Max Value = 2.147.483.647
  137.                     {
  138.                         forschleife = true;
  139.                         throw new ResultErrorException(); // Wirft Overflow Exception
  140.                     }
  141.                     fakultaet = fakultaet * i;
  142.                 }
  143.                 catch (ResultErrorException e)
  144.                 {
  145.                     System.out.println("Fehler --- "+ e +": Integer-Overflow \n");
  146.                     fakultaet = berechneter_wert; // Wichtig damit wir den vorherigen Wert haben, sonst ist das der Overflow wert oder 1
  147.                 }
  148.             }
  149.             return fakultaet;
  150.         }
  151.        
  152.         static double potenz(double a, double b) // Potenz methode bekommen 2 doubles und geben 1 double back
  153.         {
  154.             double potenz_rechnung = 0; // Initialisierung der Variable Potenz_Rechnung
  155.             double pruefung = b / (int)b; // Feststellung ob Ganzzahl oder not
  156.             try
  157.             {
  158.                 if(pruefung == 1.0 && b > 0)
  159.                 {  
  160.                     potenz_rechnung = a;
  161.                     for (double i = 1; i < b; i++)  // Schleife wird so lange ausgeführt bis i(Zähler) den Exponenten erreicht hat.
  162.                     {
  163.                         potenz_rechnung = potenz_rechnung * a;
  164.                     }
  165.                 }
  166.                 else
  167.                 {
  168.                     throw new InvalidExponentException();
  169.                 }
  170.             }
  171.             catch(InvalidExponentException e)
  172.             {
  173.                 System.out.println("Fehler --- Nur ganzzahlige Exponenten verwenden und Exponent ueber >0 \n");
  174.             }
  175.             return potenz_rechnung;
  176.         }
  177. }
  178. class DivisionByZeroException extends Exception // Etliche Klassen ... für die Exceptions
  179. {
  180.     private static final long serialVersionUID = 1L;
  181. }
  182.  
  183. class ResultErrorException extends Exception
  184. {
  185.     private static final long serialVersionUID = 1L;
  186. }
  187.  
  188. class InvalidOperatorException extends Exception
  189. {
  190.     private static final long serialVersionUID = 1L;
  191. }
  192.  
  193. class InvalidExponentException extends Exception
  194. {
  195.     private static final long serialVersionUID = 1L;
  196. }
  197.  
  198. class NotNaturalNumberException extends Exception
  199. {
  200.     private static final long serialVersionUID = 1L;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement