#java #arrays
#java #массивы
Вопрос:
Я пытаюсь напечатать пирамиду из ‘*’, используя методы массива 5×5 или 7×7 или 9×9 или 11×11 в соответствии с вводом пользователя.
Мой код прямо сейчас печатает половину пирамиды, похоже, не может получить другую половину. Помощь была бы очень признательна.
public static char[][] pointUp (char asterik, int length){
char [] [] pointUp = new char [length] [length];
for (int i = 0; i < length; i ){
for (int j = 0; j < length; j ) {
pointUp[i][j] = ' ';
}
}
int end = length;
int j = 0;
for (int column = 0; column < end; column ) {
for (int row = j; row <= length/2; row ) {
pointUp[row][column] = asterik;
}
j ;
end ;
}
return pointUp;
}
ожидается для кода 5×5:
*
* * *
* * * * *
(space intended for remaining 2 columns)
ожидается для кода 7×7 и так далее:
*
* * *
* * * * *
* * * * * * *
(space intended for remaining 3 columns)
что я получаю за код 7×7 и так далее (другая половина отсутствует):
*
* *
* * *
* * * *
(space intended for remaining 3 columns)
Ответ №1:
Это то, что вы хотите?
class test {
public static void main(String[] args) {
testPointUp(21);
}
public static char[][] pointUp(char asterisk, int length) {
// make sure length is odd, other wise you can't do this
// I encourage to make your own Exception class for clarity (e.g. NotOddException)
if (length % 2 == 0)
throw new RuntimeException("Can't make a pyramide with an even lower row");
// make the desired return value
char[][] ret = new char[length][length];
// if you devide the length parameter by two and avoid the .5, you
// get the amount of empty columns in the first row, decrement this every
// for every row, do this while emptyCols >= 0
int emptyCols = (int) length/2;
int row = 0;
int desiredAsterisks = 1;
while (emptyCols >= 0) {
// first, add all empty cols
for (int i = 0; i < emptyCols; i ) {
ret[row][i] = ' ';
}
// then, add the desired amount of asterisks
for (int i = 0; i < desiredAsterisks; i ) {
ret[row][i emptyCols] = asterisk;
}
// and of course, add the remaining empty cols
for (int i = emptyCols desiredAsterisks; i < length; i ) {
ret[row][i] = ' ';
}
// change all necessary variables
emptyCols--;
desiredAsterisks = 2;
row ;
}
return ret;
}
public static void testPointUp(int length) {
char[][] test = pointUp('*', length);
// I use a StringBuilder rather then a String because I want to
// append a lot of characters to the variable I want to print out
// in the end. Strings are immutable so every time you concatenate a String
// a new variable is being made and given to the String variable, using a
// StringBuilder is much more efficient in concatenating (appending).
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < length; i ) {
for (int j = 0; j < length; j ) {
sb.append(test[i][j]);
}
sb.append("n");
}
System.out.println(sb);
}
}
Ответ №2:
Ну вот и все!
public static char[][] pointUp(char asterik, int length) {
char[][] pointUp = new char[length][length];
int halfLength = length / 2;
for (int i = 0; i < halfLength 1; i ) {
int end = halfLength - i;
for (int j = 0; j < end; j ) {
pointUp[i][j] = ' ';
}
for (int k = 0; k < 2 * i 1; k )
pointUp[i][k end] = asterik;
}
return pointUp;
}
Разбейте шаблон на серии, затем попытайтесь решить меньшую серию и создайте свое решение.