// C語言除錯高手 Learning C by debugging /* ex1-5a.c */ main(){ int num=30; printf("指定 num 的初值為 30\n"); printf("num = %d\n",num); } /* ex1-5b.c */ main(){ int i_num1 = 300; int i_num2; double d_num = 33.5; char c_letter1 = 'a', c_letter2 = 'b'; printf("i_num1 = %d\n", i_num1); printf("i_num2 = %d\n", i_num2); printf("d_num = %f\n", d_num); printf("c_letter1 = %c\n", c_letter1); printf("c_letter2 = %c\n", c_letter2); } /* ex2-1a.c */ main(){ printf("標準的輸出與輸入函數計有:\n"); printf("printf () 和 scanf()\n"); } /* ex2-1b.c */ main(){ int number = 8; char letter = 'z'; /* %d、%c為格式特定字 */ printf("1 加 1 是 %d\n", 2); printf("1 加 7 是 %d\n", number); printf("%c 是第一個英文字母\n", 'a'); printf("%c 是最後一個英文字母\n", letter); } /* ex2-1c.c */ main(){ char letter1 = 'a'; char letter2 = 'b'; char letter3 = 'c'; char letter4 = 't'; printf("%c %c %c are known by everyone\n", letter1, letter2, letter3); printf("I have a %c%c%c\n", letter3, letter1, letter4); } /* ex2-1d.c */ main(){ int i_num1= 100; printf("100%% orange juice\n"); /* 使用有關整數的格式特定字輸出 */ printf("輸出 100 使用 %%d: %d\n", i_num1); printf("輸出 100 使用 %%x: %x\n", i_num1); printf("輸出 100 使用 %%o: %o\n", i_num1); } /* ex2-1e.c */ main(){ float f_number = 123.456; double d_number = 123.456; printf("f_number = %f\n", f_number); printf("d_number = %f\n", d_number); } /* ex2-1f.c */ main(){ printf("We don\'t have enough time\n"); printf("Everybody say \" Later is better than never\"\n"); printf("Computer is powerfuk\bl\n"); printf(" can make it\rYou\n"); printf("Failure \151\163 the mother \x6f\x66 success\n"); } /* ex2-1g.c */ main(){ char letter = 'a'; printf("|%c| using %%c\n", letter); printf("|%10c| using %%10c\n", letter); printf("|%-10c| using %%-10c\n", letter); } /* ex2-1h.c */ main(){ int number1 = 123; double number2 = 123.456; printf("使用 %%d--------|%d|\n", number1); printf("使用 %%10d------|%10d|\n", number1); printf("使用 %%-10d-----|%-10d|\n", number1); printf("使用 %%2d-------|%2d|\n", number1); printf("使用 %%10.2f----|%10.3f|\n", number2); printf("使用 %%.2f------|%.2f| \n", number2); } /* ex2-1i.c */ main(){ double num1=123.456, num2=12.34, num3=12.345 ; double num4=4.456, num5=45.67, num6=456.789 ; printf("%f %f %f\n", num1, num2, num3); printf("%f %f %f\n", num4, num5, num6); printf("\n\n使用欄位寬...\n"); printf("%8.3f %8.3f %8.3f\n", num1, num2, num3); printf("%8.3f %8.3f %8.3f\n", num4, num5, num6); } /* ex2-2a.c */ main(){ int x; printf("請輸入一整數值: "); scanf("%d", &x); /* &為位址運算子 */ printf("您輸入的整數是 %d\n", x); } /* ex2-2b.c */ main(){ int x; printf("請輸入一整數值: "); scanf("%d", x); printf("您輸入的整數是 %d\n", x); } /* ex2-2c.c */ main(){ int i_num1; char ch; float f_num; double d_num; /* 要求輸入各種格式的值 */ printf("請輸入一字元: "); scanf("%c", &ch); printf("請輸入float浮點數: "); scanf("%f", &f_num); printf("請輸入double浮點數: "); scanf("%lf", &d_num); /* 將輸入結果輸出至螢幕上 */ printf("---------------------------------------------\n"); printf("您輸入的字元是 %c\n", ch); printf("您輸入的float浮點數是 %f\n", f_num); printf("您輸入的double浮點數是 %f\n", d_num); } /* ex2-2d.c */ main(){ int hour, min, sec; int year, month, days; char letter1, letter2; printf("請輸入兩個字元,中間以空白隔開: "); scanf("%c %c", &letter1, &letter2); /* 輸入兩個字元 */ printf("請輸入現在的時間? (hour:min:sec): "); scanf("%d:%d:%d", &hour, &min, &sec); /* 輸入時間 */ printf("請輸入現在的日期? (month-day-year): "); scanf("%d-%d-%d", &month, &days, &year); /* 輸入日期 */ printf("\n"); printf("兩個字元分別為: %c 和 %c\n", letter1, letter2); printf("現在時間是: %d 點 %d 分 %d 秒\n", hour, min, sec); printf("現在的日期是: 西元 %d %d月 %d日\n", year, month, days); } /* ex3-2a.c */ main(){ printf("15 + 7 = %d\n", 15+7); printf("10 - 2 = %d\n", 10-2); printf("20 * 5 = %d\n", 20*5); printf("10 / 2 = %d\n", 10/2); printf("20 %% 7 = %d\n", 20%7); } /* ex3-2b.c */ main(){ printf("20/3 = %d\n", 20/3); printf("20/3. = %f\n", 20/3.); } /* ex3-2c.c */ main(){ char c_letter; c_letter = 'a' + 'd' - 'b'; printf("a + d - b = %c\n", c_letter); } /* ex3-3a.c */ main(){ int num1, num2; num1 = 60; num2 = 30; printf("num1 = %d, num2 = %d\n", num1, num2); num1 -= num2; printf("num1-=num2 => num1 = %d, num2 = %d\n", num1, num2); num1 /= num2; printf("num1/=num2 => num1 = %d, num2 = %d\n", num1, num2); num1 += num2; printf("num1+=num2 => num1 = %d, num2 = %d\n", num1, num2); num1 *= num2; printf("num1*=num2 => num1 = %d, num2 = %d\n", num1, num2); num1 %= num2; printf("num1%%=num2 => num1 = %d, num2 = %d\n", num1, num2); } /* ex3-4a.c */ main(){ int num = 20, total = 0; total = ++num + 30; printf("total = %d, num = %d\n", total, num); total = 0; num = 20; total = num++ + 30; printf("total = %d, num = %d\n", total, num); } /* ex3-5a.c */ main(){ int num1, num2; num1 = 90; num2 = 80; printf("%d < %d: %d\n", num1, num2, num1 < num2); printf("%d <= %d: %d\n", num1, num2, num1 <= num2); printf("%d > %d: %d\n", num1, num2, num1 > num2); printf("%d >= %d: %d\n", num1, num2, num1 >= num2); printf("%d == %d: %d\n", num1, num2, num1 == num2); printf("%d != %d: %d\n", num1, num2, num1 != num2); } /* ex3-6a.c */ main(){ int num1 = 50, num2 = 70, num3 = 60, bool; printf("num1 = %d\n", num1); printf("num2 = %d\n", num2); printf("num3 = %d\n", num3); bool = num2 > num1 && num2 > num3; printf("num2 > num1 && num2 > num3 => %d\n", bool); bool = num2 > num1 && num1 > num3; printf("num2 > num1 && num1 > num3 => %d\n", bool); printf("-------------------------------------------\n"); bool = num1 > num2 || num2 > num3; printf("num1 > num2 || num2 > num3 => %d\n", bool); bool = num1 > num2 || num3 > num2; printf("num1 > num2 || num3 > num2 => %d\n", bool); printf("-------------------------------------------\n"); bool = !(num1 > num3 && num2 > num3); printf("!(num1 > num3 && num2 > num3) => %d\n", bool); bool = !(num1 > num2 || num3 > num1); printf("!(num1 > num2 || num3 > num1) => %d\n", bool); } /* ex3-7a.c */ main(){ short int i = 15; short int j = 11; printf("i & j = %hx\n", i & j); printf("i | j = %hx\n", i | j); printf("i ^ j = %hx\n", i ^ j); printf("~i = %hx\n", ~i); } /* ex3-7b.c */ main(){ short int a = 8; short int b=-8; printf("a = %d\n", a); printf("a << 1 = %d\n", a << 1); printf("a << 2 = %d\n", a << 2); printf("a << 3 = %d\n", a << 3); printf("a >> 1 = %d\n", a >> 1); printf("a >> 2 = %d\n", a >> 2); printf("a >> 3 = %d\n", a >> 3); printf("\n"); printf("b = %d\n", b); printf("b << 1 = %d\n", b << 1); printf("b << 2 = %d\n", b << 2); printf("b << 3 = %d\n", b << 3); printf("b >> 1 = %d\n", b >> 1); printf("b >> 2 = %d\n", b >> 2); printf("b >> 3 = %d\n", b >> 3); } /* ex3-8a.c */ main(){ double d_num1 = 5.7, d_num2 = 7.5; int i_num3, i_num4; i_num3 = d_num1 + d_num2; i_num4 = (int)d_num1 + (int)d_num2; /* 將double轉為int */ printf("num is %d before transferring type\n", i_num3); printf("num is %d after transferring type\n", i_num4); } /* ex3-8b.c */ main(){ int i_num1 = 2147483647, i_num2 = 1; double d_num3, d_num4; d_num3 = i_num1 + i_num2; /* 將int轉型為double */ d_num4 = (double) i_num1 + (double) i_num2; printf("num is %.0f before transferring type\n", d_num3); printf("num is %.0f after transferring type\n", d_num4); } /* ex4-1a.c */ main(){ int score; printf("若分數大於等於60分,則再加10分\n"); printf("請輸入您的分數: "); scanf("%d", &score); if (score >= 60) score += 10; printf("您最後的分數為 %d\n", score); } /* ex4-2a.c */ main(){ int score; printf("若分數大於等於60分,則再加10分,否則加5分\n"); printf("請輸入您的分數: "); scanf("%d", &score); if (score >= 60) score += 10; else score += 5; printf("您最後的分數為 %d\n", score); } /* ex4-2b.c */ main(){ int num = 200; if (num = 100) /* =為指定運算子 */ printf("num is 100\n"); else printf("num is 200\n"); } /* ex4-2c.c */ main(){ int num = 200; if (num == 100) /* ==才是等號運算子*/ printf("num is 100\n"); else printf("num is 200\n"); } /* ex4-2d.c */ main(){ int num; printf("正確的數字範圍是從 100 到 200\n"); printf("請輸入一數字: "); scanf("%d", &num); if (num >= 100 && num <= 200) printf("此為正確的數字!!\n"); else printf("此為不正確的數字!!\n"); } /* ex4-2e.c */ main(){ int num; printf("請輸入一整數: "); scanf("%d", &num); if (num >= 0){ printf("%d 是大於或等於 0\n", num); printf("所以 %d 是正整數\n", num); }else{ printf("%d 是小於 0\n", num); printf("所以 %d 是負數\n", num); } } /* ex4-2f.c */ main(){ int score; printf("Please input a score: "); scanf("%d", &score); if (score >= 60) if (score <= 80) score = score + 10; else score = score + 5; printf("score = %d\n", score); } /* ex4-2g.c */ main(){ int score; printf("請輸入您的分數: "); scanf("%d", &score); if (score >= 60){ if (score <= 80) score = score +10; }else score= score +5; printf("您最後的分數為 = %d\n", score); } /* ex4-3a.c */ main(){ int num1, num2, big; printf("請輸入兩個整數: "); scanf("%d %d", &num1, &num2); /*將較大的數存放於big變數 */ big = (num1 > num2) ? num1 : num2; printf("最大數為 %d\n", big); } /* ex4-3b.c */ main(){ int num1, num2, big; printf("請輸入兩個整數: "); scanf("%d %d", &num1, &num2); /*將較大的數存放於big變數 */ if (num1 > num2) big = num1; else big = num2; printf("最大數為 %d\n", big); } /* ex4-4a.c */ main(){ int num; printf("請輸入一整數: "); scanf("%d", &num); if (num > 0) printf("%d 是一正數\n", num); else if (num < 0) printf("%d 是一負數\n", num); else printf("%d 是0\n", num); } /* ex4-4b.c */ main(){ int level; printf("請問你是幾年級學生(1-5): "); scanf("%d", &level); if (level == 1) printf("你是大一新生\n"); else if (level == 2) printf("你是大二學生\n"); else if (level == 3) printf("你是大三學生\n"); else if (level == 4) printf("你是大四學生\n"); else if (level == 5) printf("你是研究生\n"); else printf("錯誤的代碼!!\n"); } /* ex4-5a.c */ main(){ /* switch敘述不使用break; */ int num; printf("請輸入一整數: "); scanf("%d", &num); switch (num){ case 1: printf("友子\n"); case 2: printf("阿嘉\n"); case 3: printf("茂伯\n"); case 4: printf("馬拉桑\n"); default: printf("你不是海角七號的演員\n"); } } /* ex4-5b.c */ main(){ /* switch敘述不使用break; */ int num; printf("請輸入一整數: "); scanf("%d", &num); switch (num){ case 1: printf("友子\n"); break; case 2: printf("阿嘉\n"); break; case 3: printf("茂伯\n"); break; case 4: printf("馬拉桑\n"); break; default: printf("你不是海角七號的演員\n"); } } /* ex4-5c.c */ main(){ /* 修改範例4-4b的else-if敘述更改為使用switch敘述 將int改為char型態,示範switch在字元常數下的用法 */ char level; printf("請問你是幾年級的學生(1…5): "); scanf("%c", &level); switch (level){ case '1': printf("你是大一新生\n"); break; case '2': printf("你是大二學生\n"); break; case '3': printf("你是大三學生\n"); break; case '4': printf("你是大四學生\n"); break; case '5': printf("你是研究生\n"); break; default: printf("錯誤的代碼!!\n"); } } /* ex4-5d.c */ main(){ char ch; printf("please input a character: "); scanf("%c", &ch); switch (ch){ case 'y': case 'Y': printf("one more\n"); break; case 'n': case 'N': printf("no more\n"); break; default: printf("over\n"); } } /* ex5-1a.c */ main(){ int num; for (num = 0; num <= 5; num++){ printf("Num is %d\n", num); } } /* ex5-1b.c */ main(){ int num = 0; /* 設定num初值為0 */ for ( ; num <= 5; num++) /* 省略初值的設定 */{ printf("Num is %d\n", num); } } /* ex5-1c.c */ main(){ int num = 0; for ( ; num <= 5; ){ printf("Num is %d\n", num); num++; } } /* ex5-1d.c */ main(){ int num = 0; for ( ; num <= 5; ) printf("Num is %d\n", num); num++; } /* ex5-1e.c */ main(){ /* 將範例5-1a的設定初值、條件判斷式及更新敘述省略 */ int num = 0; for ( ; ; ){ if (num > 5) /* 若num 大於5,則執行break,以結束for迴圈 */ break; printf("Num is %d\n", num); num++; } } /* ex5-1f.c */ main(){ /* 要求使用者不斷輸入數字,直到數字為負 */ int num = 0; for (;num >= 0; ){ printf("請輸入一整數(當此數為負時,將結束迴圈): "); scanf("%d", &num); } printf("輸入結束!!"); } /* ex5-1g.c */ main(){ int i, total = 0; for (i = 1; i<=100; i++) total += i; printf("1 + 2 + 3 + … + 100 = %d\n", total); } /* ex5-2a */ main(){ int num = 0; while (num >= 0){ printf("請輸入一整數(當此數為負時,將結束迴圈): "); scanf("%d", &num); } printf("結束"); } /* ex5-2b.c */ main(){ int i = 1, total = 0; while (i<=100){ total += i; i++; } printf("1 + 2 + 3 + … + 100 = %d\n", total); } /* ex5-2c.c */ main(){ /* 要求使用者輸入單字,計算字數 */ char letter; int count = 0; printf("請輸入一行文字: "); scanf("%c", &letter); while (letter != '\n'){ count++; scanf("%c", &letter); } printf("此行共有 %d 字\n", count); } /* ex5-3a.c */ main(){ int height; double inch; do{ printf("請問您的身高幾公分? "); scanf("%d", &height); } while (height < 0); /* 身高若負,則要求重新輸入 */ height /= 2.54; /* 將公分轉為公吋 */ printf("你的身高是 %d 呎 %d 吋\n", height/12, height%12); /*一呎等於12吋 */ } /* ex5-3b.c */ main(){ int i = 1, total = 0; do { total += i; i++; }while (i<=100); printf("1 + 2 + 3 + … + 100 = %d\n", total); } /* ex5-3c.c */ main(){ /* 建立選單,讓使用者輸入選項完成該選項工作 */ int option, no1, no2; /* 此選單有三個功能:1為加法,2為減法,3則跳出程式 */ do { printf("\n"); printf("1 => 加的運算\n"); printf("2 => 減的運算\n"); printf("3 => 結束\n"); printf("請選擇 (1-3): "); scanf("%d", &option); switch (option) /* 使用switch選擇敘述來執行各項功能 */{ case 1: printf("請輸入兩個整數: "); scanf("%d %d", &no1, &no2); printf("%d + %d is %d\n", no1, no2, no1+no2); break; case 2: printf("請輸入兩個整數: "); scanf("%d %d", &no1, &no2); printf("%d - %d is %d\n", no1, no2, no1 - no2); break; case 3: printf("再見!!"); break; default: printf("錯誤的選擇!!\n"); } } while (option != 3); /* 使用者輸入3則結束迴圈 */ } /* ex5-4a.c */ main(){ /* 以巢狀for迴圈輸出九九乘法表 */ int i, j; printf("%44s", "<< 九九乘法表 >>\n"); for (i=1; i<=9; i++) { /* 此為外迴圈 */ for (j=1; j<=9; j++) /* 此為內迴圈 */ printf("%d*%d=%2d ", j, i, i*j); printf("\n"); } } /* ex5-4b.c */ main(){ /* 以巢狀for迴圈輸出九九乘法表 */ int i, j; printf("%44s", "<< 九九乘法表 >>\n"); for (i=1; i<=9; i++) { /* 此為外迴圈 */ for (j=1; j<=9; j++) /* 此為內迴圈 */ printf("%d*%d=%2d ", i, j, i*j); printf("\n"); } } /* ex5-5a.c */ main(){ /* 要求輸入一個單字,顯示並計算字元個數 */ char letter; int count = 0; printf("請輸入一個單字: "); scanf("%c", &letter); while (letter != '\n'){ if (letter == 'a') /* 若遇到字元為a,則強迫跳離 */ break; if (letter != '\n'){ count++; printf("%c", letter); } scanf("%c", &letter); } printf("共有 %d 字元\n", count); } /* ex5-5b.c*/ main(){ int i, num, total=0; printf("輸入10 個整數,累加正整數,當輸入的值是負的,則結束迴圈\n"); for (i=1; i<=10; i++){ printf("請輸入第 %2d 個整數: ", i); scanf("%d", &num); if ( num >= 0) total += num; else break; } printf("Total=%d\n", total); } /* ex5-5c.c */ main(){ /* 要求輸入一個單字,顯示並計算字元個數 */ char letter; int count = 0; printf("請輸入一個單字: "); scanf("%c", &letter); while (letter != '\n'){ if (letter == 'a') /* 若遇到字元為a,不列入顯示及計算 */{ scanf("%c", &letter); continue; } if (letter != '\n'){ count++; printf("%c", letter); } scanf("%c", &letter); } printf("共有 %d 字元\n", count); } /* ex5-5d.c*/ main(){ int i, num, total=0; printf("輸入10 個整數,累加正整數\n"); for (i=1; i<=10; i++){ printf("請輸入第 %2d 個整數: ", i); scanf("%d", &num); if ( num >= 0) total += num; else continue; } printf("Total=%d\n", total); } /* ex5-6a.c */ main(){ int i = 0, total = 0; while (++i <= 100) total += i; printf("1 + 2 + 3 + … + 100 = %d, i=%d\n", total, i); } /* ex5-6b.c */ main(){ int i = 0, total = 0; while (i++ < 100) total += i; printf("1 + 2 + 3 + … + 100 = %d, i=%d\n", total, i); } /* ex5-6c.c */ main(){ int i=1, total=0; do{ total += i; }while (++i <= 100); printf("1 + 2 + 3 + … + 100 = %d, i=%d\n", total, i); } /* ex5-6d.c */ main(){ int i=1, total=0; do{ total += i; }while (i++ < 100); printf("1 + 2 + 3 + … + 100 = %d, i=%d\n", total, i); } /* ex6-1a.c */ void output(); /* 函數原型宣告 */ main(){ printf("呼叫output函數!!\n"); output(); /* 呼叫output()函數 */ printf("呼叫結束,over!!\n"); } /* output()函數的定義 */ void output() { printf("我喜歡iMac\n"); printf("也喜歡iPod\n"); } /* ex6-2a.c */ int square(); /* square()的原型宣告 */ main(){ int ans; printf("計算某一整數的平方\n\n"); ans = square(); /* 用ans接收square()的傳回值 */ printf("它的平方是 %d\n", ans); } /* 定義square(),函數型態為int */ /* 要求輸入一數,之後將此數平方後傳回 */ int square(){ int num, total; printf("請輸入一整數: "); scanf("%d", &num); total=num*num; return total; /* 將total傳回呼叫函數 */ } /* ex6-2b.c */ void test(); /* test()的原型宣告 */ main(){ printf("此程式在測試 return 的作用\n"); printf("測試開始!!\n"); test(); /* 呼叫test() */ printf("測試結束!!\n"); } /* test()的定義 */ /* 利用for迴圈測試return; 的效力 */ void test() { int i, a, b; for (i = 1; i <= 10; i++) /* 會執行10次的for迴圈 */{ printf("請輸入 a 和 b: "); scanf("%d %d", &a, &b); if (b == 0) return; /* 當b=0時,執行return; */ else printf("%d/%d=%d\n", a, b, a/b); printf("for 迴圈跑了 %d 次\n\n", i); } } /* ex6-3a.c */ int square(int); /* square()的原型宣告 */ main(){ int num, ans; printf("計算某一整數的平方\n\n"); printf("請輸入一整數: "); scanf("%d", &num); ans = square(num); /* 用ans接收square()的傳回值 */ printf("%d 的平方是 %d\n", num, ans); } /* 定義square(),函數型態為int */ /* 要求輸入一數,並將此數平方後傳回 */ int square(int n) { int total; total=n*n; return total; /* 將total傳回呼叫函數 */ } /* ex6-3b.c */ void printstar(int); /* printfstar()的原型宣告 */ main(){ int num; printf("請問要多少個*: "); scanf("%d", &num); printstar(num); } void printstar(int n) { int i; for (i=1; i1) return (n * factorial(n-1)); else return 1; } /* ex6-5b.c */ int factorial(int); main(){ int num; printf("Please input a number: "); scanf("%d", &num); printf("Factorial(%d)=%d\n", num, factorial(num)); } int factorial(int n) { int k, total = 1; for (k = 1; k <= n ; k++) total *= k; return total; } /* ex6-6a.c */ void increase(); main(){ /* 測試auto儲存類別的生命週期 */ int count; printf("Testing storage class << auto >>\n"); /* 使用for迴圈呼叫increase() */ for (count = 1; count <= 5; count++){ printf("# %d call: ", count); increase(); } printf("Testing end!!\n"); } /* 定義increase(),ai儲存類別為auto,輸出累加的結果 */ void increase(){ auto int ai = 100; /* 定義ai為auto儲存類別,初值為100 */ printf("ai = %d\n", ++ai); } /* ex6-6b.c */ void increase(); main(){ /* 測試static儲存類別的生命週期 */ int count; printf("Testing storage class << static >>\n"); /* 使用for迴圈呼叫increase() */ for (count = 1; count <= 5; count++){ printf("#%d call: ", count); increase(); } printf("Testing end!!\n"); } /* 定義increase(),si儲存類別為static,輸出累加的結果 */ void increase() { static int si = 100; /* 定義si為static儲存類別,初值為100 */ printf("si = %d\n", ++si); } /* ex6-6c.c */ main(){ /* 測試register儲存類別 */ int count1, count2; register long num = 0; /* 定義num為register儲存類別 */ printf("Testing storage class << register >>\n"); /* 巢狀迴圈對num作累加的動作 */ printf("Number: \n"); for (count1 = 1; count1 <= 500; count1++) for (count2 = 1; count2 <= 500; count2++) printf("\r%d", ++num); printf("\nTesting end!!\n"); } /* ex6-6d-1.c */ /* one file of Project*/ int sum(); int i=100, j=200; main(){ int total; total=sum(); printf("total=%d\n", total); } /* ex6-6d-2.c */ /* other file of project */ /* 定義sum()*/ int sum(){ extern int i, j; return (i+j); } /* ex7-2a.c*/ main(){ /* 輸入10個整數存入陣列,再從陣列讀出 */ int num[10], i; for (i = 0; i < 10; i++){ printf("請輸入num[%d]的資料: ", i); scanf("%d", &num[i]); } printf("\n此陣列有下列元素:\n"); for (i = 0; i < 10; i++) printf("num[%d]=%d\n", i, num[i]); } /* ex7-2b.c*/ main(){ /* 輸出陣列每一元素的位址 */ int num[10], i; for (i = 0; i < 10; i++){ printf("&num[%d]=%p, num+%d=%p\n", i, &num[i], i, num+i); } } /* ex7-2c.c*/ main(){ /* 設定陣列初值 */ double num1[6] = {11.1, 22.2, 33.3, 44.4, 55.5}; int num2[ ] = {1, 2, 3, 4, 5, 6}; /* 元素個數隨初值個數而定 */ int i; for (i = 0; i < 6; i++) printf("num1[%d]=%.1f\n", i, num1[i]); printf("\n\n"); for (i = 0; i < 6; i++) printf("num2[%d]=%d\n",i, num2[i]); printf("\nnum1陣列佔 %d bytes\n", sizeof(num1)); printf("num2陣列佔 %d bytes\n", sizeof(num2)); } /* ex7-3a.c*/ main(){ int num[2][5]; int index1, index2; for (index1 = 0; index1 < 2; index1++) for (index2 = 0; index2 < 5; index2++) printf("&num[%d][%d]: %p\n", index1, index2, &num[index1][index2]); printf("\n"); printf("num=%p, num[0]=%p\n", num, num[0]); printf("num+1=%p, num[0]+1=%p\n", num+1, num[0]+1); } /* ex7-3b.c */ main(){ /* 於二維陣列中,再將輸入值由二維陣列中取出並印出 */ int num[2][3]; int index1, index2; /* 以巢狀迴圈處理二維陣列輸入 */ for (index1 = 0; index1 < 2; index1++) for (index2 = 0; index2 < 3; index2++){ printf("請輸入num[%d][%d]的資料: ", index1, index2); scanf("%d", &num[index1][index2]); } printf("\n此二維陣列的資料如下:\n"); for (index1 = 0; index1 < 2; index1++){ for (index2 = 0; index2 < 3; index2++) printf("%3d ", num[index1][index2]); printf("\n"); } } /* ex7-3c.c*/ main(){ /* 此二維陣列表示-考三天(列註標),一天考三科(行註標) */ int score[3][3] = { {74, 72, 63}, {83, 92, 74}, {84, 82, 65} }; int index1, index2, total = 0; for (index1 = 0; index1 < 3; index1++) /* 外圈控制考試日期 */{ printf("\n第 %d 天的分數分別為: ", index1+1); for (index2 = 0; index2 < 3; index2++) /* 內圈控制考試科目 */{ printf("%3d", score[index1][index2]); /* 印出各科成績 */ total += score[index1][index2]; /* 將成績加總 */ } } printf("\n\n總分: %d\n", total); printf("平均分數: %.2f\n", total / 9.0); } /* ex7-3d.c*/ main(){ int score[2][3] = {10, 20, 30, 40, 50}; int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) printf("score[%d][%d] = %d\n", i, j, score[i][j]); } /* ex7-3e.c*/ main(){ int score[2][3] = {{10, 20}, {30, 40, 50}}; int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) printf("score[%d][%d] = %d\n", i, j, score[i][j]); } /* ex7-4a.c*/ main(){ int i, j, k, temp, size; int arr[]={80, 30, 40, 70, 50, 60}; size = sizeof(arr) / sizeof(int); printf(".....Before sorting........\n"); for (i=0; i<=size-1; i++) printf("%d ", arr[i]); printf("\n"); for (i=1; i<=25; i++) printf("-"); printf("\n"); /**********Bubble sort****************/ for (i=0; i arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } printf("#%d pass: ", i+1); for (k=0; k arr[j+1]) { flag=1; /* 若有對調,則將flag設為1 */ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } printf("#%d pass: ", i+1); for (k=0; k arr[j+1]) { flag=1; /* 若有對調,則將flag設為1 */ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } /* 印出每一次compare後的資料 */ printf(" #%d compare: ", j+1); for (k=0; k arr[j+1]) { flag=1; temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } if (flag == 0) break; } for (i=0; i<=size-1; i++) printf("%d ", arr[i]); printf("\n\n"); /***********Binary search***********/ printf("您要尋找那一個數字(輸入是英文字母將結束): "); while (scanf("%d", &kd) == 1) { left=0; right=size-1; bingo = 0; while (left <= right) { mid = (left+right)/2; if (kd == arr[mid]) { bingo=1; break; } if (kd < arr[mid]) right = mid-1; else left = mid+1; } if (bingo == 1) printf("在 arr[%d] 找到 %d.\n", mid, kd); else printf("對不起,查無此資料! \n"); printf("\n您要尋找那一個數字(輸入是英文字母將結束): "); } } /* ex8-1a.c */ main(){ /* 定義一指向int資料型態的指標,並觀察其內容 */ int num = 100; int *ptr; /* ptr是一個指向int的指標 */ ptr = # /* ptr指向num的位址 */ /* 印出num的位址及內容 */ printf("num 在記憶體的位址為 %p\n", &num); printf("num 變數值為 %d\n", num); /* 印出ptr變數位址 */ printf("&ptr is %p\n", &ptr); /* 印出ptr所指向的位址 */ printf("ptr is %p\n", ptr); /* 印出ptr所指向位址的內容 */ printf("*ptr = %d\n", *ptr); } /* ex8-1b.c */ main(){ int num = 100, *ptr; ptr = # /* 指定num的記憶體位址給ptr */ printf("開始時的變數值如下:\n"); printf("num=%d, *ptr=%d\n\n", num, *ptr); num = 200; /* num的值改為200 */ printf("透過 num= 200 更改num變數值\n"); printf("num=%d, *ptr=%d\n\n", num, *ptr); *ptr=300; printf("也可透過 *ptr=300 更改num變數值\n"); printf("num=%d, *ptr=%d\n", num, *ptr); } /* ex8-1c.c */ main(){ /* 要求輸入半徑以計算圓面積 */ double pi = 3.14, radius, area; double *ptr = π /* 設定ptr初值為&pi */ printf("請輸入圓的半徑: "); scanf("%lf", &radius); area = radius * radius * pi; printf("圓的面積為 %.2f\n", area, pi); *ptr = 3.14159; /* 藉由*ptr更改pi的值 */ area = radius * radius * pi; printf("經由*ptr更改pi為3.14159後,面積為%.3f\n", area); } /* ex8-1d.c */ main(){ /* 測試一指標變數所佔記憶體空間,並與基本型態變數比較 */ printf("char 佔 %d bytes\n", sizeof(char)); printf("int 佔 %d bytes\n", sizeof(int)); printf("float 佔 %d bytes\n", sizeof(float)); printf("double 佔 %d bytes\n\n", sizeof(double)); printf("char * 佔 %d bytes\n", sizeof(char *)); printf("int * 佔 %d bytes\n", sizeof(int *)); printf("float * 佔 %d bytes\n", sizeof(float *)); printf("double * 佔 %d bytes\n", sizeof(double *)); } /* ex8-2a.c */ main(){ int array[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int i; int *ptr = array; /* 將ptr指向array */ for (i = 0; i < 10; i++) printf("array[%d]=%3d\n", i, array[i]); printf("\n"); for (i = 0; i < 10; i++){ printf("*(ptr+%d)=%d\n", i, *(ptr+i)); } system("PAUSE");; } /* ex8-2b.c */ main(){ char string[10] = "computer"; /* 給定字元陣列(字串)初值 */ char *ptr = string; /* 將string第一個元素的位址指定給ptr指標 */ printf("陣列string的內容是 %s\n", string); /* 以下皆輸出陣列第一個元素的記憶體位址 */ printf("ptr: %p\n", ptr); printf("string: %p\n", string); printf("&string[0]: %p\n\n", &string[0]); /* 以下皆輸出陣列第二個元素的記憶體位址 */ printf("ptr+1: %p\n", ptr+1); printf("string+1: %p\n", string+1); printf("&string[1]: %p\n\n", &string[1]); /* 以下輸出陣列的內容 */ printf("*ptr: %c, string[0]: %c\n", *ptr, string[0]); printf("*(ptr+1): %c, string[1]: %c\n", *(ptr+1), string[1]); printf("*ptr+1: %c, string[0]+1: %c\n", *ptr+1, string[0]+1); } /* ex8-2c.c */ main(){ int num[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int *ptr = num; printf("&num[0]=%p, num=%p\n", &num[0], num); printf("ptr: %p\n", ptr); printf("*ptr: %d\n\n", *ptr); ++ptr; printf("ptr=%p\n", ptr); printf("*ptr: %d\n", *ptr); printf("*(ptr-1): %d\n", *(ptr-1)); printf("*(ptr+1): %d\n", *(ptr+1)); } /* ex8-2d.c */ main(){ int num[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; printf("num: %p\n", num); printf("*num: %d\n", *num); printf("num+1: %u\n", num++); /* 遞增num,發生錯誤 */ printf("*num: %d", *num); } /* ex8-2e.c */ main(){ /* 修改範例 7-2d, 使其可以執行 */ int num[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; printf("num: %p\n", num); printf("*num: %d\n", *num); printf("num+1: %p\n", num+1); printf("*num: %d\n", *num); } /* ex8-3a.c */ void change(int, int); /* 函數change()的原型宣告 */ main(){ int x, y; printf("請輸入 x: "); scanf("%d", &x); printf("請輸入 y: "); scanf("%d", &y); /* 呼叫change函數,將x、y傳遞給change()函數 */ change(x, y); printf("\n呼叫對調的函數後!!\n"); /* 執行完change函數後,印出x及y */ printf("x 是 %d\n", x); printf("y 是 %d\n", y); } /* 定義change函數,參數為a、b */ /* 交換a及b的值 */ void change(int a, int b) { int temp; temp = a; a = b; b = temp; } /* ex8-3b.c */ void change(int *, int *); main(){ int x, y; printf("請輸入 x: "); scanf("%d", &x); printf("請輸入 y: "); scanf("%d", &y); /* 呼叫change函數 */ /* 傳遞x及y的位址給swap()函數 */ change(&x, &y); /* 執行完change函數後,印出x及y */ printf("\n對調之後!!\n"); printf("x 是 %d\n", x); printf("y 是 %d\n", y); } /* 定義change函數,參數為*a、*b */ /* 交換*a及*b的值 */ void change(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } /* ex8-4a.c */ int sum(int *, int); /* 計算陣列所有元素的和 */ main(){ int arr[] = {10, 20, 30, 40, 50, 60}; int total, n, i; /* 計算arr陣列中有多少元素*/ n=sizeof(arr)/sizeof(arr[0]); total = sum(arr, n); for (i=0; i 0) return "Number is positive"; else if (num < 0) return "Number is negative"; else return "Number is zero"; } /* ex10-3i.c */ char *input(); /* 函數原型宣告 */ main(){ /* 錯誤的示範 */ char *str; str = input(); /* 呼叫input()函數,string接收函數傳回值 */ printf("Input string is %s\n", str); } char *input() { char strin[20]; printf("Enter a string: "); gets(strin); return strin; } /* ex10-4a.c */ main(){ /* 要求輸入一個字串,並計算字串長度 */ char string[30]; int length; printf("請輸入一字串: "); gets(string); length = strlen(string); printf(" %s字串的長度為: %d\n", string, length); } /* ex10-4b.c */ main(){ /* 要求輸入一字串,並將小寫英文字母轉為大寫 */ char string[30]; printf("輸入全為小寫的字串: "); gets(string); strupr(string); printf("將小寫轉為大寫: %s\n", string); } /* ex10-4c.c */ main(){ /* 要求輸入一字串,將字串中英文大寫字母轉為小寫 */ char string[30]; printf("輸入全為大寫的字串: "); gets(string); strlwr(string); printf("將大寫轉為小寫: %s\n", string); } /* ex10-4d.c */ main(){ /* 要求輸入一字串,並將字串拷貝到另一字串 */ char string1[30], string2[30]; printf("請輸入第一個字串: "); gets(string1); printf("執行拷貝的動作...\n"); strcpy(string2, string1); /* 呼叫strcpy()函數 */ printf("第二個字串為: %s\n", string2); } /* ex10-4e.c */ main(){ /* 要求輸入字串,拷貝字串前 N 個字元到另一字串 */ char string1[30], string2[30]={'\0'}; int size; printf("請輸入第一個字串: "); gets(string1); printf("請問要拷貝多少個字元: "); scanf("%d", &size); printf("執行拷貝的動作...\n\n"); strncpy(string2, string1, size); printf("第二個字串為: %s\n", string2); } /* ex10-4f.c */ main(){ /* 要求輸入兩個字串,將第一個字串附加到第二個字串後 */ char string1[30], string2[30]; printf("請輸入第一個字串: "); gets(string1); /* 輸入第一個字串 */ printf("請輸入第二個字串: "); gets(string2); /* 輸入第二個字串 */ printf("執行附加的動作...\n"); strcat(string2, string1); /* 呼叫strcat()函數 */ printf("第一個字串為: %s\n", string1); printf("第二個字串為: %s\n", string2); } /* ex10-4g.c */ main(){ /* 要求輸入字串,將一字串的前N個字元,附加到另一個字串 */ char string1[30], string2[30]; int size; printf("請輸入第一個字串: "); gets(string1); printf("請輸入第二個字串: "); gets(string2); printf("請問要附加多少個字元: "); scanf("%d", &size); /* 輸入附加字元數 */ printf("執行附加的動作...\n\n"); strncat(string2, string1, size); /* 呼叫strncat()函數 */ printf("第一個字串為: %s\n", string1); printf("第二個字串為: %s\n", string2); } /* ex10-4h.c */ main(){ /* 兩字串的比較 */ char string1[30], string2[30]; int difference; printf("請輸入第一個字串: "); gets(string1); printf("請輸入第二個字串: "); gets(string2); printf("執行比較的動作...\n"); difference = strcmp(string1, string2); switch (difference){ case 0: printf("%s 與 %s 是相同的\n", string1, string2); break; case 1: printf("%s 大於 %s\n", string1, string2); break; case -1: printf("%s 小於 %s\n", string1, string2); break; } } /* ex10-4i.c */ main(){ /* 兩字串的比較 */ char string1[30], string2[30]; int difference; printf("請輸入第一個字串: "); gets(string1); printf("請輸入第二個字串: "); gets(string2); printf("執行stricmp比較的動作...\n\n"); difference = stricmp(string1, string2); switch (difference){ case 0: printf("%s 與 %s 是相同的\n", string1, string2); break; case 1: printf("%s 大於 %s\n", string1, string2); break; case -1: printf("%s 小於 %s\n", string1, string2); break; } } /* ex10-4j.c */ main(){ /* 兩字串的比較 */ char string1[30], string2[30]; int difference, size; printf("請輸入第一個字串: "); gets(string1); printf("請輸入第二個字串: "); gets(string2); printf("請輸入要比較的字元數: "); scanf("%d", &size); printf("執行strncmp比較的動作...\n\n"); difference = strncmp(string1, string2, size); switch (difference){ case 0: printf("%s 與 %s 是相同的\n", string1, string2); break; case 1: printf("%s 大於 %s\n", string1, string2); break; case -1: printf("%s 小於 %s\n", string1, string2); break; } } /* ex10-4j.c */ main(){ /* 兩字串的比較 */ char string1[30], string2[30]; int difference, size; printf("請輸入第一個字串: "); gets(string1); printf("請輸入第二個字串: "); gets(string2); printf("請輸入要比較的字元數: "); scanf("%d", &size); printf("執行strnicmp比較的動作...\n\n"); difference = strnicmp(string1, string2, size); switch (difference){ case 0: printf("%s 與 %s 是相同的\n", string1, string2); break; case 1: printf("%s 大於 %s\n", string1, string2); break; case -1: printf("%s 小於 %s\n", string1, string2); break; } } /* ex10-4L.c */ main(){ char string[30], ch, *ptr; printf("請輸入一字串: "); gets(string); printf("請輸入欲搜尋的字元: "); ch = getche(); printf("搜尋中...\n\n"); ptr = strchr(string, ch); printf("字串的第一個字元的位址是: %x\n", string); printf("字元%c在字串%s的位址是: %x\n", ch, string, ptr); } /* ex10-4m.c */ main(){ char string[30], ch, *ptr; printf("請輸入一字串: "); gets(string); printf("請輸入欲搜尋的字元: "); ch = getche(); printf("搜尋中...\n\n"); ptr = strrchr(string, ch); printf("字串的第一個字元的位址是: %x\n", string); printf("字元%c在字串%s的位址是: %x\n", ch, string, ptr); } /* ex11-1a.c */ main(){ /* 宣告學生成績的結構型態 */ struct student{ char name[20]; /* 學生姓名 */ int score; /* 學生成績*/ } rec1; /* 定義結構變數rec1 */ struct student rec2; /* 定義結構變數rec2 */ /* 以sizeof()計算結構變數rec1與rec2所佔記憶體空間 */ printf("rec1 結構佔 %d bytes\n", sizeof(rec1)); printf("rec2 結構佔 %d bytes\n", sizeof(rec2)); } /* ex11-1b.c */ main(){ /* 宣告結構triangle的型態,以成員運算子" . "存取結構結構成員*/ struct triangle{ int length, height; /* 三角形的長與高 */ double area; /* 三角形的面積 */ }; struct triangle tri; printf("請輸入三角形的長: "); scanf("%d", &tri.length); /* 以tri.length存取結構成員length */ printf("請輸入三角形的高: "); scanf("%d", &tri.height); /* 以tri.height存取結構成員height */ tri.area = tri.length * tri.height / 2.0; /* 以tri.area存取結構成員area */ printf("三角形的面積為: %.2f\n", tri.area); } /* ex11-1c.c */ main(){ struct order{ char product[20]; /* 產品名稱 */ double price; /* 產品單價 */ int quantity; /* 產品數量 */ }; struct order num1 = {"iPod nano", 6700.0, 20}; /* 以設定方式給予初值 */ struct order num2; double total; total =num1.price * num1.quantity; printf("請輸入產品名稱: "); scanf("%s", num2.product); printf("請輸入產品價格: "); scanf("%lf", &num2.price); printf("請輸入訂購數量: "); scanf("%d", &num2.quantity); /* total產品總價為產品單價乘以產品數量 */ total =num2.price * num2.quantity; printf("\n<< 定單列表 >>\n"); printf("產品名稱: %s\n", num1.product); printf("價格: %.1f\n", num1.price); printf("數量: %d\n", num1.quantity); printf("總共價格: %.1f\n\n", total); printf("產品名稱: %s\n", num2.product); printf("價格: %.1f\n", num2.price); printf("數量: %d\n", num2.quantity); printf("總共價格: %.1f\n", total); } /* ex11-2a.c */ main(){ struct employee{ char id[7]; /* ID號碼 */ char name[20]; /* 員工姓名 */ int salary; /* 所得薪資 */ }; /* 宣告結構變數,並設定其初值 */ struct employee general = {"D62128", "Johnson", 39000}; /* 定義結構指標變數,指向結構變數general的位址 */ struct employee *ptr = &general; /* 使用->運算子取得各結構元素 */ printf("<< 使用->運算子取得各結構元素>>\n"); printf("ID number: %s\n", ptr->id); printf("Employee Name: %s\n", ptr->name); printf("Salary: %d\n\n", ptr->salary); /* 使用(*).運算子取得各結構元素 */ printf("<< 使用(*).運算子取得各結構元素 >>\n"); printf("ID number: %s\n", (*ptr).id); printf("Employee Name: %s\n", (*ptr).name); printf("Salary: %d\n", (*ptr).salary); } /* ex11-2b.c */ struct work { char name[20]; /* 姓名 */ int hours; /* 工作時數 */ int pay; /* 時薪 */ int total_pay; /* 總工資 */ }; void calculate(struct work *); main(){ struct work service; /* 定義結構變數 */ service.pay = 120; printf("請輸入您的姓名: "); gets(service.name); printf("請輸入工作時數: "); scanf("%d", &service.hours); calculate(&service); /* 呼叫calculate()函數,傳送service結構位址 */ printf("您總共的薪資是 $%d\n", service.total_pay); } /* 定義calculate()函數,以結構指標變數接收結構位址 */ void calculate(struct work *ptr) { ptr->total_pay = ptr->hours * ptr->pay; /* 計算總工資 */ } /* ex11-3a.c */ main(){ /* 利用結構陣列存取資料 */ struct student{ int id; char name[10]; double score; }; /* 定義結構陣列,設定其初值 */ struct student classes[5] = { {10811, "John", 88.0}, {10812, "Mary", 82.0}, {10813, "Bob", 76.5}, {10814, "Helen", 91.0}, {10815, "Peter", 61.5} }; int index; printf(" 學生名單如下 \n"); printf(" ------------\n\n"); printf("學號 姓名 分數\n"); /* 使用for迴圈將資料印出 */ for (index = 0; index < 5; index++) printf("%d %-10s %5.1f\n", classes[index].id, classes[index].name, classes[index].score); } /* ex11-3b.c */ struct student { int id; char name[10]; double score; }; struct student classes[10]; int index=0; void create(); /* create()函數的原型定義 */ void list(); /* list()函數的原型定義 */ main(){ char option; do{ printf("\n1 => create student data\n"); printf("2 => list student data\n"); printf("3 => quit\n"); printf("Please enter your choice: "); option = getche(); /* 輸入選項 */ puts(""); /* 跳行 */ switch (option){ /* 選項1呼叫create()函數做新增工作 */ case '1': create(); break; /* 選項2呼叫list()函數做列印工作 */ case '2': list(); break; case '3': printf("Bye bye!!\n"); break; default : printf("Option error!!\n"); } } while (option != '3'); /* 選擇為3則跳出迴圈 */ } /* 定義 create()函數 */ void create(){ if (index >= 10) { printf("The array is full\n"); return; } printf("\n<< Creating student data >>\n"); printf("Student ID: "); scanf("%d", &classes[index].id); while (getchar()!='\n') continue; printf("Student name: "); scanf("%s", classes[index].name); printf("Student score: "); scanf("%lf", &classes[index].score); index++; } /* 定義list()函數 */ void list(){ int i; printf("\n<< Listing student data >>\n"); /* 利用for迴圈將結構陣列中的資料一一列出 */ for (i = 0; i < index; i++) printf("%-10d %-10s %5.1f\n", classes[i].id, classes[i].name, classes[i].score); } /* ex11-4a.c */ main(){ /* 宣告結構型態 */ struct student{ char name[20]; int score; }; struct student *ptr; /* 定義結構指標ptr */ /* 使用malloc()函數配置記憶體 */ ptr = (struct student *) malloc(sizeof(struct student)); printf("請輸入學生的姓名: "); gets(ptr->name); printf("請輸入學生的成績: "); scanf("%d", &ptr->score); printf("\n學生的姓名是 %s\n", ptr->name); printf("成績為 %d\n", ptr->score); } /* ex11-4b.c */ main(){ /* 宣告結構型態 */ struct node{ char name[20]; int score; struct node *next; }; struct node *ptr1, *ptr2, *ptr3, *current; /* 使用malloc函數配置記憶體 */ ptr1 = (struct node *) malloc(sizeof(struct node)); printf("請輸入ptr1節點的姓名: "); scanf("%s", ptr1->name); printf("請輸入ptr1節點的分數: "); scanf("%d", &ptr1->score); ptr2 = (struct node *) malloc(sizeof(struct node)); printf("\n請輸入ptr2節點的姓名: "); scanf("%s", ptr2->name); printf("請輸入ptr2節點的分數: "); scanf("%d", &ptr2->score); ptr1->next = ptr2; /* 將 ptr1 的 next 指標指向 ptr2 */ ptr3 = (struct node *) malloc(sizeof(struct node)); printf("\n請輸入ptr3節點的姓名: "); scanf("%s", ptr3->name); printf("請輸入ptr3節點的分數: "); scanf("%d", &ptr3->score); ptr3->next = NULL; /* ptr3 的 next 指標設為NULL */ ptr2->next = ptr3; /* 將 ptr2 的 next 指標指向 ptr3 */ current = ptr1; printf("\n\n縺結串列的資料如下:\n"); while (current != NULL){ printf("%10s ", current->name); printf("%5d\n", current->score); current = current->next; } } /* ex11-4c.c */ void insert(); void list(); struct student { int id; /* ID號碼 */ char name[10]; /* 學生姓名 */ double score; /* 學生分數 */ struct student *next; /* 指向下一個鏈結 */ }; /* 定義結構指標,head指向第一個鏈結 */ struct student *head, *ptr; main(){ char option; head = (struct student *) malloc(sizeof(struct student)); head -> next = NULL; /* head指向的節點不存任何資料 */ do{ /* 使用選項讓使用者選擇新增、列印或結束 */ printf("\n1 => 新增一節點\n"); printf("2 => 列印串列的所有節點\n"); printf("3 => 結束\n"); printf("請選擇一項目: "); option = getche(); /* 輸入選項 */ puts(""); /* 跳行 */ switch (option){ case '1': insert(); break; case '2': list(); break; case '3': printf("Bye bye!!"); break; default : printf("Option error!!\n"); } } while (option != '3'); /* 選擇為3則跳出迴圈 */ } /* 定義insert(),此函數不接受任何參數,且不傳回任何值 */ /* 新增一筆資料於鏈結串列的前端 */ void insert(){ /* 以malloc()函數配置記憶體 */ ptr = (struct student *) malloc(sizeof(struct student)); printf("\n<< Creating student data >>\n"); printf("Student ID : "); scanf("%d", &ptr->id); printf("Student name : "); scanf("%s", ptr->name); printf("Student score : "); scanf("%lf", &ptr->score); /* 加入前端的步驟 */ ptr->next = head->next; head->next = ptr; } /* 定義list(),此函數不接受任何參數,且不傳回任何值 */ /* 列印資料於螢幕 */ void list(){ struct student *current; if (head->next == NULL) printf("The linked list is empty\n"); else{ current = head->next; /* 將node指向head */ printf("\n<< Listing student data >>\n"); while (current != NULL) /* 列印資料直到current為空指標 */{ printf("%-10d %-10s %-10.2f\n", current->id, current->name, current->score); current = current->next; } } } /* ex11-4d.c */ void insert(); void del(); void list(); struct student { int id; /* ID號碼 */ char name[10]; /* 學生姓名 */ double score; /* 學生分數 */ struct student *next; /* 指向下一個鏈結 */ }; /* 定義結構指標,head指向第一個鏈結 */ struct student *head, *ptr; main(){ char option; head = (struct student *) malloc(sizeof(struct student)); head -> next = NULL; /* head指向的節點不存任何資料 */ do{ /* 使用選項讓使用者選擇新增、刪除、列印或結束 */ printf("\n1 => 新增一節點\n"); printf("2 => 刪除一節點\n"); printf("3 => 列印串列的所有節點\n"); printf("4 => 結束\n"); printf("請選擇一項目: "); option = getche(); /* 輸入選項 */ puts(""); /* 跳行 */ switch (option){ case '1': insert(); break; case '2': del(); break; case '3': list(); break; case '4': printf("Bye bye!!\n"); break; default : printf("Option error!!\n"); } } while (option != '4'); /* 選擇為3則跳出迴圈 */ } /* 定義insert(),此函數不接受任何參數,且不傳回任何值 */ /* 新增一筆資料於鏈結串列的前端 */ void insert(){ /* 以malloc()函數配置記憶體 */ ptr = (struct student *) malloc(sizeof(struct student)); printf("\n<< Insert a student data >>\n"); printf("Student ID : "); scanf("%d", &ptr->id); printf("Student name : "); scanf("%s", ptr->name); printf("Student score : "); scanf("%lf", &ptr->score); ptr->next = head->next; head->next = ptr; } /* 定義del(),此函數不接受任何參數,且不傳回任何值 */ /* 刪除鏈結串列前端資料 */ void del(){ struct student *current; current = head->next ; /* 判斷鏈結串列是不是空的 */ if (current == NULL) printf("The linked list is empty !!!\n"); else{ head->next = current->next; /*利用這一敘述將前端的節點除 */ printf("\n<< Delete a student data >>\n"); printf("%-10d %-10s %-10.2f\n", current->id, current->name, current->score); free(current); } } /* 定義list(),此函數不接受任何參數,且不傳回任何值 */ /* 列印資料於螢幕 */ void list(){ struct student *current; if (head->next == NULL) printf("No data\n"); else{ current = head->next; /* 將node指向head */ printf("\n<< Listing student data >>\n"); while (current != NULL){ /* 列印資料直到current為空指標 */ printf("%-10d %-10s %-10.2f\n", current->id, current->name, current->score); current = current->next; } } } /* ex12-2-1a.c */ main(){ /* 開啟一檔案,將其內容輸出至螢幕 */ FILE *fptr; /* 宣告檔案結構指標 */ char ch; /* 步驟一: 開啟檔案為讀取型態 */ fptr = fopen("c:\\cfile.dat", "w"); /* 步驟二: 呼叫檔案字元輸出函數fputc() */ printf("請輸入一行字元:\n"); while ((ch = getchar()) != '\n') fputc(ch, fptr); /* 步驟三: 關閉檔案 */ fclose(fptr); } /* ex12-2-1b.c */ main(){ /* 開啟一檔案,將其內容輸出至螢幕 */ FILE *fptr; /* 宣告檔案結構指標 */ char input; /* 開啟檔案為讀取型態 */ if ((fptr = fopen("c:\\cfile.dat", "r")) == NULL) { puts("cfile.dat檔案無法開啟!"); exit(1); } /* 呼叫檔案字元輸入函數fgetc() */ while ((input = fgetc(fptr)) != EOF) putchar(input); fclose(fptr); /* 關閉檔案 */ } /* ex12-2-2a.c */ main(){ /* 將使用者輸入之文章寫入至檔案 */ FILE *fptr; /* input[81]表示一行最多可輸入80個字元(不包含空字元) */ char input[81], filename[20]; printf("請輸入欲寫入的檔名: "); gets(filename); fptr = fopen(filename, "w"); /* 開啟檔案 */ puts("請輸入字串,當字串為 quit 表示結束:\n"); /* 以行為單位,利用gets()輸入字串 */ while (strcmp(gets(input), "quit") != 0){ fputs(input, fptr); /* 利用fputs()將字串輸出至檔案 */ fputc('\n', fptr); /* 輸出跳行字元至檔案中 */ } fclose(fptr); } /* ex12-2-2b.c */ main(){ /* 使用fgets()讀取檔案中的字串後輸出 */ FILE *fptr; char str[81], filename[20]; printf("請輸入欲讀取的檔名: "); gets(filename); if ((fptr = fopen(filename, "r")) == NULL) /* 開啟檔案 */{ printf("%s 無法開啟!!!\n", filename); exit(1); } while (fgets(str, 81, fptr) != NULL) /*使用fgets()讀取字串*/ printf("%s", str); /* 輸出字串 */ fclose(fptr); /* 關閉檔案 */ } /* ex12-2-3a.c */ main(){ /* 將使用者輸入的資料儲存至檔案中 */ FILE *fptr; char no[10], filename[20], answer; int score_c, score_j; printf("請輸入欲寫入的檔名: "); gets(filename); /* 鍵入輸出檔名 */ fptr = fopen(filename, "w"); /* 開啟檔案 */ do{ /* 輸入各項資料 */ printf("輸入學號: "); scanf("%s", no); printf("輸入 C 語言的成績: "); scanf("%d", &score_c); printf("輸入 JAVA 語言的成績:"); scanf("%d", &score_j); /* 利用fprintf()將資料寫入指定的檔案中 */ fprintf(fptr, "%s %d %d\n", no, score_c, score_j); /* 詢問是否輸入下一筆 */ do{ printf("繼續輸入否 (Y/N)? "); answer = getche(); printf("\n\n"); } while (toupper(answer) != 'Y' && toupper(answer) != 'N'); } while (toupper(answer) == 'Y'); fclose(fptr); } /* ex12-2-3b.c */ main(){ /* 計算、輸出學生成績 */ FILE *fptr; char no[10], filename[20]; int score_c, score_j, total_c = 0, total_j = 0, ctr = 0; double avg_c, avg_j; printf("請輸入讀取的檔名: "); gets(filename); if ((fptr = fopen(filename, "r")) == NULL) /* 開啟檔案 */{ printf("%s 無法開啟!!!", filename); exit(1); } puts("=================="); puts("ID C JAVA"); puts("=================="); /* 使用fscanf()讀取檔案資料,EOF判斷檔案是否結束 */ while (fscanf(fptr, "%s %d %d", no, &score_c, &score_j) != EOF){ printf("%-6s %3d %3d\n", no, score_c, score_j); total_c += score_c; total_j += score_j; ctr++; } puts("=================="); /* 計算平均值,使用(double)轉型使計算結果為double型態 */ avg_c = (double) total_c / ctr; avg_j = (double) total_j / ctr; printf("C 語言的平均分數是: %.1f\n", avg_c); printf("JAVA 語言的平均分數是: %.1f\n", avg_j); fclose(fptr); } /* ex12-2-4a.c */ main(){ FILE *fptr; /* 利用fwrite()將結構陣列寫入檔案 */ struct test { char name[10]; int c_score; }; /* 定義結構陣列 */ struct test student[3] = { {"Bright", 97}, {"Linda", 96}, {"Jennifer ", 92} }; /* 以二進位模式開啟檔案 */ fptr = fopen("c:\\dfile2.dat", "w"); /* 將結構資料寫入檔案,一次寫入三筆 */ fwrite(student, sizeof(struct test), 3, fptr); printf("資料已被寫入到 C:\dfile2.dat\n"); fclose(fptr); /* 關閉檔案 */ } /* ex12-2-4b.c */ main(){ /* 利用fread()讀取檔案中的結構陣列 */ struct test { /* 宣告test結構型態 */ char name[10]; int c_score; }; struct test student[3]; /* 定義test結構陣列 */ FILE *fptr; int i; if ((fptr = fopen("c:\\dfile2.dat", "r")) == NULL) /* 開啟檔案 */{ puts("dfile2.dat無法開啟!!!"); exit(1); } fread(student, sizeof(struct test), 3, fptr); /* 從檔案中讀取資料 */ printf("學生的分數如下:\n"); printf("----------------\n"); for (i = 0; i < 3; i++) /* 輸出讀取結果 */ printf("%-10s %5d\n", student[i].name, student[i].c_score); fclose(fptr); } /* ex12-3-1a.c */ main(){ /* 開啟一檔案,將其內容輸出至螢幕 */ FILE *fptr; /* 宣告檔案結構指標 */ char ch; /* 開啟檔案為讀取型態 */ if ((fptr = fopen("c:\\cfile.dat", "w")) == NULL) { puts("File open failed!"); exit(1); } /* 呼叫檔案字元輸出函數fputc() */ while ((ch = getchar()) != '\n') fputc(ch, fptr); fclose(fptr); /* 關閉檔案 */ } /* ex12-3-1b.c */ main(){ /* 開啟一檔案,將其內容輸出至螢幕 */ FILE *fptr; /* 宣告檔案結構指標 */ char input; /* 開啟檔案為讀取型態 */ if ((fptr = fopen("c:\\cfile.dat", "r")) == NULL) { puts("File open failed!"); exit(1); } /* 呼叫檔案字元輸入函數fgetc() */ while ((input = fgetc(fptr)) != EOF) putchar(input); fclose(fptr); } /* ex12-3-1c.c */ main(){ /* 將使用者輸入之文章輸出至檔案中 */ FILE *fptr; /* 定義檔案結構指標 */ /* input[81]表示一行最多可輸入80個字元(不包含空字元) */ char input[81], filename[20]; int i; printf("Enter "); gets(filename); fptr = fopen(filename, "w"); /* 開啟檔案為寫入型態 */ puts("Enter an article(enter \"\" to exit):"); /* 以行為單位,利用gets()函數來達到使用者輸入的目的 */ /* 當輸入則結束輸入 */ while (strcmp(gets(input), "") != 0) for (i = 0; i < 80; i++) { /* 當輸入為空字元,則將'\n'寫入檔案 */ if (input[i] == '\0'){ fputc('\n', fptr); /* 將'\n'寫入檔案 */ break; } fputc(input[i], fptr); /* 將input[i]寫入檔案 */ } fclose(fptr); } /* ex12-3-3b.c */ main(){ /* 計算、輸出學生成績 */ FILE *fptr; char no[10], filename[20]; int score_c, score_j, total_c = 0, total_j = 0, ctr = 0; double avg_c, avg_j; printf("Enter input filename: "); gets(filename); if ((fptr = fopen(filename, "r")) == NULL) /* 開啟檔案 */{ puts("File open failed!"); exit(1); } puts("=================="); puts("ID C JAVA"); puts("=================="); /* 使用fscanf()函數讀取檔案資料,EOF判斷檔案是否結束 */ while (fscanf(fptr, "%s %d %d", no, &score_c, &score_j) != EOF){ printf("%-6s %3d %3d\n", no, score_c, score_j); total_c += score_c; total_j += score_j; ctr++; } puts("=================="); /* 計算平均值,使用(float)轉型使計算結果為double型態 */ avg_c = (double) total_c / ctr; avg_j = (double) total_j / ctr; printf("Average C : %.1f\n", avg_c); printf("Average JAVA: %.1f\n", avg_j); fclose(fptr); } /* ex12-3-3b.c */ main(){ /* 將使用者輸入的資料儲存至檔案中 */ FILE *fptr; char no[10], filename[20], answer; int score_c, score_j; printf("Enter output filename: "); gets(filename); /* 鍵入輸出檔名 */ fptr = fopen(filename, "w"); /* 開啟檔案 */ do{ /* 輸入各項資料 */ printf("Enter Student NO: "); scanf("%s", no); printf("Enter C language score: "); scanf("%d", &score_c); printf("Enter JAVA language score: "); scanf("%d", &score_j); /* 利用fprintf()將資料寫入指定的檔案中 */ fprintf(fptr, "%s %d %d\n", no, score_c, score_j); /* 詢問是否輸入下一筆 */ do{ printf("Enter next (Y/N)? "); answer = getche(); printf("\n"); } while (toupper(answer) != 'Y' && toupper(answer) != 'N'); } while (toupper(answer) == 'Y'); fclose(fptr); } /* ex12-3-4a.c */ main(){ /* 利用fwrite()函數將結構陣列寫入檔案 */ struct test { char name[10]; int c_score; }; /* 定義結構陣列 */ struct test student[3] = { {"Bright", 97}, {"Linda", 96}, {"Jennifer", 92}}; FILE *fptr; fptr = fopen("c:\\dfile2.dat", "wb"); /* 以二進位模式開啟檔案 */ fwrite(student, sizeof(struct test), 3, fptr); /* 將結構寫入檔案 */ printf("資料已被寫入到 C:\dfile2.dat\n"); fclose(fptr); getch(); } /* ex12-3-4b.c */ main(){ /* 利用fread()函數讀取檔案中的結構陣列 */ struct test { /* 宣告test結構型態 */ char name[10]; int c_score; }; struct test student[3]; /* 定義test結構陣列 */ FILE *fptr; int i; if ((fptr = fopen("c:\\dfile2.dat", "rb")) == NULL) /* 開啟檔案 */{ puts("File open failed!"); exit(1); } fread(student, sizeof(struct test), 3, fptr); /* 從檔案中讀取資料 */ for (i = 0; i < 3; i++) /* 輸出讀取結果 */ printf("%-10s %5d\n", student[i].name, student[i].c_score); fclose(fptr); getch(); } /* ex12-3-4c.c */ main(){ /* 利用fread()函數讀取檔案中的結構陣列 */ struct test { /* 宣告test結構型態 */ int var1; char var2; double var3; char var4[10]; }; struct test strus[2]; /* 定義test結構陣列 */ FILE *fptr; int i; if ((fptr = fopen("c:\\dfile2.dat", "rb")) == NULL) /* 開啟檔案 */{ puts("File open failed!"); exit(1); } fread(strus, sizeof(struct test), 2, fptr); /* 從檔案中讀取資料 */ for (i = 0; i < 2; i++) /* 輸出讀取結果 */ printf("%d %c %.2f %s\n", strus[i].var1,strus[i].var2, strus[i].var3, strus[i].var4); fclose(fptr); /* 關閉檔案 */ } /* ex12-3-4d.c */ main(){ /* 載入舊檔,要求輸入新的資料後儲存檔案 */ /* 宣告student結構型態 */ struct student { char no[10]; char name[20]; int score_c; int score_j; }; struct student data[30]; /* 定義結構陣列 */ FILE *fptr; char filename[20], answer = 'Y'; int i, ctr = 0; /* 鍵入輸入檔名,若為skip表示放棄載入檔案 */ printf("Enter input filename(enter \"skip\" to ignore): "); gets(filename); /* 當檔名不是skip,以二進位模式開啟輸入檔 */ if (stricmp(filename, "skip") != 0){ if ((fptr = fopen(filename, "rb")) == NULL){ puts("File open failed!"); exit(1); } /* 以fread()讀取檔案資料,ctr會接收讀取筆數 */ ctr = fread(data, sizeof(struct student), 30, fptr); printf("%s file has %d data\n", filename, ctr); for (i = 0; i< ctr; i++) printf("%s %s %d %d\n", data[i].no, data[i].name, data[i].score_c, data[i].score_j); fclose(fptr); /* 關閉輸入檔 */ } do{ if (ctr >= 30) /* 當資料筆數≧30,將不再要求輸入資料 */{ puts("Data space full!"); break; } /* 輸入結構中各元素值 */ printf("Enter student NO: "); scanf("%s", data[ctr].no); printf("Enter student name: "); scanf("%s", data[ctr].name); printf("Enter C language score: "); scanf("%d", &data[ctr].score_c); printf("Enter JAVA language score: "); scanf("%d", &data[ctr].score_j); ctr++; /* 詢問是否輸入下一筆 */ do{ printf("Enter next (Y/N)? "); answer = getche(); printf("\n"); } while ((answer = toupper(answer)) != 'Y' && answer != 'N'); } while (answer == 'Y'); /* 鍵入輸出檔名 */ printf("Enter output filename: "); scanf("%s", filename); /* 以二進位模式開啟輸出檔 */ fptr = fopen(filename, "wb"); /* 使用fwrite()將資料寫入檔案 */ fwrite(data, sizeof(struct student), ctr, fptr); fclose(fptr); /* 關閉輸出檔 */ } /* ex12-3-5a.c */ main(){ /* 隨機讀取檔案中的記錄 */ /* 定義student結構 */ struct test { char name[10]; int c_score; }; struct test student; FILE *fptr; int record, count=0; long offset; if ((fptr = fopen("c:\\dfile2.dat", "rb")) == NULL) /* 開啟檔案 */{ puts("File open failed!"); exit(1); } printf("Size of struct test is %d\n", sizeof(struct test)); while (fread(&student, sizeof(struct test), 1, fptr) == 1) count++; printf("c:\\dfile2.dat has %d record(s)\n", count); for ( ; ; ) /* 無窮迴圈 */{ printf("\nEnter record number to list (enter 0 to exit): "); scanf("%d", &record); /* 輸入查看哪一筆資料 */ if (record == 0) /* 輸入為0會跳出迴圈 */ break; offset = (record - 1) * sizeof(struct test); /* 計算offset */ if (fseek(fptr, offset, 0) != 0 || record > count) /* 位移檔案指標 */{ puts("Data not found!"); continue; } fread(&student, sizeof(struct test), 1, fptr); /* 讀取資料 */ /* 輸出資料 */ printf("Student naem: %s\n", student.name); printf("C language score: %d\n", student.c_score); } fclose(fptr); getch(); } /* ex12-3-6a.c */ main(){ /* 測試fprintf()是否發生錯誤 */ FILE *fptr; int num[5], i; if ((fptr = fopen("test.dat", "w")) == NULL) /* 開啟檔案 */{ puts("File open failed!"); exit(1); } for (i = 0; i < 5; i++){ printf("Enter a number: "); scanf("%d", &num[i]); fprintf(fptr, "%d\n", num[i]); if (ferror(fptr)) /* 若寫入動作發生錯誤,執行perror() */{ perror("Write error"); /* 印出系統錯誤訊息 */ fclose(fptr); exit(2); } } fclose(fptr); } /* ex12-3a.c */ main(){ FILE *fptr; char ch; int ctr = 0; if ((fptr = fopen("c:\\temp\\text.dat", "r")) == NULL) { puts("File c:\\temp\\text.dat not found!"); exit(1); } while ((ch=fgetc(fptr))!= EOF){ printf("%c", ch); ctr++; } printf("以文字檔格式讀取上述資料,共有 %d bytes\n", ctr); fclose(fptr); } /* ex12-3b.c */ main(){ FILE *fptr; int ctr = 0; char ch; if ((fptr = fopen("c:\\temp\\text.dat", "rb")) == NULL) { puts("File c:\\temp\\text.dat not found!"); exit(1); } while ((ch=fgetc(fptr))!= EOF){ printf("%c", ch); ctr++; } printf("以二進位讀取上述資料,共有 %d bytes\n", ctr); fclose(fptr); } /* ex12-3c.c */ main(){ FILE *fptr; int narr[] = {6, 16, 26, 36, 46, 56}; int n, i; fptr = fopen("c:\\temp\\bin.dat", "w"); fwrite(narr, sizeof(narr), 1, fptr); fclose(fptr); if ((fptr = fopen("c:\\temp\\bin.dat", "r")) == NULL) { puts("File c:\\temp\\bin.dat not found!"); exit(1); } while (fread(&n, sizeof(int), 1, fptr) == 1) printf("%d ", n); fclose(fptr); } /* ex12-3d.c */ main(){ FILE *fptr; int narr[] = {6, 16, 26, 36, 46, 56}; int n, i; fptr = fopen("c:\\temp\\bin.dat", "w"); fwrite(narr, sizeof(narr), 1, fptr); fclose(fptr); if ((fptr = fopen("c:\\temp\\bin.dat", "rb")) == NULL){ puts("File c:\\temp\\bin.dat not found!"); exit(1); } while (fread(&n, sizeof(int), 1, fptr) == 1) printf("%d ", n); fclose(fptr); } /* ex12-4a.c */ #include #define BUFFSIZE 512 /* 定義BUFFSIZE大小 */ main(){ char buffer[BUFFSIZE], filename[20]; int handle, ctr; printf("Enter input filename: "); gets(filename); if ((handle = open(filename, O_RDONLY)) == -1) /* 開啟檔案 */{ puts("File open failed!"); exit(1); } /* 利用fread()讀取檔案資料 */ if ((ctr = read(handle, buffer, BUFFSIZE)) == -1){ perror("Read error"); exit(2); } write(1, buffer, ctr); /* 利用write()將資料輸出至螢幕 */ close(handle); } /* ex12-4a.c */ main(){ /* 隨機讀取檔案中的記錄 */ /* 定義student結構 */ struct test{ char name[10]; int c_score; }; struct test student; FILE *fptr; int record, count=0; long offset; if ((fptr = fopen("c:\\dfile2.dat", "rb")) == NULL) /* 開啟檔案 */{ puts("dfile2.dat無法開啟!!!"); exit(1); } while (fread(&student, sizeof(struct test), 1, fptr) == 1) count++; printf("c:\\dfile2.dat 共有 %d 筆資料\n", count); for ( ; ; ) /* 無窮迴圈 */{ printf("請問您要找尋那一筆資料(0 表示結束): "); scanf("%d", &record); /* 輸入查看哪一筆資料 */ if (record == 0) /* 輸入為0會跳出迴圈 */ break; offset = (record - 1) * sizeof(struct test); /* 計算offset */ if (fseek(fptr, offset, 0) != 0 || record > count) /* 位移檔案指標 */{ puts("無此筆資料!"); continue; } fread(&student, sizeof(struct test), 1, fptr); /* 讀取資料 */ /* 輸出資料 */ printf("\n"); printf("姓名: %s\n", student.name); printf("C 語言分數: %d\n", student.c_score); } fclose(fptr); } /* ex13-1-2a.c */ main(){ /* 輸入5個整數,並將其輸出 */ int array[5], i; for (i = 0; i < 5; i++){ printf("請輸入第 %d 個元素的資料: ", i+1); scanf("%d", &array[i]); } printf("\n此陣列計有下列資料: \n"); for (i = 0; i < 5; i++) printf("array[%d]=%d\n", i, array[i]); } /* ex13-1-2b.c */ #define MAX 5 /* 使用#define定義陣列元素為5個 */ main(){ /* 更改範例13-1-2a */ /* 輸入5個整數,並將其輸出 */ int array[MAX], i; for (i = 0; i < MAX; i++){ printf("請輸入第 %d 個元素的資料: ", i+1); scanf("%d", &array[i]); } printf("\n此陣列計有下列資料: \n"); for (i = 0; i < MAX; i++) printf("array[%d]=%d\n", i, array[i]); } /* ex13-1-2c.c */ #define SQUARE1(n) n*n /* 定義SQUARE1(n) */ #define SQUARE2(n) (n)*(n) /* 定義SQUARE2(n) */ int square(int); /* 定義一函數 */ main(){ int sqrt; sqrt = SQUARE1(6+2); printf("SQUARE1(6+2)=%d\n", sqrt); sqrt = SQUARE2(6+2); printf("SQUARE2(6+2)=%d\n", sqrt); sqrt = square(6+2); printf("square(6+2)=%d\n", sqrt); } int square(n){ return n*n; } /* ex13-1-3a.c */ #define RATE 32.68 #ifndef RATE 32.78 #define RATE 32.78 #endif main(){ double usDollar, ntDollar; printf("請輸入您有多少美金? "); scanf("%lf", &usDollar); ntDollar=usDollar*RATE; printf("您可換 %.2f 的台幣。\n", ntDollar); } /* ex13-2-1a.c */ main(){ char string[10]; int result; printf("請輸入一整數的字串: "); gets(string); result = atoi(string); printf("將字串轉換為整數: %d\n", result); } /* ex13-2-1b.c */ main(){ char string[10]; double result; printf("請輸入一浮點數的字串: "); gets(string); result = atof(string); /* 呼叫atof() */ printf("將字串轉換為浮點數: %.2f\n", result); } /* ex13-2-1c.c */ main(){ /* 使用strtol()函數將字串某一基底數,轉換為長整數 */ char string[20], *endptr; long int final; int base; printf("請輸入一字串: "); scanf("%s", string); printf("基底數是多少? "); scanf("%d", &base); final = strtol(string, &endptr, base); printf("轉換後的結果為: %ld\n", final); printf("endptr指向: %s\n", endptr); } /* ex13-2-2a.c */ main(){ /* 利用abs()取得絕對值 */ int value, result; printf("請輸入一負的整數: "); scanf("%d", &value); result = abs(value); /* 呼叫abs() */ printf("|%d| = %d\n", value, result); } /* ex13-2-2b.c */ main(){ /* 利用exp()計算指數值 */ double value, result; printf("請輸入一浮點數: "); scanf("%lf", &value); result = exp(value); /* 呼叫exp() */ printf("exp(%.2f) = %.2g\n", value, result); } /* ex13-2-2c.c */ main(){ /* 利用sqrt()計算平方根 */ double value, result; printf("請輸入一數值: "); scanf("%lf", &value); result = sqrt(value); /* 呼叫sqrt() */ printf("此數的平方根為: %.5f\n", result); } /* ex13-2-2d.c */ main(){ /* 利用pow()取得某數的n次方值 */ double value, n, result; printf("請輸入一數值: "); scanf("%lf", &value); printf("多少次方: "); scanf("%lf", &n); result = pow(value, n); printf("%.1f 的%.1f次方為: %.2f\n", value, n, result); } /* ex13-2-2e.c */ #define MAX 10 main(){ /* 利用rand()函數來產生亂數 */ int i; puts("<<產生的亂數如下:>>"); for (i = 0; i < MAX; i++) printf("%d\n", rand()); /* 呼叫rand() */ } /* ex13-2-2f.c */ #define MAX 10 #define random(num) (rand() % (num)) main(){ /* 利用random()巨集來產生亂數 */ int i, range; printf("最大的亂數值為: "); scanf("%d", &range); puts("<<產生的亂數如下>>"); for (i = 0; i < MAX; i++) printf("%d\n", random(range) +1); } /* ex13-2-2g.c */ #define MAX 10 main(){ int i, seed; printf("請給一新的數值當種子: "); scanf("%d", &seed); srand(seed); /* 呼叫seed,重新設定亂數種子 */ puts("<<產生的亂數如下>>"); for (i = 0; i < MAX; i++) printf("%d\n", rand()); /* 呼叫rand,印出亂數 */ } /* ex13-2-2h.c */ #define MAX 10 #define random(num) (rand() % (num)) #define randomize() srand((unsigned) time(NULL)) main(){ int i, range; printf("最大的亂數值為: "); scanf("%d", &range); /* 輸入亂數範圍 */ puts("<<產生的亂數如下>>"); randomize(); /* 以randomize()設定亂數種子 */ for (i = 0; i < MAX; i++) printf("%d\n", random(range)+1); } /* ex13-2-3a.c */ main(){ struct tm *ptrnow; time_t loc_now, std_now; time(&loc_now); time(&std_now); ptrnow = localtime(&loc_now); /* 呼叫localtime() */ printf("區域時間: %s", asctime(ptrnow)); ptrnow = gmtime(&std_now); /* 呼叫gmtime() */ printf("標準時間: %s", asctime(ptrnow)); } /* ex13-2-4a.c */ main(){ system("dir/w"); } main(){ struct node{ char *name; int score; struct node *next; }; struct node *p, *q, *r, *head, *current; p=(struct node *) malloc(sizeof(struct node)); p->name = "Peter"; p->score = 90; q=(struct node *) malloc(sizeof(struct node)); q->name = "Nancy"; q->score = 92; r=(struct node *) malloc(sizeof(struct node)); r->name = "Mary"; r->score = 94; p->next = q; q->next = r; r->next = NULL; head = p; current = head; while (current != NULL){ printf("%s %d\n", current->name, current->score); current = current->next; } }