一、选择题
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: *** 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<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; }