基于EasyX实现的字符统计器(条形统计图)

EasyX官网


最近闲来无事,在家里用EasyX写了一个简(jian)洁(lou)的字母统计程序,刚好锻炼一下自己的实战能力,程序截图如下:
​​输入
在这里插入图片描述

思路

  • 对于输入的数据,利用桶排序统计其中个个字符的数量
  • 求出所有数据中的最大值,将单位‘1’的长度求出
  • 对于所有字符,绘制出 ‘1’*字符数量×16 的矩形,并在下方打印字符,上方打印字符数量
  • 等待用户输入按键

编译环境

绘图库编译软件
EasyX_20200610Visual Studio 2019

关于这两个软件如何安装,请参考我以前的一篇博客

参考代码

#include <graphics.h> //这是EasyX绘图库的头文件
#include <iostream>   //cin,cout
#include <conio.h>    //_getch()
#include <string>     //string
using namespace std;

int bucket[36], max_len;
string s;

// 延迟输出效果 
void coutx(string s, DWORD dwMilliseconds){
	for (int i=0;s[i];i++){
		cout<<s[i];
		Sleep(dwMilliseconds);
	}
}

// 华丽的开场 
void worldofwar(){
	coutx("|------------------------------------", 7);
	Sleep(200);coutx("  字母统计器  ", 15);
	Sleep(200);coutx("------------------------------------|\n", 7);
	Sleep(800);coutx("                                                                        ", 0);coutx("开发者:", 50);
	Sleep(1000);coutx("神采奕奕\n\n", 50);
	Sleep(1000);coutx("    请输入您要统计的字符串", 25);
	Sleep(300);coutx("(可包含空格、", 25);
	Sleep(200);coutx("小写字母、", 25);
	Sleep(200);coutx("数字,", 25);
	Sleep(200);coutx("不能有汉字),", 25);
	Sleep(300);coutx("以一行 Ctrl+Z 结尾:\n", 25);
	Sleep(500);coutx("      注:", 7);
	Sleep(300);coutx("大写字母当做小写字母统计\n\n", 25);
}

//画条形统计图 
void bar_chart()
{
	// 窗口初始化 
	initgraph(750, 400);
	setbkcolor(0xffffff);
	cleardevice();

	// 字体初始化
	settextstyle(30, 15, L"Consolas", 0, 0, 10, false, false, false);
	settextcolor(0x000000);
	setfillcolor(0xa0ef90);
	LOGFONT f;
	gettextstyle(&f);
	f.lfQuality = ANTIALIASED_QUALITY;
	settextstyle(&f);

	/**
	 * 屏幕尺寸:750*400
	 * 左右留白:17
	 * 条形宽度:16
	 * 条形间隔:4
	 * 上下留白:30
	 * 字母高度:30
	 * 数字高度:15
	 * 条形最大高度:325
	 */

	// 一个字母在统计图中的高度
	int one=300/max_len;
	for (int i=0;i<36;i++){
		// 下方字符大小调整 
		f.lfHeight = 30;
		f.lfWidth = 15;
		settextstyle(&f);

		// 下方字符输出
		if(i<10) outtextxy(17+i*20,340,i+'0');
		else     outtextxy(17+i*20,340,i+'a'-10);

		// 统计条
		solidrectangle(16+i*20,340-ceil(one*bucket[i]),16+i*20+16,340);

		// 上方数字大小调整
		f.lfHeight = 16;
		f.lfWidth = 8;
		settextstyle(&f);

		// 上方数字输出
		TCHAR s[10];
		swprintf_s(s,10,_T("%d"),bucket[i]);
		outtextxy(16+i*20+8-(bucket[i]==0?1:ceil(log10(bucket[i]+1)))*4,340-ceil(one*bucket[i])-20,s);
	}
}
int main()
{
	worldofwar();
	while (getline(cin, s)){
		for (int i = 0; s[i]; i++){
			// 统计字符出现个数及最大个数 
			if(isdigit(s[i])) bucket[s[i]-'0']++,   max_len=max(max_len,bucket[s[i]-'0']);
			if(islower(s[i])) bucket[s[i]-'a'+10]++,max_len=max(max_len,bucket[s[i]-'a'+10]);
			if(isupper(s[i])) bucket[s[i]-'A'+10]++,max_len=max(max_len,bucket[s[i]-'A'+10]);
		}
	}
	// 绘制条形统计图
	bar_chart();

	// 等待
	_getch();
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值