前言:
在往期文章中(有趣的图案代码-CSDN博客),我们掌握了金字塔以及他的衍生图案菱形,今天我们来认识一下其他的有趣图案!
如果有其他图案以及方法,可以在评论区谈谈你的看法!
1.空心正方形:
可以发现,这个图案与前面的金字塔换汤不换药,只是在原代码的基础上更改了打印效果。
#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;
}
2.X形图案:
法一:
对称轴打印!是一个较快的方法,通过观察发现,i=j以及i+j=n-1的位置刚好形成一个x形,且是一个矩形的对称轴。
#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)//左边对称轴打印图案
printf("*");
else if (i + j == n - 1)//因为行和列是从0开始的,右边对称轴
printf("*");
else
printf(" ");//其余位置空格
}
printf("\n");
}
}
return 0;
}
法二:
这是小编刚遇到这题的思路,比较繁琐,但是套用了金字塔的基本思路,麻烦就是需要判断输入的行数是奇数还是偶数,分两种情况打印,因为奇数型最中间一行只有一个“*”。
思路:偶数型上方打印一个空心空底倒金字塔,下方打印一个行数一样正金字塔。奇数型下方正金字塔要比上方少一行。
int main() {
int a;
int i, j;
scanf("%d", &a);
if (a % 2 == 0)//偶数型
{
for (i = a / 2; i >= 1; i--)//偶数型上下行数一样
{
for (j = 1; j <= a / 2 - i; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * i; j++)
{
if (j == 1 || j == 2 * i)
{
printf("*");
}
else
printf(" ");
}
printf("\n");
}
for (i = 1; i <= a / 2; i++)//下方
{
for (j = 1; j <= a / 2 - i; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * i; j++)
{
if (j == 1 || j == 2 * i)
{
printf("*");
}
else
printf(" ");
}
printf("\n");
}
}
else if (a % 2 == 1)//奇数型
{
for (i = a / 2 + 1; i >= 1; i--)//奇数型上方比下方多一层
{
for (j = 1; j <= a / 2 - i + 1; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * i - 1; j++)
{
if (j == 1 || j == 2 * i - 1)
{
printf("*");
}
else
printf(" ");
}
printf("\n");
}
for (i = 1; i <= a / 2; i++)//下方
{
for (j = 1; j <= a / 2 - i; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * i + 1; j++)//所以点数要多一位
{
if (j == 1 || j == 2 * i + 1)
{
printf("*");
}
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
3.如下图案:
许多小伙伴在看到这种题时可能会有点慌张,但是别忘了我们上期以及掌握了菱形,只需要改变一下打印的效果!
思路:打印到中间时,我们要逆序输出了,所以我们先循环打印到中间位置,再逆序输出。
int main()
{
int i, j;
char c;
int n;
scanf("%d", &n);
for (i = 1; i <= n; i++)//上半
{
for (j = 1; j <= n - i; j++)
printf(" ");
c = 'A';
for (j = 1; j <= i; j++)
printf("%c", c++);//先打印再自增
c = c - 2;//循环完重新定义c,因为c结束循环时自增了,所以要减2
for (j = 1; j < i; j++)
printf("%c", c--);//先打印再自减
printf("\n");
}
for (i = n - 1; i >= 1; i--) //下半同理
{
for (j = 1; j <= n - i; j++)
printf(" ");
c = 'A';
for (j = 1; j <= i; j++)
printf("%c", c++);
c = c - 2;
for (j = 1; j < i; j++)
printf("%c", c--);
printf("\n");
}
return 0;
}
还有一些衍生的图案如下:
1.
#include <stdio.h>
int main()
{
int i, j;
char c;
int n ;
scanf("%d", &n);
// 打印上半部分,包括中间的最长行
for (i = 1; i <= n; i++) {
// 打印前导空格
for (j = i; j < n; j++) {
printf(" ");
}
// 打印字母
for (j = 1; j <= 2 * i - 1; j++) {
printf("%c", 'A' + i - 1);
}
printf("\n");
}
// 打印下半部分
for (i = n - 1; i >= 1; i--) {
// 打印前导空格
for (j = n - i; j > 0; j--) {
printf(" ");
}
// 打印字母
for (j = 1; j <= 2 * i - 1; j++) {
printf("%c", 'A' + i - 1);
}
printf("\n");
}
return 0;
}
2. 1
#include <stdio.h>
int main() {
int i, j;
char c;
int n ;
scanf("%d",&n);
// 打印上半部分,包括中间的最长行
for (i = 1; i <= n; i++) {
// 打印前导空格
for (j = i; j < n; j++) {
printf(" ");
}
// 打印星号和空格
for (j = 1; j <= 2 * i - 1; j++) {
if (j == 1 || j == 2 * i - 1)
printf("%c", 'A' + i - 1);
else
printf(" ");
}
printf("\n");
}
// 打印下半部分
for (i = n - 1; i >= 1; i--) {
// 打印前导空格
for (j = n - i; j > 0; j--) {
printf(" ");
}
// 打印星号和空格
for (j = 1; j <= 2 * i - 1; j++) {
if (j == 1 || j == 2 * i - 1)
printf("%c", 'A' + i - 1);
else
printf(" ");
}
printf("\n");
}
return 0;
}
2.2
#include<stdio.h>
int main()
{
int n;
char a;
scanf("%c %d",&a,&n);
for(int i=0;i<=n/2;i++)
{
for(int j=0;j<n/2-i;j++)
printf(" ");
for(int k=0;k<2*i+1;k++)
{
if(k==0 || k==2*i)
printf("%c",a);
else
printf(" ");
}
printf("\n");
a++;
}
a--;
for(int m=0;m<n/2;m++)
{
a--;
for(int o=0;o<m+1;o++)
printf(" ");
for(int p=0;p<n-2*m-2;p++)
{
if(p==0 || p==n-2*m-2-1)
printf("%c",a);
else
printf(" ");
}
printf("\n");
}
return 0;
}
3.
#include <stdio.h>
int main() {
int i, j;
char c;
int n ;
scanf("%d",&n);
// 打印上半部分(包括中间的最长行)
for (i = 1; i <= n; i++) {
for (j = 1; j <= n - i; j++) {
printf(" "); // 打印空格
}
c = 'A'; // 每行的起始字符都是 'A'
for (j = 1; j <= 2 * i - 1; j++) {
printf("%c", c++);
}
printf("\n");
}
// 打印下半部分
for (i = n - 1; i >= 1; i--) {
for (j = n - i; j >= 1; j--) {
printf(" "); // 打印空格
}
c = 'A'; // 每行的起始字符都是 'A'
for (j = 1; j <= 2 * i - 1; j++) {
printf("%c", c++);
}
printf("\n");
}
return 0;
}
4.还有一些图案如打印两圈菱形,打印外圈和最内圈,打印隔圈菱形等,留给大家思考(´▽`)ノ♪
4.空心数字金字塔:
这题与上期的空心金字塔可以说是增加了数字而已,对大家来说应该是手拿把恰!
#include <stdio.h>
void hollowPyramid(int n)
{
if (n >= 1 && n <= 9)
{
for (int i = 1; i <= n; i++)
{
if (i < n)
{
for (int q = n - 1; q > i - 1; q--)
{
printf(" ");
}
if (i > 1)
printf("%d", i);
for (int x = 1; x <= 2 * i - 3; x++)
{
printf(" ");
}
printf("%d", i);
}
else
{
for (int j = 1; j <= 2 * n - 1; j++) {
printf("%d", n);
}
}
printf("\n");
}
}
}
int main()
{
int n;
scanf("%d", &n);
hollowPyramid(n);
return 0;
}
小结:由于时间关系,本次总结较为仓促,如果有解释不当或错误的地方希望谅解,同时可以在评论区指出!感谢观看,可以给小编点一个免费的关注吗?(´▽`)ノ♪