今天突然想到了自己對for循環的理解,因爲之前老師講過九九乘法表的打印方法,自己卻還沒真的那麼做過,就想着要做一下,順便就把打印圖形再複習一遍。
首先是打印一個九九乘法表
package demo0124;
/**
* 一個九九乘法表
*
* @author Feng 2018年1月24日下午12:24:15
*/
public class ChengFaTable {
public static void main(String[] args) {
// TODO 自動生成的方法存根
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i * j + "\t");
}
System.out.println();
}
}
}
結果如圖示:
接下來就是圖形的問題了
關於這個,我把幾乎所有的認識都放在了註釋裏邊,覺得那樣容易理解些。
package d;
public class Demo01 {
public static void main(String[] args) {
/**
* 用* 打印出圖形,使用for 循環嵌套來實現。
* 有直角三角形,等腰三角形,菱形,平行四邊形。
*
* 首先來分析:
*1、 for 循環嵌套時,有內層循環和外層循環,首先一定得明白,外層執行一次,內層執行一遍。
*2、程序中打印字符是一行一行打印的。也就是需要在換行的地方多思考
*3、*****
* ****
* ***
* **
* *
* 這個圖形的形成是怎樣的,我們可以很明顯就能看出來,第一行有5個* ,然後換行,再到第二行,*是少了一個的。
* 可以把外層看做是 行數,而內層循環是列數,每一行的列數。
* 這樣就能好理解一些了。因爲第3、4、5行都是逐層遞減的。也就是內層的循環次數是在外層循環每執行一次的時候就減少一次。
* 我們可以先確定行數,以上邊這個直角三角形爲例,它是外層循環5次,內層循環5次,只是內層每執行一次打印的*就少一個。
* @author Feng
* 2018年1月24日下午12:06:36
*/
//直角三角形方法1
for (int i = 0; i < 5; i++) {//用 i 來表示行數,外層是循環5次。
//每打印完一行的*之後,換行並且i+1換到下一行,這裏的j<5-i就表示在i從0到4遞增的同時,j是從5到1的遞減的
//所以就能出現第一行5個*,第2行4個*,第三行3個*,一直到第5行是1個*,組合起來就剛好是一個直角三角形了。
for (int j = 0; j < 5-i; j++) {//用j 來表示列數,內層也是5次。
System.out.print("*");//在第i行打印*,*的個數由j確定。
}
System.out.println();//當內層循環完一圈之後,就換行,第一次是5個*就換行。
}
//直角三角形方法2
for (int i = 0; i < 5; i++) {
for (int j = i; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}
//尖朝上的直角三角形
System.out.println("======================================");
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//平行四邊形,由尖朝上的直角三角形,空白的(我這裏用2表示,當輸出是" "的時候就能看出是個矩形,不過斜着來了一刀,也是尖朝下的。)
//所以平行四邊形是由3部分組成的,3個三角形,一個是空格組成的三角形
/**
* *
* **
* ***
* ****
* *****
* 2****
* 22***
* 222**
* 2222*
* 22222
*
* 分析一下:平行四邊形,用1個四行四列得到三角形在底下,5行5列的在上邊
* 這裏的2是打印的空格的地方,其實就是上邊那個尖朝上的三角形了。
*/
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
for (int i = 0; i < 5; i++) {//同樣是外循環5次
for (int j = 0; j <= i; j++) {//隨着i的增加,j是從0到4的。
System.out.print("2");//5行5列的空白。
}
for (int j = 0; j < (4 - i); j++) {//隨着i從0到4的增加,j是從0到3的增加。
System.out.print("*");//4行4列的*。
}
System.out.println();
}
System.out.println("======================================");
//倒等腰三角
/**
* *******
* *****
* ***
* *
*
* 同樣是先打印個尖向上的空白三角形
*/
for(int i = 0; i < 4 ; i++){//4行
for(int j =0 ;j <= i; j++){//4列
System.out.print("5");//空白區域是4行4列的三角形
}
for(int k = 0 ;k < (3-i)*2+1 ;k++){//隨着i的增加,k的變化是 6+1,4+1,2+1,0+1
//也就是說,第一行除了打印了1個空白之外,還有7個*,第二行是5個*,依次類推。
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//正等腰三角
for(int i = 0; i < 4 ; i++){
for(int j =0 ; j < 4-i;j ++ ){
System.out.print(" ");
}
System.out.print("*");
for(int k = 0 ;k <i*2;k++){
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//菱形的笨蛋方法
//直接用2個等腰三角形拼起來。
for(int i = 0; i < 4 ; i++){
for(int j =0 ; j < 4-i;j ++ ){
System.out.print(" ");
}
for(int k = 0 ;k <i*2+1;k++){
System.out.print("*");
}
System.out.println();
}
for(int i = 0; i < 4 ; i++){
for(int j =0 ;j <= i+1; j++){
System.out.print(" ");
}
for(int k = 0 ;k <(7-2*i) ;k++){//把倒的等腰三角放在正的等腰三角形下邊。
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//可以看到,直接拼是不行的,這樣只能得到一個平行四邊形。還得調整一下條件。
for(int i = 0; i < 4 ; i++){
for(int j =0 ; j < 4-i;j ++ ){
System.out.print(" ");
}
for(int k = 0 ;k <i*2+1;k++){
System.out.print("*");
}
System.out.println();
}
for(int i = 0; i < 4 ; i++){
for(int j =0 ;j <= i+1; j++){
System.out.print(" ");
}
for(int k = 0 ;k <(5-2*i) ;k++){//把倒的等腰三角放在正的等腰三角形下邊。
//這時的k變化是:4,3,1,所以就有下邊那個3行的三角形。
System.out.print("*");
}
System.out.println();
}
}
}
對了,差點忘記附上截圖了。
還有就是
打印輸入行數的等腰三角形和菱形
/**
* 等腰三角形
* 輸入行數,然後打印所輸入行數的三角形。
*
* 思考:
* 8888888
* 888888*
* 88888***
* 8888*****
* 888*******
* 88*********
* 8***********
*
* 這裏的8,到時候就是空白區域
*
*
*/
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("請輸入你所需要打印的三角形的行數:");
int row1 = input.nextInt();//行數
for(int i = 0; i < row1+1 ;i++){//外層循環控制行數
for(int k = row1+1 -i ;k >0 ;k--){//6行就是7行空白,當i等於0的時候,k是行數,而且每次換行之後就把空白個數減去1。
System.out.print("8");
}
for(int j = 1; j <= 2*i-1 ;j++){//當i等於0,j是小於等於
System.out.print("*");
}
System.out.println();
}
System.out.println("===============================");
//打印輸入行數的菱形
//將打印輸入行數的三角形修改一下。
System.out.println("請輸入你要打印的菱形的行數:");
//這裏用的是上半個三角形的行數。
@SuppressWarnings("unused")
int row2 = input.nextInt();
//上邊部分是將打印三角形的代碼拷貝一下。
//可以看到,菱形如果是兩個三角形兌着的話,就是奇數行。
/**
* 8***************
* 88*************
* 888***********
* 8888*********
* 88888*******
* 888888*****
* 8888888***
* 88888888*
* 888888888
*
* 還有可能要將這下邊的最上面一行去掉。
*/
if(row2%2!=0){
for(int i = 0; i < (row2/2)+1+1 ;i++){//外層循環控制行數
for(int k = row2/2+2 -i ;k >0 ;k--){
System.out.print("8");
}
for(int j = 1; j <= 2*i-1 ;j++){
System.out.print("*");
}
System.out.println();
}
for(int i =0;i < row2/2+1;i++){
for(int k = 0;k <= i+1;k++){//i從0開始,row2是行數,k是打印空白的列數
System.out.print("9");
}
for (int j = 0; j <= (row2/2+1-i)*2-4 ; j++) {
System.out.print("*");
}
System.out.println();
}
}else{
System.out.println("菱形行數不能爲偶數!");
System.out.println("正在退出");
System.exit(0);
}
行啦,我的磚就拋到這兒了,哪位帥哥靚妹有好的想法可以交流哦~
記得留言哦。
這最後的圖是我修改之前的打印菱形,它的缺點是輸入的是菱形上半邊的比較大的那個三角形的行數。並不是菱形的行數,所以試了老半天,最後出現的結果就是把這個行數除以2加上1,這樣算的就是菱形的行數了。基本就是照着倒三角形的模樣修修改改,主要改的就是條件了,其他地方仍然拿來用就行。