选择题
%m.nf
:
- m表示输出所占宽度,n表示输出的精度,f表示输出浮点数
- 如果m是正数,就是右对齐m个字符,若m为负数,就是左对齐m个字符
%e
:输出科学计数法的小数形式
%lf
:输出双精度浮点数double d = 1234.567; printf("%e\n",d)
(1):const int* p;可以不进行初始化,正确
(2):i的地址赋值给 int const*类型 没毛病
(3):p2中 const修饰的是指针指向的内容,p2指针本身可修改,正确
(4):i的地址赋值给p3,p3指向的内容可修改,p3不可修改,正确
(5):改变p3的指向内容,正确
(6):改变p2的指向内容,错误!
(7):修改p3的指向,错误!’
3.
5.
6.
这里考察的是位段的理解
(1) a是一个无符号整形,大小为4字节共32位,a占19位,还剩下13位
(2) b是一个无符号整形,由于只占用11位,a开辟的4字节空间还剩下13位,所以可以存放下11位
(3) c是一个无符号整形,上面剩下的已经不足,所以还会开辟4字节的空间
(4) c用了32个字节中的4个位,而剩下28个位,不足29个位,所以d还需再开辟4个字节
(5) char类型不同于上面的类型,所以开辟一个新的1字节空间
一共有:4 + 4 + 4 + 1 = 13字节,但是需要考虑内存对齐,结构中最大的字节数为4,32位下默认对齐数也为4,取其最小还是为4,需要是4的整数倍,所以结果是 16!
编程题
1. 倒置字符串
思路1:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string str;
getline(cin,str);
//先对句子整体进行逆置
reverse(str.begin(),str.end());
// i like beijing.
// .gnijieb ekil i
// beijing. like i
//整体逆置之后,把每一个单词逆序
auto start = str.begin();
while(start != str.end())
{
//每次end 为start(单词的开始处开始向后找空格)
auto end = start;
//end不等于 \0 或者空格 那么就向后走
while(end != str.end() && *end!=' ')
{
++end;
}
//此时 [start,end)一定是一个单词
reverse(start,end);//逆置该单词
//更新start(下一次单词的起始位置)
if(end==str.end())
{
//走完了,没单词了
start = end;
}
else
{
//没走完,继续下一个单词
start = end+1;
}
}
cout << str<<endl;
return 0;
}
思路2
因为 cin >> string对象的时候 是在缓冲区里读取,遇到空格或者字符串就停止,所以可以利用该特性,一个单词一个单词的读入
当缓冲区没有内容的时候,也就是所有的单词都读完的时候,就退出循环
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1,str2;
cin >> str2; //输入一行到缓冲区,只读入第一个单词
while(cin >> str1) //如果缓冲区没有内容了 跳出
{
str2 = str1 + " " + str2; //新读入单词拼接到上一个单词的前面
}
cout << str2 << endl;
}
2. 排序子序列
思路
其中 a[n] = 0 主要是为了 防止数组越界访问 | 防止遗漏最后一个单独数的情况
也就是说
- 数组设置 n + 1 个主要是为了防止 情况1 和情况2 的越界访问
- a[n]设置为0 不会影响情况1和情况2的判断,主要是保证第三种情况的正确性
#include<iostream>
using namespace std;
#include<vector>
int main()
{
int n;
cin >> n;
vector<int> v;
v.resize(n+1);
v[n]=0; //最后一个元素设置为0
//输入数组数据
for(size_t i = 0;i < n;++i)
{
cin >> v[i];
}
int i = 0;
int count = 0;
while(i < n)
{
//进入非递减序列
if(v[i+1] > v[i])
{
while(i < n && v[i+1]>v[i])
{
++i;
}
//走完非递减
++count;
++i; //进入下一段序列
}
else if(v[i+1]==v[i])
{
++i; //直接向后走
}
else //进入非递增
{
while(i < n && v[i+1] < v[i])
{
++i;
}
//走完非递增
++count;
++i; //进入下一段序列
}
}
cout << count << endl;
return 0;
}