剛剛休息了一個(gè)暑假。不要盲目羨慕我啊,只有短短一個(gè)星期。上研以來,還真的沒有什么假期可言,寒暑兩假一年加起來也就兩個(gè)多星期,相比同學(xué)悠哉的兩三個(gè)月來說真的是少啊。
眼看明年也快要畢業(yè)了,于是邀請(qǐng)父母還有淘氣的小侄來北京逛逛看看。父親的北京記憶還停留在80年代初,還話說他開著大卡車從除了天門前的其他街道呼嘯而過。北京已經(jīng)變化得令他陌生。小侄則郁悶為什么去哪都要不停的倒車,嚷著再不做地鐵的他,做了一回公交后,再也沒有這種想法。
上星期還算天公作美,剛開始的幾天還算溫度適宜,領(lǐng)著逛了逛石景山游樂園,鳥巢,天文館,北京市海洋館,西單,前門,天安門。剩下幾天的高溫天氣,奈何我有興致,他們卻個(gè)個(gè)都不逛了。原因有二,一是money消耗了不少,父母也替我心疼錢了;二是高溫加交通不順,老的累了,小的也累了。情愿開著空調(diào),家里看電視。
幾天下來,小侄竟然發(fā)出了這樣的感慨,北京沒有家好。父母也覺得沒有家好。在這個(gè)城市生活了兩年多的我,為什么沒有這種感覺呢。習(xí)慣了,習(xí)慣了擁堵,習(xí)慣了走路,習(xí)慣了忙碌,習(xí)慣了這個(gè)城市帶給我的感覺,也漸漸覺得自己融入了進(jìn)來。畢竟這里會(huì)讓自己跑得更快些,跳得更高些,是這里的機(jī)遇與挑戰(zhàn)吸引了我,我想這也是吸引很多人的理由。要不,這么多人,擁擠在這個(gè)城市總該有個(gè)往前奔的理由。
還沒畢業(yè),所以高得不能再高的房價(jià)還暫時(shí)對(duì)我?guī)Р粊硎裁礇_擊,只是眼下的經(jīng)濟(jì)形式,讓我面臨著就業(yè)壓力。父母的到來,讓我為自己找到了一個(gè)很好放松的理由。假期的結(jié)束,又讓自己回到了畢業(yè)的思考。
似乎這是一個(gè)熱門話題,身邊的同學(xué)、同事以及朋友都會(huì)問及此事。程序員是我的首選職業(yè),因?yàn)槲蚁矚g,喜歡那種挑戰(zhàn)和不斷學(xué)習(xí)的感覺,享受那種解決問題的快樂。我會(huì)選擇這個(gè)一直下去,有著成為小小專家的夢(mèng)想。只是現(xiàn)在需要一個(gè)跳板,跳得更高,飛得更遠(yuǎn)。
夢(mèng)能飛得多遠(yuǎn),在于我能跑得多塊。假期給我?guī)砹艘恍┢v,看看《蠟筆小新》,居然能緩解疲勞。其實(shí)小新有時(shí)比我小侄聽話好多。今天終于恢復(fù)了早起的習(xí)慣,工作也要認(rèn)真起來。舊項(xiàng)目終于完結(jié)了,新項(xiàng)目又要開始了,項(xiàng)目總結(jié)也要趕著寫,學(xué)習(xí)進(jìn)步也要加緊些。事情很多,都得一件一件來。在豆瓣網(wǎng)上看到的晨型人,5點(diǎn)多起來對(duì)于我來說真的太困難了,還是老時(shí)間起來吧,七點(diǎn)多,才能保證一天之精神飽滿。加油起來,堅(jiān)持就會(huì)勝利。
摘要: 目前做了一些版本涉及到海外的一些東西, 有些沒有辦法測試,只要寫死IMSI號(hào)碼。每回翻郵件真的很痛苦,遂在網(wǎng)絡(luò)上查了一下。還挺全的。摘自:http://blog.csdn.net/wyymaomi/archive/2009/04/19/4091396.aspx 國際移動(dòng)客戶識(shí)別碼 IMSI International Mobile Subscriber Identification Number&...
閱讀全文
最近越來越感覺效率的重要性。為什么呢?
寫程序不僅僅是簡單的實(shí)現(xiàn)功能。原來寫代碼時(shí)沒有注意這些問題,現(xiàn)在暴漏出來了,也無計(jì)可施。多個(gè)功能再加界面,導(dǎo)致了界面很慢。用戶體驗(yàn)不好。所以這需要在以后工作中引以為戒。
要把自己的代碼寫的漂亮一些。
今天在進(jìn)行memcpy出現(xiàn)了一些問題。
原因是這樣的:
我定義了這樣一個(gè)接口,里面涉及memcpy操作。
舉個(gè)例子吧,如接口addItem,
void addItem(int iType, LPVOID *pItem);
里面有一個(gè)對(duì)象是TCHAR szStr[512];
我直接進(jìn)行了這樣的拷貝,memcpy(szStr, pItem, sizeof(szStr));
今天就出問題了。提示某塊內(nèi)存無法訪問。于是重新看這個(gè)問題。為什么會(huì)這么寫這樣的接口呢?
我原先寫的是 void addItem(int iType, TCHAR *pItem);
后來由于需求的變化,變成了LPVOID。改成這個(gè)以后,原先的字符串wcscpy就變成了memcpy。這個(gè)一直沒有引起警覺。其實(shí)這一步的改變,就應(yīng)該對(duì)接口做相應(yīng)的調(diào)整,接口應(yīng)該變?yōu)?br>void addItem(int iType, LPVOID *pItem, DWORD cbItem);
增加一個(gè)參數(shù)來說明pItem的大小。然而這一步?jīng)]有做。
所以今天的教訓(xùn)就是要注意修改接口的時(shí)候,注意相應(yīng)的變化。
還有是字符串的操作問題,寬字符和ASCII字符串的操作要注意。
這也是《程序員面試攻略》上的一道題,題目是這樣的:
請(qǐng)編寫一個(gè)函數(shù),確定一個(gè)整數(shù)的計(jì)算機(jī)內(nèi)部表示中有幾個(gè)“1”。
思索了一下這個(gè)題目,我是這樣考慮的,也學(xué)書上給出偽代碼
count = 0;
while (這個(gè)整數(shù)不為0)
{
如果這個(gè)整數(shù)對(duì)2求余的結(jié)果是1,則count加1;
將這個(gè)整數(shù)向右移移位
}
代碼寫出來是這樣的:
int numOnesInBinary(int num)


{
int count = 0;
while (num != 0)

{
if (num % 2 == 1)
count++;
num = num>>1;
}

return count;
}
看了一下書中的答案,的確比我簡練很多。對(duì)于求余這個(gè)方法還是比較笨的。書中采用了邏輯與。
判斷條件從“num%2 == 1”變成 “num&1 == 1”,從程序中更傾向與后者。
所以在分析問題的時(shí)候,要學(xué)會(huì)用邏輯“與、或、異或”進(jìn)行判斷。
到這一步,看似已經(jīng)很完美了。但是書中又出奇的給了另一種解法。這種想法我真的沒有想到。
想法的出發(fā)點(diǎn)是考慮一個(gè)數(shù)字減1時(shí),它的二進(jìn)制發(fā)生了什么變化。減1得到的結(jié)果是,從最低位的1到最低位都發(fā)生了翻轉(zhuǎn),其他高位保持不變。如果您對(duì)這個(gè)整數(shù)和減一后的結(jié)果進(jìn)行AND操作,得到的新的數(shù)字與原來的整數(shù)相比,只有最后一個(gè)1變成0.
如果進(jìn)行多次這樣的操作,這個(gè)整數(shù)的值變?yōu)?。這樣我們也就獲得了這個(gè)數(shù)的計(jì)算機(jī)表示中“1”的個(gè)數(shù)。
int numOnesInBinary2(int num)


{
int count = 0;
while(num != 0)

{
num = num & (num-1);
count++;
}
return count;
}
第一方法的時(shí)間復(fù)雜度為o(n),第二種的時(shí)間復(fù)雜度為o(m),m為1的個(gè)數(shù)。
后記:
最近一周多,一直在做這本書上的編程題。一天3道,自己先嘗試編寫,運(yùn)行成功后再與書上的解答進(jìn)行對(duì)比。稍有幾次略感比書上稍好些。但大多數(shù)情況還是效率差一些。想想原因,還是練得比較少。所以繼續(xù)努力。多多積累,養(yǎng)成良好的思維習(xí)慣。
編程無他,唯手熟爾。在
七星重劍的博客上看到的,非常贊同。
這是《程序員面試攻略》上的一道題,先前也有一位公司同事問過我,今天有重新拿起看了一下。
書中介紹了兩種方法
第一種是這樣的利用強(qiáng)制類型轉(zhuǎn)換
bool endianness()
{
int testNum;
char* ptr;
testNum = 1;
ptr = (char*)&testNum;
return ptr;
}
這個(gè)方法還比較好理解。
第二種方法就是利用union。
bool endianness()
{
union{
int theInteger;
char singleChar;
}endianTesg;
endianTest.theInteger = 1;
return endianTest.singleChar;
}
這種方法很巧妙。帶著困意就是沒有看懂,一個(gè)個(gè)問號(hào)就蹦出來了?這是為什么呢?
說實(shí)話,union在學(xué)習(xí)和工作中用的還真的不是很多。其用法還真是不記得。
所以趕快到網(wǎng)上去搜了一下。有篇文章還不錯(cuò),我看懂了。
共用體union用法講解鏈接地址:
http://blog.ednchina.com/likee/20666/message.aspxUnion表示幾個(gè)變量公用一個(gè)內(nèi)存位置, 在不同的時(shí)間保存不同的數(shù)據(jù)類型和不同長度的變量。其長度為Union中最大的變量長度。
這樣,我們就不難理解上面的程序,theInteger和singleChar是共用一個(gè)內(nèi)存位置的,如果是小尾數(shù)法的話,那么singleChar為1,對(duì)應(yīng)theInteger的低八位;如果是大尾數(shù)法的話,那么singleChar為0, 對(duì)應(yīng)theInteger的低八位。
繼續(xù)努力學(xué)習(xí)!
朝著夢(mèng)想加油前進(jìn)。
去同學(xué)那玩,看到這么一本書《C++沉思錄》。這本書很早聽過,但是沒有讀過。于是捧起書讀了幾章,感覺很是不錯(cuò)。其中第四章就是講“類設(shè)計(jì)者的核查表”。雖然用c++有幾年,但是有一些東西還是需要銘記于心的。
類設(shè)計(jì)者的核查表
一、
您的類需要一個(gè)構(gòu)造函數(shù)么?
有些類太簡單,無需構(gòu)造函數(shù),但有些類太復(fù)雜,他們需要構(gòu)造函數(shù)來隱藏它們的內(nèi)部工作方式。
二、
您的數(shù)據(jù)成員是私有的么?
通常使用公有的數(shù)據(jù)成員不是什么好事,因?yàn)轭愒O(shè)計(jì)者無法控制何時(shí)訪問這些成員。
三、
您的類需要一個(gè)無參的構(gòu)造函數(shù)么?
如果一個(gè)類已經(jīng)有了構(gòu)造函數(shù),想聲明該類的對(duì)象可以不必顯示地初始化它們,則必須顯示地寫一個(gè)無參的構(gòu)造函數(shù)。
四、
是不是每一個(gè)構(gòu)造函數(shù)初始化所有的數(shù)據(jù)成員?
構(gòu)造函數(shù)的用途就是用一種明確定義的狀態(tài)來設(shè)置對(duì)象。對(duì)象的狀態(tài)由對(duì)象的數(shù)據(jù)成員進(jìn)行反映。每個(gè)構(gòu)造函數(shù)都要負(fù)責(zé)為所有的數(shù)據(jù)成員設(shè)置經(jīng)過明確定義的值。
有時(shí)這種說法也未必總是正確的。有時(shí),類會(huì)有一些數(shù)據(jù)成員,它們只在它們的對(duì)象存在了一定時(shí)間之后才有意義。提這個(gè)問題,只是激勵(lì)你進(jìn)行思考。
五、
類需要構(gòu)造函數(shù)么?
不是所有有構(gòu)造函數(shù)的類都需要構(gòu)造函數(shù)。如果深入考慮一個(gè)類要做些什么,那么該類是否需要析構(gòu)函數(shù)的問題就十分明顯了。應(yīng)該問一問該類是否分配了資源,而這些資源又不會(huì)有成員函數(shù)自動(dòng)釋放,這就足夠了。特別是那些構(gòu)造函數(shù)里包含了new表達(dá)式的類,通常要在析構(gòu)函數(shù)中加上相應(yīng)的delete表達(dá)式,所以需要一個(gè)虛析構(gòu)函數(shù)。
六、
類需要一個(gè)虛析構(gòu)函數(shù)么?
有些類需要虛析構(gòu)函數(shù)只是為了聲明他們的析構(gòu)函數(shù)是虛的。當(dāng)然,決不會(huì)用做基類的類是不需要虛析構(gòu)函數(shù)的:任何虛函數(shù)只在繼承的情況下才有用。
虛析構(gòu)函數(shù)通常是空的。
七、
你的類需要復(fù)制構(gòu)造函數(shù)么?
很多時(shí)候答案都是“不”,但是有時(shí)候答案是“是”。關(guān)鍵在于復(fù)制該類對(duì)象是否就相當(dāng)于復(fù)制其數(shù)據(jù)成員和基類對(duì)象。如果并不相當(dāng),就需要復(fù)制構(gòu)造函數(shù)。
如果你的類在構(gòu)造函數(shù)內(nèi)分配資源,則可能需要一個(gè)顯示的復(fù)制構(gòu)造函數(shù)來管理資源。有析構(gòu)函數(shù)的類通常是析構(gòu)函數(shù)來釋放構(gòu)造函數(shù)分配的資源,這通常說明需要一個(gè)復(fù)制構(gòu)造函數(shù)。(空的虛析構(gòu)函數(shù)除外)
如果不想用戶能夠復(fù)制該類的對(duì)象,就聲明復(fù)制構(gòu)造函數(shù)為私有的。如果其他的成員不會(huì)使用這些成員函數(shù),聲明就足夠了,沒有必要定義它們。
八、
你的類需要一個(gè)賦值操作么?
如果需要復(fù)制構(gòu)造函數(shù),同理多半也會(huì)需要一個(gè)賦值操作。
九、
你的賦值操作符能正確地將對(duì)象賦給對(duì)象本身么?
賦值總是用新值取代目標(biāo)對(duì)象的舊值。如果原對(duì)象和目標(biāo)對(duì)象是同一個(gè),而我們又奉行“先釋放舊值,再復(fù)制”的行事規(guī)程,那么就可能在還沒有實(shí)施復(fù)制之前就把原對(duì)象銷毀了。
十、
你的類需要定義關(guān)系操作符么?
如果你的類邏輯上支持相等操作,那么提供operate== 和operate!=可能會(huì)有好處。類似的,如果你的類的值有某種排序關(guān)系,那就可能會(huì)想提供余下的關(guān)系操作符。只要它們想創(chuàng)建你的類型的有序集合,你就必須提供關(guān)系操作符。
十一 刪除數(shù)組時(shí)你記住了用delete[]么?
這個(gè)形式的存在,是C++希望在保持與C的兼容性的同時(shí)關(guān)注效率。C++要求用戶告知要被刪除的是不是數(shù)組。如果是,該實(shí)現(xiàn)就可能會(huì)提供另一個(gè)地方來存儲(chǔ)長度,因?yàn)榕c數(shù)組所需的內(nèi)存量相比,這個(gè)常數(shù)的開銷會(huì)小很多。
十二
記得在復(fù)制構(gòu)造函數(shù)和賦值操作符的參數(shù)類型中加上了const么?
復(fù)制構(gòu)造函數(shù)應(yīng)該是像X::X(const X&)這樣,畢竟復(fù)制對(duì)象不會(huì)改變?cè)瓕?duì)象。實(shí)際上,由于綁定一個(gè)非const引用到一個(gè)臨時(shí)對(duì)象是非法的,使用X::X(X&)作為復(fù)制構(gòu)造函數(shù)不會(huì)允許復(fù)制任何特殊表達(dá)式的結(jié)果。同樣道理適用于賦值。
十三 如果函數(shù)有引用參數(shù),它們應(yīng)該是const引用么?
只有當(dāng)函數(shù)想改變參數(shù)時(shí),它才應(yīng)該有不用const聲明的引用參數(shù)。
其中很多作者提到,提這些問題并不是希望去尋求答案,只是希望能夠激勵(lì)你進(jìn)行思考。所以當(dāng)我們?cè)O(shè)計(jì)一個(gè)類的時(shí)候,多思考一下,有沒有什么地方需要注意的,我們?cè)O(shè)計(jì)的類將會(huì)更合理,更健壯一些。
今天抱著書在做這么一道題:
整數(shù)/字符串轉(zhuǎn)換
編寫兩個(gè)轉(zhuǎn)換例程。第一個(gè)例程將一個(gè)字符串轉(zhuǎn)換成帶符號(hào)的整數(shù)。您可以假定這個(gè)字符串只包含數(shù)字和符號(hào)字符('-'),是一個(gè)格式正確的整數(shù),而且這個(gè)數(shù)字在int類型的范圍之內(nèi)。第二個(gè)例程將Int類型中存儲(chǔ)的有符號(hào)整數(shù)轉(zhuǎn)換回字符串。
其中碰到了int與char的轉(zhuǎn)換問題。這個(gè)還真的把我難住了。我先用最笨的方法switch進(jìn)行了轉(zhuǎn)換。你也知道這肯定不是最優(yōu)的方法。直接轉(zhuǎn)換,值也肯定不對(duì)。
后來發(fā)現(xiàn)竟然是這么使用的,趕快記錄下來。
1、int 轉(zhuǎn)換成char
例如:
int n = 1;
char ch = char(n + '0');
不過需要注意,此處的n只能是0-9之間的字符
2、char轉(zhuǎn)換成Int
char ch = '9';
int n = int(ch) - int('0');
此處ch也是‘0’至‘9’的數(shù)字字符
多多學(xué)習(xí),抓住機(jī)遇。
快捷方式的讀取和創(chuàng)建
一、快捷方式的獲取
SHGetShortcutTarget
功能:
獲取快捷方式的目標(biāo)路徑
原型:
BOOL SHGetShortcutTarget(
LPTSTR szShortcut,
LPTSTR szTarget,
int cbMax
);
參數(shù):
szShortcut :包含快捷方式名字的字符串
szTarget :包含快捷方式目標(biāo)路徑的字符串, 字符串的大小至少是cbMax。
cbMax :將被拷貝到緩存szTarget的最大字符串
返回值:
成功返回TRUE,否則返回FALSE。
示例代碼:
TCHAR StartMenuFilePath[MAX_PATH];
::SHGetSpecialFolderPath(NULL, StartMenuFilePath, CSIDL_PROGRAMS, FALSE);
TCHAR szShortPath[MAX_PATH];
wsprintf(szShortPath, _T("%s\\%s"), StartMenuFilePath, _T("搜索.lnk"));
TCHAR szFilePath[MAX_PATH];
:SHGetShortcutTarget(szShortPath, szFilePath, sizeof(szFilePath));
執(zhí)行完畢后,
szFilePath 的值為shfind.exe
二、快捷方式的創(chuàng)建
SHCreateShortcut
功能:
創(chuàng)建快捷方式。
原型:
DWORD WINAPI SHCreateShortcut(
LPTSTR szShortcut,
LPTSTR szTarget
);
參數(shù):
szShortcut :包含快捷方式名字和路徑的字符串。在路徑指定的位置創(chuàng)建快捷方式。
szTarget: 包含快捷方式目標(biāo)路徑和參數(shù)的字符串。大小限定在256個(gè)字符以內(nèi)。
返回值:
成功返回TRUE,否則返回FALSE。如果指定的快捷方式已經(jīng)存在的話將返回FALSE。
示例代碼:
SHCreateShortcut(_T("\\搜索.lnk"), _T("shfind.exe"));
執(zhí)行結(jié)果為在根目錄下創(chuàng)建了“搜索.lnk”這個(gè)快捷方式文件。
三、補(bǔ)充說明
這里主要針對(duì)獲取快捷方式的內(nèi)容進(jìn)行幾點(diǎn)說明:
我們獲取快捷方式的時(shí)候,內(nèi)容不一定只包含路徑,有可能存在一下的情況,如:
1、路徑后跟隨名稱
\Windows\“開始”菜單\程序\任務(wù).lnk
2、縮寫名
poutlook.exe tasks
\Windows\“開始”菜單\程序\ActiveSync.lnk
:MSSYNCAPP
3、路徑后跟隨數(shù)字
\Windows\“開始”菜單\程序\游戲\icon.lnk
shellres.dll,-8229
考慮以上這幾種情況,我們?cè)讷@取快捷方式路徑時(shí),需要對(duì)路徑做一些特殊處理。這里重點(diǎn)說一下第二種情況,這個(gè)縮寫代表什么意思?在網(wǎng)上搜索了一下,原來我們可以在[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Rai\]鍵值下找到名為:MSSYNCAPP的子鍵,鍵值為1的子鍵數(shù)值指明了名為:MSSYNCAPP的程序名稱。但我們從這里獲得的值,有時(shí)也不是路徑,還會(huì)再次出現(xiàn)上述三種情況。所以,如果我們想從快捷方式中獲取路徑的話,就需要留意一些了。
至于為什么會(huì)這樣,我還不是很明白。