C/C++练手小项目之倒计时与下载进度条模拟

Hellow! 你们好啊!,今天博主来介绍一个C语言练手的小项目--模拟倒计时和Linux中的下载进度条。代码不多就一百多行可以给刚入门的铁子练练手。

注:代码运行环境windows11,IDE大家各有所好,可以编译源代码就行。


目录

[1 前置知识点铺垫--printf的格式匹配符解析](#1 前置知识点铺垫--printf的格式匹配符解析)

[1.1 %d解析](#1.1 %d解析)

[1.2 %s解析](#1.2 %s解析)

[1.3 \r](#1.3 \r)

[2 控制printf打印字符的颜色](#2 控制printf打印字符的颜色)

[3 字符串自动拼接](#3 字符串自动拼接)

[4 %格式匹配符](#4 %格式匹配符)

[5 项目效果](#5 项目效果)

[6 实现代码及接口认识](#6 实现代码及接口认识)

[6.1 process.h文件](#6.1 process.h文件)

[6.2 process.c文件](#6.2 process.c文件)

[6.3 main.c文件](#6.3 main.c文件)


1 前置知识点铺垫--printf的格式匹配符解析

1.1 %d解析

%02d 输出整形宽度为2,默认右对齐,宽度不够补0。
%2d ,宽度不够补空格**,%-2d** 输出内容左对齐,后面补空格。

  • 控制内容的左右对齐方式,比如说输出两个字符宽度是对齐到右边还是左边。

1.2 %s解析

%100s输出的字符串长度不够100补空格,- 输出的字符串左对齐默认右对齐。

如**%-100s 从左边开始输出字符串长度不够100字符后面补空格。**

1.3 \r

\r 光标回到打印行开始的位置。从开始位置开始打印那么就会覆盖之前这一行打印的内容。

2 控制printf打印字符的颜色

颜色代码分类

‌通用属性‌:

0:重置所有属性

1:高亮/加粗

4:下划线

5:闪烁

7:反显(前景色与背景色互换)


前景色(字体颜色)‌:

30:黑色

31:红色

32:绿色

33:黄色

34:蓝色

35:品红色

36:青色

37:白色

// \033表示打印颜色, 1;5;表示设置颜色属性,31m表示字体颜色

#define RED "\033[1;5;31m"

#define GREEN "\033[32m"

#define Q "\033[0m"

#define RESET "\033[0m"

3 字符串自动拼接

在C语言中如果多个字符串写在同一个行会被自动拼接成一个字符串如

printf("ddd""aaa");--->printf("dddaaa");

const char* ptr="add""ddd";-->ptr="addddd";

4 %格式匹配符

这是C语言printf语句专门用来做格式占位的符号,如"sada%d",就是在这个字符串中给一个整形变量留了一个位置,将来这个整形变量会被当成字符放入到%d占的位置中,scanf中的%d叫做格式匹配符,从输入的字符串中按照整形的格式去匹配合适的字符。如果想打印%字符本身则需要%%转义一下才行,转义就是转变该字符意义。

5 项目效果

6 实现代码及接口认识

6.1 process.h文件

#pragma once

#include<stdio.h>

#include<string.h>

#define RED "\033[1;5;31m"

#define GREEN "\033[32m"

#define RESET "\033[0m"

#define GRENN "\033[32m"

//Total_file_size要下载的文件总大小

//cur_download_size 已经下载的文件大小

FlushDownlowd(double Total_file_size, double cur_download_size);

6.2 process.c文件

cpp 复制代码
#include"process.h"
//s1 构造缓冲区
const char* sym = "/|-\\";
int index = 0;
char buff[101];
FlushDownlowd(double Total_file_size, double cur_download_size)
{
	//初始化缓冲区--因为每次都要重新计算占比然后填入字符到缓冲区
	memset(buff,'\0',sizeof(buff));

	//计算下载占比
	double rate = (cur_download_size / Total_file_size) * 100.0;
	//转换为进度条
	int ct = (int)rate;
	//构造进度条
	for (int i = 0; i < ct; i++)
	{
		buff[i] = '#';
	}
	//打印进度条
	//%100s输出的字符串长度不够100补空格,- 输出的字符串左对齐默认右对齐
	//\r光标回到打印行开始的位置。从开始位置开始打印覆盖之前的内容
	printf(GREEN"[%-100s][%%%.1lf][%c]\r", buff, rate,sym[index++%4]);
	index=index % 4;
	//刷新缓冲区
	fflush(stdout);
	

}

6.3 main.c文件

cpp 复制代码
#include"process.h"
#include <windows.h>
#include<time.h>
void DownLoad(double Total_file_size,double speed)
{
	int sp1 = 0;
	//s1 记录下载总数
	double cur_download_size = 0;
	//s2刷新下载进度条
	while (cur_download_size<=Total_file_size)
	{
		//s2刷新下载进度条
		FlushDownlowd(Total_file_size, cur_download_size);
		//下载成功,刷新然后退出
		if (cur_download_size >= Total_file_size)break;
		Sleep(50);  // 休眠500毫秒
		//speed =rand()%10;//随机数模拟网络下载速度
		cur_download_size += speed;

	}
	printf("\n");

}
/*
颜色代码分类
‌通用属性‌:
0:重置所有属性
1:高亮/加粗
4:下划线
5:闪烁
7:反显(前景色与背景色互换)
‌前景色(字体颜色)‌:
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:品红色
36:青色
37:白色
*/
#define RED "\033[1;5;31m"
#define GREEN "\033[32m"
#define Q "\033[0m"
#define RESET "\033[0m"
int main()
{
	//printf("%20s","下载中:\n");
	//srand(time(0));
	////DownLoad(1024.0, 0.0);
	
	////DownLoad(1660.0, 0.5);
	int cnt = 3;
	printf("倒计时中:\n");
	while (cnt)
	{
		//%02d输出整形宽度为2,默认右对齐,宽度不够补0
		//%2d,宽度不够补空格,%-2d输出内容左对齐,后面补空格
		//- 控制内容的左右对齐方式,比如说输出两个字符宽度是对齐到右边还是左边
		printf(RED"%2d\r", cnt--);
		fflush(stdout);
		Sleep(1000);  // 休眠500毫秒
	}
	printf(RED"%2d\r", 0);
	printf("\n");
	printf(RED"倒计时结束,开始下载:\n");
	DownLoad(1500.0,2);
	return 0;
}

本期收录于博主的专栏------C/C++练手小项目专栏,代码里面都有注释有哪里不理解的小伙伴可以评论区留言。

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:小董 不懂 *( ̄▽ ̄)°★*

相关推荐
求一个demo2 小时前
Qt5.14.2配置MSVC2017
开发语言·qt
西阳未落2 小时前
C++基础(22)——模板的进阶
开发语言·c++
waves浪游3 小时前
C++模板进阶
开发语言·c++
青草地溪水旁3 小时前
设计模式(C++)详解——迭代器模式(1)
c++·设计模式·迭代器模式
你的电影很有趣3 小时前
lesson68:JavaScript 操作 HTML 元素、属性与样式全指南
开发语言·前端·javascript
青草地溪水旁3 小时前
设计模式(C++)详解——迭代器模式(2)
java·c++·设计模式·迭代器模式
SamsongSSS3 小时前
《C++ Primer Plus》读书笔记 第二章 开始学习C++
c++·后端
熊猫_豆豆3 小时前
MATLAB画出湖面波纹相遇所形成的现象
开发语言·matlab·仿真
花心蝴蝶.4 小时前
Java 中的代理模式
java·开发语言·代理模式