文章目录
- C/C++笔试练习
- 1.%符号在printf用作格式说明符的注意事项
- (1)输出%5.3s
- (2)判断%中小数点含义
- 2.for循环语句的三个条件
- (3)判断循环次数
- (4)判断循环次数
- 3.运算符优先级
- (5)判断运算符优先级
- 4.编程题
- (6)删除公共字符
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
3.运算符优先级
(5)判断运算符优先级
若有定义语句: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
4.编程题
(6)删除公共字符
删除公共字符
暴力解法
本题可以使用传统的暴力查找方式,判断第一个串的字符是否在第二个串中,在再挪动字符删除这个字符的方式,时间复杂度为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;
}