[解答] 計程期末考解答
突然想起來還沒 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
推 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
推 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
討論串 (同標題文章)