问答题
问答题1:对两个字符a和b进行初始化:char a[]=“ABCDEF”;char b[]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};哪个数组长度长?
提示:计算数组的长度是 sizeof(a)/sizeof(a[0])
得出的,长度表示的是数组容纳元素的个数,对于a后面还有一个 \0
注意:如果用strlen函数计算两个数组,第一个输出6,第二个是未定义错误,输出的数值是未知的,因为该函数结尾的时候,只认识 \0
问答题2: C++中关于堆和栈的说法,哪个是错误的?
(A) 堆的大小仅受操作系统的限制,栈的大小一般一般较小
(B) 在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题
(C) 堆和栈都可以静态分配
(D) 堆和栈都可以动态分配
提示:静态分配是指在编译阶段就能确定大小,由编译器进行分配,堆不可以进行静态分配,堆的申请都是在执行过程中进行的;栈也可以动态的分配内存,例 alloc 函数进行申请栈内存
答案:D
问答题3:下列代码输出啥?
static int a = 1;
void fun1(void) {
a = 2;
}
void fun2(void) {
int a = 3;
}
void fun3(void) {
static int a = 4;
}
int main(int argc, char** args) {
printf("%d", a);
fun1();
printf("%d", a);
fun2();
printf("%d",a);
fun3();
printf("%d", a);
return 0;
}
提示:fun2 和 fun3 都是在函数内部的定义的变量,所以他们的作用域只限于函数内部,不会影响到全局变量 a 的值,fun2 和 fun3的区别就是 fun2中的 a 值在函数结束后就释放了,但是fun3中的a值不会随着fun3函数释放而释放,一直等到整个函数声明周期结束才释放.fun1函数是对静态全局变量 a 进行了修改
答案:1 2 2 2
问答题4:假定CSomething
是一个类,执行下面这些语句之后,内存里创建了几个CSomething
对象?
CSomething a();
CSomething b(2);
CSomething c[3];
CSomething &ra = b;
CSomething d=b;
CSomething *pA = c;
CSomething *p = new CSomething(4);
第一行 没有创建对象,是声明一个函数;
第二行 创建一个b对象,调用有参数的构造函数
第三行 创建三个对象
第四行 定义一个 ra 引用 b对象
第五行 调用拷贝构造函数,构造 d 对象,拷贝 b 对象
第六行 定义一个指针,指向 c 对象
第七行 在堆上新建一个对象
答案:一共创建6个对象
问答题5:下面这段代码会打印出什么?
class A{
public:
A(){
printf("A ");
}
~A(){
printf("deA ");
}
};
class B{
public:
B(){
printf("B ");
}
~B(){
printf("deB ");
}
};
class C : public A, public B{
public:
C(){
printf("C ");
}
~C(){
printf("deC ");
}
};
int main(){
A *a = new C();
delete a;
return 0;
}
提示:在构造C类对象的时候,会首先调用基类的构造函数,然后才会调用派生类的构造函数,在释放对象的时候,由于基类的析构函数并没有被定义为虚函数,所以编译器不会调用子类的析构函数,只调用了基类的析构函数,这样一来,很有可能造成内存泄漏问题
答案:A B C deA
编程题
编程题1:计算日期到天数转换
根据输入的日期,计算是这一年的第几天?
详细描述:输入某年某月某日,判断这一天是这一年的第几天?
输入描述:输入三行,分别是年,月,日
输出描述:成功:返回outDay输出计算后的第几天;失败:返回 -1
输入:2012 12 31
输出:366
#include <iostream>
using namespace std;
int main(){
int yy, mm, dd;
while(cin >> yy,cin >> mm,cin >> dd){
int array[12] = {0, 31,59,90,120,151,181,212,243,273,304,334 };
int days = 0;
days = array[mm - 1];
days += dd;
// 闰年影响了包括3月之后的月份
if (mm > 2) {
if ((yy % 100 != 0 && yy % 4 == 0) || yy % 400 == 0) {
days += 1;
}
}
cout << days << endl;
}
return 0;
}
幸运的袋子
一个袋子里面有 n 个球,每个球上面都有一个号码(拥有相同号码的球是无区别的),如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为 1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子
输入描述:第一行输入一个正整数n,代表袋子中球的个数,第二行为 n 个数正整数 xi 表示袋子中的球编号
输出描述:输出可以产生的幸运的袋子数
例:输入
3
1 1 1
输出:2
提示 求符合条件的子集个数
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
using namespace std;
/*
getLuckyPacket:从当前位置开始搜索符合要求的组合,一直搜索到最后一个位置结束
x: 袋子中的所有球
n: 球的总数
pos: 当前搜索的位置
sum: 到目前位置的累加和
multi: 到目前位置的累积值
*/
int getLuckyPacket(vector<int>&x, int n, int pos, int sum, int multi){
int count = 0;
//循环,搜索以位置i开始所有可能的组合
for (int i = pos; i < n; i++){
sum += x[i];
multi *= x[i];
if (sum > multi){
// 找到符合要求的组合,加 1 ,继续累加后续的值,看是否有符合要求的集合
count += 1 + getLuckyPacket(x, n, i + 1, sum, multi);
}
else if (x[i] == 1){
// 如何不符合要求,且当前元素值为 1 ,则继续向后搜索
count += getLuckyPacket(x, n, i + 1, sum, multi);
}
else{
// 如何 sum 大于 multi, 则后面就没有符合要求的组合了
break;
}
// 要搜索下一个位置之前,首先恢复 sum 和 multi
sum -= x[i];
multi /= x[i];
// 数字相同的球,没有什么区别,都只能算一个组合,所以直接跳过
while (i < n - 1 && x[i] == x[i + 1]){
i++;
}
}
return count;
}
int main(){
int n;
while (cin >> n){
vector<int>x(n);
for (int i = 0; i < n; i++){
cin >> x[i];
}
sort(x.begin(), x.end());
// 从第一个位置开始搜索
cout << getLuckyPacket(x, n, 0, 0, 1) << endl;
}
system("pasue");
return 0;
}