EasyX官网
最近闲来无事,在家里用EasyX写了一个简(jian)洁(lou)的字母统计程序,刚好锻炼一下自己的实战能力,程序截图如下:
思路
- 对于输入的数据,利用桶排序统计其中个个字符的数量
- 求出所有数据中的最大值,将单位‘1’的长度求出
- 对于所有字符,绘制出 ‘1’*字符数量×16 的矩形,并在下方打印字符,上方打印字符数量
- 等待用户输入按键
编译环境
绘图库 | 编译软件 |
---|---|
EasyX_20200610 | Visual 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;
}