http://topic.csdn.net/u/20080924/15/3b00a84e-970f-4dea-92f2-868c5d1ad825.html
前段時間剛參加了n多公司的C/C++軟件工程師的面試,有國企,外企,私企(moto,飛思卡爾,港灣,中國衛星XXX(這個牛))等等等等。感受感想頗多,近日終于空閑,在此表述一下。
??? 本人基本條件:3年開發經驗,2year+ Windows developmentexperence,1year+ Linux experence.熟悉C,C++,MFC/SDK/API,MiniGUI...(都是一些基本的了)。前公司并不知名,但在其中做個team leader。
言歸正傳
找工作本人認為最重要的就是前期準備了。
???首先。簡歷一定要寫的切合主題。招聘單位要的是你的技能,這個只要大概能符合就可以,關鍵他們需要的是你的開發經驗,一定要在簡歷中完美的體現出你之前所參與的項目,一定要寫明你在項目中的職責和地位,企業通過這方面側面對你的技術水平進行定位,因此一定要實事求是的寫的盡可能的詳細,只要別吹牛B,再詳細都不過分。只要上面這些內容得到充分的發揮,那么你基本可以得到面試的機會了。
???面試之筆試。去了10多個單位面試。題驚人的相似,如果你想順利通過筆試,有兩條建議:一,去網上找一些匯總的筆試題,仔細的看看里面關于數組,指針,鏈表,類的問題,90%的筆試題目就是里面的原題,從CSDN的下載頻道可以找到N多筆試題匯總,看過1遍之后你會發現所有的匯總內容都差不多。二、這點就有點那個了,呵呵。不好聽叫作弊,好聽的話叫夾帶。可以把所有您認為比較復雜的算法題打印出來,大概常考的有十幾個吧,比如strcpy,strcat,鏈表逆序,排序,字符串匹配查找,檢測單向鏈表上的環等等,一定要帶著這個去筆試,好公司一般都會為前來筆試的人員單獨準備一間屋子,所以只要看到差不多的算法,放心大膽的把答案拿出來copy吧。
??? 這里我說一下,不是出的這些題我們不會寫,只是在筆試這種情況下,要把代碼寫的盡量簡練,完善,并且工整確實有些困難。
??? 去外企或規模大的私企或者股份制,要做好有英語題的準備,不過一般情況下不難,漢譯英,英譯漢,只要別空著就沒問題。
??? 只要你按照上面的做了,OK,你已經可以和HR以及技術主管直接對話了。
???面試相對上面兩個環節是最關鍵的。如果公司很不錯,那么,你一定要準備英文自我介紹,英文項目介紹,英文優缺點介紹,英文個人喜好介紹,我去的公司大多數都要求這個。一上來就是can you introduce yourself in English? Can you introduce youresponsibility in your team/project?
???接下來就是技術面試了,一定要好好總結你在之前公司的項目經歷和飾演角色,一定要應付的游刃有余,準備充分。然后就是一些技術方面的東西了,virtual,const,static,extern“C”,虛函數表,構造、析構函數可否為virtual,純虛函數,虛擬繼承,偶爾也會問到一些小算法,放心,都是網上有的,只要看過,非常容易應付的。
??? 最后是問一些其他亂七八糟的事情以及讓你本人提一些要求,這些看情況發揮吧。
??? OK,如果上述都順利昨晚,回家等offer去吧。。。如果你確實認為這個單位非常適合你,那你在面試后的1、2天內可以發郵件再次表達自己的心情,并且給自己定一個客觀來說相對合理的范圍。
??? 去應聘,看起來很難,其實過程非常輕松。但所有這些其實都是在一個又一個不成熟的面試和筆試過程中積累起來的。
??? 希望能給大家一些幫助。也希望大家都好運。
??? 說一下最后的成果吧,在沒有任何經驗誤打誤撞了幾家之后,2家外企和N家私企來了offer,外企由于是通過外包進去,感覺沒什么保障拒絕了,最后挑了一家國內的股份制上市公司,感覺還算可以吧。
??? 最后,只要你做好了充分的準備,那么機會,高薪定會擺在你的面前。
??? 與君共勉。
?
?
附注:
在一次人才招聘會上,招聘人員告訴記者,他們認為現在的大學畢業生在求職中存在著很多誤區,而這些都是直接導致自己求職失敗的原因。
一、對企業一無所知
很多畢業生應聘企業很隨意,在一次招聘會上,一家化妝品公司的招聘主管讓應聘大學生說出幾款該公司代理的品牌名字,沒想到求職者一個都答不出來。這位招聘主管說:“對公司這么陌生,在求職前不去了解該公司,很難想像他對自己的職業生涯有所規劃。這樣不負責的人,我們肯定不會用。”記者了解到,這種情況招聘單位遇到很多。
二、自以為是
對于一些大學生而言,并非找不到任何工作,而是由于對工作的期望值過高,對一些低檔次的工作不屑一顧,盲目地追求一些脫離自身實際的“高工資、高待遇”的理想工作。這種“半吊子”型的人才,在就業壓力日益增大的今天必然要走向失業。
三、應聘太盲目
不少大學生并不知道某個職位的職責分工是什么,只會從字面上去理解。一家公司“營業服務部”下屬的商品企劃室招聘人,結果許多大學生看到“服務”二字,就以為是做服務工作無人應聘。而當公司把“服務”兩字去掉后,馬上就有很多人投簡歷。人事主管告誡說,如果對職位不明白可以詢問用人單位,不要單從字面上去片面理解,這樣很可能會錯過一個好機會。
四、不愿到基層去吃苦
大學生剛剛踏入社會,剛進入企業,很難立刻進入角色。一些公司規定所有新參加工作的大學生都要到一線去鍛煉一年,有的同學一看不能馬上搞設計、搞管理工作,要“吃一年的苦”,就打退堂鼓不愿意干了,白白丟掉了很好的工作。
五、獨立性欠缺
不少大學生在學習中只知死啃書本,沒有足夠的社會實踐,每次應聘都要父母參與求職,自己則缺乏主見。還有的畢業生筆試、面試通過后,在與公司簽約的時候,父母到場與用人單位說長道短談條件。對于這種行為,多家公司的人事主管都表示反感。“找工作的前提是,你是一個獨立的人,有自己的判斷能力,能對自己負責。”一位人事經理說。
IT公司面試-筆試題目1
1一個父類寫了一個virtual函數,如果子類覆蓋它的函數不加virtual ,也能實現多態?
在子類的空間里,有沒有父類的這個函數,或者父類的私有變量? (華為筆試題)
答案:只要基類在定義成員函數時已經聲明了virtue關鍵字,在派生類實現的時候覆蓋該函數時,virtual關鍵字可加可不加,不影響多態的實現。子類的空間里有父類的所有變量(static除外)。
2.main主函數執行完畢后,是否可能會再執行一段代碼?(朗訊的一道筆試題)
答案:可以,可以用_onexit注冊一個函數,它會在main 之后執行;
如果你需要加入一段在main退出后執行的代碼,可以使用atexit()函數,注冊一個函數。 ?
? 語法: ?
? #include ? <stdlib.h> ?
? int ? atexit(void ? (*function)(void)); ?
? #include ? <stdlib.h> ?
? #include ? <stdio.h> ? ?
? void ? fn1( ? void ? ), ? fn2( ? void ? ), ? fn3( ? void ? ), ? fn4( ? void ? ); ? ?
? int ? main( ? void ? ) ?
? { ?
? ? ? ? atexit( ? fn1 ? ); ?
? ? ? ? atexit( ? fn2 ? ); ?
? ? ? ? atexit( ? fn3 ? ); ?
? ? ? ? atexit( ? fn4 ? ); ?
? ? ? ? printf( ? "This ? is ? executed ? first./n" ? ); ?
? } ??
? void ? fn1() ?
? { ?
? ? ? ? printf( ? "next./n" ? ); ?
? } ??
? void ? fn2() ?
? { ?
? ? ? ? printf( ? "executed ? " ? ); ?
? } ? ?
? void ? fn3() ?
? { ?
? ? ? ? printf( ? "is ? " ? ); ?
? } ? ?
? void ? fn4() ?
? { ?
? ? ? ? printf( ? "This ? " ? ); ?
? } ?
結果:
This ? is ? executed ? first. ?
?This ? is ? executed ? next. ?
3.有雙向循環鏈表結點:(華為面試題)
typedef struct node
{
? int date;
? struct node *front,*next;
}_Node;
有兩個雙向循環鏈表A,B,知道其頭指針為:pHeadA,pHeadB,請寫一函數將兩上鏈表中date值相同的結點刪除
參考算法: ? ? ?
? 1.取出A的一個元素d ?
? 2.收集B中有相同元素d的結點到垃圾箱,并從B里刪除 ?
? 3.收集A中有相同元素d的結點到垃圾箱,并從A里刪除 ?
? 4.刪除垃圾箱中的所有元素 ?
? 5.A鏈的指針指向下一個 ?
? 6.重復1~5,直到A鏈循環到頭了 ?
? 注意的是第3步,在2步執行后垃圾箱不為空時才執行。 ?
上述算法還可以做一點點優化: ?
? 1.加入兩個變量cA, ? cB,分別記錄當前A中和B中的元素個數 ?
? 每次從較長者中取出一個元素來,先從較小者中找起 ?
? 若沒有,則不必在較長者中浪費時間了
#include<iostream.h> ? ???
? struct ? NODE ?
? { ?
? ? ? int ? date; ?
? ? ? NODE ? *front,*next; ?
? }; ?
void ? redel(NODE ? *&ahead,NODE ? *&bhead) ?
? { ?
? ? ? ? ? int ? boy=0; ?
? ? ? ? ? NODE ? *pa=ahead,*pb=bhead,*paa,*paaa,*paaaa,*pbb; ?
? ? ? ? ? while(pa->next!=ahead) ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? int ? boys=pa->date; ? //取pa中一個值
? ? ? ? ? ? ? ? ? paaaa=pa; ?
? ? ? ? ? ? ? ? ? paa=pa; ?
? ? ? ? ? ? ? ? ? pb=bhead; ?
? ? ? ? ? ? ? ? ? while(pb->next!=bhead) ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? if(boys==pb->date) ? //如果pa,pb中有值相同
? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cout<<endl; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cout<<"delete ? B:"<<paa->date<<" ? "; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(pb==bhead) ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boy=1; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb->front->next=pb->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb->next->front=pb->front; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bhead=bhead->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pbb=pb; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb=pb->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delete ? pbb; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boy=1; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb->front->next=pb->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb->next->front=pb->front; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pbb=pb; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb=pb->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delete ? pbb; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pb=pb->next; ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? while(paa->next!=ahead ? && ? boy==1) ?
? ? ? ? ? ? ? ? ? { ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? if(paa->date==boys) ?
? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cout<<"delete ? A:"<<paa->date<<" ? "; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(paa==pa) ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pa=pa->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ahead=pa; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa->front->next=paa->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa->next->front=paa->front; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paaa=paa; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa=paa->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delete ? paaa; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa->front->next=paa->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa->next->front=paa->front; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paaa=paa; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa=paa->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? delete ? paaa; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? paa=paa->next; ?
? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? boy=0; ?
? ? ? ? ? ? ? ? ? if(paaaa==pa) ?
? ? ? ? ? ? ? ? ? ? ? ? ? pa=pa->next; ?
? ? ? ? ? } ?
? ? ? ? ? cout<<endl; ? ? ? ? ? ? ? ? ? ? ?
? }
int ? main() ?
? { ?
? ? ? ? ? NODE ? *A,*pHeadA,*B,*pHeadB; ?
? ? ? ? ? A=new ? NODE; ?
? ? ? ? ? B=new ? NODE; ?
? ? ? ? ? pHeadA=A; ?
? ? ? ? ? pHeadB=B; ?
? ? ? ? ? for(int ? i=1;i<21;++i) ? ? ? ? ? ? //生成鏈表A,并賦初值! ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? A->date=i; ?
? ? ? ? ? ? ? ? ? A->next=new ? NODE; ?
? ? ? ? ? ? ? ? ? A->next->front=A; ?
? ? ? ? ? ? ? ? ? A=A->next; ?
? ? ? ? ? } ?
? ? ? ? ? A=A->front; ?
? ? ? ? ? delete ? A->next; ?
? ? ? ? ? A->next=pHeadA; ?
? ? ? ? ? pHeadA->front=A; ?
? ? ? ? ? ?
? ? ? ? ? for(int ? i=1;i<33;i+=2) ? ? ? ? //生成鏈表B,并賦初值! ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? B->date=i; ?
? ? ? ? ? ? ? ? ? B->next=new ? NODE; ?
? ? ? ? ? ? ? ? ? B->next->front=B; ?
? ? ? ? ? ? ? ? ? B=B->next; ?
? ? ? ? ? } ?
? ? ? ? ? B=B->front; ?
? ? ? ? ? delete ? B->next; ?
? ? ? ? ? B->next=pHeadB; ?
? ? ? ? ? pHeadB->front=B; ?
? ? ? ? ? ?
? ? ? ? ? redel(pHeadA,pHeadB); ? ? ? ? //調用函數刪除相同結點! ?
}
4. C++里面如何聲明const void f(void)函數為C程序中的庫函數(華為)
?
11下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
5.把一個鏈表反向? 填空?? (lucent)
void reverse(test* head)
{
test* pe = head;
test* ps = head->next;
while(ps)
{
pe->next = ps->next;
ps->next = head;
head = ps;
ps = pe->next;
}
}
從第一個元素開始,ps指向他,將他(ps)指向頭節點(ps->next = head),將ps設為頭節點(head = ps;)操作下一個元素(ps = pe->next;)等于是依次將每個元素翻到原頭節點前面。
?
【Sony筆試題】
25.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include <stdio.h>
#define N 8
int main()
{ int i;
int j;
int k;
?? ---------------------------------------------------------
?
?? |???????????????????????????????????? |
?
?? |???????????????????????????????????? |
?
?? |???????????????????????????????????? |
?
?? ---------------------------------------------------------
?? return 0;
}
?
【北電】
昨天筆試共5道題目:
1.英譯漢 ,關于ITU和CCITT的
2.漢譯英,關于VMware的
3.兩個有序數組的合并,寫一個完整的程序
4.填空題,排序二叉樹節點的刪除,5個空
5.調試題,多線程文件的讀寫,編譯沒有錯誤,請找出至少三個bug.
翻譯只占10分,后面三道每道30
?
?
1.實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,寫出這兩個函數。
2.寫一個函數,將其中的/t都轉換成4個空格。
3.Windows程序的入口是哪里?寫出Windows消息機制的流程。
4.如何定義和實現一個類的成員函數為回調函數?
5.C++里面是不是所有的動作都是main()引起的?如果不是,請舉例。
6.C++里面如何聲明const void f(void)函數為C程序中的庫函數?
7.下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
8.內聯函數在編譯時是否做參數類型檢查?
void g(base & b){
b.play;
}
void main(){
son s;
g(s);
return;
}?
1,程序設計(可以用自然語言來描述,不編程):C/C++源代碼中,檢查花括弧(是"("與
")","{"與"}")是否匹配,若不匹配,則輸出不匹配花括弧所在的行與列。
2,巧排數字,將1,2,...,19,20這20個數字排成一排,使得相鄰的兩個數字之和為一個素數,且
首尾兩數字之和也為一個素數。編程打印出所有的排法。
3,打印一個N*N的方陣,N為每邊字符的個數( 3〈N〈20),要求最外層為"X",第二層為"Y",從第三層起每層依次打印數字0,1,2,3,...
例子:當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++最后幾個大題目是
1.實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,這兩個函數。(北電重復)
2.寫一個函數將其中的/t都轉換成4個空格。
3.Windows程序的入口是哪里?寫出windows消息機制的流程。
4.如何定義和實現一個類的成員函數為回調函數。
還有前面的幾個:
1. class A{
int a;
int b;
}
問的是編譯時的default constructor function的問題。
還有一個說,A有其他自己定義的構造函數,問是否還有default constructor function
還是什么來著,記不清樂。
2.C++里面是不是所有的動作都是main()引起的?如果不是,請舉例。
3.C++里面如何聲明const void f(void)函數為C庫函數?(這個我前幾天還看來著,
居然就忘記樂, )
對了,還考樂一些關于const的問題
問下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
還有一個是考類的成員函數是 void f() const;型的時候調用的問題。
幸好昨天剛剛看樂這部分的內容,呵呵
內聯函數考了一題,問內聯函數在編譯時是否做參數類型檢查。
虛函數也考了一題,不過不難。
class base{
public:
virtual void play(){
cout<<"base";
}
}
class son: public base{
public:
void play(){cout<<"son";}
}
void g(base & b){
b.play;
}
void main(){
son s;
g(s);
return;
}
?
【intel筆試題面試題】
【2005筆試 】
1.高效的內存管理
2.8皇后問題
【面試】
(2) 編譯中的問題:全局變量如int i=5; int*(pf)()=foo;分別在何時被初始化?設計時候如何具體的實現。
(3) OS相關的問題,內存訪問,cache等(包括cache在整個系統中的位置,畫出來,并解釋)
(4) 解釋例如mov ax,100H 這樣一條指令的cpu, os, memory等都完成了什么樣的工作。
(5) Strlen()的C語言實現,不能使用任何變量。
(6) 編譯中display表的一些問題
(7) 一個hash函數,輸入隨機,現發生沖突,如數據集中在某幾條中,問怎樣處理hash函數保證高效的訪問,怎樣實現?
(8) 把Switch()case…語句翻譯成三元組。
(9) 一個byte(用C語言實現計數其中1的個數),給出最高效的實現方法。(位域)或者查表最快的;
(10) 上海有多少個加油站?你是怎樣解決這一問題?
(11) C語言參數的入棧順序?為什么這么實現?
(12) 你的最大的優點和缺點分別是什么?
(13) C語言中字符串的翻轉,最高效率(時間和空間)的實現?
【2005年騰訊】
選擇題(60)?
??c/c++?os?linux?方面的基礎知識?c的Sizeof函數有好幾個!?
程序填空(40)?
1.(20)?4空x5?
??不使用額外空間,將?A,B兩鏈表的元素交叉歸并?
2.(20)?4空x5?
MFC??將樹序列化?轉存在數組或?鏈表中!
?
1.請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句
//這樣轉向定義應該不算違規吧!^_^
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
?
#define Cmp(x,y) compare(x,y)
?
int compare( int a, int b)
{
???? a^=(1<<31); b^=(1<<31);
???? int i=31;
??? while ((i^-1) && !((a&(1<<i))^(b&(1<<i))))???? i--;
???? return (i^-1)?(((a>>i)&1)?1:-1):0;
}
?
int _tmain()
{
???? int c;
???? c = Cmp(5,4);
???? cout<<c<<endl;
???? return 0;
}
#define ? COMPARE(a,b) ? ((a)-(b)) ? ? ? ? //<0: ? a<b ? =0:a==b>0:a>b??
2.如何輸出源文件的標題和目前執行行的行數
cout ? << ? "Filename ? " ? << ? __FILE__ ? << ? " ? Line ? " ? << ? __LINE__ ? << ? endl;
3.兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法
?算法提示:
???? ????輸入 string a, string b; 計算string c=a*b;返回 c;
1, ??紀錄小數點在a,b中的位置l1,l2, 則需要小數點后移動位置數為l=length(a)+length(b)-l1-l2-2;
2, ??去掉a,b中的小數點,(a,b小數點后移,使a,b變為整數)
3, ??計算c=a*b; (同整數的大數相乘算法)
4, ??輸出c,(注意在輸出倒數第l個數時,輸出一個小數點。若是輸出的數少于l個,就補0)
du51(郁郁思揚)的答案:
變為整數求就行了.輸入的時候記一下,小數點位置..輸出再做點文章就行了.
下面的是大整數的運算.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
?? int data;
?? Node *next;
};
void output(Node *head)
{
?? if(!head->next&&!head->data)return;
?? output(head->next);
?? cout<<head->data;
}
void Mul(char *a,char *b,int pos)????????
{
?? char *ap=a,*bp=b;
?? Node *head=0;
?? head=new Node;head->data=0,head->next=0;?? //頭
?? Node *p,*q=head,*p1;
?? int temp=0,temp1,bbit;
?? while(*bp)??????????????? //若乘數不為空 ,繼續.
?? {
?????? p=q->next;p1=q;
?????? bbit=*bp-48;????????? //把當前位轉為整型
?????? while(*ap||temp)??????????? //若被乘數不空,繼續
?????? {
?????????? if(!p)??????????? //若要操作的結點為空,申請之
?????????? {
?????????????? p=new Node;
?????????????? p->data=0;
?????????????? p->next=0;
?????????????? p1->next=p;
?????????? }
?????????? if(*ap==0)temp1=temp;
?????????? else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
?????????? p1->data=temp1%10;??? //留當前位
?????????? temp=temp1/10;??? //進位以int的形式留下.
?????????? p1=p;p=p->next;???????????????? //被乘數到下一位
?????? }
?????? ap=a;bp++;q=q->next;??????????????? //q進下一位
?? }
?? p=head;
?? output(p);?????????????????? //顯示
?? cout<<endl;
?? while(head)???????????????? //釋放空間
?? {
?????????? p=head->next;
?????????? delete head;
?????????? head=p;
?? }
}
int main()
{
?? cout<<"請輸入兩個數"<<endl;
?? char test1[MAX],test2[MAX];
?? cin.getline(test1,MAX,'/n');
?? cin.getline(test2,MAX,'/n');
?? Mul(strrev(test1),strrev(test2));
?? system("PAUSE");
?? return 0;
}
上面大整數已經寫了.你加幾個東西就行了.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
?? int data;
?? Node *next;
};
void output(Node *head,int pos)
{
?? if(!head->next&&!head->data)return;
?? output(head->next,pos-1);
?? cout<<head->data;
?? if(!pos)cout<<".";
}
void Mul(char *a,char *b,int pos)????????
{
?? char *ap=a,*bp=b;
?? Node *head=0;
?? head=new Node;head->data=0,head->next=0;?? //頭
?? Node *p,*q=head,*p1;
?? int temp=0,temp1,bbit;
?? while(*bp)??????????????? //若乘數不為空 ,繼續.
?? {
?????? p=q->next;p1=q;
?????? bbit=*bp-48;????????? //把當前位轉為整型
?????? while(*ap||temp)??????????? //若被乘數不空,繼續
?????? {
?????????? if(!p)??????????? //若要操作的結點為空,申請之
?????????? {
?????????????? p=new Node;
?????????????? p->data=0;
?????????????? p->next=0;
?????????????? p1->next=p;
?????????? }
?????????? if(*ap==0)temp1=temp;
?????????? else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
?????????? p1->data=temp1%10;??? //留當前位
?????????? temp=temp1/10;??? //進位以int的形式留下.
?????????? p1=p;p=p->next;???????????????? //被乘數到下一位
?????? }
?????? ap=a;bp++;q=q->next;??????????????? //q進下一位
?? }
?? p=head;
?? output(p,pos);?????????????????? //顯示
?? cout<<endl;
?? while(head)???????????????? //釋放空間
?? {
?????????? p=head->next;
?????????? delete head;
?????????? head=p;
?? }
}
int main()
{
?? cout<<"請輸入兩個數"<<endl;
?? char test1[MAX],test2[MAX],*p;
?? int pos=0;
?? cin.getline(test1,MAX,'/n');
?? cin.getline(test2,MAX,'/n');
?? if(p=strchr(test1,'.'))
?? {
?????? pos+=strlen(test1)-(p-test1)-1;
?????? do
?????? {
?????????? p++;
?????????? *(p-1)=*p;
?????? }while(*p);
?? }???????
?? if(p=strchr(test2,'.'))
?? {
?????? pos+=strlen(test2)-(p-test2)-1;
?????? do
?????? {
?????????? p++;
?????????? *(p-1)=*p;
?????? }while(*p);
?? }???
?? Mul(strrev(test1),strrev(test2),pos);
?? system("PAUSE");
?? return 0;
}
4.寫一個病毒
cout<<"一個病毒"<<endl;
(開玩笑的,沒搞過,^_^)
?
5.讓你在100000000個浮點數中找出最大的10000個,要求時間復雜度優。
//本算法使用快排,O(n*lg(n))?
//最低可以找到線性算法,使用預先區域統計劃分!類試于構造Quad Trees!寫起來代碼會長些!
#include <stdio.h>
#include <stdlib.h>
?
#define Max 100000000
int a[Max+10];
?
int cmp( const void *a, const void *b)
{
???? int *x = ( int *) a;
???? int *y = ( int *) b;
???? return *x-*y;
}
?
int main()
{
???? int n=0;
???? while (scanf("%d",&a[n])==1)???? n++;
???? qsort(a,n,4,cmp);
???? for ( int i=0;i<3;i++)???? printf("%d",a[ i ]);
???? return 1;
}
5.有 A、 B 、 C 、 D四個人,要在夜里過一座橋。他們通過這座橋分別需要耗時 1 、 2、 5 、 10 分鐘,只有一支手電,并且同時最多只能兩個人一起過橋。請問,如何安排,能夠在 17分鐘內這四個人都過橋?
Solution:關鍵是時間最長的兩個人必須同時過橋
Total Time Cost: ?? (1+2)+(10+2)+2=17 minutes
1.請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句 ?
2.如何輸出源文件的標題和目前執行行的行數 ?
3.兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法 ?
4.寫一個病毒
?
【微軟】
智力題
1.燒一根不均勻的繩子,從頭燒到尾總共需要1個小時,問如何用燒繩子的方法來確定半小時的時間呢?
2.10個海盜搶到了100顆寶石,每一顆都一樣大小且價值連城。他們決定這么分:
(1)抽簽決定自己的號碼(1~10);
(2)首先,由1號提出分配方案,然后大家表決,當且僅當超過半數的人同意時,按照他的方案進行分配,否則將被扔進大海喂鯊魚;
(3)如果1號死后,再由2號提出分配方案,然后剩下的4個人進行表決,當且僅當超過半數的人同意時,按照他的方案進行分配,否則將被扔入大海喂鯊魚;
(4)依此類推……
條件:每個海盜都是很聰明的人,都能很理智地做出判斷,從而做出選擇。
問題:第一個海盜提出怎樣的分配方案才能使自己的收益最大化?
3.為什么下水道的蓋子是圓的?
4.中國有多少輛汽車?
5.你讓工人為你工作7天,回報是一根金條,這根金條平分成相連的7段,你必須在每天結束的時候給他們一段金條。如果只允許你兩次把金條弄斷,你如何給你的工人付費?
6.有一輛火車以每小時15公里的速度離開北京直奔廣州,同時另一輛火車以每小時20公里的速度從廣州開往北京。如果有一只鳥,以30公里每小時的速度和兩輛火車同時啟動,從北京出發,碰到另一輛車后就向相反的方向返回去飛,就這樣依次在兩輛火車之間來回地飛,直到兩輛火車相遇。請問,這只鳥共飛行了多長的距離?
7.你有兩個罐子以及50個紅色彈球和50個藍色彈球,隨機選出一個罐子,隨機選出一個彈球放入罐子,怎樣給出紅色彈球最大的選中機會?在你的計劃里,得到紅球的幾率是多少?
8.想像你站在鏡子前,請問,為什么鏡子中的影像可以左右顛倒,卻不能上下顛倒呢?
9.如果你有無窮多的水,一個3公升的提捅,一個5公升的提捅,兩只提捅形狀上下都不均勻,問你如何才能準確稱出4公升的水?
10.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少次就可以確定你肯定有兩個同一顏色的果凍?
11.連續整數之和為1000的共有幾組?
12.從同一地點出發的相同型號的飛機,可是每架飛機裝滿油只能繞地球飛半周,飛機之間可以加油,加完油的飛機必須回到起點。問至少要多少架次,才能滿足有一架繞地球一周。
參考答案:
1.兩邊一起燒。
2.96,0,1,0,1,0,1,0,1,0。
3.因為口是圓的。
4.很多。
5.分1,2,4。
6.6/7北京到廣州的距離。
7.100%。
8.平面鏡成像原理(或者是“眼睛是左右長的”)。
9.3先裝滿,倒在5里,再把3裝滿,倒進5里。把5里的水倒掉,把3里剩下的水倒進5里,再把3裝滿,倒進5里,ok!
10.一次。
11.首先1000為一個解。連續數的平均值設為x,1000必須是x的整數倍。假如連續數的個數為偶數個,x就不是整數了。x的2倍只能是5,25,125才行。因為平均值為12.5,要連續80個達不到。125/262.5是可以的。即62,63,61,64,等等。連續數的個數為奇數時,平均值為整數。1000為平均值的奇數倍。10002×2×2×5×5×5;x可以為2,4,8,40,200排除后剩下40和200是可以的。所以答案為平均值為62.5,40,200,1000的4組整數。
12.答案是5架次。一般的解法可以分為如下兩個部分:
(1)直線飛行
一架飛機載滿油飛行距離為1,n架飛機最遠能飛多遠?在不是兜圈沒有迎頭接應的情況,這問題就是n架飛機能飛多遠?存在的極值問題是不要重復飛行,比如兩架飛機同時給一架飛機加油且同時飛回來即可認為是重復,或者換句話說,離出發點越遠,在飛的飛機就越少,這個極值條件是顯然的,因為n架飛機帶的油是一定的,如重復,則浪費的油就越多。比如最后肯定是只有一架飛機全程飛行,注意“全程”這兩個字,也就是不要重復的極值條件。如果是兩架飛機的話,肯定是一架給另一架加滿油,并使剩下的油剛好能回去,就說第二架飛機帶的油耗在3倍于從出發到加油的路程上,有三架飛機第三架帶的油耗在5倍于從出發到其加油的路程上,所以n架飛機最遠能飛行的距離為s1+1/3+…+1/(2n+1)這個級數是發散的,所以理論上只要飛機足夠多最終可以使一架飛機飛到無窮遠,當然實際上不可能一架飛機在飛行1/(2n+1)時間內同時給n1個飛機加油。
(2)可以迎頭接應加油
一架飛機載滿油飛行距離為1/2,最少幾架飛機能飛行距離1?也是根據不要重復飛行的極值條件,得出最遠處肯定是只有一架飛機飛行,這樣得出由1/2處對稱兩邊1/4肯定是一架飛機飛行,用上面的公式即可知道一邊至少需要兩架飛機支持,(1/3+1/5)/2>1/4(左邊除以2是一架飛機飛行距離為1/2),但是有一點點剩余,所以想像為一個滑輪(中間一個飛機是個繩子,兩邊兩架飛機是個棒)的話,可以滑動一點距離,就說加油地點可以在一定距離內變動(很容易算出來每架飛機的加油地點和加油數量,等等)
數學篇
1.1000!有幾位數,為什么?
2.F(n) 1 n>8 n<12
F(n) 2 n<2
F(n) 3 n 6
F(n)4 n other
使用+ * /和sign(n)函數組合出F(n)函數
sign(n) 0 n 0
sign(n)1 n<0
sign(n) 1 n>0
3.編一個程序求質數的和,例如F(7) 1+3+5+7+11+13 +17 57。
?
?邏輯推理題
1.此題源于1981年柏林的德國邏輯思考學院,98%的測驗者無法解答此題。
有五間房屋排成一列;所有房屋的外表顏色都不一樣;所有的屋主來自不同的國家;所有的屋主都養不同的寵物;喝不同的飲料;抽不同的香煙。
(1)英國人住在紅色房屋里;(2)瑞典人養了一只狗;(3)丹麥人喝茶;(4)綠色的房子在白色的房子的左邊;(5)綠色房屋的屋主喝咖啡;(6)吸Pall Mall香煙的屋主養鳥;(7)黃色屋主吸Dunhill香煙;(8)位于最中間的屋主喝牛奶;(9)挪威人住在第一間房屋里;(10)吸Blend香煙的人住在養貓人家的隔壁;(11)養馬的屋主在吸Dunhill香煙的人家的隔壁;(12)吸Blue Master香煙的屋主喝啤酒;(13)德國人吸Prince香煙;(14)挪威人住在藍色房子隔壁;(15)只喝開水的人住在吸Blend香煙的人的隔壁
問:誰養魚?
提示:首先確定
房子顏色:紅、黃、綠、白、藍 Color 1 2 3 4 5
國籍:英、瑞、丹、挪、德=> Nationality 1 2 3 4 5
飲料:茶、咖、奶、酒、水=> Drink 1 2 3 4 5
煙:PM、DH、BM、PR、混=> Tobacco 1 2 3 4 5
寵物:狗、鳥、馬、貓、魚=> Pet 1 2 3 4 5
然后有:
(9)=>N1=挪威
(14)=>C2=藍
(4)=>如C3=綠,C4=白,則(8)和(5)矛盾,所以C4=綠,C5=白
剩下紅黃只能為C1,C3
(1)=>C3=紅,N3=英國,C1=黃
(8)=>D3=牛奶
(5)=>D4=咖啡
(7)=>T1=DH
(11)=>P2=馬
那么:
挪威 ? 英國 ? ?
黃 藍 紅 綠 白
? ? 牛奶 咖啡 ?
DH ? ? ? ?
? 馬 ? ? ?
(12)=>啤酒只能為D2或D5,BM只能為T2或T5=>D1=礦泉水
(3)=>茶只能為D2或D5,丹麥只能為N2或N5
(15)=>T2=混合煙=>BM=T5,
所以剩下啤酒=D5,茶=T2=>丹麥=D2
然后:
挪威 丹麥 英國 ? ?
黃 藍 紅 綠 白
礦泉水 茶 牛奶 咖啡 啤酒
DH 混合煙 ? ? BM
? 馬 ? ? ?
(13)=>德國=N4,PR=T4
所以,瑞典=N5,PM=T3
(2)=>狗=P5
(6)=>鳥=P3
(10)=>貓=P1
得到:
挪威 丹麥 英國 德國 瑞典
黃 藍 紅 綠 白
礦泉水 茶 牛奶 咖啡 啤酒
DH 混合煙 PM PR BM
貓 馬 鳥 ? 狗
所以,最后剩下的魚只能由德國人養了。
?
?
2.
. . .
. . .
. . .
請僅用一筆畫四根直線,將上圖9個點全部連接。
3.對一批編號為1~100全部開關朝上(開)的燈進行以下操作:
凡是1的倍數反方向撥一次開關;2的倍數反方向又撥一次開關;3的倍數反方向又撥一次開關……
問:最后為關熄狀態的燈的編號。
微軟招聘總經理助理的三道面試題
1.某手機廠家由于設計失誤,有可能造成電池壽命比原來設計的壽命短一半(不是沖放電時間),解決方案就是更換電池或給50元購買該廠家新手機的折換券。請給所有已購買的用戶寫信告訴解決方案。
2.一高層領導在參觀某博物館時,向博物館館員小王要了一塊明代的城磚作為紀念,按國家規定,任何人不得將博物館收藏品變為私有。博物館館長需要如何寫信給這位領導,將城磚取回?
3.王小姐由于工作失誤,將2萬元的筆記本電腦以1.2萬元錯賣給李先生,王小姐的經理應該怎么寫信給李先生將錢要回?
??
英文面試題目
1. Algorithms
* What’s the difference between a linked list and an array?
* Implement an algorithm to sort a linked list. Why did you pick the method you did?
* Implement an algorithm to sort an array. Why did you pick the method you did?
* Implement strstr() (or some other string library function).
* Reverse a string. Optimize for speed. Optimize for space.
* Count the number of set bits in a number. Now optimize for speed. Now optimize for size.
* How would you find a cycle in a linked list?
* Give me an algorithm to shuffle a deck of cards, given that the cards are stored in an array of ints.
*Write a function that takes in a string parameter and checks to seewhether or not it is an integer, and if it is then return the integervalue.
* Write a function to print all of the permutations of a string.
* Implement malloc.
* Write a function to print the Fibonacci numbers.
* Write a function to copy two strings, A and B. The last few bytes of string A overlap the first few bytes of string B.
* How would you print out the data in a binary tree, level by level, starting at the top?
2. Applications
*How can computer technology be integrated in an elevator system for ahundred story office building? How do you optimize for availability?How would variation of traffic over a typical work week or floor ortime of day affect this?
* How would you redesign an ATM?
* Suppose we wanted to run a microwave oven from the computer. What kind of software would you write to do this?
* How would you design a coffee-machine for an automobile.
3. Thinkers
* How are M&Ms made?
* If you had to learn a new computer language, how would you go about doing it?
* If MS told you we were willing to invest $5 million in a start up of your choice, what business would you start? Why?
*If you could gather all of the computer manufacturers in the worldtogether into one room and then tell them one thing that they would becompelled to do,what would it be?
* Explain a scenario for testing a salt shaker.
* If you are going to receive an award in 5 years, what is it for and who is the audience?
* How would you explain how to use Microsoft Excel to your grandma?
*Why is it that when you turn on the hot water in any hotel, forexample, the hot water comes pouring out almost instantaneously?
?
微軟亞洲技術支持中心面試題目
1.進程和線程的差別。
2.Heap與stack的差別。
3.Windows下的內存是如何管理的?
4.介紹.Net和.Net的安全性。
5.客戶端如何訪問.Net組件實現Web Service?
6.C/C++編譯器中虛表是如何完成的?
7.談談COM的線程模型。然后討論進程內/外組件的差別。
8.談談IA32下的分頁機制。
9.給兩個變量,如何找出一個帶環單鏈表中是什么地方出現環的?
10.在IA32中一共有多少種辦法從用戶態跳到內核態?
11.如果只想讓程序有一個實例運行,不能運行兩個。像winamp一樣,只能開一個窗口,怎樣實現?
12.如何截取鍵盤的響應,讓所有的‘a’變成‘b’?
13.Apartment在COM中有什么用?為什么要引入?
14.存儲過程是什么?有什么用?有什么優點?
15.Template有什么特點?什么時候用?
16.談談Windows DNA結構的特點和優點。
微軟研究院筆試題目
1.#include <stdio.h>
#include <String.h>
class CBuffer
{
char * m_pBuffer;
int m_size;
publc:
CBuffer()
{
m_pBuffer=NULL;
}
~CBuffer()
{
Free();
}
void Allocte(int size)
{
m_size=size;
m_pBuffer= new char[size];
}
private:
void Free()
{
if(m_pBuffer!=NULL)
{
delete m_pBuffer;
m_pBuffer=NULL;
}
}
public:
void SaveString(const char* pText) const
{
strcpy(m_pBuffer, pText);
char* GetBuffer() const
{
return m_pBuffer;
}
};
void main (int argc, char* argv[])
{
cBuffer buffer1;
buffer1.SaveString(“Microsoft”);
printf(buffer1.GetBuffer());
}
}
找出Allocate, SaveString, main的錯誤。
2.打印“Welcome MSR Asia”
#include <stdio.h>
#include <string.h>
char * GetName (void)
{
//To return “MSR Asia” String
char name[]=“MSR Asia”;
return name;
}
void main(int argc, char* argv[])
{
char name[32];
//Fill in zeros into name
for(int i=0;i<=32;i++)
{
name[1]=‘/0‘;
}
//copy “Welcome” to name
name=“Welcome”;
//Append a blank char
name[8]=”;
//Append string to name
strcat(name,GetName());
//print out
printf(name);
}
找出程序中的錯誤。
3.#include <stdio.h>
class A
{
public:
void FuncA()
{
printf(“FuncA called/n”);
}
virtual void FuncB()
{
printf(“FuncB called/n”);
}
};
class B: public A
{
public:
void FuncA()
{
A::FuncA();
printf(“FuncAB called/n”);
}
virtual void FuncB()
{
printf(“FuncBB called/n”);
}
};
void main(void)
{
B b;
A *pa;
pa=&b;
A *pa2=new A;
b.FuncA();
b.FuncB();
pa->FuncA();
pa->FuncB();
pa2->FuncA();
pa2->FuncB();
delete pa2;
}
What is the output of the above program?
4.#include <stdio.h>
#include <string.h>
int FindSubString(char* pch)
{
int count=0;
char* p1=pch;
while(*p1!=‘/0’)
{
if(*p1==p1[1]-1)
{
p1++;
count++;
}
else
{
break;
}
}
int count2=count;
while(*p1!=‘/0’)
{
if(*p1!==p1[1]+1)
{
p1++;
count2--;
}
else
{
break;
}
if(count2==0)
return count;
return 0;
}
void ModifyString(char* pText)
{
char* p1=pText;
char* p2=p1;
while(*p1!=‘/0’)
{
int count=FindSubString(p1);
if(count>0)
{
*p2++=*p1;
sprintf(p2, “%I”, count);
while(*p2!= ‘/0’)
{
p2++;
}
p1+=count+count+1;
}
else
{
*p2++=*p1++;
}
}
}
void main(void)
{
char text[32]=“XYBCDCBABABA”;
ModifyString(text);
printf(text);
}
In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?
??
微創筆試題目(微創,微軟在中國的合資公司)
1.上海的蘇州河由于遭受多年的工業污染,一直是條臭水溝。上海市政府下了很大決心清理蘇州河,你覺得需要幾年能讓河水變清?你的依據是什么?
2.找出字符串A中包含的字符可以進行的所有不同組合。例如:abccd中,ab,ac,bc,cc,abd等都是可能的組合。(請用C/C++編程,不允許上機操作)
3.請估算月球的體積。
4.經常去的技術網站,請舉例。
5.對軟件開發過程的理解。
6.上海有多少外籍和港澳臺人士?你的依據是什么?(不得引用政府和調研機構數據)
7.字符串A是由n個小寫英文字母(a ~ z)構成的,定義為char A[n]。你能用更少的空間表示這個字符串嗎?請寫出從char A[n]到你的新的儲存格式的轉換函數。(請用C/C++編程,不允許上機操作)
8.哈希表和數組的定義,區別,優缺點。
9.用遞歸實現菲波列數列。
10.用dhtml寫頁面。
11.一樓到十樓的每層電梯門口都放著一顆鉆石,鉆石大小不一。你乘坐電梯從一樓到十樓,每層樓電梯門都會打開一次,只能拿一次鉆石,問怎樣才能拿到最大的一顆? (去年應聘到微創的S小姐面試遇到的就是這道智力題。她的回答是:選擇前五層樓都不拿,觀察各層鉆石的大小,做到心中有數。后五層樓再選擇,選擇大小接近前五層樓出現過最大鉆石大小的鉆石。她至今也不知道這道題的準確答案,“也許就沒有準確答案,就是考一下你的思路,”她如是說。)
12.U2合唱團在17分鐘內得趕到演唱會場,途中必需跨過一座橋,四個人從橋的同一端出發,你得幫助他們到達另一端,天色很暗,而他們只有一只手電筒。一次同時最多可以有兩人一起過橋,而過橋的時候必須持有手電筒,所以就得有人把手電筒帶來帶去,來回橋兩端。手電筒是不能用丟的方式來傳遞的。四個人的步行速度各不同,若兩人同行則以較慢者的速度為準。Bono需花1分鐘過橋,Edge需花2分鐘過橋,Adam需花5分鐘過橋,Larry需花10分鐘過橋。他們要如何在17分鐘內過橋呢?(有個同濟的學生寫文章說他當時在微軟面試時就是碰到了這道題,最短只能做出在19分鐘內過橋,微軟的人對他講這樣的結果已經是不錯的了!)
13.燒一根不均勻的繩要用一個小時,如何用它來判斷半個小時?(參考答案:兩邊一起燒)
14.為什么下水道的蓋子是圓的?(從復旦大學一位計算機系教授那里聽來的答案:因為如果是方的、長方的或橢圓的,那無聊之徒拎起來它就可以直接扔進地下道啦!但圓形的蓋子嘛,就可以避免這種情況了)
15.有7克、2克砝碼各一個,天平一只,如何只用這些物品三次將140克的鹽分成50、90克各一份?
Intel筆試面試題目
智力題
1.每天中午從法國塞納河畔的勒阿佛有一艘輪船駛往美國紐約,在同一時刻紐約也有一艘輪船駛往勒阿佛。已知橫渡一次的時間是7天7夜,輪船勻速航行,在同一航線,輪船近距離可見。
請問今天中午從勒阿佛開出的船會遇到幾艘從紐約來的船?
2.巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世時某年年齡的平方,問:他是哪年出生的?
答案:
設他在世時某年年齡為x,則x的平方<1945,且x為自然數。其出生年份x的平方xx(x1),他在世年齡1945x(x1)。1945的平方根44.1,則x應為44或略小于此的數。而x44時,x(x1)44×431892,算得其在世年齡為1945189253;又x43時,x(x1)43×421806,得其在世年齡為19451806139;若x再取小,其在世年齡越大,顯然不妥。故x44,即他出生于1892年,終年53歲。
3.
(圖形描述:一個各邊相等的十字圖案)
上圖中各邊相等,要求:用最少的分割,拼成一個正方形。
筆試題目
1.設計一個重采樣系統,說明如何anti-alias。
2.y1(n)x(2n),y2(n)x(n/2),問:
如果y1為周期函數,那么x是否為周期函數?
如果x為周期函數,那么y1是否為周期函數?
如果y2為周期函數,那么x是否為周期函數?
如果x為周期函數,那么y2是否為周期函數?
3.如果模擬信號的帶寬為5kHz,要用8k的采樣率,怎么辦。
4.某個程序在一個嵌入式系統(200M的CPU,50M的SDRAM)中已經最優化了,換到另一個系統(300M的CPU,50M的SDRAM)中運行,還需要優化嗎?
5.x^4+a*x^3+x^2+c*x+d最少需要做幾次乘法。
6.三個float:a,b,c
問值:
(a+b)+c(b+a)+c
(a+b)+c(a+c)+b
7.把一個鏈表反向填空。
8.下面哪種排序法對12354最快? 。
A. quick sort
B. buble sort
C. merge sort
9.哪種結構平均來講獲取一個值最快? 。
A. binary tree
B. hash table
C. stack
10.
#include “stdafx.h”
#include <iostream.h>
struct bit
{ int a:3;
int b:2;
int c:3;
};
int main(int argc, char* argv[])
{ bit s;
char *c = (char*)&s;
*c = 0x99;
cout << s.a <<endl <<s.b<<endl<<s.c<<endl;
return 0;
}
Output:?
11.
挑bug,在linux下運行:
#include <stdio.h>
char *reverse(char* str)
{
int len=0, i=0;
char *pstr=str, *ptemp,*pd;
while(*++pstr)
len++;
pstr--;
//ptemp=(char*)malloc(len+1);
ptemp=(char*)malloc(len+1);
pd=ptemp;
while(len--){
*ptemp=*pstr;
ptemp++;
pstr--;
i++;
}
*ptemp=*pstr;
ptemp++;
*ptemp=‘/0’;
return pd;
}
main()
{
char string[40]= “Hello World!”;
char *pstr=string;
printf(“%s”, pstr);
printf(“%s”, reverse(pstr));
}
?1.寫出下列信號的奈虧斯特頻率
(1)f(t)1cos(2000pait)sin(4000pait)
(2)f(t)sin(4000pait)/pait
(3)f(t)(sin(4000pait)的平方)/pait
2.有兩個線程
void producer()
{
while(1)
{
GeneratePacket();
PutPacketIntoBuffer();
Signal(customer);
}
}
void customer()
{
while(1)
{
WaitForSignal();
if(PacketInBuffer>10)
{
ReadAllPackets();
ProcessPackets();
}
}
}
(1)有沒有其他方法可以提高程序的性能
(2)可不可以不使用信號之類的機制來實現上述的功能
3.優化下面的程序
(0)sum0
(1)I1
(2)T14*I
(3)T2address(A)4
(4)T3T2[T1]
(5)T4address(B)4
(6)T54*I
(7)T6T4[T5]
(8)T7T3*T5
(9)sumsum+T6
(10)II+1
(11)IF I<20 GOTO (2)
面試題目
1.下面這段代碼不符合Pipeline要求,請你改動一下
if(a>b)
i0;
else
i1;
2.對于運行在ring3上的這個指令,請你指出CPU和操作系統分別參與了哪部分操作?
mov eax, [0x12345678]
3.如果有一個芯片,只是裸機,如何寫它的操作系統?最難的部分在哪兒?如何解決?
4.如何寫一個主板的BIOS?
5.沒有操作系統來給你完成它的一些初始化工作,如何寫出PCI的driver?
Intel 2004北京筆試題
問答題
1.你覺得C程序中為什么會有main(),有沒有想過exit,return,或什么都不做也可以讓程序正常終止?
2.TOTAL個人圍一圈,從1開始數到N,誰數到N出圈,下一個人繼續從1開始數,返回最后一個出局的人。
#define TOTAL 15;
int xxxx(int N)
{
int ring[TOTAL] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1} //全是1
int nextstart = 0, counter=0;
for (i =1; i<TOTAL; i++){
counter = 0;
while(counter <N) {
if (_______________)
( ;)
else
(____________;)
}
ring[nextstart]=0
}
return nextstart +1;
}
3.列舉Intel四種架構
4.概率題
(1)x, y為隨機變量,聯合概率密度f(x,y)  intig(0,1)* dx*intig(0,x)*k*dy,k為常數,求k? E(xy) ?
注:intig(a,b)為a到b的定積分。
(2)A,B為隨機事件,以下哪個正確。
A.P(A U B)*p(AB) < P(A)P(B)
B.P(A U B)*p(AB) > P(A)P(B)
C.P(A U B)*p(AB) < P(A) + P(B)
D.P(A U B)*p(AB) > P(A) + P(B)
5.信道帶寬200kHz,信噪比10dB,求信道波特率?
6.以下代碼運行結果是 。
int main()
{
int a,b,c,abc = 0;
a=b=c=40;
if(c)
{
int abc;
abc = a*b+c;
}
printf(“%d,%d”, abc, c);
return 0;
}
7.給出了從紐約出發和到達洛杉機的各種航班信息,寫出找到一條從紐約到洛杉機的最短距離的航班組合的代碼。
8.從計算機圖形上截取某個物體邊緣的若干個坐標,求這個物體的面積,并判斷是方形還是圓形,說明原因。
9.離散卷機與DFT的區別與關系。快速求出不滿足2^N長度的離散傅立葉變換的方法有哪些?如何用fft求N*M點的離散卷機?
10.給出fir和iir的優缺點。
11.如何計算線性標量量化器的量化噪聲?需要哪些假設?
IBM
IBM筆試題目
字母矩陣題目(15分鐘)
給你一個矩陣:
(一) (二) (三) (四) (五)
1 a b c d e
2 b c a e d
3 c b e a d
4 c e d b a
5 e d a c b
回答以下問題。
(1)將第一行和第四行交換后,第一行第四個字母下面的左邊的下面的右邊的字母是 。(簡單)
(2)將所有出現在d左邊的字母從矩陣中刪掉。將所有出現在a左邊的c字母從矩陣中刪掉。如果矩陣中剩下的字母的種類的數目大于3,答案為原矩陣中左上方至右下方對角線上出現兩次的字母。如果矩陣中剩下的字母的種類的數目小于或者等于3,答案為原矩陣中右上至左下對角線上出現4次的字母是 。
(3)將所有的a用4替換,所有的d用2替換,哪一列的總和最大
①第1列 ②第2列 ③第3列 ④第4列 ⑤第五列
(4)從左上角的字母開始,順時針沿矩陣外圍,第4次出現的字母是。
①a ②b ③c ④d ⑤e
(5)沿第5列從上到下,接著沿第3列從下到上,接著沿第4列從上到下,接著沿第1列從下到上,接著沿第2列從上到下,第1個出現5次的字母是 。
①a ②b ③c ④d ⑤e
(6)從左上角的字母開始,順時針沿矩陣外圍,第4次出現的字母是以下哪個。
①a ②b ③c ④d ⑤e
智力題
1.有50家人家,每家一條狗。有一天警察通知,50條狗當中有病狗,行為和正常狗不一樣。每人只能通過觀察別人家的狗來判斷自己家的狗是否生病,而不能看自己家的狗,如果判斷出自己家的狗病了,就必須當天一槍打死自己家的狗。結果,第一天沒有槍聲,第二天沒有槍聲,第三天開始一陣槍響,問:一共死了幾條狗?
1.死了3條(第幾天槍響就有幾條)。
簡單分析:從有一條不正常的狗開始,顯然第一天將會聽到一聲槍響。這里的要點是你只需站在那條不正常狗的主人的角度考慮。
有兩條的話思路繼續,只考慮有兩條不正常狗的人,其余人無需考慮。通過第一天他們了解了對方的信息。第二天殺死自己的狗。換句話說每個人需要一天的時間證明自己的狗是正常的。有三條的話,同樣只考慮那三個人,其中每一個人需要兩天的時間證明自己的狗是正常的狗。
2.已知兩個數字為1~30之間的數字,甲知道兩數之和,乙知道兩數之積,甲問乙:“你知道是哪兩個數嗎?”乙說:“不知道”。乙問甲:“你知道是哪兩個數嗎?”甲說:“也不知道”。于是,乙說:“那我知道了”,隨后甲也說:“那我也知道了”,這兩個數是什么?
2.1和4,或者4和7。
3.一個經理有三個女兒,三個女兒的年齡加起來等于13,三個女兒的年齡乘起來等于經理自己的年齡。有一個下屬已知道經理的年齡,但仍不能確定經理的三個女兒的年齡,這時經理說只有一個女兒的頭發是黑的,然后這個下屬就知道了經理的三個女兒的年齡。請問三個女兒的年齡分別是多少?為什么?
3答案:分別是2,2,9。? ???
簡單分析:
1 1 11 11 偽窮舉,呵呵
1 2 10 20
1 3 9 27
1 4 8 32
1 5 7 35
1 6 6 36
2 2 9 36在所有的可能性中,只有這兩個相同,如果經理的年齡為其他,則他下屬就可以確定?????????????三個人分別為幾歲了,所以只有兩種可能:1,6,6或者2,2,9。如果是1,6,6的話,那么兩個同樣大的6歲的孩子應該都是黑頭發,所以只有2,2,9比較合理,大的那個是黑頭發,另外兩個是黃毛丫頭
2 3 8 40
2 4 7 56
2 5 6 60
3 3 7 42
3 4 6 72
3 5 5 75
4 4 5 80
VC/C++的面試題
1、估計一下廣州有多少理發師,如果允許,你還需要那些調研工作?并給出你的推導過程。你認為你的 估算結果可信嗎?
2、看過那些軟件方面的書籍
3、什么是軟件,軟件開發包括那些步驟,并說出你對這些步驟的理解
4、OSI網絡結構的七層模型分別是什么,并說出你認為劃分為7層的理由。
5、軟件過程中了解、使用過版本控制或建模工具嗎?對你工作有什么幫助?
6、軟件過程中你都寫過什么文檔?分別是什么目的及其對你的幫助?
7、我們知道,C++將內存劃分為三個邏輯區域:堆、棧和靜態存儲,請說出它們的區別及你的理解。
8、字符串A是由n個小寫英文字母(a ~ z)構成的,定義為char A[n]。你能用更少的空間表示這個字符串嗎?請寫出從char A[n]到你的新的儲存格式的轉換函數。(請用C/C++編程,不允許上機操作)(數據結構)
12、對現在的Stack(棧)數據結構進行改進,加一個min()功能,使之能在常數,即O(1),時間內給出棧中的最小值。可對push()和pop()函數進行修改,但要求其時間復雜度都只能是O(1)。(數據結構)
9、C++構造函數為什么不能是虛函數?
10、C++中virtual與inline的含義分別是什么?虛函數的特點;內聯函數的特點;一個函數能否即是虛函數又是內聯函數?
12、請列出實現C++代碼你認為需要注意的一些問題。
11、你在原來的項目中有沒有遇到什么困難,又是如何解決的?
1 dll,lib處理實現 .lib文件中包含什么? dll在內存中被多個函數共享,有幾個拷貝? ▲?
2 template,template等編譯的時候作為幾個類▲?
3 struct ,class的區別,聯系
4 MAcro,inline區別,實現.編譯運行時▲?
5 進程與線程區別
6 hdc-cdc區別聯系▲?
7 model dialog,modeless dialog,從創建到銷毀全過程具體描述
8 各個線程new的內存,別的線程是否可以使用?
9 RUNTIME_CLASS, is what??
http://www.sinoprise.com/simple/index.php?t32.html
1. ? ? ?堆和棧的區別?
棧區(stack)- 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
堆區(heap) - 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
2. ? ? ?虛函數的本質和實現機制?
虛函數的本質就是通過基類訪問派生類定義的函數。虛函數只能借助于指針或者引用來達到多態的效果。
3. ? ? ?C++中傳遞函數參數的方式及他們的優缺點?
4. ? ? ?static關鍵字的作用?▲
5. ? ? ?引用和指針的區別?
6. ? ? ?函數重載和覆蓋的區別?
7. ? ? ?深拷貝和淺拷貝的區別?
8. ? ? ?數組a[4][3]的內存結構?并指出a[2][3]和a[3][2]在內存中的位置?▲▲▲?
9. ? ? ?包含和私有繼承的區別?▲?
10. ? ? ?實現一個操作棧的模板(empty,push,pop,),并實現錯誤處理(對空棧的pop)
11. ? ? ?ANSI和Unicode的區別?并指出C RunTime Library 和 Win32 API對他們的支持。
12. ? ? ?線程同步的四種方式的機制。▲▲▲?
13. ? ? ?虛擬內存。▲▲▲?
14. ? ? ?DLL的實現機制和DLL的輸出方式。▲▲▲?
15. ? ? ?D3D的頂點著色。?
16. ? ? ?幾種數據結構在游戲中的支持。?
17. ? ? ?游戲引擎?
服務器程序員筆試題
C++
1.簡述堆和棧的區別。
2.簡述虛函數的本質和實現機制。
3.列舉C++中向函數傳遞參數的各種方式,并比較它們之間的區別和優缺點。
4.static關鍵字有幾種用途?請簡述每種用途。
5.簡述引用和指針的異同。
6.簡述函數重載(overloading)和覆蓋(overriding)的區別。
7.什么是深拷貝?什么是淺拷貝?
8.請畫出二維數組char a[4][3]的內存結構圖,并指出a[3][2]和a[2][3]在內存中的位置。
9.簡述包含和私有繼承的異同。
10.用模板實現一個通用的棧,要求實現empty, size, push, pop, top五個成員函數,并用異常機制來報告錯誤(比如在一個大小為0的棧上執行pop操作)。▲▲▲?
標準庫
11.用string類編寫一個程序,它從標準輸入接收一行輸入,然后統計出其中單詞的個數,單詞的分隔符只有逗號、點號和空格三種。
12.簡述STL的容器container、迭代器iterator、算法algorithm和函數器functor的作用以及它們之間的關系,舉例說明。▲▲▲?
13.下面的代碼存在什么問題,如何修正?▲▲?
list list1;
for (int i = 0; i < 8; i ++) {
list1.push_back(i);
}
for (list::iterator it = list1.begin(); it != list1.end(); ++it) {
if (*it % 2 == 0) {
list1.erase(it);
}
}
Win32
14.比較ANSI和Unicode的區別,并說明C Runtime Library和Win32 API如何支持二者▲▲▲?
15.簡述線程同步的四種機制。
16.簡述虛擬內存機制,并描述在win95和winnt下內存空間的結構。
17.簡述DLL的實現機制以及輸出DLL中函數的兩種方法。
網絡
18.簡述TCP和UDP之間的區別。
19.簡述Winsock的六種主要IO處理模式。
20.描述一個你以前實現過的服務器的結構圖,并分析其中可能存在的瓶頸。
16. 關聯、聚合(Aggregation)以及組合(Composition)的區別?
涉及到UML中的一些概念:關聯是表示兩個類的一般性聯系,比如“學生”和“老師”就是一種關聯關系;聚合表示has-a的關系,是一種相對松散的關系,聚合類不需要對被聚合類負責,如下圖所示,用空的菱形表示聚合關系:
???????????????????????????
從實現的角度講,聚合可以表示為:
class A {...}? class B { A* a; .....}
而組合表示contains-a的關系,關聯性強于聚合:組合類與被組合類有相同的生命周期,組合類要對被組合類負責,采用實心的菱形表示組合關系:
???????????????????????????
實現的形式是:
class A{...} class B{ A a; ...}
參考文章:http://www.cnitblog.com/Lily/archive/2006/02/23/6860.html
????????? http://www.vckbase.com/document/viewdoc/?id=422
17.面向對象的三個基本特征,并簡單敘述之?
1. 封裝:將客觀事物抽象成類,每個類對自身的數據和方法實行protection(private, protected,public)
2.繼承:廣義的繼承有三種實現形式:實現繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實現代碼)、接口繼承(僅使用屬性和方法,實現滯后到子類實現)。前兩種(類繼承)和后一種(對象組合=>接口繼承以及純虛函數)構成了功能復用的兩種方式。
3. 多態:是將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
18. 重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區別?
常考的題目。從定義上來說:
重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
重寫:是指子類重新定義復類虛函數的方法。
從實現原理上來說:
重載:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然后這些同名函數就成了不同的函數(至少對于編譯器來說是這樣的)。如,有兩個同名函數:function func(p:integer):integer;和functionfunc(p:string):integer;。那么編譯器做過修飾后的函數名稱可能是這樣的:int_func、str_func。對于這兩個函數的調用,在編譯器間就已經確定了,是靜態的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關!
重寫:和多態真正相關。當子類重新定義了父類的虛函數后,父類指針根據賦給它的不同的子類指針,動態的調用屬于子類的該函數,這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定的(晚綁定)。
19. 多態的作用?
主要是兩個:1. 隱藏實現細節,使得代碼能夠模塊化;擴展代碼模塊,實現代碼重用;2. 接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用。
20. Ado與Ado.net的相同與不同?
除了“能夠讓應用程序處理存儲于DBMS中的數據“這一基本相似點外,兩者沒有太多共同之處。但是Ado使用OLE DB 接口并基于微軟的COM 技術,而ADO.NET擁有自己的ADO.NET 接口并且基于微軟的.NET 體系架構。眾所周知.NET 體系不同于COM 體系,ADO.NET接口也就完全不同于ADO和OLE DB 接口,這也就是說ADO.NET 和ADO是兩種數據訪問方式。ADO.net 提供對XML 的支持。
21.?New delete 與malloc free 的聯系與區別?
答案:都是在堆(heap)上進行動態的內存操作。用malloc函數需要指定內存分配的字節數并且不能初始化對象,new 會自動調用對象的構造函數。delete 會調用對象的destructor,而free 不會調用對象的destructor.
22.?#define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
答案:i 為30。
23. 有哪幾種情況只能用intialization list 而不能用assignment?
答案:當類中含有const、reference 成員變量;基類的構造函數都需要初始化表。
24.?C++是不是類型安全的?
答案:不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast)。C#是類型安全的。
25.?main 函數執行以前,還會執行什么代碼?
答案:全局對象的構造函數會在main 函數之前執行。
26.?描述內存分配方式以及它們的區別?
1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。
2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集。
3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。
27.struct 和 class 的區別
答案:struct 的成員默認是公有的,而類的成員默認是私有的。struct 和 class 在其他方面是功能相當的。
從感情上講,大多數的開發者感到類和結構有很大的差別。感覺上結構僅僅象一堆缺乏封裝和功能的開放的內存位,而類就象活的并且可靠的社會成員,它有智能服務,有牢固的封裝屏障和一個良好定義的接口。既然大多數人都這么認為,那么只有在你的類有很少的方法并且有公有數據(這種事情在良好設計的系統中是存在的!)時,你也許應該使用 struct 關鍵字,否則,你應該使用 class關鍵字。?
28.當一個類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk)
答案:肯定不是零。舉個反例,如果是零的話,聲明一個class A[10]對象數組,而每一個對象占用的空間是零,這時就沒辦法區分A[0],A[1]…了。
29. 在8086 匯編下,邏輯地址和物理地址是怎樣轉換的?(Intel)
答案:通用寄存器給出的地址,是段內偏移地址,相應段寄存器地址*10H+通用寄存器內地址,就得到了真正要訪問的地址。
30.?比較C++中的4種類型轉換方式?
請參考:http://blog.bioon.com/user1/8688/archives/2006/45399.shtml,重點是static_cast, dynamic_cast和reinterpret_cast的區別和應用。
?
[C/C++]?C/C++?筆試、面試題目大匯總[31-40] | |
? 31.分別寫出BOOL,int,float,指針類型的變量a 與“零”的比較語句。 答案: BOOL :??? if ( !a ) or if(a) int :???? if ( a == 0) float :???const EXPRESSION EXP = 0.000001 ????????? if ( a < EXP && a >-EXP) pointer : if ( a != NULL) or if(a == NULL) ? 32.請說出const與#define 相比,有何優點? 答案:1) const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤。 ????? 2) 有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試。 33.簡述數組與指針的區別? 數組要么在靜態存儲區被創建(如全局數組),要么在棧上被創建。指針可以隨時指向任意類型的內存塊。 (1)修改內容上的差別 char a[] = “hello”; a[0] = 'X’; char *p = “world”; // 注意p 指向常量字符串 p[0] = 'X’; // 編譯器不能發現該錯誤,運行時錯誤 (2) 用運算符sizeof 可以計算出數組的容量(字節數)。sizeof(p),p為指針得到的是一個指針變量的字節數,而不是p 所指的內存容量。C++/C語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住它。注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。 char a[] = "hello world"; char *p = a; cout<< sizeof(a) << endl; // 12 字節 cout<< sizeof(p) << endl; // 4 字節 計算數組和指針的內存容量 void Func(char a[100]) { cout<< sizeof(a) << endl; // 4 字節而不是100 字節 } 34.類成員函數的重載、覆蓋和隱藏區別? 答案: a.成員函數被重載的特征: (1)相同的范圍(在同一個類中); (2)函數名字相同; (3)參數不同; (4)virtual 關鍵字可有可無。 b.覆蓋是指派生類函數覆蓋基類函數,特征是: (1)不同的范圍(分別位于派生類與基類); (2)函數名字相同; (3)參數相同; (4)基類函數必須有virtual 關鍵字。 c.“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下: (1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。 (2)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆) 35. There are two int variables: a and b,don’t use “if”, “? :”, “switch”or other judgement statements, find outthe biggest one of the two numbers. 答案:( ( a + b ) + abs( a - b ) ) / 2 36. 如何打印出當前源文件的文件名以及源文件的當前行號? 答案: cout << __FILE__ ; cout<<__LINE__ ; __FILE__和__LINE__是系統預定義宏,這種宏并不是在某個文件中定義的,而是由編譯器定義的。 37. main 主函數執行完畢后,是否可能會再執行一段代碼,給出說明? 答案:可以,可以用_onexit 注冊一個函數,它會在main 之后執行int fn1(void), fn2(void), fn3(void), fn4 (void); void main( void ) { String str("zhanglin"); _onexit( fn1 ); _onexit( fn2 ); _onexit( fn3 ); _onexit( fn4 ); printf( "This is executed first./n" ); } int fn1() { printf( "next./n" ); return 0; } int fn2() { printf( "executed " ); return 0; } int fn3() { printf( "is " ); return 0; } int fn4() { printf( "This " ); return 0; } The _onexit function is passed the addressof a function (func) to be called when the program terminates normally.Successive calls to _onexit create a register of functions that areexecuted in LIFO (last-in-first-out) order. The functions passed to_onexit cannot take parameters. 38. 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的? 答案: #ifdef __cplusplus cout<<"c++"; #else cout<<"c"; #endif 39.文件中有一組整數,要求排序后輸出到另一個文件中 答案: #i nclude #i nclude using namespace std; void Order(vector& data) //bubble sort { int count = data.size() ; int tag = false ; // 設置是否需要繼續冒泡的標志位 for ( int i = 0 ; i < count ; i++) { for ( int j = 0 ; j < count - i - 1 ; j++) { if ( data[j] > data[j+1]) { tag = true ; int temp = data[j] ; data[j] = data[j+1] ; data[j+1] = temp ; } } if ( !tag ) break ; } } void main( void ) { vectordata; ifstream in("c://data.txt"); if ( !in) { cout<<"file error!"; exit(1); } int temp; while (!in.eof()) { in>>temp; data.push_back(temp); } in.close(); //關閉輸入文件流 Order(data); ofstream out("c://result.txt"); if ( !out) { cout<<"file error!"; exit(1); } for ( i = 0 ; i < data.size() ; i++) out<<DATA[I]<<" ?; 40. 鏈表題:一個鏈表的結點結構 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知鏈表的頭結點head,寫一個函數把這個鏈表逆序 ( Intel) Node * ReverseList(Node *head) //鏈表逆序 { if ( head == NULL || head->next == NULL ) return head; Node *p1 = head ; Node *p2 = p1->next ; Node *p3 = p2->next ; p1->next = NULL ; while ( p3 != NULL ) { p2->next = p1 ; p1 = p2 ; p2 = p3 ; p3 = p3->next ; } p2->next = p1 ; head = p2 ; return head ; } (2)已知兩個鏈表head1 和head2 各自有序,請把它們合并成一個鏈表依然有序。(保留所有結點,即便大小相同) Node * Merge(Node *head1 , Node *head2) { if ( head1 == NULL) return head2 ; if ( head2 == NULL) return head1 ; Node *head = NULL ; Node *p1 = NULL; Node *p2 = NULL; if ( head1->data < head2->data ) { head = head1 ; p1 = head1->next; p2 = head2 ; } else { head = head2 ; p2 = head2->next ; p1 = head1 ; } Node *pcurrent = head ; while ( p1 != NULL && p2 != NULL) { if ( p1->data <= p2->data ) { pcurrent->next = p1 ; pcurrent = p1 ; p1 = p1->next ; } else { pcurrent->next = p2 ; pcurrent = p2 ; p2 = p2->next ; } } if ( p1 != NULL ) pcurrent->next = p1 ; if ( p2 != NULL ) pcurrent->next = p2 ; return head ; } (3)已知兩個鏈表head1 和head2 各自有序,請把它們合并成一個鏈表依然有序,這次要求用遞歸方法進行。 (Autodesk) 答案: Node * MergeRecursive(Node *head1 , Node *head2) { if ( head1 == NULL ) return head2 ; if ( head2 == NULL) return head1 ; Node *head = NULL ; if ( head1->data < head2->data ) { head = head1 ; head->next = MergeRecursive(head1->next,head2); } else { head = head2 ; head->next = MergeRecursive(head1,head2->next); } return head ; } |
?
?
[C/C++]?C/C++?筆試、面試題目大匯總[41-45] | |||||||||||||||
? 41. 分析一下這段程序的輸出 (Autodesk) class B { public: B() { cout<<"default constructor"<<ENDL; } ~B() { cout<<"destructed"<<ENDL; } B(int i):data(i)??? //B(int) works as a converter ( int -> instance of ?B) { cout<<"constructed by parameter " << data <<ENDL; } private: int data; }; B Play( B b) { return b ; } (1)??????????????????????????????????????????? results: int main(int argc, char* argv[])??????constructed by parameter 5 {???????????????????????????????????? destructed? B(5)形參析構 B t1 = Play(5); B t2 = Play(t1);?? destructed? t1形參析構 return 0; destructed? t2 注意順序! }?????????????????????????????????????destructed? t1 (2)???????????????????????????????????results: int main(int argc, char* argv[])??????constructed by parameter 5 {???????????????????????????????????? destructed? B(5)形參析構 B t1 = Play(5); B t2 = Play(10);?? constructed by parameter 10 return 0; destructed? B(10)形參析構 }???????????????????????????????????? destructed? t2 注意順序! ????????????????????????????????????? destructed? t1 42. 寫一個函數找出一個整數數組中,第二大的數 (microsoft) 答案: const int MINNUMBER = -32767 ; int find_sec_max( int data[] , int count) { int maxnumber = data[0] ; int sec_max = MINNUMBER ; for ( int i = 1 ; i < count ; i++) { if ( data[i] > maxnumber ) { sec_max = maxnumber ; maxnumber = data[i] ; } else { if ( data[i] > sec_max ) sec_max = data[i] ; } } return sec_max ; } 43. 寫一個在一個字符串(n)中尋找一個子串(m)第一個位置的函數。 KMP算法效率最好,時間復雜度是O(n+m),詳見:http://www.zhanglihai.com/blog/c_335_kmp.html 44. 多重繼承的內存分配問題: ?? 比如有class A : public class B, public class C {} ?? 那么A的內存結構大致是怎么樣的? 這個是compiler-dependent的, 不同的實現其細節可能不同。 如果不考慮有虛函數、虛繼承的話就相當簡單;否則的話,相當復雜。 可以參考《深入探索C++對象模型》,或者: http://blog.csdn.net/rainlight/archive/2006/03/03/614792.aspx http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnarvc/html/http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnarvc/html/jangrayhood.asp 45. 如何判斷一個單鏈表是有環的?(注意不能用標志位,最多只能用兩個額外指針) ?? struct node { char val; node* next;} ???bool check(const node* head) {} //return?false : 無環;true: 有環 一種O(n)的辦法就是(搞兩個指針,一個每次遞增一步,一個每次遞增兩步,如果有環的話兩者必然重合,反之亦然): bool check(const node* head) { ??? if(head==NULL)? return false; ??? node *low=head, *fast=head->next; ??? while(fast!=NULL && fast->next!=NULL) ??? { ??????? low=low->next; ??????? fast=fast->next->next; ??????? if(low==fast) return true; ??? } ??? return false; } 一、請填寫BOOL , float, 指針變量 與“零值”比較的 if 語句。(10分) 提示:這里“零值”可以是0, 0.0 , FALSE或者“空指針”。例如 int 變量 n 與“零值”比較的 if 語句為: ????if ( n == 0 ) ????if ( n != 0 ) 以此類推。
二、以下為Windows NT下的32位C++程序,請計算sizeof的值(10分)
三、簡答題(25分) 1、頭文件中的 ifndef/define/endif 干什么用? 2、#include???? 和??#include??“filename.h” 有什么區別? 3、const 有什么用途?(請至少說明兩種) 4、在C++ 程序中調用被 C編譯器編譯后的函數,為什么要加 extern “C”聲明? 5、請簡述以下兩個for循環的優缺點
四、有關內存的思考題(20分)
五、編寫strcpy函數(10分) 已知strcpy函數的原型是 ?????? char *strcpy(char *strDest, const char *strSrc); ?????? 其中strDest是目的字符串,strSrc是源字符串。 (1)不調用C++/C的字符串庫函數,請編寫函數 strcpy (2)strcpy能把strSrc的內容復制到strDest,為什么還要char * 類型的返回值? 六、編寫類String的構造函數、析構函數和賦值函數(25分) 已知類String的原型為: ????class String ????{ ??????public: ????????String(const char *str = NULL); // 普通構造函數 ????????String(const String &other);????????// 拷貝構造函數 ????????~ String(void);???????????????????? // 析構函數 ????????String & operate =(const String &other);????// 賦值函數 ??????private: ????????char????*m_data;????????????????// 用于保存字符串 ????}; ?????? 請編寫String的上述4個函數。 以上題目摘自林銳博士的《高質量C++編程指南》。大家可以去看這本書作為參考 |
C++面試匯總1
2007年12月29日 星期六 08:57 P.M.
1.是不是一個父類寫了一個virtual 函數,如果子類覆蓋它的函數不加virtual ,也能實現多態?
virtual修飾符會被隱形繼承的。
private 也被集成,只事派生類沒有訪問權限而已
virtual可加可不加
子類的空間里有父類的所有變量(static除外)
同一個函數只存在一個實體(inline除外)
子類覆蓋它的函數不加virtual ,也能實現多態。
在子類的空間里,有父類的私有變量。私有變量不能直接訪問。
--------------------------------------------------------------------------
2.輸入一個字符串,將其逆序后輸出。(使用C++,不建議用偽碼)
#include <iostream>
using namespace std;
void main()
{
char a[50];memset(a,0,sizeof(a));
int i=0,j;
char t;
cin.getline(a,50,'/n');
for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)
{
?? t=a[i];
????? a[i]=a[j];
?? a[j]=t;
}
cout<<a<<endl;
}
//第二種
string str;
cin>>str;
str.replace;
cout<<str;
--------------------------------------------------------------------------
3.請簡單描述Windows內存管理的方法。
內存管理是操作系統中的重要部分,兩三句話恐怕誰也說不清楚吧~~
我先說個大概,希望能夠拋磚引玉吧
當程序運行時需要從內存中讀出這段程序的代碼。代碼的位置必須在物理內存中才能被運行,由于現在的操作系統中有非常多的程序運行著,內存中不能夠完全放下,所以引出了虛擬內存的概念。把哪些不常用的程序片斷就放入虛擬內存,當需要用到它的時候在load入主存(物理內存)中。這個就是內存管理所要做的事。內存管理還有另外一件事需要做:計算程序片段在主存中的物理位置,以便CPU調度。
內存管理有塊式管理,頁式管理,段式和段頁式管理。現在常用段頁式管理
塊式管理:把主存分為一大塊、一大塊的,當所需的程序片斷不在主存時就分配一塊主存空間,把程 序片斷load入主存,就算所需的程序片度只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的內存空間,但時易于管理。
頁式管理:把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。
段式管理:把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個缺點。一個程序片斷可能會被分為幾十段,這樣很多時間就會被浪費在計算每一段的物理地址上(計算機最耗時間的大家都知道是I/O吧)。
段頁式管理:結合了段式管理和頁式管理的優點。把主存分為若干頁,每一頁又分為若干段。好處就很明顯,不用我多說了吧。
各種內存管理都有它自己的方法來計算出程序片斷在主存中的物理地址,其實都很相似。
這只是一個大概而已,不足以說明內存管理的皮毛。無論哪一本操作系統書上都有詳細的講解
--------------------------------------------------------------------------
4.
#include "stdafx.h"
#define SQR(X) X*X
int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;
a /= SQR(k+m)/SQR(k+m);
printf("%d/n",a);
return 0;
}
這道題目的結果是什么啊?
define 只是定義而已,在編擇時只是簡單代換X*X而已,并不經過算術法則的
a /= (k+m)*(k+m)/(k+m)*(k+m);
=>a /= (k+m)*1*(k+m);
=>a = a/9;
=>a = 1;
--------------------------------------------------------------------------
5.
const 符號常量;
(1)const char *p
(2)char const *p
(3)char * const p
說明上面三種描述的區別;
如果const位于星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;
如果const位于星號的右側,const就是修飾指針本身,即指針本身是常量。
(1)const char *p
一個指向char類型的const對象指針,p不是常量,我們可以修改p的值,使其指向不同的char,但是不能改變它指向非char對象,如:
const char *p;
char c1='a';
char c2='b';
p=&c1;//ok
p=&c2;//ok
*p=c1;//error
(2)char const *p
(3)char * const p
這兩個好象是一樣的,此時*p可以修改,而p不能修改。
(4)const char * const p
這種是地址及指向對象都不能修改。
--------------------------------------------------------------------------
6.下面是C語言中兩種if語句判斷方式。請問哪種寫法更好?為什么?
int n;
if (n == 10) // 第一種判斷方式
if (10 == n) // 第二種判斷方式
如果少了個=號,編譯時就會報錯,減少了出錯的可能行,可以檢測出是否少了=
--------------------------------------------------------------------------
7.下面的代碼有什么問題?
void DoSomeThing(...)
{
char* p;
...
p = malloc(1024); // 分配1K的空間
if (NULL == p)
return;
...
p = realloc(p, 2048); // 空間不夠,重新分配到2K
if (NULL == p)
return;
...
}
A:
p = malloc(1024);???? 應該寫成: p = (char *) malloc(1024);
??????? 沒有釋放p的空間,造成內存泄漏。
--------------------------------------------------------------------------
8.下面的代碼有什么問題?并請給出正確的寫法。
void DoSomeThing(char* p)
{
char str[16];
int n;
assert(NULL != p);
sscanf(p, "%s%d", str, n);
if (0 == strcmp(str, "something"))
{
...
}
}
A:
sscanf(p, "%s%d", str, n);?? 這句該寫成: sscanf(p, "%s%d", str, &n);
--------------------------------------------------------------------------
9.下面代碼有什么錯誤?
Void test1()
{
char string[10];
char *str1="0123456789";
strcpy(string, str1);
}
數組越界
--------------------------------------------------------------------------
10.下面代碼有什么問題?
Void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++)
{
???? str1[i] ='a';
}
strcpy(string, str1);
}
數組越界
--------------------------------------------------------------------------
11.下面代碼有什么問題?
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
??? strcpy(string, str1);
}
}
==數組越界
==strcpy拷貝的結束標志是查找字符串中的/0 因此如果字符串中沒有遇到/0的話 會一直復制,直到遇到/0,上面的123都因此產生越界的情況
建議使用 strncpy 和 memcpy
--------------------------------------------------------------------------
12.下面代碼有什么問題?
#define MAX_SRM 256
DSN get_SRM_no()
{
static int SRM_no; //是不是這里沒賦初值?
int I;
for(I=0;I<MAX_SRM;I++,SRM_no++)
{
??? SRM_no %= MAX_SRM;
??? if(MY_SRM.state==IDLE)
??? {
????? break;
??? }
}
if(I>=MAX_SRM)
??? return (NULL_SRM);
else
??? return SRM_no;
}
系統會初始化static int變量為0,但該值會一直保存,所謂的不可重入...
--------------------------------------------------------------------------
13.寫出運行結果:
{// test1
??? char str[] = "world"; cout << sizeof(str) << ": ";
??? char *p??? = str;???? cout << sizeof(p) << ": ";
??? char i???? = 10;????? cout << sizeof(i) << ": ";
??? void *pp?? = malloc(10); cout << sizeof(p) << endl;
}
6:4:1:4
--------------------------------------------------------------------------
14.寫出運行結果:
{// test2
??? union V {
struct X {
?? unsigned char s1:2;
?? unsigned char s2:3;
?? unsigned char s3:3;
} x;
unsigned char c;
??? } v;
??? v.c = 100;
??? printf("%d", v.x.s3);
}
3
--------------------------------------------------------------------------
15.用C++寫個程序,如何判斷一個操作系統是16位還是32位的?不能用sizeof()函數
A1:
16位的系統下,
int i = 65536;
cout << i; // 輸出0;
int i = 65535;
cout << i; // 輸出-1;
32位的系統下,
int i = 65536;
cout << i; // 輸出65536;
int i = 65535;
cout << i; // 輸出65535;
A2:
int a = ~0;
if( a>65536 )
{
??? cout<<"32 bit"<<endl;
}
else
{
??? cout<<"16 bit"<<endl;
}
--------------------------------------------------------------------------
16.C和C++有什么不同?
從機制上:c是面向過程的(但c也可以編寫面向對象的程序);c++是面向對象的,提供了類。但是,
c++編寫面向對象的程序比c容易
從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c++適合更上層的,復雜的; llinux核心大部分是c寫的,因為它是系統軟件,效率要求極高。
從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因為c++比
c來說擴充的東西太多了,所以就在c后面放上兩個+;于是就成了c++
C語言是結構化編程語言,C++是面向對象編程語言。
C++側重于對象而不是過程,側重于類的設計而不是邏輯的設計。
--------------------------------------------------------------------------
17.在不用第三方參數的情況下,交換兩個參數的值
#include <stdio.h>
void main()
{
??????? int i=60;
??????? int j=50;
??????? i=i+j;
??????? j=i-j;
??????? i=i-j;
??????? printf("i=%d/n",i);
??????? printf("j=%d/n",j);
}
方法二:
i^=j;
j^=i;
i^=j;
方法三:
// 用加減實現,而且不會溢出
a = a+b-(b=a)
--------------------------------------------------------------------------
18.有關位域的面試題(為什么輸出的是一個奇怪的字符)
a.t = 'b';效果相當于 a.t= 'b' & 0xf;
'b' --> 01100010
'b' & 0xf -->>00000010
所以輸出Ascii碼為2的特殊字符
char t:4;就是4bit的字符變量,同樣
unsigned short i:8;就是8bit的無符號短整形變量
--------------------------------------------------------------------------
19.int i=10, j=10, k=3; k*=i+j; k最后的值是?
60
--------------------------------------------------------------------------
20.進程間通信的方式有?
進程間通信的方式有 共享內存, 管道 ,Socket ,消息隊列 , DDE等
--------------------------------------------------------------------------
21.
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
sizeof(A)=?(不考慮邊界對齊)
7
struct CELL???????????? // Declare CELL bit field
{
?? unsigned character : 8; // 00000000 ????????
?? unsigned foreground : 3; // 00000??? 00000000
?? unsigned intensity : 1; // 0000?000 00000000
?? unsigned background : 3; // 0???0000 00000000
?? unsigned blink????? : 1; // ?0000000 00000000
} screen[25][80];?????? // Array of bit fields
二、位結構
??? 位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構
比按位運算符更加方便。
??? 位結構定義的一般形式為:
???? struct位結構名{
????????? 數據類型 變量名: 整型常數;
????????? 數據類型 變量名: 整型常數;
???? } 位結構變量;
??? 其中: 數據類型必須是int(unsigned或signed)。 整型常數必須是非負的整
數, 范圍是0~15, 表示二進制位的個數, 即表示有多少位。
??? 變量名是選擇項, 可以不命名, 這樣規定是為了排列需要。
??? 例如: 下面定義了一個位結構。
???? struct{
????????? unsigned incon: 8; /*incon占用低字節的0~7共8位*/
????????? unsigned txcolor: 4;/*txcolor占用高字節的0~3位共4位*/
????????? unsigned bgcolor: 3;/*bgcolor占用高字節的4~6位共3位*/
????????? unsigned blink: 1; /*blink占用高字節的第7位*/
???? }ch;
??? 位結構成員的訪問與結構成員的訪問相同。
??? 例如: 訪問上例位結構中的bgcolor成員可寫成:
????? ch.bgcolor
??? 注意:
??? 1. 位結構中的成員可以定義為unsigned, 也可定義為signed, 但當成員長
度為1時, 會被認為是unsigned類型。因為單個位不可能具有符號。
??? 2. 位結構中的成員不能使用數組和指針, 但位結構變量可以是數組和指針,
如果是指針, 其成員訪問方式同結構指針。
??? 3. 位結構總長度(位數), 是各個位成員定義的位數之和, 可以超過兩個字
節。
??? 4. 位結構成員可以與其它結構成員一起使用。
??? 例如:
???? struct info{
????????? char name[8];
????????? int age;
????????? struct addr address;
????????? float pay;
????????? unsigned state: 1;
????????? unsigned pay: 1;
????????? }workers;
??? 上例的結構定義了關于一個工人的信息。其中有兩個位結構成員, 每個位結
構成員只有一位, 因此只占一個字節但保存了兩個信息, 該字節中第一位表示工
人的狀態, 第二位表示工資是否已發放。由此可見使用位結構可以節省存貯空間。
--------------------------------------------------------------------------
22.下面的函數實現在一個固定的數上加上一個數,有什么錯誤,改正
int add_n(int n)
{
static int i=100;
i+=n;
return i;
}
答:
因為static使得i的值會保留上次的值。
去掉static就可了
--------------------------------------------------------------------------
23.下面的代碼有什么問題?
class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};
答:
會引起無限遞歸
--------------------------------------------------------------------------
24.
union a {
int a_int1;
double a_double;
int a_int2;
};
typedef struct
{
a a1;
char y;
} b;
class c
{
double c_double;
b b1;
a a2;
};
輸出cout<<sizeof(c)<<endl;的結果?
答:
VC6環境下得出的結果是32
另:
我(sun)在VC6.0+win2k下做過試驗:
short - 2
int-4
float-4
double-8
指針-4
sizeof(union),以結構里面size最大的為union的size
解析C語言中的sizeof
一、sizeof的概念
sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它并不是函數。sizeof操作符以字節形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括號內的類型名。操作數的存儲大小由操作數的類型決定。
二、sizeof的使用方法
1、用于數據類型
sizeof使用形式:sizeof(type)
數據類型必須用括號括住。如sizeof(int)。
2、用于變量
sizeof使用形式:sizeof(var_name)或sizeof var_name
變量名可以不用括號括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶括號的用法更普遍,大多數程序員采用這種形式。
注意:sizeof操作符不能用于函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。
如sizeof(max)若此時變量max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。
三、sizeof的結果
sizeof操作符的結果類型是size_t,它在頭文件
中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。
1、若操作數具有類型char、unsigned char或signed char,其結果等于1。
ANSI C正式規定字符類型為1字節。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double類型的sizeof 在ANSI C中沒有具體規定,大小依賴于實現,一般可能分別為2、2、2、2、4、4、4、8、10。
3、當操作數是指針時,sizeof依賴于編譯器。例如Microsoft C/C++7.0中,near類指針字節數為2,far、huge類指針字節數為4。一般Unix的指針字節數為4。
4、當操作數具有數組類型時,其結果是數組的總字節數。
5、聯合類型操作數的sizeof是其最大字節成員的字節數。結構類型操作數的sizeof是這種類型對象的總字節數,包括任何墊補在內。
讓我們看如下結構:
struct {char b; double x;} a;
在某些機器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。
這是因為編譯器在考慮對齊問題時,在結構中插入空位以控制各成員對象的地址對齊。如double類型的結構成員x要放在被4整除的地址。
6、如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。
四、sizeof與其他操作符的關系
sizeof的優先級為2級,比/、%等3級運算符優先級高。它可以與其他操作符一起組成表達式。如i*sizeof(int);其中i為int類型變量。
五、sizeof的主要用途
1、sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2、sizeof的另一個的主要用途是計算數組中元素的個數。例如:
void * memset(void * s,int c,sizeof(s))。
六、建議
由于操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof來代替常量計算。
=============================================================
本文主要包括二個部分,第一部分重點介紹在VC中,怎么樣采用sizeof來求結構的大小,以及容易出現的問題,并給出解決問題的方法,第二部分總結出VC中sizeof的主要用法。
1、 sizeof應用在結構上的情況
請看下面的結構:
struct MyStruct
{
double dda1;
char dda;
int type
};
對結構MyStruct采用sizeof會出現什么結果呢?sizeof(MyStruct)為多少呢?也許你會這樣求:
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是當在VC中測試上面結構的大小時,你會發現sizeof(MyStruct)為16。你知道為什么在VC中會得出這樣一個結果嗎?
其實,這是VC對變量存儲的一個特殊處理。為了提高CPU的存儲速度,VC對一些變量的起始地址做了"對齊"處理。在默認情況下,VC規定各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。下面列出常用類型的對齊方式(vc6.0,32位系統)。
類型
對齊方式(變量存放的起始地址相對于結構的起始地址的偏移量)
Char
偏移量必須為sizeof(char)即1的倍數
int
偏移量必須為sizeof(int)即4的倍數
float
偏移量必須為sizeof(float)即4的倍數
double
偏移量必須為sizeof(double)即8的倍數
Short
偏移量必須為sizeof(short)即2的倍數
各成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節VC會自動填充。同時VC為了確保結構的大小為結構的字節邊界數(即該結構中占用最大空間的類型所占用的字節數)的倍數,所以在為最后一個成員變量申請空間后,還會根據需要自動填充空缺的字節。
下面用前面的例子來說明VC到底怎么樣來存放結構的。
struct MyStruct
{
double dda1;
char dda;
int type
};
為上面的結構分配空間的時候,VC根據成員變量出現的順序和對齊方式,先為第一個成員dda1分配空間,其起始地址跟結構的起始地址相同(剛好偏移量0剛好為sizeof(double)的倍數),該成員變量占用sizeof(double)=8個字節;接下來為第二個成員dda分配空間,這時下一個可以分配的地址對于結構的起始地址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變量占用sizeof(char)=1個字節;接下來為第三個成員type分配空間,這時下一個可以分配的地址對于結構的起始地址的偏移量為9,不是sizeof(int)=4的倍數,為了滿足對齊方式對偏移量的約束問題,VC自動填充3個字節(這三個字節沒有放什么東西),這時下一個可以分配的地址對于結構的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個字節;這時整個結構的成員變量已經都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結構的字節邊界數(即結構中占用最大空間的類型所占用的字節數sizeof(double)=8)的倍數,所以沒有空缺的字節需要填充。所以整個結構的大小為:sizeof(MyStruct)=8+1+3+4=16,其中有3個字節是VC自動填充的,沒有放任何有意義的東西。
下面再舉個例子,交換一下上面的MyStruct的成員變量的位置,使它變成下面的情況:
struct MyStruct
{
char dda;
double dda1;?
int type
};
這個結構占用的空間為多大呢?在VC6.0環境下,可以得到sizeof(MyStruc)為24。結合上面提到的分配空間的一些原則,分析下VC怎么樣為上面的結構分配空間的。(簡單說明)
struct MyStruct
{
char dda;//偏移量為0,滿足對齊方式,dda占用1個字節;
double dda1;//下一個可用的地址的偏移量為1,不是sizeof(double)=8
???????????? //的倍數,需要補足7個字節才能使偏移量變為8(滿足對齊
???????????? //方式),因此VC自動填充7個字節,dda1存放在偏移量為8
???????????? //的地址上,它占用8個字節。
int type;//下一個可用的地址的偏移量為16,是sizeof(int)=4的倍
?????????? //數,滿足int的對齊方式,所以不需要VC自動填充,type存
?????????? //放在偏移量為16的地址上,它占用4個字節。
};//所有成員變量都分配了空間,空間總的大小為1+7+8+4=20,不是結構
?? //的節邊界數(即結構中占用最大空間的類型所占用的字節數sizeof
?? //(double)=8)的倍數,所以需要填充4個字節,以滿足結構的大小為
?? //sizeof(double)=8的倍數。
所以該結構總的大小為:sizeof(MyStruc)為1+7+8+4+4=24。其中總的有7+4=11個字節是VC自動填充的,沒有放任何有意義的東西。
VC對結構的存儲的特殊處理確實提高CPU存儲變量的速度,但是有時候也帶來了一些麻煩,我們也屏蔽掉變量默認的對齊方式,自己可以設定變量的對齊方式。
VC中提供了#pragmapack(n)來設定變量以n字節對齊方式。n字節對齊就是說變量存放的起始地址的偏移量有兩種情況:第一、如果n大于等于該變量所占用的字節數,那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節數,那么偏移量為n的倍數,不用滿足默認的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節數,那么結構的總大小必須為占用空間最大的變量占用的空間數的倍數;
否則必須為n的倍數。下面舉例說明其用法。
#pragma pack(push) //保存對齊狀態
#pragma pack(4)//設定為4字節對齊
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢復對齊狀態
以上結構的大小為16,下面分析其存儲情況,首先為m1分配空間,其偏移量為0,滿足我們自己設定的對齊方式(4字節對齊),m1占用1個字節。接著開始為m4分配空間,這時其偏移量為1,需要補足3個字節,這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大于n),m4占用8個字節。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3占用4個字節。這時已經為所有成員變量分配了空間,共分配了16個字節,滿足為n的倍數。如果把上面的#pragma pack(4)改為#pragma pack(16),那么我們可以得到結構的大小為24。(請讀者自己分析)
2、 sizeof用法總結
在VC中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof后面的參數對sizeof的用法做個總結。
A. 參數為數據類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int類型在16位系統中占2個字節,在32位系統中占4個字節。
B. 參數為數組或指針。下面舉例說明.
int a[50]; //sizeof(a)=4*50=200; 求數組所占的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針
?????????????????? //的大小,在32位系統中,當然是占4個字節。
C. 參數為結構或類。Sizeof應用在類和結構的處理情況是相同的。但有兩點需要注意,第一、結構或者類中的靜態成員不對結構或者類的大小產生影響,因為靜態變量的存儲位置與結構或者類的實例地址無關。
第二、沒有成員變量的結構或類的大小為1,因為必須保證結構或類的每一
個實例在內存中都有唯一的地址。
下面舉例說明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個指針。
Class test1{ };//sizeof(test1)=1;
D. 參數為其他。下面舉例說明。
?? int func(char s[5]);
?? {
???? cout<<sizeof(s);//這里將輸出4,本來s為一個數組,但由于做為函
???????????????????? //數的參數在傳遞的時候系統處理為一個指針,所
???????????????????? //以sizeof(s)實際上為求指針的大小。
???? return 1;
}
sizeof(func("1234"))=4//因為func的返回類型為int,所以相當于
???????????????????? //求sizeof(int).
以上為sizeof的基本用法,在實際的使用中要注意分析VC的分配變量的分配策略,這樣的話可以避免一些錯誤。
--------------------------------------------------------------------------
25.i最后等于多少?
int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;
答:
i = 5
--------------------------------------------------------------------------
26.
unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;
*(array + i) = ?
答:
4
--------------------------------------------------------------------------
27.
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout << "fun1 in class B" << endl;}
virtual void func2(){cout << "fun2 in class B" << endl;}
}
A, A中的func1和B中的func2都是虛函數.
B, A中的func1和B中的func2都不是虛函數.
C, A中的func2是虛函數.,B中的func1不是虛函數.
D, A中的func2不是虛函數,B中的func1是虛函數.
答:
A
--------------------------------------------------------------------------
28.
數據庫:抽出部門,平均工資,要求按部門的字符串順序排序,不能含有"human resource"部門,
employee結構如下:employee_id, employee_name, depart_id,depart_name,wage
答:
select depart_name, avg(wage)
from employee
where depart_name <> 'human resource'
group by depart_name
order by depart_name
--------------------------------------------------------------------------
29.
給定如下SQL數據庫:Test(num INT(4)) 請用一條SQL語句返回num的最小值,但不許使用統計功能,如MIN,MAX等
答:
select top 1 num
from Test
order by num desc
--------------------------------------------------------------------------
30.
輸出下面程序結果。
#include <iostream.h>
class A
{
public:
virtual void print(void)
{
??? cout<<"A::print()"<<endl;
}
};
class B:public A
{
public:
virtual void print(void)
{
?? cout<<"B::print()"<<endl;
};
};
class C:public B
{
public:
virtual void print(void)
{
?? cout<<"C::print()"<<endl;
}
};
void print(A a)
{
?? a.print();
}
void main(void)
{
?? A a, *pa,*pb,*pc;
?? B b;
?? C c;
??
?? pa=&a;
?? pb=&b;
?? pc=&c;
??
?? a.print();
?? b.print();
?? c.print();
??
?? pa->print();
?? pb->print();
?? pc->print();
??
?? print(a);
?? print(b);
?? print(c);
}
A:
A::print()
B::print()
C::print()
A::print()
B::print()
C::print()
A::print()
A::print()
A::print()
--------------------------------------------------------------------------
31.
試編寫函數判斷計算機的字節存儲順序是開序(little endian)還是降序(bigendian)
答:
bool IsBigendian()
{
unsigned short usData = 0x1122;
unsigned char *pucData = (unsigned char*)&usData;
return (*pucData == 0x22);
}
--------------------------------------------------------------------------
32.簡述Critical Section和Mutex的不同點
答:
對幾種同步對象的總結
1.Critical Section
A.速度快
B.不能用于不同進程
C.不能進行資源統計(每次只可以有一個線程對共享資源進行存取)
2.Mutex
A.速度慢
B.可用于不同進程
C.不能進行資源統計
3.Semaphore
A.速度慢
B.可用于不同進程
C.可進行資源統計(可以讓一個或超過一個線程對共享資源進行存取)
4.Event
A.速度慢
B.可用于不同進程
C.可進行資源統計
--------------------------------------------------------------------------
33.一個數據庫中有兩個表:
一張表為Customer,含字段ID,Name;
一張表為Order,含字段ID,CustomerID(連向Customer中ID的外鍵),Revenue;
寫出求每個Customer的Revenue總和的SQL語句。
建表
create table customer
(
ID int primary key,Name char(10)
)
go
create table [order]
(
ID int primary key,CustomerID int foreign key references customer(id) , Revenue float
)
go
--查詢
select Customer.ID, sum( isnull([Order].Revenue,0) )
from customer full join [order]
on( [order].customerid=customer.id )
group by customer.id
--------------------------------------------------------------------------
34.請指出下列程序中的錯誤并且修改
void GetMemory(char *p){
p=(char *)malloc(100);
}
void Test(void){
char *str=NULL;
GetMemory=(str);
strcpy(str,"hello world");
printf(str);
}
A:錯誤--參數的值改變后,不會傳回
GetMemory并不能傳遞動態內存,Test函數中的 str一直都是 NULL。
strcpy(str, "hello world");將使程序崩潰。
修改如下:
char *GetMemory(){
char *p=(char *)malloc(100);
return p;
}
void Test(void){
char *str=NULL;
str=GetMemory(){
strcpy(str,"hello world");
printf(str);
}
方法二:void GetMemory2(char **p)變為二級指針.
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
--------------------------------------------------------------------------
35.程序改錯
class mml
{
private:
??? static unsigned int x;
public:
??? mml(){ x++; }
??? mml(static unsigned int &) {x++;}
??? ~mml{x--;}
pulic:
??? virtual mon() {} = 0;
??? static unsigned int mmc(){return x;}
??? ......?????????????????????
};
class nnl:public mml
{
private:
??? static unsigned int y;
public:
??? nnl(){ x++; }
??? nnl(static unsigned int &) {x++;}
??? ~nnl{x--;}
public:
??? virtual mon() {};
???? static unsigned int nnc(){return y;}
??? ......??????????????????
};
代碼片斷:
mml* pp = new nnl;
..........
delete pp;
A:
基類的析構函數應該為虛函數
virtual ~mml{x--;}
--------------------------------------------------------------------------
36.101個硬幣100真、1假,真假區別在于重量。請用無砝碼天平稱兩次給出真幣重還是假幣重的結論。
答:
101個先取出2堆,
33,33
第一次稱,如果不相等,說明有一堆重或輕
那么把重的那堆拿下來,再放另外35個中的33
如果相等,說明假的重,如果不相等,新放上去的還是重的話,說明假的輕(不可能新放上去的輕)
第一次稱,如果相等的話,這66個肯定都是真的,從這66個中取出35個來,與剩下的沒稱過的35個比
下面就不用說了
方法二:
第3題也可以拿A(50),B(50)比一下,一樣的話拿剩下的一個和真的比一下。
如果不一樣,就拿其中的一堆。比如A(50)再分成兩堆25比一下,一樣的話就在
B(50)中,不一樣就在A(50)中,結合第一次的結果就知道了。
--------------------------------------------------------------------------
37.static變量和static 函數各有什么特點?
答:
static變量:在程序運行期內一直有效,如果定義在函數外,則在編譯單元內可見,如果在函數內,在在定義的block內可見;
static函數:在編譯單元內可見;
--------------------------------------------------------------------------
38.用C 寫一個輸入的整數,倒著輸出整數的函數,要求用遞歸方法 ;
答:
void fun( int a )
{
printf( "%d", a%10 );
a /= 10;
if( a <=0 )return;
fun( a );
}
--------------------------------------------------------------------------
39.寫出程序結果:
void Func(char str[100])
{
printf("%d/n", sizeof(str));
}
答:
4
分析:
指針長度
--------------------------------------------------------------------------
40.int id[sizeof(unsigned long)];
??? 這個對嗎?為什么??
答:
對
這個 sizeof是編譯時運算符,編譯時就確定了
可以看成和機器有關的常量。
本文主要包括二個部分,第一部分重點介紹在VC中,怎么樣采用sizeof來求結構的大小,以及容易出現的問題,并給出解決問題的方法,第二部分總結出VC中sizeof的主要用法。
1、 sizeof應用在結構上的情況
請看下面的結構:
struct MyStruct
{
double dda1;
char dda;
int type
};
對結構MyStruct采用sizeof會出現什么結果呢?sizeof(MyStruct)為多少呢?也許你會這樣求:
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是當在VC中測試上面結構的大小時,你會發現sizeof(MyStruct)為16。你知道為什么在VC中會得出這樣一個結果嗎?
其實,這是VC對變量存儲的一個特殊處理。為了提高CPU的存儲速度,VC對一些變量的起始地址做了"對齊"處理。在默認情況下,VC規定各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。下面列出常用類型的對齊方式(vc6.0,32位系統)。
類型
對齊方式(變量存放的起始地址相對于結構的起始地址的偏移量)
Char
偏移量必須為sizeof(char)即1的倍數
int
偏移量必須為sizeof(int)即4的倍數
float
偏移量必須為sizeof(float)即4的倍數
double
偏移量必須為sizeof(double)即8的倍數
Short
偏移量必須為sizeof(short)即2的倍數
各成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節VC會自動填充。同時VC為了確保結構的大小為結構的字節邊界數(即該結構中占用最大空間的類型所占用的字節數)的倍?/textarea>