前言
想着在大一的时候学长教我绘制了一个简易的圣诞树,但是好像对其印象一直是模糊的,这次尝试着自己独立完成。系统:win11,软件:Dev-C++。
基础知识
首先需要大家用循环尝试着打印下面几个图形。
相信大家都能够完成,这里就只进行一下简单的说明。
打印一个5*5的矩形直接就用一个二层循环就解决了,输出五行,每行打印五个字符,当然字符的打印用putchar和printf都可以,想用哪个用哪个。
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=0;j<5;j++){putchar('*');}printf("\n");}return 0;
}
这个就是调整他的边界值,既然是打印出三角形,他内层的循环就不能设置为固定的值了,假设他的初值和判断条件都是固定的值,那么他每次打印的结果就会是一样的,所以我们可以修改他的初始条件或者判断条件来实现三角形的打印。
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=0;j<=i;j++){putchar('*');}printf("\n");}return 0;
}
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=5;j>i;j--){putchar('*');}printf("\n");}return 0;
}
这个就是在前面的基础上增加了空格的输出,可以看到空出来的形状就是由空格构成的三角形,然后把三角形再打印一遍即可。
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=0;j<=i;j++){putchar(' ');}for(int j=5;j>i;j--){putchar('*');}printf("\n"); }return 0;
}
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=5;j>i;j--){putchar(' ');}for(int j=0;j<=i;j++){putchar('*');}printf("\n"); }return 0;
}
这个的话就是在前面的基础上进行变形,空格一行的变化是1,星号一行的变化是2。
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=5;j>i;j--){putchar(' ');}for(int j=0;j<=2*i;j++){putchar('*');}printf("\n"); }return 0;
}
#include<stdio.h>int main(){for(int i=0;i<5;i++){for(int j=0;j<i;j++){putchar(' ');}for(int j=2*4;j>=i*2;j--){putchar('*');}printf("\n"); }return 0;
}
这个就是结合前面的输出三角形正着打印一遍之后倒着打印一遍。
#include<stdio.h>int main(){for(int i=0;i<6;i++){for(int j=5;j>i;j--){putchar(' ');}for(int j=0;j<=2*i;j++){putchar('*');}printf("\n"); }for(int i=0;i<5;i++){for(int j=0;j<=i;j++){putchar(' ');}for(int j=2*4;j>=i*2;j--){putchar('*');}printf("\n"); }return 0;
}
圣诞树
打印圣诞树
熟练掌握打印三角形之后就可以进行下一步了,本篇需要打印的圣诞树不是很炫酷的那种,就是由字符构成的,对其拆分可以变成两个三角形加上一个矩形。
好吧,确实有点丑,但是不影响,自己写的就是最好看的,大家可以自己调节三角形的高矮胖瘦,到这里其实就已经差不多了,但是还没完,目前就是在最左边打印的,我们接下来要把他移动到中间去,其实就是增加空格的输出。
#include<stdio.h>int main(){for(int i=0;i<6;i++){for(int j=5*2;j>i*2;j--){putchar(' ');}for(int j=0;j<=4*i;j++){putchar('*');}printf("\n"); }for(int i=0;i<6;i++){for(int j=5*2;j>i*2;j--){putchar(' ');}for(int j=0;j<=4*i;j++){putchar('*');}printf("\n"); }for(int i=0;i<6;i++){for(int j=0;j<9;j++){putchar(' ');}for(int j=0;j<3;j++){putchar('*');}printf("\n"); }return 0;
}
你当然可以修改输出空格的循环,但是那样需要考验你小许的逻辑能力,最简单的方法就是直接输出一个由空格构成的矩形即可,写好之后移动也方便,只需要复制粘贴到下面的几个循环中即可了。
#include<stdio.h>int main(){for(int i=0;i<6;i++){for(int j=0;j<40;j++){putchar(' ');}for(int j=5*2;j>i*2;j--){putchar(' ');}for(int j=0;j<=4*i;j++){putchar('*');}printf("\n"); }for(int i=0;i<6;i++){for(int j=0;j<40;j++){putchar(' ');}for(int j=5*2;j>i*2;j--){putchar(' ');}for(int j=0;j<=4*i;j++){putchar('*');}printf("\n"); }for(int i=0;i<6;i++){for(int j=0;j<40;j++){putchar(' ');}for(int j=0;j<9;j++){putchar(' ');}for(int j=0;j<3;j++){putchar('*');}printf("\n"); }return 0;
}
函数封装
接下来就思考如何去完善他了,这里就想到打印三角形打印了两次为什么不封装成函数呢,想到了就去动手,一个是可以写成无参的函数,但是他是固定的不是很灵活,于是就还是觉得设置成有参函数会更好一点。
可能这个参数就需要自己去调,当然也可以计算,由于我数学不是很好,所以我是调整至大概的位置就行了。
#include<stdio.h>//打印三角形(距离左边的距离,空格宽倍数,星号宽倍数,高)
void triangle(int juli,int kong,int xing,int gao);
//打印矩形(距离左边的距离,宽,高)
void rectangle(int juli,int kuan,int gao);int main(){triangle(26,2,4,6);triangle(20,3,6,6);rectangle(37,3,7);return 0;
}//打印三角形
void triangle(int juli,int kong,int xing,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){putchar(' ');}for(int j=gao*kong;j>i*kong;j--){putchar(' ');}for(int j=0;j<=xing*i;j++){putchar('*');}printf("\n");}
}//打印矩形
void rectangle(int juli,int kuan,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){putchar(' ');}for(int j=0;j<kuan;j++){putchar('*');}printf("\n"); }
}
铺“幕布”
之后又想能不能让他动起来,再加上雪会不会更好看,于是就又进行了修改,要让他动起来的话思路就是清屏之后重新输出一遍即可了,雪花肯定是随机生成的,要随机的话就需要用到随机数的函数,那怎么输出雪呢,其实可以铺一层“幕布”,“幕布”就是空格,所以我们要实现的任务就是随机把要输出空格的部分替换成雪花,然后不断“刷新”他即可了。
“幕布”铺满的结果应该是这个样子的。
#include<stdio.h>//打印三角形(距离左边的距离,空格宽倍数,星号宽倍数,高)
void triangle(int juli,int kong,int xing,int gao);
//打印矩形(距离左边的距离,宽,高)
void rectangle(int juli,int kuan,int gao);
void shengdanshu();//打印圣诞树
int main(){shengdanshu(); return 0;
}
//打印圣诞树
void shengdanshu(){triangle(26,2,4,6);triangle(20,3,6,6);rectangle(37,3,7);
}
//打印三角形
void triangle(int juli,int kong,int xing,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){putchar('*');}for(int j=gao*kong;j>i*kong;j--){putchar('*');}for(int j=0;j<=xing*i;j++){putchar(' ');}for(int j=0;j<juli;j++){putchar('*');}for(int j=gao*kong;j>i*kong;j--){putchar('*');}printf("\n");}
}//打印矩形
void rectangle(int juli,int kuan,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){putchar('*');}for(int j=0;j<kuan;j++){putchar(' ');}for(int j=0;j<juli;j++){putchar('*');}printf("\n"); }
}
雪花
雪花的字符可以根据自己设计的来添加,为了方便设置雪下的密度,这里采用了宏定义的形式来方便用户自己设置。
srand_百度百科 (baidu.com)https://baike.baidu.com/item/srand/796881?fr=ge_ala
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//雪花的密度
#define XUE_HUA 27//打印三角形(距离左边的距离,空格宽倍数,星号宽倍数,高)
void triangle(int juli,int kong,int xing,int gao);
//打印矩形(距离左边的距离,宽,高)
void rectangle(int juli,int kuan,int gao);
void shengdanshu();//打印圣诞树 int main(){srand((unsigned)time(NULL));//选取种子文件 shengdanshu(); return 0;
}
//打印圣诞树
void shengdanshu(){triangle(26,2,4,6);triangle(20,3,6,6);rectangle(37,3,7);
}
//打印三角形
void triangle(int juli,int kong,int xing,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}for(int j=gao*kong;j>i*kong;j--){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}//打印树的枝叶 for(int j=0;j<=xing*i;j++){putchar('*');}for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}for(int j=gao*kong;j>i*kong;j--){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}printf("\n");}
}//打印矩形
void rectangle(int juli,int kuan,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}//打印树干 for(int j=0;j<kuan;j++){putchar('*');}for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}printf("\n"); }
}
“下雪”
“cls”在命令行下的清屏,所以需要用到windows.h我头文件,为了让他浪漫一点不能直接清屏输出清屏输出这样,要有间隔,所以这里用到了Sleep让他休眠,速度可以自己控制,记得清屏之后还需要输出。
圣诞树
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>//雪花的密度
#define XUE_HUA 27//打印三角形(距离左边的距离,空格宽倍数,星号宽倍数,高)
void triangle(int juli,int kong,int xing,int gao);
//打印矩形(距离左边的距离,宽,高)
void rectangle(int juli,int kuan,int gao);
void shengdanshu();//打印圣诞树 int main(){srand((unsigned)time(NULL));//选取种子文件 while(true){shengdanshu(); Sleep(800);system("cls");}return 0;
}
//打印圣诞树
void shengdanshu(){triangle(26,2,4,6);triangle(20,3,6,6);rectangle(37,3,7);
}
//打印三角形
void triangle(int juli,int kong,int xing,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}for(int j=gao*kong;j>i*kong;j--){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}//打印树的枝叶 for(int j=0;j<=xing*i;j++){putchar('*');}for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}for(int j=gao*kong;j>i*kong;j--){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}printf("\n");}
}//打印矩形
void rectangle(int juli,int kuan,int gao){for(int i=0;i<gao;i++){for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}//打印树干 for(int j=0;j<kuan;j++){putchar('*');}for(int j=0;j<juli;j++){int a=rand()%XUE_HUA;//[0,XUE_HUA)if(a==0){putchar('+');}else{putchar(' ');}}printf("\n"); }
}
总结
整体下来对于新手还是算是友好的,没有涉及到很复杂的东西,但是在刚学C语言的时候还是很不理解的,我这里对整个思路进行了梳理,不仅仅是提供代码,更重要的是思路,相信大家能够自己绘制出来,除了圣诞树这里还有绘制爱心的,这两个是我大一比较想完成的,当时真的是到处找代码,这里都进行了总结,下雪咯下雪咯,天气这么冷也没看见雪,只能写代码下了,圣诞节提前一周发出来了,喜欢的小伙伴可以多多支持一下。
爱心方程(专属理科生的浪漫?!)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/131351893?spm=1001.2014.3001.5501