/* ch01_01.c */ main(){ int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("%d*%d= %2d ", i, j, i * j); } printf("\n"); } } /* ch02_01.c */ main(){ printf("歡迎使用C語言!\n"); printf("這是一個簡單的C程式.\n"); } /* ch03_01.c */ /*************************** 功能:求圓面積 ***************************/ main(){ int r = 3; const float pi = 3.1416; float area = pi * r * r; printf("半徑為%d", r); printf("的圓面積為%f\n", area); } /* ch03_02.c */ /*************************** 檔名:ch3_02.c 功能:算數運算子 ***************************/ main(){ int x, y; x = 20; y = 7; printf("當x=%d", x); printf(",y=%d時\n", y); printf("x + y = %d\n", x + y); printf("x - y = %d\n", x - y); printf("x * y = %d\n", x * y); printf("x / y = %d\n", x / y); /* y不可為0 */ printf("x %% y = %d\n", x % y); /* y不可為0 */ } /* ch03_03.c */ /*************************** 檔名:ch3_03.c 功能:複雜的算數運算 ***************************/ main(){ float answer; float a = 2.1, b = 3.5, c = 4; printf("a=%f ", a); printf("b=%f ", b); printf("c=%f\n", c); answer = b * b - 4 * a * c; printf("b^2-4ac=%f\n", answer); } /* ch03_04.c */ /*************************** 檔名:ch3_04.c 功能:比較運算子 ***************************/ main(){ int x = 10, y = 20; printf(" x=%d", x); printf(" y=%d\n", y); printf("1代表真,0代表假\n"); printf("x==y ==> %d\n", (x == y)); printf("x!=y ==> %d\n", (x != y)); printf("x>y ==> %d\n", (x > y)); printf("x %d\n", (x < y)); printf("x>=y ==> %d\n", (x >= y)); printf("x<=y ==> %d\n", (x <= y)); } /* ch03_05.c */ /*************************** 檔名:ch3_05.c 功能:邏輯運算子 ***************************/ main(){ int x = 1, y = 0; /* x為真,y為假 */ printf("1代表真,0代表假\n"); printf(" x=%d", x); printf(" y=%d\n", y); printf("--------------------\n"); printf("not x ==> %d\n", !x); printf("x and y ==> %d\n", (x && y)); printf("x or y ==> %d\n", (x || y)); printf("x xor y ==> %d\n", ((x && !y) || (!x && y))); printf("x nand y ==> %d\n", !(x && y)); printf("x nor y ==> %d\n", !(x || y)); } /* ch03_06.c */ /*************************** 檔名:ch3_06.c 功能:位元邏輯運算子 ***************************/ main(){ unsigned short int x = 100, y = 50, p = 3, xx; xx = ~x; printf("p=3\n"); printf("x=01100100\n"); printf("y=00110010\n"); printf("--------------------\n"); printf("not x ==> %d\n", xx); printf("x and y ==> %d\n", (x & y)); printf("x or y ==> %d\n", (x | y)); printf("x xor y ==> %d\n", (x ^ y)); printf("x >> p ==> %d\n", (x >> p)); printf("x << p ==> %d\n", (x << p)); } /* ch03_07.c */ /*************************** 檔名:ch3_07.c 功能:遞增/遞減運算子 ***************************/ main(){ int i = 5, j = 10, a, b; int x = 5, y = 10, c, d; a = 1 + i++; b = 1 + j--; c = 1 + ++x; d = 1 + --y; printf("i = %d\n", i); printf("j = %d\n", j); printf("x = %d\n", x); printf("y = %d\n", y); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); printf("d = %d\n", d); } /* ch03_08.c */ /*************************** 檔名:ch3_08.c 功能:sizeof運算子 ***************************/ main(){ int a = 10, b = 10; int w, x, y, z; w = sizeof a++; x = sizeof(a + b); y = sizeof("Hello!"); z = sizeof(double); printf("w = %d\n", w); printf("x = %d\n", x); printf("y = %d\n", y); printf("z = %d\n", z); } /* ch03_09.c */ /*************************** 檔名:ch3_09.c 功能:自動型態轉換 ***************************/ main(){ int a = 8, b; double c = 3.1416; b = a + c; printf("b = %d\n", b); } /* ch03_10.c */ /********************************** 檔名:ch3_10.c 功能:atoi、atof、atol型態轉換 **********************************/ main(){ char *string; double d; int i; long l; string = "1234567"; l = atol(string); printf("%s \t轉換為long=>%d\n", string, l); string = "12345jhchen"; l = atol(string); printf("%s \t轉換為long=>%d\n", string, l); string = "1234567persons"; i = atoi(string); printf("%s \t轉換為int=>%d\n", string, i); string = "-1234.56E-7"; d = atof(string); printf("%s \t轉換為double=>%.9f\n", string, d); } /* ch04_01.c */ /*************************** 檔名:ch4_01.c 功能:簡單的printf() ***************************/ main(){ printf("您好."); printf("歡迎學習C語言."); } /* ch04_02.c */ /*************************** 檔名:ch4_02.c 功能:\n的練習 ***************************/ main(){ printf("您好.\n"); printf("歡迎學習C語言."); } /* ch04_03.c */ /*************************** 檔名:ch4_03.c 功能:printf()格式化符號 ***************************/ main(){ int ch1 = 65; char ch2 = 'A'; char *str1 = "Hello!"; int data1 = 123456; int data2 = -45678; float f1, f2, sum; int count; f1 = 3.1415926; f2 = 1.41421; sum = f1 + f2; printf("%%c格式 %c\n", ch1); printf("%%c格式 %c\n", ch2); printf("%%s格式 %s\n", str1); printf("---------------------\n"); printf("%%d格式 %d %%i格式 %i\n", data1, data2); printf("%%o格式 %o\n", data1); printf("%%u格式 %u %%u格式 %u\n", data1, data2); printf("%%x格式 %x %%X格式 %X\n", data1, data1); printf("---------------------\n"); printf("%%f格式 %f\n", f1); printf("%%e格式 %e %%E格式 %E\n", f2, f2); printf("---------------------\n"); printf("%%g格式 %g %%G格式 %G\n", sum, sum); printf("%%p格式 %p\n", str1); printf("123%n\n", &count); printf("conut為%d\n", count); } /* ch04_04.c */ /*************************** 檔名:ch4_04.c 功能:printf()[width]參數 ***************************/ main(){ int data1 = 1234; float data2 = 45.67; printf(" ==>123456789\n"); /* 對齊資料之用 */ printf(" ---------\n"); printf(" %%3d格式==>%3d\n", data1); printf(" %%6d格式==>%6d\n", data1); printf("%%03d格式==>%03d\n", data1); printf("%%06d格式==>%06d\n", data1); printf(" %%*d格式==>%*d\n", 5, data1); printf("==================================\n"); printf(" ==>1234567890123456789\n"); /* 對齊資料之用 */ printf(" -------------------\n"); printf(" %%15f格式==>%15f\n", data2); printf("%%015f格式==>%015f\n", data2); printf(" %%*f格式==>%*f\n", 12, data2); } /* ch04_05.c */ /*************************** 檔名:ch4_05.c 功能:printf()[.prec]參數 ***************************/ main(){ int data1 = 1234; float data2 = 45.6789; double data3 = 78.900000; char *str1 = "Hello!"; printf(" %%d格式==>%d\n", data1); printf(" %%f格式==>%f\n", data2); printf(" %%g格式==>%g\n", data3); printf(" %%s格式==>%s\n", str1); printf("==================================\n"); printf(" ==>1234567890123456789\n"); /*對齊資料之用 */ printf(" -------------------\n"); printf("%%.0d格式==>%.0d\n", data1); printf("%%.0f格式==>%.0f\n", data2); printf("==================================\n"); printf(" ==>1234567890123456789\n"); /*對齊資料之用 */ printf(" -------------------\n"); printf("%%.3s格式==>%.3s\n", str1); printf("%%.1f格式==>%.1f\n", data2); printf("%%.5f格式==>%.5f\n", data2); printf("%%.1g格式==>%.1g\n", data3); printf("%%.5g格式==>%.5g\n", data3); printf("==================================\n"); printf(" ==>1234567890123456789\n"); /*對齊資料之用 */ printf(" -------------------\n"); printf("%%.*f格式==>%.*f\n", 3, data2); } /* ch04_06.c */ /*************************** 檔名:ch4_06.c 功能:[width][.prec]參數 ***************************/ main(){ float data1 = 123.4; float data2 = 45.678; float data3 = 0.92; printf("data1==>%09.5f\n", data1); printf("data1==>%09.5f\n", data2); printf("data1==>%09.5f\n", data3); } /* ch04_07.c */ /*************************** 檔名:ch4_07.c 功能:[flags]參數 ***************************/ main(){ int var1 = 5555, var2 = 6666, var3 = 7777; float data1 = 123.4, data2 = -45.678, data3 = 0.92000; printf("%-10f<==data1\n", data1); printf("%-10f<==data2\n", data2); printf("%-10f<==data3\n", data3); printf("---------------------\n"); printf("data1==>%+.5f\n", data1); printf("data2==>%+.5f\n", data2); printf("data3==>%+.5f\n", data3); printf("---------------------\n"); printf("data1==>% .5f\n", data1); printf("data2==>% .5f\n", data2); printf("data3==>% .5f\n", data3); printf("---------------------\n"); printf("data1==>%#g\n", data1); printf("data2==>%#g\n", data2); printf("data3==>%#g\n", data3); printf("---------------------\n"); printf("var1==>%#x\n", var1); printf("var2==>%#x\n", var2); printf("var3==>%#x\n", var3); printf("---------------------\n"); printf("%-#10g<==data1\n", data1); printf("%-#10g<==data2\n", data2); printf("%-#10g<==data3\n", data3); } /* ch04_08.c */ /*************************** 檔名:ch4_08.c 功能:[F|N|h|l|L]參數 ***************************/ main(){ int var1 = 0x281a820e; printf("var1==>%#8x\n", var1); printf("var1==>%#8hx\n", var1); } /* ch04_09.c */ /*************************** 檔名:ch4_09.c 功能:跳脫字元 ***************************/ main(){ printf("12345678901234567890\n"); printf("Hello\n"); printf("\tHello\n"); printf("\t\tHello\n"); printf("\t\rHello\n"); } /* ch04_10.c */ /*************************** 檔名:ch4_10.c 功能:scanf()格式化符號 ***************************/ main(){ char ch1; int data1; float f1; char *str1; printf("請輸入字元,字串,整數,浮點數(使用Enter加以間隔)\n"); scanf("%c%s%d%f", &ch1, str1, &data1, &f1); printf("======正在輸出=======\n"); printf("ch1=%c\n", ch1); printf("str1=%s\n", str1); printf("data1=%d\n", data1); printf("f1=%f\n", f1); } /* ch04_11.c */ /*************************** 檔名:ch4_11.c 功能:[width]參數 ***************************/ main(){ int data1; printf("請輸入整數:"); scanf("%4d", &data1); printf("======正在輸出=======\n"); printf("data1=%d\n", data1); } /* ch04_12.c */ /*************************** 檔名:ch4_12.c 功能:[*]參數 ***************************/ main(){ int data1 = 1234; printf("請輸入整數data1的值:"); scanf("%*d", &data1); printf("======正在輸出=======\n"); printf("data1=%d\n", data1); } /* ch04_13.c */ /*************************** 檔名:ch4_13.c 功能:[h|l|L]參數 ***************************/ main(){ int var1 = 0, var2 = 0; printf("請用16進制輸入var1的值:"); scanf("%x", &var1); printf("請用16進制輸入var2的值:"); scanf("%hx", &var2); printf("var1==>%#x\n", var1); printf("var2==>%#x\n", var2); } /* ch04_14.c */ /********************************* 檔名:ch4_14.c 功能:getchar函式與putchar函式 *********************************/ main(){ char ch1 = 'k'; printf("原始字元是"); putchar(ch1); printf("\n請輸入一個字元:"); ch1 = getchar(); printf("您所輸入的字元:%c\n", ch1); } /* ch04_15.c */ /************************** 檔名:ch4_15.c 功能:puts函式 **************************/ main(){ char *str1 = "Hello!"; char *str2 = "Welcome!"; puts(str1); puts(str2); } /* ch04_16.c */ /************************** 檔名:ch4_16.c 功能:gets函式 **************************/ main(){ char str1[] = ""; char *str2 = "您所輸入的字串如下:"; printf("請輸入一個字串:"); gets(str1); /*不建議使用gets */ puts(str2); puts(str1); } /* ch04_17.c */ /************************** 檔名:ch4_17.c 功能:fgets函式 **************************/ main(){ char str1[] = ""; char *str2 = "您所輸入的字串如上"; printf("請輸入一個字串:"); fgets(str1, 80, stdin); /*使用fgets取代gets */ printf("%s", str1); printf("%s", str2); } /* ch04_18.c */ /************************** 檔名:ch4_18.c 功能:fputs函式 **************************/ main(){ char *str1 = "Hello"; char *str2 = "Welcome!"; fputs(str1, stdout); fputs("\n", stdout); fputs(str2, stdout); } /* ch04_19.c */ /*************************** 檔名:ch4_19.c 功能:getche()函式 ***************************/ #include /* 必須引入conio.h */ main(){ char ch1; printf("請輸入一個字元:"); ch1 = getche(); printf("\n"); printf("您所輸入的是字元是%c", ch1); } /* ch05_01.c */ /*************************** 檔名:ch5_01.c 功能:循序結構 ***************************/ main(){ int x; x = 1; printf("%d\n", x); x = x + 1; printf("%d\n", x); } /* ch05_02.c */ /*************************** 檔名:ch5_02.c 功能:if敘述的練習 ***************************/ main(){ int x; char *str1; str1 = "您輸入的是正數或0"; printf("請輸入一個整數:"); scanf("%d", &x); if (x < 0) str1 = "您輸入的是負數"; printf("%s\n", str1); } /* ch05_03.c */ /*************************** 檔名:ch5_03.c 功能:if敘述的練習 ***************************/ main(){ int OnePrice, Qty; float TotalPrice; OnePrice = 200; printf("每張入場卷價格為%d元\n", OnePrice); printf("請輸入您要購買的張數:"); scanf("%d", &Qty); printf("==========================\n"); TotalPrice = OnePrice * Qty; if (Qty >= 10) { TotalPrice = TotalPrice * 0.9; printf("購買10張以上打九折\n"); } printf("總價為%.0f元\n", TotalPrice); } /* ch05_04.c */ /*********************************** 檔名:ch5_04.c 功能:條件運算式(判斷式)的成立 ***********************************/ main(){ int x; char *str1; str1 = "答錯了"; printf("請問1+1="); scanf("%d", &x); if (x = 2) str1 = "答對了"; printf("%s\n", str1); } /* ch05_05.c */ /*************************** 檔名:ch5_05.c 功能:if-else敘述的練習 ***************************/ main(){ int OnePrice, Qty; float TotalPrice; OnePrice = 200; printf("每張入場卷價格為%d元\n", OnePrice); printf("請輸入您要購買的張數:"); scanf("%d", &Qty); printf("==========================\n"); if (Qty >= 10) { TotalPrice = OnePrice * Qty * 0.9; printf("購買10張以上打九折\n"); } else { TotalPrice = OnePrice * Qty; printf("您為購買10張以上的入場券,恕不打折\n"); } printf("總價為%.0f元\n", TotalPrice); } /* ch05_06.c */ /*************************** 檔名:ch5_06.c 功能:?條件運算子的練習 ***************************/ main(){ int Ans = 38; /* 答案為38 */ int Guess; printf("請猜一個1~99的號碼:"); scanf("%d", &Guess); if (Guess == Ans) printf("恭喜您猜到了,獎品是一包乖乖.\n"); else (Guess > Ans) ? printf("您猜得太大了\n") : printf("您猜得太小了\n"); } /* ch05_07.c */ /*************************** 檔名:ch5_07.c 功能:巢狀選擇的練習 ***************************/ main(){ long Credit; /* 信用額度 */ int Status; /* 繳款狀態 */ float Year; /* 持卡年份 */ printf("請輸入信用額度:"); scanf("%d", &Credit); printf("繳款是否正常(1:正常,0:不正常):"); scanf("%d", &Status); if (Status) { printf("請輸入持卡年份:"); scanf("%f", &Year); if (Year >= 0.5) { if (Year < 1) { printf("預借現金金額為%.0f元\n", Credit * 0.5); } else { printf("預借現金金額為%d元\n", Credit); } } else { printf("預借現金金額為0元\n"); } } else { printf("預借現金金額為0元\n"); } } /* ch05_08.c */ /*************************** 檔名:ch5_08.c 功能:條件運算式的練習 ***************************/ main(){ long Credit; /* 信用額度 */ int Status; /* 繳款狀態 */ float Year; /* 持卡年份 */ printf("請輸入信用額度:"); scanf("%d", &Credit); printf("繳款是否正常(1:正常,0:不正常):"); scanf("%d", &Status); if (!(Status)) { printf("預借現金金額為0元\n"); } else { printf("請輸入持卡年份:"); scanf("%f", &Year); } if ((Status) && (Year >= 0.5) && (Year < 1)) printf("預借現金金額為%.0f元\n", Credit * 0.5); if ((Status) && (Year >= 1)) printf("預借現金金額為%d元\n", Credit); if ((Status) && (Year < 0.5)) printf("預借現金金額為0元\n"); } /* ch05_09.c */ /*************************** 檔名:ch5_09.c 功能:else-if格式的練習 ***************************/ main(){ unsigned int Score; printf("請輸入計概成績:"); scanf("%d", &Score); if (Score < 60) { printf("分數等級為丁等\n"); } else if (Score <= 69) { printf("分數等級為丙等\n"); } else if (Score <= 79) { printf("分數等級為乙等\n"); } else if (Score <= 89) { printf("分數等級為甲等\n"); } else if (Score <= 99) { printf("分數等級為優等\n"); } else if (Score == 100) { printf("完美分數\n"); } else { printf("您輸入了不合法的分數\n"); } } /* ch05_10.c */ /*************************** 檔名:ch5_10.c 功能:if else的配對練習 ***************************/ main(){ int Score = 75; if (Score > 60) if (Score > 80) printf("成績真不錯\n"); else printf("成績差強人意\n"); } /* ch05_11.c */ /*************************** 檔名:ch5_11.c 功能:switch-case的練習 ***************************/ main(){ int Score; printf("請輸入計概成績:"); scanf("%d", &Score); if ((Score >= 0) && (Score <= 100)) switch (Score / 10) { case 10: printf("完美分數\n"); break; case 9: printf("分數等級為優等\n"); break; case 8: printf("分數等級為甲等\n"); break; case 7: printf("分數等級為乙等\n"); break; case 6: printf("分數等級為丙等\n"); break; default: printf("分數等級為丁等\n"); break; } } /* ch05_12.c */ /******************************* 檔名:ch5_12.c 功能:falling through的示範 *******************************/ main(){ int Score; printf("請輸入計概成績:"); scanf("%d", &Score); if ((Score >= 0) && (Score <= 100)) switch (Score / 10) { case 10: printf("完美分數\n"); case 9: printf("分數等級為優等\n"); case 8: printf("分數等級為甲等\n"); case 7: printf("分數等級為乙等\n"); case 6: printf("分數等級為丙等\n"); default: printf("分數等級為丁等\n"); } } /* ch05_13.c */ /*************************** 檔名:ch5_13.c 功能:for迴圈的示範 ***************************/ main(){ int Sum, n, i; printf("請輸入N值:"); scanf("%d", &n); for (Sum = 0, i = 1; i <= n; i = i + 2) Sum = Sum + i; if ((n % 2) == 1) printf("1+3+...+N=%d\n", Sum); else printf("1+3+...+N-1=%d\n", Sum); } /* ch05_14.c */ /*************************** 檔名:ch5_14.c 功能:for迴圈的示範 ***************************/ main(){ int Sum, n, i; printf("請輸入N值:"); scanf("%d", &n); Sum = 0; for (i = 1; (n % 2) ? (i <= n) : (i <= n - 1); i++) if ((i % 2) == 1) Sum = Sum + i; if ((n % 2) == 1) printf("1+3+...+N=%d\n", Sum); else printf("1+3+...+N-1=%d\n", Sum); } /* ch05_15.c */ /*************************** 檔名:ch5_15.c 功能:多層for迴圈的示範 ***************************/ main(){ int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) printf("%d*%d=%d\t", i, j, i * j); printf("\n"); } } /* ch05_16.c */ /*************************** 檔名:ch5_16.c 功能:continue敘述的示範 ***************************/ main(){ int Sum = 0, i, j; for (i = 1; i <= 10; i++) { if ((i % 2) == 1) continue; Sum = Sum + i; } printf("2+4+6+8+10=%d\n", Sum); } /* ch05_17.c */ /*************************** 檔名:ch5_17.c 功能:break敘述的示範 ***************************/ main(){ short int Sum, n, i; printf("求1~N的總和,請輸入N值:"); scanf("%d", &n); Sum = 0; for (i = 1; i <= n; i++) { if (Sum > 30000) break; Sum = Sum + i; } printf("1~%d的總和為%d\n", i - 1, Sum); } /* ch05_18.c */ /*************************** 檔名:ch5_18.c 功能:while迴圈的示範 ***************************/ main(){ int x, y, gcd, temp; printf("輸入x:"); scanf("%d", &x); printf("輸入y:"); scanf("%d", &y); printf("(%d,%d)=", x, y); if (x < y) { /* 將較大的數值放在x,較小的放在y */ temp = x; x = y; y = temp; /* x,y數值對調 */ } while (x != 0) { x = x % y; if (x != 0) { temp = x; x = y; y = temp; /* x,y數值對調 */ } } gcd = y; printf("%d\n", gcd); } /* ch05_19.c */ /*************************** 檔名:ch5_19.c 功能:do-while迴圈的示範 ***************************/ main(){ char InputChar; /* ...........遊戲程式撰寫處........... */ printf("Game Over...\n"); do { printf("Play Again?(y/n)"); InputChar = getchar(); getchar(); } while ((InputChar != 'y') && (InputChar != 'n')); } /* ch05_20.c */ /*************************** 檔名:ch5_20.c 功能:goto敘述的示範 ***************************/ main(){ int Sum, FactNum, x, y, m; printf("計算1!+2!+...+m!,(0 x[i + 1]) { temp = x[i]; x[i] = x[i + 1]; x[i + 1] = temp; /* x[i]與x[i+1]互換 */ times = i; } } k = times; } for (i = 0; i < 6; i++) printf("%d\t", x[i]); printf("\n特別號\t%d\n", spec); } /* ch06_05.c */ /*************************** 檔名:ch6_05.c 功能:二維陣列的練習 ***************************/ main(){ int m[9][9]; int i, j; for (i = 1; i <= 9; i++) for (j = 1; j <= 9; j++) m[i - 1][j - 1] = i * j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("%d*%d=%d\t", i, j, m[i - 1][j - 1]); } printf("\n"); } } /* ch06_06.c */ /*************************** 檔名:ch6_06.c 功能:二維陣列的練習 ***************************/ main(){ float score[5][4] = { {85, 78, 65, 0}, {75, 85, 69, 0}, {63, 67, 95, 0}, {94, 92, 88, 0}, {74, 65, 73, 0} }; int i, j; printf("計概\t數學\t英文\t平均\n"); printf("==============================\n"); for (i = 0; i < 5; i++) { score[i][3] = (score[i][0] + score[i][1] + score[i][2]) / 3; for (j = 0; j < 4; j++) { printf("%.2f\t", score[i][j]); } printf("\n"); } } /* ch06_07.c */ /*************************** 檔名:ch6_07.c 功能:計算字串長度 ***************************/ main(){ char string[] = "I love Kitty"; int i; i = 0; while (string[i] != '\0') { i++; } printf("字串%s的長度為%d\n", string, i); } /* ch06_08.c */ /*************************** 檔名:ch6_08.c 功能:字串反向 ***************************/ main(){ char string1[60], string2[60]; int i, len; printf("請輸入字串:"); scanf("%s", &string1); len = 0; while (string1[len] != '\0') { len++; } for (i = 0; i < len; i++) { string2[i] = string1[len - 1 - i]; } string2[i] = '\0'; printf("反向字串為:%s\n", string2); } /* ch06_09.c */ /*************************** 檔名:ch6_09.c 功能:fgets()函式練習 ***************************/ main(){ char fgets_string[100]; char scanf_string[100]; printf("請輸入fgets字串:"); fgets(fgets_string, 100, stdin); printf("請輸入scanf字串:"); scanf("%s", &scanf_string); printf("您輸入的fgets字串是%s", fgets_string); printf("您輸入的scanf字串是%s\n", scanf_string); } /* ch06_10.c */ /*************************** 檔名:ch6_10.c 功能:標準輸入裝置 ***************************/ main(){ char fgets_string[100]; char scanf_string[100]; printf("請輸入scanf字串:"); scanf("%s", &scanf_string); printf("請輸入fgets字串:"); fgets(fgets_string, 100, stdin); printf("您輸入的scanf字串是%s\n", scanf_string); printf("您輸入的fgets字串是%s", fgets_string); } /* ch06_11.c */ /*************************** 檔名:ch6_11.c 功能:puts()函式練習 ***************************/ main(){ char string1[100], string2[100]; printf("請輸入string1字串:"); fgets(string1, 100, stdin); printf("請輸入string2字串:"); scanf("%s", &string2); printf("string1字串是"); puts(string1); printf("string2字串是"); puts(string2); } /* ch06_12.c */ /******************************* 檔名:ch6_12.c 功能:strlen()練習-字串反向 *******************************/ #include main(){ char string1[60], string2[60]; int i, len; printf("請輸入字串:"); scanf("%s", &string1); len = strlen(string1); printf("字串長度為%d\n", len); for (i = 0; i < len; i++) { string2[i] = string1[len - 1 - i]; } string2[i] = '\0'; printf("反向字串為:%s\n", string2); } /* ch06_13.c */ /*************************************************** 檔名:ch6_13.c 功能:strcpy(),strncpy()練習-複製字串及部分字串 ***************************************************/ #include main(){ char src_string[] = "程式設計C語言"; char dest_string[60], dest_substring[60]; strcpy(dest_string, src_string); strncpy(dest_substring, src_string, 8); printf("複製的完整字串為:%s\n", dest_string); printf("複製的部分字串為:%s\n", dest_substring); } /* ch06_14.c */ /**************************************** 檔名:ch6_14.c 功能:strcpy(),strcat( )練習-組合字串 ****************************************/ #include main(){ char string1[20], string2[20] = "股份有限公司", string3[20]; char dest_string[60]; printf("請輸入string1字串:"); scanf("%s", &string1); printf("請輸入string3字串:"); scanf("%s", &string3); strcpy(dest_string, string1); strcat(dest_string, string2); strcat(dest_string, string3); printf("dest_string:%s\n", dest_string); } /* ch06_15.c */ /******************************************* 檔名:ch6_15.c 功能:strcmp()與strncmp()練習-比較字串 *******************************************/ #include main(){ char s1[] = "output"; char s2[] = "outside"; char s3[] = "output"; char s4[] = "outlook"; printf("%s與%s\t的比較結果==>%d\n", s1, s1, strcmp(s1, s1)); printf("%s與%s\t的比較結果==>%d\n", s1, s2, strcmp(s1, s2)); printf("%s與%s\t的比較結果==>%d\n", s1, s3, strcmp(s1, s3)); printf("%s與%s\t的比較結果==>%d\n", s1, s4, strcmp(s1, s4)); printf("%s與%s\t的前3個字元比較結果==>%d\n", s1, s2,strncmp(s1, s2, 3)); } /* ch06_16.c */ /******************************* 檔名:ch6_16.c 功能:strtok()練習-取出token *******************************/ #include main(){ char string1[] = "Word:Excel:PowerPointer:Access;C;Java;ASP:PHP"; char delim1[] = ":,;"; char *Token; /* 指標字串,請見指標章節說明 */ printf("原始字串為%s\n", string1); printf("開始切割..........\n"); printf("Tokens(句元)如下:\n"); Token = strtok(string1, delim1); /* 將第一個句元存入Token */ while (Token != NULL) { /* 使用迴圈取出剩餘句元 */ printf("%s\n", Token); Token = strtok(NULL, delim1); } } /* ch07_01.c */ /*************************** 檔名:ch7_01.c 功能:呼叫函式 ***************************/ #include main(){ char string1[60] = "Welcome", string2[60]; int len; strcpy(string2, string1); printf("string2=%s\n", string2); len = strlen(string2); printf("字串長度為%d\n", len); } /* ch07_02.c */ /*************************** 檔名:ch7_02.c 功能:宣告,定義,呼叫函式 ***************************/ double Power(double, int); double Power(double X, int n){ int i; double PowerXn = 1; for (i = 1; i <= n; i++) PowerXn = PowerXn * X; return PowerXn; } main(){ int k; double Ans; printf("計算3.5的k次方?請輸入k="); scanf("%d", &k); Ans = Power(3.5, k); /* 呼叫函式 */ printf("3.5的%d次方=%f\n", k, Ans); } /* ch07_03.c */ /*************************** 檔名:ch7_03.c 功能:函式應用 ***************************/ int Odd(int U); int Even(int U); int TotalSum(int U); main(){ int n, Sum; char AddChoice; printf("1+2+...+n=?請輸入n="); scanf("%d", &n); fflush(stdin); printf("請問要做奇數和(O),偶數和(E),還是整數和(I)?請選擇:"); scanf("%c", &AddChoice); switch (AddChoice) { case 'O': Sum = Odd(n); break; case 'E': Sum = Even(n); break; case 'I': Sum = TotalSum(n); break; default: printf("選擇錯誤\n"); return -1; } printf("總和為%d\n", Sum); } int Odd(int U){ int i, total = 0; for (i = 1; i <= U; i++) if (i % 2 == 1) total = total + i; return total; } int Even(int U){ int i, total = 0; for (i = 1; i <= U; i++) if (i % 2 == 0) total = total + i; return total; } int TotalSum(int U){ return Odd(U) + Even(U); } /* ch07_04.c */ /*************************** 檔名:ch7_04.c 功能:函式應用 ***************************/ long int factorial(int p); /* 函式宣告 */ long int factorial(int p) { /* 函式定義 */ int count; long int result = 1; for (count = 1; count <= p; count++) { result = result * count; } return result; } main(){ int m, n; long int ans; long int temp[3]; printf("求排列組合C(m,n)\n"); printf("m = "); scanf("%d", &m); printf("n = "); scanf("%d", &n); temp[0] = factorial(m); /* 計算 m! 的值 */ temp[1] = factorial(n); /* 計算 n! 的值 */ temp[2] = factorial(m - n); /* 計算 (m-n)! 的值 */ ans = (temp[0]) / (temp[1] * temp[2]); /* C(m,n) = (m!)/(n!*(m-n)!) */ printf("C(%d,%d) = %d\n", m, n, ans); } /* ch07_05.c */ /********************************* 檔名:ch7_05.c 功能:無傳入引數及回傳值的函式 *********************************/ void print99(); /* 函式宣告 */ void print99() { /* 函式定義 */ int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) printf("%d*%d=%d\t", i, j, i * j); printf("\n"); } } main(){ printf("以下是常見的九九乘法表\n"); print99(); /* 函式呼叫 */ } /* ch07_06.c */ /*************************************** 檔名:ch7_06.c 功能:函式宣告,定義,呼叫的相對位置 ***************************************/ void func1(); /* func1函式宣告 */ void func2(); /* func2函式宣告 */ main(){ func1(); func2(); } void func1() { /* func1函式定義 */ printf("func1函式正在執行中...\n"); } void func2() { /* func2函式定義 */ printf("func2函式正在執行中...\n"); } /* ch07_07.c */ /****************************** 檔名:ch7_07.c 功能:函式宣告與定義的合併 ******************************/ void func1() { /* func1函式定義(省略函式宣告) */ printf("func1函式正在執行中...\n"); } void func2() { /* func2函式定義(省略函式宣告) */ printf("func2函式正在執行中...\n"); } main(){ func1(); func2(); } /* ch07_08.c */ /*************************** 檔名:ch7_08.c 功能:return返回 ***************************/ int func1(){ int a = 5, b = 7; a++; return a + b; a++; return a + b; a++; return a + b; } main(){ int k; k = func1(); printf("k=%d\n", k); } /* ch07_09.c */ /*************************** 檔名:ch7_09.c 功能:無回傳值的錯誤 ***************************/ int func1(){ printf("func1函式正在執行中...\n"); } main(){ int a = 1; a = func1(); printf("a=%d\n", a); } /* ch07_10.c */ /*************************** 檔名:ch7_10.c 功能:rand函式練習 ***************************/ main(){ int i; for (i = 1; i <= 6; i++) { printf("第%d個隨機亂數為%d\n", i, rand()); } } /* ch07_11.c */ /****************************** 檔名:ch7_11.c 功能:srand與rand函式練習 ******************************/ #include main(){ int i; srand((unsigned) time(NULL)); for (i = 1; i <= 6; i++) { printf("第%d個隨機亂數為%d\n", i, rand()); } } /* ch07_12.c */ /******************************* 檔名:ch7_12.c 功能:產生6個1~42的隨機亂數 *******************************/ #include main(){ int lotto[6]; int i; srand((unsigned) time(NULL)); for (i = 1; i <= 6; i++) { lotto[i - 1] = rand() % 42 + 1; printf("第%d個號碼為%d\n", i, lotto[i - 1]); } } /* ch07_13.c */ /*************************** 檔名:ch7_13.c 功能:傳值呼叫 ***************************/ void func1(int a, int b){ a = a + 10; b = b + 100; printf("func1()的a=%d\n", a); printf("func1()的b=%d\n", b); } main(){ int m = 1, n = 1; func1(m, n); printf("main( )的m=%d\n", m); printf("main( )的n=%d\n", n); } /* ch07_14.c */ /***************************** 檔名:ch7_14.c 功能:傳址呼叫(傳指標呼叫) *****************************/ void func1(int *a, int b){ *a = *a + 10; b = b + 100; printf("func1()的*a=%d\n", *a); printf("func1()的b=%d\n", b); } main(){ int m = 1, n = 1; func1(&m, n); printf("main( )的m=%d\n", m); printf("main( )的n=%d\n", n); } /* ch07_17.c */ /*************************** 檔名:ch7_17.c 功能:傳址呼叫傳遞參數 ***************************/ #include void generate_lotto(int *arr, int arr_index){ int i; srand((unsigned) time(NULL)); printf("樂透號碼開獎中.....\n"); for (i = 0; i < arr_index; i++) { arr[i] = rand() % 42 + 1; printf("第%d個號碼為%d\n", i + 1, arr[i]); } } main(){ int lotto[6], i; generate_lotto(lotto, 6); printf("樂透號碼如下.....\n"); for (i = 0; i < 6; i++) printf("%d\t", lotto[i]); printf("\n"); } /* ch07_18.c */ /*************************** 檔名:ch7_18.c 功能:循序搜尋法 ***************************/ int SeqSearch(int Target, int *arr, int arr_index){ int i; for (i = 0; i < arr_index; i++) if (Target == arr[i]) /* 找到了 */ return i; return -1; /* 完全找不到 */ } main(){ int work[11] = { 43, 23, 67, 27, 39, 15, 39, 37, 57, 26, 14 }; int FindNumber, location; printf("請輸入您要找的數值:"); scanf("%d", &FindNumber); location = SeqSearch(FindNumber, work, 11); if (location == -1) printf("在陣列中找不到要找的數值\n"); else printf("數值%d位於work[%d]\n", FindNumber, location); } /* ch07_19.c */ /*************************** 檔名:ch7_19.c 功能:二分搜尋法 ***************************/ int BinarySearch(int Target, int *arr, int arr_index){ int Low, Upper, m; Low = 0; Upper = arr_index - 1; while (Low <= Upper) { m = (Low + Upper) / 2; /* 計算中間位置 */ if (arr[m] == Target) { /* 找到了 */ return m; } else { if (arr[m] > Target) /* Target位於上半部 */ Upper = m - 1; else /* Target位於下半部 */ Low = m + 1; } } return -1; } main(){ int work[8] = { 33, 41, 52, 54, 63, 74, 79, 86 }; int FindNumber, location; printf("請輸入您要找的數值:"); scanf("%d", &FindNumber); location = BinarySearch(FindNumber, work, 8); if (location == -1) printf("在陣列中找不到要找的數值\n"); else printf("數值%d位於work[%d]\n", FindNumber, location); } /* ch07_20.c */ /*************************** 檔名:ch7_20.c 功能:設計樂透開獎遊戲 ***************************/ #include int SeqSearch(int Target, int *arr, int arr_index); void generate_lotto(int *spec_num, int *arr, int arr_index); /**************循序搜尋**************/ int SeqSearch(int Target, int *arr, int arr_index){ int i; for (i = 0; i < arr_index; i++) if (Target == arr[i]) /* 找到了 */ return i; return -1; /* 完全找不到 */ } /**************產生樂透號碼**************/ void generate_lotto(int *spec_num, int *arr, int arr_index){ int i, generate_num; srand((unsigned) time(NULL)); for (i = 0; i < arr_index; i++) { generate_num = rand() % 42 + 1; while (SeqSearch(generate_num, arr, i + 1) != -1) { /* 是否重複 */ generate_num = rand() % 42 + 1; } arr[i] = generate_num; } generate_num = rand() % 42 + 1; while (SeqSearch(generate_num, arr, i) != -1) { /* 特別號是否與其他號碼重複 */ generate_num = rand() % 42 + 1; } *spec_num = generate_num; } /**************main()**************/ main(){ int lotto[6], i, special; generate_lotto(&special, lotto, 6); printf("樂透號碼如下.....\n"); for (i = 0; i < 6; i++) printf("%d\t", lotto[i]); printf("\n"); printf("特別號:%d\n", special); } /* ch07_22.c */ /*************************** 檔名:ch7_22.c 功能:main函式的引數 ***************************/ main(int argc, char *argv[]){ int i; printf("本程式共接受到命令列%d個參數\n", argc); for (i = 0; i <= argc; i++) printf("argv[%d]字串為%s\n", i, argv[i]); } /* ch07_23.c */ /************************************* 檔名:ch7_23.c 功能:使用命令列參數決定開出的球數 *************************************/ #include int SeqSearch(int Target, int *arr, int arr_index); void generate_lotto(int *spec_num, int *arr, int arr_index); /**************循序搜尋**************/ int SeqSearch(int Target, int *arr, int arr_index){ int i; for (i = 0; i < arr_index; i++) if (Target == arr[i]) /* 找到了 */ return i; return -1; /* 完全找不到 */ } /**************產生樂透號碼**************/ void generate_lotto(int *spec_num, int *arr, int arr_index){ int i, generate_num; srand((unsigned) time(NULL)); for (i = 0; i < arr_index; i++) { generate_num = rand() % 42 + 1; while (SeqSearch(generate_num, arr, i + 1) != -1) { /* 是否重複 */ generate_num = rand() % 42 + 1; } arr[i] = generate_num; } generate_num = rand() % 42 + 1; while (SeqSearch(generate_num, arr, i) != -1) { /* 特別號是否與其他號碼重複 */ generate_num = rand() % 42 + 1; } *spec_num = generate_num; } /**************main()**************/ main(int argc, char *argv[]){ int lotto[42], i, special, ball_qty = 6; if (argc > 1) { ball_qty = atoi(argv[1]); } generate_lotto(&special, lotto, ball_qty); printf("樂透號碼如下.....\n"); for (i = 0; i < ball_qty; i++) { if ((i % 6 == 0) && (i != 0)) printf("\n"); printf("%d\t", lotto[i]); } printf("\n"); printf("特別號:%d\n", special); } /* ch07_24.c */ /************************************************************ 檔名:ch7_24.c 功能:使用命令列參數決定開出的球數,並回傳執行是否正確 ************************************************************/ #include int SeqSearch(int Target, int *arr, int arr_index); void generate_lotto(int *spec_num, int *arr, int arr_index); /**************循序搜尋**************/ int SeqSearch(int Target, int *arr, int arr_index){ int i; for (i = 0; i < arr_index; i++) if (Target == arr[i]) /* 找到了 */ return i; return -1; /* 完全找不到 */ } /**************產生樂透號碼**************/ void generate_lotto(int *spec_num, int *arr, int arr_index){ int i, generate_num; srand((unsigned) time(NULL)); for (i = 0; i < arr_index; i++) { generate_num = rand() % 42 + 1; while (SeqSearch(generate_num, arr, i + 1) != -1) { /* 是否重複 */ generate_num = rand() % 42 + 1; } arr[i] = generate_num; } generate_num = rand() % 42 + 1; while (SeqSearch(generate_num, arr, i) != -1) { /* 特別號是否與其他號碼重複 */ generate_num = rand() % 42 + 1; } *spec_num = generate_num; } /**************main()**************/ main(int argc, char *argv[]){ int lotto[42], i, special, ball_qty = 6; if (argc > 1) { ball_qty = atoi(argv[1]); if ((ball_qty <= 0) || (ball_qty > 41)) { return 1; /* 參數錯誤,例如輸入球數為字串而非數字1~41 */ } } generate_lotto(&special, lotto, ball_qty); printf("樂透號碼如下.....\n"); for (i = 0; i < ball_qty; i++) { if ((i % 6 == 0) && (i != 0)) printf("\n"); printf("%d\t", lotto[i]); } printf("\n"); printf("特別號:%d\n", special); } /* ch07_25.c */ /*************************** 檔名:ch7_25.c 功能:自訂函式庫 ***************************/ #include "./lotto.h" /**************main()**************/ main(int argc, char *argv[]){ int lotto[42], i, special, ball_qty = 6, temp; if (argc > 1) { ball_qty = atoi(argv[1]); /* atoi須引入stdlib.h */ if (ball_qty == 0) { printf("參數錯誤,例如輸入球數非數字\n"); return -1; } if (!(generate_lotto_sort(&special, lotto, ball_qty))) { printf("參數錯誤,例如輸入球數非1~41\n"); return -1; } } else { generate_lotto_sort(&special, lotto, ball_qty); } printf("樂透號碼如下.....\n"); for (i = 0; i < ball_qty; i++) { if ((i % 6 == 0) && (i != 0)) printf("\n"); printf("%d\t", lotto[i]); } printf("\n"); printf("特別號:%d\n", special); return 1; } /* ch07_26.c */ /*************************** 檔名:ch7_26.c 功能:使用遞迴求費氏數列 ***************************/ int Fib(int n); /**************Fib()***************/ int Fib(int n){ if ((n == 1) || (n == 0)) return n; else return Fib(n - 1) + Fib(n - 2); } /**************main()**************/ main(){ int i; printf("費氏數列如下:"); for (i = 0; i <= 25; i++) { if (i % 8 == 0) printf("\n"); printf("%d\t", Fib(i)); } printf("......\n"); } /* ch07_27.c */ /*************************** 檔名:ch7_27.c 功能:使用迴圈求費氏數列 ***************************/ int Fib(int n); /**************Fib()***************/ int Fib(int n){ int n1 = 0, n2 = 0, sum = 1, i; if ((n == 1) || (n == 0)) return n; else { for (i = 2; i <= n; i++) { n1 = sum; sum = sum + n2; n2 = n1; } return sum; } } /**************main()**************/ main(){ int i; printf("費氏數列如下:"); for (i = 0; i <= 25; i++) { if (i % 8 == 0) printf("\n"); printf("%d\t", Fib(i)); } printf("......\n"); } /* ch07_28.c */ /*************************** 檔名:ch7_28.c 功能:巨集取代常數 ***************************/ #define PI 3.1416 #define R 3 main(){ float area, length; area = PI * R * R; length = 2 * PI * R; printf("半徑為3的圓面積為%.4f\n", area); printf("半徑為3的圓周長為%.4f\n", length); } /* ch07_29.c */ /*************************** 檔名:ch7_29.c 功能:巨集取代字串 ***************************/ #define WelcomeString "歡迎使用本程式" #define Running "程式執行中" #define loop3 for(i=1;i<=3;i++){\ printf(Running);\ printf("\n");\ } main(){ int i; printf(WelcomeString); printf("\n"); loop3 } /* ch07_30.c */ /*************************** 檔名:ch7_30.c 功能:巨集取代函式 ***************************/ #define Sum(a,b) a+b main(){ int a = 5, b = 10, c; c = Sum(a, b); printf("c=%d\n", c); } /* ch07_31.c */ /*************************** 檔名:ch7_31.c 功能:巨集包含運算式 ***************************/ #define Sum(a,b) a+b #define Mul(a,b) a*b main(){ int a = 1, b = 2, c = 3, d = 4; int result1, result2; result1 = Sum(a * b, c * d); result2 = Mul(a + b, c + d); printf("result1=%d\n", result1); printf("result2=%d\n", result2); } /* ch07_32.c */ /*************************** 檔名:ch7_32.c 功能:巨集包含運算式 ***************************/ #define Sum(a,b) (a)+(b) #define Mul(a,b) (a)*(b) main(){ int a = 1, b = 2, c = 3, d = 4; int result1, result2; result1 = Sum(a * b, c * d); result2 = Mul(a + b, c + d); printf("result1=%d\n", result1); printf("result2=%d\n", result2); } /* ch08_10.c */ /*************************** 檔名:ch8_10.c 功能:指標字串 ***************************/ main(){ char *s3 = "Welcome"; int i; for (i = 0; i < 8; i++) if (s3[i] != '\0') printf("s3[%d]=%c\n", i, s3[i]); else printf("s3[%d]='\\0'\n", i); } /* ch08_01.c */ /******************************* 檔名:ch8_01.c 功能:取址運算子與指標運算子 *******************************/ main(){ int a = 50, b; int *ptr; printf("a=%d\n", a); ptr = &a; /* 將ptr指向a */ printf("*ptr=%d\n", *ptr); b = *ptr; /* 將a的值(ptr指向的值)設定給b */ printf("b=%d\n", b); } /* ch08_02.c */ /******************************************* 檔名:ch8_02.c 功能:指標變數的內容以及指標變數的大小 *******************************************/ main(){ int a = 100; double b = 5.5; int *ptr1 = &a; /* 相當於 int *ptr1; 及 ptr1=&a; */ double *ptr2 = &b; /* 相當於 double *ptr2; 及 ptr2=&b; */ printf("a=%d\n", a); printf("b=%e\n", b); printf("&a=%p\n", &a); printf("&b=%p\n", &b); printf("*ptr1=%d\n", *ptr1); printf("*ptr2=%e\n", *ptr2); printf("ptr1=%p\n", ptr1); printf("ptr2=%p\n", ptr2); printf("&ptr1=%p\n", &ptr1); printf("&ptr2=%p\n", &ptr2); printf("&*ptr1=%p\n", &*ptr1); /* &*ptr1相當於&a相當於ptr1 */ printf("&*ptr2=%p\n", &*ptr2); /* &*ptr2相當於&b相當於ptr2 */ printf("===============================\n"); printf("變數a佔用%d個位元組\n", sizeof(a)); printf("變數b佔用%d個位元組\n", sizeof(b)); printf("===============================\n"); printf("變數ptr1佔用%d個位元組\n", sizeof(ptr1)); printf("變數ptr2佔用%d個位元組\n", sizeof(ptr2)); } /* ch08_03.c */ /*************************** 檔名:ch8_03.c 功能:指標變數的指定運算 ***************************/ main(){ int a = 100; int *p, *q; printf("============宣告變數時=============\n"); printf("&a=%p\t a=%d\n", &a, a); printf("&p=%p\n", &p); printf("&q=%p\n", &q); p = &a; printf("============設定p=&a後=============\n"); printf("p=%p\t *p=%d\n", p, *p); q = p; printf("============設定q=p後=============\n"); printf("q=%p\t *q=%d\n", q, *q); *q = 50; printf("===========設定*q=50後============\n"); printf("p=%p\t *p=%d\n", p, *p); printf("q=%p\t *q=%d\n", q, *q); printf("a=%d\n", a); } /* ch08_04.c */ /*************************** 檔名:ch8_04.c 功能:指標變數的加法運算 ***************************/ main(){ int a; short int *p; int *q; float *r; double *s; p = (short int *) &a; q = &a; r = (float *) &a; s = (double *) &a; printf("p=%p\n", p); printf("q=%p\n", q); printf("r=%p\n", r); printf("s=%p\n", s); printf("=============================\n"); p = p + 1; q = q + 1; r = r + 1; s = s + 1; printf("p=%p\n", p); printf("q=%p\n", q); printf("r=%p\n", r); printf("s=%p\n", s); } /* ch08_05.c */ /*************************** 檔名:ch8_05.c 功能:指標變數的比較運算 ***************************/ main(){ int a, b; int *p = &a, *q = &b; printf("指標p指向記憶體位址%p\n", p); printf("指標q指向記憶體位址%p\n", q); if (p > q) printf("變數a的記憶體位址高於變數b的記憶體位址\n"); else printf("變數b的記憶體位址高於變數a的記憶體位址\n"); } /* ch08_06.c */ /*************************** 檔名:ch8_06.c 功能:計算相隔元素個數 ***************************/ main(){ double array[8][15]; double *p, *q; int blocksize, count; p = &array[2][6]; q = &array[6][11]; count = q - p; blocksize = count * sizeof(double); printf("p=%p\t q=%p\n", p, q); printf("元素[2][6](含)~[6][10](含)之間共有%d個元素\n", count); printf("元素[2][6](含)~[6][10](含)之間的記憶體區塊大小為"); printf("%d位元組\n", blocksize); } /* ch08_07.c */ /******************************* 檔名:ch8_07.c 功能:傳指標呼叫實作swap( ) *******************************/ void swap(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp; } main(){ int m = 20, n = 60; printf("變換前(m,n)=(%d,%d)\n", m, n); swap(&m, &n); printf("變換後(m,n)=(%d,%d)\n", m, n); } /* ch08_08.c */ /******************************* 檔名:ch8_08.c 功能:使用指標存取陣列元素 *******************************/ main(){ float Temper[12], sum = 0, average; int i; for (i = 0; i < 12; i++) { printf("%d月的平均溫度:", i + 1); scanf("%f", (Temper + i)); sum = sum + *(Temper + i); } average = sum / 12; printf("=========================\n"); printf("年度平均溫度:%f\n", average); } /* ch08_09.c */ /******************************** 檔名:ch8_09.c 功能:普通字元陣列與字元字串 ********************************/ main(){ char s1[] = { 'W', 'e', 'l', 'c', 'o', 'm', 'e' }; char s2[] = "Welcome"; printf("s1字元陣列佔用記憶體%d bytes\n", sizeof(s1)); printf("s2字元字串佔用記憶體%d bytes\n", sizeof(s2)); } /* ch08_11.c */ /*************************** 檔名:ch8_11.c 功能:指標字串與字元字串 ***************************/ main(){ char s2[] = "Welcome"; char *s3 = "Welcome"; char *s4; char *s5 = "Good morning";; /* s2=s5; *//* 此行不合法 */ s3 = s5; s4 = s2; printf("s2=%s\n", s2); printf("s3=%s\n", s3); printf("s4=%s\n", s4); } /* ch08_12.c */ /*************************** 檔名:ch8_12.c 功能:指標陣列與字串陣列 ***************************/ main(){ int i; char *Week[7] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; for (i = 0; i <= 6; i++) printf("Week[%d]=%s\n", i, Week[i]); } /* ch08_13.c */ /****************************************** 檔名:ch8_13.c 功能:回傳字串指標(設計反轉字串函式) ******************************************/ #include char *inverse(char *dest, char *src); char *inverse(char *dest, char *src){ int i, len; len = strlen(src); for (i = len - 1; i >= 0; i--) *(dest + len - 1 - i) = *(src + i); *(dest + len) = '\0'; return dest; } main(){ char *s1 = "Welcome"; char *s2; s2 = inverse(s2, s1); printf("s1=%s\n", s1); printf("s2=%s\n", s2); } /* ch08_14.c */ /*************************** 檔名:ch8_14.c 功能:指標的指標 ***************************/ main(){ int m[9][9]; int i, j; for (i = 1; i <= 9; i++) for (j = 1; j <= 9; j++) *(*(m + (i - 1)) + (j - 1)) = i * j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("%d*%d=%d\t", i, j, *(*(m + (i - 1)) + (j - 1))); } printf("\n"); } } /* ch08_15.c */ /*************************** 檔名:ch8_15.c 功能:動態記憶體配置 ***************************/ #include #include "./lotto.h" /**************main()**************/ main(int argc, char *argv[]){ int i, special, ball_qty = 6, temp; int *lotto; if (argc > 1) { ball_qty = atoi(argv[1]); /* atoi須引入stdlib.h */ if (ball_qty == 0) { printf("參數錯誤,例如輸入球數非數字\n"); return -1; } if (!((ball_qty >= 1) && (ball_qty <= 41))) { printf("參數錯誤,例如輸入球數非1~41\n"); return -1; } } lotto = (int *) malloc(sizeof(int) * ball_qty); generate_lotto_sort(&special, lotto, ball_qty); printf("樂透號碼如下.....\n"); for (i = 0; i < ball_qty; i++) { if ((i % 6 == 0) && (i != 0)) printf("\n"); printf("%d\t", lotto[i]); } printf("\n"); printf("特別號:%d\n", special); return 1; } /* ch08_16.c */ /*************************** 檔名:ch8_16.c 功能:釋放記憶體 ***************************/ #include #include "./lotto.h" /**************main()**************/ main(int argc, char *argv[]){ int i, special, ball_qty = 6, temp; int *lotto; if (argc > 1) { ball_qty = atoi(argv[1]); /* atoi須引入stdlib.h */ if (ball_qty == 0) { printf("參數錯誤,例如輸入球數非數字\n"); return -1; } if (!((ball_qty >= 1) && (ball_qty <= 41))) { printf("參數錯誤,例如輸入球數非1~41\n"); return -1; } } lotto = (int *) malloc(sizeof(int) * ball_qty); generate_lotto_sort(&special, lotto, ball_qty); printf("樂透號碼如下.....\n"); for (i = 0; i < ball_qty; i++) { if ((i % 6 == 0) && (i != 0)) printf("\n"); printf("%d\t", lotto[i]); } free(lotto); printf("\n"); printf("特別號:%d\n", special); return 1; } /* ch09_01.c */ /******************************* 檔名:ch9_01.c 功能:全域變數與區域變數 *******************************/ int a = 10; void func1(){ int b = 5; a = a + 1; b = b + 1; /* c=c+1; *//* 這是錯的敘述 */ printf("b=%d\n", b); } main(){ int c = 20; a = a + 1; /* b=b+1; *//* 這是錯的敘述 */ c = c + 1; printf("a=%d\n", a); func1(); printf("a=%d\n", a); printf("c=%d\n", c); } /* ch09_02.c */ /******************************* 檔名:ch9_02.c 功能:全域變數與區域變數 *******************************/ int a = 10; void func1(); main(){ int c = 20; printf("a=%d\n", a); /* printf("b=%d\n",b); *//* 這是錯的敘述 */ func1(); } int b = 100; void func1(){ printf("a=%d\n", a); printf("b=%d\n", b); } /* ch09_03.c */ /******************************* 檔名:ch9_03.c 功能:全域變數與區域變數同名 *******************************/ int a = 10; void func1(){ int a = 5; a = a + 1; printf("func1的 a=%d\n", a); } void func2(){ a = a + 1; printf("全域的 a=%d\n", a); } main(){ int a = 20; a = a + 1; printf("main的 a=%d\n", a); func1(); func2(); } /* ch09_04.c */ /******************************* 檔名:ch9_04.c 功能:自訂程式區段 *******************************/ int var5 = 50; void func1(){ int var1 = 10; printf("var1=%d\n", var1); { int var2 = 20; printf("var2=%d\n", var2); } printf("var5=%d\n", var5); } main(){ int var3 = 30; func1(); printf("var3=%d\n", var3); { int var4 = 40; printf("var4=%d\n", var4); } printf("var5=%d\n", var5); } /* ch09_05.c */ /******************************* 檔名:ch9_05.c 功能:auto變數 *******************************/ void func1(){ auto int var2 = 30; printf("區段外var2 = %d\n", var2); /* printf("區段外var3 = %d\n",var3); */ { auto int var3 = 40; printf("區段內var3 = %d\n", var3); printf("區段內var2 = %d\n", var2); } /* printf("區段外var3 = %d\n",var3); */ } main(){ auto int var1 = 10; printf("區段外var1 = %d\n", var1); { auto int var1 = 20; printf("區段內var1 = %d\n", var1); } func1(); } /* ch09_06.c */ /******************************* 檔名:ch9_06.c 功能:auto變數 *******************************/ void func1(){ auto int var1; printf("var1 = %d\n", var1); var1 = 100; printf("var1 = %d\n", var1); var1 = var1 + 1; printf("var1 = %d\n", var1); } void func2(){ auto int var2; var2 = 0; var2++; } main(){ func1(); func2(); printf("==============\n"); func1(); } /* ch09_07.c */ /******************************* 檔名:ch9_07.c 功能:static區域變數 *******************************/ void func1(){ static int var1 = 100; printf("var1 = %d\n", var1); var1 = var1 + 1; printf("var1 = %d\n", var1); } void func2(){ auto int var2; var2 = 0; var2++; } main(){ func1(); func2(); printf("==============\n"); func1(); } /* ch09_08.c */ /******************************* 檔名:ch9_08.c 功能:static區域變數 *******************************/ void func1(){ /* printf("var1 = %d\n",var1); */ { static int var1 = 100; var1 = var1 + 1; printf("var1 = %d\n", var1); } /* printf("var1 = %d\n",var1); */ } main(){ func1(); printf("==============\n"); func1(); } /* ch09_09.c */ /******************************* 檔名:ch9_09.c 功能:register變數 *******************************/ main(){ register int i, m; m = 0; for (i = 1; i < 10000; i++) m = m + i; printf("m=%d\n", m); } /* ch09_10.c */ /*********************************** 檔名:ch9_10.c 功能:外在變數宣告(單一檔案示範) ***********************************/ int i; void func1(){ extern int i; /* 可省略此行 */ i++; } main(){ extern int i; /* 可省略此行 */ printf("i=%d\n", i); func1(); printf("i=%d\n", i); } /* ch09_11_1.c */ /******************************* 檔名:ch9_11_1.c 功能:外在變數宣告(多檔案示範) *******************************/ int i; extern void func1(); main(){ extern int i; /* 可省略此行 */ printf("i=%d\n", i); func1(); printf("i=%d\n", i); } /* ch09_11_2.c */ /******************************* 檔名:ch9_11_2.c 功能:~在變數宣告(多檔案示範) *******************************/ void func1(){ extern int i; /* 不可省略此行 */ i++; } /* ch09_12_1.c */ /************************************ 檔名:ch9_12_1.c 功能:靜態外在變數宣告(多檔案示範) ************************************/ int i = 10; static int j = 10; extern void func1(); main(){ extern int i; /* 可省略此行 */ extern int j; /* 可省略此行 */ func1(); printf("ch9_12_2.c檔的i=%d\n", i); printf("ch9_12_2.c檔的j=%d\n", j); } /* ch09_12_2.c */ /************************************ 檔名:ch9_12_2.c 功能:靜態外在變數宣告(多檔案示範) ************************************/ extern int i; int j; /* extern int j; */ void func1(){ j = 100; printf("ch9_12_2.c檔的i=%d\n", i); printf("ch9_12_2.c檔的j=%d\n", j); } /* ch10_01.c */ /******************************* 檔名:ch10_01.c 功能:typedef型態定義的練習 *******************************/ typedef float score; main(){ score stu[3], total, avg; int i; total = 0; for (i = 1; i <= 3; i++) { printf("請輸入第%d位同學的成績:", i); scanf("%f", &stu[i - 1]); total = total + stu[i - 1]; } avg = total / 3; printf("平均成績=%.3f\n", avg); } /* ch10_02.c */ /******************************* 檔名:ch10_02.c 功能:struct定義及宣告結構體 *******************************/ #include struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; main(){ int score[3][3] = { {89, 84, 75}, {77, 69, 87}, {65, 68, 77} }; struct student IM[3]; struct student tempStu; int i, Total; strcpy(IM[0].stu_id, "S9103501"); strcpy(IM[1].stu_id, "S9103502"); strcpy(IM[2].stu_id, "S9103503"); for (i = 0; i < 3; i++) { Total = 0; IM[i].ScoreComputer = score[i][0]; IM[i].ScoreMath = score[i][1]; IM[i].ScoreEng = score[i][2]; Total = score[i][0] + score[i][1] + score[i][2]; IM[i].ScoreAvg = ((float) Total) / 3; } printf("學號\t\t計概\t數學\t英文\t平均\n"); printf("---------------------------------------------------\n"); for (i = 0; i < 3; i++) { tempStu = IM[i]; printf("%s\t%d\t%d\t%d\t%.4f\n", tempStu.stu_id, tempStu.ScoreComputer, tempStu.ScoreMath, tempStu.ScoreEng, tempStu.ScoreAvg); } } /* ch10_03.c */ /******************************* 檔名:ch10_03.c 功能:結構體引數 *******************************/ #include struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; void display(struct student); void display(struct student tempStu){ printf("%s\t%d\t%d\t%d\t%.4f\n", tempStu.stu_id, tempStu.ScoreComputer, tempStu.ScoreMath, tempStu.ScoreEng, tempStu.ScoreAvg); } main(){ int score[3][3] = { {89, 84, 75}, {77, 69, 87}, {65, 68, 77} }; struct student IM[3]; int i, Total; strcpy(IM[0].stu_id, "S9103501"); strcpy(IM[1].stu_id, "S9103502"); strcpy(IM[2].stu_id, "S9103503"); for (i = 0; i < 3; i++) { Total = 0; IM[i].ScoreComputer = score[i][0]; IM[i].ScoreMath = score[i][1]; IM[i].ScoreEng = score[i][2]; Total = score[i][0] + score[i][1] + score[i][2]; IM[i].ScoreAvg = ((float) Total) / 3; } printf("學號\t\t計概\t數學\t英文\t平均\n"); printf("---------------------------------------------------\n"); for (i = 0; i < 3; i++) { display(IM[i]); } } /* ch10_04.c */ /******************************* 檔名:ch10_04.c 功能:傳遞結構體指標 *******************************/ #include struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; void display(struct student); void BubbleSort(struct student *arr, int arr_index); void display(struct student tempStu){ printf("%s\t%d\t%d\t%d\t%.4f\n", tempStu.stu_id, tempStu.ScoreComputer, tempStu.ScoreMath, tempStu.ScoreEng, tempStu.ScoreAvg); } void BubbleSort(struct student *arr, int arr_index){ int k, times, i; struct student temp; k = arr_index - 1; while (k != 0) { times = 0; for (i = 0; i <= k - 1; i++) { if (arr[i].ScoreComputer > arr[i + 1].ScoreComputer) { temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; /* arr[i]與arr[i+1]互換 */ times = i; } } k = times; } } main(){ int score[3][3] = { {89, 84, 75}, {77, 69, 87}, {65, 68, 77} }; struct student IM[3], tempStu; int i, Total; strcpy(IM[0].stu_id, "S9103501"); strcpy(IM[1].stu_id, "S9103502"); strcpy(IM[2].stu_id, "S9103503"); for (i = 0; i < 3; i++) { Total = 0; IM[i].ScoreComputer = score[i][0]; IM[i].ScoreMath = score[i][1]; IM[i].ScoreEng = score[i][2]; Total = score[i][0] + score[i][1] + score[i][2]; IM[i].ScoreAvg = ((float) Total) / 3; } printf("學號\t\t計概\t數學\t英文\t平均\t(依計概排序前)\n"); printf("---------------------------------------------------\n"); for (i = 0; i < 3; i++) display(IM[i]); BubbleSort(IM, 3); printf("學號\t\t計概\t數學\t英文\t平均\t(依計概排序後)\n"); printf("---------------------------------------------------\n"); for (i = 0; i < 3; i++) display(IM[i]); } /* ch10_05.c */ /******************************* 檔名:ch10_05.c 功能:透過別名宣告結構體變數 *******************************/ #include struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; typedef struct student Stu_Score; main(){ int score[3][3] = { {89, 84, 75}, {77, 69, 87}, {65, 68, 77} }; Stu_Score IM[3]; Stu_Score tempStu; int i, Total; strcpy(IM[0].stu_id, "S9103501"); strcpy(IM[1].stu_id, "S9103502"); strcpy(IM[2].stu_id, "S9103503"); for (i = 0; i < 3; i++) { Total = 0; IM[i].ScoreComputer = score[i][0]; IM[i].ScoreMath = score[i][1]; IM[i].ScoreEng = score[i][2]; Total = score[i][0] + score[i][1] + score[i][2]; IM[i].ScoreAvg = ((float) Total) / 3; } printf("學號\t\t計概\t數學\t英文\t平均\n"); printf("---------------------------------------------------\n"); for (i = 0; i < 3; i++) { tempStu = IM[i]; printf("%s\t%d\t%d\t%d\t%.4f\n", tempStu.stu_id, tempStu.ScoreComputer, tempStu.ScoreMath, tempStu.ScoreEng, tempStu.ScoreAvg); } } /* ch10_06.c */ /******************************* 檔名:ch10_06.c 功能:struct位元欄位練習 *******************************/ struct flag { unsigned short int f1:1; unsigned short int f2:2; }; main(){ struct flag PSW; PSW.f1 = 1; PSW.f2 = 2; if (PSW.f1 == 1) printf("f1 is ON\n"); else printf("f1 is OFF\n"); switch (PSW.f2) { case 0: printf("f2 is OFF-OFF\n"); break; case 1: printf("f2 is OFF-ON\n"); break; case 2: printf("f2 is ON-OFF\n"); break; case 3: printf("f2 is ON-ON\n"); break; } } /* ch10_07.c */ /******************************* 檔名:ch10_07.c 功能:union結構體 *******************************/ union u_member { short int id; int income; }; struct s_member { short int id; int income; }; main(){ union u_member John; struct s_member Mary; John.income = 0x00000000; John.income = 0x66666666; John.id = 0x0010; Mary.income = 0x00000000; Mary.income = 0x55555555; Mary.id = 0x0011; printf("John.income =%X\n", John.income); printf("John.id =%X\n", John.id); printf("Mary.phone =%X\n", Mary.income); printf("Mary.id =%X\n", Mary.id); } /* ch10_08.c */ /******************************* 檔名:ch10_08.c 功能:列舉資料型態 *******************************/ enum manufacturer { IBM, MAXTOR, WD, SEAGATE }; main(){ enum manufacturer HardDisk; HardDisk = SEAGATE; switch (HardDisk) { case 0: printf("硬碟廠牌是IBM\n"); break; case 1: printf("硬碟廠牌是MAXTOR\n"); break; case 2: printf("硬碟廠牌是WD\n"); break; case 3: printf("硬碟廠牌是SEAGATE\n"); break; } } /* ch11_01.c */ /******************************* 檔名:ch11_01.c 功能:開檔與關檔 *******************************/ FILE *fp1; main(){ char filename[80]; printf("請輸入檔名(可含路徑):"); scanf("%s", filename); fp1 = fopen(filename, "r"); if (fp1 != NULL) { printf("檔案%s開啟中...\n", filename); } else { printf("檔案%s開啟失敗\n", filename); exit(1); /* 強迫結束程式 */ } fclose(fp1); printf("檔案%S關閉\n", filename); } /* ch11_02.c */ /************************************* 檔名:ch11_02.c 功能:複製檔案(使用fgetc與fputc) *************************************/ FILE *fp1, *fp2; main(){ char filename1[80], filename2[80]; char c; printf("請輸入來源檔名:"); scanf("%s", filename1); printf("請輸入目的檔名:"); scanf("%s", filename2); fp1 = fopen(filename1, "r"); fp2 = fopen(filename2, "w"); if ((fp1 == NULL) || (fp2 == NULL)) { printf("檔案發生錯誤\n"); exit(1); /* 強迫結束程式 */ } printf("讀取並寫入中......\n"); while ((c = fgetc(fp1)) != EOF) { /* 使用迴圈讀取來源檔內容 */ printf("%c", c); fputc(c, fp2); /* 使用迴圈寫入目的檔內容 */ } printf("\n讀取並寫入完畢......\n"); fclose(fp1); fclose(fp2); } /* ch11_03.c */ /*********************************** 檔名:ch11_03.c 功能:複製檔案(使用fgets與fputs) ***********************************/ FILE *fp1, *fp2; main(){ char filename1[80], filename2[80]; char tempstr[32]; printf("請輸入來源檔名:"); scanf("%s", filename1); printf("請輸入目的檔名:"); scanf("%s", filename2); fp1 = fopen(filename1, "r"); fp2 = fopen(filename2, "w"); if ((fp1 == NULL) || (fp2 == NULL)) { printf("檔案發生錯誤\n"); exit(1); /* 強迫結束程式 */ } printf("讀取並寫入中......\n"); while ((fgets(tempstr, 32, fp1)) != NULL) { /* 使用迴圈讀取來源檔內容 */ printf("%s", tempstr); fputs(tempstr, fp2); /* 使用迴圈寫入目的檔內容 */ } printf("\n讀取並寫入完畢......\n"); fclose(fp1); fclose(fp2); } /* ch11_04.c */ /************************************* 檔名:ch11_04.c 功能:複製檔案(使用fscanf與fprintf) *************************************/ FILE *fp1, *fp2; main(){ char filename1[80], filename2[80]; char tempstr[32]; printf("請輸入來源檔名:"); scanf("%s", filename1); printf("請輸入目的檔名:"); scanf("%s", filename2); fp1 = fopen(filename1, "r"); fp2 = fopen(filename2, "w"); if ((fp1 == NULL) || (fp2 == NULL)) { printf("檔案發生錯誤\n"); exit(1); /* 強迫結束程式 */ } printf("讀取並寫入中......\n"); while ((fscanf(fp1, "%s", tempstr)) != EOF) { /* 使用迴圈讀取來源檔內容 */ /* printf("%s\n",tempstr); */ fprintf(fp2, "%s\n", tempstr); /* 使用迴圈寫入目的檔內容 */ } printf("讀取並寫入完畢......\n"); fclose(fp1); fclose(fp2); } /* ch11_05.c */ /******************************* 檔名:ch11_05.c 功能:移動檔案指標(使用fseek) *******************************/ FILE *fp1; main(){ char filename1[80]; char tempstr[32]; printf("請輸入檔名:"); scanf("%s", filename1); fp1 = fopen(filename1, "r"); if (fp1 == NULL) { printf("檔案發生錯誤\n"); exit(1); /* 強迫結束程式 */ } if (fseek(fp1, -17L, SEEK_END) == 0) { fscanf(fp1, "%s", tempstr); printf("檔尾倒數17個字元處的token是%s\n", tempstr); } else { printf("fseek產生錯誤\n"); } fclose(fp1); } /* ch11_06.c */ /********************************* 檔名:ch11_06.c 功能:複製檔案(可複製二進位檔) *********************************/ #include FILE *fp1, *fp2; main(int argc, char *argv[]){ char src_filename[128]; /* 來源檔案 */ char dest_filename[128]; /* 目的檔案 */ int ch; if (argc <= 2) { /* 提示使用者輸入來源檔名與目的檔名 */ printf("請輸入來源檔名與目的檔名\n"); exit(0); } else { strcpy(src_filename, argv[1]); strcpy(dest_filename, argv[2]); } if ((fp1 = fopen(src_filename, "rb")) == NULL) { printf("開啟來源檔%s錯誤\n", src_filename); exit(0); } if ((fp2 = fopen(dest_filename, "wb")) == NULL) { printf("無法建立目的檔%s\n", dest_filename); exit(0); } while ((ch = fgetc(fp1)) != EOF) { /* 當讀到EOF時,表示檔案結束 */ fputc(ch, fp2); } fclose(fp1); fclose(fp2); } /* ch11_07.c */ /******************************* 檔名:ch11_07.c 功能:讀寫二進位檔 *******************************/ FILE *fp; main(int argc, char *argv[]){ char output[] = "This is a binary file!"; char input[100] = { 0 }; int num; /************寫入二進位檔 ****************/ if ((fp = fopen("data3", "wb")) == NULL) { printf("檔案錯誤\n"); exit(0); } num = fwrite(output, sizeof(char), sizeof(output), fp); printf("二進位檔寫入完成\n"); fclose(fp); /************讀取二進位檔 ****************/ if ((fp = fopen("data3", "rb")) == NULL) { printf("檔案錯誤\n"); exit(0); } num = fread(input, sizeof(char), 23, fp); printf("二進位檔讀取完成\n"); printf("二進位檔內容如下\n"); printf("%s\n", input); fclose(fp); } /* ch11_08.c */ /************************************* 檔名:ch11_08.c 功能:配合結構體寫入二進位檔資料 *************************************/ #include struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; FILE *fp; /**************main**************/ main(){ int score[3][3] = { {89, 84, 75}, {77, 69, 87}, {65, 68, 77} }; struct student IM[3]; int i, Total, num; strcpy(IM[0].stu_id, "S9103501"); strcpy(IM[1].stu_id, "S9103502"); strcpy(IM[2].stu_id, "S9103503"); for (i = 0; i < 3; i++) { Total = 0; IM[i].ScoreComputer = score[i][0]; IM[i].ScoreMath = score[i][1]; IM[i].ScoreEng = score[i][2]; Total = score[i][0] + score[i][1] + score[i][2]; IM[i].ScoreAvg = ((float) Total) / 3; } if ((fp = fopen("data4", "w+b")) == NULL) { printf("檔案錯誤\n"); exit(0); } num = fwrite(IM, sizeof(struct student), 3, fp); printf("二進位檔寫入完成\n"); fclose(fp); } /* ch11_09.c */ /************************************* 檔名:ch11_09.c 功能:配合結構體讀取二進位檔資料 *************************************/ struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; FILE *fp; void display(struct student); void display(struct student tempStu){ printf("%s\t%d\t%d\t%d\t%.4f\n", tempStu.stu_id, tempStu.ScoreComputer, tempStu.ScoreMath, tempStu.ScoreEng, tempStu.ScoreAvg); } /**************main**************/ main(){ struct student IM[50]; int i, num; if ((fp = fopen("data4", "rb")) == NULL) { printf("檔案錯誤\n"); exit(0); } num = fread(IM, sizeof(struct student), 2, fp); printf("二進位檔讀取完成,前兩筆學生資料如下\n"); fclose(fp); for (i = 0; i < 2; i++) display(IM[i]); } /* ch11_02x.c */ /******************************* 檔名:ch10_02.c 功能:struct定義及宣告結構體 *******************************/ #include struct student { char stu_id[12]; int ScoreComputer; int ScoreMath; int ScoreEng; float ScoreAvg; }; main(){ int score[3][3] = { {89, 84, 75}, {77, 69, 87}, {65, 68, 77} }; struct student IM[3]; struct student tempStu; int i, Total; strcpy(IM[0].stu_id, "S9103501"); strcpy(IM[1].stu_id, "S9103502"); strcpy(IM[2].stu_id, "S9103503"); for (i = 0; i < 3; i++) { Total = 0; IM[i].ScoreComputer = score[i][0]; IM[i].ScoreMath = score[i][1]; IM[i].ScoreEng = score[i][2]; Total = score[i][0] + score[i][1] + score[i][2]; IM[i].ScoreAvg = ((float) Total) / 3; } printf("學號\t\t計概\t數學\t英文\t平均\n"); printf("---------------------------------------------------\n"); for (i = 0; i < 3; i++) { tempStu = IM[i]; printf("%s\t%d\t%d\t%d\t%.4f\n", tempStu.stu_id, tempStu.ScoreComputer, tempStu.ScoreMath, tempStu.ScoreEng, tempStu.ScoreAvg); } } /* ch12_01.c */ /******************************* 檔名:ch12_01.c 功能:實現堆疊之推入與彈出 *******************************/ #define STACK_SIZE 100 void push(int item, int *stack, int max_size, int *top); int pop(int *stack, int *bottom, int *top); void push(int item, int *stack, int max_size, int *top){ if (*top >= max_size - 1) printf("STACK FULL!\n"); else stack[++*top] = item; } int pop(int *stack, int *bottom, int *top){ if (*bottom > *top) { printf("STACK EMPTY!\n"); return NULL; } else return stack[(*top)--]; } main(){ int stack[STACK_SIZE]; int top = -1, bottom = 0, InputData = 10, i; printf("推入資料:"); for (i = 1; i <= 5; i++) { InputData++; printf("%d\t", InputData); push(InputData, stack, STACK_SIZE, &top); /*推入資料的語法 */ } printf("\n彈出資料:"); for (i = 1; i <= 5; i++) { printf("%d\t", pop(stack, &bottom, &top)); /*彈出資料的語法 */ } } /* ch12_02.c */ /******************************* 檔名:ch12_02.c 功能:實現佇列之加入與刪除 *******************************/ #define QUEUE_SIZE 100 void add_q(int item, int *queue, int max_size, int *rear); int delete_q(int *queue, int *front, int *rear); void add_q(int item, int *queue, int max_size, int *rear){ if (*rear >= max_size - 1) printf("QUEUE FULL!\n"); else queue[++*rear] = item; } int delete_q(int *queue, int *front, int *rear){ if (*front == *rear) { printf("QUEUE EMPTY!\n"); return NULL; } else return queue[++*front]; } main(){ int queue[QUEUE_SIZE]; int rear = -1, front = -1, InputData = 10, i; printf("加入資料:"); for (i = 1; i <= 5; i++) { InputData++; printf("%d\t", InputData); add_q(InputData, queue, QUEUE_SIZE, &rear); /*加入資料的語法 */ } printf("\n取出資料:"); for (i = 1; i <= 5; i++) { printf("%d\t", delete_q(queue, &front, &rear)); /*刪除(取出)資料的語法 */ } } /* ch12_03.c */ /********************************** 檔名:ch12_03.c 功能:實現環狀佇列之加入與刪除 **********************************/ #define CQUEUE_SIZE 100 void add_cq(int item, int *cqueue, int max_size, int *front, int *rear); int delete_cq(int *cqueue, int max_size, int *front, int *rear); void add_cq(int item, int *cqueue, int max_size, int *front, int *rear){ if (*front == (*rear + 1) % max_size) printf("QUEUE FULL!\n"); else { *rear = (*rear + 1) % max_size; cqueue[*rear] = item; } } int delete_cq(int *cqueue, int max_size, int *front, int *rear){ if (*front == *rear) { printf("QUEUE EMPTY!\n"); return NULL; } else { *front = (*front + 1) % max_size; return cqueue[*front]; } } main(){ int cqueue[CQUEUE_SIZE]; int rear = 0, front = 0, InputData = 10, i; printf("加入資料:"); for (i = 1; i <= 5; i++) { InputData++; printf("%d\t", InputData); add_cq(InputData, cqueue, CQUEUE_SIZE, &front, &rear); /*加入資料的語法 */ } printf("\n取出資料:"); for (i = 1; i <= 5; i++) { printf("%d\t", delete_cq(cqueue, CQUEUE_SIZE, &front, &rear)); /*刪除(取出)資料的語法 */ } } /* ch12_04.c */ /******************************* 檔名:ch12_04.c 功能:鏈結串列的練習 *******************************/ #include int temp[5] = { 1, 6, 8, 9, 2 }; struct node { /* 宣告節點結構資料型態 */ int data; struct node *next; }; typedef struct node *node_point; /* 定義指向節點結構的指標別名 */ void trace_data(node_point * ptr); void insert(node_point * ptr, node_point * worknode, int item); void del(node_point * ptr, node_point * worknode, node_point * beforenode); void insert(node_point * ptr, node_point * worknode, int item) { /*插入節點於worknode之後 */ node_point newone = (node_point) malloc(sizeof(struct node)); if (!(newone)) { printf("Memoey Full,can't alloc any node"); return; } if (*ptr) { newone->data = item; newone->next = (*worknode)->next; (*worknode)->next = newone; } else { newone->data = item; newone->next = NULL; *ptr = newone; } } void del(node_point * ptr, node_point * worknode, node_point * beforenode) { /*刪除worknode節點,beforenode為worknode之前一節點後 */ if (*ptr) { if (*beforenode) { (*beforenode)->next = (*worknode)->next; free(*worknode); *worknode = (*beforenode)->next; } else { *ptr = (*worknode)->next; free(*worknode); worknode = ptr; } } else { printf("linked list is empty ,can't delete any node"); return; } } void trace_data(node_point * ptr){ node_point tracenode = *ptr; if (tracenode == NULL) { printf("no any node"); return; } while (tracenode != NULL) { printf("%d \t", tracenode->data); tracenode = tracenode->next; } } main(){ node_point head = NULL; /* 1. 建立串列名稱 */ node_point worknode = NULL; node_point beforenode = NULL; int i; /***********************************/ /* 2. 建立{1,6,8,9,2} */ for (i = 0; i < 5; i++) { insert(&head, &worknode, temp[i]); worknode = head; while (worknode->next != NULL) { worknode = worknode->next; } } /***********************************/ /* 3. 刪除9, ---->{1,6,8,2} */ worknode = head; while (worknode->data != 9) { worknode = worknode->next; } beforenode = head; while (beforenode->next != worknode) { beforenode = beforenode->next; } del(&head, &worknode, &beforenode); /*實際執行刪除9 */ /***********************************/ /* 4. 插入4, ---->{1,6,4,8,2} */ worknode = head; while (worknode->data != 6) { worknode = worknode->next; } insert(&head, &worknode, 4); /*實際執行插入4 */ /***********************************/ trace_data(&head); /*循序瀏覽所有節點並列印資料 */ } /* ch12_05.c */ /******************************* 檔名:ch12_05.c 功能:實現插入排序法 *******************************/ void InsertionSort(int *arr, int arr_index){ int i, j, work; for (i = 1; i < arr_index; i++) { work = arr[i]; for (j = i - 1; ((j >= 0) && (work < arr[j])); j--) arr[j + 1] = arr[j]; arr[j + 1] = work; } } main(){ int B[5] = { 24, 7, 36, 2, 15 }; int i; InsertionSort(B, 5); for (i = 0; i <= 4; i++) printf("%d\t", B[i]); } /* ch12_06.c */ /******************************* 檔名:ch12_06.c 功能:實現快速排序法 *******************************/ void QuickSort(int *arr, int left, int right){ int i, j, work, temp; if (left < right) { /* 只有left arr[left]) j--; if (i < j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } else { arr[left] = arr[j]; arr[j] = work; break; } } while (1); QuickSort(arr, left, j - 1); /*遞迴呼叫,排序左邊資料 */ QuickSort(arr, j + 1, right); /*遞迴呼叫,排序右邊資料 */ } } main(){ int C[10] = { 24, 7, 36, 2, 65, 12, 58, 16, 47, 18 }; int i; QuickSort(C, 0, 10); for (i = 0; i <= 9; i++) printf("%d\t", C[i]); }