解题思路:
定义四个变量 且初值设置为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 条评论

无颜以对 5年前 回复TA
@逻辑幻象 空格不能作为特殊字符
逻辑幻象 6年前 回复TA
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
	int M,p;
	scanf("%d",&M);
	getchar();
	for(p=0;p<M;p++){
		int big=0,small=0,num=0,other=0;
		char a[50];
		int l,i,n;
		gets(a);
		l=strlen(a);
		for(i=0;i<l;i++){
			if(a[i]>='A' && a[i]<='Z'){
				big=1;
			}
			else if(a[i]>='a' && a[i]<='z'){
				small=1;
			}
			else if(a[i]>='0' && a[i]<='9'){
				num=1;
			}
			else{
				other=1;
			}
		}
		n=big+small+num+other;
		if(n>=3 && l>=8 && l<=16){
			printf("YES\n");
		}
		if(n<3 || l<8 || l>16){
		printf("NO\n");
		}
	}
	return 0;
}
不知道纳出了问题  总提示错误一半
White 6年前 回复TA
完全看不懂