C语言

2023-10-31

目录

一、实验环境

二、黑白圣诞树

三、windows.h简介

四、windows.h实现彩色圣诞树

1.设置用户窗口

2.移动光标

3.修改字体颜色

4.绘制圣诞树

5.绘制雪景

6.完整代码

7.运行


一、实验环境

  • 编译环境:  vc++6.0、codeblocks(gcc/g++)
  • 操作系统:  windows7
  • 字符编码:  GBK

如何修改运行窗口的字符编码?

1.单击右键->默认值

2.选项->默认代码页->简体中文GBK,确认之后重启运行窗口

我们知道ASCII编码中一个字符占1个字节;而在GBK编码中,一个字符占2字节

二、黑白圣诞树

#include<stdio.h>
int main(){
	int height=10,i=0,j=0;
	//画五角星
	for(j=height-1;j>0;j--){
		printf(" ");
	}
    printf("%c%c\n",161,239);//GBK中五角星对应的编码为A1EF,换成十进制就是161 239
    //画叶子
    for(i=1;i<height;i++){
        for(j=height-i-1;j>0;j--){
			printf(" ");
		}
        for(j=2*i+2;j>0;j--){
            printf("*");
        }
        printf("\n");
    }
    //画树干
	for(j=height-1;j>0;j--){
		printf(" ");
	}
    printf("||");
    printf("\n");
	return 0;
}

实心五角星在GBK中的编码为A1EF,占两个字节;而C语言中字符类型只占一个字节,所以我们把A1EF拆成两个字节输出,十进制数161、239分别对应十六进制数A1、EF

三、windows.h简介

我们先思考一个问题,如何用C程序输出不同颜色的字体?一般来说,只靠应用程序本身很难达到这个目的,因为运行窗口的管理属于操作系统资源,而应用程序想要使用这些资源就必须通过操作系统提供的接口来实现。

为了解决这类问题,微软提供了丰富的Windows API(Application Programming Interface),这些API并不会直接在应用程序中展开,而是以动态链接的形式存在着,在应用程序需要API实现某些功能的时候,才调用相应的动态链接库。通过调用各种Windows API函数,应用程序可以管理它的用户界面、显示各种图形和文字、播放音乐等等。

windows.h是微软操作系统中非常重要的一个头文件,它包含了多个头文件以及多种API函数接口,比如Winbase.h(Windows内核函数等)、Winuser.h(Windows用户界面管理函数等)、Wingdi.h(Windows图形设备接口函数等)

四、windows.h实现彩色圣诞树

1.设置用户窗口

system("title 圣诞快乐!");//修改运行窗口的名称
system("mode con cols=50 lines=15");//设置窗口大小为50*15
/*
system("color 7C");//修改运行界面背景和字体的颜色,7:白色背景,C:淡红色字体
0 = 黑色    8 = 灰色
1 = 蓝色    9 = 淡蓝色
2 = 绿色    A = 淡绿色
3 = 湖蓝    B = 浅淡绿色
4 = 红色    C = 淡红色
5 = 紫色    D = 淡紫色
6 = 黄色    E = 淡黄色
7 = 白色    F = 亮白色

system("pause");//暂停,按下任意键后程序继续运行
system("cls");//清屏
*/

2.移动光标

/*定位光标位置到指定坐标*/
void goto_xy(int x, int y){
    HANDLE hout;
    hout=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos={x,y};
    SetConsoleCursorPosition(hout,pos);
}

Windwos是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本,这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,Windwos引入了实例句柄。Windows使用句柄(HANDLE)来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

你可以把句柄理解为指向指针的指针。我们知道,操作系统使用了虚拟内存技术,使得进程在逻辑上占有连续的地址空间(实际上这些虚拟地址映射的是物理空间碎片)。很多时候进程的代码和数据并不全部装入内存,在运行过程中,同一对象的地址可能会发生变化,为了准确访问到这些对象,Windows引入了句柄。系统会为每个进程在内存中分配一块空间,用来存储句柄,一个句柄指向内存中的一块区域,而这一块区域中存储了某个对象的地址。

3.修改字体颜色

/*根据参数改变字体颜色*/
void color(const unsigned short textColor)
{
    if(textColor>=0&&textColor<=15){
        //参数在0-15的范围颜色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),textColor);
    }else{
        //默认的字体颜色是白色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
    }
}

textColor = 0为黑色

4.绘制圣诞树

/*画圣诞树*/
void tree(int height,int colorOfLeaves){
    //画五角星
    if(colorOfLeaves==10){
        color(3);
    }else{
        color(11);
    }
    goto_xy(24,3);
    printf("%c%c\n",161,239);//GBK中五角星对应的编码为A1EF,换成十进制就是161 239
    //画叶子
    color(colorOfLeaves);
    for(int i=1;i<height;i++){
        if(colorOfLeaves==14){
            Sleep(60);
        }
        goto_xy(25-i-1,i+3);
        for(int j=2*i+2;j>0;j--){
            printf("*");
        }
        printf("\n");
    }
    //画树干
    goto_xy(25-1,height+3);
    color(4);
    printf("||");
    printf("\n");
}

5.绘制雪景

/*绘制雪景*/
void snow(int n){
    srand(time(0));
    for(int i=0;i<n;i++){
        int x=rand()%50;
        int y=rand()%15;
        goto_xy(x,y);
        color(7);
        if(i<n-5){
            printf("·");
        }else{
            printf("*");
        }

    }
}

在绘制雪景图的过程中,我们使用随机数生成每一片雪花的位置。其中srand(time(0));根据系统时间生成随机数种子,rand()%50;生成了[0,49]范围的随机数。

6.完整代码

#include<windows.h>
#include<stdio.h>
#include<time.h>

void color(const unsigned short textColor);
void goto_xy(int x, int y);
void tree(int height,int colorOfLeaves);
void snow(int n);

/*根据参数改变字体颜色*/
void color(const unsigned short textColor)
{
    if(textColor>=0&&textColor<=15){
        //参数在0-15的范围颜色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),textColor);
    }else{
        //默认的字体颜色是白色
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
    }
}
/*定位光标位置到指定坐标*/
void goto_xy(int x, int y){
    HANDLE hout;
    hout=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos={x,y};
    SetConsoleCursorPosition(hout,pos);
}
/*画圣诞树*/
void tree(int height,int colorOfLeaves){
    //画五角星
    if(colorOfLeaves==10){
        color(3);
    }else{
        color(11);
    }
    goto_xy(24,3);
    printf("%c%c\n",161,239);//GBK中五角星对应的编码为A1EF,换成十进制就是161 239
    //画叶子
    color(colorOfLeaves);
    for(int i=1;i<height;i++){
        if(colorOfLeaves==14){
            Sleep(60);
        }
        goto_xy(25-i-1,i+3);
        for(int j=2*i+2;j>0;j--){
            printf("*");
        }
        printf("\n");
    }
    //画树干
    goto_xy(25-1,height+3);
    color(4);
    printf("||");
    printf("\n");
}
/*绘制雪景*/
void snow(int n){
    srand(time(0));
    for(int i=0;i<n;i++){
        int x=rand()%50;
        int y=rand()%15;
        goto_xy(x,y);
        color(7);
        if(i<n-5){
            printf("·");
        }else{
            printf("*");
        }

    }
}
int main(){
    system("title 圣诞快乐!");
    system("mode con cols=50 lines=15");//设置窗口大小

    while(1){
        snow(30);
        tree(10,10);
        Sleep(1000);//延迟1000毫秒
        tree(10,14);
        Sleep(1000);//延迟1000毫秒
        system("cls");//清屏
    }
	return 0;
}

7.运行

 最后提前祝各位读者朋友圣诞快乐啦!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 的相关文章

  • DLNA的一个场景的工作过程

    场景 用户将手机A中的媒体内容播放到电视B上 DMC DMR 在这个场景中 前提是 A和B必须连接到同一个局域网中 假定电视B先接入局域网 手机A后接入局域网 然后再进行播放操作 那么该场景大概是这样的 B接入局域网以后 B需要建立多播so
  • 电脑设置定时关机的5种方法

    转自 微点阅读 https www weidianyuedu com 方法汇总于网络 仅供参考 目录 如何用系统命令设置定时关机 两款定时关机软件 小而好用 功能强大 如何用任务计划程序设置 常用的电脑软件如何设置 包括360安全卫士 迅雷
  • Java中以英文逗号分割的字符串在前端添加时正则判断

    Java中以英文逗号分割的字符串在前端添加时正则判断 只能是英文状态逗号且只能以逗号隔开不能以逗号结尾 只能是英文状态逗号 不能有中文逗号 var m uff0c if goodstype match m alert 不能有中文逗号 ret

随机推荐

  • sql注入之万能密码总结

    万能密码 万能密码原理 原验证登陆语句 SELECT FROM admin WHERE Username username AND Password md5 password 输入 1 or 1 1 or 1 1万能密码语句变为 SELEC
  • systemd启动mysql后一直卡住,Systemd Mysql不会停止

    升级到15 04后 我有很多乐趣了解systemd 我想我一切正常 除了我无法阻止mysql service systemctl命令只是挂起而且mysql一直在运行 有没有其他人经历过这个或者可能知道发生了什么 解决方法 我有同样的问题 升
  • 蓝桥杯.剪格子(DFS)

    Question Solve 深搜板子题 分成两部分 两部分的数字和相同 dfs去创造路径 然后比对路径上的数字和与剩余点的数字和 优化点 读入时候先求和sum 路径和ans另算 直接去判断ans是不是sum的一半 ans gt sum 2
  • 理解fasterRCNN模型的构成,并进行训练和预测

    学习目标 了解VOC数据集的应用 理解fasterRCNN模型的构成 能够利用fasterRCNN网络模型进行训练和预测 1 VOC数据集简介 Pascal VOC数据集作为基准数据 在目标检测中常被使用到 很多优秀的计算机视觉模型比如分类
  • 逆向图片搜索 搜索自己想搜索的

    Tineye 是一个用图片搜索图片的技术 http www tineye com 开始时Tineye是邀请注册 后来是开放注册 不过都需要注册才能使用 现在终于完全放开 无需再注册或登录即可使用该搜索引擎 此外 Tineye最近还增添了一下
  • Vue+ElementUI el-radio列表单选

    实现效果 对某条数据进行数据修改 步骤 1 添加单选按钮 点击获取该条信息的id 并将id传给修改按钮 div 1 修改按钮 span size mini 修改信息 span 2 列表单选按钮
  • OptiSystem应用:光放大器EDFA的仿真

    Optisystem可以设计和模拟光纤放大器和光纤激光器 此处展示的案例可在Optisystem安装文件夹samplesOptical amplifiers中找到 该教程将会介绍光放大器库这一部分 光放大器 全局参数 使用Optisyste
  • Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下 通过Java 程序代码将Word转为PDF文档时 结果文档内容出现乱码该如何解决 具体可参考如下内容 1 问题出现的背景 在Windows系统中 使用Spire Doc for Java将Word文档转换为PDF
  • [深度学习入门]Python基础语法(上)

    目录 一 程序设计基本方法 1 计算机是根据指令操作数据的设备 2 编程设计语言概述 3 计算机编程 4 IPO程序编写方法 5 使用计算机解决问题 二 基础知识 1 pyCharm 为人工智能领域常用的IDE 2 Python的简单使用
  • NVIDIA Shield 消失的解决办法和Moonlight串流

    Foreword 之前有用Moonlight串口pc的游戏到公司电脑 然后突然有一天串流就不可用了 NVIDIA Shield 就消失了 怎么都开不起来 串流就失败了 然后也记录一下Moonlight串流的操作 由于NVIDIA单方面宣布停
  • vue+element 根据状态,显示不同的操作按钮

    效果截图 VUE 核心功能代码片段
  • 【yolov5】yolov5训练自己的数据集全流程----包含本人设计的快速数据处理脚本

    关于yolo应用时能用到的脚本集合 推荐收藏 https chenlinwei blog csdn net article details 127299428 文章目录 1 工程化快速yolo训练流程指定版 无讲解 1 1 抽样数据集 xm
  • Spring MVC中如何进行转发和重定向呢?

    转自 Spring MVC中如何进行转发和重定向呢 重定向 我们将用户的定向到另一个视图 jsp 中处理 此操作是一个客户端行为 类似与url的链接操作 转发 将用户的请求转发到另一个视图或controller处理 此操作是一个服务器端行为
  • 【日常遇坑总结】类成员变量的空间分配和初始化顺序

    遇坑 今天在用QT的时候 传从主ui页面创建的一个指针到建模ui页面 在运行时程序发生奔溃 经过测试发现问题 主页面的指针和传进建模页面的指针不是同一个 导致在调用类指针方法时发生错误 测试 以下代码仅展示测试代码的部分 不可运行 但能从下
  • spring+ jcaptcha(spring框架下的彩色验证码)

    从jcaptcha官方网站下载jcaptcha的发行包 并将其发行包中的jar文件考贝到本地项目WEB INF目录下的lib目录中 官方网址http jcaptcha sourceforge net 在web xml文件中配置 Java代码
  • 嵌入式知识图谱WiKi(嵌入式开发/研发入门教程和路线图)

    嵌入式知识图谱WiKi 作者 将狼才鲸 创建时间 2022 02 18 因图床更新不方便 最新版请跳转到Gitee文档源文件仓库网址 才鲸 嵌入式知识图谱WiKi CSDN有图的文档阅读网址 嵌入式知识图谱WiKi Bilibili视频讲解
  • 数据结构--二叉树

    前言 关于二叉树知识的考察主要分两部分 第一部分在初赛中体现 一般考察二叉树的节点个数 树高和遍历问题 1 二叉树定义 在计算机科学中 二叉树是每个结点最多有两个子树的树结构 通常子树被称作 左子树 left subtree 和 右子树 r
  • Log4j2日志框架

    Log4j2日志框架 1 简介及入门示例 1 背景介绍 官网地址 https logging apache org log4j 2 x Maven 仓库地址 https search maven org artifact org apach
  • 机器学习心得体会总结

    第一 线性代数是把复杂问题简单化解决 但是简单问题已经很复杂了 第二 国内还没有一本关于机器学习讲得连老百姓都能看得明白的书籍 第三 克拉默法则 逆矩阵 初等变换都可以求解方程Ax b 后者方法更简单
  • C语言

    目录 一 实验环境 二 黑白圣诞树 三 windows h简介 四 windows h实现彩色圣诞树 1 设置用户窗口 2 移动光标 3 修改字体颜色 4 绘制圣诞树 5 绘制雪景 6 完整代码 7 运行 一 实验环境 编译环境 vc 6