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

C/C++笔试练习

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

(1)输出%5.3s

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

#include <stdio.h>

int main(void) 
{
	printf("%s , %5.3s\n", "computer", "computer");
	return 0;
}

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

   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;
}

   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 <iostream>
#include <string>
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.将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。

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

#include<iostream>
#include<string>
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;
}
  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鳄鱼麻薯球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值