//pas5.c --- by tsaiwn@csie.nctu.edu.tw //generate Pascal Triangle of order n using one-dimensional array #include // 先用 #define 把可能會改的寫成符號常數是好習慣! #define MAX_N 19 /// 以後若要改 array 大小則只要改上列的 19 即可 int x[MAX_N+1]; // 這樣寫可以處理到 order == MAX_N int getInteger( ); // 宣告會有個幫忙讀取整數的小弟(function) int main( ) { // 每個程式都長這樣 int row, col, order; // 請compiler給我安排一些整數備用 printf("Generate Pascal Triangle..\n"); while(38==38) { // in C++: while(true) { printf("order=? "); // prompt the user order = getInteger( ); // 分工合作: 叫小弟(function) 去讀入一整數 if(order < 0 ) break; // 注意 order < 0 表示不玩了 :-) if(order > MAX_N) { // order 太大我們無法處理 :-( printf("Too Large! must <= %d\n", MAX_N); continue; // goto while(38 // break; } x[0]=1; // 最左邊放 1 for(row=0; row <= order; row++) { /*記得宣告/定義x陣列喔*/ x[row] =1; // 最右邊放 1; 第 row 列最右邊是第 row 個 // 接下來用 for Loop 處理中間各元素, must from right to Left for(col = row-1; col >= 1; --col) { // 由右往左改所有中間的元素 // 別忘了第 row 列有第 0, 1, 2, .. , row 共 (row+1)個元素 // .. 所以中間的由右往左是 row-1, row-2, .. 2, 1 x[col]= x[col] + // 等於 自己 + x[col-1]; // .. 左邊那個元素 } // 再來用 for Loop 把整列印出來: 0, 1, 2, ... row 共 row+1 個 // 每列印之前先印一些空格就可印成正三角形 for(col=0; col <= (order-row)*3; ++col) printf(" "); // 印一些空格 for(col = 0; col <= row; col++) { // 0, 1, 2, ... , row printf("%6d", x[col]); // 每個元素印成 6 格的整數 } printf("\n"); // 當然要記得印出換新列(new Line) }; /* for i */ } // while printf("\nBye bye.\n"); return 0; // tell the System that we are OK } // main /// /// int getInteger( ) { // 這個小弟(function) 已寫得很聰明:-) static char buf[99]; // static memory is good int ans = -1; // assume -1 is suitable in this case int kkk; for( ;; ) { // Loop forever == while(38==38) { fgets(buf, sizeof(buf), stdin); // 整列當字串讀入 /// /// ans = (int) atol(buf); // 把字串轉成 Long 整數 kkk = sscanf(buf, "%d", &ans); // kkk 是讀到幾個數 if(kkk == 1) break; // 成功讀取, leave Loop fprintf(stderr, " Error input, please re-Type it: "); } // while return ans; } // getInteger( )