我用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284397.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21.Servlet 技术

JavaWeb应用的概念 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义&#xff1a;“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。” Java Web应用中可以包含如下…

GSCoolink GSV2201E Type C/DP1.4转HDMI2.0

DisplayPort 1.4 to HDMI 2.0 Converter with Embedded MCU 功能特征 1、GSV2201E是一款高性能、低功耗、USB Type-C Alternate Mode DisplayPort 1.4 to HDMI 2.0转换器。 2、显示接口接收器支持32.4Gbps(HBR3&#xff0c;4-lane)。 3、HDMI发射器支持18Gbps(TMDS6G3Lane)…

「构」向云端 - 我与 2023 亚马逊云科技 re:Invent 大会

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 2023年亚马逊AWS re:Invent大会宣布一项Amazon Q的创新项目&#x…

磁盘阵列/视频监控系统EasyCVR新增邮件验证与定时更换登录密码功能

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

光伏收益计算工具:实现可持续能源投资的决策支持

随着全球能源结构的转型&#xff0c;光伏发电作为主要的可再生能源之一&#xff0c;其投资前景日益光明。然而&#xff0c;光伏发电项目的投资决策需要基于准确的收益预测。因此&#xff0c;光伏收益计算工具应运而生&#xff0c;为投资者提供决策支持。 光伏收益计算工具是一种…

Web开发:如何在VS2022中使用AI编写代码

一、注意事项 安装、使用都需要科学上网 API-KEY需要付费购买 二、安装 搜索"Visual chatGPT Studio"并且安装&#xff0c;安装完成后关闭所有VS2022&#xff0c;等待安装&#xff0c;安装结束后重新打开VS&#xff08;注意过程要科学上网&#xff09; 三、配置 url…

zookeeper:启动后占用8080端口问题解决

ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务。它为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 我们经常在运行zookeeper服务时&#xff0c;不需要配置服务端口&#xff0c;…

spring boot版本升级遇到的一些问题

背景&#xff1a;由于项目需求&#xff0c;需要将nacos 1.4.6版本升级到2.x版本&#xff0c;由此引发的springboot、springcloud、springcloud Alibaba一系列版本变更。 旧版本分别为&#xff1a; Spring Boot 2.3.5.RELEASE Spring Cloud Hoxton.SR9 Spring Cloud Alibaba 2.2…

14、Kafka 请求是怎么被处理的

Kafka 请求是怎么被处理的 1、处理请求的 2 种常见方案1.1、顺序处理请求1.2、每个请求使用单独线程处理 2、Kafka 是如何处理请求的&#xff1f;3、控制类请求和数据类请求分离 无论是 Kafka 客户端还是 Broker 端&#xff0c;它们之间的交互都是通过 “请求 / 响应” 的方式完…

猫粮哪个牌子好又安全?安全的主食冻干猫粮牌子推荐

由于猫咪是肉食动物&#xff0c;对蛋白质的需求很高&#xff0c;如果摄入的蛋白质不足&#xff0c;就会影响猫咪的成长。而冻干猫粮本身因为制作工艺的原因&#xff0c;能保留原有的营养成分和营养元素&#xff0c;所以冻干猫粮蛋白含量比较高&#xff0c;营养又高&#xff0c;…

springboot解决XSS存储型漏洞

springboot解决XSS存储型漏洞 XSS攻击 XSS 攻击&#xff1a;跨站脚本攻击(Cross Site Scripting)&#xff0c;为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆&#xff0c;故将跨站脚本攻击缩写为 XSS。 XSS(跨站脚本攻击)&#xff1a;是指恶意攻击者往 Web 页面里插…

CEC2013(python):五种算法(CSO、WOA、GWO、DBO、PSO)求解CEC2013(python代码)

一、五种算法简介 1、鸡群优化算法CSO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、粒子群优化算法PSO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. Probl…