• 【C刷题】day4


    一、选择题

    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

    【解析】:

    考点:for循环的逻辑

    对于for循环,第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就再不会取字符,因此会死循环


    2、运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( )
    1. int main()
    2. {
    3. int m, n;
    4. printf("Enter m,n;");
    5. scanf("%d%d", &m,&n);
    6. while (m!=n) //1
    7. {
    8. while(m>n) m=m-n; //2
    9. while(n>m) n=n-m; //3
    10. }
    11. printf("m=%d\n",m);
    12. return 0;
    13. }

    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时,循环结束

    上面的图表示m和n的变化,

    蓝色部分表示while(m>n) m=m-n; //2

    红色部分表示:while(n>m) n=n-m; //3

    外部循环一直进行,直到m=n=1停止


    3、若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )
    1. #include
    2. int main()
    3. {
    4. char c;
    5. int v0=0,v1=0,v2=0
    6. do
    7. {
    8. switch(c=getchar())
    9. {
    10. case'a':case'A':
    11. case'e':case'E':
    12. case'i':case'I':
    13. case'o':case'O':
    14. case'u':case'U':v1 += 1;
    15. default:v0+= 1;v2+=1;
    16. }
    17. }while(c!='\n');
    18. printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
    19. return 0;
    20. }

    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

    【解析】:

    考点:do while循环的逻辑+case语句中的break易错点

    注意点1:case语句后面没有break,那么执行完v1 += 1,还是会继续进入default:v0+= 1;v2+=1;

    注意点2:do while循环是先执行,再进行判断,所以当c=r(倒数第二个字符),进入while循环,c就等于'\0',但是还是会执行do语句,v0和v2还是会+1


    4、如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )
    1. int gcd(char x,char y)
    2. {
    3. int min = x < y ? x : y;
    4. for (min = 0; min > 0; min--)
    5. if (x % min = 0 && y % min = 0)
    6. return min;
    7. }

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

    【答案】:

    ABC

    【解析】:

    考点:==和=(==表示判断是否相等,=表示赋值运算符)

    1.题目说是求两个int数字的最大公约数,所以实参是int,形参用char不对,会发生截断丢失数据;

    2.min在for循环开始时更新为0,不再是两个形参中的较小值,不然上一条语句求min没作用;

    3.判断是否整除的时候误将==写成=赋值运算符;

    4.函数最终要返回一个int值,返回值类型没问题,

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


    5、执行下面的程序段,语句3的执行次数为( )
    1. for(i = 0; i <= n-1; i++) // (1)
    2. for(j = n; j > i; j--) // (2)
    3. 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


    二、编程题

    1.错误的集合

    5406e0f8f4114ed5b19261dec12c6eea.png

     【参考答案】: 

    思路:

    创建一个count数组统计出现2次和出现0次的数,再去遍历数组,如果出现两次就是arr【0】,没出现就是arr【1】

    1.统计数字出现的次数:count[nums[i]]++

    2.易错点:count数组的大小应该开辟numsSize+1个int类型大小(因为统计数字出现的次数时count【n】这个n是可以取到的,那么就需要开辟n+1个空间)

    1. int* findErrorNums(int* nums, int numsSize, int* returnSize)
    2. {
    3. *returnSize=2;
    4. //根据flag判断这两个数是否找到
    5. int flag1=0;
    6. int flag2=0;
    7. //为返回数组创建空间
    8. int *arr=(int *)malloc(sizeof(int)*2);
    9. //创建:统计每个数出现次数的数组count
    10. int *count=(int *)malloc(sizeof(int *)*(numsSize+1));
    11. //给count数组初始化为0
    12. memset(count,0,sizeof(int)*(numsSize+1));
    13. //统计nums数组每个数字出现的次数
    14. for(int i=0;i
    15. {
    16. count[nums[i]]++;//这里就解释了上面为啥要为count开辟numSize+1个int大小的空间
    17. }
    18. //找出重复的数arr【0】和缺失的数arr【1】
    19. for(int i=1;i1;i++)
    20. {
    21. //如果两个数都找到了就停止遍历
    22. if(flag1&&flag2)
    23. break;
    24. //找重复的数
    25. if(count[i]==2)
    26. {
    27. arr[0]=i;
    28. flag1=1;
    29. }
    30. //找缺失的数
    31. if(count[i]==0)
    32. {
    33. arr[1]=i;
    34. flag2=1;
    35. }
    36. }
    37. return arr;
    38. }

    2.密码检查

    5117da5ab3474ddc9162b18a94e9efdd.png

      【参考答案】: 

    思路:

    用flag来进行标记:flag若为0输出NO,为1则返回YES

    再分别进行每个条件的判断

    1.字符分类函数(eg:int isdigit(int c))的参数形式都是int类型,但是str字符串是char类型,那么就需要进行强转(int)

    2.密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种:可以采取创建三个变量a,b,c分别代表这三类字符并初始化为0,如果出现就改为1,最后如果a+b+c<2就不满足条件

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. //输入n值
    7. int n = 0;
    8. scanf("%d", &n);
    9. //多次输入并判断
    10. while (n--) {
    11. //flag若为0输出NO,为1则返回YES
    12. int flag = 1;
    13. //分别统计大写字母,小写字母和数字是否出现,如果出现则为1,反之为0
    14. int a = 0;
    15. int b = 0;
    16. int c = 0;
    17. //输入一个字符串
    18. char str[101] = { 0 };
    19. scanf("%s", str);
    20. //判断密码长度至少为8 和 密码不能以数字开头
    21. if (strlen(str) < 8 || isdigit((int)str[0]))
    22. flag = 0;
    23. //密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种
    24. for (int i = 0; str[i] != '\0'; i++) {
    25. if (isupper((int)str[i]))
    26. a = 1;
    27. if (islower((int)str[i]))
    28. b = 1;
    29. if (isdigit((int)str[i]))
    30. c = 1;
    31. if (!(isalnum((int)str[i])))
    32. flag = 0;
    33. }
    34. //如果密码中大写字母,小写字母和数字这三种字符小于两种:则返回NO
    35. if (a + b + c < 2)
    36. flag = 0;
    37. //输出
    38. if (flag == 1)
    39. printf("YES\n");
    40. else
    41. printf("NO\n");
    42. }
    43. return 0;
    44. }

  • 相关阅读:
    个人云原生项目如何低成本运维?
    Next.js多页布局getLayout使用方法
    读配置、讲原理、看面试真题,我只能帮你到这了。。。
    Spring Security 的身份验证绕过漏洞CVE-2023-34035
    八家知名大厂联合手写的Java面试手册刚上线,竟就到达巅峰?
    【wespeaker】模型ECAPA_TDNN介绍
    java计算机毕业设计bs架构实习管理系统源码+mysql数据库+系统+lw文档+部署
    【动态规划】leetcode 63. 不同路径 II
    libVLC 制作一款精美的播放器
    9月13日作业
  • 原文地址:https://blog.csdn.net/qq_73017178/article/details/133345993