C最新程式語言 ch05: if/switch ch06: loops(for,do,while) ch07: functions ch08: macro ch10: array ch11: string ch12: pointer ch17: file /* Ch01_01.c */ main(){ return 0; /* 程式結束傳回訊息 */ } /* Ch01_02.c */ main(){ printf("C 語言的世界, 你好!!"); /* 利用 printf() 印出一行字 */ } /* Ch01_03.c */ main(){ int x,y; /* 宣告變數 x,y */ x = 123; /* 設定 x 的值為 123 */ y = 2*x+99; /* 運算式相當於 2x+99 */ printf("答案 = %d",y); /* 印出運算結果 */ return 0; /* 傳回程式結束無誤訊息 */ } /* Ch01_04.c */ main(){ int sum,difference; int bignumber, smallnumber; sum = 10; difference = 4; bignumber = (sum + difference)/2; smallnumber = (sum - difference)/2; printf("大數: %d\n",bignumber); printf("小數: %d\n",smallnumber); } /* Ch01_05.c */ /* 程式目的:已經兩個數的和與差, 求出兩個數的值 */ main(){ int sum,difference; /* 宣告變數 sum 為兩數和, difference 為兩數差*/ int bignumber, smallnumber; /* 宣告變數 bignumber 和 */ /* smallnumber, 分別用於存放大數和小數的值 */ sum = 10; /* 指定數值 10 給變數 sum */ difference = 4; /* 指定數值 4 給變數 difference */ bignumber = (sum + difference)/ 2; /* 大數 = (和+差)/2 */ smallnumber = (sum - difference)/2; /* 小數 = (和-差)/2 */ printf("大數: %d\n",bignumber); /* 將大數的值輸出 */ printf("小數: %d\n",smallnumber); /* 將小數的值輸出 */ } /* Ch02_01.c */ #define PI 3.14159 /* 定義圓週率 */ main(){ printf("圓形面積 %f \n",PI*5*5); /* 計算半徑為 5 的圓之面積 */ } /* Ch02_02.c */ #define PI 3.14159 main(){ PI = 3.14; printf("圓形面積 %f \n",PI*5*5); } /* Ch02_03.c */ main(){ printf("char 型別的長度: %d\n",sizeof(char)); printf("int 型別的長度: %d\n",sizeof(int)); printf("float 型別的長度: %d\n",sizeof(float)); printf("double 型別的長度: %d\n",sizeof(double)); } /* Ch02_04.c */ main(){ printf("unsigned short int 的長度: %d\n", sizeof(unsigned short int)); printf("unsigned long int 的長度: %d\n", sizeof(unsigned long int)); printf(" short int 的長度: %d\n", sizeof(short int)); printf(" long int 的長度: %d\n", sizeof(long int)); } /* Ch02_05.c */ main(){ int myage=10; /* 宣告整數變數 myage, 並指定數值為 10*/ int Myage=20; /* 宣告整數變數 Myage, 並指定數值為 20*/ int MyAge=30; /* 宣告整數變數 MyAge, 並指定數值為 30*/ printf("myage= %d\n",myage); printf("Myage= %d\n",Myage); printf("MyAge= %d\n",MyAge); } /* Ch02_06.c */ main(){ int var1=15; /* 宣告整數型別的變數 */ float var2=64.75; /* 宣告浮點數型別的變數 */ char var3='A'; /* 宣告字元型別的變數 */ printf("variable1= %d \n",var1); printf("variable2= %f %e\n",var2,var2); printf("variable3= %c \n",var3); } /* Ch02_07.c */ main(){ const char i=5; i=10; // error printf("%c",i); } /* Ch02_08.c */ main(){ int coffee = 80,tea = 65; /* 宣告整數變數並給予初始值 */ int cup=1; printf("咖啡 %d 杯 %d 元\n",cup,coffee); /* 輸出變數值 */ printf("紅茶 %d 杯 %d 元\n",cup,tea); /* 輸出變數值 */ } /* Ch02_09.c */ main(){ int income,outgo,balance; /* 宣告變數而不給予初始值 */ printf("收入 %d\n",income); /* 將變數值從螢幕輸出 */ printf("支出 %d\n",outgo); printf("結餘 %d\n",balance); } /* Ch02_10.c */ main(){ int coffee = 80; /* 宣告整數變數並給予初始值 */ printf("咖啡原價一杯 %d 元\n",coffee); coffee=100; printf("現在漲價了, 一杯 %d 元\n",coffee); } /* Ch02_11.c */ main(){ int var; /* 宣告一個整數型別的變數 */ /* 利用變數來接 1 加到 10 的總和 */ var = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10; printf("由 1 加到 10 的和等於 %d\n",var); } /* Ch02_12.c */ main(){ int intnum1 = 7; /* 宣告整數變數並給予初始值 7 */ int intnum2 = 3; /* 宣告整數變數並給予初始值 3 */ float answer; /* 宣告整數變數用來接受運算結果值 */ answer = intnum1/ intnum2; /* 算出兩個整數相除的商 */ printf("未轉型別前的商值 = %f\n",answer); /* 算出浮點數(轉型後的整數)與整數相除的商 */ answer = (float)intnum1 / intnum2; printf("轉型別後的商值 = %f\n",answer); } /* Ch02_13.c */ main(){ float f; /* 將變數 f 宣告成 float 型別 */ f = 3/2; /* 此處會得到 f = 1.5 */ printf("%d",(int)f); /* 將 f 轉成整數型別後從螢幕輸出 */ } /* Ch02_14.c */ main(){ char i = 'A'; /* 宣告字元變數 i */ char j = 'z'; /* 宣告字元變數 j */ printf("字元 A 的 ASCII 碼為 %d\n", (int)i); printf("字元 z 的 ASCII 碼為 %d\n", (int)j); } /* Ch02_15.c */ main(){ char i = 65; /* 宣告整數變數 i */ char j = 122; /* 宣告整數變數 j */ printf("數字 %d 相對的字元為 %c\n",i,(char)i); printf("數字 %d 相對的字元為 %c\n",j,(char)j); } /* Ch02_16.c */ main(){ int a,b; /* 宣告兩 int 變數 a, b */ int temp; /* 宣告一暫存整數變數 temp */ a = 10; b = 20; printf("交換前 a = %d b = %d\n",a,b); temp = a; /* 將變數 a 的值傳入變數 temp*/ a = b; /* 把變數 b 的值傳入 a */ b = temp; /* 將變數 temp 中的值傳入 b */ printf("交換後 a = %d b = %d\n",a,b); } /* Ch02_17.c */ main(){ char upper_case = 'S', lower_case; /* 宣告兩個字元變數 */ lower_case = upper_case+32; /* 將大寫字母轉換成小寫字母的算式 */ printf("%c 轉成小寫字母為 %c\n", upper_case, lower_case); } /* Ch03_01.c */ main(){ printf("要印出一行字了 \n"); /* 印出字串並換行 */ printf("會是怎樣的字呢?? \n"); printf("其實也沒甚麼-----\n"); printf("就是.............\n"); printf("哈囉!!! C 語言的世界你好啊!!!\n"); } /* Ch03_02.c */ main(){ int i=10; printf("%d",i); /* 以整數的格式從螢幕輸出 */ printf("\n"); /* 換行 */ printf("%f",i); /* 以浮點數的格式從螢幕輸出 */ } /* Ch03_03.c */ main(){ float j=10.01; printf("%d",j); /* 以整數的格式輸出 */ printf("\n"); /* 換行 */ printf("%f",j); /* 以浮點數的格式輸出 */ } /* Ch03_04.c */ main(){ int i=10; float j=10.01; printf("%d %f", i,j); /* 從螢幕輸出兩個變數值 */ } /* Ch03_05.c */ main(){ int n1=1, n2=2; char nx='x', nz='z'; printf("第 %d 隻羊...\n",n1); /* 從螢幕輸出 n1 的值 */ printf("第 %d 隻羊...\n",n2); printf("第 %c 隻羊...\n",nx); printf("第 %d%c 隻羊...\n",n1,nx); /* 從螢幕輸出 n1, nx 的值 */ printf("第 %d%c 隻羊...\n",n2,nx); printf("第 %c%c%c 隻羊...\n",nx,nx,nx); printf("睡著了...%c %c %c\n",nz,nz,nz); } /* Ch03_06.c */ main(){ int number = 74; printf("數字 %d \n",number); /* %d 為十進位輸出格式 */ printf(" 十進位為 %d\n",number); printf(" 八進位為 %o\n",number); /* %o 為八進位輸出格式 */ printf("十六進位為 %x\n",number); /* %x 為十六進位輸出格式 */ } /* Ch03_07.c */ main(){ float number=45.326; printf("小數點 表示法: %f\n",number); /* 以小數點方式來表示浮點數 */ printf("科學符號表示法: %e\n",number); /* 以科學符號方式來表示浮點數 */ } /* Ch03_08.c */ main(){ int i=10,j=20; printf("%d + %d 的和為 %d\n",i,j,i+j); /* 從螢幕輸出 i+j 的和 */ } /* Ch03_09.c */ main(){ int n=74; float m=7.4; /* 設定輸出時的欄位佔 5 個字元, 多出的部份不補 0 */ printf("寬度= 5, 空位不補 0:%5d \n",n); /* 設定輸出時的欄位佔 10 個字元, 多出的部份補 0 */ printf("寬度=10, 空位 補 0:%5d \n",n); /* 設定輸出整數部份佔 4 個字元, 小數部份 2 個字元 */ /* 多出的部份不補 0 */ printf("整數部份寬度=4, 小數部份寬度 =2:%7.2f\n",m); /* 設定輸出整數部份佔 4 個字元, 小數部份 2 個字元 */ /* 並在空白欄位處補 0 的格式 */ printf("整數部份寬度=4, 小數部份寬度 =2, 空位補 0:%07.2f\n",m); } /* Ch03_10.c */ main(){ int n=74; /* 設定輸出時的欄位佔 5 個字元, 並在數字前加正負號, 空白處補 0 */ printf("寬為 5, 數字前加正號, 補 0 :%+05d \n",n); /* 設定輸出時的欄位佔 5 個字元, 並在數字前加正負號 */ printf("寬為 5, 數字前加正號, 不補 0 :%+05d \n",n); } /* Ch03_11.c */ main(){ int n=74000; printf("設定 3 個字元寬:%3d \n",n); /* 設定 3 個字元寬 */ } /* Ch03_12.c */ main(){ int digit=75; printf("加上 - 符號的格式輸出: %-030d\n",digit); } /* Ch03_13.c */ main(){ int digit=75; printf("用 10 個字元寬, 並加上正負號, \n"); printf("以及 long int 的格式輸出\n"); /* 加上兩個以上的參數格式輸出 */ printf("變數 digit 的值: %+010ld\n",digit); } /* Ch03_14.c */ main(){ int i=10; printf("開始列印下面的字 先換行\n"); /* 特殊字元置於字串後 */ printf("打了一行再換行"); printf("\n"); /* 特殊字元單獨使用 */ printf("也可以這樣\n換行\n"); /* 特殊字元置於字串間 */ printf("輸出數值 %d\n",i); /* 特殊字元配合輸出變數值 */ } /* Ch03_15.c */ main(){ printf("這一行輸出後會有一個字\b被刪掉\n"); printf("這些字看不到 \r因為被刪掉了 \n"); printf("這幾個字後面的字也看不到啦 \0 因為被刪掉了\n"); } /* Ch03_16.c */ main(){ printf("\"這行字被雙引號括住\"\n"); /* 輸出雙引號 */ printf("\'這行字被單引號括住\'\n"); /* 輸出單引號 */ printf("這個符號 \\ 是反斜線\n"); /* 輸出反斜線 */ } /* Ch03_17.c */ main(){ int n = 100; putchar(n); /* 從螢幕輸出變數 n 的值 */ printf ("\n"); /* 換行 */ putchar(100); /* 從螢幕輸出整數常數 100 所對應的字元 */ printf ("\n"); /* 換行 */ putchar('\n'); /* 換行 */ putchar('n'); /* 從螢幕輸出字元 'n' */ } /* Ch03_18.c */ main(){ int i,j; printf("請輸入兩個整數\n"); scanf("%d %d",&i,&j); /* 取得 2 個連著輸入的整數 */ printf("您輸入的 2 個整數是 %d 與 %d\n",i,j); printf("2 個整數的和為 %d\n",i+j); } /* Ch03_19.c */ main(){ int number; printf("請輸入一個整數 \n"); /* 從螢幕輸出提示字串 */ scanf("%d",&number); /* 由鍵盤輸入變數值 */ printf("您輸入的數字是 %d \n",number); /* 從螢幕輸出變數值 */ } /* Ch03_20.c */ main(){ printf("請輸入一個字元 \n"); /* 從螢幕輸出 getchar() 的字元值 */ printf("您輸入的字元是 %c \n",getchar()); } /* Ch03_21.c */ main(){ char character; printf("請輸入字元\n"); /* 用變數來接 getchar() 由鍵盤輸入的字元值 */ character = getchar(); putchar(character); } /* Ch03_22.c */ main(){ char character; printf("請輸入字元\n"); /* 用變數來接 getche() 由鍵盤輸入的字元值 */ character = getche(); printf("\n輸入的字元為 %c\n",character); } /* Ch03_23.c */ main(){ char character; printf("請輸入字元\n"); /* 用變數來接 getch() 由鍵盤輸入的字元值 */ character = getch(); printf("\n輸入的字元為 %c\n",character); } /* Ch03_24.c */ main(){ printf(" * \n"); printf(" *** \n"); printf(" ***** \n"); printf(" ******* \n"); printf(" ***** \n"); printf(" *** \n"); printf(" * \n"); } /* Ch03_25.c */ main(){ int x,y; int answer; printf("f(x,y) = 2x + y\n"); /* 顯示提示字串 */ printf("請輸入 x\n"); scanf("%d",&x); /* 從鍵盤輸入第一個整數值 */ printf("請輸入 y\n"); scanf("%d",&y); /* 從鍵盤輸入第二個整數值 */ answer = 2*x+y; /* 將由鍵盤輸入的數值代入算式運算 */ printf("答案等於 %d\n",answer); } /* Ch03_26.c */ main(){ int i; printf("請輸入一個65~122之間的數字\n"); scanf("%d",&i); printf("對應的字母為 %c\n",i); /* 將數字以字元的輸出格式輸出 */ } /* Ch03_27.c */ main(){ int number; printf("請輸入一個 65 ~ 122 的數字\n"); scanf("%d",&number); printf("對應的字母為 "); putchar(number); /* 會將資料直接轉成字元輸出 */ } /* Ch04_01.c */ main(){ int balance,income=25000,output=3500; balance= income+ -output; /* 結餘等於收入加上支出 */ printf("本月的結餘 %d\n",balance); } /* Ch04_02.c */ main(){ int egg=30, toast=18, ham=35, milk=25; /* 宣告各項商品的單價 */ int total; total=egg*2 +toast*3 +ham/2 +milk*4; /* 總數等於各項商品金額的和 */ printf("總共 %d 元\n",total); // $231 } /* Ch04_03.c */ main(){ float a=7,b=2; int c=7,d=2; printf("兩浮點數相除, 結果為 %f\n",a/b); // 3.5 printf("兩整數 相除, 結果為 %d\n",c/d); // 3 } /* Ch04_04.c */ main(){ int ball,left; int totalball=100; /* 球的總數 100 個 */ ball=7; /* 每次拿掉 7 個球 */ left=totalball %ball; /* 得到兩數相除後的餘數 */ printf("剩下 %d 個球\n",left); } /* Ch04_05.c */ main(){ int fatherage=38,childage=10; printf("結果為 1 表示正確; 結果為 0 表示錯誤\n"); printf("父親年齡 大於  小孩年齡 %d\n", fatherage>childage); printf("父親年齡 小於  小孩年齡 %d\n", fatherage=childage); printf("父親年齡小於或等於小孩年齡 %d\n", fatherage<=childage); } /* Ch04_06.c */ main(){ int a=2,b=2; printf("a+b>a-b && a+ba-b && a+ba-b || a+ba-b || a+b64 && ch<91; /* 大寫字母判斷 */ lowercase = ch>96 && ch<123; /* 小寫字母判斷 */ if (uppercase==1) printf("您輸入的是大寫字母\n"); if (lowercase==1) printf("您輸入的是小寫字母\n"); } /* Ch05_01.c */ main(){ int price,discount; /* price 為售價, discount 是折扣 */ int option; /* 折扣的選項 */ printf("請輸入產品售價\n"); scanf("%d",&price); /* 輸入產品售價 */ printf("是否為打折商品"); printf("(輸入 1 表示是, 其餘數字表示不是) \n"); scanf("%d",&option); /* 選擇是否有折扣 */ if (option==1){ /* 判斷折扣的選項 */ printf("請問打幾折? (請輸入 1~9 的數字)\n"); scanf("%d",&discount); /* 輸入折扣數 */ price=price*discount*0.1; /* 計算打折後的售價 */ } printf("應付 %d 元\n", price); } /* Ch05_02.c */ main(){ int integer; printf("判斷單雙數, 請輸入一個數字\n"); scanf("%d",&integer); /* 判斷 integer 是否可被 2 整除 */ if (integer%2 == 0) /* 為真, 從螢幕輸出是雙數的訊息 */ printf("您輸入的數值是雙數!!\n"); else /* 為假, 從螢幕輸出是單數的訊息 */ printf("您輸入的數值是單數!!\n"); } /* Ch05_03.c */ main(){ int grade; printf("成績分等, 請輸入成績\n"); scanf("%d",&grade); if (grade>=90) /* grade 值大於等於 90 是否為真 */ printf("甲等!!\n"); /* 為真, 輸出結果 */ /* 為假, 再判斷 grade 大於等於 80 是否為真 */ else if (grade>=80) printf("乙等!!\n"); /* 為真, 輸出結果 */ /* 為假, 再判斷 grade 大於等於 70 是否為真 */ else if (grade>=70) printf("丙等!!\n"); /* 為真, 輸出結果 */ /* 為假, 再判斷 grade 大於等於 60 是否為真 */ else if (grade>=60) printf("丁等!!\n"); /* 為真, 輸出結果 */ else printf("戊等!!\n"); /* 為假, 輸出結果 */ } /* Ch05_04.c */ main(){ char man; /* 是否為男生的判斷字元 */ char army; /* 是否役畢的判斷字元 */ char exp; /* 是否有兩年工作經驗的判斷字元 */ printf("請問你是男生嗎? (y/n) "); man=getche(); printf("\n"); if (man=='y'){ /* 判斷是否為男生 */ printf("請問先生是否已服役完畢? (y/n) "); army=getche(); printf("\n"); if (army=='y') /* 判斷是否役畢 */ printf("恭喜, 你的資格符合!!\n"); /* 判斷結果為真 */ else printf("很抱歉, 你的資格不符!!\n"); /* 判斷結果為假 */ }else{ printf("請問小姐有兩年工作經驗嗎? (y/n) "); exp=getche(); printf("\n"); if (exp=='y') /* 判斷是否有兩年工作經驗 */ printf("恭喜, 妳的資格符合!!\n"); /* 判斷結果為真 */ else printf("很抱歉, 妳的資格不符!!\n"); /* 判斷結果為假 */ } } /* Ch05_05.c */ main(){ int areacode; /* 區域號碼 */ printf("請輸入欲查詢區域的區域號碼, 0 可省略(例:以 2 代表 02)\n"); scanf("%d",&areacode); /* 從鍵盤輸入欲查詢的區域號碼 */ switch (areacode){ case 2: /* 區域號碼為 02 的區域 */ printf("台北、基隆\n"); break; case 3: /* 區域號碼為 03 的區域 */ printf("桃園、新竹、宜蘭、花蓮\n"); break; case 37: /* 區域號碼為 037 的區域 */ printf("苗栗\n"); break; case 4: /* 區域號碼為 04 的區域 */ printf("台中、彰化\n"); break; case 49: /* 區域號碼為 049 的區域 */ printf("南投\n"); break; case 5: /* 區域號碼為 05 的區域 */ printf("雲林、嘉義\n"); break; case 6: /* 區域號碼為 06 的區域 */ printf("台南、澎湖\n"); break; case 7: /* 區域號碼為 07 的區域 */ printf("高雄\n"); break; case 8: /* 區域號碼為 08 的區域 */ printf("屏東\n"); break; case 89: /* 區域號碼為 089 的區域 */ printf("台東\n"); break; case 823: /* 區域號碼為 0823 的區域 */ printf("金門\n"); break; case 826: /* 區域號碼為 0826 的區域 */ printf("烏坵\n"); break; case 827: /* 區域號碼為 0827 的區域 */ printf("東沙、南沙\n"); break; case 836: /* 區域號碼為 0836 的區域 */ printf("馬祖\n"); break; default: /* 查無此區域號碼 */ printf("無此區域號碼\n"); } } /* Ch05_06.c */ main(){ int people,ticket; /* people 是票數, ticket 是票價 */ int option; /* 選購票的種類 */ printf("請選購電影票種類:\n"); printf("1.半票(110 元) 2.全票(220 元) 3.軍警學生票(180 元)\n"); scanf("%d",&option); /* 輸入選購電影票的種類 */ printf("購買張數?\n"); scanf("%d",&people); /* 輸入選購的張數 */ switch (option){ case 1: /* 選購半票 */ ticket=110; break; case 2: /* 選購全票 */ ticket=220; break; case 3: /* 選購軍警學生票 */ ticket=180; break; default: ticket=220; } /* 直接從螢幕輸出條件算符的結果 */ printf("票價總共 %d 元\n", ticket=(people>=4)?(ticket*0.8*people):(ticket*people)); } /* Ch05_07.c */ main(){ int i,j,k; printf("判斷是否可為三角形三邊長\n"); printf("請依序輸入三角形三邊長:\n"); scanf("%d %d %d", &i,&j,&k); if ((i+j)>k) /* 判斷第 1,2 邊的和是否大於第 3 邊 */ if ((i+k)>j) /* 判斷第 1,3 邊的和是否大於第 2 邊 */ if ((j+k)>i) /* 判斷第 2,3 邊的和是否大於第 1 邊 */ printf("可以為三角形的三邊長\n"); /* 以上三者均為真 */ else printf("不可以!! 因為(%d+%d)<%d\n",j,k,i); else printf("不可以!! 因為(%d+%d)<%d\n",i,k,j); else printf("不可以!! 因為(%d+%d)<%d\n",i,j,k);; } /* Ch05_08.c */ main(){ char option; /* 輸入選項的變數 */ printf("F. format\n"); printf("C. copy\n"); printf("D. delete\n"); printf("E. exit\n"); printf("Please select one:\n"); scanf("%c",&option); switch (option){ /* 根據變數 option 的值, 決定執行哪一個 case */ case 'F': /* option 等於 'F' 或 'f' */ case 'f': printf("[format...]"); break; case 'C': /* option 等於 'C' 或 'c' */ case 'c': printf("[copy...]"); break; case 'D': /* option 等於 'D' 或 'd' */ case 'd': printf("[delete...]"); break; case 'E': /* option 等於 'E' 或 'e' */ case 'e': printf("[bye-bye!...]"); break; default: /* option 不等於以上各值 */ printf("輸入錯誤\a"); } } /* Ch05_09.c星座??? */ main(){ int month,day; printf("請輸入您的生日\n"); printf("幾月\n"); scanf("%d",&month); printf("幾日\n"); scanf("%d",&day); if (day<0) /* 檢查輸入的日期, 不合理的日期就將月份設為 13, */ month=13; /* 讓後面的程式會輸出錯誤訊息 */ if (month==2 && day>29) /* 2 月不能超過 29 天 */ month=13; else if ((month==4 || month==6 || month==9 || month==11) && day>30) /* 4,6,9,11 月不能超過 30 天 */ month=13; else if (day>31) /* 其它月份不能超過 31 天 */ month=13; switch (month){ /* 以出生月份作為條件變數 */ case 1: /* 生日在一月份 */ if (day < 20) printf("魔羯座\n"); else printf("水瓶座\n"); break; case 2: /* 生日在二月份 */ if (day < 20) printf("水瓶座\n"); else printf("雙魚座\n"); break; case 3: /* 生日在三月份 */ if (day < 21) printf("雙魚座\n"); else printf("白羊座\n"); break; case 4: /* 生日在四月份 */ if (day < 20) printf("白羊座\n"); else printf("金牛座\n"); break; case 5: /* 生日在五月份 */ if (day < 21) printf("金牛座\n"); else printf("雙子座\n"); break; case 6: /* 生日在六月份 */ if (day < 20) printf("雙子座\n"); else printf("巨蟹座\n"); break; case 7: /* 生日在七月份 */ if (day < 22) printf("巨蟹座\n"); else printf("獅子座\n"); break; case 8: /* 生日在八月份 */ if (day < 23) printf("獅子座\n"); else printf("處女座\n"); break; case 9: /* 生日在九月份 */ if (day < 23) printf("處女座\n"); else printf("天枰座\n"); break; case 10: /* 生日在十月份 */ if (day < 23) printf("天枰座\n"); else printf("天蠍座\n"); break; case 11: /* 生日在十一月份 */ if (day < 22) printf("天蠍座\n"); else printf("射手座\n"); break; case 12: /* 生日在十二月份 */ if (day < 22) printf("射手座\n"); else printf("魔羯座\n"); break; default: /* Error */ printf("你是外星人嗎?\n"); } } /* Ch05_10.c */ main(){ int i,j,k, bigger,smaller, max,mid,min; printf("請依序輸入 3 個數字作排序\n"); scanf("%d %d %d",&i,&j,&k); if (i>j){ /* 第一個數與第二個數比較, */ /* 較大者為 bigger, 較小者為 smaller */ bigger = i; smaller = j; }else{ bigger = j; smaller = i; } if (bigger>k){ /* bigger 與第三個數比較 */ max=bigger; /* biger 若比第三個數大, 則為最大值 max */ if (k>smaller){ /* 第三個數再與 smaller 比較 */ mid = k; /* 如第三個數比較大, 則為第二大值 mid, */ min = smaller; /* smaller 為最小值 min */ }else{ mid = smaller; /* 如第三個數比較小, smaller 為最第 */ min = k; /* 二大值 mid, 第三個數為最小值 min */ } }else{ max = k; /* 如 bigger 比第三個數小, */ mid = bigger; /* 則第三個數為最大值 max, */ min = smaller; /* bigger 為次大 mid, smaller 為最小值 min */ } printf("由大到小排列 %d %d %d\n",max,mid,min); } /* Ch05_11.c */ main(){ int cartype,money1,money2,money3,money4,sum=0; char cdplayer,sunroof,autotrans; printf("您想買哪種車? (1)跑車(2)轎車(豪華型)(3)轎車(經濟型)\n"); scanf("%d",&cartype); printf("加裝 CD 音響? (y/n)\n"); cdplayer=getche(); printf("\n"); printf("加裝天窗? (y/n)\n"); sunroof=getche(); printf("\n"); printf("改裝成自動排檔? (y/n)\n"); autotrans=getche(); printf("\n"); switch (cartype){ case 1: money1=800000; /* 第 1 種車子的陽春價 */ money2=(cdplayer=='y')?4000:0; /* 加裝 CD 音響的價錢 */ money3=(sunroof=='y')?5000:0; /* 加裝天窗的價錢 */ money4=(autotrans=='y')?3000:0; /* 改裝成自動排檔的價錢 */ break; case 2: money1=500000; money2=(cdplayer=='y')?3000:0; /* 第 2 種車子的陽春價 */ money3=(sunroof=='y')?2500:0; money4=(autotrans=='y')?1500:0; break; case 3: money1=300000; money2=(cdplayer=='y')?2500:0; /* 第 3 種車子的陽春價 */ money3=(sunroof=='y')?2000:0; money4=(autotrans=='y')?1000:0; break; default:printf("謝謝惠顧!!\n"); } sum=money1+money2+money3+money4; /* 車子及配備總價 */ printf("\n總價 %d 萬 %d 元\n",sum/10000,sum%10000); } /* Ch06_01.c */ main(){ int sum=0,i; /* 宣告總和與迴圈變數 */ for (i=1;i<=100;i++){ /* 跑一百次的 for 迴圈 */ /* 累加 sum 的變數值, 每跑一次迴圈就加一次 i 值 */ sum=sum+i; printf("sum = %d\n",sum); /* 輸出現階段的和 */ } } /* Ch06_02.c */ main(){ int start,end,sum=0; printf("計算累加總和, 請輸入起始值與結束值(需皆為整數)\n"); scanf("%d %d", &start,&end); printf("從 %d 加到 %d 的結果為 ", start,end); while (start<=end){ /* 迴圈的條件算式 */ sum=sum+start; start++; } printf("%d\n",sum); } /* Ch06_03.c */ main(){ int num1,num2; /* 要求最大公因數的兩個數 */ int a,b,c; /* 依次為除數、被除數、餘數 */ printf("請輸入兩個數字\n"); scanf("%d %d",&num1,&num2); c = num1%num2; /* 先計算一次餘數 */ b = num2; /* 以其中一個數為被除數 */ while (c!=0){ /* 計算輾轉相除的迴圈 */ a=b; /* 指定前一次除數為新的被除數 */ b=c; /* 指定前一次餘數為新的除數 */ c=a%b; /* 求出新的餘數 */ } printf("%d 與 %d 的最大公因數是 %d\n", num1,num2,b); } /* Ch06_04.c */ main(){ int i=0; /* 迴圈執行次數 */ char option; /* 選擇字元 */ do{ i++; printf("\n迴圈已經執行 %d 次\n",i); printf("繼續嗎?(y/n)"); option=getche(); } while (option=='y'); /* 迴圈的條件算式 */ printf("\n迴圈總共執行了 %d 次\n", i); } /* Ch06_05.c */ main(){ int sum=0; /* 數值總和 */ int number; /* 每次累加的數值 */ printf("計算累加:\n"); do{ printf("現在累積的數目是 %d\n",sum); printf("請輸入下一個整數數值\n"); scanf("%d",&number); sum=sum+number; }while(number !=0); /* 判斷輸入的數值是否為 0 */ printf("您輸入數值 0, 結束計算\n"); printf("最後累積的數值: %d\n",sum); } /* Ch06_06.c */ main(){ int i,sum=0; /* i 是迴圈變數, sum 是用來計算總和 */ /* 由 1 至 100 每次加 2, 為 1,3,5...的迴圈 */ for (i=1;i<100;i+=2) sum=sum+i; /* 累加計算總合 */ printf("1~100的奇數和等於 %d\n",sum); } /* Ch06_07.c */ main(){ /* i、j 為迴圈變數, n 是多項式項數, sum 是總和 */ int i,j,n,sum=0; printf("計算多項式 (1+2)+(2+4)+(3+6)...+(n+2*n) 的值\n"); printf("請輸入 n 值\n"); scanf("%d",&n); /* 兩個變數的迴圈 */ for (i=1,j=2;i<=n,j<=2*n;i++,j=j+2){ sum=sum+(i+j); /* 計算總和 */ /* 將多項式每一項從螢幕輸出 */ printf("(%d+%d)+",i,j); } printf("\b = %d\n",sum); } /* Ch06_08.c */ main(){ float sum,i; /* sum 是總和, i 是迴圈變數 */ /* 兩個初始算式的迴圈 */ for (sum=0.0,i=0.1;i<1.1;sum+=i,i+=0.1) printf(" %.1f +",i); printf("\b = %.1f\n",sum); } /* Ch06_09.c */ main(){ int i, j; /* 迴圈變數 */ for (i=1;i<10;i++){ /* 控制被乘數的迴圈 */ for (j=1;j<10;j++) /* 控制乘數的迴圈 */ printf(" %d*%d=%2d",i,j,i*j); printf("\n"); } } /* Ch06_10.c */ main(){ while (1) /* 無限迴圈 */ printf("這是一個停不下來的迴圈\n"); } /* Ch06_11.c */ main(){ do{ printf("這是一個停不下來的迴圈\n"); } while (1); /* 無限迴圈條件算式 */ } /* Ch06_12.c */ main(){ int i; for (i=0;;) /* 無限 for 迴圈設定 */ printf("這是一個停不下來的迴圈\n"); } /* Ch06_13.c */ main(){ while (1){ /* 無限迴圈 */ printf("迴圈進行中...\n"); break; /* 跳出一層的迴圈 */ } printf("成功的跳出迴圈了!!\n"); } /* Ch06_14.c */ main(){ int i; for (i=1;i<=10;i++){ /* 由 1 到 10 跑 10 次的迴圈 */ if (i==5) continue; /* 迴圈執行到第 5 輪時,條件算式成立 */ /* 跳脫第 5 輪迴圈, 繼續第 6 輪 */ printf(" %d ",i); } } /* Ch06_15.c 不建議使用goto */ main(){ int i,j,k; /* 3 個迴圈的變數 */ for (i=0;i<100;i++) /* 最外第一層迴圈, 由 0 至 99 跑一百次 */ for (j=0;j<100;j++) /* 中間第二層迴圈, 由 0 至 99 跑一百次 */ for (k=0;k<100;k++){ /* 最內第三層迴圈, 由 0 至 99 跑一百次 */ printf("i= %d,j= %d,k= %d\n",i,j,k); goto endloop; /* 程式流程改執行標籤名 endloop 處 */ } endloop: /* goto 敘述會讓程式流程直接跳到此處繼續執行 */ printf("迴圈被強制跳脫了\n"); } /* Ch06_16.c */ main(){ int i,j; /* 迴圈變數 */ int flag,line=0; /* flag 是輸出旗標, line 是換行用的變數 */ for (i=2;i<=100;i++){ /* 外層迴圈控制被除數 */ flag=0; /* 設定輸出旗標 */ for (j=2;ji;j--) printf(" "); /* 內迴圈 1, 控制輸出空白 */ for (k=0;k<=2*i;k++) printf("*"); /* 內迴圈 2, 控制輸出星號 */ printf("\n"); } } /* Ch06_18.c */ main(){ int i,j; for (i=0;i<7;i++){ /* 控制三角形底為 6 的迴圈 */ for (j=0;j0;i--) /* 累乘的迴圈 */ number=number*i; /* 每次迴圈將 number 乘上目前的 i 值 */ printf("答案: %d\n",number); printf("繼續其他計算嗎?(y/n)\n"); goOn=getche(); /* 讀取輸入的字元, 以供條件算式判斷 */ }while(goOn!=='y'); printf("\n謝謝您的使用\n"); } /* Ch07_01.c */ main(){ /* 儲存 8 個數值的變數 */ int num1, num2, num3, num4, num5, num6, num7, num8; /* 儲存比較過程中, 較大數值的變數 */ int bigger1, bigger2, bigger3, bigger4, secondbig1, secondbig2, biggest; printf("請輸入 8 個數字\n"); scanf("%d %d %d %d %d %d %d %d", &num1, &num2, &num3, &num4, &num5, &num6, &num7, &num8); if (num1>num2) bigger1 = num1; else bigger1 = num2; /* 比較 1,2 個數大小 */ if (num3>num4) bigger2 = num3; else bigger2 = num4; /* 比較 3,4 個數大小 */ if (num5>num6) bigger3 = num5; else bigger3 = num6; /* 比較 5,6 個數大小 */ if (num7>num8) bigger4 = num7; else bigger4 = num8; /* 比較 7,8 個數大小 */ if (bigger1>bigger2) secondbig1 = bigger1; /* 取得 1,2,3,4 個數的最大值 */ else secondbig1 = bigger2; if (bigger3>bigger4) secondbig2 = bigger3; /* 取得 5,6,7,8 個數的最大值 */ else secondbig2 = bigger4; if (secondbig1>secondbig2) biggest = secondbig1; else biggest = secondbig2; /* 取得最大值 */ printf("最大數為 %d\n",biggest); } /* Ch07_02.c */ int compare(int,int); /* 比較 2 個數的大小 */ main(){ /* 儲存 8 個數值的變數 */ int num1,num2,num3,num4,num5,num6,num7,num8; /* 儲存比較過程中, 較大數值的變數 */ int bigger1,bigger2; printf("請輸入 8 個數字\n"); scanf("%d %d %d %d %d %d %d %d", &num1, &num2, &num3, &num4, &num5, &num6, &num7, &num8); /* 比較 num1,num2,num3,num4 中的最大值 */ bigger1=compare(compare(num1,num2),compare(num3,num4)); /* 比較 num5,num6,num7,num8 中的最大值 */ bigger2=compare(compare(num5,num6),compare(num7,num8)); /* 將 8 個數中的最大值, 顯示在螢幕上 */ printf("最大值是 %d\n",compare(bigger1,bigger2)); } /* 定義比較兩個數大小的函式 */ int compare(int cnum1, int cnum2){ if (cnum1>cnum2) return cnum1; else return cnum2; } /* Ch07_03.c */ void printwords(); /* 宣告函式prototype */ main(){ printwords(); /* 呼叫函式 */ } void printwords(){ /* 定義函式 */ printf("這是一個簡單的函式!!"); } /* Ch07_04.c */ int add(int,int); /* 原型宣告計算 2 數總和的函式 */ main(){ int i=3, j=5; /* 第 1、2 個數的值 */ int sum; /* 兩個數的和 */ sum=add(i,j); /* 以 sum 接受 add() 函式的傳回值 */ printf("%d + %d = %d\n",i,j,sum); } int add(int x,int y){ /* 定義算出總和的函式 */ int total; total = x + y; return total; /* 把總和傳回 main() */ } /* Ch07_05.c */ void printresult(float); /* 原型宣告輸出結果的函式 */ main(){ int i,tall; /* i 是性別選項變數, tall是身高 */ float weight; /* 計算出來的標準體重 */ do{ /* 一定要選擇 1 或 2, 否則一直要求選擇男或女 */ printf("性別:(1)男(2)女\n"); scanf("%d",&i); /* 選擇男生或女生 */ } while (i!=1 && i!=2); printf("請輸入身高\n"); scanf("%d",&tall); if (i==1) weight = (tall-80)*0.7; /* 計算男生的體重 */ else weight = (tall-70)*0.6; /* 計算女生的體重 */ /* 呼叫顯示結果在螢幕上的函式 */ printresult(weight); } void printresult(float result){ /* 定義輸出結果的函式 */ printf("您的標準體重是 %f 公斤\n",result); } /* Ch07_06.c */ float stdweight(int,int); /* 體重計算函式 */ main(){ int sex,height; /* i 是性別選項變數, height 是身高 */ float weight; /* 計算結果的體重值 */ do{ /* 一定要選擇 1 或 2, 否則一直要求選擇男或女 */ printf("性別:(1)男(2)女\n"); scanf("%d",&i); /* 選擇男生或女生 */ } while (sex!=1 && sex!=2); printf("請輸入身高\n"); scanf("%d",&height); /* weight 接受 stdweight() 傳回的標準體重值 */ weight = stdweight(sex,height); printf("您的標準體重是 %f 公斤\n", weight); } float stdweight(int s,int h){ /* 標準體重計算函式 */ float result; if (s == 1) result = (h - 80)*0.7; else result = (h - 70)*0.6; return result; } /* Ch07_07.c */ double doublehalf(double); /* 計算數字一半之值 */ int inthalf(double); /* 計算數字一半之值 */ main(){ int i; printf("傳回值的型別為 double\n"); for (i=0; i<5; i++) printf("full=%d half=%f\n",i,doublehalf(i)); /* 印出傳回值型別為 double 時, 數字一半之值 */ printf("傳回值的型別為 int\n"); for (i=0; i<5; i++) printf("full=%d half=%f\n",i,inthalf(i)); /* 印出傳回值型別為 int 時, 數字一半之值 */ } double inthalf(double s){ return s/2; /* 傳回 double 型別的數值 */ } int doublehalf(double s){ return s/2; /* 傳回 int 型別的數值 */ } /* Ch07_08.c */ double area(float r){ /*計算圓型面積, 在 main()之前定義的函式 */ return r*r*3.1415926535; /* 兼具宣告的功用 */ } main(){ float r; printf("請輸入半徑\n"); scanf("%f",&r); printf("圓型面積 = %f cm\n\t", area(r)); /* 將 r 傳入函式 area() */ } /* Ch07_09.c */ main(){ float c; float ctof(float); /* 將攝氏溫度轉華式溫度的函式宣告在此 */ printf("請輸入現在溫度\n"); scanf("%f",&c); printf("現在溫度是 %f 度 C, %f 度 F\n",c, ctof(c)); } float ctof(float c){ /* 轉換溫度的函式 */ return c*9/5 + 32; } /* Ch07_10.c */ void func1(); /* 列印出第 1 個函式的內容 */ void func2(); /* 列印出第 2 個函式的內容 */ void func3(); /* 列印出第 3 個函式的內容 */ main(){ func1(); /* 呼叫第 1 個函式 */ func2(); /* 呼叫第 2 個函式 */ func2(); /* 再次呼叫第 2 個函式 */ func3(); /* 呼叫第 3 個函式 */ } void func1(){ printf("這是第 1 個被呼叫的函式內容\n\n"); } void func2(){ printf("這是第 2 個被呼叫的函式內容\n"); printf("被呼叫兩次所以印了兩行\n\n"); } void func3(){ printf("這是第 3 個被呼叫的函式內容\n\n"); } /* Ch07_11.c */ int power(int, int); /* 宣告計算次方的函式 */ void powerSum(int,int,int); /* 宣告計算次方和的函式 */ main(){ int x,y; printf("計算兩個整數的 2~4 次方和, 請輸入兩個整數\n"); scanf("%d %d",&x,&y); powerSum(x,y,2); /* 計算 x, y 的平方和 */ powerSum(x,y,3); /* 計算 x, y 的 3 次方和 */ powerSum(x,y,4); /* 計算 x, y 的 4 次方和 */ } void powerSum(int x,int y,int r) { /* 計算數值次方和的值 */ int v; v = power(x,r) + power(y,r); printf("%d 與 %d 的 %d 次方和 = %d\n",x,y,r,v); } int power(int value, int r) { /* 計算數值的次方值 */ int w=1; int i; for (i=0; i英磅 */ float LbToKg(int); /* 轉換英磅-->公斤 */ float MeterToFeet(int); /* 轉換公尺-->英呎 */ float FeetToMeter(int); /* 轉換英呎-->公尺 */ main(){ int n = select1(); /* 將選擇值 n 的初值直接設為函式傳回值 */ if (n==1) /* 以選擇值 n 來判斷要呼叫哪一個函式 */ select2(1); else select3(2); } int select1(){ /* 定義選擇轉換哪種度量衡函式 */ int i =3; /* 迴圈變數 */ while (i>2){ printf("1.重量\n"); printf("2.長度\n"); scanf("%d",&i); } return i; } void select2(int x){ /* 定義選擇哪種重量轉換函式 */ int i; /* switch 的條件算式值 */ printf("選擇(1)公斤轉英磅(2)英磅轉公斤\n"); scanf("%d",&i); printf("請輸入數字\n"); scanf("%d",&x); switch (i){ case 1: printf("等於 %f 磅 ",KgToLb(x)); break; case 2: printf("等於 %f 公斤",KgToLb(x)); break; } } void select3(int x){ /* 定義選擇哪種長度轉換函式 */ int i; /* switch 的條件算式值 */ printf("選擇(1)公尺轉英呎(2)英呎轉公尺\n"); scanf("%d",i); printf("請輸入數字\n"); scanf("%d",&x); switch(i){ case 1: printf("等於 %f 英呎",KgToLb(x)); break; case 2: printf("等於 %f 公尺",LbToKg(x)); break; } } float KgToLb(int x){ /* 轉換公斤-->英磅 */ return x/0.454; } float LbToKg(int x){ /* 轉換英磅-->公斤 */ return x*0.454; } float MeterToFeet(int x){ /* 轉換公尺-->英呎 */ return x*0.3048; } float FeetToMeter(int x){ /* 轉換英呎-->公尺 */ return x/0.3048; } /* Ch07_16.c */ int input(int); /* 宣告輸入成績的函式 */ int sum(int); /* 宣告算總和的函式 */ float avg(int,int); /* 宣告算平均的函式 */ void printcomment(float); /* 宣告印出評語的函式 */ main(){ int i; /* 科目數 */ int s; /* 總和 */ float average; /* 平均 */ printf("請輸入你想計算的科目數\n"); scanf("%d",&i); s=sum(i); average = avg(s,i); printf("您的總分是: %d \n",s); printf("您的平均是: %2.2f\n",average); printf("評語: "); printcomment(average); } int input(int j){ /* 定義輸入成績的函式 */ int score; printf("請輸入第 %d 科成績:\n",j); scanf("%d",&score); return score; } int sum(int i){ /* 定義算總和的函式 */ int total = 0; int y, k; for (k=1; k<=i; k++) total = total + input(k); /* 計算輸入成績的總和 */ return total; /* 傳回總和 */ } float avg(int s,int i){ /* 定義算平均的函式 */ float average; average = (float)s/i; /* 計算平均值 */ return average; /* 傳回計算結果 */ } /* 定義印出評語的函式 */ void printcomment(float final){ if (final>= 90) printf("太棒了, 你是資優生\n"); else if (final >= 80) printf("還不錯!!但是還有努力的空間喔!!\n"); else if (final >= 70) printf("還可以!!需要加倍努力!!\n"); else printf("不及格啦!!以後不準看電視!!\n"); } /* Ch07_17.c */ void factor(long,long); main(){ long number,div; printf("請輸入一個欲作因數分解的數字: "); scanf("%d",&number); /* 將輸入的 number 值, 傳入 factor() */ printf("%d = ",number); factor(number,2); } void factor(long num,long div){ if (num==1 || div>num){ /* 程式的終止條件 */ printf("\b"); return; }else{ if (num%div==0){ /* 若可被除數整除 */ printf("%d*",div); /* 則將此因數輸出 */ factor(num/div,div); /* 再呼叫本身 */ }else{ /* 不能再被整除的數, 皆是奇數 */ /* 因此除數依次以 2,3,5,7,9..替換 */ /* 以節省運算時間 */ div = (div==2 ? 3 : div + 2); factor(num,div); /* 再呼叫本身 */ } } } void factor(long num,long div){ // 方法2 if (num==1 || div>num) return; if (num%div==0) { /* 若可被除數整除 */ printf("%d",div); /* 則將此因數輸出 */ num=num/div; if(num>1) printf("* "); } else div = (div==2 ?3 :div+2); factor(num,div); /* 再呼叫本身 */ } /* Ch07_18.c河內塔 */ void hanoi(int,int,int,int); main(){ int i; printf("總共有多少圓盤要搬?\n"); scanf("%d",&i); hanoi(i,1,2,3); } void hanoi(int i,int begin,int mid,int dest){ if (i==1) /* 遞迴終止條件 */ printf("將第 %d 個盤子從第 %d 個塔移到第 %d 個塔\n", i,begin,dest); else{ hanoi(i-1,begin,dest,mid); printf("將第 %d 個盤子從第 %d 個塔移到第 %d 個塔\n", i,begin,dest); hanoi(i-1,mid,begin,dest); } } /* Ch07_19.c */ int fibo(int); /* 宣告 Fibonacci 數列的計算數列 */ main(){ int i; /* fibonacci 數列的項數 */ int value; /* fibonacci 數列 i 項的值 */ printf("請問您想找 Fibonacci 數列的第幾項:\n"); scanf("%d",&i); value = fibo(i); printf("數列第 %d 項的值 = %d\n",i,value); } int fibo(int i){ /* 定義計算 Fibonacci 數列的函式 */ if (i<3) return (1); else return(fibo(i-2) + fibo(i-1)); /* 改變引數值, 再呼叫本身 */ } /* Ch07_20.c */ int list(); /* 宣告列印書本清單函式 */ void change(int); /* 宣告找錢函式 */ main(){ int pay,money,price; int flag=0; while (flag==0){ /* 此迴圈是用來控制 */ /* 輸入金額不正確的情形 */ /* 例如輸入金額比售價低 */ /* 列印書本清單的函式傳回書本價錢 */ price = list(); printf("請輸入付款金額或輸入 0 結束交易\n"); scanf("%d",&pay); if (pay==0){ /* 輸入金額 0 可以結束交易 */ printf("謝謝惠顧!!\n"); return 0; /* 將程式中止 */ }else if (pay>price){ money = pay - price; /* 付款金額 - 售價 = 零錢 */ flag = 1; } else printf("您的金額不足\n"); } change(money); /* 呼叫找錢函式 */ } int list(){ /* 定義列印書本清單函式 */ int i; while (1){ /* 此迴圈會在選擇非清單商品時重複執行 */ printf("書本目錄:\n"); printf("1.西遊記 290 元\n"); printf("2.紅樓夢 250 元\n"); printf("3.水滸傳 280 元\n"); printf("4.三國演義 230 元\n"); printf("5.老殘遊記 220 元\n"); printf("請選擇您想購買的書:\n"); scanf("%d",&i); if (i>5 || i<1) /* 列出錯誤訊息後, 重新選擇 */ printf("沒這樣商品!!!\n\n"); else{ switch (i){ /* 決定傳回 main() 的值 */ case 1: return 290; case 2: return 250; case 3: return 280; case 4: return 230; case 5: return 220; } } } } void change(int money){ /* 定義找錢函式 */ int ten,five,one; /* 計算零錢的拾圓銅板數 */ ten = (money - money%10); /* 計算零錢的伍圓銅板數 */ five = (money - ten) - ((money - ten)%5); /* 計算零錢的壹圓銅板數 */ one = (money - ten)%5; printf("找您 %d 元\n",money); printf("拾圓 %d 個\n 五圓 %d 個\n 壹圓 %d 個\n", ten/10, five/5, one); } /* Ch08_01.c */ #define CUBE x*x*x /* 定義立方值為 x 連乘 3 次 */ main(){ int x; /* 宣告求立方值的未知數 */ printf("計算未知數的立方值, 請輸入未知數的數值\n"); scanf("%d",&x); printf("%d 的立方值為 %d\n",x,CUBE); /* 計算立方值, 並將結果輸出 */ } /* Ch08_02.c */ #define G 6.672e-11 #define FG (G*mass1*mass2)/(distance*distance) /* 定義萬有引力公式為巨集 */ main(){ float mass1,mass2; /* 兩物質的質量變數 */ float distance; /* 兩物質間的距離 */ int flag=0; /* 迴圈判斷變數 */ do{ printf("請輸入兩物質的質量:\n"); printf("輸入第 1 個物質的質量(kg)\n"); scanf("%f",&mass1); printf("輸入第 2 個物質的質量(kg)\n"); scanf("%f",&mass2); printf("輸入兩物質間的距離(m)\n"); scanf("%f",&distance); if (mass1<0 || mass2<0 || distance<0) /* 判斷輸入值不得為負 */ printf("輸入數值錯誤!!\n"); else{ printf("萬有引力為 %3.2e\n",FG); /* 輸出巨集計算結果 */ flag=1; /* 滿足跳出迴圈的條件 */ } /* 當輸入條件不正確時, 迴圈會要求重新輸入, 直到數值正確為止 */ }while(flag!=1); } /* Ch08_03.c */ #define F(C) C*9/5+32 /* 定義攝氏轉華式公式的巨集 */ #define C(F) (F-32)*5/9 /* 定義華式轉攝氏公式的巨集 */ main(){ int option; /* 功能選擇變數 */ float temp; /* 溫度 */ do{ printf("溫度度量衡轉換, 請選擇(1)攝氏轉華式(2)華式轉攝氏\n"); scanf("%d",&option); printf("請輸入溫度\n"); scanf("%f",&temp); if (option==1) /* 選擇 C->F 的計算 */ printf("%5.2f 度 C 等於 %5.2f 度 F\n",temp,F(temp)); else if (option==2) /* 選擇 F->C 的計算 */ printf("%5.2f 度 F 等於 %5.2f 度 C\n",temp,C(temp)); else /* 排除錯誤選擇 */ printf("選擇錯誤, 請重新選擇\n"); }while(option!=1 && option!=2); } /* Ch08_04.c */ #define BMI(weight,height) weight/(height*height) /* 定義 BMI 公式成巨集 */ #define THIN(BMI) BMI<20 /* 定義 BMI 值的判斷式 */ #define IDEAL(BMI) BMI>=19&&BMI<26 #define DANGEROUS(BMI) BMI>=26&&BMI<30 main(){ float kg,cm,b; /* kg 為體重, cm 為身高, b 為體格指數 */ do{ printf("計算體格指數 BMI\n"); printf("請輸入體重 (kg)\n"); scanf("%f",&kg); printf("請輸入身高 (cm)\n"); scanf("%f",&cm); if (kg>300 || kg<20) /* 排除輸入錯誤的體重值 */ printf("體重輸入錯誤, 請重新輸入\n"); if (cm>300 || cm<100) /* 排除輸入錯誤的身高值 */ printf("身高輸入錯誤, 請重新輸入\n"); }while(kg>300 || kg<20 || cm>300 || cm<100); /* 控制重新輸入的迴圈 */ cm=cm/100; /* 將公分轉換成公尺 */ b=BMI(kg,cm); /* 使用計算 BMI 值的巨集 */ printf("您的體格指數 BMI 是 %5.2f\n\n",b); if (THIN(b)) /* 判斷 BMI 值 */ printf("您體重不足, 請努力吃胖點\n"); else if (IDEAL(b)) printf("您的體格很標準!!\n"); else if (DANGEROUS(b)) printf("有點胖, 該減肥了!!\n"); else printf("過胖了!!過胖了!!請小心身體!!\n"); } /* Ch08_05.c */ #define F(x,y) x*x+y*y /* 定義兩變數平方和的算式為巨集 */ main(){ int i,n,sum=0; printf("求多項式(1^2+2^2)+(2^2+3^2)+...+(n^2+(n+1)^2)的和?\n"); printf("請輸入項數 n\n"); scanf("%d",&n); for (i=1;i<=n;i++) sum=sum + F(i,(i+1)); /* 將所有項次累加 */ printf("答案是 %d\n",sum); } /* Ch08_06.c */ #include /* 內建時間函式的含括檔 */ #define MACRO(x,y) x*x+y*y /* 定義計算兩變數平方和的巨集 */ int function(int,int); main(){ float begin,end; /* 計算開始與結束的時間 */ int i,sum=0,n; /* i 是迴圈變數 sum 是總和 n 是項次 */ printf("求出使用巨集與函式計算以下多項式, 到第 n 項和的時間?\n"); printf("(1^2+2^2)+(2^2+3^2)+...+(n^2+(n+1)^2)\n"); printf("請輸入項數 n\n"); scanf("%d",&n); printf("測試結果:\n"); begin=clock(); /* 取得計算開始的時間 */ for (i=1;i<=n;i++) sum=sum + MACRO(i,(i+1)); /* 使用巨集定義將所有項次累加 */ end=clock(); /* 取得計算結束的時間 */ printf("執行巨集花了 %g 秒\n",(end-begin)/CLK_TCK); sum=0; begin=clock(); /* 取得迴圈開始的時間 */ for (i=0;i<=n;i++) /* 跑 10 的 7 次方時間的迴圈 */ sum=sum + function(i,(i+1)); /* 使用函式呼叫將所有項次累加 */ end=clock(); /* 取得迴圈結束的時間 */ printf("執行函式花了 %g 秒\n",(end-begin)/CLK_TCK); } int function(int x,int y){ /* 定義計算兩變數平方和的函式 */ return x*x+y*y; } /* Ch08_07.c */ #define PI 3.14159 /* 定義圓週率 */ #define CUBE r*r*r /* 定義半徑的 3 次方值 */ #define BALL 4.0/3.0*CUBE*PI main(){ float r; printf("請輸入半徑\n"); scanf("%f",&r); /* 輸入球體半徑 */ printf("球體體積 = %.2f\n",BALL); /* 求出球體體積 */ } /* Ch08_08.c */ #define XX (c*e- f*b)/(a*e- d*b) /* 定義解 x 的公式 */ #define YY (a*f- d*c)/(a*e- d*b) /* 定義解 y 的公式 */ main(){ float a,b,c,d,e,f; /* 二元一次方程式的係數 */ float x,y; /* 二元一次方程式的未知數 */ printf("解下面聯立方程式的 x,y\n"); printf("ax + by = c\n"); printf("dx + ey = f\n"); printf("請輸入第一個方程式的係數(a b c)\n"); scanf("%f %f %f",&a,&b,&c); printf("請輸入第二個方程式的係數(d e f)\n"); scanf("%f %f %f",&d,&e,&f); do{ printf("\n方程式為:\n"); printf("%fx + %fy = %f\n",a,b,c); printf("%fx + %fy = %f\n",d,e,f); if ((a*e- d*b)== 0) /* 避免分母為 0 */ printf("係數輸入錯誤, 請重新輸入\n"); } while ((a*e- d*b)== 0); /* 當分母為 0 時, 重新輸入數值 */ printf("解:\n"); x=XX; /* 將巨集 XX 的計算結果指定給x */ y=YY; /* 將巨集 YY 的計算結果指定給y */ printf("x = %5.2f y = %5.2f \n",x,y); } /* Ch08_09.c */ #define NTD 1.0 /* 定義台幣為基準 */ #define USD 0.02911 /* 定義台幣對美金的匯率 */ #define JPY 3.46317 /* 定義台幣對日幣的匯率 */ #define HKD 0.22703 /* 定義台幣對港幣的匯率 */ #define GRP 0.01804 /* 定義台幣對英鎊的匯率 */ #define ECU 0.00733 /* 定義台幣對歐元的匯率 */ #define EXCHANGE(currency1,currency2) (NTD/currency1)*currency2 float rate(int); void currencyname(int); main(){ int amount; int curr1,curr2; int money; printf("1.台幣(NTD) 2.美金(USD) 3.港幣(HKD)\n"); printf("4.日幣(JPY) 5.英鎊(GRP) 6.歐元(ECU)\n"); printf("幣值轉換:(請輸入編號)\n"); printf("請輸入欲轉換的幣制\n"); scanf("%d",&curr1); printf("請輸入金額\n"); scanf("%d",&amount); printf("欲轉換成哪一種貨幣(請輸入編號)\n"); scanf("%d",&curr2); printf(" %d ",amount); currencyname(curr1); /* 顯示被轉換的貨幣名稱 */ printf("可兌換成 %.2f ",amount*EXCHANGE(rate(curr1),rate(curr2))); currencyname(curr2); /* 顯示轉換後的貨幣名稱 */ printf("\n"); } float rate(int money){ /* 傳回各種貨幣匯率的函式 */ switch (money){ case 1: return NTD; case 2: return USD; case 3: return HKD; case 4: return JPY; case 5: return GRP; case 6: return ECU; } } void currencyname(int money){ /* 將貨幣名稱顯示在螢幕上的函式 */ switch (money){ case 1: printf("台幣"); break; case 2: printf("美金"); break; case 3: printf("港幣"); break; case 4: printf("日幣"); break; case 5: printf("英鎊"); break; case 6: printf("歐元"); break; } } /* Ch09_01.c */ #define PI 3.14159 /* 定義圓週率 */ #define LIGHT 299792.458 /* 定義光速 */ #define G 6.672e-11 /* 定義萬有引力常數 */ main(){ printf("圓週率 = %2.5f\n",PI); printf("光速 = %6.3f\n",LIGHT); printf("萬有引力常數 = %2.3e \n",G); } /* Ch09_02.c */ #define ROC "Republic of China" #define PETS "3 cats and 5 dogs" #define TIGER "一種兇猛的肉食性動物" main(){ printf("ROC 是 %s 的縮寫\n",ROC); printf("我家的寵物有 %s\n",PETS); printf("Tiger: %s\n",TIGER); } /* Ch09_03.c */ #include /* 標準函式含括檔 */ main(){ int i; printf("請輸入亂數種子:"); scanf("%d",&i); srand(i); /* 取得亂數種子seed */ for (i = 0; i < 10;i++) printf("%5d\n", rand()); /* 產生亂數 */ } /* Ch09_04.h */ #define PRESIDENT 15000 /* 定義總統套房的價格 */ #define HI_CLASS 9000 /* 定義豪華套房的價格 */ #define MID_CLASS 6000 /* 定義中級套堂的價格 */ #define LOW_CLASS 3500 /* 定義雅房的價格 */ /* Ch09_04.c */ #include "Ch09_04.h" /* 含括 Ch09_04.h 檔 */ main(){ int option,price; /* option 是選項, price 是價格 */ printf("請選擇房間等級:\n"); printf("(1)總統套房(2)豪華套房(3)高級套房(4)雅房\n"); scanf("%d",&option); printf("您選擇的房間是:\n"); switch (option){ case 1: printf("總統套房\n"); /* 價格置換成 PRESIDENT 定義的數值 */ price=PRESIDENT; break; case 2: printf("豪華套房\n"); /* 價格置換成 HI_CLASS 定義的數值 */ price=HI_CLASS; break; case 3: printf("中級套房\n"); /* 價格置換成 MID_CLASS 定義的數值 */ price=MID_CLASS; break; case 4: printf("雅房\n"); /* 價格置換成 LOW_CALSS 定義的數值 */ price=LOW_CLASS; break; default: printf("大馬路\n"); price=0; } printf("價格: %d\n",price); } /* Ch09_05.c */ #define length 35 /* 定義長度的值 */ #define width 20 /* 定義寬度的值 */ #define area length*width /* 定義面積公式 */ #if length>width /* 判斷長度是否大於寬度 */ #define condition 'T' /* 定義狀況為真 */ #else #define condition 'F' /* 定義狀況為假 */ #endif main(){ if (condition=='T'){ /* 判斷狀況是否為真 */ printf("長 = %d\n",length); printf("寬 = %d\n",width); printf("矩形面積: %d*%d=%d\n",length,width,area); }else printf("您的長寬定義錯誤, 請重新定義\n"); } /* alex.h */ #define PNAME "Alex" #define AGE 21 #define BLOODTYPE 'O' #define JOB "Sales" /* bland.h */ #define PNAME "Bland" #define AGE 18 #define BLOODTYPE 'B' #define JOB "Student" /* name.h */ #if DATA == 1 /* 若 DATA 為 1, 則含括 alex.h */ #include "alex.h" #elif DATA == 2 /* 若 DATA 為 2, 則含括 balnd.h */ #include "bland.h" #else /* 若 DATA 為其他值, 則含括 unknown.h */ #include "unknown.h" #endif /* unknown.h */ #define PNAME "Unknown" #define AGE 0 #define BLOODTYPE 'X' #define JOB "Unknown" /* Ch09_06.c */ #define DATA 1 /* 定義 DATA 為 1 */ #include "name.h" main(){ printf("姓名: %s\n",PNAME); printf("年齡: %d\n",AGE); printf("血型: %c\n",BLOODTYPE); printf("工作: %s\n",JOB); } /* Ch09_07.c */ #define CUBE_AREA edge*edge*6 /* 定義立方體表面積公式的巨集 */ main(){ float edge; printf("計算立方體表面積, 請輸入邊長:\n"); scanf("%f",&edge); #ifdef CUBE_AREA /* 判斷 CUBE_AREA 是否已被定義 */ printf("立方體表面積公式已定義完成, 計算中...\n"); #else printf("立方體表面積公式尚未定義完成, 定義中...\n"); #define CUBE_AREA edge*edge*6 /* 如果未定義, 則重新定義 */ printf("定義完成, 計算中...\n"); #endif printf("\n邊長 %f 的立方體表面積為 %.2f\n",edge,CUBE_AREA); } /* Ch09_08.c */ #define BOOKNAME "三國演義" #define AUTHOR "羅貫中" #define PUBLISHER "歷史文化出版社" main(){ #ifdef BOOKNAME /* 判斷 BOOKNAME 名稱是否已被定義 */ printf(BOOKNAME); /* 已被定義則輸出 BOOKNAME 的值 */ printf("\n"); #else printf("未知\n"); /* 否則輸出 "未知" 的錯誤訊息 */ #endif #ifdef AUTHOR /* 判斷 AUTHOR 名稱是否已被定義 */ printf(AUTHOR); /* 已被定義則輸出 AUTHOR 的值 */ printf("\n"); #else printf("未知\n"); /* 否則輸出 "未知" 的錯誤訊息 */ #endif #ifdef PUBLISHER /* 判斷 PUBLISHER 名稱是否已被定義 */ printf(PUBLISHER); /* 已被定義則輸出 PUBLISHER 的值 */ printf("\n"); #else printf("未知\n"); /* 否則輸出 "未知" 的錯誤訊息 */ #endif #ifdef DATE /* 判斷 DATE 名稱是否已被定義 */ printf(DATE); /* 已被定義則輸出 DATE 的值 */ printf("\n"); #else printf("出版日期未知\n"); /* 否則輸出 "出版日期未知" 的錯誤訊息 */ #endif #ifdef PAGENUMBER /* 判斷 PAGENUMBER 名稱是否已被定義 */ printf(PAGENUMBER); /* 已被定義則輸出 PAGENUMBER 的值 */ printf("\n"); #else printf("頁數未知\n"); /* 否則輸出 "頁數未知" 的錯誤訊息 */ #endif } /* Ch09_09.h */ #define RED "紅色" #define ORANGE "橙色" #define YELLOW "黃色" #define GREEN "綠色" #define SKYBLUE "藍色" #define BLUE "靛色" #define PURPLE "紫色" /* Ch09_09.c */ #include "Ch09_09.h" /* 含括自訂含括檔 */ main(){ char casenumber; printf("請選擇號碼\n"); printf("1.RED 2.ORANGE 3.YELLOW 4.GREEN\n"); printf("5.SKYBLUE 6.BLUE 7.PURPLE\n"); scanf("%d",&casenumber); /* 輸入選擇號碼 */ switch (casenumber){ /* 根據選擇的號碼輸出定義的結果 */ case 1: printf(RED); break; case 2: printf(ORANGE); break; case 3: printf(YELLOW); break; case 4: printf(GREEN); break; case 5: printf(SKYBLUE); break; case 6: printf(BLUE); break; case 7: printf(PURPLE); break; default: printf("沒有這種顏色!!"); } printf("\n"); } /* Ch10_01.c */ main(){ int number[5]={2,4,12,6,18}; /* 宣告陣列並設定初始值 */ int i; /* 迴圈變數 */ printf("陣列的大小為 %d bytes\n",sizeof(number)); for (i=0;i<5;i++) printf("number[%d] 的值為: %d\n",i,number[i]); } /* Ch10_02.c */ #include #include /* 使用 time() 函式需含括此檔 */ /* 取得系統時間為亂數種子 */ #define myrandom() srand((unsigned)time(NULL)) #define SIZE 6 main(){ int dice[SIZE]={0}; /* 初始陣列內所有元素的值都為 0 */ int i,go,point; myrandom(); /* 使用巨集 */ printf("請輸入骰子投擲次數:\n"); scanf("%d",&go); for (i=0;iMAX) MAX=number[i]; printf("最大值為 %d\n",MAX); } /* Ch10_08.c */ #define SIZE 5 main(){ char array[SIZE]={'s','c','i','o','n'}; // char array[6]="scion"; int i,j; char temp; printf("排序前: "); for (i=0;i #define ROW 3 #define COL 4 main(){ int A[ROW][COL]={18,44,21,25, 21,19,65,41, 78,21,33,54}; int B[ROW][COL]={65,32,45,74, 11,24,10,41, 12,45,18,11}; int C[ROW][COL]; int i,j; for (i=0;i5||i<1); printf("第 %d 次的成績為",i); level(score[i-1]); /* 呼叫函式 */ } void level(int num){ /* 定義輸出成績的函式 */ char grade; /* 成績等級 */ if (num>=90) /* 依照成績判斷等級 */ grade='A'; else if (num<90 && num>=80) grade='B'; else if (num<80 && num>=70) grade='C'; else if (num<70 && num>=60) grade='D'; else grade='F'; printf("%d 等級 %c\n",num,grade); } /* Ch10_15.c */ int maximum(int[]); main(){ int number[8] = {15,86,72,65,46,44,66,33}; /* 呼叫並將陣列值傳到判斷最大值的函式 */ printf("最大值為 %d\n",maximum(number)); } int maximum(int number[]){ /* 判斷最大值的函式 */ int max=0,i,j; for (i=0;i<8;i++) if (number[i]>max) max=number[i]; return max; } /* Ch10_16.c */ #define SIZE 9 void output(int[][SIZE]); /* 輸出陣列內容的函式 */ main(){ /* 集合一維陣列的宣告方式 */ int array[SIZE][SIZE]; int i,j; for (i=0;imax){ /* 最高營業額的月份與金額 */ max=income[i]; maxmonth=i+1; } if (income[i] int compare(int,int); /* 比較大小的函式 */ main(){ int array[5]; /* 儲存 5 組數值 */ int i,option,result; /* 迴圈變數、遊戲者選項、猜測結果 */ char goOn; /* 是否繼續下一關的判斷字元 */ randomize(); /* 取得亂數種子 */ for (i=0;i<5;i++){ /* 控制產生 5 組數值的迴圈 */ array[i]=rand()%14; if (array[i]==7 || array[i]==0) i--; } i=0; do{ if (i<=5){ /* 判斷是否已過全部關卡 */ printf("第 %d 關:\n",i+1); printf("請選擇(1)比 7 大(2)比 7 小\n"); scanf("%d",&option); result=compare(option,array[i]); if (result==1){ /* 猜對了 */ printf("恭喜您過關了, 繼續挑戰下一關?(y/n)\n"); goOn=getche(); printf("\n"); }else{ /* 猜錯了 */ printf("對不起您猜錯了, 挑戰失敗\n"); goOn='n'; } i++; }else printf("恭喜您全部過關了...(放煙火!!)\n"); } while (goOn=='y'); } int compare(int option,int number){ /* 判斷比 7 大或小的函式 */ switch (option){ case 1: /* 選擇比 7 大的判斷 case */ if (number>7){ printf("結果是 %d 比 7 大\n",number); return 1; }else{ printf("結果是 %d 比 7 小\n",number); return 0; } case 2: /* 選擇比 7 小的判斷 case */ if (number<7){ printf("結果是 %d 比 7 小\n",number); return 1; } else { printf("結果是 %d 比 7 大\n",number); return 0; } default: return 0; } } /* Ch10_19.c */ #define ROW 5 /* 定義二維陣列的列數為 5 */ #define COL 6 /* 定義二維陣列的行數為 6 */ main(){ char cartag[ROW][COL]={{'A','A','0','0','0','0'}, {'F','F','8','8','8','8'}, {'B','B','1','1','1','1'}, {'C','C','9','9','9','9'}, {'D','D','4','4','4','4'} }; char search[6]; int flag=1,i,j,n; /* flag 為旗標變數, i、j、n 均為迴圈變數 */ printf("失竊車輛查詢系統\n"); printf("請輸入車牌號碼 (前兩碼為大寫字母, 後四碼為數字)\n"); for (n=0;n<6;n++) /* 控制鍵盤輸入的迴圈 */ scanf("%c",&search[n]); for (j=0;j<5;j++){ /* 換列的外迴圈 */ flag=1; for (i=0;i<6;i++){ /* 控制比對一列中每一個字元的迴圈 */ if (search[i]!=cartag[j][i]){ flag=0; break; } } if (flag==1) break; } if (flag==1) /* 檢查旗標變數的最後值, 決定輸出的訊息 */ printf("資料吻合!!此車牌可能為失竊車輛\n"); else printf("無相符資料!! 此車牌不是失竊車輛\n"); } /* Ch10_20.c */ void even(int[]); /* 原型宣告判斷偶數的函式 */ void odd(int[]); /* 原型宣告判斷奇數的函式 */ main(){ int array[10]={36,45,64,98,71, 46,78,97,20,81}; even(array); /* 呼叫並傳遞陣列值到判斷偶數的函式 */ odd(array); /* 呼叫並傳遞陣列值到判斷奇數的函式 */ } void even(int array[]){ /* 判斷偶數的函式 */ int i; printf("偶數有:\n"); for (i=0;i<10;i++) if (array[i]%2==0) printf("%d ",array[i]); printf("\n"); } void odd(int array[]){ /* 判斷奇數的函式 */ int i; printf("奇數有:\n"); for (i=0;i<10;i++) if (array[i]%2!=0) printf("%d ",array[i]); printf("\n"); } /* Ch10_21.c */ #define COL 3 /* 定義行數 */ #define ROW 3 /* 定義列數 */ void input(int[][COL]); /* 輸入數值的函式 */ void output(int[][COL]); /* 輸出結果的函式 */ void cal(int[][COL],int[][COL]); /* 計算矩陣乘積的函式 */ int i,j,k; /* 迴圈變數 */ main(){ int a[ROW][COL]={0},b[ROW][COL]={0}; printf("矩陣 a:\n"); input(a); printf("矩陣 b:\n"); input(b); printf("矩陣 a:\n"); output(a); printf("矩陣 b:\n"); output(b); printf("開始計算...\n"); printf("答案:\n"); cal(a,b); } /* 定義從鍵盤輸入資料的函式 */ void input(int matrix[ROW][COL]){ for (i=0;i<3;i++) for (j=0;j<3;j++){ printf("請輸入(%d,%d) 的值(列,行): ",i+1,j+1); scanf("%d",&matrix[i][j]); } } /* 定義輸出陣列內容的函式 */ void output(int matrix[ROW][COL]){ for (i=0;i<3;i++){ for (j=0;j<3;j++) printf("%3d ",matrix[i][j]); printf("\n"); } } /* 定義計算兩矩陣乘積的函式 */ void cal(int mat1[ROW][COL],int mat2[ROW][COL]){ int result[ROW][COL]={0}; for (i=0;i<3;i++) for (j=0;j<3;j++) for (k=0;k<3;k++) result[i][j]+=mat1[i][k]*mat2[k][j]; output(result); } /* Ch11_01.c */ main(){ char name[]="John Smith"; /* 設定字串初始值 */ printf("name 陣列大小 = %d\n",sizeof(name)); printf("name = %s\n",name); } /* Ch11_02.c */ main(){ char name[]="John\0Smith"; /* 定義字串 */ printf("name = %s",name); /* 從螢幕輸出字串 */ } /* Ch11_03.c */ main(){ char name1[]={'J','o','h','n',' ','S','m','i','t','h','\0'}; char name2[]={'M','a','r','y',' ','W','h','i','t','e'}; printf("name1 = %s\n",name1); /* 輸出陣列 name1 內容 */ printf("name2 = %s\n",name2); /* 輸出陣列 name2 內容 */ } /* Ch11_04.c */ main(){ char *name="John Smith"; /* 設定字串初始值 */ printf("name 指位器大小 %d\n",sizeof(name)); printf("name = %s\n",name); } /* Ch11_05.c */ main(){ char name[11]; /* 宣告一字元型別的陣列 */ /* 將字串內容依序填入 */ name[0]='J'; name[1]='o'; name[2]='h'; name[3]='n'; name[4]=' '; name[5]='S'; name[6]='m'; name[7]='i'; name[8]='t'; name[9]='h'; name[10]='\0'; printf("name= %s\n",name); } /* Ch11_06.c */ main(){ char string[60]; /* 宣告一字元陣列用來儲存字串 */ printf("請輸入一段字串\n\n"); gets(string); /* 從鍵盤輸入一字串 */ printf("您輸入的字串為: %s\n",string); /* 輸出字串 */ } /* Ch11_07.c */ main(){ char string[60]; /* 宣告陣列 string 來儲存字串 */ printf("請輸入一段字串\n"); gets(string); /* 從鍵盤輸入一字串 */ printf("\n"); printf("您輸入的字串為: %s\n",string); /* 螢幕輸出字串 */ } /* Ch11_08.c */ #include /* 記得要含括此檔 */ main(){ char string1[]="Money is power"; /* 定義字串 */ printf("字串長度 %d bytes\n",strlen(string1)); printf("字串佔記憶體 %d bytes\n",sizeof(string1)); } /* Ch11_09.c */ #include main(){ char str1[]="Lazy Boy"; char str2[]="Cute Girl"; /* 定義字串 */ printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n\n",str2); strcpy(str2,str1); /* 呼叫複製字串函式 */ printf("將第 1 個字串內容複製到第 2 個字串後的結果:\n"); printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); } /* Ch11_10.c */ #include main(){ char str1[]="Cute and Pretty Girl"; /* 定義字串 */ char str2[]="Lazy Boy"; int n; printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); printf("要複製第 1 個字串的前幾個字元到第 2 個字串?\n"); scanf("%d",&n); strncpy(str2,str1,n); printf("複製後:\n"); printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); } /* Ch11_11.c */ #include main(){ char str1[60]; /* 定義字串 */ char str2[60]; printf("請輸入第 1 個字串\n"); gets(str1); printf("請輸入第 2 個字串\n"); gets(str2); if (strcmp(str1,str2)== 0) /* 比對 str1、str2 */ printf("兩字串的內容相等\n"); else printf("兩字串內容不相同\n"); } /* Ch11_12.c */ #include main(){ char str1[60]; /* 宣告儲存字串1 的陣列 */ char str2[60]; /* 宣告儲存字串2 的陣列 */ int i,length; /* i 為迴圈變數, length 為字串長度 */ printf("請輸入第 1 句字串\n"); gets(str1); printf("請輸入第 2 句字串\n"); gets(str2); if (strlen(str1)>strlen(str2)) /* 將 length 設定為 */ length=strlen(str1); /* 較長字串的長度 */ else length=strlen(str2); /* 逐字元比對 str1 與 str2 */ for (i=1;i main(){ char str1[30] = "BIRTH"; char str2[] = "DAY"; printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); printf("將第 2 個字串串接在第 1 個字串後面的結果\n%s\n", strcat(str1,str2)); /* 串接 str1 與 str2 */ } /* Ch11_14.c */ #include main(){ char str1[30] = "foot"; char str2[] = "ballet"; int n; printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); printf("請問要將第 2 個字串的前幾個字元串接到 第 1 個字串後?\n"); scanf("%d",&n); strncat(str1,str2,n); printf("%s\n",str1); } /* Ch11_15.c */ #include main(){ char date[11]; /* 儲存由鍵盤輸入的日期 */ char month[2]; char days[2]; int roc; printf("請輸入日期 (例:2003/09/03)\n"); scanf("%10s",date); roc=atoi(date)-1911; /* 西元轉民國 */ month[0]=date[5]; /* 將月份存入 month 陣列中 */ month[1]=date[6]; days[0]=date[8]; /* 將日存入 days 陣列中 */ days[1]=date[9]; printf("日期:民國 %d 年 %d 月 %d 日\n", roc,atoi(month),atoi(days)); } /* Ch11_16.c */ #include #include main(){ int age; char ageunit[]="歲", name[30], str_age[10]; printf("請輸入您的姓名\n"); gets(name); printf("請輸入您的年齡\n"); scanf("%d",&age); itoa(age,str_age,10); /* 將 age 的變數值轉換成字串 */ strcat(name,str_age); strcat(name,ageunit); printf("輸出資料: %s\n",name); } /* Ch11_17.c */ #include main(){ char rate1[]="1.36%-存款 十萬以上"; char rate2[]="1.82%-存款五十萬以上"; char rate3[]="2.52%-存款一百萬以上"; char rate4[]="2.98%-存款五百萬以上"; double rating=0,interest; /* 年利率與利息 */ int balance; /* 存款總額 */ printf("本銀行最新推出 存越多領越多 定存優惠方案年利率如下:\n"); printf("%s\n%s\n%s\n%s\n", rate1,rate2,rate3,rate4); printf("請輸入您的存款總數(單位:萬元)\n"); scanf("%d",&balance); if (balance>=500) rating=atof(rate4); /* 轉換第 4 個字串為浮點數 */ else if (balance>=100) rating=atof(rate3); /* 轉換第 3 個字串為浮點數 */ else if (balance>=50) rating=atof(rate2); /* 轉換第 2 個字串為浮點數 */ else if (balance>=10) rating=atof(rate1); /* 轉換第 1 個字串為浮點數 */ else printf("對不起您的額度未達標準\n"); rating=rating/100; printf("年利率 %f \n", rating); interest=balance*rating; printf("您一年可得 %.2f 元的利息\n", interest*10000); } /* Ch11_18.c */ #include main(){ char str[] = "I am not a teacher"; printf("%s\n", strstr(str,"not")); } /* Ch11_19.c */ #include main(){ /* 定義字串內容 */ char str[]="You can't drink water while it is still hot."; char target[10]; /* 定義一新的陣列, 用來儲存搜尋字串的內容 */ int position; /* 宣告表示字串位置的變數 */ printf("字串為 %s\n",str); printf("請輸入欲搜尋的子字串\n"); gets(target); if (strstr(str,target)== 0) /* 呼叫搜尋字串的函式 strstr() */ printf("您要搜尋的子字串不存在\n"); else{ /* 計算欲搜尋子字串在字串中的位置 */ position = strlen(str) - strlen(strstr(str,target))+1; printf("你要找的字串在第 %d 個字元\n",position); } } /* Ch11_20.c */ #include main(){ char str[30] = "I am a boy"; /* 定義字串內容 */ char insertstr[10]; /* 宣告欲插入的字串內容 */ int strlength, inslength; /* 宣告兩字串長度的變數 */ int i,position=7; printf("字串 = %s\n", str); printf("輸入欲插入的字串\n"); gets(insertstr); printf("新字串 %s 欲插入第 %d 個位置後\n",insertstr,position); strlength = strlen(str); /* 計算字串長度 */ inslength = strlen(insertstr); /* 計算欲插入的字串的長度 */ /* 空出插入字串位置的迴圈 */ for (i=strlength; i>=position; i--) str[i+inslength] = str[i]; for (i=0; i main(){ char str[] = "what a funny day!!"; /* 定義原字串的內容 */ int position=6, length=6; /* 宣告與定義欲移除的字串位置與長度 */ int i; /* 迴圈控制變數 */ printf("原字串 %s\n", str); i = position + length; while (str[position]!='\0' && position < i) position++; /* 用迴圈找出欲移除字串後的第一個字元在陣列中位置 */ while ((str[position-length]=str[position]) != '\0') position++; /* 用迴圈依序將後面的字元複製到移除中間字串後的新位置 */ printf("新字串 %s\n", str); } /* Ch11_22.c */ main(){ char str[4][20]= {"Sun is shinning", /* 定義字串內容 */ "Flower is pretty", "Sugar is sweety", "And so are you"}; int i; for (i=0;i<4;i++) /* 控制從螢幕輸出字串內容的迴圈 */ printf("%s\n",str[i]); } /* Ch11_23.c */ #include #define LINE 30 /* 最多可輸入的行數 */ #define WIDTH 60 /* 每行中最多可輸入的字元 */ main(){ char strary[LINE][WIDTH]; /* 儲存所有輸入字串的陣列 */ int j,flag; /* j 的迴圈變數, flag 是旗標變數 */ int lline=0; /* 輸入字串最後一行的行數 */ printf("請依序輸入字串, "); printf("單句完畢請按下 Enter, 全部輸入完畢請輸入 qq\n"); do{ gets(strary[lline]); /* 從鍵盤輸入字串 */ flag=strcmp(strary[lline],"qq"); /* 判斷字串是否為 qq */ lline++; }while(lline main(){ char str[]="AbcdEFgHijKLmn"; /* 定義原字串 */ int i; printf("原字串 %s\n",str); for (i=0;i main(){ char str[] = "I am a student"; /* 定義原字串內容 */ int i; for (i=strlen(str);i>=0;i--) /* 控制螢幕輸出的迴圈 */ printf("%c",str[i]); printf("\n"); } /* Ch11_26.c */ #include #include #define SIZE 100 main(){ char str[SIZE]; /* 存放由鍵盤輸入的字串 */ char letter[SIZE]; /* 存放 str[] 只保留英文字母的字串 */ unsigned int i,j=0,flag=0; printf("判斷是否為迴文, 請輸入一個字串\n"); gets(str); for (i=0;i #define SIZE 7 main(){ /* 儲存一周七天的中文名稱的字串陣列 */ char strary1[SIZE][7]={"星期一","星期二","星期三", "星期四","星期五","星期六","星期日"}; /* 儲存一周七天的英文文名稱的字串陣列 */ char strary2[SIZE][10]={"Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday","Sunday"}; char search[60]; /* 儲存由鍵盤輸入的搜尋字串 */ int position=7, i; /* 旗標變數 flag 與迴圈變數 i */ printf("查閱星期一~星期日的英文名稱\n"); printf("請輸入中文名稱\n"); gets(search); for (i=0;i #define MAXNUM 40 /* 定義最多可輸入字串數 */ #define MAXLEN 80 /* 定義最長可輸入字串長度 */ main(){ /* 儲存所有輸入字串的字串陣列 */ char name[MAXNUM][MAXLEN]; char temp[MAXNUM]; /* 暫存陣列 */ int count=0; /* 計算輸入字串數 */ int i,j; /* 迴圈變數 */ int length; /* 字串長度 */ printf("開始輸入字串, 輸入完畢請按 Enter\n"); while (count0){ /* 若前面的字串比後面大, 則交換 */ strcpy(temp,name[j]); strcpy(name[j],name[i]); strcpy(name[i],temp); } printf("\n排序結果:\n"); for (i=0;i=1;i--) /* 指位器減去 3~1 的數值 */ printf("指位器 ptri-%d = %p 指位器 ptrc-%d = %p\n", i,ptri-i,i,ptrc-i); printf("指位器 ptri = %p 指位器 ptrc = %p\n", ptri, ptrc); for (i=1;i<=3;i++) /* 指位器加上 1~3 的數值 */ printf("指位器 ptri+%d = %p 指位器 ptrc+%d = %p\n", i,ptri+i,i,ptrc+i); } /* Ch12_06.c */ #include main(){ int *num; /* sum 是總和, i 是迴圈變數, n 為數值個數 */ int sum=0,i,n; printf("請問要計算多少個數字的總和: "); scanf("%d",&n); num=(int*)malloc(sizeof(int)*n); /* 配置記憶體 */ for (i=0;i #define MAX 5 main(){ /* 以動態記憶體配置的方式取得儲存數值的空間 */ int *ptr=(int *)malloc(sizeof(int) * MAX); int i,maxnum=0; printf("請輸入 5 個數值:"); for (i=0;imaxnum) maxnum=*(ptr+i); /* 找出最大值 */ } printf("最大值為 %d\n",maxnum); free(ptr); } /* Ch12_08.c */ #include #include main(){ char *str1="I am a good boy"; /* 宣告一字串 */ /* 動態配置一個與 str1 相同大小的記憶體空間 */ char *str2=(char *)malloc(sizeof(char)*(strlen(str1)+1)); printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); strcpy(str2,str1); printf("\n將第 1 個字串內容複製到第 2 個字串後:\n"); printf("第 1 個字串 %s\n",str1); printf("第 2 個字串 %s\n",str2); } /* Ch12_09.c */ main(){ /* 宣告指位器陣列有三個元素, 每個元素存放含一個中文字的字串 */ char *ptr[3]={"智","仁","勇"}; int i; for (i=0;i<3;i++) printf("位址: %p 內容: %s\n",ptr[i],ptr[i]); printf("\n"); } /* Ch12_10.c */ main(){ char *ptr[3]={"一府","二鹿","三艋舺"}; int i; for (i=0;i<3;i++) printf("位址: %p 內容: %s\n",ptr[i],ptr[i]); printf("\n"); } /* Ch12_11.c */ #include #define SIZE 100 /* 定義陣列容量 */ main(){ char s[SIZE][SIZE]; /* 宣告陣列已要求存放空間 */ char *line[SIZE]; /* 宣告指位器以處理資料 */ char *p; int i,j,k; printf("請輸入欲排序的字串, 輸入完畢時請輸入 \"q\"\n"); for (i=0;i0){ p = line[k]; /* 開始交換所指位址 */ line[k] = line[j]; line[j] = p; } for (j=0; j #include #include #define myrandom() srand(time(NULL)) /* 設定亂數種子的巨集 */ int *generator(int); /* 產生號碼的函式 */ main(){ int *number; /* 宣告用來接受傳回位址的指位器 */ int i,n; /* i 是迴圈變數, n 為號碼組數 */ printf("請問要產生幾組四星彩號碼: "); scanf("%d",&n); number=generator(n); /* 呼叫函式並接受傳回之位址 */ for (i=0;i #include #define ROW 100 #define COL 10 main(){ int i,j; /* 動態配置雙重指位器的列空間 */ char **array=(char **)malloc(ROW * sizeof(char*)); for (i=0;i void swap(int*,int*); main(){ int *array; int i,j; int n; printf("排序幾個數值? "); scanf("%d",&n); array=(int *)malloc(sizeof(int) * n); printf("請輸入 %d 個數值:\n",n); for (i=0;i*(array+j)) /* 比較內外迴圈控制的數值 */ swap(array+i,array+j); /* 呼叫交換數值的函式 */ printf("\n排序結果:\n"); for (i=0;i void letterconvert(char*); main(){ char *ptr="AbcdEFgHijKLmn"; /* 定義原字串 */ int i; printf("原字串 %s\n",ptr); for (i=0;i #include #include #define ID_SIZE 10 int CheckID(char *); main(){ char ID[80]; int ret; printf("請輸入身份證字號: "); gets(ID); /* 檢查是否 10 位, 以及第一位是否為英文字母 */ if (strlen(ID) != ID_SIZE){ printf("\n輸入錯誤, 不檢查\n"); return 0; } ret=CheckID(ID); if (ret == 0) printf("此身份證字號正確\n"); else printf("此身份證字號錯誤\n"); } int CheckID(char *id){ int AtoNum; /* 身份證字母轉換為身份證的代號的值 */ int solution; int ID_Num[26]={10,11,12,13,14,15,16,17,34,18,19,20, 21,22,35,23,24,25,26,27,28,29,30,31}; AtoNum=ID_Num[*id-'A']; solution=(AtoNum/10) + (AtoNum%10)*9 + (*(id+1)-'0')*8 + (*(id+2)-'0')*7 + (*(id+3)-'0')*6 + (*(id+4)-'0')*5 + (*(id+5)-'0')*4 + (*(id+6)-'0')*3 + (*(id+7)-'0')*2 + (*(id+8)-'0'); solution=solution%10; /* 總合除以 10 求餘數 */ solution=10-solution; /* 用 10 減餘數, 即為最後一碼檢查號碼 */ if (solution == (int)(*(id+9)-'0')) return 0; else return -1; } /* Ch12_22.c */ void showerror(); /* 輸出錯誤訊息的函式 */ main(int argc, char *argv[]){ if (argc!=2 || argv[1][0]!='/'){ /* 判斷參數數目不合以及未加/ */ showerror(); return 1; } switch (argv[1][1]){ /* 選擇參數對照的參數指令 */ case 'f': case 'F': printf("[format...]\n"); break; case 'c': case 'C': printf("[copy...]\n"); break; case 'd': case 'D': printf("[delete...]\n"); break; default: showerror(); return 2; } } void showerror(){ /* 定義輸出函式的內容 */ printf("Usage: Ch12_22/[f][c][d]\n"); } /* Ch13_01.c */ void addsum(); main(){ int i; for (i=0;i<3;i++) addsum(); /* 執行 3 次 addsum() */ } void addsum(){ int number=100; /* 內部變數, 有初始值 */ printf("number=%d\n",number++); } /* Ch13_02.c */ void addsum(int *); /* 宣告加總的函式 */ main(){ int i; /* 迴圈變數 */ int number=100; /* 要累加的內部變數 */ for (i=0; i<3; i++) addsum(&number); } void addsum(int *num){ /* 定義加總的函式 */ int number = *num; /* 函式中要累加的內部變數 */ printf("number=%d\n",(*num)++); } /* Ch13_03.c */ float plus(); /* 加法函式 */ float minus(); /* 減法函式 */ float multiply(); /* 乘法函式 */ float division(); /* 除法函式 */ float num1,num2; /* 將欲運算的兩變數定義成外部變數 */ char operation; /* 定義算符的變數成外部變數 */ main(){ printf("輸入算式, 輸入完畢請按 Enter\n"); scanf("%f%c%f",&num1,&operation,&num2); if (operation=='+') /* 加法算符 */ printf("= %f\n",plus()); else if (operation=='-') /* 減法算符 */ printf("= %f\n",minus()); else if (operation=='*') /* 乘法算符 */ printf("= %f\n",multiply()); else if (operation=='/') /* 除法算符 */ printf("= %f\n",division()); else printf("算符輸入錯誤\n"); } float plus(){ /* 傳回兩變數和的函式 */ return num1+num2; } float minus(){ /* 傳回兩變數差的函式 */ return num1-num2; } float multiply(){ /* 傳回兩變數積的函式 */ return num1*num2; } float division() /* 傳回兩變數商的函式 */ return num1/num2; } /* Ch13_04.c */ float calc(int); /* 判斷打折數的函式 */ main(){ extern int orange; /* 使用外部變數 orange, 宣告在最下面 */ int number; /* 買幾粒 */ float rate; /* 打幾折 */ float total; /* 總價 */ printf("橘子一粒 %d 元, 買多有打折. 請問買幾粒?\n",orange); scanf("%d", &number); if (number <=0){ printf("太少不賣你\n"); return 0; } else if (number >= 1000){ printf("買太多, 無法供貨\n"); return 0; } rate=calc(number); total = orange*number*rate; printf("橘子 %d 粒 %5.0f 元\n", number, total); } float calc(int num){ if (num > 50) return 0.8; /* 大於 50 粒打 8 折 */ else if (num > 20) return 0.9; /* 大於 20 粒打 9 折 */ else return 1.0; /* 否則不打折 */ } int orange=10; /* 宣告外部變數 orange, 並指定一粒 10 元 */ /* Ch13_05.c */ float calcg1(); float calcg2(); float g=9.8; /* 外部變數: 重力加速度 g=9.8 m/sec^2 */ float t=5.0; /* 外部變數: 落下時間為 5 秒 */ main(){ printf("第一次落下距離為 %6.2f 公尺\n", calcg1()); printf("第二次落下距離為 %6.2f 公尺\n", calcg2()); } float calcg1(){ /* 計算垂直落體 */ return 0.5 * g * t * t; } float calcg2(){ /* 同樣是計算垂直落體 */ float t = 10.0; /* 宣告內部變數, 落下時間為 10 秒 */ return 0.5 * g * t * t; } /* Ch13_06.c */ extern float num1,num2; /* 加入此行才能使用 Ch13_07.c 中 */ /* 宣告的外部變數 */ float plus() /* 傳回兩變數和的函式 */ { return num1+num2; } float minus() /* 傳回兩變數差的函式 */ { return num1-num2; } float multiply() /* 傳回兩變數積的函式 */ { return num1*num2; } float division() /* 傳回兩變數商的函式 */ { return num1/num2; } /* Ch13_06.h */ float plus(); /* 宣告傳回兩變數和的函式 */ float minus(); /* 宣告傳回兩變數差的函式 */ float multiply(); /* 宣告傳回兩變數積的函式 */ float division(); /* 宣告傳回兩變數商的函式 */ /* Ch13_07.c */ #include "Ch13_06.h" /* 含括函式的宣告檔 */ float num1,num2; /* 將欲運算的兩變數宣告成外部變數 */ char operation; /* 宣告算符的變數成外部變數 */ main(){ printf("輸入算式, 輸入完畢請按 Enter\n"); scanf("%f%c%f",&num1,&operation,&num2); if (operation=='+') /* 加法算符 */ printf("= %f\n",plus()); else if (operation=='-') /* 減法算符 */ printf("= %f\n",minus()); else if (operation=='*') /* 乘法算符 */ printf("= %f\n",multiply()); else if (operation=='/') /* 除法算符 */ printf("= %f\n",division()); else printf("算符輸入錯誤\n"); } /* Ch13_08.c */ void addsum(); main(){ int i; for (i=0; i<3; i++) addsum(); } void addsum(){ static int number=100; /* 改用內部靜態變數 */ printf("number=%d\n", number++); } /* Ch13_09.c */ void withdraw(); int money; /* 宣告提款金額 money 為外部變數 */ main(){ char option; /* 迴圈判斷字元 */ do{ printf("請輸入提款金額\n"); scanf("%d",&money); withdraw(); printf("還要再領錢嗎?(y/n)\n"); option=getch(); } while (option=='y'); } void withdraw() /* 處理提款金額的函式 */ { static int balance= 10000; /* 結餘為內部靜態變數 */ balance=balance-money; /* 計算提款後的結餘 */ if (balance>=0) /* 判斷是否少於帳戶內的金額 */ printf("您的帳戶內還有 %d 元\n",balance); else printf("您的帳戶還缺 %d 元\n",-balance); } /* Ch13_10.c */ void fact(int); static int value=1; /* value 為外部靜態變數 */ main(){ int i,n; printf("計算 n 階乘的值, 請輸入 n:\n"); scanf("%d",&n); for (i=n; i>=1; i--) fact(i); printf("%d! = %d\n",n,value); } void fact(int i) /* 計算階乘值的函式 */ { value=value*i;} /* Ch13_11.c */ #include /* 內建時間函式的含括檔 */ main(){ int begin,end,sum=0; register int i, j; /* 宣告暫存器變數 */ printf("測試結果:\n"); begin=clock(); /* 取得迴圈開始的時間 */ for (i=0; i<10000; i++) for (j=0; j<10000; j++) sum=sum+1; end=clock(); /* 取得迴圈結束的時間 */ printf("執行函式花了 %g 秒\n",(end-begin)/CLK_TCK); } /* Ch13_12.c */ void inc(); /* 宣告遞增的函式 */ void dec(); /* 宣告遞減的函式 */ void display(); /* 宣告從螢幕輸出結果的函式 */ main(){ int i; puts("遞增中..."); for (i=0; i<5; i++) /* 每跑一次迴圈便呼叫一次函式, */ { /* 每呼叫一次函式, counter 的值便遞增 1 */ inc(); display(); } puts("遞減中..."); for (i=0; i<5; i++) /* 每跑一次迴圈便呼叫一次函式, */ { /* 每呼叫一次函式, counter 的值便遞減 1 */ display(); dec(); } } int counter=0; /* 宣告外部變數 counter */ void inc(){ counter++; } void dec(){ counter--; } void display(){ printf("Counter=%d \n",counter); } /* Ch13_13.c */ #define BUFSIZE 255 /* 定義陣列容量 */ char pop(); /* 放入堆疊資料的函式 */ void push(char); /* 取出堆疊資料的函式 */ void dump(); /* 顯示堆疊資料的函式 */ static char stack[BUFSIZE]; /* 以陣列模擬堆疊空間 */ static int sp=0; /* 堆疊頂端資料的位置變數 */ main(){ int i; char c; puts("Pushing..."); for (i=0; i<5; i++) /* 控制將資料放入堆疊的迴圈 */ { push('a'+i); printf("放進 %c ", 'a'+i); dump(); } puts("\nPoping..."); for (i=0; i<5; i++) /* 控制將資料取出堆疊的迴圈 */ { c= pop(); printf("取出 %c ", c); dump(); } } void push(char s) /* 放字元進堆疊 */ { if (sp 0) return(stack[--sp]); /* 每拿出一筆資料, 位置變數便減 1 */ else printf("ERROR: stack empty\n"); } void dump() /* 顯示目前堆疊中的內容 */ { int i; printf("堆疊內容:"); if (sp>0) for (i=sp-1;i>=0;i--) printf("%c ",stack[i]); else printf("EMPTY!"); /* 當 sp=0 表示堆疊內已經無資料 */ printf("\n"); } /* Ch14_01.c */ #include #include main(){ char ID[17], password[9]; /* ID 字串與密碼字串 */ unsigned int i; /* 設定迴圈變數 */ int flag; /* 設定旗標變數 */ do{ printf("請設定您的 ID\n"); printf("(限定為 16 個字元以內的英文字母或數字)\n"); gets(ID); printf("請設定您的密碼\n"); printf("(限定為 8 個字元以內的英文字母或數字)\n"); gets(password); flag=1; for (i=0; i #include main(){ char name[10]; /* 英文名字的字串陣列 */ int i; /* i 是迴圈變數 */ int flag; /* flag 是判斷是否跳出迴圈的旗標變數 */ do{ printf("請輸入您的英文名字\n"); gets(name); flag=1; for (i=0; i main(){ /* 訊息字串的陣列與行動電話號碼的陣列 */ char msg[30],mobile[11]; int i=0; /* 迴圈變數 */ int flag=1; /* 旗標變數 */ printf("歡迎使用簡訊發送系統\n"); printf("請編輯你的簡訊 (30 個字元以內)\n"); gets(msg); /* 從鍵盤輸入訊息內容 */ do{ printf("請輸入發送的電話號碼\n"); scanf("%10s",mobile); /* 從鍵盤輸入電話號碼 */ flag=1; for (i=0;i<10;i++) /* 判斷電話號碼是否為數字 */ if (isdigit(mobile[i]) ==0){ printf("\n電話號碼輸入錯誤\n"); flag=0; break; } } while (flag==0); printf("\n您的簡訊 \"%s\" ",msg); printf("已經發送到 %s\n",mobile); } /* Ch14_04.c */ #include main(){ char character; printf("請輸入一個字元\n"); scanf("%c",&character); /* 輸入欲檢驗字元 */ if (isascii(character)!=0) printf("此字元為 ASCII 字元\n"); else printf("此字元不是 ASCII 字元\n"); } /* Ch14_05.c */ #include main(){ char character; printf("請輸入一個字元\n"); scanf("%c",&character); /* 輸入欲檢驗字元 */ if (iscntrl(character)!=0) printf("此字元為 ASCII 控制字元\n"); else printf("此字元不是 ASCII 控制字元\n"); } /* Ch14_06.c */ #include #include main(){ char name[20]; int i,flag; /* i 是迴圈變數, flag 是旗標變數 */ do{ printf("請輸入您的英文名字\n"); gets(name); flag=1; for (i=0; i #include main(){ char string[30]; /* 定義被檢驗的字串 */ int i; printf("請輸入欲轉換大小寫字母的字串\n"); gets(string); printf("\n輸出的字串:\n"); for (i=0; i #include main(){ /* 隨意設定內容的字串 */ char *str="ih\no$@\nW we\veA"; int i; printf("使用 isgraph()檢驗結果:\n"); printf("第 "); for (i=0; i #include main(){ char string[60]; /* 儲存輸入字串的陣列 */ int i; /* i 是迴圈變數 */ int count=0; /* count 是標點符號與特殊符號的總數 */ printf("請輸入一個欲計算標點符號的字串\n"); gets(string); for (i=0; i #include main(){ char *str="ihno13we0veA"; /* 隨意設定的字串 */ unsigned int i; /* 迴圈變數 */ printf("第 "); for (i=0; i #include void input(char[],char[]); /* 宣告輸入資料的函式 */ int check(); /* 檢查資料的函式 */ char make[10]; /* 車款資料 */ char model[10]; /* 車型資料 */ char engines[5]; /* 引擎排氣量資料 */ char tag[6]; /* 車牌號碼資料 */ main(){ char carmake[5]="車款"; /* 訊息字串 "車款" */ char carmodel[5]="車型"; /* 訊息字串 "車型" */ char careng[8]="排氣量"; /* 訊息字串 "排氣量" */ char cartag[9]="車牌號碼"; /* 訊息字串 "車牌號碼" */ int result; input(carmake,make); /* 呼叫函式, 輸入車款資料 */ input(carmodel,model); /* 呼叫函式, 輸入車型資料 */ input(careng,engines); /* 呼叫函式, 輸入引擎資料 */ input(cartag,tag); /* 呼叫函式, 輸入車牌資料 */ do{ result=check(); /* 呼叫檢查函式 */ /* 以檢查函式的傳回值, 當作條件算式值*/ switch (result){ case 1: printf("車款輸入錯誤, 請重新輸入\n"); /* 再次呼叫函式, 重新輸入車款資料 */ input(carmake,make); break; case 2: printf("車型輸入錯誤, 請重新輸入\n"); /* 再次呼叫函式, 重新輸入車型資料 */ input(carmodel,model); break; case 3: printf("引擎排氣量輸入錯誤, 請重新輸入\n"); /* 再次呼叫函式, 重新輸入引擎資料 */ input(careng,engines); break; case 4: printf("車牌輸入錯誤, 請重新輸入\n"); /* 再次呼叫函式, 重新輸入車牌資料 */ input(cartag,tag); break; default: printf("資料處理中...\n"); } } while (result!=0); printf("\n您的車籍資料如下:\n"); printf("車款: %s\n",make); printf("車型: %s\n",model); printf("引擎: %s c.c\n",engines); printf("車牌: %s\n",tag); } /* 定義輸入資料的函式 */ void input(char car[],char data[]){ printf("請輸入 %s 資料:\n",car); gets(data); } int check(){ /* 檢查輸入的資料 */ unsigned int i; /* 判斷車款資料是否全為字母 */ for (i=0; i #include main(){ char string[60]; /* 儲存從鍵盤輸入字串的陣列 */ int number[26]; /* 儲存 26 個字母數目的陣列 */ unsigned int i; /* 迴圈變數 */ int count=0,j=0; /* 計數變數與輸出格式控制變數 */ for (i=0;i<26;i++) /* 將陣列內容初始值定為 0 */ number[i]=0; printf("請輸入一個英文字串\n"); gets(string); for (i=0; i #include main(){ /* 隨意設定的字串 */ char *str="fi A&*Efw14e E$fEF fHk5+,fV-"; int i; /* 迴圈變數 */ /* 依次大寫字母、小寫字母、標點與特殊符號、空白字 */ /* 元的計數變數 */ int upcase=0,lowcase=0,punct=0,space=0; printf("字串 %s\n",str); for (i=0; iEID); /* 輸出結構體內成員的數值 */ printf("員工姓名 %s\n",ptr->name); printf("\n"); /* 結構體指位器變數從螢幕 */ printf("員工號碼 %05d\n",(*ptr).EID); /* 輸出結構體內成員的數值 */ printf("員工姓名 %s\n",(*ptr).name); } /* Ch15_09.c */ struct person /* 個人資料的結構體 */ { char name[10]; char addr[10]; int age; }; void printdata(struct person); /* 宣告輸出資料的函式 */ main(){ /* 宣告結構體變數 mydata, 並指定初始值 */ struct person mydata={"王小明","台北市",35}; printdata(mydata); /* 呼叫函式並將結構體變數當引數傳遞 */ } /* 輸出結構體變數值的函式 */ void printdata(struct person data){ printf("姓名: %s\n",data.name); printf("地區: %s\n",data.addr); printf("年齡: %d\n",data.age); } /* Ch15_10.c */ struct customer{ int amount; /* 消費金額 */ char name[10]; /* 姓名 */ }; /* 宣告引數資料型別為結構體的函式 */ void PrintRecord(struct customer); main(){ struct customer record; printf("請輸入顧客姓名,\n"); scanf("%s",&record.name); printf("請輸入消費金額\n"); scanf("%d",&record.amount); PrintRecord(record); /* 呼叫函式並將結構體變數以引數方式傳遞 */ } void PrintRecord(struct customer x){ printf("\n顧客 %s 消費了 %d 元\n",x.name,x.amount); } /* Ch15_11.c */ struct person{ char name[10]; /* 姓名 */ char city[10]; /* 縣市 */ int age; /* 年齡 */ }; /* 輸入資料的函式 */ void readdata(struct person*); main(){ struct person student; readdata(&student); printf("\n"); printf("姓名: %s\n",student.name); printf("縣市: %s\n",student.city); printf("年齡: %d\n",student.age); } /* 定義輸入資料的函式內容 */ void readdata(struct person *p){ printf("請輸入您的姓名:\n"); scanf("%s",p->name); /* 輸入姓名 */ printf("請輸入您居住的縣市:\n"); gets(p->city); /* 輸入縣市 */ printf("請輸入您的年齡:\n"); scanf("%d",&p->age); /* 輸入年齡 */ } /* Ch15_12.c */ struct person{ char name[10]; /* 姓名 */ char city[10]; /* 縣市 */ int age; /* 年齡 */ }; /* 輸入資料的函式 */ void readdata(struct person[]); int i; /* 迴圈變數 */ main(){ struct person student[3]; readdata(student); printf("\n"); printf(" 姓名 縣市 年齡\n"); for (i=0;i<3;i++) printf("%s %s %d\n", student[i].name,student[i].city,student[i].age); } /* 輸入 3 筆資料的函式 */ void readdata(struct person array[]){ for (i=0;i<3;i++){ /* 控制輸入 3 筆資料的迴圈 */ printf("請依序輸入第 %d 筆姓名、居住的縣市與年齡:\n",i+1); scanf("%s %s %d", array[i].name,array[i].city,&array[i].age); } } /* Ch15_13.c */ struct grade{ int chinese; int math; int english; }; struct student{ int ID; char name[10]; struct grade gd; /* 結構體的成員為其他的結構體 */ }ss1={1,"王小明",87,98,78}; main(){ printf("座號 %d\n",ss1.ID); printf("姓名 %s\n",ss1.name); printf("國文 %d\n",ss1.gd.chinese); printf("數學 %d\n",ss1.gd.math); printf("英文 %d\n",ss1.gd.english); } /* Ch15_14.c */ struct grade{ /* 宣告結構體 grade, 成員為各科的成績 */ int chinese; /* 國文成績 */ int math; /* 數學成績 */ int english; /* 英文成績 */ }; /* 宣告結構體 student, 成員為學生的資料 */ struct student{ int ID; char name[10]; /* 學生姓名 */ /* 結構體 grade 也成為結構體 student 的成員 */ struct grade gd; int sum; /* 成績總和 */ float avg; /* 成績平均 */ /* 宣告結構體變數並設定初始值 */ }ss[3]={1,"王小明",87,98,78,0,0, 2,"陳小華",97,68,78,0,0, 3,"黃小英",80,78,98,0,0}; main(){ int i; printf("座號 姓名 國文 數學 英文 總和 平均\n"); printf("-------------------------------------\n"); for (i=0;i<3;i++){ printf("%2d",ss[i].ID); printf("%10s",ss[i].name); printf("%5d",ss[i].gd.chinese); printf("%5d",ss[i].gd.math); printf("%5d",ss[i].gd.english); ss[i].sum=ss[i].gd.chinese+ ss[i].gd.math+ss[i].gd.english; ss[i].avg=ss[i].sum/3.0; printf("%5d",ss[i].sum); printf("%6.2f",ss[i].avg); printf("\n"); } } /* Ch15_15.c */ #include #include main(){ time_t timep; /* 用來取得總秒數的變數 */ struct tm *p; /* 用來取得詳細時間資訊的結構體變數 */ while (1) /* 無窮迴圈 */ { time(&timep); /* 取得 1970 年元旦至今的總秒數 */ p=localtime(&timep); /* 轉換成 tm 格式 */ printf("%d:%d:%d\n",p->tm_hour,p->tm_min,p->tm_sec); system("cls"); /* 清除螢幕 */ } } /* Ch15_16.c */ #include struct stuff{ char name[10]; int price; }; /* 宣告交換數值陣列中位置的函式 */ void swap(struct stuff[],int,int); main(){ int i,j; /* 迴圈變數 */ /* 宣告結構體變數為矩陣並定義陣列內容 */ struct stuff list[8]={"可樂",17, "果汁",15, "餅乾",5, "肉乾",25, "便當",50, "礦泉水",10, "口香糖",12, "糖果",3 }; for (i = 0;i<8;i++) /* 氣泡排序法的外迴圈 */ for (j = 0;j<8;j++) /* 氣泡排序法的內迴圈 */ /* 比較結構體成員中的售價變數值 */ if (list[i].price union paid /* 宣告共同空間 paid */ { char card[17]; int cash; }money; main(){ int amount,option; printf("請輸入應付金額:\n"); scanf("%d",&amount); printf("付款方式(1)信用卡 (2)現金\n"); scanf("%d",&option); if (option==1) /* 選擇付款方式 */ { printf("請輸入卡號\n"); gets(money.card); if (strlen(money.card) != 16) printf("卡號錯誤, 交易取消\n"); else printf("交易成功!!\n"); } else{ printf("請入付款金額:"); scanf("%d",&money.cash); if (money.cash < amount) printf("金額不足, 交易取消!!\n"); else printf("交易成功, 找您 %d 元\n",money.cash-amount); } } /* Ch16_03.c */ #include struct company /* 宣告結構體 company */ { char comp_name[30]; /* 公司名稱 */ char comp_ID[9]; /* 統一編號 */ char phone[12]; /* 電話號碼 */ }; struct person /* 宣告結構體 person */ { char name[20]; /* 姓名 */ char ID[11]; /* 身分證字號 */ char phone[12]; /* 電話號碼 */ }; union service /* 兩個結構體的共同空間 */ { struct company group; struct person one; }type; main(){ int option; printf("歡迎使用 \"大台北地區\" 電話號碼登錄系統\n"); do { printf("請選擇用戶種類 (1)公司 (2)個人\n"); scanf("%d",&option); }while(option !=1 && option !=2); if (option==1){ printf("請輸入公司的名稱:\n"); gets(type.group.comp_name); printf("請輸入統一編號:\n"); gets(type.group.comp_ID); printf("請輸入公司登記的電話號碼:(02-xxxxxxxx)\n"); gets(type.group.phone); if (strlen(type.group.comp_ID)!=8 || strlen(type.group.phone)!=11) printf("輸入資料錯誤, 無法登錄"); else printf("登錄成功!!"); } else{ printf("請輸入您的姓名:\n"); gets(type.one.name); printf("請輸入身分證字號:\n"); gets(type.one.ID); printf("請輸入您的電話號碼:(02-xxxxxxxx)\n"); gets(type.one.phone); if (strlen(type.one.ID)!=10 || strlen(type.one.phone)!=11) printf("輸入資料錯誤, 無法登錄"); else printf("登錄成功!!"); } } /* Ch16_04.c */ main(){ typedef char *STRING1; /* 定義新型別 STRING */ typedef char STRING2[60]; STRING1 theory1="彩虹, 是一種光線折射的現象..."; STRING2 theory2="溫度計, 是利用熱漲冷縮的原理..."; printf("%s\n",theory1); printf("%s\n",theory2); } /* Ch16_05.c */ typedef struct person /* 定義結構體的新資料型別 */ { char name[10]; char addr[10]; int age; } PRN; main(){ PRN student={"王","台灣",20}; printf(" %s 先生在 %d 歲時搬到 %s 居住\n",student.name, student.age,student.addr); } /* Ch16_06.c */ enum animal {tiger,horse,bird,dog}; /* 宣告列舉型別 */ main(){ printf("%d %d %d %d\n",tiger,horse,bird,dog); } /* Ch16_07.c */ /* 定義一星期七天為列舉型別 week 的成員 */ enum week{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun}weekday; main(){ char *ewname[]={"Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday", "Sunday" }; /* 一周七天的英文名稱 */ char *cwname[]={"星期一","星期二","星期三", "星期四","星期五","星期六", "星期日" }; /* 一周七天的中文名稱 */ printf(" 中文 英文\n"); /* 輸出一周中每天的中英文名稱 */ for (weekday=Mon;weekday<=Sun;weekday++) printf("%6s %s\n",cwname[weekday-1],ewname[weekday-1]); } /* Ch16_08.c */ #include /* 宣告出 42 顆球 */ typedef struct lotto{ int value; /* 此顆球出現的次數 */ int position; /* 此顆球的號碼 */ }num; main(){ /* 儲存 42 組號碼與其出現次數的陣列 */ num number[42]; /* i、j、k、x 是迴圈變數, temp 是暫存變數 */ int i,j,k,x,temp; randomize(); /* 利用系統時間當成亂數種子 */ printf("執行幾次? \n"); scanf("%d",&x); for (i=0;i<42;i++){ number[i].value=0; /* 將次數歸零 */ /* 將數字 1~42 依序填入陣列結構體成員 */ number[i].position=i+1; } for (i=0;i number[j].value){ temp=number[i].value; number[i].value=number[j].value; number[j].value=temp; temp=number[i].position; number[i].position=number[j].position; number[j].position=temp; } printf("出現次數最多的七個號碼:"); for (i=0;i<7;i++) /* 從螢幕輸出出現次數最多的前 7 個數字 */ printf(" %d ",number[i].position); printf("\n"); } /* Ch16_09.c */ enum week {Sun,Mon,Tue,Wed,Thu,Fri,Sat}weekday; /* 宣告列舉型別 */ main(){ int i; printf("今天是星期幾? (0~6 星期日~星期六)\n"); scanf("%d",&i); printf("特價商品是:"); weekday=i; /* 以列舉型別的變數來接受螢幕輸入的數值 */ switch (weekday) /* 選擇從螢幕輸出字串的條件式 */ { case Mon: printf("紅燒牛熱麵\n"); break; case Tue: printf("酸辣湯餃\n"); break; case Wed: printf("小籠包\n"); break; case Thu: printf("酥炸雞腿飯\n"); break; case Fri: printf("大魯麵\n"); break; case Sat: printf("招牌套餐\n"); break; case Sun: printf("本日公休\n"); break; default: printf("不想吃別搗蛋!!\n"); } } /* Ch16_10.c */ #include #include int attackmode(int,int,int); /* 攻擊結果判斷 */ int defensemode(int,int,int); /* 防禦結果判斷 */ union action /* 將攻擊與防禦的動作宣告為共同空間 */ { int att; /* 攻擊方式 */ int def; /* 防禦方式 */ }; typedef struct Hero /* 遊戲者資料的結構體 */ { union action hact; /* 攻擊動作 */ int hblood; /* 生命值 */ }GOOD; /* 自訂新型別 */ typedef struct Monster /* 電腦敵人資料的結構體 */ { union action mact; /* 攻擊動作 */ int mblood; /* 生命值 */ }BAD; /* 自訂新型別 */ main(){ int option; GOOD me; /* 宣告結構體變數 me */ BAD you; /* 宣告結構體變數 you */ me.hblood=3; /* 設定遊戲者的生命值 */ you.mblood=3; /* 設定電腦敵人的生命值 */ randomize(); /* 取得亂數種子的函式 */ do{ printf("請選擇攻擊方式 (1)拳頭(2)腳踢(3)劍擊\n"); scanf("%d",&me.hact.att); system("cls"); /* 清除螢幕 */ you.mact.def=rand()%3; /* 亂數產生電腦敵人防禦方式 */ you.mblood=attackmode(me.hact.att,you.mact.def,you.mblood); printf("您的生命值剩下 %d\n",me.hblood); printf("敵人生命值剩下 %d\n",you.mblood); printf("請選擇防禦方式 (1)低頭(2)往上跳(3)格擋\n"); scanf("%d",&me.hact.def); system("cls"); /* 清除螢幕 */ you.mact.att=rand()%3; /* 亂數產生電腦敵人攻擊方式 */ me.hblood=defensemode(me.hact.def,you.mact.att,me.hblood); printf("您的生命值剩下 %d\n",me.hblood); printf("敵人生命值剩下 %d\n",you.mblood); }while(me.hblood!=0&&you.mblood!=0); if (me.hblood==0&&you.mblood==0) printf("平手\n"); else if (me.hblood!=0) printf("您贏了\n"); else printf("您輸了\n"); } /* 判斷攻擊結果的函式 */ int attackmode(int att,int def,int blood){ if (att!= def){ printf("攻擊得分\n"); return blood-1; } else{ printf("攻擊無效\n"); return blood; } } /* 判斷防禦結果的函式 */ int defensemode(int def,int att,int blood){ if (att!= def){ printf("防禦失敗\n"); return blood-1; } else{ printf("防禦成功\n"); return blood; } } /* Ch17_01.c */ main(){ FILE *stream; char filename[15]; /* 檔案名稱 */ printf("請輸入欲開啟的檔案名稱:"); gets(filename); stream=fopen(filename,"r"); if (stream!=NULL) /* 判斷傳回值為 NULL 或者是位址 */ printf("%s 檔以唯讀模式開啟成功!!\n",filename); else printf("檔案開啟失敗!!\n"); if (fclose(stream) == EOF) /* 以傳回值來判斷關閉檔案是否成功 */ printf("關閉 %s 檔失敗!!\n",filename); else printf("關閉 %s 檔成功!!\n",filename); } /* Ch17_02.c */ #include main(){ FILE *stream; int num; /* 用來取得 fgetc() 傳回的數值 */ int sum=0; /* 用來儲存字元總數 */ stream=fopen("file.txt","r"); if (stream== NULL){ printf("檔案開啟失敗!!\n"); return 0; }else{ /* 檔案開啟成功, 開始讀取檔案中的字元 */ printf("檔案開啟成功!!\n"); /* 逐字元讀取檔案資料直到檔案結束 */ while ((num=fgetc(stream)) != EOF) if (isalpha(num)!=0) /* 判斷非空白字元的字元 */ sum=sum+1; /* 若為字元則總數加 1 */ printf("總共有 %d 個字元\n",sum); fclose(stream); } } /* Ch17_03.c */ #include main(){ FILE *stream; char string[100]; /* fgets() 讀取的字串 */ char search[100]; /* 搜尋字串 */ unsigned int length; /* 搜尋字串的長度 */ int flag=0; /* 旗標變數 */ stream=fopen("dictionary.txt","r"); if (stream == NULL){ printf("檔案開啟失敗"); return 0; }else{ printf("電子字典檔案開啟!!\n"); printf("請輸入欲查詢的英文單字:\n"); gets(search); length=strlen(search); printf("查詢結果:\n"); while (fgets(string,30,stream)!=NULL){ /* 讀取字串直到資料讀完為止 */ if (strncmp(string,search,length)==0){ printf("%s",string); /* 從螢幕輸出函式 fgets() 所讀取的字串 */ flag=1; } } if (flag==0) printf("查無此字!!\n"); fclose(stream); } } /* Ch17_04.c */ main(){ int age; char name[8],phone[11]; FILE *stream; stream=fopen("addbook.txt","r"); if (stream==NULL){ printf("檔案開啟失敗!!\n"); return 0; }else{ printf(" 姓名 電話 年齡\n"); printf("--------------------------\n"); while ((fscanf(stream,"%s %s %d",name,phone,&age))!= EOF) printf("%6s %11s %4d\n",name,phone,age); fclose(stream); } } /* Ch17_05.c */ main(){ FILE *stream; char string[30]; int count=0; stream=fopen("file.txt","r"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ printf("檔案開啟成功\n"); while (fscanf(stream,"%s",string) != EOF){ /* 逐字讀取 */ printf("%s ",string); /* 將讀取的單字顯示在螢幕上 */ count++; /* 每讀一個字, 便加上 1 */ } printf("\n總共有 %d 個單字\n",count); fclose(stream); } } /* Ch17_06.c */ main(){ FILE *stream; char name[10],phone[11],choice; stream=fopen("addressbook.txt","a"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ do{ printf("請輸入姓名\n"); gets(name); /* 從鍵盤輸入姓名 */ printf("請輸入電話號碼(xx-xxxxxxxx)\n"); gets(phone); /* 從鍵盤輸入電話 */ fprintf(stream,"%10s %11s\n",name,phone); /* 將資料寫入檔案 */ printf("輸入完畢, 輸入下一筆? (y/n)\n"); choice=getch(); }while(choice=='y'); fclose(stream); } } /* Ch17_07.c */ main(){ FILE *stream1,*stream2; char character; stream1=fopen("addressbook.txt","r"); stream2=fopen("adbook.txt","w"); if (stream1 == NULL || stream2 == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ while ((character=fgetc(stream1))!= EOF) /* 利用迴圈, */ fputc(character,stream2); /* 每讀一個字元便寫入一個字元 */ fclose(stream1); fclose(stream2); } } /* Ch17_08.c */ #include #include main(){ FILE *stream1; FILE *stream2; char string[10]; stream1=fopen("olddata.txt","r"); stream2=fopen("newdata.txt","w"); if (stream1 == NULL || stream2 == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ /* 讀取單字並存在字串陣列中 */ while (fscanf(stream1,"%s",string) != EOF){ string[0]=toupper(string[0]); /* 將第一個字母改成大寫 */ fprintf(stream2,"%s ",string); /* 將更改後的單字寫入新檔案 */ } fclose(stream1); fclose(stream2); } } /* Ch17_09.c */ struct student{ char name[5]; /* 學生姓名 */ int chinese; /* 國文成績 */ int english; /* 英文成績 */ int math; /* 數學成績 */ int sum; /* 成績總和 */ float avg; /* 成績平均 */ }; main(){ struct student data[5]; /* 宣告 student 結構體的陣列 */ FILE *stream1; FILE *stream2; int i; stream1=fopen("gradedata.txt","r"); stream2=fopen("gradeoutput.txt","w"); if (stream1 == NULL || stream2 == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ fprintf(stream2,"姓名 國文 英文 數學 總和 平均\n"); for (i=0;i<5;i++){ fscanf(stream1,"%s",data[i].name); /* 讀取姓名資料 */ fscanf(stream1,"%d",&data[i].chinese); /* 讀取國文成績 */ fscanf(stream1,"%d",&data[i].english); /* 讀取英文成績 */ fscanf(stream1,"%d",&data[i].math); /* 讀取數學成績 */ /* 計算總和*/ data[i].sum=data[i].chinese+data[i].english+data[i].math; data[i].avg=data[i].sum/3.0; /* 計算平均 */ fprintf(stream2,"%5s %5d %5d %5d %5d %6.2f\n", data[i].name,data[i].chinese,data[i].english, data[i].math,data[i].sum,data[i].avg); /* 將結果寫入檔案 */ } fclose(stream1); fclose(stream2); } } /* Ch17_10.c */ #include #include main(){ int file; file=open("Ch17_10.c",O_RDONLY); /* 開啟一個檔案 */ if (file!=-1) printf("檔案開啟成功!!\n"); else printf("檔案開啟失敗!!\n"); close(file); /* 關閉開啟的檔案 */ } /* Ch17_11.c */ #include #include #define SIZE 512 main(){ int f1,f2; /* 兩個檔案的檔案編號 */ int readbytes; /* 讀取的字數 */ int buffer[SIZE]; /* 當成緩衝區的陣列 */ f1=open("file1.txt",O_RDONLY); /* 將檔案開啟成唯讀模式 */ f2=open("file2.txt",O_WRONLY); /* 將檔案開啟成寫入模式 */ if (f1 == -1 || f2 == -1){ printf("檔案開啟失敗!!"); return 0; }else{ while (eof(f1)!=1){ readbytes=read(f1,buffer,SIZE); /* 取得每次讀取的字元數 */ write(f2,buffer,readbytes); /* 將讀取的字元數寫入檔案中 */ } close(f1); close(f2); } } /* Ch17_12.c */ main(){ FILE *stream; char ch; int position; stream=fopen("file1.txt","r"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ /* 取得讀取前的檔案指位器位置 */ position=ftell(stream); printf("開啟檔案後, 檔案指位器所指位置: %d bytes\n",position); /* 讀取所有的檔案資料 */ while ((ch=fgetc(stream))!=EOF); /* 取得讀取後的檔案指位器位置 */ position=ftell(stream); printf("讀完檔案後, 檔案指位器所指位置: %d bytes\n",position); } } /* Ch17_13.c */ main(){ FILE *stream; char ch; int position; stream=fopen("file1.txt","r"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ position=ftell(stream); /* 取得讀取前的檔案指位器位置 */ printf("開啟檔案後, 檔案指位器所指位置: %d bytes\n",position); while ((ch=fgetc(stream))!=EOF); position=ftell(stream); /* 取得讀取後的檔案指位器位置 */ printf("讀完檔案後, 檔案指位器所指位置: %d bytes\n",position); rewind(stream); /* 將檔案指位器歸回檔案開頭 */ position=ftell(stream); /* 取得目前的檔案指位器位置 */ printf("經過迴帶後, 檔案指位器所指位置: %d bytes\n",position); } } /* Ch17_14.c */ #include main(){ FILE *stream; char string[60]; unsigned int i; stream=fopen("idiom.txt","r"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ while (fgets(string,60,stream)!=NULL){ for (i=0;i') fseek(stream,1,SEEK_CUR); else printf("%c",string[i]); } } } /* Ch17_15.c */ #include main(){ FILE *stream; char ch; int count1=0,count2=0,count3=0; stream=fopen("超冷笑話.txt","r"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ while ((ch=fgetc(stream)) != EOF){ if (isascii(ch)!=0){ /* 檢驗字元是否為 ASCII 碼 */ if (isalpha(ch)!=0) /* 檢驗字元是否為字母 */ count1++; else count3++; }else{ count2++; fseek(stream,1,SEEK_CUR); /* 跳過一個字元不讀 */ } } printf("總共有 %d 個字母 \n",count1); printf(" %d 個中文字 \n",count2); printf(" %d 個其他字元\n",count3); fclose(stream); } } /* Ch17_16.c */ #include main(){ char time[5]; char phone[11]; FILE *stream; stream=fopen("note.txt","r+"); if (stream==NULL){ printf("開啟檔案失敗!!\n"); return 0; }else{ printf("更改暫離訊息的內容\n"); printf("請輸入新的時間:"); gets(time); printf("請輸入新的電話:"); gets(phone); /* 將檔案指位器指向時間位置 */ fseek(stream,16,SEEK_SET); fputs(time,stream); /* 將檔案指位器指向電話號碼位置 */ fseek(stream,43,SEEK_SET); fputs(phone,stream); fclose(stream); } } /* Ch17_17.c */ #define SIZE 60 main(){ char str1[SIZE]; char str2[SIZE]; int i=0; FILE *stream1; FILE *stream2; stream1=fopen("item.txt","r"); /* 開啟供讀取的資料流 */ stream2=fopen("item.txt","r+"); /* 開啟供寫入的資料流 */ if (stream1==NULL||stream2==NULL){ printf("開檔失敗\n"); return 0; }else{ /* 讀取檔案中的資料 */ while (fgets(str1,SIZE,stream1) !=NULL){ i++; printf("%s->",str1); gets(str2); /* 寫入新的的字串 */ fprintf(stream2,"%02d %s -> %s\n",i,str1,str2); } fclose(stream1); fclose(stream2); } } /* Ch17_18.c */ #include struct person{ char name[10]; char phonenumber[11]; }data; main(){ FILE *stream1; char target[10]; char option,flag=0; stream1=fopen("myaddbook.txt","r"); if (stream1==NULL){ printf("檔案開啟失敗!!\n"); return 0; }else{ printf("請選擇功能(a)列出名單(b)人名搜尋\n"); option=getch(); if (option=='a'){ while (fscanf(stream1,"%s",data.name)!=EOF){ /* 讀取姓名資料 */ fscanf(stream1,"%s",data.phonenumber); /* 讀取電話資料 */ printf("%10s %s\n",data.name,data.phonenumber); } }else{ printf("請輸入搜尋名稱\n"); gets(target); while (fscanf(stream1,"%s",data.name)!=EOF){ fscanf(stream1,"%s",data.phonenumber); /* 讀取電話資料的字串 */ if (strcmp(data.name,target)== 0){ /* 比較搜索的字串與讀取字串 */ flag=1; break; } } if (flag==1) printf("搜尋結果 %s\n",data.phonenumber); else printf("無此電話\n"); } fclose(stream1); } } /* Ch17_19.c */ main(){ FILE *stream1,*stream2; int letter[26]={0},i; char ch; stream1=fopen("news.txt","r"); stream2=fopen("count.txt","w"); if (stream1==NULL){ printf("檔案開啟失敗!!\n"); return 0; }else{ while ((ch=fgetc(stream1))!=EOF){ if (ch>='A' && ch<='Z'){ /* 判斷是否為大寫字母 */ i=(int)ch-65; /* 辨識為哪一個大寫字母 */ letter[i]++; /* 該大寫字母數目加 1 */ }else if (ch>='a' && ch<='z'){ /* 判斷是否為小寫字母 */ i=(int)ch-97; /* 辨識為哪一個小寫字母 */ letter[i]++; /* 該小寫字母數目加 1 */ } } for (i=0;i<26;i++) /* 把所有字母數顯示在螢幕上 */ fprintf(stream2," %c or %c : %d 個\n",65+i,97+i,letter[i]); fclose(stream1); fclose(stream2); } } /* Ch17_20.c */ main(){ FILE *stream; int amount,price,sum=0; char string[60]; stream=fopen("products.txt","r"); if (stream == NULL){ printf("檔案開啟失敗\n"); return 0; }else{ while (fscanf(stream,"%s",string)!= EOF){ /* 讀取貨物名稱 */ fscanf(stream,"%d",&price); /* 讀取單價 */ printf("%s 單價: %d 數量: ",string,price); scanf("%d",&amount); /* 從鍵盤輸入數量 */ sum=sum+amount*price; /* 計算總和 */ } printf("總和 %d 元\n",sum); fclose(stream); } }