目录
【前言】
在大家学完初阶C语言后,有很多知识点是比较模糊的,我们应该多刷题,这样才能巩固我们所学知识。所以我开了一个新专栏 C语言每日一刷 ,每一篇都包含5道选择题,2道编程题,每一道题后面都会有详细的解析。这个系列每日一更,大家来看看吧!
一、选择题
1、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )
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
【解析】
对于getchar()函数:
每次只会从从键盘缓冲区读取一个字符,且遇到
\n
结束读取
对于for循环:
- 第一个参数为循环的初始化【只执行一次】
- 第二个参数为循环的判断条件【每次进行条件判断,决定是否进入下次循环】
- 第三个参数为每次循环都执行的语句
对于 for 循环,其中第一项初始化表达式只执行一次,因此 ch 只从输入流中取一个字符,之后就再不会取字符,因此会死循环,故选D。
2、运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( )
cpp
int main()
{
int m, n;
printf("Enter m,n;");
scanf("%d%d", &m,&n);
while (m!=n) //1
{
while(m>n) m=m-n; //2
while(n>m) n=n-m; //3
}
printf("m=%d\n",m);
return 0;
}
A: 3 B: 2 C: 1 D: 0
【答案】C
【解析】
考查 while 循环和循环嵌套的理解,初值 m=65,n=14 ;循环 1 判断 m!=n 为真,来到循环 2 判断 m>n 为真,执行m=m-n;直到 m=9,n=14 ;循环 2 结束来到循环 3 判断 n>m 为真,执行 n=n-m; 直到 m=9,n=5 ;循环 3 结束回到循环 1 ,如此往复直到m==n 时,循环结束,故选C。
3.若运行以下程序时,从键盘输入 ADescriptor
<回车> ,则下面程序的运行结果是( )
cpp
#include <stdio.h>
int main()
{
char c;
int v0=0,v1=0,v2=0;
do
{
switch(c=getchar())
{
case'a':case'A':
case'e':case'E':
case'i':case'I':
case'o':case'O':
case'u':case'U':
v1 += 1;
default:
v0+= 1;v2+=1;
}
}while(c!='\n');
printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
return 0;
}
A: v0=7,v1=4,v2=7 B: v0=8,v1=4,V2=8
C: v0=11,v1=4,v2=11 D: v0=12,v1=4,v2=12
【答案】D
【解析】
代码 switch 语句中没有 break ,则每次找到入口进入后,顺序执行到代码块结束为止。例如当 c 为 'A' 时,从 case 'A' 进入,先后执行v1+=1;v0+=1;v2+=1; ,而当 c 为 'p' 时,从 default 进入,先后执行 v0+=1;v2+=1; ,容易看出最终 v0 和 v2 是相等的,v1+=1;执行4次,v0+=1;v2+=1;执行12次。故选D。
- 如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )
cpp
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
【解析】
题目函数的用途是求两个数字的最大公约数,让我们指出代码存在的问题。这种问题,即使你不知道怎么用代码求最大公约数也是能做的。
先看A选项,A说参数类型不对,那么我们观察可以发现,x,y是char型的,而题目要求两个int数字的最大公约数,参数类型不匹配,故要选A。
再看B选项,B说循环变量min初值不对,min初值被设成了0,而循环条件为min>0,因此循环一次都不会进行,更不会走到if的判断中。会直接走到return min上,最后只会返回x,y中的较小的那个,这样求最大公约数显然是错的,故要选B。
再看C选项,C说判断等于的符号不对,观察发现问题代码,if (x % min = 0 && y % min = 0)我们判断相等时要用两个=号,一个=号是赋值的意思,故要选C。
最后再看D选项,D说返回类型不对,min是int型的,而函数的返回类型也是故D错,不选。综上所述,我们的答案是ABC
5、执行下面的程序段,语句3的执行次数为( )
cpp
for(i = 0; i <= n-1; i++) // (1)
for(j = n; j > i; j--) // (2)
state; // (3)
A: n(n+2)/2 B: (n-1)(n+2)/2 C: n(n+1)/2 D: (n-1)(n+2)
【答案】C
【解析】
第一次循环有 n 次
当 i=0,第二次循环为 n 次
当 i=1,第二次循环为 n-1 次
当 i=2,第二次循环为 n-2 次
以此类推,总次数为n+(n-1)+(n-2)+......+2+1,就是个等差数列,等于 n(n+1)/2,故选C。
二、编程题
1.OJ链接 【leetcode 题号:645. 错误的集合】【难度:简单】
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例:
输入:nums = [1,2,2,4] 输入:nums = [1,1]
输出:[2,3] 输出:[1,2]
cpp
int* findErrorNums(int* nums, int numsSize, int* returnSize){
int* arr = (int*)malloc(sizeof(int) * 2);
int ret = 0;
int i = 0;
for (i = 0; i < numsSize; i++)
{
ret ^= i;
}
int j = 0;
for (j = 0; j < numsSize; j++)
{
ret ^= nums[j];
}
int k = 0;
for (k = 0; k < numsSize; k++)
{
if (nums[k] == nums[k + 1])
break;
}
ret ^= nums[k];
arr[0] = nums[k];
arr[1] = ret;
*returnSize = 2;
return arr;
}
2.OJ链接 【牛客网题号: OR141 密码检查】【难度:简单】
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明
对密码强度有一定要求:
-
- 密码只能由大写字母,小写字母,数字构成;
-
- 密码不能以数字开头;
-
- 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
-
- 密码长度至少为 8
现在小明受到了 n 个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。
输入描述:输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。
输出描述:输入n行,如果密码合法,输出YES,不合法输出NO
示例:
输入:1
CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR
输出:YES
cpp
#include <stdio.h>
#include<string.h>
#include <ctype.h>
int main() {
int n, a = 0, b = 0, c = 0;
scanf("%d", &n);
char arr[101] = { 0 };
for (int i = 0; i < n; i++)
{
scanf("%s", &arr);
if (strlen(arr) < 8)
{
printf("NO\n");
continue;
}
if (isdigit(arr[0]) != 0)
{
printf("NO\n");
continue;
}
for (int j = 0; j < n; j++)
{
if (islower(arr[j]) != 0)
a++;
if (isupper(arr[j]) != 0)
b++;
if (isdigit(arr[j]) != 0)
c++;
}
if (a == strlen(arr) || b == strlen(arr) || c == strlen(arr))
{
printf("NO\n");
continue;
}
printf("YES\n");
}
return 0;
}
好了,今天的每日一刷就到这里结束了,感谢大家的观看!