linux软件工程师笔试题,C/C++软件工程师笔试题
1,程序設(shè)計(jì)(可以用自然語(yǔ)言來(lái)描述,不編程):C/C++源代碼中,檢查花括弧(是“(”與
“)”,“{”與“}”)是否匹配,若不匹配,則輸出不匹配花括弧所在的行與列。
2,巧排數(shù)字,將1,2,...,19,20這20個(gè)數(shù)字排成一排,使得相鄰的兩個(gè)數(shù)字之和為一個(gè)素?cái)?shù),且
首尾兩數(shù)字之和也為一個(gè)素?cái)?shù)。編程打印出所有的排法。
3,打印一個(gè)N*N的方陣,N為每邊字符的個(gè)數(shù)(?? 3〈N〈20
),要求最外層為“X”,第二層為“Y”,從第三層起每層依次打印數(shù)字0,1,2,3,...
例子:當(dāng)N?? =5,打印出下面的圖形:
X?? X?? X?? X?? X
X?? Y?? Y?? Y?? X
X?? Y?? 0?? Y
X
X?? Y?? Y?? Y?? X
X?? X?? X?? X?? X
其他C/C++軟件工程師筆試題
如何定位全局?jǐn)?shù)組的寫(xiě)越界
??一個(gè)被大量引用的全局?jǐn)?shù)組int
a[100],被寫(xiě)越界了,這樣的情況如何定位?
????
??最簡(jiǎn)單的方法是,將數(shù)組a[100]改為a[101],然后對(duì)訪問(wèn)a[100]的地方設(shè)置斷點(diǎn)進(jìn)行調(diào)試。因?yàn)閍[100]應(yīng)該是沒(méi)有人訪問(wèn)的,如果訪問(wèn)就是越界訪問(wèn),直接可以定位到該位置。
????
??另外:將函數(shù)定義成static類型可以防止該文件意外的其他文件中的函數(shù)調(diào)用此函數(shù)。
++i與i++的區(qū)別到底怎樣?
??i++和++i的 最重要的區(qū)別大家都知道就是
+1和返回值的順序。但,兩這還有一個(gè)區(qū)別(在C++中)就是i++在實(shí)現(xiàn)的時(shí)候,產(chǎn)生了一個(gè)local object class
INT;
??
??//++i 的版本
??INT INT::operator++()
??{
??
*this=*this+1;
?? return *this;
??}
??
??//i++ 的版本
??const INT
INT::operator ++(int)
??{
?? INT oldvalue=*this;
??
*this=*this+1;
?? return
oldvalue
??}
??
??所以從效率上來(lái)說(shuō)++i比i++來(lái)的更有效率。具體細(xì)節(jié)你可以看More Effective C++
的M6
內(nèi)存泄漏
2006-2-18 星期六(Saturday) 晴
??struct
chunk_t
??{
?? u_char *ptr;
?? size_t len;
??};
??
??int
key_switch(const struct RSA_public_key *k, R_RSA_PUBLIC_KEY
*publickey)
??{
?? chunk_t exponent,modulus;
??
??
publickey->bits =(k->k)*BITS_PER_BYTE;
??
?? modulus =
mpz_to_n(&(k->n),k->k);
?? exponent =
mpz_to_n(&(k->e),k->k);
??
??
memcpy(publickey->modulus+128,modulus.ptr,modulus.len);
??
memcpy(publickey->exponent+128,exponent.ptr,exponent.len);
??
?? ……
……
?? return
0;
??}
??
??象上面這樣的函數(shù),其中在調(diào)用mpz_to_n的時(shí)候進(jìn)行了malloc內(nèi)存分配,別以為chunk_t
exponent,modulus;是局部變量就沒(méi)問(wèn)題,如果函數(shù)退出前不釋放mpz_to_n申請(qǐng)的空間,就會(huì)存在內(nèi)存泄漏問(wèn)題。
??
??應(yīng)該在……
……處加上代碼:
??freeanychunk(modulus);
??freeanychunk(exponent);
??
??指針釋放的問(wèn)題早就知道了,但是實(shí)際應(yīng)用中還是會(huì)因?yàn)闆](méi)注意到而忘了。由于分配內(nèi)存使用的是對(duì)malloc封裝的函數(shù)alloc_bytes(),所以使用相關(guān)的內(nèi)存泄漏調(diào)試工具會(huì)定位到alloc_bytes()函數(shù)里,根本不能定位到具體泄漏的地點(diǎn)。
??
??所以說(shuō)對(duì)malloc/free進(jìn)行二次封裝有它的好處,同時(shí)也會(huì)帶來(lái)壞處。
在linux下防止某個(gè)程序被運(yùn)行兩次的方法
??通過(guò)文件鎖來(lái)實(shí)現(xiàn),在程序運(yùn)行的一開(kāi)始,檢查某文件是否存在,如果存在則說(shuō)明改程序已經(jīng)在運(yùn)行了,如果不存在則利用open語(yǔ)句創(chuàng)建該文件,程序退出時(shí)關(guān)閉并刪除此文件。
??
??具體代碼:
??
??static char file_lock[sizeof(ctl_addr.sun_path)] =
/var/run/file.pid;
??static bool file_lock_created = FALSE;
??
??static
int
??create_lock(void)
??{
?? int fd = open(file_lock, O_WRONLY |
O_CREAT | O_EXCL | O_TRUNC,
?? S_IRUSR | S_IRGRP | S_IROTH);
??
?? if
(fd < 0)
?? {
?? if (errno == EEXIST)
?? {
?? fprintf(stderr,
\"file: lock file \"%s\" already existsn\", file_lock);
??
exit_file(10);
?? }
?? else
?? {
?? fprintf(stderr, \"file: unable
to create lock file \"%s\" (%d %s)n\"
?? , file_lock, errno,
strerror(errno));
?? exit_file(1);
?? }
?? }
?? file_lock_created =
TRUE;
?? return fd;
??}
??
??static bool
??fill_lock(int
lockfd)
??{
?? char buf[30]; /* holds \"n\" */
?? pid_t pid;
?? int
len;
??
?? pid = getpid();
?? len = snprintf(buf, sizeof(buf), \"%un\",
(unsigned int) pid);
?? bool ok = len > 0 && write(lockfd, buf,
len) == len;
??
?? close(lockfd);
?? return
ok;
??}
??
??static void
??delete_lock(void)
??{
?? if
(file_lock_created)
?? {
?? //delete_ctl_socket();
??
unlink(file_lock); /* is noting failure useful? */
??
}
??}
C/C++軟件工程師筆試題
??將任意證書(shū)N分解成多個(gè)互不相同的正整數(shù)的和,并打印所有可能的組合方式。例如N=6,組合方式有1+5,2+4,1+2+3。
??#include \"stdafx.h\"
??#include
\"stdlib.h\"
??
??static int n;
??int *a;
??static int total =0
;
??void output(int s){
?? int i=1;
?? printf(\"%d =
%d\",n,a[i]);
?? for(i=2; i<=s; i++){
?? printf(\"+%d\",a[i]);
??
}
?? printf(\"n\");
??}
??
??int filter(int s){
?? int i,j;
??
if(s==1)return -1;
?? for(i=s;i>0;i--)
?? for(j=1;j??
if(a[i]==a[j])
?? return -1;
?? }
?? return 0;
??}
??void dfs(int
d,int low,int rest){
?? //printf(\"d = %d ,low = %d ; rest
=%dn\",d,low,rest);
?? int i;
?? if(rest == 0){
??
if(filter(d-1)==0){
?? total ++;
?? output(d-1);
?? }
?? }
??
if(low>rest) {
?? //printf(\"1111111111111n\");
?? return ;
??
}
?? for(i=low;i<=rest;i++){
?? a[d]=i;
?? dfs(d+1,i,rest-i);
??
}
??}
??
??int main(int argc, char* argv[])
??{
??
?? int
num;
?? printf(\"input:\");
?? scanf(\"%d\",&num);
?? n=num
;
??
?? a =(int *)malloc(sizeof(int)*(n+1));
??
?? dfs(1,1,n);
??
printf(\"total = %dn\",total);
?? free(a);
?? return 0;
??}
總結(jié)
以上是生活随笔為你收集整理的linux软件工程师笔试题,C/C++软件工程师笔试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 美团未来发展方向 想创业做外卖的一定
- 下一篇: 安邦盈泰5号是不是骗局