public class Asteikko { public static final char VIIVA = '-'; public static void main(String[] komentorivi) { int viivanPituus = 3; int asteikonKorkeus = 7; int[] mittari = asteikko(viivanPituus, asteikonKorkeus); for (int i = 0; i < mittari.length; ++i) System.out.println ( toistettuna(VIIVA, mittari[i]) + " " + toistettuna(' ', viivanPituus - mittari[i]) + i ); return; } public static String toistettuna(char k, int n) { String tulos = ""; for (int i = 0; i < n; i++) tulos += k; return tulos; } /** * Palauttaa n-pituisen asteikon, jonka väliviivat * on osoitettu luvuilla väliltä [0, k]. Mitä isompi * väliviivaluku on, sitä suuremman aliosan se jakaa. * Taulukko on symmetrinen keski-indeksin suhteen * jos (n + 1) on 2:n potenssi. * Alkuehto: 0 <= k, n */ public static int[] asteikko(int k, int n) { int[] tulos = new int[n]; // Oletusalustuksena 0. täytäAsteikko(tulos, 0, tulos.length - 1, k); return tulos; } /** * Päivittää a:n lokerot a[e], a[e + 1], ..., a[v] * asteikoksi arvoilla väliltä [1, k]. Niitä kohtia * joille tulisi k == 0, ei tehdä muutoksia. * * AE: (a != null) & (0 <= e < a.length) & (e + 1 <= v) & (0 <= k) */ private static void täytäAsteikko(int[] a, int e, int v, int k) { // HUOM!! tästä alkaa se mitä pitää kirjottaa a[e + (v - e)/2] = k; // divide the range in two, assign the middle cell with k if ((v - e) > 1) { täytäAsteikko(a, e, e + (v - e)/2 - 1, k - 1); // call the function for the first half täytäAsteikko(a, e + (v - e)/2 + 1, v, k - 1); // ditto for the last } return; // ja tähän loppuu } }