我用C语言打印了一个简单圣诞树

前言

想着在大一的时候学长教我绘制了一个简易的圣诞树,但是好像对其印象一直是模糊的,这次尝试着自己独立完成。系统: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)icon-default.png?t=N7T8https://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博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/131351893?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/weixin_64066303/article/details/135055507