C语言刷题-day4

一、选择题

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

#include
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: ***         B: *** *** *** ***         C: *** ***        D: * * *

答案解析:
正确答案: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: 判断等于的符号不对         D: 返回类型不对

答案解析:
正确答案: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

               for循环体:

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

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

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

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

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

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

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

#include 
#include
int main() 
{
    int n=0;
	int i=0;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i='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;
}

你可能感兴趣的:(2023寒假C语言刷题,c语言,算法,开发语言)