• 17.2 介绍常用路由协议。例如:BGP,OSPF,RIP

    题目 介绍常用路由协议。例如:BGP,OSPF,RIP 解答 BGP: Border Gateway Protocol (边界网关协议) BGP是互联网上的一个核心路由协议。当BGP路由器第一次出现在互联网上时, 它会与那些和它能直接通信的其它BGP路由器建立连接。建立连接后的第一件事, 是从它相邻的路由器下载整个路由表。做完这件事后, 它与其它路由器就只需要交换少量更新信息即可。 BGP路由器通过发送和更新消息来表示到达给定IP地址的计算机的首选路径的变化。 如果一个BGP路由器发现一条新的更好的路径,它将更新自己的路由表, 并向与它直接连接的BGP路由器传播……
  • 17.1 解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细

    题目 一步一步解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细。 解答 这道题目没有所谓的完全的正确答案,这个题目可以让你在任意的一个点深入下去, 只要你对这个点是熟悉的。以下是一个大概流程: 浏览器向DNS服务器查找输入URL对应的IP地址。 DNS服务器返回网站的IP地址。 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 浏览器获取请求页面的html代码。 浏览器在显示窗口内渲染HTML。 窗口关闭时,浏览器终止与服务器的连接。 这其中最有趣的是第1步和第2步(域名解析)。我们输入的网址(域名)是IP地址……
  • 16.10 写一个名为my2DAlloc的函数,用它开辟一个二维数组

    题目 写一个名为my2DAlloc的函数,用它开辟一个二维数组。尽可能地少用malloc函数, 并确保可以用arr[i][j]这种形式来访问第i行第j列的元素。 解答 这道题目最简单的方法就是先开一个数组来存储指向每一行的指针, 然后再为每一行动态地分配空间。这是非常常见的动态申请二维数组空间的方法: int** My2DAlloc(int rows, int cols){ int **arr = (int**)malloc(rows*sizeof(int*)); for(int i=0; i<rows; ++i) arr[i] = (int*)malloc(cols*sizeof(int)); return arr; } ……
  • 16.5 写程序判断一台机器是大端序还是小端序

    题目 写一个程序判断一台机器是大端序还是小端序。 解答 关于什么是大端序和小端序,可参见维基百科: 字节序 判断程序如下: #define BIG_ENDIAN 0 #define LITTLE_ENDIAN 1 int TestByteOrder(){ short int word = 0x0001; char *byte = (char *) &word; return (byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN); } 1234567 #define BIG_ENDIAN 0#define LITTLE_ENDIAN 1int TestByteOrder(){    short int word = 0x0001;  ……
  • 16.1 解释术语:虚拟内存、缺页中断、抖动

    题目 解释以下术语:虚拟内存,缺页中断,抖动 解答 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存 (一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片, 还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。 与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易, 对真正的物理内存(例如RAM)的使用也更有效率。 缺页中断一个页(Page)是一个固定容量的内存区块,是物理内存和外部存储(如硬盘等) 传输的单位。当一个程序访问一个……
  • 15.5 写SQL查询语句查询成绩排名前10%的学生

    题目 有一个简单的数据库,存储学生的成绩信息。尝试设计这个数据库,它会是怎样的? 提供一个SQL查询语句来返回光荣榜学生信息(前10%),按照他们的GPA排序。 解答 在一个简单的数据库中,我们至少需要以下三张表:学生表(Students),课程表(Courses), 及课程登记表(CourseEnrollment)。学生表中至少需要有学生姓名和学生ID, 及其它的个人信息。课程表包含课程名和课程ID,还可以包含课程描述和授课老师等。 课程登记表将包含学生和课程对(即哪个学生选了什么课,某课程有哪些学生选), 还包含课程成绩等。我们假设课程成绩是一个整数……
  • code123
    15.4 画一个数据库的(ER图),实体包括:公司、人、 专业人士

    15.4 画一个数据库的(ER图),实体包括:公司、人、 专业人士

    题目 画出一个数据库的实体关系图(ER图),其中的实体有公司(companies),人(people), 专业人士(professionals)。 解答 在公司中工作的人……
  • 15.3 什么是反范式?它的优缺点是什么?

    题目 什么是反范式?它优缺点是什么? 解答 反范式是通过增加冗余数据或数据分组来提高数据库读性能的过程。在某些情况下, 反范式有助于掩盖关系型数据库软件的低效。关系型的范式数据库即使做过优化, 也常常会带来沉重的访问负载。 数据库的范式设计会存储不同但相关的信息在不同的逻辑表, 如果这些表的存储在物理上也是分离的,那么从几个表中完成数据库的查询可能就会很慢 (比如JOIN操作)。如果JOIN操作的表很多,那么可能会慢得离谱。 有两个办法可以解决这个问题。首选的方法是使逻辑上的设计遵循范式, 但允许数据库管理系统(D……
  • code123
    15.2 SQL的连接有哪些不同的类型?并解释其异同点

    15.2 SQL的连接有哪些不同的类型?并解释其异同点

    题目 SQL的连接有哪些不同的类型?解释它们的不同点及在什么情况下用哪种连接,为什么? 解答 连接(JOIN)将数据库中的两个或多个表组合起……
  • 15.1 写一条SQL语句找到每个部门员工的数量

    题目 写一条SQL语句找到每一个部门中员工的数量。 解答 这个问题可以先将部门表和员工表做连接,然后再统计每个部门中的员工数量。 这里使用左连接,因为对于0个员工的部门,我们也要包含进来。 select Dept_Name, Departments.Dept_ID, count(*) as 'num_employees' from Departments left join Employees on Employees.Dept_ID = Departments.Dept_ID group by Departments.Dept_ID, Dept_Name 12345 select Dept_Name, Departments.Dept_ID, count(*) as 'num_employ……
  • 13.9 写一个智能指针类(smart_ptr)

    题目 写一个智能指针类(smart_ptr)。 解答 比起一般指针,智能指针会自动地管理内存(释放不需要的内存),而不需要程序员去操心。 它能避免迷途指针(dangling pointers),内存泄漏(memory leaks), 分配失败等情况的发生。智能指针需要为所有实例维护一个引用计数, 这样才能在恰当的时刻(引用计数为0时)将内存释放。 #include <iostream> #include <cstdlib> using namespace std; template <typename T> class SmartPointer{ public: SmartPointer(T* ptr){ ref = ptr; ……
  • 13.8 写一个函数,返回传入数据结构的一份完全拷贝

    题目 写一个函数,其中一个参数是指向Node结构的指针,返回传入数据结构的一份完全拷贝。 Node结构包含两个指针,指向另外两个Node。 解答 以下算法将维护一个从原结构的地址到新结构的地址的映射, 这种映射可以让程序发现之前已经拷贝的结点,从而不用为已有结点再拷贝一份。 由于结点中包含指向Node的指针,我们可以通过递归的方式进行结点复制。以下是代码: typedef map<Node*, Node*> NodeMap; Node* copy_recursive(Node *cur, NodeMap &nodeMap){ if(cur == NULL){ return NULL; ……
  • 13.7 为什么基类中的析构函数要声明为虚析构函数?

    题目 为什么基类中的析构函数要声明为虚析构函数? 解答 用对象指针来调用一个函数,有以下两种情况: 如果是虚函数,会调用派生类中的版本。 如果是非虚函数,会调用指针所指类型的实现版本。 析构函数也会遵循以上两种情况,因为析构函数也是函数嘛,不要把它看得太特殊。 当对象出了作用域或是我们删除对象指针,析构函数就会被调用。 当派生类对象出了作用域,派生类的析构函数会先调用,然后再调用它父类的析构函数, 这样能保证分配给对象的内存得到正确释放。 但是,如果我们删除一个指向派生类对象的基类指针,而基类析构函数……
  • 13.6 C++中名字隐藏是指什么?

    题目 C++中名字隐藏是什么? 解答 让我们通过一个例子来讲解C++中的名字隐藏。在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法。你必须重写所有的重载方法, 否则未被重写的方法会因为名字相同而被隐藏,从而使它在派生类中不可见。 请看例子: class FirstClass{ public: virtual void MethodA(int); virtual void MethodA(int, int); }; void FirstClass::MethodA(int i){ cout<<"ONE"<<endl; } void FirstClass::MethodA(int i, int j){ co……
  • 13.5 C语言关键字”volatile”的作用?

    题目 谈谈C语言关键字"volatile"的意义(或重要性)? 解答 volatile的意思是"易变的",因为访问寄存器比访问内存要快得多, 所以编译器一般都会做减少存取内存的优化。volatile 这个关键字会提醒编译器,它声明的变量随时可能发生变化(在外部被修改), 因此,与该变量相关的代码不要进行编译优化,以免出错。 声明一个volatile变量: volatile int x; int volatile x; 123 volatile int x;int volatile x;  声明一个指针,指向volatile型的……