c语言中一些图案打印题的小总结
-
打印直角三角形
输入描述:
多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。
示例:
输入 : 4
输出:
*
* *
* * *
* * * *
#include <stdio.h> int main() { int n = 0; while(~scanf("%d",&n))// //这种写法是因为scanf读取失败返回EOF,EOF是-1,所以按位取反后的结果是0,0为假,可以让循环停止。 { int i =0 ;//行数 for(i=1;i<=n;i++) { int j =0 ; for(j=1;j<=i;j++) { printf("* "); } printf("\n"); } } return 0; }
-
翻转直角三角形
输入描述:
多组输入,一个整数(2~20),表示翻转直角三角形直角边的长度,即“*”的数量,也表示输出行数
示例:
输入:5
输出:
* * * * *
* * * *
* * *
* *
*
#include <stdio.h> int main() { int n =0; while(scanf("%d",&n)!=EOF) { int i = 0; for(i=n;i>=1;i--) { int j = 0; for(j=i;j>=1;j--) { //注意空格 printf("* "); } printf("\n"); } } return 0; }
-
带空格的直角三角形
输入描述:
多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。
示例:
输入:5
输出:
*
* *
* * *
* * * *
* * * * *
//常规解法 #include <stdio.h> int main() { int n =0; while(scanf("%d",&n)!=EOF) { int i = 0; for(i=0;i<n;i++) { //先打印空格 int j =0; for(j=0;j<n-i-1;j++) { printf(" "); } //打印 * for(j=0;j<=i;j++) { printf("* "); } printf("\n"); } } return 0; } //解法2(根据行列关系来找关系) #include <stdio.h> int main() { int n = 0; while(scanf("%d",&n)!=EOF) { int i = 0; int j = 0; //行数 for(i=0;i<n;i++) { //每一行 for(j=0;j<n;j++) { //行和列的和 if(i+j<n-1) { printf(" "); } else { printf("* "); } } printf("\n"); } } return 0; }
上图为方法2中i+j<n-1理解的配图
-
金字塔图案
输入描述:
多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。
示例:
输入:4
输出:
*
* *
* * *
* * * *
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
for(i=0; i<n; i++)
{
int j = 0;
//空格
for(j=0; j<n-1-i; j++)
{
printf(" ");
}
//*
for(j=0; j<=i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
-
倒金字塔图案
输入描述:
多组输入,一个整数(2~20),表示翻转金字塔边的长度,即“*”的数量,也表示输出行数。
示例:
输入:5
输出:
* * * * *
* * * *
* * *
* *
*
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
for(i=0; i<n; i++)
{
//一行
int j = 0;
for(j=0; j<i; j++)
{
printf(" ");
}
for(j=0; j<n-i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
-
打印菱形
输入描述:
输入一个整数(2~20)。
示例:
输入:2
输出:
*
* *
* * *
* *
*
输入:4
输出:
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
#include <stdio.h> //打印一个菱形 int main() { int line = 0; scanf("%d", &line);//注释以line = 7为例 //上 int i = 0; for (i = 0; i < line; i++) { //打印空格 int j = 0; for (j = 0; j < line - i - 1; j++) //上半部分为7,下半部分为6,所以要减去1(7为数字举例),逐行递减,所以减去i { printf(" "); } //打印* for (j = 0; j < 2 * i + 1; j++)//1,3,5,7,9。。。。 { printf("*"); } printf("\n"); } //下 for (i = 0; i <= line - 1; i++)//上半部分为7,下半部分为6,所以要减去1 { int j = 0; //空格 for (j = 0; j <= i; j++)//在下半部分,空格数和行数一样 { printf(" "); } for (j = 0; j < 2 * (line - 1 - i) - 1; j++)//*为11,9,7,5,3,1。。。。 { printf("*"); } printf("\n"); } return 0; }
-
K形图案
输入描述:
多组输入,一个整数(2~20)
示例:
输入:3
输出:
* * * * *
* * * *
* * *
* *
*
* *
* * *
* * * *
* * * * *
注:做题的时候一定仔细看看给出的示例图有没有空格!!!
#include <stdio.h>
//这个题有坑
int main()
{
int n = 0;
//如果输入的是n,其实每行打印n+1组字符(*和空格)
while(scanf("%d", &n) != EOF)
{
int i = 0;
for(i=n; i>=0;i--)
{
int j = 0;
for(j=0; j<=i; j++)
{
printf("* ");
}
//*的后面还有空格-这个比较坑
for(j=i; j<n; j++)
{
printf(" ");
}
printf("\n");
}
for(i=1; i<=n; i++)
{
int j = 0;
for(j=0; j<=i; j++)
{
printf("* ");
}
//*的后边还有空格-这个比较坑
for(j=i; j<n; j++)
{
printf(" ");
}
printf("\n");
}
}
return 0;
}
-
空心正方形
输入描述: 多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“ * ”的数量。 示例:
输入:4
输出: * * * * * * * * * * * *
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
int j = 0;
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;
}
-
空心三角形图案
输入描述:
多组输入,一个整数(3~20),表示输出的行数,也表示组成三角形边的“*”的数量。
输入:4
输出: * * * * * * * * * * * *
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
for(i=1; i<=n; i++)
{
int j = 0;
for(j=1; j<=n; j++)
{
if((i == j) || (j==1) || (i==n))
{
printf("* ");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
-
打印平行四边形
输入描述:
输入一个整数(0<n<10)打印字符图形
示例:
输入:5
输出: ***** ***** ***** ***** *****
#include <stdio.h>
int main()
{
int i, j, z, n;
scanf("%d", &n);
for (i = n; i >= 1; i--)
{
for (j = 0; j < n - i; j++)
{
printf(" ");
}
for (z = 1; z <= n; z++)
{
printf("*");
}
printf("\n");
}
return 0;
}
-
打印星号梯形
输入描述:
输入一个整数(0<n<10)打印字符图形
示例:
输入:3
输出: *** ***** *******
#include <stdio.h>
int main()
{
int i, j, n, z;
scanf("%d", &n);
for (i = 1; i <= n ; i++)
{
for (j = 1; j <= n - i ; j++)
{
printf(" ");
}
for (z = 1; z <= 2 * i +1; z++)
{
printf("*");
}
printf("\n");
}
return 0;
}
-
打印空心六边形
该题题解转自 题解 - 【基础】空心六边形 - 西柚智测OJ
输入描述
只有一个正整数n(0 < n < 20),代表正六边形的边长。
示例:
输入:5
输出 ***** * * * * * * * * * * * * * * *****
直接硬写的话可能非常繁琐, 最好的方法是将代码的共性抽象出来作为函数.
如顶部和底部的代码是一样的, 可以单独作为一个top函数; 其余的每一行都可以抽象为两个参数 : 第一个星号左边有多少个空格、两个星号之间有多少个空格, 由此可以形成line函数
#include <stdio.h>
#include <math.h>
#include <string.h>
//打印num次ch字符
void prints(char ch, int num)
{
while(num --)
printf("%c", ch);
}
//打印顶部和底部
void top(int n)
{
prints(' ', n-1);
prints('*', n);
prints('\n', 1);
}
//打印每一行
void line(int left, int mid)
{
prints(' ', left);
prints('*', 1);
prints(' ', mid);
prints('*', 1);
prints('\n', 1);
}
int main()
{
int n; scanf("%d", &n);
top(n);
for(int i=2; i<=n; i++)
line(n-i, n + 2*(i-2));
for(int i=n-1; i>=2; i--)
line(n-i, n + 2*(i-2));
top(n);
return 0;
}
(很厉害的解法呢)
综上呢,其实这些都是找规律,运用循环来打印出符合要求的图案~