以下是我要创建的内容:
*
**
***
****
*********
****
***
**
*
这是我创造的:
*
**
***
****
**********
****
***
**
*
这是我的代码:
for(int i = 1; i <= 5; i++){
for(int j = 1; j<=i; j++){
System.out.print("*");
}
System.out.println();
if(i == 4){
for(int f = 0; f < 5; f++){
System.out.print("*");
}
}
}
for(int i = 1; i <= 5; i++){
for(int j = 4; j>=i; j--){
System.out.print("*");
}
System.out.println();
}
我不知道如何缩进尾部,请不要给我答案,只要告诉我问题在哪里,我会尽力去做。谢谢!
答案 0 :(得分:1)
你应该在打印“*”的for循环之前添加另一个内部for循环打印“”。
答案 1 :(得分:1)
您可以使用printf
方法以特定格式告知Java
打印。例如,您需要前缀5个空格然后打印您的文本:
System.out.printf("%5s","hello");
要获得所需的输出,请尝试以下代码。注意:可能有更好的解决方案。
for (int i = 1; i <= 5; i++) {
if (i != 5) // middle line should not be prefix with spaces
// empty 5 spaces before starting the loop
System.out.printf("%5s", "");
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
if (i == 4) {
for (int f = 0; f < 5; f++) {
System.out.print("*");
}
}
}
for (int i = 1; i <= 5; i++) {
// print 5 space before
System.out.printf("%5s", ""); // <== note the printf here with empty string
for (int j = 4; j >= i; j--) {
System.out.print("*");
}
System.out.println();
}
答案 2 :(得分:1)
鉴于您提供的形状,并假设它将以等宽字体输出,我们可以在网格上绘制。
将视觉分为两个部分,我们可以看到有两种主要模式。
尾巴(绿色)和头部(红色)。
还有第二种模式。头部中的恒星数量增加和减少的地方。
尾巴的大小可能会有所不同,头部的大小也会发生变化,它仍然是我们认为是箭头的形状。
当输出文本时,最简单的迭代顺序通常是从左到右,从上到下,除非处理从右到左的语言,或垂直阅读,我将假设西方文化的输出,因为这是什么在编程输出流中普及。
所以,问题是,如何最好地建立输出所需的字符串。
考虑到输出将在流上的格式,
宽度将是你的外部循环,尾部/长度是你的内部循环。
您提供的代码使用10表示宽度,将其分为2组5,第二组偏移1。
for(int i = 1; i <= 5; i++){
for(int j = 1; j<=i; j++){
System.out.print("*");
}
System.out.println();
if(i == 4){
for(int f = 0; f < 5; f++){
System.out.print("*");
}
}
}
for(int i = 1; i <= 5; i++){
for(int j = 4; j>=i; j--){
System.out.print("*");
}
System.out.println();
}
将代码翻译回图纸,然后循环宽度,最后一次迭代输出尾部的星线。
您需要做的是在所有其他行上输出空格。
有多种方法可以输出,或者使用printf使用固定宽度格式化功能之一。
但是考虑到你当前的代码,当增加模式的宽度迭代不是4时,最小的区别是输出空格字符,宽度的循环是-1。
看着你的最终结果,你的尾巴正在你的头后打印。这需要提前。
你的尾巴太长了,需要将它抵消1。
你需要通过打印空格插入粉色和棕色部分,输出尾部的次数相同,只要你不输出尾部。
答案 3 :(得分:0)
Here's a method you can use to print the arrow:
private static void printArrow (final int min, final int max, final int tip)
{
final int numSpaces = tip - max - 1;
// print the top
for (int i = min; i <= max; i++)
{
for (int j = 0; j < numSpaces; j++)
System.out.print(" ");
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.println();
}
// print the tip
for (int i = 0; i < tip; i++)
{
System.out.print("*");
}
System.out.println();
// print the bottom
for (int i = max; i >= min; i--)
{
for (int j = 0; j < numSpaces; j++)
System.out.print(" ");
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.println();
}
}
Call it from main with:
public static void main(String[] args)
{
// this will print the arrow in your question
printArrow(1, 4, 9);
}
Another Example:
printArrow(1, 10, 19);
Outputs:
*
**
***
****
*****
******
*******
********
*********
**********
*******************
**********
*********
********
*******
******
*****
****
***
**
*
答案 4 :(得分:0)
这是我的答案。您只需先插入空格然后打印*
,直到到达中间线。如果您想使其动态化,只需动态替换k
的边界值与f
的边界相同:
public static void main(String[] args) {
int k = 1;
int m = 0;
for (int i = 1; i <= 5; i++) {
m = i - 1;
while (k != 6 && m != 4) {
System.out.print(" ");
k++;
}
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
if (i == 4) {
for (int f = 0; f < 5; f++) {
System.out.print("*");
}
}
k = 1;
}
k = 1;
for (int i = 1; i <= 5; i++) {
while (k != 6) {
System.out.print(" ");
k++;
}
for (int j = 4; j >= i; j--) {
System.out.print("*");
}
System.out.println();
k = 1;
}
}
修改强>
我意识到输出后面只有一个*
。因此,只需要将k
的边界值从5更改为6(从f
的边界值到f
+ 1的边界值)
输出如下所示:
答案 5 :(得分:-2)
for (int i = 1; i <= 5; i++) {
if (i!=5) {
System.out.print(" ");
}
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
if (i == 4) {
for (int f = 0; f < 5; f++) {
System.out.print("*");
}
}
}
for (int i = 1; i <= 5; i++) {
System.out.print(" ");
for (int j = 4; j >= i; j--) {
System.out.print("*");
}
System.out.println();
}