(編程小白,目前大學本科在讀,最近在學習c語言,記錄一下學習心得,若有寫的不對的,還望大佬們指正)
(題目來源于牛客網題庫)鏈接:https://www.nowcoder.com/ta/beginner-programmers
例題:
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的菱形圖案,
輸入描述:
多組輸入,一個整數(2~20),
輸出描述:
針對每行輸入,輸出用“*”組成的菱形,每個“*”后面有一個空格,
輸入:
2
輸出:
*
* *
* * *
* *
*
輸入:
3
輸出:
*
* *
* * *
* * * *
* * *
* *
*
分析:
這類題的做法比較多,因為for回圈的套娃特性,每個人有每個人的邏輯,對于回圈陳述句的控制變化多樣,所以很長時間我都是試探著做這類題,每次做都頭疼,后來做多了,發現了一個方法,
靈感源于高中控制變數的思想,
模版:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < ? ? ; j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
模版的套用:
#include <stdio.h>
int main(void)
{
int n = 0; //變數n用來存放用戶輸入的資料,這里我用2舉例子
int i = 0, j = 0; //變數i控制行數,變數j控制列數
while (~scanf("%d", &n)) //這里是多組輸入的簡單寫法
{
for (i = 0; i < n; i++) //最外層for回圈列印一個\n控制輸出的行數
{
for (j = 0; j < ? ? ; j++) //這里固定格式,??內容挖坑待補
{
printf(" "); //這里列印出題目要求的字符組成,這里是此題的組成1(也就是空格)
}
for (j = 0; j < ? ? ; j++) //同上
{
printf("* "); //這里列印出題目要求的字符組成,這里是此題的組成2(也就是* )
}
printf("\n"); //最外層回圈列印的換行符,控制輸出行數
} //這樣最由兩種字符樣式排列的整體框架就完成了
for (i = 0; i < (n + 1); i++) //這個是輸出了三行,所以是n+1行,為了方便理解我把n+1用括號括起來(n+1)
{
for (j = 0; j < ? ? ; j++) //同上
{
printf(" "); //同上
}
for (j = 0; j < ? ? ; j++) //同上
{
printf("* "); //同上
}
printf("\n"); //同上
}
}
return 0;
}
//下面闡述回圈控制也就是??部分的寫法,以此題為例
/* 第一個??列印了2個空格,觀察其變化是2、1,可知運算式中必定有-i,n-i=2,所以這里填n-i,
第二個??列印了1個* ,觀察其變化是1、2,可知運算式中必定有+i,i+1=1,所以這里填i+1,(或者前面寫成<=)
第三個??列印了0個空格,觀察其變化是0、1、2,可知運算式中必定有+i,i=0;所以這里填i即可
第四個??列印了3個* ,觀察其變化是3、2、1,可知運算式中必定有-i,(n+1)-i=3,所以這里填n+1-i (或者前面寫成<=) */
//綜上所述,可寫出這道題的正確答案如下,其他題以此類推
本題參考答案:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("* ");
}
printf("\n");
}
for (i = 0; i < n + 1; i++)
{
for (j = 0; j < i; j++)
{
printf(" ");
}
for (j = 0; j < n - i + 1; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
相似題目驗證模版的普適性及對于模版套用的鞏固
正方形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的正方形圖案,
輸入描述:
多組輸入,一個整數(1~20),表示正方形的長度,也表示輸出行數,
輸出描述:
針對每行輸入,輸出用“*”組成的對應邊長的正方形,每個“*”后面有一個空格,
輸入:
4
輸出:
* * * *
* * * *
* * * *
* * * *
輸入:
5
輸出:
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
參考答案:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
直角三角形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的直角三角形圖案,
輸入描述:
多組輸入,一個整數(2~20),表示直角三角形直角邊的長度,即“*”的數量,也表示輸出行數,
輸出描述:
針對每行輸入,輸出用“*”組成的對應長度的直角三角形,每個“*”后面有一個空格,
輸入:
4
輸出:
*
* *
* * *
* * * *
輸入:
5
輸出:
*
* *
* * *
* * * *
* * * * *
參考答案:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < i + 1; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
翻轉直角三角形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的翻轉直角三角形圖案,
輸入描述:
多組輸入,一個整數(2~20),表示翻轉直角三角形直角邊的長度,即“*”的數量,也表示輸出行數,
輸出描述:
針對每行輸入,輸出用“*”組成的對應長度的翻轉直角三角形,每個“*”后面有一個空格,
輸入:
5
輸出:
* * * * *
* * * *
* * *
* *
*
輸入:
6
輸出:
* * * * * *
* * * * *
* * * *
* * *
* *
*
參考答案:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
帶空格直角三角形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的帶空格直角三角形圖案,
輸入描述:
多組輸入,一個整數(2~20),表示直角三角形直角邊的長度,即“*”的數量,也表示輸出行數,
輸出描述:
針對每行輸入,輸出用“*”組成的對應長度的直角三角形,每個“*”后面有一個空格,
輸入:
4
輸出:
*
* *
* * *
* * * *
輸入:
5
輸出:
*
* *
* * *
* * * *
* * * * *
參考答案:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n ; i++)
{
for (j = 0; j < n - i - 1; j++)
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
金字塔圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的金字塔圖案,
輸入描述:
多組輸入,一個整數(2~20),表示金字塔邊的長度,即“*”的數量,,也表示輸出行數,
輸出描述:
針對每行輸入,輸出用“*”組成的金字塔,每個“*”后面有一個空格,
輸入:
4
輸出:
*
* *
* * *
* * * *
輸入:
5
輸出:
*
* *
* * *
* * * *
* * * * *
答案:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i - 1; j++)
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
翻轉金字塔圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的翻轉金字塔圖案,
輸入描述:
多組輸入,一個整數(2~20),表示翻轉金字塔邊的長度,即“*”的數量,也表示輸出行數,
輸出描述:
針對每行輸入,輸出用“*”組成的金字塔,每個“*”后面有一個空格,
輸入:
5
輸出:
* * * * *
* * * *
* * *
* *
*
輸入:
6
輸出:
* * * * * *
* * * * *
* * * *
* * *
* *
*
參考答案:
#include <stdio.h>
int main(void)
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < i; j++)
{
printf(" ");
}
for (j = 0; j < n - i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
菱形圖案(這個就是例題,我做到這題時找到的規律)
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的菱形圖案,
輸入描述:
多組輸入,一個整數(2~20),
輸出描述:
針對每行輸入,輸出用“*”組成的菱形,每個“*”后面有一個空格,
輸入:
2
輸出:
*
* *
* * *
* *
*
輸入:
3
輸出:
*
* *
* * *
* * * *
* * *
* *
*
參考答案:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("* ");
}
printf("\n");
}
for (i = 0; i < n + 1; i++)
{
for (j = 0; j < i; j++)
{
printf(" ");
}
for (j = 0; j < n - i + 1; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
K形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的K形圖案,
原題尾端便有看不到的空格占位符這個隱藏坑,此處空格用“.”表示,其他題亦然,
原題尾端便有看不到的空格占位符這個隱藏坑,此處空格用“.”表示,其他題亦然,
原題尾端便有看不到的空格占位符這個隱藏坑,此處空格用“.”表示,其他題亦然,
輸入描述:
多組輸入,一個整數(2~20),
輸出描述:
針對每行輸入,輸出用“*”組成的K形,每個“*”后面有一個空格,
輸入:
2
輸出:
*.*.*.
*.*..
*...
*.*..
*.*.*.
輸入:
3
輸出:
*.*.*.*.
*.*.*..
*.*...
*....
*.*...
*.*.*..
*.*.*.*.
參考答案:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i + 1; j++)
{
printf("* ");
}
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("\n");
}
for (i = 0; i < n + 1; i++)
{
for (j = 0; j < 1 + i; j++)
{
printf("* ");
}
for (j = 0; j < n - i; j++)
{
printf(" ");
}
printf("\n");
}
}
return 0;
}
箭形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的箭形圖案,
輸入描述:
多組輸入,一個整數(2~20),
輸出描述:
針對每行輸入,輸出用“*”組成的箭形,
輸入:
2
輸出:
*
**
***
**
*
輸入:
3
輸出:
*
**
***
****
***
**
*
參考答案:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0,j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
printf(" ");
}
for (j = 0; j < 1 + i; j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < n + 1; i++)
{
for (j = 0; j < i; j++)
{
printf(" ");
}
for (j = 0; j < n + 1 - i; j++)
{
printf("*");
}
printf("\n");
}
}
return 0;
}
當然常規做法并不一定是最簡單的方法,當圖案分成的最小單元很多的時候,套模板就顯得很臃腫,這時候就要找規律,如下面三題所示,
反斜線形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的反斜線形圖案,
輸入描述:
多組輸入,一個整數(2~20),表示輸出的行數,也表示組成反斜線的“*”的數量,
輸出描述:
針對每行輸入,輸出用“*”組成的反斜線,
輸入:
4
輸出:
*...
.*..
..*.
...*
輸入:
5
輸出:
*....
.*...
..*..
...*.
....*
參考答案:
//方法1:套模板
#include <stdio.h>
int main()
{
int n = 0;
int i = 0,j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < n - 1 - i; j++)
{
printf(" ");
}
printf("\n");
}
}
return 0;
}
//方法2:找規律
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
正斜線形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的正斜線形圖案,
輸入描述:
多組輸入,一個整數(2~20),表示輸出的行數,也表示組成正斜線的“*”的數量,
輸出描述:
針對每行輸入,輸出用“*”組成的正斜線,
輸入:
4
輸出:
...*
..*.
.*..
*...
輸入:
5
輸出:
....*
...*.
..*..
.*...
*....
參考答案:
//方法1:套模板
#include <stdio.h>
int main()
{
int n = 0;
int i = 0,j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("\n");
}
}
return 0;
}
//方法2:找規律
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i + j == n - 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
X形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的X形圖案,
輸入描述:
多組輸入,一個整數(2~20),表示輸出的行數,也表示組成“X”的反斜線和正斜線的長度,
輸出描述:
針對每行輸入,輸出用“*”組成的X形圖案,
輸入:
5
輸出:
*...*
.*.*.
..*..
.*.*.
*...*
輸入:
6
輸出:
*....*
.*..*.
..**..
..**..
.*..*.
*....*
參考答案:
方法一套模板很繁瑣,我嘗試做了一下,我一開始是照著偶數排列去做的,后面發現奇數和偶數還不一樣,我又分成了奇數偶數兩塊,偶數部分很輕松,但是奇數部分重疊了一列,我試圖用continue陳述句跳過這一列,但我學藝不精,沒搞定,嗚嗚嗚,孩子哭了,還請看到的大佬幫我改一下,
//方法1:套模板(有個bug)
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
//奇數
if (n % 2 != 0)
{
for (i = 0; i < n / 2; i++)
{//左上
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < n / 2 - i; j++)
{
printf(" ");
}
//右上
for (j = 0; j < n / 2 - i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("\n");
}
for (i = 0; i < n / 2 + 1; i++)
{//左下,其實就是右上,復制粘貼下就ok
for (j = 0; j < n / 2 - i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < i; j++)
{
printf(" ");
}
//右下,其實就是左上,復制粘貼下就ok
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < n / 2 - i; j++)
{
printf(" ");
}
printf("\n");
}
}
//偶數
if(n%2==0)
{
for (i = 0; i < n / 2; i++)
{//左上
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < n / 2 - 1 - i; j++)
{
printf(" ");
}
//右上
for (j = 0; j < n / 2 - 1 - i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("\n");
}
for (i = 0; i < n / 2; i++)
{//左下,其實就是右上,復制粘貼下就ok
for (j = 0; j < n / 2 - 1 - i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < i; j++)
{
printf(" ");
}
//右下,其實就是左上,復制粘貼下就ok
for (j = 0; j < i; j++)
{
printf(" ");
}
printf("*");
for (j = 0; j < n / 2 - 1 - i; j++)
{
printf(" ");
}
printf("\n");
}
}
}
return 0;
}
//方法2:找規律
#include <stdio.h>
int main()
{
int n = 0;
int i = 0; int j = 0;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j)
printf("*");
else if (i + j == n - 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
模版方法的局限性:
做到后面兩題的時候我發現,圖案很難分割成有規律的三角形圖案,所以我發現此模版的適用范圍只能是由連續的“三角形"排列或者可以分割成連續的“三角形”的圖案的題目,其他的還是得找規律,
“空心”正方形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的“空心”正方形圖案,
輸入描述:
多組輸入,一個整數(3~20),表示輸出的行數,也表示組成正方形邊的“*”的數量,
輸出描述:
針對每行輸入,輸出用“*”組成的“空心”正方形,每個“*”后面有一個空格,
輸入:
4
輸出:
* * * *
* *
* *
* * * *
輸入:
5
輸出:
* * * * *
* *
* *
* *
* * * * *
參考答案:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == 0 || i == n - 1)
printf("* ");
else if (j == 0 || j == n - 1)
printf("* ");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
“空心”三角形圖案
KiKi學習了回圈,BoBo老師給他出了一系列列印圖案的練習,該任務是列印用“*”組成的“空心”三角形圖案,
輸入描述:
多組輸入,一個整數(3~20),表示輸出的行數,也表示組成三角形邊的“*”的數量,
輸出描述:
針對每行輸入,輸出用“*”組成的“空心”三角形,每個“*”后面有一個空格,
輸入:
4
輸出:
*.......
*.*.....
*...*...
*.*.*.*.
輸入:
5
輸出:
*.........
*.*.......
*...*.....
*.....*...
*.*.*.*.*.
參考答案:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0, j = 0;
while (~scanf("%d", &n))
{
for (i = 1; i < n + 1; i++)
{
for (j = 1; j < n + 1; j++)
{
if ((i == j) || (j == 1) || (i == n))
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
雖然這種方法不適用于所有的此類列印圖案的題目,但是做完這些題我也識訓了好多東西,希望接下來的我依然能堅持學習編程,堅持寫博客,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/254443.html
標籤:其他
