• 【C语言】每日一题(半月斩)——day4


     

    目录

    选择题

    1、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )

    2、运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( ) 

    3、若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )

    4、如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( ) 

     5、执行下面的程序段,语句3的执行次数为( )

    掌握continue和break的区别

     编程题

    1.错误的集合

    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++);

    解析:

           本体考察的是对for循环      

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

    for(赋值语句;判断语句;调整语句);      //(循环变量赋初值; 循环条件; 循环变量增值)

       {

            //...
    }

    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

    解析:

    本题考察的是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

    while(循环控制表达式)
    {
      语句序列
    }

    3、若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )

    1. #include <stdio.h>
    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

    解析:

            本题考察的是switch-case-default 语句

    switch 语句中,如果进入某条case入口中没有break; 会进入下一条case中一直到default,直到遇到break;或者代码结束;        

    例当c为'A'时,从case 'A'进入,先后执行v1+=1;v0+=1;v2+=1;,

    而当c为'p'时,从default进入,先后执行v0+=1;v2+=1;,最终v0和v2是相等的。选D

    switch(表达式)
    {
    case 常量1:语句1
    case 常量2:语句2
    default:语句n   
        break;
    }

    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: 返回类型不对

    解析:

    本题考察的:==和=(==表示判断是否相等,=表示赋值运算符)
    1.函数实参是int,形参用char不对,会发生截断丢失数据;

    2.min在for循环开始时更新为0,不再是两个形参中的较小值;

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

    4.函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题

    选ABC

    知识点:'==' 和 '='
       “=”是赋值。
            👉它的作用是将一个表达式的值赋给一个左值。一个表达式或者是一个左值,或者是一个右值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量。我们用变量作左值,还可以看到,指针和引用也可以作左值。

      “==”是相等操作符,

           👉  判断两边是否相等。利用相等运算符,如果希望相等运算符返回true,则运算符两侧的值或语句必须使相等的;如果不相等,则==运算符返回false。

     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)

    解析: 

            本题考察多重循环体       

    外循环有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. // 外层循环
    2. while(条件1){ 
    3.     // 内层循环
    4.     for(条件2){  
    5.      
    6.     }
    7.     do{
    8.     
    9.     }while(条件3);
    10. }

    在循环嵌套中最需要注意的就是跳转语句

    掌握continue和break的区别

    👉break:

            退出当前循环!如果出现在多重循环的内层循环中,不会退出外层循环,只会退出当前循环。

    👉continue(继续):

            结束本次循环(后面的代码不执行了),进入下一次循环。

    break可以出现在switch选择结构和循环结构中,continue只能出现在循环中。

    利用continue和break实现重复输入。

     编程题

    1.错误的集合

    645.错误的集合——力扣

    集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

    给定一个数组 nums 代表了集合 S 发生错误后的结果。

    请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

    解析:

    将数组排序,才能去遍历;

            returnSize是指返回数组元素的个数。

    1.:使用qsort()函数将数组排序成升序;

    2:为返回值数组开辟动态内存空间,否则在出函数时会释放;

    3:定义一个数来记录数组的前一个数;

    4:遍历数组:相同记录为num[0],数组当前元素-前一个元素值大于一说明中间的就是缺的元素num[1];

    5:如果最后一个元素不等于长度,说明最后一个就是缺的元素。

    1. int my_cmp(const void* p1,const void* p2)
    2. {
    3. return *(int*)p1 - *(int*)p2;
    4. }
    5. int* findErrorNums(int* nums, int numsSize, int* returnSize)
    6. {
    7. //将数组进行升序排序
    8. qsort(nums,numsSize,4,my_cmp);
    9. //returnSize为返回数组元素个数
    10. *returnSize = 2;
    11. //开辟动态内存空间,否则在出函数时会释放
    12. int* num = (int*)malloc(sizeof(int)*2);
    13. //定义数组的前一个数
    14. int front = 0;
    15. //遍历数组
    16. for(int i = 0; i < numsSize;i++ )
    17. {
    18. //相同记录为num[0]
    19. if(nums[i] == front)
    20. {
    21. num[0] = nums[i];
    22. }
    23. //数组当前元素-前一个元素值大于一说明中间的就是缺的元素
    24. else if(nums[i] - front > 1)
    25. {
    26. num[1] = nums[i]-1;
    27. }
    28. front = nums[i];
    29. }
    30. //最后一个元素不等于长度,说明最后一个就是缺的元素
    31. if(nums[numsSize-1] != numsSize)
    32. {
    33. num[1] = numsSize;
    34. }
    35. return num;
    36. }

    2.密码检查 

    密码检查_牛客题霸_牛客网 (nowcoder.com)

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

    解析

    1:创建输入密码数量的n,和字符串arr;

    2:for循环遍历,创建用于记录密码的字符是否正确count,顺便求字符串长度;

    3:判断字符串长度是否合法;

    4:遍历一遍字符串,格式正确就记录count;

    5:最后将字符串长度与count比较,相同“YES”,反之“NO”。

    1. int main()
    2. {
    3. int n = 0;
    4. scanf("%d", &n);
    5. //字符串长度限制
    6. char arr[100] = { 0 };
    7. //密码个数
    8. for (int j = 0; j < n; j++)
    9. {
    10. scanf("%s", arr);
    11. //用于记录密码的字符是否正确
    12. int count = 0;
    13. //字符串长度
    14. int sz = strlen(arr);
    15. //是否符合长度要求
    16. if (sz >= 8 && sz <= 100)
    17. {
    18. //遍历一遍字符串,格式正确就记录
    19. for (int i = 0; i < sz; i++)
    20. {
    21. if (arr[i] >= 'A' && arr[i] <= 'Z' ||
    22. arr[i] >= 'a' && arr[i] <= 'z' ||
    23. arr[i] >= '0' && arr[i] <= '9')
    24. {
    25. count++;
    26. }
    27. }
    28. }
    29. //长度对比
    30. if (sz == count)
    31. {
    32. printf("YES\n");
    33. }
    34. else
    35. {
    36. printf("NO\n");
    37. }
    38. }
    39. return 0;
    40. }

     

     

  • 相关阅读:
    PostgreSQL-存储过程使用入门
    vue 自定义指令
    一位底层工程师参加谷歌开发者大会后的感想
    电子电机行业万界星空科技MES解决方案
    代码随想录算法训练营day57 | 647. 回文子串,516.最长回文子序列
    如何在 Rocky Linux 上安装 Apache Kafka?
    符尧:别卷大模型训练了,来卷数据吧!【干货十足】
    应用案例|基于三维机器视觉的机器人货品拣选系统应用解决方案
    易周金融分析 | 易观千帆发布7月城商行农商行APP盘点;养老理财产品跨行代销布局提速
    因果系列文章(7)——干预工具(下)
  • 原文地址:https://blog.csdn.net/m0_67367079/article/details/133798913