Создание треугольника с петлями
Кажется, я не могу найти ответ на этот вопрос.
Мне нужно нарисовать простой треугольник, использующий для циклов.
*
***
*****
*******
*********
Я могу сделать половинный треугольник, но я не знаю, как добавить в мой текущий цикл, чтобы сформировать полный треугольник.
*
**
***
****
*****
for (int i=0; i<6; i++)
{
for (int j=0; j<i; j++)
{
System.out.print("*");
}
System.out.println("");
}
Спасибо -
Ответы
Ответ 1
Прежде всего, вам нужно убедиться, что вы производите правильное количество символов *
. Нам нужно произвести 1, 3, 5 и т.д. Вместо 1, 2, 3. Это можно устранить, изменив переменные счетчика:
for (int i=1; i<10; i += 2)
{
for (int j=0; j<i; j++)
{
System.out.print("*");
}
System.out.println("");
}
Как вы можете видеть, это приводит к тому, что i
начинается с 1
и увеличивается на 2
на каждом шаге, если оно меньше, чем 10
(т.е. 1
, 3
, 5
, 7
, 9
). Это дает нам правильное количество символов *
. Затем нам нужно исправить уровень отступа на строку. Это можно сделать следующим образом:
for (int i=1; i<10; i += 2)
{
for (int k=0; k < (4 - i / 2); k++)
{
System.out.print(" ");
}
for (int j=0; j<i; j++)
{
System.out.print("*");
}
System.out.println("");
}
Прежде чем печатать символы *
, мы печатаем некоторые пробелы, а количество пробелов меняется в зависимости от линии, в которой мы находимся. Это то, что для цикла for с переменной k
. Мы можем видеть, что k
выполняет итерации по значениям 4
, 3
, 2
, 1
и 0
, когда ì
1
, 3
, 5
, 7
и 9
. Это то, чего мы хотим, потому что чем выше в треугольнике мы, тем больше места нам нужно разместить. Чем дальше мы спускаемся по треугольнику, тем меньше нам пространства и последней линии треугольника вообще не нужны пробелы.
Ответ 2
Веселое, простое решение:
for (int i = 0; i < 5; i++)
System.out.println(" *********".substring(i, 5 + 2*i));
Ответ 3
Я ценю, что OP является новым для Java, поэтому методы могут считаться "продвинутыми", однако я думаю, что стоит использовать эту проблему, чтобы показать, как вы можете атаковать проблему, разбивая ее на части.
Подумайте о том, как написать метод для печати одной строки, указав метод, номер строки которого:
public void printTriangleLine(int rowNumber) {
// we have to work out what to put here
}
Нам нужно напечатать некоторое количество пробелов, затем некоторое количество звезд.
Посмотрев на пример, я вижу, что (если первая строка равна 0) это (5-rowNumber) пробелы и (2 * rowNumber + 1) звезды.
Придумайте метод, который печатает строки символов для нас и использует его:
public void printTriangleLine(int rowNumber) {
printSequence(" ", 5 - rowNumber);
printSequence("*", 2 * rowNumber + 1);
System.out.println();
}
Это не будет компилироваться, пока мы на самом деле не напишем printSequence(), поэтому сделаем следующее:
public void printSequence(String s, int repeats) {
for(int i=0; i<repeats; i++) {
System.out.print(s);
}
}
Теперь вы можете самостоятельно протестировать printSequence, и вы можете самостоятельно протестировать printTriangleLine. Пока вы можете просто попробовать, вызвав эти методы непосредственно в main()
public static void main(String [] args) {
printSequence("a",3);
System.out.println();
printTriangleLine(2);
}
... запустите его и проверьте (своими глазами), что он выводит:
aaa
*****
Когда вы переходите к программированию, вы захотите использовать инфраструктуру модульного тестирования, такую как jUnit. Вместо того, чтобы печатать, вы, скорее всего, пишете такие вещи, как printTriangleLine, чтобы вернуть String (который вы напечатали выше в вашей программе), и вы автоматизировали бы тестирование с помощью команд, таких как:
assertEquals(" *****", TriangleDrawer.triangleLine(2));
assertEquals(" *", TriangleDrawer.triangleLine(0))
Теперь у нас есть части, которые нам нужно нарисовать треугольник.
public void drawTriangle() {
for(int i=0; i<5; i++) {
printTriangleLine(i);
}
}
Код, который мы написали, немного длиннее ответов других людей. Но мы смогли протестировать каждый шаг, и у нас есть методы, которые мы можем использовать снова в других проблемах. В реальной жизни мы должны найти правильный баланс между разбиением проблемы на слишком много методов или слишком мало. Я предпочитаю много действительно коротких методов.
Для дополнительного кредита:
- адаптируйте это, чтобы вместо того, чтобы печатать на System.out, методы возвращают String - поэтому в вашем main() вы можете использовать
System.out.print(drawTriangle())
- адаптируйте это, чтобы вы могли запросить drawTriangle() для разных размеров, то есть вы можете вызвать
drawTriangle(3)
или drawTriangle(5)
- сделать работу более крупными треугольниками. Подсказка: вам нужно добавить новый параметр width для printTriangleLine().
Ответ 4
Сначала подумайте о решении без кода. Идея состоит в том, чтобы напечатать нечетное число *, увеличивающееся по строке. Затем центрируйте * с помощью пробелов. Знание максимального числа * в последней строке даст вам начальное число пробелов, чтобы центрировать первый *. Теперь напишите его в коде.
Ответ 5
Домашний вопрос?
Ну, вы можете изменить свой оригинальный код "правильного треугольника", чтобы создать перевернутый "правый треугольник" с пробелами
Так что это будет как
for(i=0; i<6; i++)
{
for(j=6; j>=(6-i); j--)
{
print(" ");
}
for(x=0; x<=((2*i)+1); x++)
{
print("*");
}
print("\n");
}
Ответ 6
Попробуйте это в Java
for (int i = 6, k = 0; i > 0 && k < 6; i--, k++) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
for (int j = 0; j < k; j++) {
System.out.print("*");
}
for (int j = 1; j < k; j++) {
System.out.print("*");
}
System.out.println();
}
Ответ 7
for (int i=0; i<6; i++)
{
for (int k=0; k<6-i; k++)
{
System.out.print(" ");
}
for (int j=0; j<i*2+1; j++)
{
System.out.print("*");
}
System.out.println("");
}
Ответ 8
Это ответит на ваш вопрос. раскомментируйте прокомментированный код для отображения только внешней строки:)
public class TrianglePattern {
public static void main(String[] args) {
// This logic will generate the triangle for given dimension
int dim = 10;
for (int i = 0; i < dim; i++) {
for (int k = i; k < dim; k++) {
System.out.print(" ");
}
for (int j = 0; j <= i; j++) {
//if (i != dim - 1)
// if (j == 0 || j == i)
// System.out.print("*");
// else
// System.out.print(" ");
//else
System.out.print("*");
System.out.print(" ");
}
System.out.println("");
}
}
}
Ответ 9
private static void printStar(int x) {
int i, j;
for (int y = 0; y < x; y++) { // number of row of '*'
for (i = y; i < x - 1; i++)
// number of space each row
System.out.print(' ');
for (j = 0; j < y * 2 + 1; j++)
// number of '*' each row
System.out.print('*');
System.out.println();
}
}
Ответ 10
Это позволяет вам немного контролировать и облегчать его создание:
public static int biggestoddnum = 31;
public static void main(String[] args) {
for (int i=1; i<biggestoddnum; i += 2)
{
for (int k=0; k < ((biggestoddnum / 2) - i / 2); k++)
{
System.out.print(" ");
}
for (int j=0; j<i; j++)
{
System.out.print("*");
}
System.out.println("");
}
}
Просто измените значение public static int biggestoddnum
на любое нечетное число, которое вы хотите, и for(int k...)
был протестирован для работы.