我用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)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语言的时候还是很不理解的,我这里对整个思路进行了梳理,不仅仅是提供代码,更重要的是思路,相信大家能够自己绘制出来,除了圣诞树这里还有绘制爱心的,这两个是我大一比较想完成的,当时真的是到处找代码,这里都进行了总结,下雪咯下雪咯,天气这么冷也没看见雪,只能写代码下了,圣诞节提前一周发出来了,喜欢的小伙伴可以多多支持一下。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!