关于用for循环语句实现在屏幕上打印特殊图案入门级编程题目的解法

您所在的位置:网站首页 第1个图案第2个图案第3个图案第4个图案 关于用for循环语句实现在屏幕上打印特殊图案入门级编程题目的解法

关于用for循环语句实现在屏幕上打印特殊图案入门级编程题目的解法

2023-09-06 05:59| 来源: 网络整理| 查看: 265

(编程小白,目前大学本科在读,最近在学习c语言,记录一下学习心得,若有写的不对的,还望大佬们指正)

(题目来源于牛客网题库)链接:https://www.nowcoder.com/ta/beginner-programmers

例题:

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。

输入描述: 多组输入,一个整数(2~20)。 输出描述: 针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。 输入: 2 输出: * * * * * * * * * 输入: 3 输出: * * * * * * * * * * * * * * * * 分析:

这类题的做法比较多,因为for循环的套娃特性,每个人有每个人的逻辑,对于循环语句的控制变化多样,所以很长时间我都是试探着做这类题,每次做都头疼。后来做多了,发现了一个方法。

灵感源于高中控制变量的思想。

模版: #include int main(void) { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf("* "); } printf("\n"); } return 0; } 模版的套用: #include int main(void) { int n = 0; //变量n用来存放用户输入的数据,这里我用2举例子 int i = 0, j = 0; //变量i控制行数,变量j控制列数 while (~scanf("%d", &n)) //这里是多组输入的简单写法 { for (i = 0; i printf(" "); //这里打印出题目要求的字符组成,这里是此题的组成1(也就是空格) } for (j = 0; j for (j = 0; j printf("* "); //同上 } printf("\n"); //同上 } } return 0; } //下面阐述循环控制也就是??部分的写法,以此题为例 /* 第一个??打印了2个空格,观察其变化是2、1,可知表达式中必定有-i,n-i=2,所以这里填n-i。 第二个??打印了1个* ,观察其变化是1、2,可知表达式中必定有+i,i+1=1,所以这里填i+1。(或者前面写成 for (i = 0; i printf(" "); } for (j = 0; j for (j = 0; j printf("* "); } printf("\n"); } } return 0; } 相似题目验证模版的普适性及对于模版套用的巩固 正方形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的正方形图案。

输入描述: 多组输入,一个整数(1~20),表示正方形的长度,也表示输出行数。 输出描述: 针对每行输入,输出用“*”组成的对应边长的正方形,每个“*”后面有一个空格。 输入: 4 输出: * * * * * * * * * * * * * * * * 输入: 5 输出: * * * * * * * * * * * * * * * * * * * * * * * * * 参考答案: #include int main(void) { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf("* "); } printf("\n"); } } return 0; } 直角三角形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的直角三角形图案。

输入描述: 多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。 输出描述: 针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。 输入: 4 输出: * * * * * * * * * * 输入: 5 输出: * * * * * * * * * * * * * * * 参考答案: #include int main(void) { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf("* "); } printf("\n"); } } return 0; } 翻转直角三角形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的翻转直角三角形图案。

输入描述: 多组输入,一个整数(2~20),表示翻转直角三角形直角边的长度,即“*”的数量,也表示输出行数。 输出描述: 针对每行输入,输出用“*”组成的对应长度的翻转直角三角形,每个“*”后面有一个空格。 输入: 5 输出: * * * * * * * * * * * * * * * 输入: 6 输出: * * * * * * * * * * * * * * * * * * * * * 参考答案: #include int main(void) { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf("* "); } printf("\n"); } } return 0; } 带空格直角三角形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的带空格直角三角形图案。

输入描述: 多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。 输出描述: 针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。 输入: 4 输出: * * * * * * * * * * 输入: 5 输出: * * * * * * * * * * * * * * * 参考答案: #include int main(void) { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } for (j = 0; j int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } for (j = 0; j int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } for (j = 0; j int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } for (j = 0; j for (j = 0; j printf("* "); } printf("\n"); } } return 0; } K形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的K形图案。

原题尾端便有看不到的空格占位符这个隐藏坑,此处空格用“.”表示,其他题亦然。

原题尾端便有看不到的空格占位符这个隐藏坑,此处空格用“.”表示,其他题亦然。

原题尾端便有看不到的空格占位符这个隐藏坑,此处空格用“.”表示,其他题亦然。

输入描述: 多组输入,一个整数(2~20)。 输出描述: 针对每行输入,输出用“*”组成的K形,每个“*”后面有一个空格。 输入: 2 输出: *.*.*. *.*.. *... *.*.. *.*.*. 输入: 3 输出: *.*.*.*. *.*.*.. *.*... *.... *.*... *.*.*.. *.*.*.*. 参考答案: #include int main() { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf("* "); } for (j = 0; j for (j = 0; j printf(" "); } printf("\n"); } } return 0; } 箭形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的箭形图案。

输入描述: 多组输入,一个整数(2~20)。 输出描述: 针对每行输入,输出用“*”组成的箭形。 输入: 2 输出: * ** *** ** * 输入: 3 输出: * ** *** **** *** ** * 参考答案: #include int main() { int n = 0; int i = 0,j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } for (j = 0; j for (j = 0; j printf("*"); } printf("\n"); } } return 0; }

当然常规做法并不一定是最简单的方法,当图案分成的最小单元很多的时候,套模板就显得很臃肿,这时候就要找规律,如下面三题所示。

反斜线形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的反斜线形图案。

输入描述: 多组输入,一个整数(2~20),表示输出的行数,也表示组成反斜线的“*”的数量。 输出描述: 针对每行输入,输出用“*”组成的反斜线。 输入: 4 输出: *... .*.. ..*. ...* 输入: 5 输出: *.... .*... ..*.. ...*. ....* 参考答案: //方法1:套模板 #include int main() { int n = 0; int i = 0,j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } printf("*"); for (j = 0; j int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i if (i == j) printf("*"); else printf(" "); } printf("\n"); } } return 0; } 正斜线形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的正斜线形图案。

输入描述: 多组输入,一个整数(2~20),表示输出的行数,也表示组成正斜线的“*”的数量。 输出描述: 针对每行输入,输出用“*”组成的正斜线。 输入: 4 输出: ...* ..*. .*.. *... 输入: 5 输出: ....* ...*. ..*.. .*... *.... 参考答案: //方法1:套模板 #include int main() { int n = 0; int i = 0,j = 0; while (~scanf("%d", &n)) { for (i = 0; i printf(" "); } printf("*"); for (j = 0; j int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i 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 int main() { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { //奇数 if (n % 2 != 0) { for (i = 0; i printf(" "); } printf("*"); for (j = 0; j printf(" "); } printf("*"); for (j = 0; j //左下,其实就是右上,复制粘贴下就ok for (j = 0; j printf(" "); } //右下,其实就是左上,复制粘贴下就ok for (j = 0; j printf(" "); } printf("\n"); } } //偶数 if(n%2==0) { for (i = 0; i printf(" "); } printf("*"); for (j = 0; j printf(" "); } printf("*"); for (j = 0; j //左下,其实就是右上,复制粘贴下就ok for (j = 0; j printf(" "); } //右下,其实就是左上,复制粘贴下就ok for (j = 0; j printf(" "); } printf("\n"); } } } return 0; } //方法2:找规律 #include int main() { int n = 0; int i = 0; int j = 0; while (scanf("%d", &n) != EOF) { for (i = 0; i if (i == j) printf("*"); else if (i + j == n - 1) printf("*"); else printf(" "); } printf("\n"); } } return 0; } 模版方法的局限性:

做到后面两题的时候我发现,图案很难分割成有规律的三角形图案,所以我发现此模版的适用范围只能是由连续的“三角形"排列或者可以分割成连续的“三角形”的图案的题目,其他的还是得找规律。

“空心”正方形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。

输入描述: 多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“*”的数量。 输出描述: 针对每行输入,输出用“*”组成的“空心”正方形,每个“*”后面有一个空格。 输入: 4 输出: * * * * * * * * * * * * 输入: 5 输出: * * * * * * * * * * * * * * * * 参考答案: #include int main() { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 0; i 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 int main() { int n = 0; int i = 0, j = 0; while (~scanf("%d", &n)) { for (i = 1; i if ((i == j) || (j == 1) || (i == n)) { printf("* "); } else { printf(" "); } } printf("\n"); } } return 0; }

虽然这种方法不适用于所有的此类打印图案的题目,但是做完这些题我也收获了好多东西,希望接下来的我依然能坚持学习编程,坚持写博客。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3