C软件工程师入职笔试题及答案
- 格式:doc
- 大小:48.00 KB
- 文档页数:9
一、简答题(共50分)1.你常用的主机、OS、编译工具和调试工具是什么。
如何查看系统进程信息,(10分)你常用的进程管理命令有哪些?(问题尽量基于你常用的Unix环境作答)。
答:我常用的是Sun主机,操作系统一般是Solaris8或Solaris10。
编译工具包括:g++,gcc,cc等。
调试工具包括:gdb。
(该项了解应聘者对编程环境的偏好,无标准答案。
)常用的进程管理命令是:查看:prstat -a 或top管理:pldd pid 显示链接到每个进程的动态链接库pstack pid 显示十六进制与符号堆跟踪信息fuser filespwdx pid 查看进程运行目录ptree pid 查看进程树信息2.C中的malloc和C++中的new有什么区别。
(10分)答:malloc和new有以下不同:(1)new、delete 是操作符,可以重载,只能在C++中使用。
(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。
(3)new 可以调用对象的构造函数,对应的delete调用相应的析构函数。
(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数。
(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。
注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete 释放,不要混用。
因为两者实现的机理不同。
3、简述结构化的程序设计、面向对象的程序设计的基本思想。
(10分)答:结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。
4、一个oracle实例是由SGA和哪几个后台进程组成的?SGA有哪些组成部分及简述它们的作用?PGA是什么??(10分)答:后台进程:系统监控和进程监控进程(SMON和PMON)、数据库写进程(DBWR)、日志写进程(LGWR)、归档进程(ARCH)、检查点(CKPT);其它可选进程:调度进程(Dnnn)、恢复进程(RECO)、快照进程(SNPn)、锁进程(LCKn)、并行查询进程(Pnnn)。
数据写进程(dbwr):负责将更改的数据从数据库缓冲区高速缓存写入数据文件;日志写进程(lgwr):将重做日志缓冲区中的更改写入在线重做日志文件;系统监控(smon) :检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复;进程监控(pmon):负责在一个Oracle 进程失败时清理资源;检查点进程(chpt):负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息;归档进程(arcn) :在每次日志切换时把已满的日志组进行备份或归档;作业调度器(cjq):负责将调度与执行系统中已定义好的job,完成一些预定义的工作;恢复进程(reco):保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;SGA包含:db_cache、shared_pool、large_pool、java_pooldb_cache:数据库缓存(Block Buffer)占据Oracle数据库SGA(系统共享内存区)的主要部分,Oracle数据库通过使用LRU算法,将最近访问的数据块存放到缓存中,从而优化对磁盘数据的访问;shared_pool:共享池中保存数据字典高速缓冲和完全解析或编译的的PL/SQL 块和SQL 语句及控制结构;large_pool:使用MTS配置时,因为要在SGA中分配UGA来保持用户的会话,就是用Large_pool来保持这个会话内存;使用RMAN做备份的时候,要使用Large_pool这个内存结构来做磁盘I/O缓存器;java_pool:为java procedure预备的内存区域,如果没有使用java proc,java_pool不是必须的。
PGA:程序全局区,是保存有特定服务进程的数据和控制信息的内存结构,这个内存结构是非共享的,只有服务进程本身才能够访问它自己的PGA 区。
每个服务进程都有它自己的PGA区,各个服务进程PGA区的总和即库实例的PGA区的大小。
一般情况下,PGA区都由私有SQL工作区和会话内存区组成。
5、你在项目中用到了xml技术的哪些方面?如何实现的? (10分)答:用到了数据存贮,信息配置两方面。
在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。
在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。
二、按要求补充函数源代码(20分)1、完成顺序查找函数f_seq( )。
其过程是:从表头开始,根据给定的模式,逐项与表中元素比较。
如果找到所需元素,则查找成功,并打印出它在表中的顺序号。
如果查找整个表仍未找到所需对象,则查找失败。
(10分)#include <stdio.h>void f_seq(char *list[],char *object,int len)//list 指针数组,指向字符串//object 模式串//len 表的长度{char **p;int strcmp(char *s,char *t);p=list;while (_____①______) //p<list+lenif (strcmp(*p,object)==0)break;else ______②_______; //p++if (p<list+len)printf( “Success! **% d/n”,p-list);else printf(“Unsuccess!/n”);}int strcmp(char *s,char *t){for (;*s==*t; s++,t++)if (*s==’/0′)return(0);return(_____③______); //s-t或*s-*t或1}2、完成使链表逆置函数reverse。
(10分)若有链表:链表结点的结构如下:struct node{int num;struct node *next;}struct node* reverse(struct node *head)//head 链表头结点{struct node *p,*temp1,*temp2;if(head==NULL____①____) return head; //||head->next==NULL p=head->next;head->next=NULL;while(____②____) { //p!=NULL或ptemp1=head;____③____; //head=p;temp2=p;p=p->next;____④____; //temp2->next=temp1;或head->next=temp1;} //Match while statenmentreturn head; //返回逆置后的链表的头结点}三、写sql。
(共10分)SQL> desc emp;Name Null? Type------------------------------ -------- -------------------------------EMPNO NOT NULL NUMBER(4)ENAME VARCHAR2(10)JOB VARCHAR2(9)MGR NUMBER(4)HIREDATE DATESAL NUMBER(7,2)COMM NUMBER(7,2)DEPTNO NUMBER(2)1)查出各部门薪水最高的三个员工的部门、姓名和薪水。
(5分)答:break on deptno;select deptno,ename,salfrom (select deptno,ename,sal,row_number() over (partition by deptno order by sal) as rankfrom emp)where rank <= 3 ;2)查看各部门的薪水合计,要求有总计信息。
(5分)答:break on deptno skip 1;select decode(grouping(deptno),1,'总计',to_char(deptno)) deptno,sum(sal) sum_salfrom empgroup by rollup(deptno);四、编码实现冒泡排序(20分)答:冒泡排序编程实现如下:#include <stdio.h>#define LEN 10 //数组长度void main( void ) {int ARRAY[10] = { 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 }; // 待排序数组printf( "\n" );for( int a = 0; a < LEN; a++ ) { // 打印数组内容printf( "%d ", ARRAY[a] );}int i = 0;int j = 0;bool isChange; // 设定交换标志for( i = 1; i < LEN; i++ ) { // 最多做LEN-1趟排序isChange = 0; // 本趟排序开始前,交换标志应为假for( j = LEN-1; j >= i; j- ) { // 对当前无序区ARRAY[i..LEN]自下向上扫描if( ARRAY[j+1] < ARRAY[j] ) { // 交换记录ARRAY[0] = ARRAY[j+1]; // ARRAY[0]仅做暂存单元ARRAY[j+1] = ARRAY[j];ARRAY[j] = ARRAY[0];isChange = 1; // 发生了交换,故将交换标志置为真}}printf( "\n" );for( a = 0; a < LEN; a++) { // 打印本次排序后数组内容printf( "%d ", ARRAY[a] );}if( !isChange ) break; // 本趟排序未发生交换,提前终止算法}printf( "\n" );return; }。