




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、作業(yè)7基本內(nèi)容:要求:(最后的壓縮文件rar提交到精品課程網(wǎng)站中)1 獨(dú)立完成,作業(yè)雷同不予計(jì)算平時(shí)成績(jī);2 書面作業(yè)提交word文檔,文件名為:班級(jí)+姓名+學(xué)號(hào)+(7).doc;3上機(jī)作業(yè)要上機(jī)調(diào)試通過,且寫出測(cè)試數(shù)據(jù)及運(yùn)行結(jié)果,放到2.的文檔中;4提交上機(jī)作業(yè)的源程序cpp文件,標(biāo)明題號(hào); 5全部?jī)?nèi)容完成后,將上述內(nèi)容壓縮在一起,壓縮文件名為:班級(jí)+姓名+學(xué)號(hào)+(7).rar 。一、書面作業(yè):完成第六章教材練習(xí)與思考題6-5,6-6,6-7,6-8,6-96習(xí)題與習(xí)題解答6-1請(qǐng)說明以下語句的區(qū)別:(1)聲明int* ptr;語句 *ptr = 2400; 與語句 ptr = 2400;
2、的區(qū)別。(2)聲明int m = 10;語句int* mptr = &m; 與語句 int* mptr; *mptr = m; 的區(qū)別。(3)語句 char name = Computer; 與語句 char name = C, o, m, p, u, t, e, r ; 的區(qū)別。【解答】(1)聲明int* ptr時(shí),語句*ptr = 2400使指針ptr所指向的變量賦值為2400。而語句ptr = 2400使指針ptr本身賦值為2400,即使得該指針指向內(nèi)存地址為2400的變量。(2)聲明int m = 10時(shí),語句int *mptr = &m使指針ptr的賦值為變量m的地址,使得指針mpt
3、r指向m。而語句*mptr = m表示使指針mptr所指向的變量(這時(shí)不一定是m)賦值為m的值,使得mptr所指向的變量的值與m的值相同。(3)聲明char name = Computer聲明一個(gè)字符數(shù)組,其內(nèi)容初始化為Computer,該字符串有8個(gè)字符,再加上結(jié)束符0,數(shù)組name共有9個(gè)元素,且因?yàn)橛薪Y(jié)束符所以可看作字符串。聲明char name = C, o, m, p, u, t, e, r聲明一個(gè)字符數(shù)組,每個(gè)元素被分別初始化為C, o, m, p, u, t, e, r,該數(shù)組共有8個(gè)元素,因?yàn)闆]有結(jié)束符,該字符數(shù)組不可看作字符串。6-2請(qǐng)完成以下變量的聲明(1)指向字符的指針變
4、量char_ptr;(2)10個(gè)字符的數(shù)組char_array;(3)指向字符串的指針變量 string_ptr;(4)10個(gè)字符串的數(shù)組string_array;(5)指向字符串?dāng)?shù)組的指針變量string_array_ptr;【分析】對(duì)于此題中復(fù)雜的變量聲明可利用類型解析式進(jìn)行解答。【解答】(1)聲明為:char* char_ptr;(2)聲明為:char char_array10;(3)首先該聲明的類型解析式為:string_ptr-*-*-char,即string_ptr是指針,指向一個(gè)字符串,字符串通常聲明為基類型是char類型的指針。從而本題相應(yīng)的類型表達(dá)式是char*,其聲明是:c
5、har* string_ptr;(4)首先該聲明的類型解析式為:string_array-*-char,即string_ptr是有10個(gè)元素的數(shù)組,每個(gè)元素是字符串,字符串通常聲明為基類型是char類型的指針。從而本題相應(yīng)的類型表達(dá)式為char*,其聲明是:char* string_ptr10;(5)首先該聲明的類型解析式為:string_array_ptr-*-*-char,即string_array_ptr是指針,指向一個(gè)數(shù)組,該數(shù)組的每個(gè)元素是字符串。因此本題相應(yīng)的類型表達(dá)式為:char*(*),其聲明是:char* (*string_array_ptr);6-3請(qǐng)?jiān)敿?xì)說明以下使用數(shù)組或
6、指針的程序片段有什么編譯錯(cuò)誤(1)int* age_ptr, test_ptr;int m = 3;*age_ptr = &m; test_ptr = &m;(2)int* salary_ptr;float* work_hours_ptr = 300.0;salary_ptr = work_hours_ptr;(3)int int_array10;int* int_ptr = new int10;int_array+; int_ptr+int_array = int_ptr;(4)extern int test_func(int);int (*func)(int);func = &test_f
7、unc;(*func)+;(5)char* depart;char name30;int int_array3;depart = Computer;name = Department;int_array = 1, 2, 3 ;(6)char name4 = Computer, Depart, Software, Engineer;int scores = 1, 2, 3, 4, 5, 6;float salary2 = 1, 2, 3, 4, 5, 6;int max_number = 4;double amountmax_number;【解答】(1)語句*age_ptr = &m產(chǎn)生語法錯(cuò)誤
8、,*age_ptr代表指針age_ptr指向的變量,其類型為int,而&m取m的地址,其結(jié)果類型是int*,不能將int*類型的值轉(zhuǎn)換為int類型。語句test_ptr = &m也產(chǎn)生語法錯(cuò)誤,題中所聲明的test_ptr實(shí)際上是int類型的變量,不是指針。(2)語句float* work_hours_ptr = 300.0產(chǎn)生語法錯(cuò)誤,聲明變量時(shí)的賦值運(yùn)算符是分隔符,其右邊的初始化表達(dá)式的結(jié)果要能賦值給左邊的變量,這時(shí)*代表work_hours_ptr是指針,與類型名float結(jié)合,而不是與變量名結(jié)合,不能將double類型的常量轉(zhuǎn)換為float*類型的數(shù)據(jù)。語句salary_ptr = w
9、ork_hours_ptr也產(chǎn)生錯(cuò)誤,兩個(gè)基類型不同的指針不能賦值。(3)語句int_array+和語句int_array = int_ptr產(chǎn)生語法錯(cuò)誤,因?yàn)閿?shù)組名被看作指針常量,其值不能改變,不能指向其它變量。這兩個(gè)語句都試圖改變指針常量int_array,因此產(chǎn)生語法錯(cuò)誤。(4)語句(*func)+產(chǎn)生語法錯(cuò)誤,函數(shù)指針同樣被看作指針常量。實(shí)際上,(*func)相當(dāng)于函數(shù)名字,不能做+運(yùn)算。(5)語句name = Liu Bing產(chǎn)生語法錯(cuò)誤,數(shù)組名被看作指針常量,該語句的含義是將name再指向字符串Liu Bing,這需要改變name的值。語句int_array = 1, 2, 3 也
10、產(chǎn)生錯(cuò)誤,因?yàn)閕nt_array被看作指針常量。注意語句depart = Computer Science并不產(chǎn)生語法錯(cuò)誤,它使得指針depart指向字符串常量Computer Science,即使得depart的值為該字符串所在的存儲(chǔ)空間的起始位置。(6)C+語言規(guī)定聲明數(shù)組時(shí)只能最左邊一維的長(zhǎng)度可缺省,其它維必須使用常量表達(dá)式指定長(zhǎng)度。因此本小題的name, scores和amount三個(gè)數(shù)組的聲明都產(chǎn)生語法錯(cuò)誤。6-4以下程序片段都沒有任何語法錯(cuò)誤,甚至連警告錯(cuò)誤也沒有(假設(shè)這些程序片段都正確地包含了頭文件iostream.h和string.h),但它們?cè)谶\(yùn)行時(shí)都可能產(chǎn)生致命的錯(cuò)誤,請(qǐng)指
11、出這些錯(cuò)誤,并說明為什么(1)int* age_ptr;int age = 30;*age_ptr = age;(2)const int student_number = 20;int scoresstudent_number;for (int i = 1; i = student_number; i+) scoresi = 0;(3)const int name_len = 8;char namename_len = Computer;char departname_len = C, o, m, p, u, t, e, r;if (strcmp(name, depart) = 0) cout
12、 nDepart is equal to name?!;(4)const int row = 2, col = 2;float matrixrow, col;for (int j = 0; j row; j+)for (int k = 0; k col; k+) *(*(matrix+row*j)+k) = 0.0;(5)char *depart = Computer Science;char *univ = Zhongshan University;strcpy(depart, univ);cout Department of depart n;delete depart;delete un
13、iv;(6)const int msg_len = 80;char *error_msg = new charmsg_len+1;char *prompt_msg = new charmsg_len+1;strcpy(error_msg, Use character pointer error!);prompt_msg = error_msg;cout prompt_msg n;delete prompt_msg;delete error_msg;【解答】(1)語句*age_ptr = age;發(fā)生運(yùn)行錯(cuò)誤,聲明指針age_ptr后,沒有為之分配存儲(chǔ)空間,則age_ptr的值是隨機(jī)的,*age
14、_ptr引用的存儲(chǔ)區(qū)域也是隨機(jī)的,將age的值賦給該存儲(chǔ)區(qū)域,將破壞未知存儲(chǔ)區(qū)域的值而產(chǎn)生運(yùn)行錯(cuò)誤。(2)程序片段的for語句使用數(shù)組scores越界,引用數(shù)組元素的有效下標(biāo)范圍是從0到student_number-1。(3)語句char namename_len = Computer將產(chǎn)生運(yùn)行錯(cuò)誤,用于初始化數(shù)組的字符串共占9個(gè)字節(jié)的存儲(chǔ)空間,而數(shù)組長(zhǎng)度只有8個(gè)字節(jié),不能容下該字符串。另外程序片段中的if語句也將產(chǎn)生運(yùn)行錯(cuò)誤,因?yàn)閐epart只是一個(gè)字符數(shù)組,沒有結(jié)束符,不能看成字符串,函數(shù)strcmp()只能比較兩個(gè)字符串,它根據(jù)字符串的結(jié)束符來結(jié)束比較。(4)數(shù)組matrix的使用越界,
15、按照二維數(shù)組與指針的關(guān)系知道,*(*(matrix + row * j) + k) 相當(dāng)于matrixrow * jk,這當(dāng)然越界。(5)語句strcpy(depart, univ)產(chǎn)生運(yùn)行錯(cuò)誤,因?yàn)橹羔榙epart指向的字符串占用17(即字符串Computer Science的長(zhǎng)度加1)字節(jié)的存儲(chǔ)空間,而指針univ所指向的字符串需要更多的內(nèi)存,使用strcpy()函數(shù)進(jìn)行拷貝將會(huì)破壞未知存儲(chǔ)區(qū)域。語句delete depart和delete univ也會(huì)發(fā)生運(yùn)行錯(cuò)誤,因?yàn)樯鲜龀绦蚱问惯@兩個(gè)指針分別指向兩個(gè)字符串常量,沒有為兩個(gè)指針分配內(nèi)存,因此不能釋放其指向的內(nèi)存。(6)語句delete
16、 error_msg將產(chǎn)生運(yùn)行錯(cuò)誤,因?yàn)檎Z句prompt_msg = error_msg使得這兩個(gè)指針互為別名而指向同一存儲(chǔ)區(qū)域,釋放prompt_msg所指向的存儲(chǔ)區(qū)域也就釋放了error_msg所指向的存儲(chǔ)區(qū)域,但同一存儲(chǔ)區(qū)域不能釋放兩次。該程序片段存在的另一問題是原先為prompt_msg分配的存儲(chǔ)區(qū)域無法再訪問,從而產(chǎn)生存儲(chǔ)垃圾?!居懻摗渴褂弥羔樅蛿?shù)組容易產(chǎn)生的運(yùn)行錯(cuò)誤通常有以下幾個(gè)方面:1.數(shù)組訪問越界。特別注意將數(shù)組名字當(dāng)做指針常量時(shí),引用數(shù)組的元素不要越界。2.指針分配內(nèi)存和釋放內(nèi)存不匹配。指針的初始化通常有兩種方式,一是使其指向已存在的變量,此時(shí)該變量的內(nèi)存不是通過指針動(dòng)態(tài)分配
17、,也就不應(yīng)該通過指針動(dòng)態(tài)釋放;二是為該指針動(dòng)態(tài)分配內(nèi)存,實(shí)際上是使該指針指向匿名的變量,此時(shí)該匿名變量的存儲(chǔ)空間通過該指針動(dòng)態(tài)分配,在該指針超出生存期前要釋放該匿名變量占用的存儲(chǔ)空間。在下述情況下要特別注意指針的存儲(chǔ)分配和釋放的匹配:a.指針的存儲(chǔ)分配在條件語句(如if語句)中,這時(shí)要保證在同樣條件下釋放。b.函數(shù)參數(shù)是指針,且該指針必須分配存儲(chǔ)空間,并在函數(shù)中要改變它所指向的變量的值時(shí),作為實(shí)際參數(shù)的指針的內(nèi)存分配和釋放應(yīng)由函數(shù)調(diào)用者負(fù)責(zé),不應(yīng)在函數(shù)中分配而由函數(shù)調(diào)用者負(fù)責(zé)釋放。當(dāng)函數(shù)調(diào)用者不知道函數(shù)需要多少存儲(chǔ)空間時(shí),可估計(jì)一個(gè)最大值,按最大值為實(shí)際參數(shù)分配存儲(chǔ)空間。c.類有指針類型的成員
18、時(shí),該成員的存儲(chǔ)分配和釋放往往不會(huì)在同一個(gè)成員函數(shù)進(jìn)行,這時(shí)必須通過類的界面說明提醒類的使用者保證既調(diào)用分配該成員存儲(chǔ)空間的成員函數(shù),又調(diào)用釋放該成員存儲(chǔ)空間的成員函數(shù)。3.兩個(gè)指針互為別名。兩個(gè)指針互為別名容易產(chǎn)生運(yùn)行錯(cuò)誤,既可能產(chǎn)生存儲(chǔ)垃圾,又可能重復(fù)釋放存儲(chǔ)空間,所以應(yīng)盡量避免使兩個(gè)指針互為別名,或盡量避免使兩個(gè)指針長(zhǎng)期指向同一變量,保證將一個(gè)指針的值賦給另一指針總是臨時(shí)的,例如遍歷鏈表的結(jié)點(diǎn)時(shí),使用臨時(shí)指針指向鏈表的每個(gè)結(jié)點(diǎn)通常不看作是指針別名的情況。6-5 請(qǐng)改正以下程序中的錯(cuò)誤,使其能連續(xù)五次輸出字符串string#include main()char string30 = Zho
19、ngshan Universityn;char* ptr = string;/ 連續(xù)五次輸出字符串for (int loop = 0; loop = 4; loop = loop + 1)while (*ptr) cout *ptr;ptr = ptr + 1;return 0;【分析】仔細(xì)檢查該程序可發(fā)現(xiàn)內(nèi)層的while循環(huán)在第一次執(zhí)行結(jié)束后,*ptr為0,即0,這樣試圖第二次打印字符串時(shí),while循環(huán)的條件已不滿足,從而第二次不會(huì)再執(zhí)行循環(huán),結(jié)果只能打印字符串string一次。因此該程序可修改為:【解答】打印字符串string五次#include main()char string30
20、= Zhongshan Universityn;char* ptr = string;/ 連續(xù)五次輸出字符串for (int loop = 0; loop = 4; loop = loop + 1) while (*ptr) cout *ptr;ptr = ptr + 1;ptr = string;return 0;【討論】有多重循環(huán)時(shí),忘記對(duì)內(nèi)層循環(huán)所需的變量進(jìn)行初始化是初學(xué)者常犯的錯(cuò)誤。雖然C+語言可在聲明變量時(shí)初始化,但我們提倡將變量的使用盡量集中,變量的初始化是變量使用的一種特殊情況,所以應(yīng)與變量的其他使用盡量放在一起,例如上述程序?qū)tr的初始化最好作為for循環(huán)體的第一句,因?yàn)閜t
21、r的使用集中在for循環(huán)中。同樣為遵循變量使用集中的原則,程序中不應(yīng)隨時(shí)引入變量的聲明,而要將變量聲明集中在函數(shù)的最前面。6-6 假定下面的各個(gè)函數(shù)function()都由以下的main()函數(shù)調(diào)用,試給出每次的輸出。#include / 函數(shù)function()的適當(dāng)原型說明int main()int x = 5;int y = 18;function(x, y);cout X is x , Y is y n;return 0;(1)void function(int a, int b)a = a + 1;b = b - 2;cout A is a , B is b n;return; (2
22、)void function(int a, int &b)a = a + 1;b = b - 2;cout A is a , B is b n;return; (3)void function(float &a, int &b)a = a + 1;b = b - 2;cout A is a , B is b n;return; 【分析】此題考察讀者對(duì)參數(shù)傳遞方式的理解。C+語言有兩種參數(shù)傳遞,一是按值傳遞,這時(shí)函數(shù)體對(duì)形式參數(shù)的修改不會(huì)影響實(shí)際參數(shù);二是按引用傳遞,這時(shí)形式參數(shù)實(shí)際參數(shù)的別名,對(duì)形式參數(shù)的修改會(huì)影響實(shí)際參數(shù)。但在按引用傳遞時(shí),如果實(shí)際參數(shù)的類型與形式參數(shù)類型不相同,就需要作隱式
23、類型轉(zhuǎn)換,這種情況下,形式參數(shù)是實(shí)際參數(shù)作類型轉(zhuǎn)換后得到的臨時(shí)變量的別名,從而對(duì)形式參數(shù)的修改將影響到該臨時(shí)變量,不會(huì)影響實(shí)際參數(shù)。【解答】程序片段的輸出結(jié)果如下:(1)A is 6, B is 16X is 5, Y is 18(2)A is 6, B is 16X is 5, Y is 16(3)A is 6, B is 16X is 5, Y is 18/ 由于發(fā)生隱式類型轉(zhuǎn)換而不會(huì)修改x的值6-7試改正下面使用枚舉類型程序的語法錯(cuò)誤:int main()enum COLOR_TYPE CtWHITE = 2, CtBLACK = 1, CtBLUE color;color = CtBL
24、ACK;switch (color) case CtWHITE: cout nThe color is white!; break;case CtBLACK: cout nThe color is black!; break;case CtBLUE: cout nThe color is blue!; break;return 0;【解答】聲明枚舉類型時(shí),按枚舉常量初始化規(guī)則,CtBLUE將初始化2,其值與CtWHITE相同,從而在switch語句中造成兩個(gè)case后面的常量表達(dá)式的值相同,發(fā)生語法錯(cuò)誤,改正是將CtBLUE顯式初始化為除1和2之外的值。6-8(略)6-9下面程序用來生成n階的
25、魔方陣(這里的n為奇數(shù))。所謂n階魔方陣是指這樣一種方陣,它的每一行和每一列以及兩個(gè)對(duì)角線上的n個(gè)自然數(shù)的和都相等,如下面就是一個(gè)3階的魔方陣816357492試填寫下面程序中的空格,使其能運(yùn)行得到正確結(jié)果。#include #include const int MAX_LEN = 17+1;static int fill_magic(int magicMAX_LEN, int magic_len);static int print_magic(int magicMAX_LEN, int magic_len);int main()int magicMAX_LENMAX_LEN;int magi
26、c_len;do cout nPlease input an odd possitive integer;cout (= (MAX_LEN-1) magic_len; while (magic_len MAX_LEN | magic_len % 2 = 0);fill_magic(magic, magic_len);print_magic(magic, magic_len);return 0;int fill_magic(int magicMAX_LEN, int magic_len)int i, j, row, col, count;count = 1;row = 1;col = ;for
27、(i = 1; i = magic_len; i+) for (j = 1; j = magic_len; j+) magicrowcol = ; count+;if (-row magic_len) col = ;row += 2; if (row magic_len) row -= magic_len;col-; if (col 1) col += magic_len;return 1;int print_magic(int magicMAX_LEN, int magic_len)int row, col, count;cout nThe magic_len * ;cout magic_l
28、en magic matrix:n;for (count = 1; count = 4 * magic_len + 1; count+) cout -;for (row = 1; row = magic_len; row+) cout n;for (col = 1; col = magic_len; col+) cout setw(3) magicrowcol;cout n;for (count = 1; count = 4 * magic_len + 1; count+) cout -;return 1;【分析】求解程序填空題的關(guān)鍵是理解程序變量的作用。本題在不知道魔方填寫規(guī)則的情況下也可根
29、據(jù)程序中變量的名字和使用猜出變量的作用,并填出程序的空。首先可看到與程序的空有關(guān)的變量主要是row和col,根據(jù)其名字容易猜出它們是魔方的行和列。它們當(dāng)然應(yīng)在魔方的有效范圍內(nèi),從而第三和第四個(gè)空應(yīng)該是將其維持在魔方的有效范圍內(nèi),這樣第三個(gè)空應(yīng)將row設(shè)回為1,第四個(gè)空應(yīng)將col設(shè)回為magic_len,從外層循環(huán)中知道魔方的有效范圍是從1到magic_len。循環(huán)外面對(duì)col的初始化應(yīng)該是數(shù)字1所填寫的地方,從3階魔方看,它應(yīng)該是2,當(dāng)然可想到它不可能對(duì)于其它魔方來說也是2,不難發(fā)現(xiàn),對(duì)于n階魔方發(fā)現(xiàn)該位置應(yīng)該是第一行的中間,這樣第一空可確定為(magic_len+1)/2。第二空不難猜它應(yīng)該
30、是將當(dāng)前數(shù)填至magicrowcol,而哪個(gè)變量記住了當(dāng)前要填的數(shù)呢,顯然是count,所以第二個(gè)空也解決了。在猜出所有空的解答后,應(yīng)手工跟蹤執(zhí)行程序,檢查是否能正確得到3階魔方?!窘獯稹?magic_len + 1) / 2count1magic_len6-10一般來說,C+語言編譯系統(tǒng)都會(huì)提供一個(gè)函數(shù)int atoi(char *s)(該函數(shù)的原型一般在stdlib.h中)將一個(gè)字符串轉(zhuǎn)換為對(duì)應(yīng)的整數(shù),如將串123轉(zhuǎn)換為整數(shù)123。但該函數(shù)都有如下的缺陷,首先它不支持八進(jìn)制和十六進(jìn)制表示,其次當(dāng)傳入的串不能轉(zhuǎn)換為整數(shù)時(shí),函數(shù)輸出結(jié)果為0,不能區(qū)別是否真的發(fā)生了錯(cuò)誤。請(qǐng)自己實(shí)現(xiàn)一個(gè)函數(shù)改進(jìn)該
31、函數(shù),從而消除以上兩個(gè)缺陷,例如新函數(shù)可這樣聲明int str_to_int(char *str, int &result),其中函數(shù)返回值來表示是否發(fā)生錯(cuò)誤,在沒有錯(cuò)誤的情況下,result傳回轉(zhuǎn)換的結(jié)果。注意八進(jìn)制和十六進(jìn)制的處理?!痉治觥繉?duì)此問題可使用自頂向下分解的辦法得到程序。題目所要解決的問題是將一個(gè)字符串轉(zhuǎn)換為整數(shù),該字符串可以是整數(shù)的十進(jìn)制、八進(jìn)制或十六進(jìn)制表示,若轉(zhuǎn)換成功則使用result存放該整數(shù)的值(也就是轉(zhuǎn)換的結(jié)果),并返回1,否則返回0。題目沒有規(guī)定整數(shù)的八進(jìn)制、十六進(jìn)制的具體表示方式,這需要程序員自己確定,并作為該函數(shù)設(shè)計(jì)的一部分,以約束函數(shù)的調(diào)用者。可作出許多不同的
32、約定,但如果遵循C+語言的表示方式則更容易接受,所以我們決定,當(dāng)字符串的第一個(gè)字符是0時(shí),該字符串是整數(shù)的八進(jìn)制表示,而頭兩個(gè)字符是0x或0X則是十六進(jìn)制表示。確定這一點(diǎn)后,可將問題分解為兩個(gè)步驟:1.確定字符串是整數(shù)的幾進(jìn)制表示。2.將字符串轉(zhuǎn)換為整數(shù)。對(duì)于第二步,設(shè)字符串為a0a1a2.an-1,是整數(shù)的radius進(jìn)制表示,轉(zhuǎn)換結(jié)果要放在result中,轉(zhuǎn)換算法可如下:1.設(shè)置初值,即令result = 0, i = 02.如果ai合法,將ai轉(zhuǎn)換為相應(yīng)的整數(shù)bit,否則轉(zhuǎn)換失敗。3.令result = result * radius + bit4.判斷i是否大于n-1(即判斷是否轉(zhuǎn)換完
33、畢),成立則轉(zhuǎn)換成功,否則轉(zhuǎn)2上述算法的步驟2還可分解為兩個(gè)問題,一怎樣判斷字符在某個(gè)進(jìn)制下是否合法,二是將合法的字符轉(zhuǎn)換為整數(shù)。通過這種分解,為實(shí)現(xiàn)函數(shù)str_to_int(),可引入下列函數(shù):int get_radius(char* str);/ 判斷一個(gè)字符串是幾進(jìn)制表示int check_bit(char bit_char, int radius);/ 判斷某字符是否是某進(jìn)制下合法的一位int get_bit(char bit_char, int radius);/ 轉(zhuǎn)換用字符表示的一位為整數(shù)以下程序體現(xiàn)了上述思路:【解答】實(shí)現(xiàn)函數(shù)str_to_int()將字符串轉(zhuǎn)換為整數(shù),并演示其用
34、法:#include #include int get_radius(char* str)int radius;char first_char, second_char;first_char = str0; second_char = str1;radius = 10;if (first_char = 0) if (second_char = x | second_char = X) radius = 16;/ str以0x或0X開頭else if (second_char = 1 & second_char = 7) radius = 8;/ str只以0開頭else radius = 0;
35、 else if (first_char 9) radius = 0;/ 發(fā)現(xiàn)非法字符return radius;int check_bit(char bit, int radius)if (radius = 10) if (bit 9) return 0; else if (radius = 8) if (bit 7) return 0; else / 這里假定有radius = 16if (bit 9) & (bit F) &(bit f) return 0;return 1;int get_bit(char bit, int radius)if (radius = 10 | radius
36、 = 8) return (bit - 0);/ 假定bit已經(jīng)合法if (bit = 0 & bit = A & bit = a & bit = f) return (bit - a + 10);return 0;int str2int(char *str, int &result)int radius;int bit;int begin_pos;int i;radius = get_radius(str);if (radius = 0) return 0;if (radius = 10) begin_pos = 0;/ 十進(jìn)制時(shí)從第0個(gè)字符開始轉(zhuǎn)換else if (radius = 8)
37、begin_pos = 1;/ 八進(jìn)制時(shí)從第1個(gè)字符開始轉(zhuǎn)換else begin_pos = 2;/ 十六進(jìn)制時(shí)從第2個(gè)字符開始轉(zhuǎn)換result = 0;for (i = begin_pos; stri != 0; i+) if (check_bit(stri, radius) = 0) return 0;bit = get_bit(stri, radius);result = result * radius + bit;return 1;int main()char intstring80;int result;int is_right;while (1) cout intstring;if
38、 (stricmp(intstring, quit) = 0) return 1;/ 輸入quit表示結(jié)束轉(zhuǎn)換is_right = str2int(intstring, result);if (is_right = 1) / 轉(zhuǎn)換成功 cout nThe result is result of intstring ; else cout nHave error for intstring ;該程序的一個(gè)運(yùn)行實(shí)例如下:Please input a string for transferring, input quit for quit: 3456The result is 3456 of 345
39、6Please input a string for transferring, input quit for quit: 03456The result is 1838 of 03456Please input a string for transferring, input quit for quit: 0x3456The result is 13398 of 0x3456Please input a string for transferring, input quit for quit: quit6-11第四章有一個(gè)練習(xí)要求編寫一個(gè)函數(shù)將整數(shù)轉(zhuǎn)換為對(duì)應(yīng)的字符串輸出,試改進(jìn)該函數(shù),以支持
40、將一個(gè)整數(shù)轉(zhuǎn)換為任意進(jìn)制表示的字符串,轉(zhuǎn)換的結(jié)果不輸出而放入?yún)?shù)傳回調(diào)用程序。例如新函數(shù)可這樣聲明char* int_to_str(int num, int radius, char* result),其中num是待轉(zhuǎn)換的整數(shù),radius指明轉(zhuǎn)換后的結(jié)果串使用多少進(jìn)制表示法,result是轉(zhuǎn)換后的結(jié)果字符串,該參數(shù)由上層調(diào)用程序負(fù)責(zé)分配足夠的內(nèi)存。該函數(shù)最后使用return result語句返回指向結(jié)果字符串的指針,以支持在表達(dá)式中直接引用結(jié)果串?!痉治觥勘绢}實(shí)際是上題的逆問題。這里也需要確定轉(zhuǎn)換后的字符串的表示方法。因?yàn)橐С秩我膺M(jìn)制,所以我們約定轉(zhuǎn)換后的結(jié)果字符串不用在前面加上任何特殊的
41、字符表明是何種進(jìn)制。因此本題得到的字符串如果是整數(shù)的十六進(jìn)制表示,那么將該字符串用于上題函數(shù)以得到該整數(shù)時(shí),須在該字符串前加0x或0X。具體算法的關(guān)鍵在于要將整數(shù)的最高位作為結(jié)果字符串的第一個(gè)字符,因此需要從整數(shù)的最高位開始轉(zhuǎn)換,若number = (a0a1a2.an)radius,即它在radius進(jìn)制下的每一位是a0, a1, a2, . ,an-1, an等,那么根據(jù)如下公式可得到ai:ai = (number / radiusn-i) % radius其中n是使得radiusn小于等于number的最大值,根據(jù)該公式,轉(zhuǎn)換算法分兩個(gè)步驟:1.求max_power = radiusn
42、其中n滿足上述條件。 2.轉(zhuǎn)換number的每一位放入字符串str中。第二步可繼續(xù)分解為:1.設(shè)置初值,即令temp_num = number, i = 0, bit_power = max_power2.如果bit_power = 0,則轉(zhuǎn)換完畢,結(jié)果在字符串str中,否則轉(zhuǎn)33.令stri = (number / bit_power) % radius4.令i = i + 1, bit_power = bit_power / radius,轉(zhuǎn)2根據(jù)上述思路可得到如下程序:【解答】實(shí)現(xiàn)函數(shù)int_to_str()將整數(shù)轉(zhuǎn)換為字符串,并演示其用法:#include #include char
43、*int2str(int number, unsigned int radius, char *result)int left_num, left_char, num_idx;int max_power, left_power;max_power = 1;while (number / max_power) = radius) max_power = max_power * radius;left_power = max_power;num_idx = 0;while (left_power 0) left_num = (number / left_power) % radius;if (le
44、ft_num = 9) left_char = char(0 + left_num);else left_char = char(A + left_num - 10);resultnum_idx = left_char;num_idx = num_idx + 1;left_power = left_power / radius;resultnum_idx = 0;return result;int main()char intstring80;int number;while (1) cout number;if (number = 0) return 1;cout nThe 10 syste
45、m: number the 2 system: ;cout int2str(number, 2, intstring) the 16 system: ;cout int2str(number, 16, intstring);該程序的一個(gè)運(yùn)行實(shí)例如下:Please input a number, input 0 for quit: 3456The 10 system: 3456 the 2 system: 110110000000 the 16 system: D80Please input a number, input 0 for quit: 06-12編寫一個(gè)函數(shù)get_scores()接
46、受用戶輸入的語文、數(shù)學(xué)、物理、化學(xué)和英語五科成績(jī),在main()中利用get_scores()接受輸入,然后計(jì)算總成績(jī)與平均成績(jī)。要求main()和get_scores()之間不得使用全局變量通信?!痉治觥款}目要求主函數(shù)與函數(shù)get_scores()之間不能通過全局變量通信,那么可設(shè)計(jì)函數(shù)get_scores()有五個(gè)參數(shù),分別代表各種分?jǐn)?shù),也可將這五個(gè)分?jǐn)?shù)放入一個(gè)數(shù)組中,不過最好的設(shè)計(jì)還是定義一個(gè)結(jié)構(gòu)存放這五個(gè)分?jǐn)?shù)?!窘獯稹枯斎敕?jǐn)?shù)并計(jì)算總成績(jī)與平均成績(jī)struct SCORES float literal;float math;float physics;float checmistry;
47、float english;void get_scores(SCORES *scores)cout scores-literal;cout scores-math;cout scores-physics;cout scores-checmistry;cout scores-english;return;int main()float total_score;float avg_score;SCORES scores;get_scores(&scores);total_score = scores.literal + scores.math + scores.physics;total_scor
48、e = total_score + scores.checmistry + scores.english;avg_score = total_score / 5;cout The total scores is total_score , ;cout And the average score is avg_score n;return 1;程序的一個(gè)運(yùn)行實(shí)例如下:Please input the score of literal: 86Please input the score of math: 82Please input the score of physics: 88Please input the score of checmistry: 92Please input the score of english: 76The total scores is 424, And the average score is 84.8000036-13單向鏈表與本章的堆棧
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)災(zāi)害應(yīng)急管理指南
- 三農(nóng)工作者的實(shí)踐指南
- 生物質(zhì)顆粒燃料蒸汽發(fā)生器
- 重大項(xiàng)目進(jìn)度協(xié)調(diào)會(huì)議紀(jì)要記錄
- 育嬰師復(fù)習(xí)試題含答案
- 藝術(shù)鑒賞油畫技法分析題集
- 茶藝師復(fù)習(xí)試題含答案(一)
- 外科總論復(fù)習(xí)測(cè)試有答案
- 生物識(shí)別技術(shù)使用手冊(cè)
- 三農(nóng)行業(yè)養(yǎng)殖業(yè)管理手冊(cè)
- 23S519 小型排水構(gòu)筑物
- 華中師范大學(xué)矢量logo課件
- 培訓(xùn)績(jī)效管理與績(jī)效評(píng)價(jià)課件
- 輸血相關(guān)制度及流程-課件
- DGT252-2021農(nóng)機(jī)播種作業(yè)監(jiān)測(cè)終端
- 抽水蓄能式水電站機(jī)組巡檢維護(hù)保養(yǎng)與安全管理方案
- 《中華民族一家親》評(píng)課
- 新能源汽車技術(shù)專業(yè)教學(xué)資源庫申報(bào)書
- (投標(biāo)書范本)聘請(qǐng)常年法律顧問項(xiàng)目投標(biāo)書
- 喇榮課誦集(早課部分)
- 【失敗案例】大樹網(wǎng)-傳統(tǒng)企業(yè)的轉(zhuǎn)型之思(市場(chǎng)評(píng)估不足盲目擴(kuò)張)
評(píng)論
0/150
提交評(píng)論