Skoči na vsebino

P2 - Kviz 01 - Starc Aljaž

link ucilnica.fri.uni-lj.si

void java()

Napiši metodo void java(), ki izpiše naslednje besedilo

Primer
Izhod
   J    a   v     v  a
   J   a a   v   v  a a
J  J  aaaaa   V V  aaaaa
 JJ  a     a   V  a     a
Rešitev
public static void java () {
    System.out.println("   J    a   v     v  a");
    System.out.println("   J   a a   v   v  a a");
    System.out.println("J  J  aaaaa   V V  aaaaa");
    System.out.println(" JJ  a     a   V  a     a");
}

kalkulator(int a, int b)

Napiši metodo kalkulator(int a, int b), ki sešteje, odšteje, zmnoži, deli in izračuna ostanek po deljenju dveh števil. Če pride do deljenja z 0, naj program izpiše "Napaka: deljenje z 0" .

Primer

Vhod: 42, 13
42 + 13 = 55
42 - 13 = 29
42 x 13 = 546
42 / 13 = 3
42 % 13 = 3
Vhod: 2, 0
Napaka: deljenje z 0

Rešitev
public static void kalkulator(int a, int b) {
    if (b == 0) {
        System.out.println("Napaka: deljenje z 0");
    } else {
        System.out.println(a + " + " + b + " = " + (a+b));
        System.out.println(a + " - " + b + " = " + (a-b));
        System.out.println(a + " x " + b + " = " + (a*b));
        System.out.println(a + " / " + b + " = " + (a/b));
        System.out.println(a + " % " + b + " = " + (a%b));
    }
}

void nicli(int a, int b, int c)

Napiši metodo void nicli(int a, int b, int c), ki izračuna in izpiše obe realni ničli kvadratne enačbe ax2 + bx + c = 0. V primeru, da realni ničli ne obstajata (negativna diskriminanta), naj program izpiše Napaka: nicli enacbe ne obstajata.

Primeri

Vhod: a=1, b=2, c=1
x1=-1.00, x2=-1.00
Vhod: a=1, b=-7, c=12
x1=4.00, x2=3.00
Vhod: a=1, b=2, c=2
Napaka: nicli enacbe ne obstajata.

Rešitev
public static void nicli(int a, int b, int c) {
    float det = (b*b)-(4*a*c);
    float koren = (float) Math.sqrt(det);
    
    if ( det > 0 ){
        float x1 = (-b + koren)/(2*a);
        float x2 = (-b - koren)/(2*a);
        System.out.format("x1=%.2f, x2=%.2f%n", x1, x2);
    } else if (det == 0) {
        float x1 = (-b + koren)/(2*a);
        System.out.format("x1=%.2f, x2=%.2f%n", x1, x1);
    } else {
        System.out.println("Napaka: nicli enacbe ne obstajata");
    }
}

void krog(double r, int d)

Napiši metodo void krog(double r, int d), ki izračuna in izpiše obseg in ploščino kroga na d decimalk natančno. Če je r negativen, naj metoda izpiše Napaka: negativen polmer. Če je d negativen, naj izpiše Napaka: negativen d.

Primera

Vhod: r = 7.5, d=3
Obseg kroga s polmerom r=7.5 je 47.124
Ploscina kroga s polmerom r=7.5 je 176.715
Vhod: r = -10, d=2
Napaka: negativen polmer

Rešitev
public static void krog(double r, int d) {
    if (r < 0) System.out.println("Napaka: negativen polmer");
    else if (d < 0) System.out.println("Napaka: negativen d");
    else {
        System.out.format("Obseg kroga s polmerom r=%.2f je %."+d+"f%n", r, (2 * Math.PI * r));
        System.out.format("Ploscina kroga s polmerom r=%.2f je %."+d+"f%n", r, Math.PI * r * r);
    }
}

String pretvoriSekunde(int sekunde)

Napiši metodo String pretvoriSekunde(int sekunde), ki pretvori sekunde v ure, minute in sekunde in vrne niz v formatu hh:mm:ss.

Primeri

Vhod: 65
00:01:05
Vhod: 49330
13:42:10
Vhod: -12
Število sekund ne more biti negativno

Rešitev
public static String pretvoriSekunde(int sekunde) {
    if (sekunde < 0) return "Število sekund ne more biti negativno";
    else {
        int h = (int) Math.floor(sekunde / 3600);
        int m = (int) Math.floor((sekunde % 3600) / 60);
        int s = (int) (sekunde % 3600) % 60;
        return String.format("%02d:%02d:%02d", h, m, s);
    }
}

javaJavaJava(int n)

Napiši metodo javaJavaJava(int n), ki n-krat izpiše besedo Java. Če je n negativen, naj metoda izpiše Napaka: negativen n.

Primer
pri n=3 naj program izpiše
    J    a   v     v  a         J    a   v     v  a         J    a   v     v  a   
    J   a a   v   v  a a        J   a a   v   v  a a        J   a a   v   v  a a  
 J  J  aaaaa   V V  aaaaa    J  J  aaaaa   V V  aaaaa    J  J  aaaaa   V V  aaaaa 
  JJ  a     a   V  a     a    JJ  a     a   V  a     a    JJ  a     a   V  a     a
Rešitev
public static void javaJavaJava(int n) {
    if (n < 0) System.out.println("Napaka: negativen n");
    else {
        for (int i=0;i<n;i++) System.out.print("     J    a   v     v  a   ");
        System.out.println("");
        for (int i=0;i<n;i++) System.out.print("     J   a a   v   v  a a  ");
        System.out.println("");
        for (int i=0;i<n;i++) System.out.print("  J  J  aaaaa   V V  aaaaa ");
        System.out.println("");
        for (int i=0;i<n;i++) System.out.print("   JJ  a     a   V  a     a");
    }
}

boolean jeFibonaccijevo(int n)

Števila v zaporedju 1, 1, 2, 3, 5, 8, 13, 21, 34, ... imenujemo Fibonaccijeva števila. Naslednji element zaporedja dobimo s seštevanjem prejšnjih dveh elementov (13=5+8, 21=8+13, 34=13+21, ...).

Napiši metodo boolean jeFibonaccijevo(int n), ki preveri, ali je dano število n Fibonaccijevo število.

Primeri

Vhod: 13
jeFibonaccijevo(13) // true
Vhod: 14
jeFibonaccijevo(14) // false
Vhod: 34
jeFibonaccijevo(34) // true
Vhod: 2021
jeFibonaccijevo(2021) // false

Rešitev
boolean jeFibonaccijevo(int n) {
    int i = 0;
    int j = 1;
    while (true) {
        if (n == j) return true;
        if (n < j) return false;
        
        int k = i + j;
        i = j;
        j = k;
    }
}

boolean jePrastevilo(int n)

Število n je praštevilo, če je večje od 1 in je deljivo le z 1 in n.

Napiši metodo boolean jePrastevilo(int n), ki za dano število preveri, ali je praštevilo in vrne true, če je in false, če ni.

Primeri

Vhod: 13
jePrastevilo(13) // true
Vhod: 42
jePrastevilo(42) // false
Vhod: -13
jePrastevilo(0-13) // false

Rešitev
boolean jePrastevilo(int n) {
    if (n <= 1) return false;
    
    for (int i=2; i<=n/2; i++) {
        if (n%i == 0) return false;
    }
    
    return true;
}

izrisiZastavo(int n)

Napiši metodo izrisiZastavo(int n), ki izriše zastavo različnih velikosti, kot prikazujejo spodnji primeri.

Primeri

n = 1
n=1
* * ============
 *  ============
* * ============
================
================
n = 2
n=2
* * * * =======================
 * * *  =======================
* * * * =======================
 * * *  =======================
* * * * =======================
 * * *  =======================
===============================
===============================
===============================
===============================
n = 3
n=3
* * * * * * ==================================
 * * * * *  ==================================
* * * * * * ==================================
 * * * * *  ==================================
* * * * * * ==================================
 * * * * *  ==================================
* * * * * * ==================================
 * * * * *  ==================================
* * * * * * ==================================
==============================================
==============================================
==============================================
==============================================
==============================================
==============================================

Rešitev
public static void izrisiZastavo(int n) {
    // Nrdimo ta long-ass string (enacaji),
    // ki vsebuje 15 * n znakov,
    // +1 znak za tisti space med zvezdicami
    // ter ostalimi enacaji v zgornjih vrsticah
    String line = "";
    for (int j=0;j<(15 * n + 1);j++) line += "=";
    
    
    // Izpisi zgornje vrstice (tiste z zvezdicami)
    for (int i=0;i<n*3;i++) {
        // Polgedamo ce je "shifting line" (vsaka druga vrstica +1 [1,3,5,...])
        boolean shift = i % 2 == 1;

        // skalkuliramo koliko zvezdic bo
        int snum = (n * 2) - (shift ? 1 : 0);

        // Sestavimo string z zvezdicami
        String sstr = "";
        if (shift) sstr += " ";
        for (int j=0;j<snum;j++) sstr += "* ";
        if (shift) sstr += " ";
        
        // In vso to minestro izpisemo v stdout
        System.out.println(sstr + line.substring(sstr.length()));
    }
    
    // Izpisi se spodnje vrstice and we good to go
    for (int i=0;i<n*2;i++) System.out.println(line);
}

void vDesetisko(int n)

Napiši metodo void vDesetisko(int n), ki dano število pretvori iz osmiškega v desetiški sistem in na zaslon izpiše števili v obeh sistemih.

Primeri

Vhod: 120
120(8) = 80(10)
Vhod: 505
505(8) = 321(10)
Vhod: 129
Število 129 ni število v osmiškem sistemu (števka 9)

Rešitev
void vDesetisko(int n) {
    String nstr = n + "";
    
    if (nstr.contains("8")) System.out.println("Število " + nstr + " ni število v osmiškem sistemu (števka 8)");
    else if (nstr.contains("9")) System.out.println("Število " + nstr + " ni število v osmiškem sistemu (števka 9)");
    else System.out.println(nstr + "(8) = " + Integer.parseInt(nstr,8) + "(10)");
}

String pretvoriVDesetisko(String n, int b)

Napiši metodo String pretvoriVDesetisko(String n, int b), ki pretvori iz danega številskega sistema b v desetiški sistem. Število n je podano v znakovni obliki. V primeru, da pretvorba ni možna, naj metoda vrne sporočilo o napaki.

Primeri

pretvoriVDesetisko("101010", 2) // 101010(2)=42(10)
pretvoriVDesetisko("FF", 16) // FF(16)=255(10)
pretvoriVDesetisko("101021010", 2) // Napaka pri pretvorbi sistema - števka 2

Rešitev
public static String pretvoriVDesetisko(String n, int b) {
    String allowed = "0-" + ( b <= 10 ? b - 1 : 9);
    if (b >= 11) allowed += "A-" + (char) (65 - 11 + b);
    
    if (n.matches("[" + allowed + "]+")) {
        return n + "(" + b + ")="+Integer.parseInt(n, b)+"(10)";
    } else {
        for (int i = 0; i < n.length(); i++){
            char c = n.charAt(i);
            if (("" + c).matches("["+allowed+"]*[^"+allowed+"]["+allowed+"]*")) return "Napaka pri pretvorbi sistema - števka " + c;
        }
        return "Napaka pri pretvorbi sistema - se ne ve zakaj";
    }
}

int vsotaPrvih(int n)

Napiši metodo vsotaPrvih(int n), ki vrne vsoto prvih n praštevil.

Opomba: lahko si pomagaš z metodo jePrastevilo(int i) iz naloge 8.

Primera

Vhod: 10
vsotaPrvih(10); // 129
Vhod: 100
vsotaPrvih(100); // 24133

Rešitev
boolean jePrastevilo(int n) {
    if (n <= 1) return false;
    
    for (int i=2; i<=n/2; i++) {
        if (n%i == 0) return false;
    }
    
    return true;
}

int vsotaPrvih(int n) {
    int sum = 0;
    int i = 1;
    
    for (int j=1;i<=n;j++) {
        
        if (!jePrastevilo(j)) continue;
        
        sum += j;
        i += 1;
    }
    
    return sum;
}

void pitagoroviTrojcki(int x)

Napiši metodo void pitagoroviTrojcki(int x), ki izpiše vse možne trojke (a, b, c) pri 1 <= a <= b <= c <= x za katere velja a^2 + b^2 = c^2.

Primer
pitagoroviTrojcki(25)
3 4 5
5 12 13
6 8 10
7 24 25
8 15 17
9 12 15
12 16 20
15 20 25
Rešitev
void pitagoroviTrojcki(int x) {
    for (int a=0;a<=x;a++) {
        for (int b=0;b<=x;b++) {
            for (int c=0;c<=x;c++) {
                if (
                    1 <= a && a <= b && b <= c && c <= x &&
                    Math.pow(a, 2) + Math.pow(b, 2) == Math.pow(c, 2)
                ) {
                    System.out.println(a + " " + b + " " + c);
                }
            }
        }
    }
}

void narisiDrevo(int n)

Napiši metodo void narisiDrevo(int n), ki nariše drevo velikosti n.

Primer
Primer dreves za n=0, 1, …, 7 Številke ni potrebno izpisati.
                                   *
                         *   * *  * *
               *   * *  * *  * *  * *
          |    |    |    |    |    |
.    |    |    |    |    |    |    |
0    1    2    3    4    5    6    7
Rešitev
suboptimalna, a delujoca
void narisiDrevo(int n) {
    if (n == 0) System.out.println(" . ");
    else {
        int i = n - 2;
        while (i > 0) {
            System.out.println(i % 2 == 1 ? " * " : "* *");
            i -= i % 2 == 1 ? 1 : 2;
        }
        
        System.out.println(" | ");
        if (n >= 2) System.out.println(" | ");
    }
}

String izracunajRazliko(String prviCas, String drugiCas)

Napiši metodo String izracunajRazliko(String prviCas, String drugiCas), ki izračuna razliko dveh ur podanih v obliki hh:mm:ss in izračunano razliko vrne v enakem formatu.

Primer
izracunajRazliko("08:23:10", "10:10:05") // "01:46:55"
Rešitev
String izracunajRazliko(String prviCas, String drugiCas) {
    String[] pp = prviCas.split(":");
    String[] dp = drugiCas.split(":");
    
    int ps = Integer.parseInt(pp[0]) * 3600 + Integer.parseInt(pp[1]) * 60 + Integer.parseInt(pp[2]);
    int ds = Integer.parseInt(dp[0]) * 3600 + Integer.parseInt(dp[1]) * 60 + Integer.parseInt(dp[2]);
    
    int t = Math.abs(ps - ds);
    
    double h = Math.floor(t / 3600);
    double m = Math.floor((t - h * 3600) / 60);
    double s = t - h * 3600 - m * 60;

    return String.format("%02d:%02d:%02d", (int) h, (int) m, (int) s);
}

String pretvoriVMorse(String sporocilo)

Prijatelju želimo poslati sporočilo z uporabo svetlobnih signalov. Pri tem bomo uporabili Morsejevo abecedo.

Napiši metodo String pretvoriVMorse(String sporocilo), ki podano sporočilo pretvori v Morsejevo abecedo. Znaki v sporočilu, ki niso definirani v Morsejevi abecedi, naj se prevedejo v "?".

Primer
pretvoriVMorse("Na FRIju nam je res lepo"); // “-. .-   ..-. .-. .. .--- ..-   -. .- --   .--- .   .-. . ...   .-.. . .--. ---”
Rešitev
String pretvoriVMorse(String sporocilo) {
    java.util.HashMap<String, String> chrs = new java.util.HashMap<String, String>();
    
    chrs.put(" ", " ");
    chrs.put("a", ".-");
    chrs.put("b", "-...");
    chrs.put("c", "-.-.");
    chrs.put("d", "-..");
    chrs.put("e", ".");
    chrs.put("f", "..-.");
    chrs.put("g", "--.");
    chrs.put("h", "....");
    chrs.put("i", "..");
    chrs.put("j", ".---");
    chrs.put("k", "-.-");
    chrs.put("l", ".-..");
    chrs.put("m", "--");
    chrs.put("n", "-.");
    chrs.put("o", "---");
    chrs.put("p", ".--.");
    chrs.put("q", "--.-");
    chrs.put("r", ".-.");
    chrs.put("s", "...");
    chrs.put("t", "-");
    chrs.put("u", "..-");
    chrs.put("v", "...-");
    chrs.put("z", "--..");
    chrs.put("x", "-..-");
    chrs.put("w", ".--");
    chrs.put("y", "-.--");
    
    chrs.put("0", "-----");
    chrs.put("1", ".----");
    chrs.put("2", "..---");
    chrs.put("3", "...--");
    chrs.put("4", "....-");
    chrs.put("5", ".....");
    chrs.put("6", "-....");
    chrs.put("7", "--...");
    chrs.put("8", "---..");
    chrs.put("9", "----.");
    
    String fstr = "";
    
    for (int i=0;i<sporocilo.length();i++){
        String c = ("" + sporocilo.charAt(i)).toLowerCase();
        if (chrs.get(c) == null) fstr += "? ";
        else fstr += chrs.get(c) + " ";
    }
    
    return fstr.strip();
    
}

void praDvojcek(int n)

Za dve števili rečemo, da sta praštevilska dvojčka, če sta obe števili praštevili in je razlika med njima natanko 2. Praštevilski dvojček na primer tvorita števili 29 in 31, kar bomo zapisali kot (29, 31). Tudi (3, 5) je praštevilski dvojček.

Napiši metodo void praDvojcek(int n), ki izpiše vse praštevilske dvojčke, manjše od n, vsakega v svojo vrstico. Pri tem si lahko pomagate z metodo boolean jePrastevilo(int i), ki ste jo že napisali v nalogi 8.

Rešitev
boolean jePrastevilo(int n) {
    if (n <= 1) return false;
    
    for (int i=2; i<=n/2; i++) {
        if (n%i == 0) return false;
    }
    
    return true;
}

void praDvojcek(int n) {
    int d1 = 1;

    for (int i=2;i<n;i++){
        if (jePrastevilo(i)) {
            if (i - d1 == 2) System.out.format("(%d, %d)%n", d1, i);
            d1 = i;
        }        
    }
}

void trikotnik(int n, int tip)

Napiši metodo void trikotnik(int n, int tip), ki za podano naravno število n izriše številski trikotnik na način tip (ta je lahko od 1 do 7), kot prikazujejo primeri.

Primeri

trikotnik(5,1);
1 
1 2 
1 2 3 
1 2 3 4 
1 2 3 4 5
trikotnik(5,2);
1 2 3 4 5 
  1 2 3 4 
    1 2 3 
      1 2 
        1 
trikotnik(5,3);
        1 
      2 1 
    3 2 1 
  4 3 2 1 
5 4 3 2 1 
trikotnik(5,4);
5 4 3 2 1 
4 3 2 1 
3 2 1 
2 1 
1 
trikotnik(5,5);
        1 
      1 2 1 
    1 2 3 2 1 
  1 2 3 4 3 2 1 
1 2 3 4 5 4 3 2 1 
trikotnik(5,6);
1 2 3 4 5 4 3 2 1 
  1 2 3 4 3 2 1 
    1 2 3 2 1 
      1 2 1 
        1 
trikotnik(5,7);
        1 
      2 3 2 
    3 4 5 4 3 
  4 5 6 7 6 5 4 
5 6 7 8 9 8 7 6 5 

Rešitev
/**
 * Generate a string of numbers in given range separated with a single space
 * 
 * @param start 
 * @param end
 * @return
 */
static String mkstr (int start, int end) {
    String fstr = "";
    for (
        int i = start;
        start <= end ? i <= end : i >= end;
        i += start <= end ? 1 : -1
    ) fstr += (i % 10) + " ";
    return fstr.strip();
}

static void trikotnik(int n, int tip) {
    switch (tip) {
        case 1:
            for (int i = 1; i <= n; i++) System.out.println(mkstr(1, i));
            break;

        case 2:
            for (int i = n; i >= 1; i--) System.out.format("%" + (n*2-1) + "s\n", mkstr(1, i));
            break;

        case 3:
            for (int i = 1; i <= n; i++) System.out.format("%" + (n*2-1) + "s\n", mkstr(i, 1));
            break;

        case 4:
            for (int i = n; i >= 1; i--) System.out.println(mkstr(i, 1));
            break;

        case 5:
            for (int i = 1; i <= n; i++) System.out.format("%" + (n*2-1) + "s %s\n", mkstr(1, i), (i-1>=1) ? mkstr(i-1, 1) : "" );
            break;

        case 6:
            for (int i = n; i >= 1; i--) System.out.format("%" + (n*2-1) + "s %s\n", mkstr(1, i), (i-1>=1) ? mkstr(i-1, 1) : "" );
            break;

        case 7:
            for (int i = 1; i <= n; i++) System.out.format("%" + (n*2-1) + "s %s\n", mkstr(i, i+i-1), (i+i-2>=1) ? mkstr(i+i-2, i) : "" );
            break;
    
        default:
            break;
    }
}

void metulj(int n, int tip)

Napiši metodo void metulj(int n, int tip), ki za podano naravno število n izriše številskega "metulja" na način tip (ta je lahko 1, 2 ali 3, kot prikazujejo primeri.

Primeri

metulj(5,1);
1               1 
1 2           2 1 
1 2 3       3 2 1 
1 2 3 4   4 3 2 1 
1 2 3 4 5 4 3 2 1 
metulj(5,2);
1 2 3 4 5 4 3 2 1 
1 2 3 4   4 3 2 1 
1 2 3       3 2 1 
1 2           2 1 
1               1 
metulj(5,3);
1               1 
1 2           2 1 
1 2 3       3 2 1 
1 2 3 4   4 3 2 1 
1 2 3 4 5 4 3 2 1 
1 2 3 4   4 3 2 1 
1 2 3       3 2 1 
1 2           2 1 
1               1 

Rešitev
public static void metulj(int n, int tip) {
    if (tip % 2 == 1) for (int i = 1; i <= n; i++) System.out.format("%-"+ (n*2-1) +"s %"+ (n*2-3) +"s\n", mkstr(1, i), (n-1 > 0) ? mkstr(i < n?i:n-1, 1) : "");
    if (tip >= 2) for (int i = (tip > 2 ? n-1 : n); i >= 1; i--) System.out.format("%-"+ (n*2-1) +"s %"+ (n*2-3) +"s\n", mkstr(1, i), (n-1 > 0) ? mkstr(i < n?i:n-1, 1) : "");
}

/**
* Generate a string of numbers in given range separated with a single space
* 
* @param start 
* @param end
* @return
*/
static String mkstr (int start, int end) {
    String fstr = "";
    for (
        int i = start;
        start <= end ? i <= end : i >= end;
        i += start <= end ? 1 : -1
    ) fstr += (i % 10) + " ";
    return fstr.strip();
}

veckratnikDelitelj(int a, int b)

Napiši metodo veckratnikDelitelj(int a, int b), ki izračuna največji skupni delitelj in najmanjši skupni večkratnik, ter ju izpiše na zaslon. Če je vsaj eno od števil enako 0, naj program izpiše Napaka: obe števili morata biti različni od nič.

Primeri

veckratnikDelitelj(12,-24)
Največji skupni delitelj je 12.
Najmanjši skupni večkratnik je 24.
veckratnikDelitelj(12,8)
Največji skupni delitelj je 4.
Najmanjši skupni večkratnik je 24.
veckratnikDelitelj(44,0)
Napaka: obe števili morata biti različni od nič.


Zadnja posodobitev: May 30, 2022