Izpitno vprašanje DIRI2005 2000

Iz MaFiRaWiki

Vprašanje

Sestavi razred Ulomek, kjer hranimo pozitivna racionalna številka v mešani obliki (npr. 3 2/3 torej celi del + ulomek < 1 ). V razredu naj obstaja konstruktor brez parametrov, ki ustvari ulomek oblike 1 0/1, konstruktor z enim parametrom n tipa int , ki ustvari ulomek oblike n 0/1 in konstruktor z dvema parametroma (m, n) tipa int, ki ustvari ustrezni okrajšani ulomek, enak ulomku m/n. Poleg tega napiši statične metode sestej, odstej, mnozi, deli in inverz , ki izvedejo ustrezne operacije. Predpostavi, da so vse operacije legalne.

Odgovor

Sestavimo razred Ulomek:

  1. public class Ulomek {
  2. private int celiDel;
  3. private int stevec;
  4. private int imenovalec;
  5.  
  6. // V razredu zapišemo konstruktorje:
  7.  
  8. public Ulomek() {
  9. // ustvari ulomek, ki predstavlja naravno število 1
  10. this.celiDel = 1;
  11. this.stevec = 0;
  12. this.imenovalec = 1;
  13. }
  14.  
  15. public Ulomek(int n) {
  16. // ustvari ulomek, ki predstavlja naravno število
  17. this.celiDel = n;
  18. this.stevec = 0;
  19. this.imenovalec = 1;
  20. }
  21.  
  22. public Ulomek(int m, int n) {
  23. // ustvarimo ustrezni okrajšani ulomek, enak ulomku m/n
  24. // zapišemo celi del ulomka
  25. if (m < n) {
  26. // ulomek je majši od 1
  27. this.celiDel = 0;
  28. }
  29. else {
  30. this.celiDel = m / n;
  31. m = m % n;
  32. }
  33. // števec in imenovalec okrajšamo
  34. int najvDelj = najvDeljitelj(m, n);
  35. this.stevec = m / najvDelj;
  36. this.imenovalec = n / najvDelj;
  37. }
  38.  
  39. // Pomožna metoda za izračun največjega skupnega delitelja dveh števil:
  40.  
  41. private static int najvDeljitelj(int a, int b) {
  42. // rekurzivna metoda za izračun največjega skupnega delitelja
  43. if (b == 0)
  44. return a;
  45. return najvDeljitelj(b, a % b);
  46. }
  47.  
  48. // Statične metode sestej, odstej mnozi, deli in inverz:
  49.  
  50. public static Ulomek sestej(Ulomek a, Ulomek b) {
  51. int stevec = a.stevec * b.imenovalec + b.stevec * a.imenovalec;
  52. int imenovalec = a.imenovalec * b. imenovalec;
  53. // dodati moramo še cele dele
  54. stevec = stevec + (a.celiDel + b.celiDel) * imenovalec;
  55. return new Ulomek(stevec, imenovalec);
  56. }
  57.  
  58. public static Ulomek odstej(Ulomek a, Ulomek b) {
  59. // ulomek a je večji od ulomka b
  60. int stevecA = (a.celiDel * a.imenovalec + a.stevec) * b.imenovalec;
  61. int stevecB = (b.celiDel * b.imenovalec + b.stevec) * a.imenovalec;
  62. int imenovalec = a.imenovalec * b. imenovalec;
  63. return new Ulomek(stevecA - stevecB, imenovalec);
  64. }
  65.  
  66. public static Ulomek mnozi(Ulomek a, Ulomek b) {
  67. int stevecA = a.celiDel * a.imenovalec + a.stevec;
  68. int stevecB = b.celiDel * b.imenovalec + b.stevec;
  69. return new Ulomek(stevecA * stevecB, a.imenovalec * b.imenovalec);
  70. }
  71.  
  72. public static Ulomek deli(Ulomek a, Ulomek b) {
  73. int stevecA = a.celiDel * a.imenovalec + a.stevec;
  74. int stevecB = b.celiDel * b.imenovalec + b.stevec;
  75. return new Ulomek(stevecA * b.imenovalec, a.imenovalec * stevecB);
  76. }
  77.  
  78. public static Ulomek inverz(Ulomek a) {
  79. int stevec = a.celiDel * a.imenovalec + a.stevec;
  80. return new Ulomek(a.imenovalec, stevec);
  81. }
  82.  
  83. // Zaključimo z metodo toString, ki izpiše ulomek v ustrezni obliki:
  84.  
  85. public String toString() {
  86. return this.celiDel + " " + this.stevec + "/" + this.imenovalec;
  87. }
  88. }
Osebna orodja