C++ 笔试题 (时间40 分钟, 满分100分)
姓名 ____________________________
电话 ____________________________
一. 单选题(共5题,每题3分,共15分)
- 以下程序的输出结果以及变量a的值为( D )
int a = 10;
printf(“%d”,a++);
A、11和10 B、11和11 C、10和10 D、10和11
-
元素在容器中的生命周期是( D )
A、整个程序 B、块外 C、到处 D、仅在该容器上 -
下列关于派生类和基类的描述中,正确的是( A )
A、派生类成员函数只能访问基类的公有和保护成员
B、派生类成员函数可以访问基类的所有成员
C、派生类成员函数只能访问基类的公有成员
D、派生类对基类的默认继承方式是公有继承 -
下列关于多态性说法不正确的是( A )
A、重载方式仅有函数重载
B、重载方式包含函数重载和运算符重载
C、多态性是指同名函数对应多种不同的实现
D、多态性表现为静态和动态两种方式 -
C++中关于堆和栈的说法,哪个是错误的( C )
A、堆的大小仅受操作系统的限制,栈的大小一般较小
B、在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题
C、堆和栈都可以静态分配
D、堆和栈都可以动态分配
二.多选题(共8题,每题5分,共40分)
-
Vector和List区别( ABCD )
A. Vector适合随机访问,List适合随机插入或删除
B. 当要存储的是大型类对象时,List要优于Vector,当然Vector也可以存储指向对象的指针来取得高效率
C.Vector每个元素在内存上是连续的,而List是非连续的
D. Vector和List都在堆上分配空间 -
关于函数模板,描述错误的是( A )
A.模板函数必须由程序员实例化为可执行的函数模板
B.函数模板的实例化由编译器实现
C.一个类定义中,只要有一个函数模板,则这个类是类模板
D.类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化 -
以下关于数组的描述正确的是( CD )
A.数组的大小是固定的,但可以有不同类型的数组元素
B.数组的大小是可变的,但所有数组元素的类型必须相同
C.数组的大小是固定的,但所有数组元素的类型必须相同
D.尽量使用std::array来代替数组 -
以下对switch语句和break语句描述错误的有( ABD )
A.在switch语句中必须使用break语句
B.break语句只能用于switch语句
C.在switch语句中可以根据需要使用或者不适用break语句
D.break语句是switch预计的一部分
5.以下属于C++面向对象程序设计的基本特点( ACE )
A.封装 B.依赖注入 C.多态 D.AOP E.继承
6.以下关于C++11智能指针的描述正确的是( ABCD )
A.unique_ptr, 不支持复制和赋值,但是支持std::move
B.shared_ptr,基于引用计数的智能指针,可随意赋值
C.weak_ptr 可以解决share_ptr循环引用导致的死锁问题
D.智能指针主要用RAII技术来实现
7.以下哪些函数为SQL语句的集合函数( ABDE )
A.COUNT B.SUM C.ABS D.MAX E.AVG
8.数据库事务的特性包括( ABCE )
A.原子性 B.隔离性 C.持久性 D.可恢复性 E.一致性
三.编程题填空(共35分)
- 解释下面每个const的作用 (每题3分)
class A {
public:
const int get(const std:string& str) const;
private:
std:string m_str;
};
左边const: 函数返回值不可修改
中间const: 函数输入参数不可修改
右边const: 不可修改成员变量
- 实现string 赋值构造函数(每题3分)
class string {
public:
string();
~string();
string& operator = (const string& str);
private:
size_t size_;
char* buffer_;
};
inline string& string::operator = (const string& str)
{
if (this->size_ != 0)
_____ delete [] buffer_ ______;
size_ = ____ str.size_ ___________;
buffer_ = ____ new char[size_+1] ___;
strcpy(buffer_, str.c_str());
return ___*this___;
}
- 根据数组元素的首次出现对其进行分组(每题3分)
给定一个包含许多重复元素的未排序整数数组,请对其进行重新排列,以使同一元素一起出
现,并且每个元素的首次出现的相对顺序保持不变。
例子:
Input: { 6, 4, 5, 6, 3, 1, 3, 4 }
Output: 6 6 4 4 5 3 3 1
#include
#include <unordered_map>
using namespace std;
void re_arrange(int arr[], int num) {
// create an empty map to store the frequency of each element
// present in the input array
unordered_map<int, int> freq;
// traverse the input array and update the frequency of each element
for (auto i = 0; i < num; ++i) {
_____ freq[arr[i]]++ ______;
}
for (auto i = 0; i < num; ++i) {
// if `arr[i]` exists in the map (first occurrence of `arr[i]`)
if ( ____ freq.find(arr[i]) != freq.end() _____ ) {
// print `arr[i]`, `n` times, where `n = freq[arr[i]]`
int n = freq[arr[i]];
while (n--) {
cout << arr[i] << " ";
}
// delete the element from the map, so it would not
// get processed again
___ freq.erase(arr[i]) ___;
}
}
}
int main() {
int arr[] = {6, 4, 5, 6, 3, 1, 3, 4};
int num = sizeof(arr) / sizeof(arr[0]);
re_arrange(arr, num);
return 0;
}
时间复杂度/空间复杂度(2分)O(n)_
四.SQL (共1题,每题10分,共10分)
- 如下订单表以及股票信息表的数据
Order表
OrderID StockCode Price Quantity OrderDate
201910160001 8473 2300 1000 20191016
201910180001 6758 6500 1000 20191018
201910180002 8473 2350 600 20191018
201910180003 6758 6550 400 20191018
Stock表, SartDate EndDate用来表示不同期间的股票基本信息
StockCode StockName StartDate EndDate
8473 SBI Group A 00000000 20191017
8473 SBI Group B 20191018 99999999
6758 SONY 00000000 99999999
-
编写一个 SQL 查询,需要查询以下信息:
OrderID, StockCode, StockName, Amount 注: Amount = Quantity * PriceSELECT o.Order_ID, o.StockCode, s.StockName, o.Price * o.Quantity AS Amount FROM Order o left join Stock s on o.StockCode = s.StockCode;
-
编写SQL语句,查询条件为股票数量(Quantity)合计超过1500股
查询结果包含以下信息
StockCode,TotalQuantitySELECT StockCode, sum(Quantity) AS TotalQuantity from Order GROUP BY StockCode having TotalQuantity > 1500;