Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.util.Scanner;
- public class Figure {
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- int n = Integer.parseInt(scanner.nextLine());
- int width = 2 * n - 1;
- int height = n / 2 + 4;
- System.out.printf("@%1$s@%1$s@%n", doMagic(" ", (width - 3) / 2));
- /*
- %1$s - означава, че се взима първата(1) променлива, която е String - (в случая е целият метод doMagic)
- Без това означение същия код трябваше да се изпише като:
- System.out.printf("@%s@%s@%n", doMagic(" ", (width - 3) / 2), doMagic(" ", (width - 3) / 2));
- Чрез %1$s използваме една променлива на две места, без да се налага да я преписваме два пъти и това спестява излишно копиране на кода
- */
- int k = 0;
- int count = n - 3;
- for (int i = 0, b = 0, c = -1; i < height - 4; i++, b++, c += 2) {
- /*
- Това е един for цикъл, който върти три променливи едновременно ( i, b, c).
- На всеки оборот на цикъла всяка променлива се променя по различен начин - i++ ; b++; c+=2
- Цикълът свършва, когато i<height-4 стане равно на false
- Това е нещо различно от вложените for цикли, където за един оборот на външния цикъл се извърта целия вътрешен!!
- Това НЕ Е вложен цикъл, а цикъл, който върти по няколко променливи наведнъж.
- */
- System.out.printf("*%1$s%2$s%5$s%4$s%2$s%5$s%1$s%n",
- doMagic(".", b) + "*", //1
- doMagic(" ", count), //2
- doMagic(".", b), //3
- (i != 0 && i <= n / 2 - 1) ? doMagic(".", c) + "*" : doMagic(".", c), //4
- i != n/2 -1 ? "*":""); //5
- k = 2;
- count -= k;
- /*
- %1$s - взима първия стринг - doMagic(".", b) + "*"
- %2$s - взима втория стринг - doMagic(" ", count)
- %3$s - взима третия стринг - doMagic(".", b)
- и тн.
- (i != 0 && i <= n / 2 - 1) ? doMagic(".", c) + "*" : doMagic(".", c) - тернарен оператор
- Проверява дали условието (i != 0 && i <= n / 2 - 1) е true или false
- Ако е true, изпълнява кода след знака ? - т.е. doMagic(".", c) + "*"
- Ако е false, изпълнява кода след знака : - т.е. doMagic(".", c)
- */
- }
- for (int i = 0; i < 3; i++) {
- String line = i == 0 ? String.format("*%1$s%2$s*.*%2$s%1$s*",
- doMagic(".",n/2),
- doMagic("*",(width - (n +5)) / 2)) :
- doMagic("*",width);
- System.out.println(line);
- /*
- Тернарният оператор се използва, когато трябва да assign-ем стойност на дадена променлива
- String line = i == 0 ? String.format("*%1$s%2$s*.*%2$s%1$s*",.........)
- Проверяваме дали условието i==0 е вярно и ако е, на променливата String line слагаме стойността, която връща метода след знака ?
- Ако не е вярно String line получава стойността, която връща метода, написан след знака :
- String.format() е метод, който действа точно като System.out.printf()
- Разликата е, че .printf() директно отпечатва резултата на конзолата,
- докато String.format() се използва, за да запише резултата в стринг променлива - в случая в String line
- */
- }
- }
- static String doMagic(String text, int count) {
- StringBuilder sb = new StringBuilder();
- while (count-- > 0) sb.append(text);
- return sb.toString();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement