一、选择题

1、以下程序的输出结果为( )

#include <stdio.h>
 int i;
 void prt()
 {
         for (i = 5; i < 8; i++)
         printf("%c", '*');
         printf("\t");
 }int main()
 {
         for (i = 5; i <= 8; i++)
             prt();
         return 0;
 }A: ***
答案解析:
 正确答案:A
 全局变量i,在main()中修改为5,第一次在prt()中执行循环输出三次'*',i被修改为8,回到main()中第二次调用prt()时,i<8为假,循环结束没输出,执行一次print("\t"),再次回到主函数后i++变为9,i<=8为假,循环结束;
知识点:1、for{初始化部分;循环条件部分;调整部分} {循环体}
        ①初始化部分:用来初始化循环变量,注只在循环开始时,执行一次
        ②循环条件部分:用于判断循环什么时候终止(每次循环都要执行,如果循环条件为true,进入循环体,如果为false,退出循环)
        ③调整部分:用于循环条件的调整,每次循环结束的时候执行(使循环条件趋于假的语句)
2、变量的作用域和生命周期
        (1)作用域
                ①局部变量的作用域就是所在的局部范围(同一个{}内)
                ②全局变量的作用域就是整个工程
注:作用域:当全局变量与局部变量同名冲突时,遵循局部优先原则。
        (2)生命周期
                ①局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
                ②全局变量的生命周期(作用域:在main整个范围均可用)=main的生命周期=程序的生命周期
2、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )
A: n=0;while(ch=getchar()!='\n')n++;         B: n=0;while(getchar()!='\n')n++;
C: for(n=0;getchar()!='\n';n++);                  D: n=0;for(ch=getchar();ch!='\n';n++);
答案解析:
 正确答案:D
 对于for循环,其中第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就再不会取字符,因此会死循环。
知识点:1、getchar函数(字符输入函数)
        ①一个getchar()函数只能接收一个字符(调用一次读一个字符--多个--循环)
应用:①可以统计字符个数;②可应用于清理缓存区
        ②getchar()是一个无参函数
        ③返回值:读取成功,返回其ASCII值(所接受的字符,可以赋给字符型或整形变量,也可作为表达式的一部分);读取失败,返回EOF
注:scanf默认回车和空格是输入不同组之间的间隔和结束标志,也就是说它不会读取空格和回车;但是getchar在输入时,空格和回车等都作为字符读入。        
3、如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )
int gcd(char x,char y)
 {
         int min = x < y ? x : y;
         for (min = 0; min > 0; min--)
                 if (x % min = 0 && y % min = 0)
                         return min;}

A: 参数类型不对         B: 循环变量min初值不对         C: 判断等于的符号不对

答案解析:
正确答案:ABC
1.函数实参是int,形参用char不对,会发生截断丢失数据;

2.min在for循环开始时更新为0,不再是两个形参中的较小值;
3.判断是否整除的时候误将==写成=赋值运算符;

4.函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题,如果是牛客网上的题,会报编译错误,说该函数不是在所有情况下都有返回值,只有在if条件成立的情况下有返回值,一般在vs上这种情况能通过,编译器会给一个默认的返回值。

二、编程题

1、小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:

1. 密码只能由大写字母,小写字母,数字构成;
2. 密码不能以数字开头;
3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种
4. 密码长度至少为 8

现在小明受到了 n 个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的

输入描述:输入一个数 n ,接下来有 n(n≤100) 行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过 100。

输出描述:输入 n 行,如果密码合法,输出 YES ,不合法输出 NO

密码检查_牛客题霸_牛客网

示例:
输入:1
 CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR输出:YES

代码实例:

分析:这道题只需要将字符串从头到尾的每种字符(大写字符,小写字符,数字,其他字符)分别统计出来后。然后逐个判断是否符合条件即可。

步骤:

        1、定义2个变量n(密码个数)   i(遍历密码个数) 

        2、多组输入:while(scanf("%d",&n)!=EOF)

        3、while循环体:

           ①遍历密码个数:for(i=0;i<n;i++)

               for循环体:

                ①定义6个变量 password(密码)  upper(统计大写字母)lower(统计小写字母)  digit(统计数字)  other(统计其他字符)  ptr(存储数组首地址)

                ②捕捉输入密码:scanf(“%s”,password);

                ③判断密码长度是否合适(<8continue)

                ④判断密码开头是否为数字(真continue)

                ⑤统计各种字符的个数:while(*ptr!='\0')

                ⑥判断是否有其他字符(真continue)

                ⑦判断密码中出现的类型是否>=2:(真输出YES,假输出NO)

#include <stdio.h>
#include<string.h>
int main() 
{
    int n=0;
	int i=0;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
		{
			char password[101]={0};
			int upper=0;
			int lower=0;
			int digit=0;
			int other=0;
			char* ptr=password;//数组名是数组首元素地址
			scanf("%s",password);
			//判断密码长度是否合适
			if(strlen(password)<8)
			{
				printf("NO\n");
				continue;
			}
			//判断密码开头是否为数字
			if(password[0]>='0'&&password[0]<='9')
			{
				printf("NO\n");
				continue;
			}
			//统计各种字符的个数
			while(*ptr!='\0')
			{
				if (*ptr >= 'a' && *ptr <= 'z') lower++;
				else if (*ptr >= 'A' && *ptr <= 'Z') upper++;
				else if (*ptr >= '0' && *ptr <= '9') digit++;
				else other++;
				ptr++;
			}
			//判断是否有其他字符
			if(other!=0)
			{
				printf("NO\n");
				continue;
			}
			//判断密码中出现的类型是否>=2
			if((lower>0)+(upper>0)+(digit>0)>=2)
			{
				printf("YES\n");
			}
			else 
			{
				printf("NO\n");
			}
		}
	}
    return 0;
}