105A 資管一程式設計實驗 06 函式定義謝明哲老師 hmz@nttu.edu.tw 1 程式設計實驗 06 函式定義 模擬問題 03 在模擬問題 02, 小組已完成擬定一個與學習或日常生活有關的問題, 並依據在 Ch5 所 學到的流程控制與檔案存取技術發展小組的第二版個別化資訊服務程式 現在請小組對第二版程式的 結構進行分析, 檢查是否有哪些功能可以使用在 Ch6 所學到的函式定義來加以模組化, 並討論應用 函式定義進行功能模組化之後的優點 程式設計實驗 6.1: 自行定義一個可以接受高和寬兩個整數的函式, 該函式可以在螢幕上使用指定的 字元排列出一個矩形 // print_rectangle.cpp void printrectangle(int h, int w, char x) for (int i=0; i<h; i++) for (int j=0; j<w; j++) cout << x; cout<<endl; char x; cout<<" 請輸入用來排列矩形的字元 :"; cin>>x; int l, w; cout<<" 請輸入矩形的長 寬 :"; cin>>l>>w; printrectangle(l, w, x); 程式設計實驗 6.2: 自行定義一個可以計算 n! 的函式 // factorial.cpp double factorial(int n) double result = 1.0; for (int i =1; i<n; i++) result *= i; return result; int x; cout<<" 求 n!, 請輸入 n:"; cin >> x; cout << x << "! = " << factorial(x) << endl;
105A 資管一程式設計實驗 06 函式定義謝明哲老師 hmz@nttu.edu.tw 2 程式設計實驗 6.3: 自行定義一個可以接受兩個整數並傳回其最大公因數的函式, 接著利用該函式自 行定義一個可以接受兩個整數並傳回其最小公倍數函式 // gcd_fcn.cpp int gcd(int m, int n) int r; while( (r = m%n)!= 0 ) m=n; n=r; return n; int lcm(int m, int n) return m*n/gcd(m,n); int x, y; cout<<" 請輸入兩個整數 :"; cin >> x >> y; cout << " 最大公因數 =" << gcd(x,y) << endl; cout << " 最小公倍數 =" << lcm(x,y) << endl; 程式設計實驗 6.4: 輸入 N 個整數 (N>1), 計算該 N 個整數的最大公因數與最小公倍數 // gcd_fcn.cpp int gcd(int a, int b) if (b) while( (a%=b)&&(b%=a)); return a+b; int m, n, lcm; cin>>m; lcm = m; while (cin.get()!= \n ) cin>>n; m=gcd(m,n); lcm = lcm*n/m; cout << " 最大公因數 =" << m << endl; cout << " 最小公倍數 =" << lcm << endl; 程式設計實驗 6.4: 以下使用傳值呼叫 (call by value) 定義的 swap 函式, 其是否可以成功地將主程式 傳遞過來的兩個變數內容互換? // call_by_value.cpp
105A 資管一程式設計實驗 06 函式定義 謝明哲老師 hmz@nttu.edu.tw 3 void swap (int x, int y) int temp; temp = x; x = y; y = temp; int main( ) int a=5, b=3; swap(a, b); cout<<"a="<< a<<" b=" << b<<endl; 程式設計實驗 6.5: 以下使用傳參考呼叫 (call by reference) 定義的 swap 函式, 其是否可以成功地將 主程式傳遞過來的兩個變數內容互換? // call_by_reference.cpp void swap (int& x, int& y) int temp; temp = x; x = y; y = temp; int main( ) int a=5, b=3; swap(a, b); cout<<"a="<< a<<" b=" << b<<endl; 程式設計實驗 6.6: 以下使用傳參址呼叫 (call by address) 定義的 swap 函式, 其是否可以成功地將主 程式傳遞過來的兩個變數內容互換? // call_by_address.cpp void swap (int* x, int* y) int temp; temp = *x; *x = *y; *y = temp; int main( ) int a=5, b=3; swap(&a, &b); cout<<"a="<< a<<" b=" << b<<endl;
105A 資管一程式設計實驗 06 函式定義謝明哲老師 hmz@nttu.edu.tw 4 程式設計實驗 6.7: 使用亂數產生器模擬輸出一個符合 Excel CSV 格式的密碼檔, 其中帳號為班級 50 位同學的學號, 密碼為英文字母與阿拉伯數字共 6 個字元的隨機組合 提示 1: 參考以下 C++ 程式碼及輸出畫面, 並完成註解 #include <ctime> #include <fstream> #define N 50 ofstream fout("passwd.csv", ios::out); if (!fout) cout<<" 檔案開啟失敗 "<<endl; else char a[]= a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 fout<<" 學號, 密碼 "<<endl; srand(time(0)); char buf[81]; for (int i=1;i<=n;i++) sprintf(buf, "105121%02d,%c%c%c%c%c%c", i, a[rand()%36], a[rand()%36], a[rand()%36], a[rand()%36], a[rand()%36], a[rand()%36]); cout<<buf<<endl; fout<<buf; if(i<n) fout<<endl; fout << flush; // 回寫緩衝區 fout.close(); // 檔案關閉 cout<<" 已成功產生成績檔 :passwd.csv"<<endl; 提示 2: 執行後, 使用 Excel 及記事本開啟密碼檔觀察結果
105A 資管一程式設計實驗 06 函式定義謝明哲老師 hmz@nttu.edu.tw 5 程式設計實驗 6.8: 使用亂數產生器模擬輸出一個符合 Excel CSV 格式的成績檔, 其欄位由學號 姓名 以及五門學科成績 ( 包括計概 程設 會計 經濟學 微積分 ) 所組成, 共有 50 筆紀錄 提示 1: 參考以下 C++ 程式碼及輸出畫面, 並完成註解 #include <ctime> #include <cstring> #include <fstream> #define N 50 char lastname[][3]=" 王 "," 陳 "," 林 "," 廖 "," 徐 "," 方 "," 吳 "," 邱 "," 雷 "," 黃 "," 謝 ", " 歐 "," 郭 "," 李 "," 張 "," 簡 "," 呼 "," 于 "," 楊 "," 詹 "," 龍 "," 賀 "," 詹 "," 彭 "," 鄭 "; char firstname1[][3]=" 偉 "," 文 "," 依 "," 仁 "," 育 "," 銘 "," 家 "," 涵 "," 文 "," 嘉 "," 立 ", " 俊 "," 昭 "," 詠 "," 永 "," 意 "," 欣 "," 信 "," 奕 "," 怡 "," 佳 "," 清 "," 元 "," 筠 "," 聖 "; char firstname2[][3]=" 元 "," 忠 "," 帆 "," 哲 "," 州 "," 俊 "," 琪 "," 如 "," 婷 "," 玲 "," 士 ", " 成 "," 真 "," 華 "," 定 "," 真 "," 珍 "," 志 "," 皓 "," 君 "," 慧 "," 宇 "," 馨 "," 臻 "," 雯 "; ofstream fout("grade.csv", ios::out); if (!fout) cout<<" 檔案開啟失敗 "<<endl; else fout<<" 學號, 姓名, 計概, 程設, 會計, 經濟學, 微積分 "<<endl; srand(time(0)); char buf[256]; for (int i=1;i<=n;i++) sprintf(buf, "101121%02d,%s%s%s,%d,%d,%d,%d,%d", i, lastname[rand()%25], firstname1[rand()%25], firstname2[rand()%25], (rand()%33+60), (rand()%46+50), (rand()%32+65), (rand()%35+58), (rand()%45+40)); cout<<buf<<endl; fout<<buf; if(i<n) fout<<endl; fout << flush; // 回寫緩衝區 fout.close(); // 檔案關閉 cout<<" 已成功產生成績檔 :grade.csv"<<endl; 提示 2: 執行後, 使用 Excel 及記事本開啟成績檔觀察結果
105A 資管一程式設計實驗 06 函式定義謝明哲老師 hmz@nttu.edu.tw 6 提示 3: 本參考程式以均勻 (uniform) 分佈亂數產生每科成績, 請探討如何改為常態 (normal) 分佈亂數產生每科成績?