1、打印菱形图案
*
* *
* * *
* *
*
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (scanf("%d",&n)!=EOF)
{
//打印上半部分
//控制行数
for (int i = 0; i < n; i++)
{
//打印一行
//打印空格
for (int j = 0; j < n - i; j++)
{
printf(" ");
}
//打印*空格
for (int k = 0; k <= i; k++)
{
printf("* ");
}
printf("\n");
}
//打印下半部分
//控制行数
for (int i = 0; i < n + 1; i++)
{
//打印一行
//打印空格
for (int j = 0; j < i; j++)
{
printf(" ");
}
//打印*空格
for (int k = 0; k < n + 1 - i; k++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
先将整个菱形图案分成上下两个部分,上半部分n行,下半部分n+1行。
这题的关键点在是先有空格再有的*,可以知道,输入的数字就是第一行的空格数,空格数程递减趋势,*呈递增趋势。然后因为空格和*不是交叉输出的,所以先遍历空格,再遍历*号,分开考虑。上半部分控制空格打印递减是用 n - i ,减小每次遍历的次数。
2、带空格的直角三角形图案
*
* *
* * *
* * * *
* * * * *
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//控制行数
for (int i = 0; i < n; i++)
{
//打印一行
for (int j = 0; j < n; j++)
{
if (i + j < n - 1)
{
printf(" ");
}
else
{
printf("* ");
}
}
printf("\n");
}
}
return 0;
}
每一次打印两个空格,i+j 的作用是用来控制当前打印的空格数。因为j是控制内层循环,所以当i逐渐变大时,(i + j < n - 1)其中的j逐渐变小,空格打印的次数也变少。
3、金字塔图案
*
* *
* * *
* * * *
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//控制行数
for (int i = 0; i < n; i++)
{
//打印一行
//打印空格
for (int j = 0; j < n - 1 - i; j++)
{
printf(" ");
}
//打印*空格
for (int k = 0; k <= i; k++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
这题相当于是一半的菱形图案,先打印空格,再打印*, (int j = 0; j < n - 1 - i; j++) ,其中n-1的原因是最多只有n-1个空格,-i是为了让j在行数变大的时候打印空格的次数变少。*号最大的次数与输入的数n相等,所以<=n就行了。
4、翻转金字塔图案
* * * * *
* * * *
* * *
* *
*
# include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//控制行数
for (int i = 0; i < n; i++)
{
//打印一行
//打印空格
for (int j = 0; j < i; j++)
{
printf(" ");
}
//打印*空格
for (int k = 0; k < n - i; k++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
倒过来的思路就相反,空格是递增的,思路仍然是i控制行数,然后先遍历空格再遍历*,刚开始因为j与i都是0所以第一行不会输出空格。
5、K型图案
* * *
* *
*
* *
* * *
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//打印上半部分
//控制行数
for (int i = 0; i < n; i++)
{
//打印一行
//打印*空格
for (int j = 0; j < n + 1 - i; j++)
{
printf("* ");
}
printf("\n");
}
//打印下半部分
//控制行数
for (int i = 0; i < n + 1; i++)
{
//打印一行
//打印*空格
for (int j = 0; j <= i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
同菱形一样分为上下两个部分,因为都是从*开始,所以不用考虑空格,只用分开考虑递减和递增。假设输入的数字为2,那么第一行n+1-i就是3,打印三个*。
6、箭型图案
*
**
***
**
*
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (scanf("%d",&n)!=EOF)
{
//打印上半部分
//控制行数
for (int i = 0; i < n; i++)
{
//打印一行
//打印空格
for (int j = 0; j < n - i; j++)
{
printf(" ");
}
//打印*空格
for (int k = 0; k <= i; k++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
//控制行数
for (int i = 0; i < n + 1; i++)
{
//打印一行
//打印空格
for (int j = 0; j < i; j++)
{
printf(" ");
}
//打印*空格
for (int k = 0; k < n + 1 - i; k++)
{
printf("*");
}
printf("\n");
}
}
return 0;
}
跟菱形的代码一样,只不过输出两个空格,*后面没有空格。
7、反斜线图案
*
*
*
*
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string>//string头文件
#include <bits/stdc++.h>
#include <algorithm>//算法头文件,sort包含在内
int main()
{
int n = 0;
//多组输入
while (scanf("%d",&n)!=EOF)
{
//控制行数
for (int i = 0; i < n; i++)
{
//控制列
for (int j = 0; j < n; j++)
{
//控制打印
if (i == j)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
因为图案列数是递增的所以让j<n,这里的思路跟打印矩阵对角线一个思路,让i与j相等的位置打印*,其余位置用空格填补。
8、正斜线图案
*
*
*
*
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//控制行数
for (int i = 0; i < n; i++)
{
//控制列数
for (int j = 0; j < n; j++)
{
//判断打印
if (i + j == n - 1)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
因为最后要打印的是*号,所以在控制位置的时候是n-1,随着i的增大,j也变小,*号位置也越近。
9、X型图案
* *
* *
*
* *
* *
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//控制行数
for (int i = 0; i < n; i++)
{
//控制列
for (int j = 0; j < n; j++)
{
if (i == j || i + j == n - 1)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
这个图案相当于正反斜线加在一起了,所以判断的条件也是相当于加起来。
10、空心正方形图案
* * * *
* *
* *
* * * *
#include <stdio.h>
int main()
{
int n = 0;
while ((scanf("%d", &n)) != EOF)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (0 == i || n - 1 == i || 0 == j || n - 1 == j)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
输出0行和0列,最后一行和最后一列。
11、空心三角形图案
*
* *
* *
* * * *
#include <stdio.h>
int main()
{
int n = 0;
//多组输入
while (~scanf(" %d", &n))
{
//控制行
for (int i = 0; i < n; i++)
{
//控制列
for (int j = 0; j < n; j++)
{
//控制打印
if (i == n - 1 || j == 0 || i == j)
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
输出第一列和最后一行,以及i与j相等的那一条斜线
总结
对于打印图案,如果是对称的,将其分成上下两层分别单独考虑,根据递增和递减情况约束控制打印层数的条件,一般i控制行数,j控制列数,如果是先遍历空格再遍历*的就是两个同一级的for循环,单独思考寻找规律