• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

c语言每日一练(3)

武飞扬头像
大海里的番茄
帮助2

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

五道选择题:

1、执行下面的程序段,语句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)

解析:先看代码构成,两个循环嵌套在了一起,每一次循环都会执行一次语句3,那么我们的目标就是计算出总循环的次数。

第一层循环的i被初始化为0,循环继续条件为i<=n-1,且每次循环i 1。继续观察,发现没有别的可以影响i的值的因素了,0~n-1次数为n,因此第一层循环的次数为n。

接下来看第二层循环,第二层循环的j被初始化为了n,循环继续条件为j>i,且每次循环j减1。第二层循环受到i的值的影响,我们在做这种题时可以先代几个值进去尝试。

当i=0时,走到第二层循环,那么此时循环继续进行的条件就变成了j>0,j被初始化为n,每次循环j减1。那么第二层循环就会走n次。

我们接着走,当i=1时,走到第二层循环,那么此时循环继续进行的条件就变成了j>1,j又会被初始化为n,那么循环的次数就会是n-1

当i=2时为n-2.......一直到i=n-1时二层循环走1次可以看出

总共的循环次数是n n-1 n-2 ..... 1最后的结果为(1 n)*n/2,所以答案是C

2、对于代码段,下面描述正确的是( )

  1.  
    t=0;
  2.  
    while(printf("*"))
  3.  
    {
  4.  
    t ;
  5.  
    if (t<3)
  6.  
    break;
  7.  
    }

A. 其中循环控制表达式与0等价         B. 其中循环控制表达式与'0'等价

C. 其中循环控制表达式是不合法的    D. 以上说法都不对


解析: 观察四个选项,发现它们都避不开循环控制表达式,所以我们从循环控制表达式入手。循环控制表达式为printf("*"),而printf是有返回值的,它在屏幕上输出了几个字符,返回值就为几

printf("*")只会在屏幕上打印出一个*字符,所以这个控制表达式可以等价为1,也就是可以将循环看作while(1),循环条件恒为真,也就是死循环。

因此,如果有表达式可以实现循环控制表达式恒为真,那就等价于我们的循环控制表达式。

先看A选项,A:循环控制表达式与0等价,显然是错的,0恒为假,一次循环都不会进去更别说死循环了。

再看B选项,B:循环控制表达式与'0'等价,'0'的ASCII码值是48,48非0,循环控制表达式恒为真,故答案为B。

C选项是循环控制表达式不合法,一般来说,要出现循环控制表达式不合法,很可能是你的语法出错了,而题目中的死循环,虽然它死循环了,但循环是会进行的,所以是合法的,C错。D不用看,一般都不会选这个。所以最后答案为B

3、如下函数是求两个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.返回类型不对 

解析:题目函数的用途是求两个数字的最大公约数,让我们指出代码存在的问题。这种问题,即使你不知道怎么用代码求最大公约数也是能做的。

先看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

4、下列条件语句中,功能与其他语句不同的是( )
A. if(a) printf("%d\n",x); else printf("%d\n",y);
B. if(a==0) printf("%d\n",y); else printf("%d\n",x);
C. if (a!=0) printf("%d\n",x); else printf("%d\n",y);
D. if(a==0) printf("%d\n",x); else printf("%d\n",y);

解析:找不同,这个很简单,顺着走看功能就行

先看A选项,if(a) printf("%d\n",x); else printf("%d\n",y);顺着读就是,当a为非0值时,打印x,当a为0时打印y

再看B选项,if(a==0) printf("%d\n",y); else printf("%d\n",x);当a为0时打印y,当a为非0打印x,和A一样

再看C选项,if (a!=0) printf("%d\n",x); else printf("%d\n",y);当a不等于0时打印x,为0时打印y,和A一样

最后看D选项,if(a==0) printf("%d\n",x); else printf("%d\n",y);当a等于0时打印x,不等于0时打印y,和之前的都不一样,故答案为D

5、我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层循环的做法正确的是【多选】( )

A. 将程序写成函数用return结束函数,便可跳出循环

A解析:使用return可以直接结束函数,别说跳出循环了,它直接撂担子不干了,所以A正确

B. 修改外层循环条件例如

  1.  
    for (int i = 0; i < MAX1; i )
  2.  
    {
  3.  
    for (int j = 0; j < MAX2; j )
  4.  
    {
  5.  
    if (condition)
  6.  
    {
  7.  
    i = MAX1;//1
  8.  
    break;//2
  9.  
    }
  10.  
    }
  11.  
    //3
  12.  
    }

B解析:当condition满足的时候,i=MAX1,然后break,break跳出一层循环,跳到3的位置,继续走发现没有代码执行了,跳到开始的条件判断,发现不满足i<MAX1这个条件,故循环结束。可以看出,当condition满足时,直接跳出这个多层循环,故B正确

C. 在外层循环设置判断条件例如

  1.  
    for (; symbol != 1 && condition2; )
  2.  
    {
  3.  
    for (; symbol != 1 && condition3; )
  4.  
    {
  5.  
    if (condition1)
  6.  
    symbol = 1;
  7.  
    }
  8.  
    }

C解析:当condition满足时,symbol被赋值为1。可以看出,两层循环进行的条件均是symbol!=1,也就是说, 当symbol不等于1时两层循环才会有进行的可能,所以当symbol为1时,两层循环都会被跳出,C正确

D. 在外层循环后面加入break例如

  1.  
    for ( ;symbol; )
  2.  
    {
  3.  
    for ( ;symbol!=1; )
  4.  
    {
  5.  
    if (condition)
  6.  
    symbol = 1;//1
  7.  
    }
  8.  
    if (symbol == 1)//2
  9.  
    break;
  10.  
    }

D解析:当condition满足时,symbol等于1,会跳到2的位置。symbol等于1,满足if(symbol==1),故跳出循环,D正确。综上所述,答案为ABCD

编程题1:

数字在升序数组中出现的次数_牛客题霸_牛客网

学新通

  1.  
    int GetNumberOfK(int* nums, int numsLen, int k) {
  2.  
    int i = 0; int count = 0;
  3.  
    for (i = 0; i < numsLen; i )
  4.  
    //遍历一遍数组
  5.  
    {
  6.  
    if (nums[i] == k)
  7.  
    //k是目标,当等于时计数器 1
  8.  
    {
  9.  
    count ;
  10.  
    }
  11.  
    }
  12.  
    return count;//返回统计结果
  13.  
    }

补充:二分法

提醒:二分法对于这道题而言可读性太差,没特殊要求的情况下不建议使用,这里博主也不会过多解释,只能说只可意会不可言传,得靠自己领悟,初学者掌握不了也是很正常的,因为这道题二分法要考虑的东西很多

  1.  
    int two_search(int* data, int len, int k, int flag) {//flag:0-找左边, 1-找右边
  2.  
    int left = 0, right = len - 1, mid;
  3.  
    while (left <= right) {
  4.  
    mid = left (right - left) / 2;
  5.  
    if (data[mid] > k)
  6.  
    right = mid - 1;
  7.  
    else if (data[mid] < k)
  8.  
    left = mid 1;
  9.  
    else {
  10.  
    if (flag == 0) {//flag==0时,找最左边的数字
  11.  
    if (mid == left || data[mid - 1] != k) return mid;
  12.  
    else right = mid - 1;//把中心向左推
  13.  
    }
  14.  
    else {//flag==1时,找最右边的数字
  15.  
    if (mid == right || data[mid 1] != k) return mid;
  16.  
    else left = mid 1;//把中心向右推
  17.  
    }
  18.  
    }
  19.  
    } return -1;
  20.  
    } int GetNumberOfK(int* data, int dataLen, int k) {
  21.  
    if (dataLen == 0) return 0;
  22.  
    int left = two_search(data, dataLen, k, 0);
  23.  
    int right = two_search(data, dataLen, k, 1);
  24.  
    if (left == -1 && right == -1) return 0; //表示没有找到k这个数据
  25.  
    return right - left 1;
  26.  
    }
学新通

编程题2: 

面试题 05.06. 整数转换 - 力扣(LeetCode)学新通

  1.  
    int convertInteger(int A, int B) {
  2.  
    unsigned int x = A ^ B; int count = 0;
  3.  
    //异或(^)可以将A和B的两个值相同的位变为0,不同的位变为1
  4.  
    //因此此时的x的位上的1的数量为A和B不同的位的个数
  5.  
    while(x)
  6.  
    {
  7.  
    if(x&1==1)
  8.  
    //与1进行且运算,1只有最后一位为1,其他位为0
  9.  
    //可以将x最后一位的值剥离出来
  10.  
    //当剥离的结果为1意味着,找到了1个A和B不同的位
  11.  
    {
  12.  
    count ;
  13.  
    }
  14.  
    x>>=1;
  15.  
    //将x右移1位,如此可以遍历x上的所有位
  16.  
    }
  17.  
    return count;
  18.  
    //返回计数结果
  19.  
    }
学新通

好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgccebb
系列文章
更多 icon
同类精品
更多 icon
继续加载