对不起,这是一堆混乱的代码,但是我希望我的程序输出类似这样的内容
我可以接近它,但文字不是在星星内部,而是居中或居中,并且中间居中的三个星星在这里,是我的代码
import java.util.Scanner;
public class test {
public static void main(String[] args) {
// TODO code application logic here
String msg;
int width = 54;
Scanner pipe = new Scanner (System.in);
System.out.print ("Enter a message to for a header: ");
msg = pipe.next();
int spaceTaken = width - msg.length();
int center = (spaceTaken - msg.length()) / 2;
for (int i = 1; i <= 1; i++) {
for (int x = 1; x <= 60; x++) {
System.out.print ("*");
}
System.out.println ();
}
for (int i = 1; i <= 1; i++) {
for (int x = 1; x <= 3; x++) {
System.out.print ("*");
}
}
for (int i = 1; i <= 1; i++) {
for (int x = 1; x <= center + msg.length(); x++) {
System.out.print (" ");
}
}
System.out.format ("%" + msg.length() + "s", msg);
for (int i = 1; i <= 1; i++) {
for (int x = 1; x <= center - (msg.length() / 2); x++) {
System.out.print (" ");
}
}
for (int i = 1; i <= 1; i++) {
for (int x = 1; x <= 3; x++) {
System.out.print ("*");
}
System.out.println ();
}
for (int i = 1; i <= 1; i++) {
for (int x = 1; x <= 60; x++) {
System.out.print ("*");
}
System.out.println ();
}
}
}
答案 0 :(得分:0)
我相信有很多库都可以做到这一点,但是作为一个练习-下面的函数将生成类似*** message ***
的行(虽然并不完美):
public String center(String message, int length, int sides, char border) {
if(message.length() + 2*sides > length) {
throw new IllegalStateException("Cannot center " + message + " within " + length +
"characters");
}
int chars = message.length() + 2*sides;
int gap = (length - chars)/2;
int extra = (length - chars) % 2;
StringBuilder line = new StringBuilder();
for(int i = 0; i < sides; i++) {
line.append(border);
}
for(int i = 0; i < gap; i++) {
line.append(" ");
}
line.append(message);
for(int i = 0; i < gap + extra; i++) {
line.append(" ");
}
for(int i = 0; i < sides; i++) {
line.append(border);
}
return line.toString();
}
答案 1 :(得分:0)
您的解决方案中有很多问题。
对不起,我不明白你的逻辑。
但是我会给你一些提示,让你不明白。
1)请勿使用for (int i = 1; i <= 1; i++) {...}
。
2)这是最重要的,您必须划分 Left 和 Right 空间,并知道某些左侧或右侧可以有一个额外的起点。
3)将您的问题划分为各种方法,您应该有一个控制台 getMessage 的方法,一种计算所有开始次数的方法,并在中心显示消息。
4)您的班级名称应以大写开头(符合惯例)。
5)比StringBuilder
更喜欢String
,这是有效的。
我已尝试使其尽可能简单以使您理解:
....
public static void main(String[] args) {
// TODO code application logic here
String msg;
int width = 60;
Scanner pipe = new Scanner(System.in);
System.out.print("Enter a message to for a header: ");
msg = pipe.next();
StringBuilder asterisk = new StringBuilder(width);
for (int x = 1; x <= 60; x++) {
asterisk.append("*");
}
int qntSpaceBlank = (width - msg.length() - 6);
int qtdSpaceLeft;
int qtdSpaceRigth;
if (qntSpaceBlank % 2 == 0) {
qtdSpaceLeft = qntSpaceBlank / 2;
qtdSpaceRigth = qntSpaceBlank / 2;
} else {
qtdSpaceLeft = qntSpaceBlank / 2;
qtdSpaceRigth = qntSpaceBlank/2 + 1;
}
StringBuilder spaceBlankLeft = new StringBuilder(qtdSpaceLeft);
StringBuilder spaceBlankRight = new StringBuilder(qtdSpaceRigth);
for (int i = 1; i <= qtdSpaceLeft; i++) {
spaceBlankLeft.append(" ");
}
for (int i = 1; i <= qtdSpaceRigth; i++) {
spaceBlankRight.append(" ");
}
StringBuilder textCenter = new StringBuilder(width);
textCenter.append("***")
.append(spaceBlankLeft)
.append(msg)
.append(spaceBlankRight)
.append("***");
System.out.println(asterisk);
System.out.println(textCenter);
System.out.println(asterisk);
}
...
答案 2 :(得分:0)
有些想法可以用来打印所需的输出。请注意,这些是“工具”-可以使用它们来编写正确的程序。它具有一些自由文本程序逻辑和图片,以帮助“发现”问题。
程序逻辑:
Initial:
Total length = 60
Length of three stars = 3
Message length allowed = (Total length) - (Length of three stars * 2)
Accept/Enter Message string
Message length = Input string length
If Message length is zero or greater than Message length allowed
Cannot print - abort program.
Begin printing:
Print the beginning sixty stars
Print the first 3 stars
Starting length = (Total length / 2) - (Length of three stars) - (Message length / 2)
Print spaces upto the Starting length
Print the Message string
Ending length = Starting length
If message length is odd number
Ending length = Starting length - 1
Print spaces upto the Ending length
Print the last 3 stars
Print the end sixty stars
End printing.
答案 3 :(得分:0)
中心计算不正确,在您的情况下,它始终是静态的。以下是代码的输出,请注意字符串起始点始终是静态的:
************************************************************
*** a ***
************************************************************
************************************************************
*** aa ***
************************************************************
************************************************************
*** aaa ***
************************************************************
字符串的中心不会根据字符串的长度而改变。进行以下代码更改(您的代码已注释):
//int center = (spaceTaken - msg.length()) / 2;
int center = (width - msg.length()) / 2;
//for (int x = 1; x <= center + msg.length(); x++) {
for (int x = 1; x <= center; x++) {
//for (int x = 1; x <= center - (msg.length() / 2); x++) {
for (int x = 1; x <= center; x++) {
"*"
之前,添加以下代码: if( msg.length() % 2 > 0 )
System.out.print (" ");
以下是代码更改后的输出,请注意字符串起点如何更改:
************************************************************
*** a ***
************************************************************
************************************************************
*** aa ***
************************************************************
************************************************************
*** aaa ***
************************************************************
最后,可以对代码进行改进,以提高可重用性,可读性和可管理性。首先,请考虑将重复代码推入方法。例如,要打印边框,您可以创建一个printBorder()
。创建一个单独的方法(带有必需的参数),该方法将在居中之后返回一个字符串。