Izpitno vprašanje DIRI2005 1800

Iz MaFiRaWiki


Vprašanje

Sestavi razred Tocka, kjer hrani podatke o točkah v ravnini. Razred naj pozna metodo razdalja, ki vrne razdaljo danega objekta od objekta, ki je parameter te metode. Uporabi ta razred zato, da napišeš program, ki izračuna največjo razdaljo med paroma 100 naključno generiranih točk. Spremeni razred Tocka tako, da podatke hrani v polarnih koordinatah. Kakšne spremembe so potrebne v programu za računanje največje razdalje?

Odgovor

Pripravil sem razred Tocka. Napisan je v Javi. Razred za točko hrani kartezične koordinate (x,y). Razred omogoča ustvarjanje točke Tocka t1 = new Tocka(10, 10) (t1(x=10, y=10)). Razred omogoča izračun razdalje med dvema točkama t1.razdalja(t2). Razdalja se izračuna kot koren((x2-x1)2+(y2-y1)2).


  1. //Razred, ki ustvari in hrani točko
  2. //s koorinatama x,y - kartezični sistem
  3. //lahko izračuna oddaljenost od izbrane točke do določene točke
  4. public class Tocka {
  5.  
  6. // OBJEKTNE SPREMENLJIVKE
  7. private double koorX; //spremenljivka za koordinato x
  8. private double koorY; //spremenljivka za koordinato y
  9.  
  10. //konstruktor, omogoča vpisovanje vrednosti
  11. public Tocka(double a, double b) {
  12. this.koorX = a;
  13. this.koorY = b;
  14. }
  15. //Metoda, ki izračuna razdaljo med trenutno točko in neko točko
  16. public double razdalja(Tocka opazovana) {
  17. //priprava vrednosti
  18. double x1 = koorX;
  19. double y1 = koorY;
  20. double x2 = opazovana.koorX;
  21. double y2 = opazovana.koorY;
  22.  
  23. //Izračun razdalje
  24. double oddaljenost = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
  25. return oddaljenost;
  26. }
  27. }

Razred Tocka, sem uporabil za preprosto obdelavo točk v ravnini.

S pomočjo priloženega programa NajOddaljene, izdelanega v Javi sem:

  • ustvaril 100 naključnih točk,
  • poiskal točki, ki sta najbolj oddaljeni med seboj in
  • izpisal razdaljo med njima.


  1. //Program, ki upravlja z razredom Tocka
  2. //in poišče dve najbolj oddaljeni točki
  3. public class NajOddaljene {
  4. public static void main(String[] argc) {
  5. System.out.println("Program, ki generira nakljucne tocke in poisce dve najbolj oddaljeni");
  6. System.out.println();
  7.  
  8. //določimo število točk
  9. int steviloTock = 100;
  10.  
  11. //pripravimo tabelo tipa Tocka
  12. Tocka [] mnozica = new Tocka [steviloTock];
  13.  
  14. //indeks za splošno rabo
  15. int i = 0;
  16.  
  17. //Napolnimo tabelo z naključnimi točkami
  18. while (i < steviloTock){
  19. //tu določimo koordinati, lahko tudi naključni z gornjo mejo
  20. double x = Math.random()*200;
  21. double y = Math.random()*200;
  22.  
  23. //ustvarjamo naključne točke
  24. mnozica[i] = new Tocka(x, y);
  25.  
  26. //po potrebi koordinati lahko izpišemo
  27. System.out.println("x,y" + i + " =" + x + ", " + y);
  28. i++;
  29. }
  30. // *** IZRAČUN RAZDALJ MED TOČKAMI
  31. i = 0;
  32. int j;
  33. double trenutnaRazdalja = 0; //spremenljivka razdalje
  34. double maxRazdalja = 0; //spremenljivka največje razdalje
  35.  
  36. //ZANKI za izračun razdalje med vsemi točkami
  37. //v tej zanki se nastavlja prva točka
  38. while (i < steviloTock){
  39.  
  40. //v tej zanki se nastavlja druga točka
  41. j = i+1; //prva druga točka
  42. while (j < steviloTock){
  43. //kliče metodo "razdalja" na objektu razreda "Tocka", ki vrne razdaljo med točko i in j
  44. trenutnaRazdalja = mnozica[i].razdalja(mnozica[j]);
  45.  
  46. //po potrebi lahko testno izpišemo vrednosti
  47. System.out.println("razdalja(" + i+", "+ j + ") =" + trenutnaRazdalja);
  48.  
  49. //če je razdalja večja od dosedanje največje jo shranimo kot največjo
  50. if (trenutnaRazdalja > maxRazdalja) maxRazdalja = trenutnaRazdalja;
  51.  
  52. //gremo na naslednjo drugo točko
  53. j++;
  54. }
  55. //gremo na naslednjo prvo točko
  56. i++;
  57. }
  58. System.out.println("Najvecja razdalja =" + maxRazdalja);
  59. }
  60. }

Spremeni razred Tocka, da bo hranil polarne koordinate.

V zgornjem razredu je potrebno spremeniti(prilagoditi) hranjenje vrednosti in postopek računanja razdalje.

  1. //Razred, ki ustvari in hrani točko
  2. //razred dobi točko v kartezičnih koordinatah, hrani pa jo v polarnih
  3. //lahko izračuna oddaljenost od izbrane točke do določene točke
  4. public class Tocka {
  5.  
  6. // OBJEKTNE SPREMENLJIVKE
  7. private double koorFi; //spremenljivka za kot
  8. private double koorR; //spremenljivka za razdaljo
  9.  
  10. //konstruktor, omogoča vpisovanje in hranjenje vrednosti
  11. // parametra sta kartezični koordinati točke
  12. public Tocka(double a, double b) {
  13. this.koorFi = Math.toDegrees(Math.atan(a/b)); //kot v stopinjah
  14. this.koorR = Math.sqrt(a*a + b*b); //razdalja
  15. }
  16.  
  17. //Metoda, ki izračuna razdaljo med trenutno točko in neko točko
  18. public double razdalja(Tocka opazovana) {
  19.  
  20. //Za izračun razdalje, polarne koordinate pretvorimo v kartezične
  21. //Kot iz stopinj pretvorimo v radiane
  22. double x1 = koorR*Math.cos(Math.toRadians(koorFi));
  23. double y1 = koorR*Math.sin(Math.toRadians(koorFi));
  24. double x2 = opazovana.koorR*Math.cos(Math.toRadians(opazovana.koorFi));
  25. double y2 = opazovana.koorR*Math.sin(Math.toRadians(opazovana.koorFi));
  26.  
  27. //Izračun razdalje
  28. double oddaljenost = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
  29. return oddaljenost;
  30. }
  31. }

Kakšne spremembe so potrebne v programu za računanje največje razdalje, če hranimo polarne koordinate?

V programu za iskanje največje razdalje ni potrebno spremeniti nič. V spremenjenem razredu Tocka smo namreč poskrrbeli, da se vse uporabljeno (metoda razdalja in konstruktor) obnaša točno na tak način kot se je obnašala prejšna različica razreda.

Osebna orodja