解题思路:
定义四个变量 且初值设置为0:

   int numofdaxie;  等于0表示大写没出现,等于1表示出现
   int numofxiaoxie;等于0表示小写没出现,等于1表示出现

   int shuzi;等于0表示数字没出现,等于1表示出现

   int specialword;等于0表示特殊没出现,等于1表示出现

 

     当密码长度小于8或大于16密码不合格;
    当密码长度大于等于8并且numofdaxie+numofxiaoxie+shuzi+specialword>=3时,密码合格;

    当密码长度大于等于8并且numofdaxie+numofxiaoxie+shuzi+specialword<3时,密码不合格;

  
   若长度符合条件,从第一个字符开始遍历,比如当大写字母首次出现时,把numofdaxie置为1,之后再次出现大写字母,不做  任何操作;其它三种字符处理同理;

      if(password[i]>='A'&&password[i]<='Z'&&(*numofdaxie==0))
         (*numofdaxie)++;

每次遍历时,判断numofdaxie+numofxiaoxie+shuzi+specialword是否大于等于3,是则输出YES且跳出循环;

若循环正常结束没有跳出,则说明numofdaxie+numofxiaoxie+shuzi+specialword<3,判断一下输出NO即可;


注意事项:

输出带换行符,每判断新的密码上述4个变量初值更新为0;

参考代码:

#include<stdio.h>
#include<string.h>
void function(char *password,int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword);
void format(int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword);
/*------------------------------------------------------------------------------------------------*/
int main()
{

   char password[20];
   int n;
   int numofdaxie;
   int numofxiaoxie;
   int shuzi;
   int specialword;

    scanf("%d",&n);
    getchar();
      for(int i=0;i<n;i++)
         {  gets(password);
            format(&numofdaxie,&numofxiaoxie,&shuzi,&specialword);
            function(password,&numofdaxie,&numofxiaoxie,&shuzi,&specialword);

         }

  return 0;
}

/*------------------------------------------------------------------------------------------------*/
void format(int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword)
{
  (*numofdaxie)=0;
  (*numofxiaoxie)=0;
  (*shuzi)=0;
  (*specialword)=0;

}
/*------------------------------------------------------------------------------------------------*/
void function(char *password,int *numofdaxie,int *numofxiaoxie,int *shuzi,int *specialword)
{
   int length=strlen(password);

   if(length<8||length>16)
    {
     printf("NO\n");
     return ;
    }

    for(int i=0;i<length;i++)
    {

      if(password[i]>='A'&&password[i]<='Z'&&(*numofdaxie==0))
         (*numofdaxie)++;

       if(password[i]>='a'&&password[i]<='z'&&(*numofxiaoxie==0))
         (*numofxiaoxie)++;

          if(password[i]>='0'&&password[i]<='9'&&(*shuzi==0))
           (*shuzi)++;

            if((password[i]=='~'||password[i]=='!'||password[i]=='@'||password[i]=='#'||password[i]=='$'||password[i]=='%'||password[i]=='^')&&(*specialword==0))
              (*specialword)++;

               if((*numofdaxie)+(*numofxiaoxie)+(*shuzi)+(*specialword)>=3)
                {printf("YES\n");break;}

    }
            
            if((*numofdaxie)+(*numofxiaoxie)+(*shuzi)+(*specialword)<3)
                printf("NO\n");
return;
}

别忘点赞哦-.-

点赞(25)
 

0.0分

12 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 13 条评论

无为 3年前 回复TA
花里胡哨
20212320 3年前 回复TA
@20212320 超过了评论输出限度,后面结尾部分没打出来,不过后面除了括号,return 0也没啥了。我这个是哪儿错了啊?提交显示WA50
20212320 3年前 回复TA
#include <iostream>
#include <cctype>
#include <cstring>
int main()
{
	int M;
	std::cin>>M;
	for(int j = 0;j < M;j++){
		char a[50];
		std::cin>>a;
		std::string str = a;//存到字符串中,方便求长度
		int n = str.length();//获取密码的长度
		if(n < 8||n > 16){
			std::cout<<"NO"<<std::endl;
			continue; //密码太短,跳进下一循环
		}
		int b,c,d,e;
		b = c = d = e = 0;
		for(int i =0;i < n;i++){
			b += ispunct(a[i]);
			c += isdigit(a[i]);
			d += islower(a[i]);
			e += isupper(a[i]);
		}
		int f = (b>0) + (c>0) + (d>0) + (e>0);//用逻辑运算计算出现的字符种类
		if(f >= 3)
			std::cout<<"YES"<<std::endl;
		else
			std::cout<<"NO"<<std::endl;
詹鸿培 3年前 回复TA
@刘靖洋 这是我的非常简单
詹鸿培 3年前 回复TA
@刘靖洋 #include<stdio.h> #include<string.h> int main () {     char a[100];     int i=0,e=0,b=0,c=0,d=0,m=0;     scanf("%d",&m);     getchar();     while(m>0)     {       gets(a);       m--;       i=0,e=0,b=0,c=0,d=0;     for(i=0;i<strlen(a);i++)     {         if(a[i]>=&#039;A&#039;&&a[i]<=&#039;Z&#039;)         {             e=1;         }         if(a[i]>=&#039;a&#039;&&a[i]<=&#039;z&#039;)         {             b=1;         }         if(a[i]>=&#039;0&#039;&&a[i]<=&#039;9&#039;)         {             c=1;         }        if(a[i]==&#039;~&#039;||a[i]==&#039;!&#039;||a[i]==&#039;@&#039;||a[i]==&#039;#&#039;||a[i]==&#039;$&#039;||a[i]==&#039;%&#039;||a[i]==&#039;^&#039;)         {            d=1;         }     }     if(strlen(a)>=8&&strlen(a)<=16&&(e+b+c+d)>=3)     {         printf("YES
");     }     else         printf("NO
");     }     return 0; }
詹鸿培 3年前 回复TA
@刘靖洋 吸收空格
刘靖洋 4年前 回复TA
为什么要在输入n后面加一个getchar()呢?
小黑 5年前 回复TA
@逻辑幻象 我也是这样,答案错误50%,难受
幻想净琉璃 5年前 回复TA
@逻辑幻象 我和你完全一样,第四种字符不能直接else,要依次判断,就从WA 50%变成AC了
无颜以对 5年前 回复TA
@逻辑幻象 特殊字符只为题目中给出的那几个