/* Beispielloesung zu Blatt 10 - Allgemeine Informatik 1 - WS 2006/2007 rjg und nh - 01/2007 */ import IOulm.Urc; public class Distance { public final static double RADIUS = 6371.0; // Konstante public static void main(String[] args){ // Variable zum Einlesen einer kompletten Zeile String line; // faktor, um Minuten und Sekunden zu verrechnen double factor; // Positionen zum Zerlegen der Eingelesenen Zeile int anf, ende; // wir initialisieren die vier Koordinaten mit 0 // (das wuerde zwar auch implizit gemacht, aber // des besseren Stils wegen...) double laengeA=0, breiteA=0, laengeB=0, breiteB=0; /* Wir machen jetzt 4 Mal exakt das selbe: eine Zeile einlesen, zerlegen und daraus die Dezimaldarstellung der Koordinaten berechnen. Um nicht 4x nahezu identischen Java-Code schreiben zu muessen, verpacken wir das in eine For-Schleife, die wir genau vier mal durchlaufen. Auf die pro Schleifendurchlauf relevanten "Dinge" gehen wir mit einfachen IF-Abfragen ein. (Ausblick: Noch schoener geht das mit Methoden, die wir in Kuerze in der Vorlesung kennenlernen werden.) */ int durchlauf=0; while (durchlauf < 4) { if (durchlauf==0) System.out.println("Bitte den Laengengrad von Ort A eingeben: "); if (durchlauf==1) System.out.println("Bitte den Breitengrad von Ort A eingeben: "); if (durchlauf==2) System.out.println("Bitte den Laengengrad von Ort B eingeben: "); if (durchlauf==3) System.out.println("Bitte den Breitengrad von Ort B eingeben: "); double tmp = 0; // temporaere Variable // Zeile einlesen if (Urc.readString()) line =Urc.getString(); else return; // Zeile in Grad, Minute, Sekunde zerlegen // und Dezimaldarstellung berechnen anf = 0; factor = 1; // Achtung, festhalten: Wir haben nun eine while-Schleife innerhalb // einer while-Schleife. int innererDurchlauf=0; while (innererDurchlauf<3) { ende = line.indexOf(',', anf+1); tmp += (Integer.parseInt(line.substring(anf, ende))) / factor; anf = ende + 1; factor *= 60; innererDurchlauf++; } // Laengengrad in Radiant umrechnen tmp *= (Math.PI/180); // ggf. Vorzeichen setzen if (line.charAt(line.length()-1) == 'O' || line.charAt(line.length()-1) == 'S' ) tmp *= -1; // je nach Schleifendurchlauf wird nun das Ergebnis der Umrechnung // (das in der Variablen "tmp" steckt) dem zugehoerigen Laengen-/ // Breitengrad zugewiesen if (durchlauf==0) laengeA = tmp; if (durchlauf==1) breiteA = tmp; if (durchlauf==2) laengeB = tmp; if (durchlauf==3) breiteB = tmp; durchlauf++; } // Kleine Kontrollausgabe unserer Umrechnungsergebnisse System.out.println("Laengen- und Breitengrad von Ort A: " + laengeA +" : " + breiteA); System.out.println("Laengen- und Breitengrad von Ort B: " + laengeB +" : " + breiteB); // Abstand in Radiant berechnen double d = Math.acos(Math.sin(laengeA)*Math.sin(laengeB) + Math.cos(laengeA)*Math.cos(laengeB)*Math.cos(breiteA-breiteB)); // Abstand in km berechnen und ausgeben System.out.println("Entfernung: " + Math.round(d * RADIUS) + " km"); // Geschafft: Hat doch gar nicht weh getan, oder? } }