• C及C++每日练习(1)


    一.选择:

    1.以下for循环的执行次数是()

     for(int x = 0, y = 0; (y = 123) && (x < 4); x++);

    A.是无限循环 B.循环次数不定 C.4次 D.3次

    对于for循环,其组成部分可以四个部分:
     

    1. for(初始化;循环进行条件;调整)
    2. {
    3. 循环语句//
    4. }

    对于上面给出的for循环的循环条件,由于中间用于&&连接,因此,必须左右的条件都为真,循环才能继续进行。因此,当循环进行四次时,此时的y==4,不满足条件,退出循环,因此答案选择:C循环三次

    2.以下程序的运行结果是()

    1. #include
    2. int main(void) {
    3. printf("%s , %5.3s\n", "computer", "computer");
    4. return 0;
    5. }

    A.computer , puter

    B. computer , com

    C. computer , computer

    D.computer , compu.ter

    此题目的考点主要在于打印的格式,即题目中的%5.3s对于这种%m.ns格式的格式。其中m表示输出字符串的宽度,n表示左起截取字符串中的多少字符,且对齐格式为右对齐,如果字符不足则用空格补足。但是也存在特殊情况:

    当字符串长度>n>m,此时m的作用不再生效。即输出左起截取字符串中的前n个字符。

    n>字符串长度时,直接从头打印至尾部。

    例如本题中,m==5,n==3,字符串长度<n,所以上述的打印格式应该为:打印字符串的长度5,从左截取字符串中的3个字符,由于截取的字符小于需要打印的字符,因此,用空格补齐,由于存在右对称,所以打印结果为:

    computer,空格空格com

    答案选择B,不过此处的答案并没有体现右对齐和补齐空格。

    3.下列main()函数执行后的结果为()

    1. int func(){
    2. int i, j, k = 0;
    3. for(i = 0, j = -1;j = 0;i++, j++){
    4. k++;
    5. }
    6. return k;
    7. }
    8. int main(){
    9. cout << (func());

    A.-1

    B. 0

    C.1

    D.2 

    在上面给出的代码中,调用了func()函数,结果打印func()函数的返回值。在func()函数的循环中,由于j==-1,因此,并不符合循环的判断条件,因此不会进入循环,所以直接返回0.。答案选择B

    4.下面程序输出是什么?

    1. #include
    2. int main()
    3. {
    4. int a=1,b=2,c=3,d=0;
    5. if(a == 1 && b++==2)
    6. if(b!=2||c--!=3)
    7. printf("%d,%d,%d\n" ,a,b,c);
    8. else
    9. printf("%d,%d,%d\n" ,a,b,c);
    10. else
    11. printf("%d,%d,%d\n" ,a,b,c);
    12. return 0;
    13. }

    A.1,2,3

    B. 1,3,2

    C.3,2,1

    D.1,3,3

    在本题给出的代码中,由于if并没有搭配相应的括号,因此会有些混乱,下面将题目的格式进行一定的更改,即:

    1. #include
    2. int main()
    3. {
    4. int a=1,b=2,c=3,d=0;
    5. if(a == 1 && b++==2)
    6. {
    7. if(b!=2||c--!=3)
    8. {
    9. printf("%d,%d,%d\n" ,a,b,c);
    10. }
    11. else
    12. {
    13. printf("%d,%d,%d\n" ,a,b,c);
    14. }
    15. else
    16. printf("%d,%d,%d\n" ,a,b,c);
    17. }
    18. return 0;
    19. }

    在第一个if判断中,第一个条件a==1判断为真,第二个条件由于是后置++,即:先使用,后++,因此也满足条件。但是在判断结束后,b==3

    在第二个if判断中,需要注意,此时的操作符||存在短路机制,即如果第一个条件满足,则结果直接判断为真,不再判断第二个条件,哟与b!=2为真,因此不再运行b++==2。直接进行打印,此时a,b,c的值分别是1,3,3,因此答案选择D

    5.若有定义语句:

     int a=10 ; double b=3.14 ; 则表达式 'A'+a+b 值的类型是()

    A.char B. int C.double D. float

    针对此题目,需要注意,不同类型的变量在进行运算时,会出现自动提升的机制,即表示数据范围小的类型会自动提升到表示范围大的类型,在题目给出的类型中,'A'占用一个字节,a占用4字节,b占用8字节,因此,运算结果在最后会转换为double。因此答案选择C

    6.在下面给出的数组中中,p[1][2]的值是():

    int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};

    A.1 B. 0 C.6 D.2

    给出的数组是一个二维数组,其行数没有给出,列数为4,在数组中的数组中,如果给出的数没有达到4位,则会用0补齐。因此,题目中给出的二维数组的结构为:

    1. {1,0,0,0}
    2. {3,2,0,0}
    3. {4,5,6,0}
    4. {0,0,0,0}

    对于二维数组,其行、列数都是从0开始算起的,因此,p[1][2]==0.,因此答案选择B

    7.选择表达式 11|10 的结果(本题数值均为十进制):

    A.11 B. 10 C.8 D.2

    题目涉及到二进制的运算,将11转为二进制形式,其后八位为:

    0000 1011

    对于10,其二进制位数为:

    0000 1010

    对于二者的|运算,规则为二进制位数有11,全0则为0.:

    1. 110000 1011
    2. 100000 1010
    3. 运算结果:0000 1011

    因此答案选择A

    8.fun(21)运行结果是

    1. int fun(int a){
    2. a^=(1<<5)-1;
    3. return a;
    4. }

    A.10 B. 5 C.3 D.86

    在本题目中,涉及到了两个操作符,分别是异或操作符" role="presentation" style="position: relative;">^,以及位运算操作符>> \, \, \, <<。对于异或操作符,其运算规则为两个二进制位相异为1,相同则为0

    对于本处的位操作符是左移操作符<<,其规则是右边二进制位丢弃且补0

    而对于右移操作符>>,则分为算术右移和逻辑右移,对于题目,一般默认采用算术右移,即右边丢弃,左边补上符号位,负数补1,正数补0.

    在本题中,1<<5,其位移后为:

    1. 移动前:0000 0001
    2. 移动后:0010 0000

    移动后,此时二进制位数转换为10进制,则表示的数为32。所以,答案是变量a,即2131的异或,即:

    1. 21的二进制位:0001 0101
    2. 31的二进制位:0001 1111
    3. 异或结果: 0000 1010

    所以答案选择A

    9.若有定义语句:int year=1009,*p=&year;以下不能使变量 year 中的值增至 1010 的语句是

    A.*p+=1;

    B. (*p)++;

    C.++(*p)

    D. *p++

    在本题目中,涉及到了操作符结合的优先顺序,在选项A中,*的优先级大于+=,因此可以增到1010。对于B,C存在括号,因此不做解释,可以增到1010.对于选项D由于后置++的优先级大于*。但是由于是后置++,因此D选项的整体运行顺序为:解引用指针,在对指针进行++,答案选择D

    10.下面关于"指针"的描述不正确的是

    A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL

    B. 32位系统下任何类型指针的长度都是4个字节

    C.指针的数据类型声明的是指针实际指向内容的数据类型

    D.野指针是指向未分配或者已经释放的内存地址

    对于A选项,当指针被free后,指针变量的值不是NULL,而是依旧指向一块空间的地址,但是由于这块空间被释放,因此指针为野指针。

    对于B选项,指针的定义,正确

    对于D选项正确,此处给出避免野指针的措施,即创建指针时即使初始化,free掉指针指向的空间后将指针置空,不进行数组的越界访问

    二.编程:

    2.1 删除公共字符:


    题目对于链接如下:
    删除公共字符_牛客题霸_牛客网 (nowcoder.com)

    对于本题,可以利用哈希的思想进行解决,首先创建两个string类型的对象,分别命名为str1,str2,其中,str1,str2分别用于接收第一行、第二行的输入。

    在完成输入后,创建一个数组arr[256],用于统计str2中各个字符出现的次数,如果出现一个字符,则对于数组的位置置为1.

    最后,从头遍历str1中的字符,如果arr[str1[i]]位置的值为0,即str1中的字符在数组中在str2中没有出现过。则输出该字符,具体代码如下:

    1. int main()
    2. {
    3. string str1,str2;
    4. getline(cin,str1);
    5. getline(cin,str2);
    6. int arr[256] = {0};
    7. for( size_t i = 0; i < str2.size(); i++)
    8. {
    9. arr[str2[i]] = 1;
    10. }
    11. for(size_t j = 0; j < str1.size(); j++)
    12. {
    13. if(arr[str1[j]] == 0)
    14. {
    15. cout << str1[j];
    16. }
    17. }
    18. return 0;
    19. }


    2.2 组队竞赛:

    题目分析:

    本题题目较长,看起来较为复杂,其实原理并不难,具体如下:
    题目会给定n个队伍,每个队伍均有三名选手,对于每个选手都定义了一个水平值,为了方便表示,这里将水平值定义为value

    对于一个队伍整体的水平值等于队伍中第二高的水平值。

    对于题目的要求,是需要n个队伍的整体水平值达到最大。例如题目中给出的例子:1,2,5,5,5,8。最大水平值的组合应该是1,5,52,5,8.不难看出,在本题目中,最大的水平值永远无法取到。如果想要让两个队伍的水平值之和为最大。最优情况,是在每组中,均能取到所有人水平值的第二高。具体如下:
         假如对于3*3的组,其每个人的水平值为:1,2,3,4,5,6,7,8,9。对于最优的水平值上面说到了,是取总体水平值的第二高。因此,也就是8,而为了能取到8,队伍中需要一个比8大的值,一个最小的值,也就是1,9.所以第一组分组为1,8,9。同理,第二组的分组为2,6,7。第三组为3,4,5

    所以,解决题目的重点有两个,一是将选手的水平值排列成升序序列,此问题比较简单,直接调用sort函数即可。

    第二个问题,是如何取到第二大的值:

    对于上面给出的图:蓝色方框表示需要选中的数,下面的蓝色数字表示数组的下标。对于数组的长度设为n,不难看出,蓝色方框选出的数的下标可以通过下面给出的式子表示,即:
                                    n-2*(i+1) \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, i==0,1,2,......

    因此,代码为:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. vector<int> v;
    8. int n = 0;
    9. cin >> n;
    10. v.resize(3*n);
    11. for( size_t i = 0; i < 3*n; i++)
    12. {
    13. cin >> v[i];
    14. }
    15. long long sum = 0;
    16. sort(v.begin(),v.end());
    17. for( size_t j = 0; j < n; j++)
    18. {
    19. sum += v[v.size()-2*(j+1)];
    20. }
    21. cout << sum;
    22. return 0;
    23. }

  • 相关阅读:
    C#__基本的读写文件方式
    怎么查找和自己专业有关的英文文献?
    减少80%存储-风控名单服务重构剖析
    App又出Bug?你需要的Android性能优化全攻略来了
    字节跳动面试官:请你实现一个大文件上传和断点续传
    如何按照一定的需求进行开发ALV报表
    23111707[含文档+PPT+源码等]计算机毕业设计基于javawebmysql的旅游网址前后台-全新项目
    【C++】C++入门
    LeetCode 每日一题 2022/8/15-2022/8/21
    clip-path属性深入理解与使用
  • 原文地址:https://blog.csdn.net/2301_76836325/article/details/136406402