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

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

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

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

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

  題目:輸入一個表示整數(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)我們掃描到字符串的第一個字符'3'時,我們不知道后面還有多少位,僅僅知道這是第一位,因此此時得到的數(shù)字是3。當(dāng)掃描到第二個數(shù)字'4'時,此時我們已經(jīng)知道前面已經(jīng)一個3了,再在后面加上一個數(shù)字4,那前面的3相當(dāng)于30,因此得到的數(shù)字是3*10+4=34。接著我們又掃描到字符'5',我們已經(jīng)知道了'5'的前面已經(jīng)有了34,由于后面要加上一個5,前面的34就相當(dāng)于340了,因此得到的數(shù)字就是34*10+5=345。

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

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

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

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

  int StrToInt(const char* str);

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

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

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

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

  前面的第一種聲明就很直觀。如何在保證直觀的前提下當(dāng)碰到非法輸入的時候通知用戶呢?一種解決方案就是定義一個全局變量,每當(dāng)碰到非法輸入的時候,就標(biāo)記該全局變量。用戶在調(diào)用這個函數(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);

  }

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

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

  相關(guān)推薦:

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

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

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

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