首頁 - 網(wǎng)校 - 萬題庫 - 直播 - 雄鷹網(wǎng)校 - 團(tuán)購 - 書城 - ? - 學(xué)習(xí)通 - 導(dǎo)航 -
首頁網(wǎng)校萬題庫直播雄鷹網(wǎng)校團(tuán)購書城模考論壇實(shí)用文檔作文大全寶寶起名
2015中考
法律碩士
2015高考
MBA考試
2015考研
MPA考試
在職研
中科院
考研培訓(xùn)
專升本
自學(xué)考試 成人高考
四 六 級(jí)
GRE考試
攻碩英語
零起點(diǎn)日語
職稱英語
口譯筆譯
申碩英語
零起點(diǎn)韓語
商務(wù)英語
日語等級(jí)
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點(diǎn)英語
托?荚
托業(yè)考試
零起點(diǎn)法語
雅思考試
成人英語三級(jí)
零起點(diǎn)德語
等級(jí)考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計(jì)算機(jī) 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報(bào) 關(guān) 員
外 銷 員
價(jià)格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報(bào)檢員
法律顧問
管理咨詢
企業(yè)培訓(xùn)
社會(huì)工作者
銀行從業(yè)
教師資格
營(yíng)養(yǎng)師
保險(xiǎn)從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國際商務(wù)
心理咨詢
營(yíng) 銷 師
司法考試
國際貨運(yùn)代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格
基金從業(yè)資格
統(tǒng)計(jì)從業(yè)資格
經(jīng)濟(jì)師
精算師
統(tǒng)計(jì)師
會(huì)計(jì)職稱
法律顧問
ACCA考試
初級(jí)會(huì)計(jì)職稱
資產(chǎn)評(píng)估師
高級(jí)經(jīng)濟(jì)師
注冊(cè)會(huì)計(jì)師
高級(jí)會(huì)計(jì)師
美國注冊(cè)會(huì)計(jì)師
審計(jì)師考試
國際內(nèi)審師
注冊(cè)稅務(wù)師
理財(cái)規(guī)劃師
一級(jí)建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價(jià)師
二級(jí)建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價(jià)工程師
注冊(cè)測(cè)繪師
質(zhì)量工程師
巖土工程師
注冊(cè)給排水
造價(jià)員考試
注冊(cè)計(jì)量師
環(huán)保工程師
化工工程師
暖通工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
消防工程師
監(jiān)理工程師
房地產(chǎn)估價(jià)
土地估價(jià)師
安全評(píng)價(jià)師
房地產(chǎn)經(jīng)紀(jì)人
投資項(xiàng)目管理師
環(huán)境影響評(píng)價(jià)師
土地登記代理人
寶寶起名
繽紛校園
實(shí)用文檔
入黨申請(qǐng)
英語學(xué)習(xí)
思想?yún)R報(bào)
作文大全
工作總結(jié)
求職招聘 論文下載 直播課堂
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員 > 正文

2015年軟件水平考試程序員精選題(7)

考試吧整理“2015年軟件水平考試程序員精選題(7)”供考生參考,更多軟件水平考試資訊和備考資料請(qǐng)關(guān)注考試吧軟件水平考試網(wǎng)。

  查看匯總:2015軟件水平考試程序員精選題匯總

  把字符串轉(zhuǎn)換成整數(shù)

  題目:輸入一個(gè)表示整數(shù)的字符串,把該字符串轉(zhuǎn)換成整數(shù)并輸出。例如輸入字符串"345",則輸出整數(shù)345。

  分析:這道題盡管不是很難,學(xué)過C/C++語言一般都能實(shí)現(xiàn)基本功能,但不同程序員就這道題寫出的代碼有很大區(qū)別,可以說這道題能夠很好地反應(yīng)出程序員的思維和編程習(xí)慣,因此已經(jīng)被包括微軟在內(nèi)的多家公司用作面試題。建議讀者在往下看之前自己先編寫代碼,再比較自己寫的代碼和下面的參考代碼有哪些不同。

  首先我們分析如何完成基本功能,即如何把表示整數(shù)的字符串正確地轉(zhuǎn)換成整數(shù)。還是以"345"作為例子。當(dāng)我們掃描到字符串的第一個(gè)字符'3'時(shí),我們不知道后面還有多少位,僅僅知道這是第一位,因此此時(shí)得到的數(shù)字是3。當(dāng)掃描到第二個(gè)數(shù)字'4'時(shí),此時(shí)我們已經(jīng)知道前面已經(jīng)一個(gè)3了,再在后面加上一個(gè)數(shù)字4,那前面的3相當(dāng)于30,因此得到的數(shù)字是3*10+4=34。接著我們又掃描到字符'5',我們已經(jīng)知道了'5'的前面已經(jīng)有了34,由于后面要加上一個(gè)5,前面的34就相當(dāng)于340了,因此得到的數(shù)字就是34*10+5=345。

  分析到這里,我們不能得出一個(gè)轉(zhuǎn)換的思路:每掃描到一個(gè)字符,我們把在之前得到的數(shù)字乘以10再加上當(dāng)前字符表示的數(shù)字。這個(gè)思路用循環(huán)不難實(shí)現(xiàn)。

  由于整數(shù)可能不僅僅之含有數(shù)字,還有可能以'+'或者'-'開頭,表示整數(shù)的正負(fù)。因此我們需要把這個(gè)字符串的第一個(gè)字符做特殊處理。如果第一個(gè)字符是'+'號(hào),則不需要做任何操作;如果第一個(gè)字符是'-'號(hào),則表明這個(gè)整數(shù)是個(gè)負(fù)數(shù),在最后的時(shí)候我們要把得到的數(shù)值變成負(fù)數(shù)。

  接著我們?cè)囍幚矸欠ㄝ斎。由于輸入的是指針,在使用指針之前,我們要做的第一件是判斷這個(gè)指針是不是為空。如果試著去訪問空指針,將不可避免地導(dǎo)致程序崩潰。另外,輸入的字符串中可能含有不是數(shù)字的字符。每當(dāng)碰到這些非法的字符,我們就沒有必要再繼續(xù)轉(zhuǎn)換。最后一個(gè)需要考慮的問題是溢出問題。由于輸入的數(shù)字是以字符串的形式輸入,因此有可能輸入一個(gè)很大的數(shù)字轉(zhuǎn)換之后會(huì)超過能夠表示的最大的整數(shù)而溢出。

  現(xiàn)在已經(jīng)分析的差不多了,開始考慮編寫代碼。首先我們考慮如何聲明這個(gè)函數(shù)。由于是把字符串轉(zhuǎn)換成整數(shù),很自然我們想到:

  int StrToInt(const char* str);

  這樣聲明看起來沒有問題。但當(dāng)輸入的字符串是一個(gè)空指針或者含有非法的字符時(shí),應(yīng)該返回什么值呢?0怎么樣?那怎么區(qū)分非法輸入和字符串本身就是”0”這兩種情況呢?

  接下來我們考慮另外一種思路。我們可以返回一個(gè)布爾值來指示輸入是否有效,而把轉(zhuǎn)換后的整數(shù)放到參數(shù)列表中以引用或者指針的形式傳入。于是我們就可以聲明如下:

  bool StrToInt(const char *str, int& num);

  這種思路解決了前面的問題。但是這個(gè)函數(shù)的用戶使用這個(gè)函數(shù)的時(shí)候會(huì)覺得不是很方便,因?yàn)樗荒苤苯影训玫降恼麛?shù)賦值給其他整形變臉,顯得不夠直觀。

  前面的第一種聲明就很直觀。如何在保證直觀的前提下當(dāng)碰到非法輸入的時(shí)候通知用戶呢?一種解決方案就是定義一個(gè)全局變量,每當(dāng)碰到非法輸入的時(shí)候,就標(biāo)記該全局變量。用戶在調(diào)用這個(gè)函數(shù)之后,就可以檢驗(yàn)該全局變量來判斷轉(zhuǎn)換是不是成功。

  下面我們寫出完整的實(shí)現(xiàn)代碼。參考代碼:

  enum Status {kValid = 0, kInvalid};

  int g_nStatus = kValid;

  ///////////////////////////////////////////////////////////////////////

  // Convert a string into an integer

  ///////////////////////////////////////////////////////////////////////

  int StrToInt(const char* str)

  {

  g_nStatus = kInvalid;

  longlongnum = 0;

  if(str != NULL)

  {

  const char* digit = str;

  // the first char in the string maybe '+' or '-'

  bool minus = false;

  if(*digit == '+')

  digit ++;

  else if(*digit == '-')

  {

  digit ++;

  minus = true;

  }

  // the remaining chars in the string

  while(*digit != '\0')

  {

  if(*digit >= '0' && *digit <= '9')

  {

  num = num * 10 + (*digit - '0');

  // overflow

  if(num>std::numeric_limits::max())

  {

  num = 0;

  break;

  }

  digit++;

  }

  // if the char is not a digit, invalid input

  else

  {

  num = 0;

  break;

  }

  }

  if(*digit == '\0')

  {

  g_nStatus = kValid;

  if(minus)

  num = 0 - num;

  }

  }

  return static_cast(num);

  }

  討論:在參考代碼中,我選用的是第一種聲明方式。不過在面試時(shí),我們可以選用任意一種聲明方式進(jìn)行實(shí)現(xiàn)。但當(dāng)面試官問我們選擇的理由時(shí),我們要對(duì)兩者的優(yōu)缺點(diǎn)進(jìn)行評(píng)價(jià)。第一種聲明方式對(duì)用戶而言非常直觀,但使用了全局變量,不夠優(yōu)雅;而第二種思路是用返回值來表明輸入是否合法,在很多API中都用這種方法,但該方法聲明的函數(shù)使用起來不夠直觀。

  最后值得一提的是,在C語言提供的庫函數(shù)中,函數(shù)atoi能夠把字符串轉(zhuǎn)換整數(shù)。它的聲明是int atoi(const char *str)。該函數(shù)就是用一個(gè)全局變量來標(biāo)志輸入是否合法的。

  相關(guān)推薦:

  2015年軟考信息技術(shù)處理員考前知識(shí)點(diǎn)總結(jié)匯總

  2015年軟件水平考試《程序員》提高練習(xí)題匯總

  2015軟件水平考試《程序員》知識(shí)點(diǎn)總結(jié)匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
Copyright © 2004- 考試吧軟件水平考試網(wǎng) All Rights Reserved 
中國科學(xué)院研究生院權(quán)威支持(北京)
在線模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧