#解题思路
##主函数的设计:
char input[52];//全局定义,以便于在自定义的函数中进行操作
int main()
{
void clear();
int checker(int lenth);
int M;
int t=1,lenth;
scanf("%d",&M);
while (1)
{
if(t==M+1)break;
scanf("%s",input);/*注意:数组名作为数组头元素的地址*/
/*值得注意的是,其本身就是一个地址,不需要&寻地址*/
lenth=strlen(input);
if(lenth>=8&&lenth<=16&&checker(lenth)==1)printf("YES\n");/*代码的核心在于checker函数的定义上*/
else printf("NO\n");
t++;
clear();/*每一次的操作结束之后都需要重新使input数组里的所有数据都返回初始状态*/
}
return 0;
}
##自定函数部分
```c
void clear()//再初始化函数
{
int i=0;
for(;i<51;i++)
{
input[i]='\0';
}
}
int checker(int lenth)
{
int i,p,change(char skil);
int circhek(char m);
int chek[4]={0},sum=0;
for(i=0;i='A'&&input[i]<='Z'){chek[0]=1;continue;}
if(input[i]>='a'&&input[i]<='z'){chek[1]=1;continue;}
if(circhek(input[i])==1){chek[2]=1;continue;}
/*一定要注意前三个条件与下面这一个条件的逻辑关系。因为下方的这个条件需要一个循环,break只能跳出自己的循环而不能跳出第二层循环,所以该条件的循环被放到最后进行判断。*/
for(p=0;p<=9;p++)
{if(change(input[i])==p){chek[3]=1;break;}}
/*通过change函数将本该无法参与比较的字符与整数比较*/
}
sum=chek[0]+chek[1]+chek[2]+chek[3];
if(sum>=3)return 1;
else return 0;
}
int change(char skil)
{
int c;
c=skil-'0';//'0'的值是48,这是一个典型的用于数字类型转换的式子
return c;
}
int circhek(char m)
{
int chek2;
switch (m)
{
case '~':chek2=1;break;
case '!':chek2=1;break;
case '@':chek2=1;break;
case '#':chek2=1;break;
case '$':chek2=1;break;
case '%':chek2=1;break;
case '^':chek2=1;break;
default:chek2=0;break;
}
return chek2;
}
```
0.0分
2 人评分