LAB-01 @ first week 計概程式設計演習 Please Log into http://e3.nctu.edu.tw (帳號密碼與選課系統同, 若仍無法登入請詢問學校計中櫃台) 俗話說 民以食為天 .. 阿不是 .. 應該是 工欲善其事, 必先利其器 ! 所以, 第一優先要做的就是熟悉工具: (1) 先把 Dev-C++ 的使用練熟! (大約一分鐘就可安裝完成!) (2) 建議也把 Turbo C++ 3.0 練熟! (也是大約一分鐘可搞定:-) 兩樣工具都已經放在 http://e3.nctu.edu.tw 也可到計概小組網站 http://intro.cs.nctu.edu.tw 的工具區抓來安裝! ** 一開始聽不懂很正常, 前面這幾週主要是用範例熟悉環境與工具; 一開始看不太懂範例也沒關係, 先照著做就對了! 聽不懂看不太懂都沒關係, 先照著做, 千萬不要放棄 ! 急著想弄懂就舉手抓小助教學長姐過來問 :-) 還有, 也先不要管 C 的語法, 從範例中慢慢累積與熟悉語法 ! 本課程會慢慢用範例引導你進入狀況! 把該懂得逐步教你! 重要的是概念, 語法交給Compiler(編譯器; 翻譯官)檢查就好 :-) 其實 "語法" 也沒啥, 別人規定的而已, 以後你就會自己查詢語法啦! 我們已經在 e3.nctu.edu.tw 討論區建議了幾個容易查的網站! 不然你就進入 gogle.com 打入 "C reference" 就可查到很多好站 !!! ______________________________________________________________________________________ LAB01 練習一 小明的數學魔法書 Problem: 請幫小明寫一個可幫他完成數學作業的小程式 Description(說明): 小明有很多數學題要做,不過題型都一樣, 就是要算出某數的平方, 立方, 以及其平方根(square root); 答案一律算到小數點後兩位; 請注意有很多題喔! 考慮如何寫可以幫小明更順利完成作業!! 第一版: p00.c 只幫忙做了三題 :-( //////先不要管有哪些語法! 照著做就是!! /*** p00.c 爛爛的小程式 只幫忙做了三題 ***/ #include #include int main( ) { // 大多數 main program 都這樣開頭 double gg = 5.6; // gg 是一個兩倍準的實數變數 printf("x x平方 x立方 x的平方根\n"); //反斜線 n 是換下列 printf("%d %3d %6d %9.2f\n", 2, 2*2, 2*2*2, sqrt(2.0) ); printf("%d %3d %6d %9.2f\n", 3, 9, 9*3, sqrt(3.0) ); printf("%f %6.2f %6.2f %9.2f\n", gg,gg*gg,gg*gg*gg, sqrt(gg) ); return 0; // 正式跟系統說 bye bye, 規定要送回 0 表示正常! } // 主程式結束 //*** printf( ) 是別人預先寫好的程式庫函數(Library function又稱函式) //*** 標準 C 的程式庫中有大約一百多個 function, printf( ) 是其中一個 //*** 到底還有哪些 function (函數, 函式)? Ans: 要查 C 的 Reference Manual (看 e3.nctu.edu.tw 討論區內建議) /// function(函數, 函式) 就是你傳給它一些參考的資料 (參數), 然後它會做一些事, 並可能傳回(return)一個值; 不傳回值的function叫做 void function, 就是其他語言的 副程式 (subroutine; procedure 程序); C/C++/Java 為了簡單一律稱之為 function(函數, 函式) /// 我拆.. 我拆 .. 我拆拆拆 ... 大工作拆成幾個小工作 ///寫程式要儘量把工作切開給別人(function) 此即立法委員包工程的精神 : 大部分工作轉包出去 :-) Q: 我想寫 i-Phone 程式賺錢可以嗎? A: ㄟ .. 可以是可以 .. 可是你還不會走路就要跑步喔 ??? 這門課就是教你走路 :-) LAB-01 @ first week 計概程式設計演習 Please Log into http://e3.nctu.edu.tw (帳號密碼與選課系統同, 若仍無法登入請詢問學校計中櫃台) _____________________________________________ * 備用網址: http://www.csie.nctu.edu.tw/~tsaiwn/introcs/ (in case that bb.nctu.edu.tw is NOT available :-) * 計概小組網站: http://intro.cs.nctu.edu.tw/ Purpose: Sharp tools make good work(工欲善其事, 必先利其器!) 先熟悉e3系統, edit a program, compile/run the program, 以及製造出 running script /心得, then post(貼到) e3 的討論區 (1) To be familiar with the E-learning system 3 (e3) (2) To learn how to edit / compile / run a program (3) To learn how to post an article on a discussion board on e3 (4) To learn how to make a running script and post it onto the e3 _______________________________ 無聊的可以玩一下 BATNUM.EXE :-) Lab work: (Here is what you have to do during today and this week.) (1) 在 e3 的 test測試練習區練習如何 post/edit 文章 * 登入 e3.nctu.edu.tw, 找到本課程並點選, 在本課程找到 Discussion board 的測試練習區, * 弄懂如何 post 文章, 修改文章, 刪除文章, 回答(reply)文章 (注意是回答!) * ==> 請確定你會了才到其他 討論區 潑文 (post articles) 不會請隨時舉手叫小助教幫你:-) (2) 每位須在自我介紹區 post 一篇 250字 ~ 1200字的自我介紹 請注意, 是自我介紹, 不是自傳! 至少 250 字, 請不要超過 1200字:-) 可以變換字型和顏色, 可以插入圖片(每張只算 5 字:-(), 也可以插入背景音樂(不算字數:( !) 若會做網頁還可以按 "原始碼" 切換到 HTML 語法模式自行修改或編寫 HTML 語法:-) Note: Failure to do so may result in a deduction in your final grade. __________________________________________ (3) 練習使用 Notepad, DEV-CPP 和 Turbo C++ 3.0 然後把練習結果依照以下規定 post 到 e3 的 "第一個程式練習區" 先寫心得(至少 100字, 至多500字), 接著 running script, 再接著是帶有 line number 的 program(s) * 注意 Subject: 要包括學號姓名與第幾版(可以 post 很多次(註明版本編號:-)) * Running script 就是你的執行過程與答案, 別人看了就可以照著做出一樣效果! * 程式可以自己寫或網路抓, 或用以下範例(看不懂沒關係:) * 先練習開個 DOS 窗然後設定 PATH 之後用 gcc/g++/tcc 等命令 * 之後再練習使用 DEV-CPP 和 TC++3.0 的 IDE 整合發展環境 * 本週至少要練會 DEV-CPP 或 TC++3.0 的 command mode 用法 * 開 DOS 窗後若打 gcc 與 g++ 不認識, 試著先打: path c:\dev-cpp\bin;c:\TC\bin;%path% * 若機器沒有裝 DEV-CPP 或 TC++3.0, 可以自己到計概小組網站 http://intro.cs.nctu.edu.tw 的工具區抓來安裝! * DEV-CPP 安裝大約要數分鐘 * Turbo C++ 3.0 是抓壓縮檔來解壓縮, 大約數十秒就可搞定! 不過要注意設定, Command mode 要注意 BIN\TURBO.CFG 內容是否正確 IDE mode 則要點按 Directory 入內改正確(看助教demo) ** 註: 老師或助教會 DEMO 很多次, 聽懂得就自己開始練不要管講台上重複講! 練習時只要有問題請立刻舉手, 助教會過去幫忙解說或示範!! **如果覺得 Notepad 太陽春, 可以用gogle.com 找 ultra editor 來用, 也可以用 gogle.com 找 notepad++ 抓來安裝, 很好用! 或到這抓: http://notepad-plus.sourceforge.net/tw/download.php? * notepad++ 是一位民國84年畢業於淡江大學法文系的侯今吾到法國改讀電腦碩士後寫的 ** 以下共有兩個範例: linenum.c 和 asqrt.c 請確定安裝 compiler 且命令路徑 (path)有設定正確, 然後可如下測試: path c:\dev-cpp\bin;c:\tc\bin;%path% gcc asqrt.c -o asqrt asqrt gcc linenum.c -o linenum linenum < asqrt.c linenum < asqrt.c > haha.txt type haha.txt 注意用 NOTEPAD 等 editor 輸入 linenum.c 時要去掉 line numbers !!! 注意用 NOTEPAD 等 editor 輸入 linenum.c 時要去掉 line numbers !!! 1 //linenum.c --- by tsaiwn@csie.nctu.edu.tw 2 // tcc linenum.c 或是 gcc linenum.c -o linenum 3 // linenum < inputfile.name 4 // linenum < inputFile.name > outputFile.name 5 #include 6 int main( ) { 7 static char buf[999]; // 用 static 就不會佔用 Stack 的空間 8 int n = 0; // 一開始放 0 這樣加上 1 就是 Line 1 9 fgets(buf, sizeof(buf), stdin); // 先讀入一列然後進入 Loop 10 while(! feof(stdin) ) { // while檔案stdin (鍵盤) 尚未結束 11 ++n; 12 printf("%5.2d %s", n, buf); 13 buf[0] = 0; // clear the buffer -- 先把上次讀到的清除 ! 14 fgets(buf, sizeof(buf), stdin); // 在 Loop 內最後再讀入一列 15 } // while // 注意下列很重要喔, 因輸入檔最後一列可能沒 new Line 16 if(buf[0] != 0) printf("%5.4d %s", ++n, buf); // 注意 ++n 17 printf("\n"); 18 if(*buf != 0)fprintf(stderr, "Waring: no newline at end of file\n"); 19 return 0; 20 } // main 注意要把 Line numbers 去掉 /*** asqrt.c --- sample program by tsaiwn@cs.nctu.edu.tw * 練習: 簡易輸入 + 簡易輸出 + 使用 Library 程式庫 + 簡易 while Loop * Description: 寫個程式, 讀入 x, 印出根號 x (可以用 Library function) * Note: 要一直做到 輸入負數(例如輸入 -1 ) 才停止! 記得要印出 Bye bye! *** *** **************************/ #include #include double x; // (注意 1) 變數 variable; // C++ 式的註解 comment double getDBL(void); // 寫成 function 比較有彈性:-) int main( ) { // 大多數 main program 都這樣開頭 while(38==38) { // (注意 3) 可以改用別的方法 printf("Give me x: "); x = getDBL( ); // 寫成函數 (function; 函式) 是個很好的習慣 if( x < 0 ) break; // (注意 3) 可以改用別的方法 printf(" sqrt 根號 %f =%f\n ", x, sqrt(x) ); // (注意 4) 可以問 user 要不要繼續? } // while printf("Bye bye!\n"); return 0; // 告知作業系統(OS)表示我們這主程式正常結束 } double getDBL( ) { // 以後要改輸入的方法只要改這 function 就可 :-) double ans; scanf("%lf", &ans); // (注意 5) 可以不要用 scanf 改用 fgets 和 atof return ans; } /*** 每個 (注意 ? ) 都是一個小小練習題: (注意 1) 執行時故意輸入亂打如 abcd 會如何? (注意 2) 改用 float 看看要如何配合修改? (注意 3) 要如何改為不須用到 if ... break 的 while Loop ? (注意 4) 每次問 user 要不要繼續, y或 Y 表示要, 其他表示不要? 如何讀入答案? 讀入到文字變數? ("%c" ? "%c ") <== 注意後者有空格 多測試看會遇到哪些奇怪的問題? scanf 時用 "%f" 與 "%f ", 以及用 "%lf" 與 "%lf " 的差別? (注意 5) 可以不要用 scanf, 改用 fgets 和 atof (比較不會出問題) 如何使用 fgets 和 atof? 可以上網查 :-) 當然有書查也可以啦 :-) *** 每個人可以 post 很多次( 註明版本編號:-) *** 注意 Subject: 要包括學號姓名與第幾版 ********** /// /// /// TCC 是命令模式(在CMD下); TC 是IDE 整合模式 /*** 使用 gcc 或 TC++3.0前 常用命令: path c:\dev-cpp\bin;c:\tc\bin;%path% 備用網址: http://www.csie.nctu.edu.tw/~tsaiwn/introcs/ **/// 在 TC++ 的 IDE 整合環境內(TC), 經常需要按 ALT_F5 (兩鍵同時按 ) 以便看執行結果 /// 在 TC++ 的 IDE 整合環境內(TC), 隨時可以按 Control_F1 (兩鍵同時按 ) 以便看說明書 //p01.c --- using variable 使用變數 #include #include double x; // (注意 1) 變數 variable; // C++ 式的註解 comment //變數種類(型別 type)有 char, short, int, long, float, double int main( ) { // 大多數 main program 都這樣開頭 printf("Give me x: "); scanf("%lf", &x); // 注意這句的寫法很特別! 變數左邊寫 & 表示取其位址 printf(" sqrt 根號 %f =%f\n ", x, sqrt(x) ); printf("Bye bye!\n"); return 0; // 告知作業系統(OS)表示我們這主程式正常結束 } // 因為 x 是 double, 用在 scanf 輸入時格式要寫 "%lf" // 若 x 是 float, 則要改用 "%f" 讓 scanf 知道 x 只有 4 bytes // 不過用在 printf 的輸出用格式, float 和 double 都用 %f 就可以! Why?? //p02.c --- 使用 fgets( ) 先讀入整列字串, 再用保證不死的 atof 轉出實數 #include #include #include // 注意是用到 atof 必須要 #include 不然它會誤以為 atof 傳回整數 ! double x; // (注意 1) 變數 variable; // C++ 式的註解 comment char buf[99]; int main( ) { // 大多數 main program 都這樣開頭 printf("Give me x: "); fgets(buf, sizeof(buf), stdin); // stdin 就是鍵盤, 要記得含入 x = atof(buf); // atof() 是宣告在 printf(" sqrt 根號 %f =%f\n ", x, sqrt(x) ); printf("Bye bye!\n"); return 0; // 告知作業系統(OS)表示我們這主程式正常結束 } //p03.c --- better version ! 這程式用了比較好的輸入方式 fgets + atof #include #include #include double x; // (注意 1) 變數 variable; // C++ 式的註解 comment double getDBL(void); // 寫成 function 比較有彈性:-) 這裡只是宣告 int main( ) { // 大多數 main program 都這樣開頭 while(38==38) { // (注意 3) 可以改用別的方法做 Loop printf("Give me x: "); x = getDBL( ); // 寫成函數 (function; 函式) 是個很好的習慣 if( x < 0 ) break; // 若是負數就停 ! (注意 3) 可以改用別的方法 printf(" sqrt 根號 %f =%f\n ", x, sqrt(x) ); // (注意 4) 可以問 user 要不要繼續? } // while printf("Bye bye!\n"); return 0; // 告知作業系統(OS)表示我們這主程式正常結束 } double getDBL( ) { // 以後要改輸入的方法只要改這 function 就可 :-) static char buf[99]; // a string buffer for input; why "static" ? double ans; fgets(buf, sizeof(buf), stdin); // stdin 就是鍵盤, 要記得含入 ans = atof(buf); // 從字串中讀出兩倍準的實數 (double) ////// 若是整數就把 atof 改為 atol 這也是別人寫好的函數(函式) return ans; }