我們很多的學生不會寫程式, 考其原因無非是因為學生不會畫流程圖. 根據我的經驗, 只要學生會畫流程圖, 無論用什麼電腦語言, 都可以寫出程式來的. 現在靜宜大學的王孝熙院長整理出 30 個流程圖, 如果給學生看, 他們絕對會懂得如何設計流程圖, 當然也就會寫程式了. 因此, 我在這裡附上王院長整理出來的資料, 這是非常珍貴的資料, 對大家教書絕對有用, 希望大家不僅採用, 也好好推廣. 我聽說王院長即將推出更多的範例, 有些會比目前的要難, 這些都會有助於學生寫程式. 王院長的做法史無前例, 可是我們想想, 我們教國文或者教英文, 甚至於教數學, 不也是給學生多看文章, 多看例題嗎? 我也忍不住要在此推銷我寫的書 < 人人都能學會寫程式 > 聯經出版社出版, 這本書的好處就是裡面有幾十個流程圖的範例, 我始終認為我們拚命地教複雜的語法, 而不教學生如何邏輯化的思考, 乃是緣木求魚, 搞不出所以然出來的. 李家同 愛的種子必須親手撒出, 而且每次只有一粒 語出德蕾莎修女 he seed of love must be spread out by your own hand and once at a time. Mother heresa 李家同孫運璿榮譽講座教授博幼社會福利基金會董事長劃撥帳號 :22482053 (300) 新竹市光復路清華大學資訊工程系 網站 http://erdos.csie.ncnu.edu.tw/~rctlee/article/index.htm acebookhttps://www.facebook.com/people/%e6%9d%8e%e5%ae%b6%e5%90%8c/1 00007748738834 助理 : 林小姐 03-5715131,x35047
靜宜大學資訊學院 程式設計解題範例 中華民國一 三年四月十六日
目錄 目錄... I 程式範例 01 名稱 : 階乘計算... 1 程式範例 02 名稱 : 輸出 * 三角形... 4 程式範例 03 名稱 : 判斷日期先後順序... 8 程式範例 04 名稱 : 密文解碼... 11 程式範例 05 名稱 : 字串在檔案中出現的位置... 14 程式範例 06 名稱 : 左 / 右大括號個數的差異值... 18 程式範例 07 名稱 : 亂數產生器... 22 程式範例 08 名稱 : 比較兩個字串的大小... 26 程式範例 09 名稱 : 計算左 / 右小括號的個數... 29 程式範例 10 名稱 : 摩斯密碼解碼器... 33 程式範例 11 名稱 : 數字排序後的乘積... 38 程式範例 12 名稱 : 八進位制轉十進位制... 41 程式範例 13 名稱 : 三角形判斷... 43 程式範例 14 名稱 : 最接近的質數... 46 程式範例 15 名稱 : 數字排序後的平均... 49 程式範例 16 名稱 : 發鈔票... 52 程式範例 17 名稱 : 三角函數值... 55 程式範例 18 名稱 : 絕對值最小的乘積... 58 程式範例 19 名稱 : 二進位制的加法... 62 程式範例 20 名稱 : 最大公因數及最小公倍數... 65 程式範例 21 名稱 : 數字比對... 68 程式範例 22 名稱 : 字串取代... 74 程式範例 23 名稱 : 密碼檢驗... 76 程式範例 24 名稱 : 字串對稱檢驗... 79 程式範例 25 名稱 : 英文字母大小寫更換... 82 程式範例 26 名稱 : 將字串 URL 轉換成檔案路徑... 86
程式範例 27 名稱 : 將字串 URL 轉換成檔案 ( 目錄 ) 路徑... 89 程式範例 28 名稱 : 輸入數字總合計算... 93 程式範例 29 名稱 : email 格式檢查... 96 程式範例 30 名稱 : 輸入數字總合計算... 102 II
一 程式範例描述 : 請以遞迴的函式計算 n! 的值 程式範例 01 名稱 : 階乘計算 二 輸入說明 : 正整數 n,n<10 三 輸出說明 : 輸出 n! 的值 四 輸入範例 : 3 4 5 五 輸出範例 : 6 24 120 1
六 流程圖 : start int num; scanf("%d",&num); num<10 printf("%d!=%d",num,recursive(num)); End recursive n==1 Return 1 return n*recursive(n 1); 2
七 程式碼 : #include <stdio.h> #include <stdlib.h> #define MAX_LEN 255 int recursive(int n); int main() int num; scanf("%d",&num); if(num<10) printf("%d!=%d",num,recursive(num)); return 0; int recursive(int n) if(n==1) return 1; else return n*recursive(n-1); 3
程式範例 02 名稱 : 輸出 * 三角形 一 程式範例描述 : 輸出下面的 * 三角形, 接著輸出提示字串 "Press `x' to quit, or any other key to continue." 待使用者按 x 鍵結束程式, 或按其他任意鍵要求重複輸出下列 * 三角形 以及提示字串 * ** *** **** ***** ****** ******* Press x to quit, or any other key to continue. 二 輸入說明 : 任意鍵 三 輸出說明 : 當使用者按 x 鍵則結束程式 ; 按其他任意鍵則重複輸出 * 三角形 以及提示字串 四 輸入範例 : 略 五 輸出範例 : 略 4
六 流程圖 : SAR 主程式 呼叫 triangle() 輸入任意數 a a == a && a!= x No Yes 呼叫 triangle() END 輸入任意數 a 5
SAR 副程式 (triangle()) i = 1 i <= 7 No Yes j =1 印出提示字串 j <= i No Yes END 印出一顆星星 6
七 程式碼 : #include <stdio.h> #include <stdlib.h> int main(void) char a; for(a == 'a';a!= 'x';) triangle(); a = getch(); return 0; int triangle(void) int i,j; for(i = 1;i <= 7;i++) for(j = 1;j <= i;j++) printf("*"); printf("\n"); printf("please 'x' to quit,or any other key to continue.\n"); 7
程式範例 03 名稱 : 判斷日期先後順序一 程式範例描述 : 輸入日期 A 與日期 B 若日期 A 在 B 之前, 輸出 Before ; 若日期 A 在 B 之後, 輸出 After ; 若日期 A 與 B 相同, 輸出 Same 二 輸入說明 : 兩個日期 A 與 B, 格式為 dd/mm/yyyy 日期之間以空格隔開 三 輸出說明 : 兩個日期 A 與 B 的先後關係 四 輸入範例 : 04/05/1999 20/02/1995 04/05/1999 20/02/2003 20/02/2003 20/02/2003 五 輸出範例 : After Before Same 8
六 流程圖 : 9
七 程式碼 : #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct int y,d,m; aaa; char* check(int a,int b) if(b>a) return "Before"; else if(a>b) return "After"; else return "Same"; main(void) aaa A,B; char *ae="after"; while(scanf("%d/%d/%d %d/%d/%d",&a.d,&a.m,&a.y,&b.d,&b.m,&b.y)>0) ae=check(a.y,b.y); if(strcmp("same",ae)==0) ae=check(a.m,b.m); if(strcmp("same",ae)==0) ae=check(a.d,b.d); if(strcmp("same",ae)==0) printf("%s\n",ae); else printf("%s\n",ae); else printf("%s\n",ae); else printf("%s\n",ae); system("pause"); 10
程式範例 04 名稱 : 密文解碼 一 程式範例描述 : 某公司為了避免在網路上傳輸的訊息被竊取, 所以將所有的英文字母做移位, 再傳給客戶 假設傳輸的文字只考慮 26 個大寫英文字母, 且移位規則如下 : 原來字母 A B C X Y Z 轉換後字母 D E A B C 請將客戶收到的已移位訊息自動轉回原來的文字 二 輸入說明 : 一段編碼過的文字, 該文字由 26 個大寫英文字母組成 三 輸出說明 : 將收到的文字解碼 四 輸入範例 : DSSOH CRR 五 輸出範例 : APPLE ZOO 11
六 流程圖 : SAR scanf("%s",a)>0 len=strlen(a); for(i=0;i<len;i++) a[i]>='a'&&a[i ]<='C' RUE ALSE a[i]+=23 a[i]>'c'&&a[i] <='Z' a[i] =3 printf("%s\n",a); 12
七 程式碼 : #include<stdio.h> #include<stdlib.h> #include<string.h> main(void) char a[255]; int len,i; while(scanf("%s",a)>0) len=strlen(a); for(i=0;i<len;i++) if(a[i]>='a'&&a[i]<='c') a[i]+=23; else if(a[i]>'c'&&a[i]<='z') a[i] =3; printf("%s\n",a); system("pause"); 13
程式範例 05 名稱 : 字串在檔案中出現的位置一 程式範例描述 : 某檔案 內含多個字串, 相鄰兩個字串之間以空格或跳行隔開 底下是檔案 的範例 輸入一個字串 s ( 例如 apple ), 試查詢 s 在檔案 中出現的位置 ( 答案為 4, 因為 apple 是檔案中的第四個字串 ); 若找不到, 則輸出 -1 his is an apple. his is an app. 二 輸入說明 : 字串 s 三 輸出說明 : 字串 s 在檔案 中出現的所有位置 四 輸入範例 : Is his app 五 輸出範例 : -1 1 5 8 14
六 流程圖 : SAR int local=1,flag=0; char [1000]=0,s[10]=0; READ string s ILE *fp = fopen("input.txt","r"); fscanf(fp,"%s",) (fscanf(fp,"%s",))!=eo [strlen()-1]=='.' [strlen()-1]='\0'; 15
local++; flag==0 printf(" 1"); END 16
七 程式碼 : #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) int local=1,flag=0; char [1000]=0,s[10]=0; scanf("%s",s); ILE *fp = fopen("input.txt","r"); while( (fscanf(fp,"%s",))!=eo ) if([strlen()-1]=='.') [strlen()-1]='\0'; if(strcmp(s,)==0) printf("%d ",local); flag=1; local++; if(flag==0) printf("-1"); system("pause"); return 0; 17
程式範例 06 名稱 : 左 / 右大括號個數的差異值 一 程式範例描述 : 檢查 C 程式碼中左大括號和右大括號的個數是否相等 二 輸入說明 : 一段 C 程式碼 三 輸出說明 : 計算左大括號和右大括號個數的差異值 N 若 N=0 則輸出 OK"; 若 N<0 則輸出 左括號較右括號少 N 個 "; 若 N>0 則輸出 左括號較右括號多 N 個 " 四 輸入範例 : if (a >b ) a++; else b--; if (a >b ) a++; else b--; if (a >b ) a++; else b--; 五 輸出範例 : 左括號較右括號多 1 個 OK 左括號較右括號少 1 個 六 流程圖 : 18
SAR m = 0, n = 0, L =, R = 輸入一段 C 程式碼 i = 0 i < sizeof(c) No Yes L == c[i] Yes No m++ R == c[i] Yes No n++ 19
m n == 0 Yes No 印出 OK m n > 0 Yes No 印出 比 多幾個 m n < 0 Yes No 印出 比 多幾個 END 20
7 程式碼 : stop #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) char L = '', R = ''; // 設 L 和 R 各為左右大括號 int m = 0,n = 0; // 計算左右大括號各有幾個 char c[100] = 0; printf(" 請輸入一段 C 程式碼 :"); gets(c); int i; for(i = 0;i < sizeof(c);i++) if(l == c[i]) m++; if(r == c[i]) n++; if(m - n == 0) printf("ok"); else if(m - n > 0) printf(" 左括號比右括號多 %d 個 ",(m - n)); else printf(" 右括號比左括號多 %d 個 ",(n - m)); return 0; 21
程式範例 07 名稱 : 亂數產生器 一 程式範例描述 : 隨機產生 N 個整數, 並計算其平均值 二 輸入說明 : 正整數 N,N<100,000 三 輸出說明 : 輸出 N 個隨機產生的整數以及它們的平均值 整數值介於 0 到 10 之間 四 輸入範例 : 6 五 輸出範例 : 0 9 7 3 6 4 Mean=4.83 22
六 流程圖 : SAR 設定亂數因子 輸入 n N >= 100000 Yes No 提示警語 Yes N >= 100000 No 呼叫副程式 IA() END 23
SAR( 副程式 IA()) sum = 0.0 i = 0 i < m No Yes num = 1~10 的亂數 印出亂數的平均 sum = sum + num END 印出 num 24
七 程式碼 : #include <stdio.h> #include <stdlib.h> #include <time.h> // time() void IA(int m) // 亂數顯示以及平均的副程式 int i,num; double sum = 0.0; for(i = 0;i < m;i++) num = rand()%10+1; //1~10 的亂數 sum += num; printf("%d\t",num); printf(" 亂數的平均為 :%f",(sum/m)); int main(void) srand(time(null)); // 設定亂數種子 int n; do printf(" 請問要隨機產生幾個整數 ( 小於 100000):"); scanf("%d",&n); if(n>=100000) printf("%d 超過 10000, 請重新輸入 ",n); while(n >= 100000); IA(n); return 0; 25
程式範例 08 名稱 : 比較兩個字串的大小一 程式範例描述 : 請寫出函式 mystrcmp(), 讓它和函式 strcmp() 一樣可以比對兩個字串的大小 當然, 程式中不可調用函式 strcmp() 二 輸入說明 : 輸入兩個字串 str1 和 str2 三 輸出說明 : 如果 str1 和 str2 相等則輸出 0; 如果 str1 小於 str2 則輸出 -1; 如果 str1 大於 str2 則輸出 1 四 輸入範例 : abc abc cd fghijk fghijk cd 五 輸出範例 : 0-1 1 26
六 流程圖 : str1,str2 is the user input Start Read str1,str2 mystrcmp(str1,str2) End mystrcmp(a[],b[]) f=calculate_length(a) s=calculate_length(b) length=f s Length<0 Length==0 Length>0 printf( 1 ); printf( 0 ); printf( 1 ); 27
calculate_length (char x[]) Length=strlen(x) return length 七 程式碼 :C 語言程式碼 #include <stdio.h> #include <stdlib.h> #include <time.h> void todo(int s) int i=0; double sum=0.0; for(i=0;i<s;i++) int num=rand()%10; sum+=num; printf("%d\t",num); printf("average: %lf",sum/s); int main(int argc, char *argv[]) srand(time(null)); int n=0; do printf("\ninput:"); scanf("%d",&n); if(n>=100000) printf("he number (%d)is bigger than 99999,please input the number(<=99999)",n ); while(n>=100000); todo(n); system("pause"); return 0; 28
一 程式範例描述 : 程式範例 09 名稱 : 計算左 / 右小括號的個數 輸入包含左 / 右小括號之四則運算式, 判斷左 / 右小括號的個數是否匹配 二 輸入說明 : 包含左 / 右小括號之四則運算式, 運算式最長為 40 字元 三 輸出說明 : 若運算式中左小括號的個數與右小括號的個數相同, 則輸出 YES ; 反之, 則輸出 NO 四 輸入範例 : ((1+2)-3)*(4/5) (((1+2+3) ((1+2)*(3+4)*(5+6))/(7+8) 五 輸出範例 : YES NO YES 六 流程圖 : 29
Start END ch=getchar()!=e O ch=='\n' right==left printf("no\n"); printf("yes\n"); left=0; right=0; 30
ch=='(' left++; ch==')' right++; 31
七 程式碼 : #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) int left=0; int right=0; char ch; while((ch=getchar())!=eo) if(ch=='\n') if(right==left) printf("yes\n"); else printf("no\n"); left=0; right=0; else if(ch=='(') left++; else if(ch==')') right++; system("pause"); return 0; 32
程式範例 10 名稱 : 摩斯密碼解碼器 一 程式範例描述 : 請設計一個摩斯密碼的解碼器 摩斯密碼表如下 : A. B. C. D. E.. G. H. I. J. K. L. M. N. O. P. Q. R. S.. U. V. W. X. Y. Z. 二 輸入說明 : 一串摩斯密碼 相鄰的兩個摩斯密碼以 字元隔開 三 輸出說明 : 摩斯密碼解碼後的訊息 四 輸入範例 : 五 輸出範例 : SOS HANK 33
六 流程圖 : start char str[80] ]; scanf("%s",&str); Char *test=strtok(str," "); true char c=check(test); printf("%c",c); test= =strtok(null," "); test!= '\0' false End 34
Char check(char a[]) if(a[0]=='-'&&a[1]=='.' false if(a[0]=='-'&&a[1]=='.' false &&a[2]=='.'&&a[3]==' &&a[2]=='-'&&a[3]==' true true return 'B'; return 'C'; if(a[0]=='.'&&a[1]=='.' &&a[2]=='-'&&a[3]=='. false true 依題目所給的 return ''; 對照表依此類 推 END 35
七 程式碼 : #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) char check(char a[]) if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.') return 'B'; if(a[0]=='-'&&a[1]=='.'&&a[2]=='-'&&a[3]=='.') return 'C'; if(a[0]=='.'&&a[1]=='.'&&a[2]=='-'&&a[3]=='.') return ''; if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='.') return 'H'; if(a[0]=='.'&&a[1]=='-'&&a[2]=='-'&&a[3]=='.') return 'J'; if(a[0]=='.'&&a[1]=='-'&&a[2]=='.'&&a[3]=='.') return 'L'; if(a[0]=='.'&&a[1]=='-'&&a[2]=='-'&&a[3]=='.') return 'P'; if(a[0]=='-'&&a[1]=='-'&&a[2]=='.'&&a[3]=='-') return 'Q'; if(a[0]=='.'&&a[1]=='.'&&a[2]=='.'&&a[3]=='-') return 'V'; if(a[0]=='-'&&a[1]=='.'&&a[2]=='.'&&a[3]=='-') return 'X'; if(a[0]=='-'&&a[1]=='.'&&a[2]=='-'&&a[3]=='-') return 'Y'; if(a[0]=='-'&&a[1]=='-'&&a[2]=='.'&&a[3]=='.') return 'Z'; if(a[0]=='-'&&a[1]=='.'&&a[2]=='.') return 'D'; if(a[0]=='-'&&a[1]=='-'&&a[2]=='.') return 'G'; if(a[0]=='-'&&a[1]=='.'&&a[2]=='-') return 'K'; if(a[0]=='-'&&a[1]=='-'&&a[2]=='-') 36
return 'O'; if(a[0]=='.'&&a[1]=='-'&&a[2]=='.') return 'R'; if(a[0]=='.'&&a[1]=='.'&&a[2]=='.') return 'S'; if(a[0]=='.'&&a[1]=='.'&&a[2]=='-') return 'U'; if(a[0]=='.'&&a[1]=='-'&&a[2]=='-') return 'W'; if(a[0]=='.'&&a[1]=='.') return 'I'; if(a[0]=='-'&&a[1]=='-') return 'M'; if(a[0]=='-'&&a[1]=='.') return 'N'; if(a[0]=='.'&&a[1]=='-') return 'A'; if(a[0]=='-') return ''; if(a[0]=='.') return 'E'; char str[80]; scanf("%s",&str); char *test=strtok(str," "); while(test!='\0') char c=check(test); printf("%c",c); test=strtok(null," "); system("pause"); return 0; 37
一 程式範例描述 : 程式範例 11 名稱 : 數字排序後的乘積 輸入任意 8 個整數, 找出這些整數中第二大及第二小的數, 將這二個數的乘積輸出 二 輸入說明 : 8 個不重複的整數, 數與數之間用 space 隔開 三 輸出說明 : 整數 ( 第二大及第二小的乘積 ) 四 輸入範例 : 1 2 8 3 6 4 5 7-1 2 8-3 6 4-5 -7 5 10 15 20 2 4 6 8 五 輸出範例 : 14-30 60 38
六 流程圖 : f ( start for( i=0;i<size;i++) true scanf("%d",&input[i]); alse qsort(input, sizeof(input)/sizeof(*input), sizeof(*input), comp); printf("%d\n",input[1]*input[size 2]); END 39
七 程式碼 : #include <stdio.h> #include <stdlib.h> const int size = 8; int comp (const void * elem1, const void * elem2) int f = *((int*)elem1); int s = *((int*)elem2); if (f > s) return 1; if (f < s) return 1; return 0; int main() int input[size]; int i; for( i=0;i<size;i++) scanf("%d",&input[i]); qsort(input, sizeof(input)/sizeof(*input), sizeof(*input), comp); printf("%d\n",input[1]*input[size 2]); system("pause"); 40
一 程式範例描述 : 將八進位制之數值轉成十進位 程式範例 12 名稱 : 八進位制轉十進位制 二 輸入說明 : 八進位制的正整數 ( 只有 0, 1, 2, 3, 4, 5, 6, 7) 三 輸出說明 : 十進位制的正整數 四 輸入範例 : 13 777 1234 五 輸出範例 : 11 4095 668 41
六 流程圖 : start scanf("%o",&i) false scanf("%o",&i))!=eo printf("%d\n",i); true end 七 程式碼 : #include <stdlib.h> #include <stdio.h> int main(void) int i; while((scanf("%o",&i))!=eo) printf("%d\n",i); system("pause"); return 0; 42
程式範例 13 名稱 : 三角形判斷一 程式範例描述 : 輸入 3 個邊長, 判斷 3 個邊長是否可以組成一個三角形 ( 邊長皆大於零且任意兩邊和大於第三邊 ) 二 輸入說明 : 三個整數, 數與數用 space 隔開 三 輸出說明 : 輸出 YES 表示三個整數可構成三角形 輸出 NO 表示三個整數不可構成三角形 四 輸入範例 : 3 2 1 2 3 4 2 5-8 五 輸出範例 : NO YES NO 43
六 流程圖 : SAR Read a, b and c a>0 & b>0 & c>0 a+b>c b+c>a a+c>b printf("no"); printf("yes"); 44
七 程式碼 : #include <stdio.h> #include <stdlib.h> int main() int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a>0 && b>0 && c>0) if(a+b>c) if(b+c>a) if(a+c>b) printf("yes"); else printf("no"); else printf("no"); else printf("no"); 45
一 程式範例描述 : 程式範例 14 名稱 : 最接近的質數 輸入一正整數, 求最接近該整數但不小於該整數之質數 二 輸入說明 : 一個正整數 三 輸出說明 : 輸出質數 四 輸入範例 : 101 2002 1234 五 輸出範例 : 103 2003 1237 46
六 流程圖 : Start Read num x=num+1 isprime(x) isprime(x)=0 x++ Print x 47
isprime(n) n=1 n=2 n%2= tmp=sqrt(n ) Return 0 Return 0 Return 0 n%i=0 i=i+2 i<tmp 七 程式碼 : #include <stdio.h> #include <stdlib.h> int main(void) int num,x; scanf("%d",&num); x = num+1; while(isprime(x)==0) // 當 x 不是質數就將 x 值增加 1 x++; printf("%d",x); int isprime(int n) int i,tmp; if(n == 1) return 0; if(n == 2) return 1; if(n%2==0) return 0; tmp =(int)sqrt(n); for(i=3; i<=tmp;i+=2) if(n%i==0) return 0; return 1; 48
一 程式範例描述 : 程式範例 15 名稱 : 數字排序後的平均 輸入 10 個正整數, 請找出最大與最小整數的平均 二 輸入說明 : 10 個正整數, 數與數之間用 space 隔開 三 輸出說明 : 正數 四 輸入範例 : 1 3 9 3 9 6 3 3 4 5 2 7 11 12 20 5 10 4 3 40 9 7 5 3 1 0 2 4 6 8 五 輸出範例 : 5 21 4.5 49
六 流程圖 : SAR const int size = 10; int input[size]; int i=0; i<size scanf("%d",&input[i]); i++; qsort(input,sizeof(input)/ sizeof(*input),sizeof(*input),comp); printf("%.1f\n",(input[0]+input[size 1])/2.0); END 50
int comp (const void * elem1, const void * elem2) int f = *((int*)elem1); int s = *((int*)elem2); f > s f < s Return 0 Return 1 Return 1 七 程式碼 : /* 15 */ #include <stdio.h> #include <stdlib.h> const int size = 10; int comp (const void * elem1, const void * elem2) int f = *((int*)elem1); int s = *((int*)elem2); if (f > s) return 1; if (f < s) return 1; return 0; int main() int input[size]; int i=0; for(i=0;i<size;i++) scanf("%d",&input[i]); qsort(input,sizeof(input)/sizeof(*input),sizeof(*input),comp); printf("%.1f\n",(input[0]+input[size 1])/2.0); //system("pause"); 51
程式範例 16 名稱 : 發鈔票一 程式範例描述 : 某國共發行了 1,5,10,50,100 不同面額的鈔票, 若有人要從銀行領出 N 元, 銀行行員要如何發給鈔票, 則使用的張數會最少 二 輸入說明 : 正整數 三 輸出說明 : 1-N 1, 5-N 2, 10-N 3, 50-N 4, 100-N 5 (N 1, N 2, N 3, N 4, N 5 為大於等於零的整數 ) 四 輸入範例 : 478 1022 555 五 輸出範例 : 1-3, 5-1, 10-2, 50-121, 100-4 1-2, 5-0, 10-2, 50-0, 100-10 1-0, 5-1, 10-0, 50-1, 100-5 52
六 流程圖 : SAR int M[5] = 1, 5, 10, 50, 100; int number[5] = 0,0,0,0,0; int i,j,m; scanf("%d",&m); j = 5 1; j >= 0; number[j] = m / M[j]; m %= M[j]; j; printf("%d %d",m[0],number[0]); i=1; i<5 printf(", %d %d",m[i],number[i]); i++; END 53
七 程式碼 : #include <stdio.h> #include <stdlib.h> int main() int M[5] = 1, 5, 10, 50, 100; int number[5] = 0,0,0,0,0; int i,j,m; scanf("%d",&m); for (j = 5 1; j >= 0; j) number[j] = m / M[j]; m %= M[j]; // 算出該種錢幣用量 printf("%d %d",m[0],number[0]); for(i=1;i<5;i++) printf(", %d %d",m[i],number[i]); 54
程式範例 17 名稱 : 三角函數值一 程式範例描述 : 利用 Sin 及 Cos 函數 寫一程式印出 Sin 及 Cos 函數之值, 從 0 度到 180 度, 每隔 15 度算一次 輸出的函數值只保留小數點後三位 二 輸入說明 : 無 三 輸出說明 : 輸出 0 15 30 45 60 75 90 180 的 Sin 及 Cos 函數值 四 輸入範例 : 無 五 輸出範例 : 0 15 30 45 60 75 90. 180 Cos 1.000????? 0.000? Sin 0.000????? 1.000? 55
六 流程圖 : SAR #define PI 3.14159265 const int interval = 15; double p = 0.0; int size = 180/interval; int i = 0; printf("%10s",""); i+=interval i<=10 printf("\n%10s","cos"); printf("%10d",i); printf("\n%10s","sin"); i<=size i<=size printf("%10d",i); p+=interval p+=interval printf("\n"); END printf("%10.3f",sin( p* PI / 180.0)); 56
七 程式碼 : /* 17 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.14159265 int main() const int interval = 15; double p = 0.0; int size = 180/interval; int i = 0; printf("%10s",""); for(i=0 ;i<=180;i+=interval) printf("%10d",i); printf("\n%10s","cos"); for(i=0,p = 0.0;i<=size;i++,p+=interval) printf("%10.3f",cos ( p*pi / 180.0)); printf("\n%10s","sin"); for(i=0,p = 0.0;i<=size;i++,p+=interval) printf("%10.3f",sin( p* PI / 180.0)); printf("\n"); system("pause"); 57
一 程式範例描述 : 程式範例 18 名稱 : 絕對值最小的乘積 輸入五個整數, 任取二個數相乘, 輸出這些乘積中絕對值最小者 二 輸入說明 : 五個整數, 數與數之間用 space 隔開 三 輸出說明 : 整數 四 輸入範例 : 2-5 7-2 1 3 4 5-6 -7-3 4 5-2 -1 五 輸出範例 : 2 12 2 58
六 流程程圖 : Start Read num[0] && num[1] && num[2] && num[3] && num[4] (num[0] && num[1] && num[2] && num[3] && num[4])!=eo num[i]= =exchange( (num[i]) i++ i<5 j=0 i=0 num[i]>num[i+1] 59
num[i]=num[i]+num[i+1]; num[i+1] =num[i] num[i+1]; num[i]= num[i] num[i+1]; i++ i<4 j++ j<4 printf("%d\ \n",num[0]*num[1]) Stop 60
七 程式碼 : #include <stdio.h> #include <stdlib.h> #define exchange(a) ((a)<0 )? (-1*a) : (a) int main(int argc, char *argv[]) char ch; int num[5]; while((scanf("%d %d %d %d %d",&num[0],&num[1],&num[2],&num[3],&num[4]))!=eo) int i; for(i=0;i<5;i++) num[i] = exchange(num[i]); int j; for(j=0;j<4;j++) for(i=0;i<4;i++) if(num[i]>num[i+1]) num[i] = num[i]+num[i+1]; num[i+1] = num[i]-num[i+1]; num[i] = num[i]-num[i+1]; printf("%d\n",num[0]*num[1]); system("pause"); return 0; 61
一 程式範例描述 : 程式範例 19 名稱 : 二進位制的加法 假設有一系統採 2 進位制 ( 只有 0, 1), 寫一程式可做二個 2 進位制之數之加法 二 輸入說明 : 兩個二進位制的整數, 數與數之間用 space 隔開 三 輸出說明 : 二進位制的整數 四 輸入範例 : 111 1 1000 1001 10101 1010 五 輸出範例 : 1000 10001 11111 62
六 流程圖 : Start add(a,b) Read a && b a!=0 b!=0 (a && b)!=eo add(a,b) sum[i++]=(a %10+b%10+remain )%2; remain=(a %10 + b %10 + remain ) / 2; a = a/10; b = b/10; Sto remain!= sum[i++]=remain i i>= printf("%d",sum[i ]) printf("\n") Stop 63
七 程式碼 : #include <stdio.h> void add(int,int); int main() long int a,b; while(scanf("%ld %ld",&a,&b)!=eo) add(a,b); system("pause"); return 0; void add(int a,int b) int i=0,remain= 0,sum[20]; while(a!=0 b!=0) sum[i++] = (a %10 + b %10 + remain ) % 2; remain = (a %10 + b %10 + remain ) / 2; a = a/10; b = b/10; if(remain!=0) sum[i++] = remain; --i; while(i>=0) printf("%d",sum[i--]); printf("\n"); 64
一 程式範例描述 : 程式範例 20 名稱 : 最大公因數及最小公倍數 計算兩個正整數的最大公因數及最小公倍數 二 輸入說明 : 兩個正整數, 數與數之間用 space 隔開 三 輸出說明 : 最大公因數 :S, 最小公倍數 : (S 及 為正整數 ) 四 輸入範例 : 27 18 1000 49 200 40 五 輸出範例 : 最大公因數 :9, 最小公倍數 :54 最大公因數 :1, 最小公倍數 :49000 最大公因數 :40, 最小公倍數 :200 65
六 流程圖 : nu nu nu t printf(" S sca umber%i== i> res i+ i< umber=num umber1=nu Sta numbe max= max= " 最大公因 Sto nf("%d =0&&num res sult=i ++ <m mber/resu umber1/re art er>num numb =numb 因數 :%d, 最小 ber ult; esul 小公倍 66
七 程式碼 : #include <stdio.h> #include <stdlib.h> int main() int number=0,number1=0; int result=0,result1=0; int max=0; int i=0; while(scanf("%d %d",&number,&number1)) if(number>number1) max=number; else max=number1; for(i=1;i<max;i++) if(number%i==0&&number1%i==0) if(i>result) result=i; number=number/result; number1=number1/result; result1=number*number1*result; printf(" 最大公因數 :%d, 最小公倍數 :%d\n",result,result1); system("pause"); return 0; 67
程式範例 21 名稱 : 數字比對一 程式範例描述 : 由電腦亂數產生五個不重複的正整數, 使用者輸入五個不重複的正整數, 請計算出使用者輸入之正整數與電腦亂數產生之正整數相同之個數 二 輸入說明 : 電腦亂數產生五個不重複之正整數, 使用者輸入五個不重複之正整數 三 輸出說明 : 輸出總共有幾個數字相同的數量 四 輸入範例 : 1.( 電腦亂數產生 ) 3 7 9 10 11 2.( 使用者的輸入 ) 3 7 10 13 9 五 輸出範例 : 4 68
六 流程圖 : equ( int random[],int length,int r) int i; i<lengt i+ ++ random[i] == r return 1; return 0; int comp (const void * elem1, const void * elem2) int f = *((int*)elem1); int s = *((int*)elem2); f>s return 1; f<s return 1; return 0; 69
int arrayequal(int random[],int input[],int length) int i,j; int count = 0; int randomlength = length; int inputlength = length; i++; i<randomlength j++ j<inputlength random[i]==input[j] return count; random[i]= 1; input[j]= 1; count++; 70
int main() srand(time(null)); int input[size]; int random[size]; int temp; i<size rue i++ temp = rand()%100; equ(random,i,temp) i ; random[i] = temp; qsort(random,sizeof(random)/sizeof(*random),sizeof(*random),comp); i++ i<size printf("\n"); i<size printf("%d ",random[i]); i++ qsort(input,sizeof(input)/sizeof( *input),sizeof(*input),comp); scanf("%d",&input[i]); printf("%d ",arrayequal(random,input,size)); 71
七 程式碼 : /* 21 */ #include <stdio.h> #include <stdlib.h> #include <time.h> const int size = 5; int equ(int random[],int length,int r) int i; for( i=0;i<length;i++) if(random[i] == r) return 1; return 0; ; int comp (const void * elem1, const void * elem2) int f = *((int*)elem1); int s = *((int*)elem2); if (f > s) return 1; if (f < s) return -1; return 0; ; // 回傳陣列中有幾個值一樣 int arrayequal(int random[],int input[],int length) int i,j; int count = 0; int randomlength = length; int inputlength = length; for(i = 0;i<randomLength;i++) for(j=0;j<inputlength;j++) if(random[i]==input[j]) random[i]=-1; input[j]=-1; count++; return count; int main() srand(time(null)); int input[size]; int random[size]; int temp; int i; for(i=0;i<size;i++) temp = rand()%100; if(equ(random,i,temp)) i--; 72
continue; random[i] = temp; qsort(random,sizeof(random)/sizeof(*random),sizeof(*random),comp); for(i=0;i<size;i++) printf("%d ",random[i]); printf("\n"); for(i=0;i<size;i++) scanf("%d",&input[i]); qsort(input,sizeof(input)/sizeof(*input),sizeof(*input),comp); printf("%d ",arrayequal(random,input,size)); 73
一 程式範例描述 : 程式範例 22 名稱 : 字串取代 將輸入的字串中所有的換行符號 ( \n ) 以 <BR> 取代, 並且輸出已被取代的字串 二 輸入說明 : 一段含有換行字元 ( \n ) 的字串 三 輸出說明 : 已經用 <BR> 取代換行符號 ( \n ) 的字串 四 輸入範例 : his is a iphone5s Where can I buy it? How much for it? 五 輸出範例 : his is a iphone5s<br>where can I buy it?<br>how much for it? 六 流程圖 : Start Char a[255]; while(gets(a)>0) fals End true printf("%s<br>",a); 74
七 程式碼 : #include<stdio.h> #include<stdlib.h> #include<string.h> main(void) char a[255]; while(gets(a)>0) printf("%s<br>",a); 75
程式範例 23 名稱 : 密碼檢驗一 程式範例描述 : 輸入四個數字的密碼, 分別以一個空白字元隔開, 螢幕上不顯示輸入之數字而是顯示四個 '*', 若密碼與內部密碼 1 2 3 4 比對結果正確則輸出 CORREC", 否則輸出 " INCORREC" 二 輸入說明 : 輸入四個數字 三 輸出說明 : CORREC 或者 INCORREC 四 輸入範例 : 1. 1 2 3 4 ( 密碼 : 1 2 3 4) 2. 2 5 12 3 ( 密碼 : 1 2 3 4) 五 輸出範例 : 1. CORREC 2. INCORREC 76
六 流程圖 : start 註解 [w1]: char ch1[10]='1','2','3','4'; flag!=4 lag==4 ch=getch(); printf("\"corre C\"\n"); printf("\"inc ORREC\"\n "); ch==' ' 結束 putchar('*') ; flag++; i++; if(ch1[i]==ch ) check+ +; check--; 77
七 程式碼 : #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() char ch; char ch1[10]='1','2','3','4'; int i=0; int check=0; int flag=0; while(flag!=4) ch=getch(); if(ch==' ') flag++; i++; else putchar('*'); if(ch1[i]==ch) check++; else check--; if(check==4) printf("\"correc\"\n"); else system("pause"); return 0; printf("\"incorrec\"\n"); 78
程式範例 24 名稱 : 字串對稱檢驗一 程式範例描述 : 輸入一個只有英文字母的字串, 檢查左右各半的子字串的字母是否對稱 若為偶數則檢查左右各半子字串, 若為奇數則以中間字母的分界點, 檢查左右各半子字串 若對稱則輸出 YES, 反則輸出 NO 二 輸入說明 : 輸入一個只有英文字母的字串 三 輸出說明 : 輸出 YES 或者 NO 四 輸入範例 : 1. ABCDDCBA 2. ABCDXDCBA 3. ABCDABCD 五 輸出範例 : 1. YES 2. YES 3. NO 79
六 流程圖 : SAR char input[200]; int head,tail; int charremain; int chararraysize; int flag = 1; scanf("%s",input); c hararraysize = strlen(input); head = 0; tail = chararraysize 1; charremain = chararraysize: charremain >1 input[head]!= input[tail] flag = 0; break; head++,tail,charremain =2 printf("%s\n",flag==1?"yes":"no"); END 80
七 程式碼 : /* 24 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() char input[200]; int head,tail; int charremain; int chararraysize; int flag = 1; scanf("%s",input); chararraysize = strlen(input); for(head = 0,tail = chararraysize 1,charRemain = chararraysize;charremain >1;head++,tail,charRemain =2) if(input[head]!= input[tail]) flag = 0; break; printf("%s\n",flag==1?"yes":"no"); system("pause"); 81
程式範例 25 名稱 : 英文字母大小寫更換一 程式範例描述 : 輸入一段以英文字母的組成的字串, 並且將字串中開頭與所有位於句點之後的第一個非大寫的英文字母改成大寫 二 輸入說明 : 輸入一段英文字母的字串, 最少有一句點後第一個字母為英文小寫字母 三 輸出說明 : 輸出開頭與所有句點後第一個字母皆為大寫的字串 四 輸入範例 : his is a book. that is a pen. they are students." this is a iphone5s. it is a nice phone. I will buy it. 五 輸出範例 : his is a book. hat is a pen. hey are students. his is a iphone5s. It is a nice phone. I will buy it. 82
六 流程圖 : I++ scanf("%c",&string[i]) string[i]='\0'; i=0;i<strlen(string);i++ string[i]=='.' flag=1; flag==1 string[i]>=97 && string[i]<=122 string[i] =32; flag=0; 83
string[i] string[i]>=65 && string[i]<=90>=65 lag=0 printf("%s",string) 84
七 程式碼 : #include <stdio.h> #include <string.h> // his is a book. that is a pen. they are students. int main() char string[80],ch; int i=0,flag=0; while( scanf("%c",&string[i]) ) if(string[i]=='\n') break; i++; string[i]='\0'; for(i=0;i<strlen(string);i++) if(string[i]=='.') flag=1; if(flag==1) if(string[i]>=97 && string[i]<=122) string[i] =32; flag=0; else if(string[i]>=65 && string[i]<=90) flag=0; printf("%s",string); return 0; 85
程式範例 26 名稱 : 將字串 URL 轉換成檔案路徑一 程式範例描述 : 輸入字串後, 若格式符合將會依照其字串轉換成 url 後開啟該檔案, 並且可以輸入字串進入該檔案以測試是否成功 二 輸入說明 : 輸入./user.txt or /home/chwong/c_program/user.txt ( 絕對路徑 or 相對路徑皆可使用 ) 三 輸出說明 : 成功後可開啟輸入的檔案名稱, 即可看到剛剛輸入的字串 四 輸入範例 : >>./user.txt >> Your ile opened successfully.ype: >> est for c program 五 輸出範例 : 打開 user.txt est for c program 86
六 流程圖 : char filepath[256]; char string[256]; printf("please choose a file.\n>>"); fgets(filepath,256,stdin); char *p_chr=strchr(filepath,'\n'); p_chr!= NULL *p_chr='\0' ILE *file; printf("your url is wrong!") (file = fopen(filepath,"a")) printf("your ile opened successfully."); printf("ype:\n>>"); gets(string,256,stdin); getchar(); 87
七 程式碼 : #include <stdio.h> #include <string.h> main() char filepath[256]; char string[256]; printf("please choose a file.\n>> "); fgets(filepath, 256, stdin); char *p_chr=strchr(filepath, '\n'); if(p_chr!= NULL) *p_chr='\0'; ILE *file; if((file = fopen(filepath, "a"))!= NULL) printf("your ile opened successfully."); printf("ype : \n>> "); fgets(string, 256, stdin); fprintf(file, "%s", string); else printf("your url is wrong!"); getchar(); return 0; 88
程式範例 27 名稱 : 將字串 URL 轉換成檔案 ( 目錄 ) 路徑 一 程式範例描述 : 輸入兩個字串, 一為 URL, 另一個是 DocRoot 轉換方式是將 URL 中的 http://host:port/ 部分以 DocRoot 的值取代 二 輸入說明 : 兩個字串名稱為 URL,DocRoot URL 字串內容為一個完整的網址路徑的資料格式,DocRoot 字串的內容為一個電腦檔案路徑的資料格式 URL = "http://www.cs.pu.edu.tw:8080/bcc/exam/test1.htm" DocRoot = "C:/apache/www/" 三 輸出說明 : 將 URL 字串中的 http://host:port/ 部分, 以 DocRoot 的值取代並輸出 四 輸入範例 : URL = "http://www.cs.pu.edu.tw:8080/bcc/exam/test1.htm" DocRoot = "C:/apache/www/" 五 輸出範例 : "C:/apache/www/bcc/exam/test1.htm" 89
六 流程圖 : SAR READ URL and DOCROO i++; i<strlen(url) url[i]==':' flag++; flag==2 url[i]=='/' flag=3; 90
flag==3 doc[length+ (j++) 1]=url[i]; doc[length+ (j) 2]='\"'; doc[length+ (j) 1]='\0'; printf("%s",doc); 91
七 程式碼 : #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) char url[100]=0,doc[200]=0; int i=0,flag=0,j=0; printf("url = "); scanf("%s",url); printf("docroot = "); scanf("%s",doc); int length=strlen(doc); for(i=0;i<strlen(url);i++) if(url[i]==':') flag++; if(flag==2) if(url[i]=='/') flag=3; else if(flag==3) doc[length+ (j++) -1]=url[i]; doc[length+ (j) -2]='\"'; doc[length+ (j) -1]='\0'; printf("%s",doc); system("pause"); return 0; 92
一 程式範例描述 : 程式範例 28 名稱 : 輸入數字總合計算 輸入一字串, 統計出 : 字串中包含的數之總和 二 輸入說明 : 輸入的字串由英文字母 數字 空白組成 ( 句子前面可能有空白, 兩 words 的間隔空白可能不只一個 ) 三 輸出說明 : 輸出字串中包含的數之總和 四 輸入範例 : 25 is 5 5 book 100 五 輸出範例 : 135 93
六 流程圖 程式開始 輸入字串 帶進 get 函式 While 判斷字元是否為 /0 是 將數字存進 sum Num=0; 否 If 判斷字元是 否為數字 否 是 把讀取到的第一個字元存在 num = num*10 + ( 讀取到的字元 ); 程式結束 94
七 程式碼 : #include <stdio.h> int get(const char *str) if (!str) return 0; int sum = 0; int num = 0; while(*(str++)!='\0') if(*str < '0' *str > '9') if(num > 0) sum += num; num = 0; continue; num = num*10 + (*str - '0'); return sum; int main(int argc, char **argv) int x = 0; char s[100]; gets(s); int i=0; for(i=100-2;i>=0;i--) s[i]=s[i-1]; s[0]='c'; x = get(s); printf("ans= %d", x); 95
程式範例 29 名稱 : email 格式檢查 一 程式範例描述 : 輸入一個字串, 程式會檢查該字串是否具合法的 email 格式 二 輸入說明 : 任一個字串, 中間不允許空格 三 輸出說明 : 輸出訊息, 表示輸入字串是否具合法之 email 格式 四 輸入範例 : xyz@asia.com.tw abc.com@a 五 輸出範例 : 您輸入之字串 : xyz@asia.com.tw 具合法之 email 格式您輸入之字串 : abc.com@a 不符合 email 之格式 96
六 流程圖 97
98
99
七 程式碼 : #include <stdio.h> #include <string.h> #define RUE 1 #define ALSE 0 int main(int argc, char* argv[]) char *ptr,str[100] ; int i,length,at=0,dot=0; int check = ALSE; printf(" 輸入字串 :"); scanf("%s",str); length = strlen(str); // 計算輸入之字串長度利於迴圈計算 printf(" 你輸入之字串 :%s",str); ptr = str; // 透過指標讀取字串值, 利於操作起始位置 for(i=0 ; i<length ; i++) // 做第一次完整的 String travel if( *(ptr+i) =='@' ) ptr = ptr + i; length = length - i; at++; // 找出 String 是否有 @ 字元存在 // 將指標位置指向 @ 字元存在位置 // 將第二次 String travel 的 length // 扣掉已經跑過的 @ 前半段 // 找到 at 並記數 int dot_index[10] ; // 此陣列用以儲存 dot 的位置 for(i=0 ; i<length ;i++) if( *(ptr+i) =='.' ) // 尋找. 的位置 if(i==1 i==length-1) //. 不可以在 @ 之後或字串最後 check = ALSE; break; // 違反規定則不需繼續判斷 else dot_index[dot++] = i; // 過濾掉不符合的. 在頭尾 // 條件後將 dot 的位置記錄於 dot_index 中, 並計算 dot 數量 check = RUE; 100
if(check) // 最後的判斷, 若前面已經違反格式條件則不必再做 if(dot == 0) // 如果 String 裡面沒有 dot 則格式不符合 check = ALSE; else if(dot == 1 ) // 若只有一個 dot 則不做特別判斷 check = RUE; else for(i=1 ; i<dot ; i++) if(dot_index[i]-dot_index[i-1] == 2 ) // 將兩個以上 dot 的位置相減, 若兩個 dot 之間只有一個字元, 格式不符合 check = ALSE; else check = RUE; if(check && at==1)// 最後判斷,@ 的個數只能有一個, 並符合其他條件 else printf(" 具合法之 email 格式 \n"); printf(" 不符合 email 之格式 \n"); return 0; 101
程式範例 30 名稱 : 輸入數字總合計算 1 程式範例描述 : 輸入一字串, 統計出 : 字串中包含的數之總和 2 輸入說明 : 輸入的字串由英文字母 數字 空白組成 ( 句子前面可能有空白, 兩 words 的間隔空白可能不只一個 ) 3 輸出說明 : 輸出字串中包含的數之總和 4 輸入範例 : 25 is 5 5 book 100 5 輸出範例 : 102
6 流程圖 : Start gets(s) s[i]=s[i 1]; i i>=0 s[0]='c'; x= get(s); printf("ans= %d", x); Stop 103
get(const char *str)!str return 0; *(str++)!= '\0' *str < '0' *str > '9' num > 0 sum += num; num = 0; continue; num=num*10+(*str '0'); return sum; Stop 104
7 程式碼 : #include <stdio.h> int get(const char *str) if (!str) return 0; int sum = 0; int num = 0; while(*(str++)!='\0') if(*str < '0' *str > '9') if(num > 0) sum += num; num = 0; continue; num = num*10 + (*str - '0'); return sum; int main(int argc, char **argv) int x = 0; char s[100]; gets(s); int i=0; for(i=100-2;i>=0;i--) s[i]=s[i-1]; s[0]='c'; x = get(s); printf("ans= %d", x); 105