【数组】【字符】计算密码强度(计数器judge计数法)&补充题:灰度直方图

题目:计算密码强度

问题描述
每个人都有很多密码,你知道你的密码强度吗?假定密码由大写字母、小写字母、数字和非字母数字的符号这四类字符构成,密码强度计算规则如下:

  1. 基础分:空密码(密码长度为零)0分,非空密码1分
  2. 加分项1:密码长度超过8位,+1分
  3. 加分项2:密码包含两类不同字符+1分,包含三类不同字符+2分,包含四类不同字符+3分
    按照此规则计算的密码强度为0~5。请你设计一个程序计算给出的密码的强度。

输入说明
输入为一个密码字符串,字符串长度不超过50个字符。

输出说明
输出一个整数表示该密码的强度。

输入样例

输入样例1
abcd

输入样例2
ab123

输出样例

样例1输出:
1
样例2输出:
2

此题不难,但是其中有一个计数方法值得学习。

此题唯一的难点在于“加分项2”的处理:如何判断字符类型个数,在相应地加分?在这里,我介绍我发现比较好用的一种计数方法:我称之为

“计数器计数法”——
这里的计数器其实就是一个数组judge[n],各元素初始值均为0。数组的每一个元素代表不同情况下满足的次数,满足一次,相应数组元素加1,这样便可以一次性记录所有情况下出现的个数了。请看代码段:

   int judge[4]={0};     //数组judge统计存放不同情况下出现字符的个数
  for (i=0; i<=len-1; i++)
 {
   if (ch[i]>=48 && ch[i]<=57)  judge[0]++;      //出现数字
   else if (ch[i]>=65 && ch[i]<=90)  judge[1]++;  //出现大写字母
   else if (ch[i]>=97 && ch[i]<=122)  judge[2]++;  //出现小写字母
   else   judge[3]++;    //出现其他类型的字符
 }

计数器法在处理数字统计的时候,功能更加显著。
因为计数器数组下标就可以表示统计的数字。比如,现在给出一大串数字,要统计不同数字出现的个数:2 3 4 2 1 2 3 4 7 8 5 5 2 3 4 1 3 4 6 8 6 0 9 8 6 4 4 3 2 4 3 1 2 3……那我就开辟judge[n]计数器,从第一个数字开始遍历(假设现在浏览的数字是x),那么计数程序就是:

   judge[x]++;

这样,judge计数器数组元素下标表示被统计的数字,元素值就是个数。
.
.
.
请看此题完整的代码:

#include<stdio.h>
#include<string.h>
int main(void)
{
  char ch[51];
  gets(ch);
  int len=strlen(ch);
  int score=0;
 if (len!=0)  score++;
    else  {printf("0"); return 0;}
 if (len>8)  score++;
    else  ;

  int i;
  int judge[4]={0};     //数组judge统计存放不同情况下出现字符的个数
 for (i=0; i<=len-1; i++)
 {
   if (ch[i]>=48 && ch[i]<=57)  judge[0]++;      //出现数字
   else if (ch[i]>=65 && ch[i]<=90)  judge[1]++;  //出现大写字母
   else if (ch[i]>=97 && ch[i]<=122)  judge[2]++;  //出现小写字母
   else   judge[3]++;    //出现其他类型的字符
 }

  int num=0;
 for (i=0; i<=3; i++)    //只要存在两种类型以上的的字符,强度就要再加
 {
   if (judge[i]!=0)  num++;
 }
  if (num>=2)  score+=num-1;
   printf("%d",score);
 return 0;
}

.
.
.
此外,再补充一道用计数器法较为简单的题目,作为“计数器计数法”的简单引用练习:(题目为:灰度直方图)

问题描述

一幅m×n的灰度图像可以用一个二维矩阵表示,矩阵中的每个元素表示对应像素的灰度值。
灰度直方图表示图像中具有每种灰度级的象素的个数,反映图像中每种灰度出现的频率。
假设图像灰度为16级(灰度值从0-15),现给出一个矩阵表示的灰度图像,输出各级灰度的像素个数。

输入说明

输入数据第一行为两个整数m 和n分别表示图像的宽度和高度(0<=m,n<=256),其后是n行数据,每行m个整数,分别表示图像各个像素的灰度值。

输出说明

输出n行数据,每行数据由两个整数组成,分别表示灰度级和该灰度级像素个数,整数之间用空格分隔,灰度级输出顺序为从低到高,
如果某灰度级像素个数为0,则不输出该灰度级的统计结果。

输入样例
5 4
0 1 0 2 8
3 4 8 5 9
12 14 10 6 7
1 15 3 6 10

输出样例
0 2
1 2
2 1
3 2
4 1
5 1
6 2
7 1
8 2
9 1
10 2
12 1
14 1
15 1
.
.
显然,这是一道简单的数字统计题目,我们当然首选用计数器法。没啥好说的,直接看代码吧:

#include<stdio.h>
int main(void)
{
	int m,n;
	scanf("%d %d",&m,&n);
	int x[n][m];
	int judge[16]={0};
	int i,j;
  for (i=0; i<=n-1; i++)
  {
  	for (j=0; j<=m-1; j++)
  	{
  		scanf("%d",&x[i][j]);
  		judge[x[i][j]]++;
  	}
  }
  
  for (i=0; i<=15; i++)
  {
  	if (judge[i]!=0)
  	{
  		printf("%d %d\n",i,judge[i]);
  	}
  }
   return 0;
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个在 Qt 框架下开发的简单的登录和注册应用。以下是每行代码的解释: 1. #include "myapp.h":包含应用程序的头文件。 2. myapp::myapp(QObject *parent) : QObject(parent):myapp 类的构造函数,其中 parent 是 QObject 类的指针。 3. this->mydb = new SqOperator;:创建 SqOperator 类的实例 mydb。 4. mydb->openDb();:打开 SQLite 数据库。 5. mydb->createTable();:创建数据表。 6. this->login = new mylogin;:创建 mylogin 类的实例 login。 7. this->login->show();:显示登录界面。 8. this->enroll = new myenroll;:创建 myenroll 类的实例 enroll。 9. this->face = new chatInterface;:创建 chatInterface 类的实例 face。 10. this->tip = new tips;:创建 tips 类的实例 tip。 11. connect(login,&mylogin::sig_login,this,&myapp::judge);connect(login,&mylogin::sig_enroll,this,&myapp::show_enroll_face);connect(enroll,&myenroll::sig_enroll_info,this,&myapp::insertdb):建立信号和槽的连接。 12. bool myapp::judge(QString usrname, QString usrpass):判断用户名和密码是否正确。 13. qDebug()<<usrname<<usrpass;:输出用户名和密码。 14. QList<QString> list;:创建一个 QList 对象。 15. mydb->queryTable(list);:查询全部数据,并将结果放入 list 中。 16. int i = 0;:初始化循环计数器 i。 17. for(i = 0 ; i < list.size() ; i=i+2):循环遍历 list。 18. if(usrname == list[i] || usrpass == list[i+1]):判断用户名和密码是否正确。 19. this->face->show();:显示聊天界面。 20. return true;:返回真。 21. this->tip->loginfail();:显示登录失败提示。 22. return false;:返回假。 23. void myapp::show_enroll_face():显示注册界面。 24. this->enroll->show();:显示注册界面。 25. void myapp::insertdb(QString usrname,QString usrpass):将用户名和密码插入数据库。 26. qDebug()<<usrname<<usrpass;:输出用户名和密码。 27. info info1;:创建 info 类的实例 info1。 28. info1.usrname = usrname;:将用户名赋值给 info1 的 usrname 成员变量。 29. info1.usrpass = usrpass;:将密码赋值给 info1 的 usrpass 成员变量。 30. if(mydb->singleInsertData(info1)):插入数据到数据库。 31. this->tip->insertok();:显示插入成功提示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值