1.第一题(边框菱形的打印)
原来只要你懂了,就会觉得是如此的简单:(昨天那个拉拉算法,今天这个更加简单易懂)
代码如下:注释看一下就知道这步的意思(但是一定要自己在纸上画一个图,这样便与我们更好的理解什么是这个图形的规律了)(有了规律,你就可以很好的利用这个规律,把你的想法实现了)
#include<stdio.h> int main() { int i, j ,n; scanf("%d",&n); for (i = 0; i < n; i++) { printf("*"); } printf("\n"); for (i = 1; i <= (n-1)/2; i++)//这个是为了控制行数而已(假如以9为例:所以此时就是除掉首行这里就只要打印4行) { for (j = 1; j <= (n + 1) / 2 - i; j++)//此时是先打印*号,后打印空格,然后再*号 { printf("*");//先*号 } for (j = 1; j <= 2 * i-1; j++) { printf(" ");//后空格 } for (j = 1; j <= (n + 1) / 2 - i; j++) { printf("*");//再*号 } printf("\n"); } //上半部分好了,现在就轮到下半部分了 for (i = 1; i < (n - 1) / 2; i++)//少一行的意思就是了(控制行数)1到3(3行) { for (j = 1; j <= i+1 ; j++) { printf("*"); } for (j = 1; j <= (n - (2 * i + 2)); j++) { printf(" "); } for (j = 1; j <= i + 1; j++)//这个就是相当于(打印空心菱形的时候的那步打印一个单独的*号的那步)这下就只是多打几个*号的意思而已 { printf("*"); } printf("\n"); } for (i = 0; i < n; i++) { printf("*"); } return 0; }
2.第二题边框 菱形的进阶
(这个就是一步一步来,但是如果你们很好的使用循环和理解这个图形的规律,你的代码中的算法可以变的更加的简单和高级,这个就是高级算法了,只是我还不会)
#include<stdio.h> int main() { int i, j, n; scanf("%d", &n); for (i = 0; i < n; i++) { printf("*"); } printf("\n"); for (i = 1; i < (n - 1) / 2; i++)//还是一个道理行数,但是因为第一行没有规律,所以此时的这个位置,是从第二行开始的(所以整体要少一行) { printf("*");//头上位置的那个*号,单独打印就行 for (j = 0; j < (n - 2 * i - 1) / 2 - 1; j++)//并且*号完,就轮到空格了(空格规律一个一个的减(奇数减)) { printf(" "); } printf("*"); for (j = 0; j <2*i-1 ; j++) { printf(" "); } printf("*"); for (j = 0; j < (n - 2 * i - 1) / 2 - 1; j++)//这边的这个和上面的那个为什么一定都要写n-2*i呢,原因就是只有i*2这样才可以保证这个值每一次都是偶数,也就是我要的数,可以很好的防止奇数的出现,所以i一定要乘2 { printf(" "); } printf("*"); printf("\n"); } //上半部分搞定(这下就轮到下半部分了)(但是要注意的是,刚刚上面没有解决的那个为题)(就是最中间哪行此时还没有打印) for (i = 0; i < (n + 1) / 2 - 1; i++)//这下这个就是表示5行了(上面那个是4行,所以这边要有5行) { if (i < 2) { for (j = 0; j <= i; j++) { printf("*");//这个就是最终间哪行的最左边的那个*号的意思 } for (j = 0; j < n - 2 * i - 2; j++) { printf(" ");//最终间哪行的空格开始(如果n=11,此时空格数就是9个) } for (j = 0; j <= i; j++) { printf("*");//这个就是最终间哪行的最右边的那个*号的意思 } printf("\n"); } if (i >= 2) { printf("*"); for (j = 0; j < i - 1; j++) { printf(" "); } printf("*"); for (j = 0; j < (n - 2 * i)-2; j++) { printf(" "); } printf("*"); for (j = 0; j < i - 1; j++) { printf(" "); } printf("*"); printf("\n"); } } for (i = 0; i < n; i++) { printf("*"); } printf("\n"); return 0; }
说实话我自己都嫌弃这个代码太长(虽然让我自己改进一下能变短一写,但是整体的算法肯定也是不会有太大的升级),所以我相信看到这个博客的人有高级算法把这个图形打印出来
3.第三题(数字菱形的打印)
#include<stdio.h> int main() { int i, j, m, n, k; scanf("%d",&n); for (i = 1; i <= n; i++)//n行的意思 { for (j = 0; j <n-i ; j++) { printf(" "); } for (m = 1; m <= i; m++) { printf("%d",m); } //这边假设一下可不可以用m(不行我们就用另一个变量(关键就是在于第一行打印还是不打印的那个条件怎么判断好一点)) for (k = m - 2; k > 0; k--)//注意因为上面条件已经早都不满足for循环了,所以最后一步的m++最后在for循环停止之后还是会加到m中去,所以此时的m多增加了1,所以要减2,减1已经不行了(多了一步m++)(先使用后加加) { printf("%d", k); } printf("\n"); } //这个就是数字菱形的上半部分,现在轮到下半部分了 for (i = 1; i < n; i++) { for (j = 0; j <i ; j++) { printf(" "); } //此时要注意我的i是从1开始的了,不再是从0开始的 for (m = 1; m <=n-i; m++) { printf("%d",m); } for (k = m-2; k >0 ; k--) { printf("%d",k); } //对比自己的算法和别人的算法(好像我的算法更牛逼) // for (k = 1; k <= n - i; k++) // // printf("%d",k); // // for (m = n - i - 1; m >= 1; m--) // // printf("%d",m); printf("\n"); } return 0; }
4.第四题:(空心菱形)
#include<stdio.h> int main() { int i, j, n; scanf("%d",&n); for (i = 0; i < n; i++) { for (j = 1; j <= n - i - 1; j++) { printf(" "); } printf("*"); if (i != 0) { for (j = 0; j < 2 * i - 1; j++) { printf(" "); } printf("*"); } printf("\n"); } //并且假如此时我的n是4,此时我下面就只要打印3行就够了,因为上面已经打印了4行,for (i =n-1 ; i >0; i++)所以此时我这样写的目的就是为了(得到1到n-1的数)且如果n是4,此时就刚好是得到3个数,也就是刚好循环3次,刚好就是打印3行 for (i =n-1 ; i >0; i--)//这步就是我整个算法中最关键的一步(注意点就是我此时只是要求行数是困定的,别的都是不做要求的,所以此时只要我的行数是对的,i的值都是无所谓的) { for (j = 0; j <n-i ; j++) { printf(" "); } printf("*"); if (i != 1) { for (j = 0; j < 2 * (i - 1) - 1; j++) { printf(" "); } printf("*"); } printf("\n"); } return 0; }
5.第五题(实心菱形):
#include<stdio.h> int main() { int i, j, n; scanf("%d",&n); for (i = 0; i < n; i++) { for (j = 0; j <n-1-i ; j++) { printf(" "); } for (j = 0; j <2*i+1 ; j++) { printf("*"); } printf("\n"); } for (i = 1; i < n; i++)//如果这边你刚刚为了可以直接简单的写成和上面一样也是n,那你的i此时就要从1开始,这样如果你的i从1开始那么你在下面打印的时候就要提别的小心加注意了 { for (j = 0; j <i ; j++) { printf(" "); } for (j = 0; j < 2 * (n - i) - 1; j++) { printf("*"); } printf("\n"); } return 0; }
6.第六题:(外带一个杨氏三角的再一次打印)
上次那个有一点的问题(所以这边重新来一遍,并且刚好我再巩固一下)
#include<stdio.h> int main() { int i, j, n; int arr[30][30] = { 0 }; scanf("%d",&n); for (i = 0; i < n; i++)//这个就是在控制行(n行) { //下面这个就是在控制列 //并且杨辉三角是有一个定理的,就是第几行这行就有几个元素(所以下面这个for循环就是这样写就是很有道理的) for (j = 0; j < i; j++)//这个就是在控制每一行中每一个列的坐标而已(例:0,1 0,2 0,3 0,4 0,5 0,6)这个就是第一行的每一个列 { if (j == 0 || j == i) { arr[i][j] = 1; } else { arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; } } //printf("\n");//打印完一行切记不敢不会换行哦 } //搞定完这么多花里胡哨的东西,现在就可以把我的杨辉三角打印出来看一下了(并且不敢不会打印,打印不就还是循环吗) for (i = 0; i < n; i++) { for (j = n; j > i+1; j--)//这步就是看在n=i+1这个条件成立的时候恰恰是我最后一行打印完的时候(所以只要控制有这么多行就行,别的打印几次并不重要) { printf(" ");//这个空格的数量就是通过这个i+1在控制 } for (j = 0; j < i; j++) { printf("%-6d",arr[i][j]); } printf("\n"); } return 0; }
这个就好看多了,啊哈哈哈
7.总结:
有的博主会把这些的打印分一个难易程度,而我觉得,只要你懂得了原理,其实无论打印什么图形都是一样的(主要就是图形规律和图形特点),其实这些都不难(只要你肯花时间,当你打印出来这些图形的那一刻,你会觉得“就这”),加油代码人!