• 【C/C++笔试练习】——printf在使用%的注意事项、for循环语句的三个条件、运算符优先级、删除公共字符


    C/C++笔试练习

    1.%符号在printf用作格式说明符的注意事项

    (1)输出%5.3s

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

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

      A computer , puter      B computer ,  com
      C computer , computer    D computer , compu.ter

      

       %m.ns:

      m:输出字符串的宽度

      n:左起截取目标字符串n个字符,并且是右对齐,如果实际字符串长度不足3,则会在右侧用空格填充。

       所以%5.3s在C语言中表示一个字符串宽度为5,其中包括3个字符和2个空格。如果实际字符串长度不足3,则会在右侧用空格填充。

       答案选:B

    在这里插入图片描述

                       

    (2)判断%中小数点含义

      使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以下哪个选项是正确的?

      A %-30.4e      B %4.30e
      C %-30.4f      D %-4.30f

       %-30.4f 中的 %-30 表示左对齐且总宽度为30个字符。

       .4 表示小数点后有4位。

       f 表示浮点数,即 double 类型。

       答案选:C

                       

       在C语言中,%符号用于格式说明符,用于指定输入或输出的数据类型和格式。

       . 表示精度,指定了小数点后的位数或字符串中的最大字符数。

       例如:

       %5.3s表示一个字符串宽度为5,其中包括3个字符和2个空格。如果实际字符串长度不足3,则会在右侧用空格填充。

       %5.3f表示一个浮点数宽度为5,其中包括3位小数和2位整数。如果实际数字不足5位,则会在左侧用空格填充。

       需要注意的是,在%d、%c等格式说明符中,.并没有实际意义,因为这些格式说明符不支持小数点后的精度。
      

       以下是C语言中常见的%打印格式及其含义:

    %打印格式含义
    %d:打印十进制整数。
    %f:打印浮点数。
    %c:打印字符。
    %s:打印字符串。
    %u:打印无符号十进制整数。
    %x:打印十六进制整数。
    %o:打印八进制整数。
    %e:打印科学计数法表示的浮点数。
    %g:自动选择%f或%e输出。
    %p:打印指针地址。
    %%:打印一个%符号。

      

       这些格式说明符可以与一些标志字符一起使用,以控制输出格式,如:

    标志字符输出格式
    -:左对齐输出。
    +:在正数前加正号。
    空格:在正数前加空格。
    #:对于%o,输出前导零;对于%x和%X,输出前导0x或0X。
    0:用0填充输出的数字。

                     

    2.for循环语句的三个条件

    在这里插入图片描述

    (3)判断循环次数

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

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

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

       在循环开始前,x和y都被初始化为0。然后,循环条件为 (y = 123) && (x < 4)。首先,y = 123是一个赋值操作,它将y的值设置为123,然后返回123。因此,循环条件中的y = 123始终为真。

       其次,x < 4 是一个比较操作,它检查x的值是否小于4。在每次循环迭代后,x的值增加1(因为在for循环的第三个部分中没有对x进行修改)。因此,循环将执行4次,直到x的值达到4,此时循环条件不再为真,循环终止。

       答案选:C
      

    (4)判断循环次数

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

    int func()
    {
    	int i, j, k = 0;
    	for(i = 0, j = -1;j = 0;i++, j++)
    	{
    		k++;
    	}
    	return k;
    }
    
    int main()
    {
    	cout << (func());
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

       A -1       B 0
       C 1       D 2

      同理这段代码中的函数 func 包含一个 for 循环,该循环的初始条件是 j = -1,并且在每次迭代中 j 的值都会增加 1。循环的终止条件是 j = 0,这意味着当 j 的值变为 0 时,循环将停止。

      然而 j 的值在开始就赋值为了 -1 ,在条件判断中 j =0 为假,所以根本不会进入到这个循环中,直接跳出,k=0。

       答案选:B

                     

    (5)for循环初始化

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

       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循环初始化只执行一次,ch=getchar()作为初始化,只进行一次,所以只能获取一个字符,循环就会结束,A、B、C都可以。

       答案选:D

                     

    3.运算符优先级

    (6)判断运算符优先级

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

       A *p+=1;       B (*p)++;
       C ++(*p)       D *p++

      

       A、*p+=1; 等价于 *(p+1),先解引用得到year的值,然后增加1,再赋值给year,year的值变为1010,可以;

       B、(*p)++; 等价于 *(p+1),先解引用得到year的值,然后增加1,再赋值给year,year的值变为1010,可以;

       C、++(*p) 等价于 ++(year),先解引用得到year的值,然后增加1,再赋值给year,year的值变为1010,可以;

       D、*p++ 等价于 *p再对p++,先解引用得到year的值,然后p指针向后移动一位,year不变,所以D不可以。

       答案选:D
      
    在这里插入图片描述
      
    在这里插入图片描述
                  

    (7)判断优先级再计算大小

      32位系统中,定义**a[3][4],则变量占用内存空间为()。

      A 4      B 48
      C 192     D 12

      因为 [ ] 的优先级高于 * ,所以a先和 [ ] 结合,所以a是数组;

      在32位系统中,指针大小是4,此时a是一个二维数组a[3][4],每个数组元素是一个**类型变量,每个元素是一个二级指针,占用4个字节。整个数组a包含3行4列,共12个元素,所以整个数组占用的内存空间为12*4=48个字节。

       答案选:B

                  

    4.编程题

    (8)删除公共字符

    删除公共字符

       暴力解法

       本题可以使用传统的暴力查找方式,判断第一个串的字符是否在第二个串中,在再挪动字符删除这个字符的方式,时间复杂度为O(N^2),效率比较低。

    #include 
    #include 
    using namespace std;
    
    int main() {
        string str1;
        string str2;
        getline(cin,str1);//使用getline可以输入空格
        getline(cin,str2);
        for(int i=0;i<str1.size();i++)//暴力查找
        {
            for(int j=0;j<str2.size();j++)//有一样的数字就删除
            {
                if(str1[i]==str2[j])
                {
                    str1.erase(i,1);
                }
            }
        }
        cout<<str1;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

      
       哈希表

       1.将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。

      2.判断一个字符在第二个字符串,不要使用删除,这样效率太低,因为每次删除都伴随数据挪动。这里可以考虑使用将不在字符添加到一个新字符串,最后返回新新字符串。

    #include
    #include
    using namespace std;
    
    int main() {
        //IO输入字符串最好使用getline。
        string str1, str2;
        getline(cin, str1);
        getline(cin, str2);
        
        //使用哈希映射思想先str2统计字符出现的次数
        int hashtable[256] = {0};
        for (size_t i = 0; i < str2.size(); ++i) 
        {
            hashtable[str2[i]]++;
        }
    
        //遍历str1,str1[i]映射hashtable对应位置为0,则表示这个字符在
        //str2中没有出现过,则将他+=到ret。注意这里最好不要str1.erases(i)
        //因为边遍历,边erase,容易出错。
        string ret;
        for (size_t i = 0; i < str1.size(); ++i) 
        {
            if (hashtable[str1[i]] == 0)
                ret += str1[i];
        }
        
        cout << ret << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    《HelloGitHub》第 90 期
    生命在于研究——CVE-2021-22214记录
    Docker 搭建 Minio 容器
    ifconfig 查看 etcd 使用的 IP 是否存在
    并发编程 --- 信号量线程同步
    Rust7.1 Functional Language Features Iterators and Closures
    可以将 CSS 模块用于预处理器吗?
    【计算机图形学】基础 - Colorization using Optimization
    SpringBoot之缓存篇
    负载均衡的原理及其算法详解
  • 原文地址:https://blog.csdn.net/Crocodile1006/article/details/133235500