[解答] 計程期末考解答

看板NTUBIME96-HW作者 (bear)時間22年前 (2004/01/21 00:00), 編輯推噓9(900)
留言9則, 6人參與, 最新討論串1/3 (看更多)
突然想起來還沒 po....@@ 第一題:(10分) 寫出下列 C++ 語法中 keyword 的定義或用途: 1. const 當宣告前面加上這個關鍵字時,表示所修飾的物件或變數不可被改變。 以這種方式宣告的話,必須要給定初始值。另外,若是一成員函式的後 面接上 const 關鍵字,則表示該函式不會變動成員中的物件。 2. static 表示所修飾的物件或變數為靜態,此意義為其生命週期與程式相同,會 在程式剛開始的時候配置記憶體,並在程式結束前被消滅。儘管如此, 如果宣告時是位在某個區塊中的話,仍然只有在該區塊範圍內能夠讀取 它。另外,對一個 class 來說,不管以此種結構宣告的物件有多少個, 其靜態成員永遠只有一份實體──所有的物件會共享這些靜態成員。當 一個成員函式前面加上 static 時,表示該函式只會對結構內的靜態成 員做存取。如果是不屬於任何結構的普通函式被冠上 static 的話,則 沒有這種限制;普通的靜態函式只有一項特徵,那就是它不能被計畫( project,我實在不知道怎麼翻.....@@)中的其他檔案存取。(這項特 徵是所有的靜態變數或函式都具備的,包括之前所說的那些。) P.S. 如果你在書上看到什麼不會改變之類的敘述,那是說它的位址不會 改變。靜態變數並沒有 const 的特性,不要弄錯了。還有什麼「 每次看到它都是同一個」之類的,也是在強調它只會被建立一次。 這題很多人錯喔...... 又,如果不知道什麼是 project 的話,請務必去翻翻書喔!我一 時之間說不清楚....(絕不是因為懶! ....真的!) 3. sizeof 一個運算子,後面可以接變數或型態,會回傳其所佔用(或所需要)的 記憶體大小。這個回傳值實際上是 char 型態大小的整數倍,會這樣定 意原因是 C++ 標準中沒有限定哪種型態應該佔用多少記憶體,一切都 交由編譯器來決定。幾乎所有的編譯器都是將 char 定為一個 byte , 所以通常可以把這個單位想成是 byte ,不過實際上的情形還是要以使 用的編譯器為準。另外,sizeof 回傳的型態是 size_t,絕大多數的編 譯器都將之定義為 unsigned int。 P.S. 你可能會有個疑問,不管是型態的大小也好,或者是 size_t 這種 奇怪的型態也罷,為什麼 C++ 標準不直接規定好,還要交給編譯 器決定這麼麻煩?答案是為了彈性與相容性。不同的平台之下每種 型態適合的大小都不一樣,比如說桌上型電腦跟手機多半就不會相 同;但是標準是大家都要遵守的。如果硬在標準中規定好一切,那 很可能就必須放棄某些平台。另外,就算在同一個平台下,由於種 種考量,每一家編譯器定義的方式也可能不一樣。交給編譯器決定 的好處是,只要我的程式碼符合公定標準,就可以在所有地方的流 通,每次跨平台的時候只要重新編譯一次就好了,完全不必更動任 何一行程式碼。 4. unsigned 表示所修飾的變數沒有正負號的差別。由於將原本紀錄正負的位元也拿 紀錄數值了,所以可以儲存比原本大一倍的數值。 5. return 從目前所在的函式立刻跳回到之前做出呼叫的函式中。(對 main() 來 說,則是回到作業系統。)除了標示成 void 的函式外,跳回去的時候 必須夾帶一個變數,作為此函式執行的結果。 6. public 表示以下的成員對外公開,所有函式都可以存取這些成員變數,或是呼 叫這些成員函式。 7. struct 將各種型態的變數或函式組合起來,稱此集合為一個結構,可以當成型 態使用。struct 為 class 的前身,兩者的差別是 struct 中所有的成 員皆為 public。 P.S. 這題也有很多人錯,struct 當然可以有函式啊,事實上它也是有 建構子與解構子的。 8. double 倍精準浮點數,是一種型態,與 float 大致相同,但容量為其兩倍。 9. void 這個關鍵字有三種用法,當它在函式的前面時,表示這個函式沒有回傳 值;當它放在函式的傳入值清單中時,表示這個函式不需要傳入值;當 它作為一個指標的型態時,表示這是一個通用指標。一個被宣告成 void* 的指標可以指到任何型態的變數(const 變數除外),但是在它轉型之 前沒有辦法被解讀。通用指標可以轉型成任何一種指標。 10. break 從 do、while、for、switch 中跳出來。 P.S. 終於打完這題了......看來老師跟我說解答第一題略過果然是相當有見 地.....@@ 不過我看這題普遍答得都不太理想,所以我還是寫一下.... 基本上不用太擔心,老闆的指示是只要有沾到邊就給分,我是寫來釐清 觀念的。 第二題:(10分) 下列敘述執行後變數 A, B, C, D, E 之值分別為何? int x[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; int A, B, C, D, E; A = x[7]; B = 20*x[1] + x[2]; C = *x; D = *(x + 4); x++; E = *(x + 3); Ans: A = 16 B = 86 C = 2 D = 10 E = 10 P.S. 偷偷吐嘈一下,老師少一個分號,扣一分。 第三題:(10分) 下列敘述執行後的輸出為何? #include <iostream.h> main() { int a; static char c[] = "Programming with C++ can be great fun!"; for(a=0; c[a]!='\0'; a++) { if((a%3) == 0) cout << c[a]; } } Ans:Pgmnwh+c e n 第四題:(10分) 下列程式片段執行後的輸出為何? char s1[50] = 'JACK'; char s2[50] = 'MARY'; char s3[50]; strcpy(s3, s2); cout << s3 << endl; cout << strlen(s1) + strlen(s2) << endl; strcat(s3, " and "); cout << s3 << endl; strcat(s3, s1); cout << s3 << endl; cout << s1 << " and " << s2 << endl; Ans: MARY 8 MARY and MARY and JACK JACK and MARY 第五題:(10分) 請設計一個程式其功能為輸出一個九九乘法表於檔案內。輸出的檔案名稱為: EXAM2004.TXT。 HINT: 你可能會用到下列之C++指令 ofstream outFile("EXAM2004.TXT", ios::out); Ans: #include "stdafx.h" #include <fstream> #include <iostream> using namespace std; void main() { ofstream outFile("EXAM2004.TXT", ios::out); // 宣告一個 out file stream, // 並準備寫入 "EXAM2004.TXT" 這個檔案 // 輸出九九乘法表 for(int i=1; i<=9; i++) { for(int j=1; j<=9; j++) outFile << i << "x" << j << " = " << i*j << endl; outFile << endl; } // 結束檔案 outFile.close(); } 第六題:(10分) 請設計一個程式,由鍵盤讀入一個20x20的整數二維陣列,然後分別計算二維 陣列兩條對角線元素的總合,將結果輸出到螢幕上。 Ans: #include "stdafx.h" #include <iostream> using namespace std; void main() { cout << "請輸入 20x20 的整數陣列 (400個耶!?請加油....)" << endl; int matrix[20][20]; // 20x20 的矩陣 int sum1 = 0; // 主對角線和 int sum2 = 0; // 另一條對角線和 for(int i=0; i<20; i++) for(int j=0; j<20; j++) { // 讀入矩陣的值 cout << "A[" << i << "][" << j << "] = "; cin >> matrix[i][j]; // 如果在主對角線上就累計 if(i == j) sum1 += matrix[i][j]; // 如果在另一條對角線上就累計 if(i+j == 19) sum2 += matrix[i][j]; } cout << "辛苦了!兩條對角線的和分別如下:" << endl << sum1 << "(左上到右下)" << endl << sum2 << "(右上到左下)" << endl; } 第七題:(10分) 請寫一個程式將一字串的所有旋轉後的字串組合輸出至電腦螢幕,每次只能 旋轉一個字元。如字串"rotate"產生所有的旋轉組合為: rotate, otater, tatero, aterot, terota, erotat Ans: #include "stdafx.h" #include <iostream> using namespace std; void main() { char str[100]; // 字串 int len = 0; // 字串長度 int i, j; // loop counter cout << "輸入一個字串:"; cin >> str; len = strlen(str); // 開始旋轉,方法是將字串從中間切開,然後兩個子字串交換位置。 // 要產生所有組合的話,只要切的位置從最左邊不斷往右移就好了。 for(i=0; i<len; i++) { // 輸出後半段的字串 for(j=i; j<len; j++) cout << str[j]; // 輸出前半段的字串 for(j=0; j<i; j++) cout << str[j]; cout << endl; } } P.S. 老闆是說用 char 陣列就好,不過基本上字串應該用 string 才對。 下面補上 string 的寫法,我覺得你們應該有能力可以看懂了。 這樣寫的好處是不用擔心輸入太長會爆掉,而且運算方便。 #include "stdafx.h" #include <iostream> #include <string> void main() { std::string str; int len; std::cout << "輸入一個字串:"; std::cin >> str; len = str.length(); for(int i=0; i<len; i++) std::cout << str.substr(i, len) << str.substr(0, i) << std::endl; } 第八題:(15分) 設計一個程式,輸入國內某網站進行棒球選手網路票選結果的 N 個 球員(N<50)姓名與得票數,將結果以圖形表現出來,圖形以 1000 票為一個單位轉換成一個星號,不足 1000 票者則捨去不計,將各球 員的得票數如下面之格式輸出於螢幕。 ============================================================= 球員 累計票數 繪圖 ============================================================= 陳致遠 20650 ******************** 張泰山 15874 *************** 謝佳賢 9718 ********* 彭政閔 6871 ****** 蔡泓澤 5849 ***** … … … ============================================================= Ans: #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; void main() { char name[50][100] = {{""}}; // 球員姓名(請注意二維陣列括號要兩層) int vote[50]; // 票數 int num = 0; // 幾個球員 int i; // 迴圈計數器 for(i=0; i<50; i++) { // 姓名 cout << "請輸入球員姓名,或輸入 \"-1\" 終止:"; cin >> name[i]; // name 是個 50 列 100 行的矩陣 // name[i] 的意思是第 i 列 // -1 就終止 if(name[i][0]=='-' && name[i][1]=='1') break; // 票數 cout << "請輸入該球員的票數:"; cin >> vote[i]; // 累計球員數 num++; } // 畫表格 for(i=0; i<60; i++) cout << "="; cout << endl << setw(10) << "球員" << setw(15) << "累計票數" << "\t繪圖" << endl; for(i=0; i<60; i++) cout << "="; cout << endl; for(i=0; i<num; i++) { // 顯示姓名與票數 cout << setw(10) << name[i] << setw(15) << vote[i] << "\t"; // 畫星星 for(int j=0; j<(vote[i]/1000); j++) cout << "*"; cout << endl; } for(i=0; i<60; i++) cout << "="; cout << endl; } 第九題:(15分) 請以物件導向的觀念設計一個程式計算長方形的周長與面積。 在此程式中你需要設計一個 Rectangle 的類別來記錄與處理資 料。程式由使用者輸入長方形的長與寬,分別計算出此長方形的 周長與面積輸出至電腦螢幕。程式的要求如下: 1. 長方形的長、寬、周長與面積為 Rectangle 類別的內部 (private)資料,其讀寫需要由類別的成員函式來完成。 2. 分別設計設定長寬與計算周長與面積的函式,並將其設計 為 Rectangle 類別中的 public 成員函式。 3. 程式連續執行,至使用者輸入結束指令後(自行設計)終止。 Ans: #include "stdafx.h" #include <iostream> using namespace std; class Rectangle { public: void SetLength(float l); // 設定長 void SetWidth(float w); // 設定寬 float GetArea(){return length*width;} // 回傳面積 // 因為這函式實在太短了,而且我想偷懶,所以打在這裡; // 不過這種寫法很糟糕,平常還是盡量不要的好。 float GetAround(){return (2*length + 2*width);} // 回傳周長 private: float length; float width; }; void Rectangle::SetLength(float l) { length = l; } void Rectangle::SetWidth(float w) { width = w; } void main() { float le, wi; // 矩形長寬 Rectangle rect; // 矩形 while(1) { // 讀取長寬 cout << "請輸入矩形的長:"; cin >> le; cout << "請輸入矩形的寬:"; cin >> wi; // 設定長寬 rect.SetLength(le); rect.SetWidth(wi); // 顯示面積周長 cout << "該矩形面積 = " << rect.GetArea() << endl << "該矩形周長 = " << rect.GetAround() << endl << endl; // 繼續? char tmp; cout << "繼續嗎?(Y/N)"; cin >> tmp; if(tmp=='n' || tmp=='N') // N 就跳出 break; cout << endl; } } 就這樣了。這次考題根本就大放水,而且老闆說改鬆一點, 基本上我根本就昧著良心在改......@@ 原始分數平均就有 6x,8x 分的一卡車........ -- 「唉...好吧,我長話短說,」 「你...比妲己強嗎?」 「我絕對不會輸她」 「因為我不會和她打!!!!!!!!!!!」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.73.37 ※ 編輯: SuperBEAR 來自: 218.166.73.37 (01/21 03:50)

推 218.35.83.51 01/21, , 1F
推~昧著良心
推 218.35.83.51 01/21, 1F

推 218.35.83.51 01/21, , 2F
老師特地交代 所以我作業7成績平移30~50分
推 218.35.83.51 01/21, 2F

推218.164.109.178 01/21, , 3F
第六和第八題都用不到矩陣阿
推218.164.109.178 01/21, 3F

推 218.166.73.37 01/21, , 4F
不用也可以寫的出來沒錯,不過一般而言,
推 218.166.73.37 01/21, 4F

推 218.166.73.37 01/21, , 5F
這種東西不會要人家用鍵盤輸入,而且多半
推 218.166.73.37 01/21, 5F

推 218.166.73.37 01/21, , 6F
還會要做別的事情,所以存起來比較好
推 218.166.73.37 01/21, 6F
※ 編輯: SuperBEAR 來自: 218.166.73.37 (01/21 12:36)

推 218.184.78.145 01/31, , 7F
突然發現簽名檔 推推太公望XD
推 218.184.78.145 01/31, 7F

推 140.112.25.184 02/01, , 8F
你好空虛喔~
推 140.112.25.184 02/01, 8F

推 218.174.158.16 02/01, , 9F
害我在想怎麼過了這麼久推文數又變多了...
推 218.174.158.16 02/01, 9F
文章代碼(AID): #103L2N9y (NTUBIME96-HW)
文章代碼(AID): #103L2N9y (NTUBIME96-HW)