Печать символа из значения int с помощью цикла с желаемым количеством чисел в строке вывода

#java

#java

Вопрос:

У меня возникли проблемы со следующим кодом:

 //Program 6.12
public class Ex6_12 {
    public static void printChars(char ch1, char ch2, int numberPerLine) {
      for (int i = ch1; i>ch2; i  ) {
        for (int j = 0; j<=numberPerLine; j  ) {
          System.out.printf("%c ", (char)(i));
        }
        System.out.println("");
      }
    }
    public static void main (String[] args) {
      printChars('1', 'Z', 10);
    }
}
  

Предыдущий код ничего не выводит, и я хочу, чтобы он распечатал выбранный символ в другой выбранный символ с выбранным количеством символов в строке. Не уверен, где я допустил ошибку.

Для этого ввода мне нужен вывод:

 1 2 3 4 5 6 7 8 9 :
; < = > ? @ A B C D 
E F G H I J K L M N 
O P Q R S T U V W X 
Y
  

(Оно варьируется от первого char переданного до меньшего, чем последнее, с таким количеством char символов в строке, как numberPerLine )

Комментарии:

1. '1' Больше или меньше 'Z' ? (Подсказка: вы хотите < в условии цикла, а не > )

2. это значения acsii в символах, поэтому оно меньше. я полагаю, что Z равно 90 в acsii, а 1 равно 1.

3. Этого не происходит, оно имеет значение 49

4. Программа возвращает 11 одинаковых значений во многих разных таблицах. Как мне это исправить? Спасибо!

5. Измените for (int i = ch1; i>ch2; i ) на for (int i = ch1; i<ch2; i )

Ответ №1:

Для этого вам не нужны два цикла. Поскольку вы используете i во внутреннем цикле, но никогда не увеличиваете его, вы получаете одну и ту же букву, напечатанную numberPerLine несколько раз. Просто проверьте, numberPerLine равен ли модуль numberPerLine - 1 numberPerLine (если были напечатаны элементы):

 public static void printChars(char ch1, char ch2, int numberPerLine) {
     for (char i = ch1; i<ch2; i  ) {
         System.out.printf("%c ", i);
         if((i-ch1) % numberPerLine == numberPerLine-1) {
              System.out.println("");
         }
     }        
}
  

Что даст:

 1 2 3 4 5 6 7 8 9 : 
; < = > ? @ A B C D 
E F G H I J K L M N 
O P Q R S T U V W X 
Y 
  

Ответ №2:

У вас логическая ошибка в первом for цикле вашего printChars метода. Цикл должен проверять, i is less than ch2 должен ли он выполняться. Текущий цикл будет бесконечным, если вы приведете правильные аргументы при вызове метода.

Итак, я изменил этот for цикл for (int i = ch1; i>ch2; i ) на for (int i = ch1; i<ch2; i ) и, как вы могли догадаться, это работает. И, если вы хотите напечатать, включая последний символ, тогда вам нужно будет проверить, пока не будет равно for (int i = ch1; i<=ch2; i )

 //Program 6.12
public class Ex6_12 {
    public static void printChars(char ch1, char ch2, int numberPerLine) {
        for (int i = ch1; i < ch2; i  ) {
            for (int j = 0; j <= numberPerLine; j  ) {
                System.out.printf("%c ", (char) (i));
            }
            System.out.println("");
        }
    }

    public static void main(String[] args) {
        printChars('1', 'Z', 10);
    }
}  
  

Печать, включая последний символ:

 //Program 6.12
public class Ex6_12 {
    public static void printChars(char ch1, char ch2, int numberPerLine) {
        for (int i = ch1; i <= ch2; i  ) {
            for (int j = 0; j <= numberPerLine; j  ) {
                System.out.printf("%c ", (char) (i));
            }
            System.out.println("");
        }
    }

    public static void main(String[] args) {
        printChars('1', 'Z', 10);
    }
}
  

Комментарии:

1. Большое вам спасибо! Но как бы мне заставить символы печатать по одному из каждого вместе в количестве символов в строке как numberPerLine int? Спасибо!

2. GBlodgett уже указывал на это. Вы можете использовать этот трюк в для: if((i-ch1) % numberPerLine == numberPerLine-1) { System.out.println(""); }