--- title: 'HW4 Answer' disqus: hackmd --- 作業4 === [TOC] ## 手寫題(請把題號答案寫在紙上) 3. C函數如果沒有指定傳回值型態,預設傳回值型態是__int__。函數如果沒有傳回值,其傳回值型態是__void__。 在建立void mySum(void)函數後,請寫出主程式main()函數呼叫此函數的程式碼 ``` int main(){ mySum(); } ``` 4. 請試著寫出一個名為void myName(void)函數,在主程式main()函數呼叫myName()函數,就可以顯示讀者的姓名字串。 ``` void myName(void){ printf("李承恩"); } ``` 5. 請說明什麼是函數的原型宣告和定義? ``` 函數原型宣告: [回傳值的型別] [function名稱] ( [傳進來的參數] ) 函數定義:函數標頭與大括號的程式區塊 寫得差不多就給全對 ``` 6. 請寫出下列函數的傳回值型態,如下所示: int printErrorMsg(int err_no); long readRecord(int recNo, int size); void printMsg(void); ``` int long void ``` 7. 請寫出下列3個函數的原型宣告和傳回值型態,如下所示: ``` void test1(float x, int y, float z) { printf("x=%f\n", x); printf("y=%d\n", y); printf("z=%f\n", z); } Ans. void test1(float, int, float) ; void ``` ``` void test2(float x, int y, char c) { printf("x= %fy = %d\n", x, y); printf("c=%c\n", c); } Ans. void test2(float, int, char) ; void ``` ``` float test3(float x) { return (float) (x * 3.1415926); } Ans. float test3(float) ; float ``` 8. 請說明函數形式參數(formal parameters)和實際參數(actual parameters)的差異?(老師提供答案,這題不用寫,考試可能會考概念) ``` 函數定義的參數稱為「形式參數」(formal parameters)或「假參數」(dummy parameters),參數列的形式參數是識別字,其角色如同變數,需要指定資料型態, 並且可以在函數的程式碼區塊中使用,如果參數不只一個,請使用「,」符號分隔。 呼叫函數的參數稱為「實際參數」(actual parameters),參數可以是常數值、變數或運算式,其運算結果的值需要和形式參數宣告的資料型態相同 (編譯程式會強迫型態轉換成相同資料型態),函數的每一個形式參數都需要對應一個相同資料型態的實際參數。 ``` 9. 請在C程式建立void printStars(int n)函數,函數傳入顯示幾行的int參數(n),可以顯示使用「*」星號建立的正三角形圖形(提示:需要使用三層巢狀迴圈),如下圖所示: ``` * * * * * * * * * * * * * * * * * * * * * * * * * * * * ``` ``` Ans. void printStar(int n){ int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n-i;j++){ printf(" "); } printf("*"); for(j=1;j<i;j++){ printf(" *"); } printf("\n"); } } ``` 11. 請指出下列abs()函數的哪些行程式碼是錯誤的,如下所示: ```gherkin= int abs(int n) ; { if ( n < 0 ) { (-n) }; else return no; } ``` ``` Ans. int abs(int n){ if( n < 0 ){ return (-n);} else return n; } ``` 15. 請說明何謂傳值與傳址參數呼叫?C語言是如何執行函數的傳址呼叫? ``` 傳值呼叫:複製參數的值傳到函數,在進入函數時,另外配置不同的記憶體空間暫存其複製的參數值,在函數裡面更改的值不會影響原本傳進函數的參數值。 傳址呼叫:將參數的記憶體位址傳到函數,若更改在函數的數值,原本的參數值也會跟著改變 C語言使用指標傳遞參數 ``` ----- 18. 請在寫下建立double bill(int minute)函數,可以計算Internet連線費用,前50小時,每分鐘0.3元;超過50小時,每分鐘0.2元。 ``` double bill(int minute){ if(minute < 3000) return minute*0.3; else return 900 + (minute-3000)*0.2; } ``` 20. 計算體脂肪BMI值的公式是W/(H*H), H是身高(公尺)和W是體重(公斤),請建立double bmi(double, double)函數計算BMI值,參數是身高和體重。 ``` double bmi(double W, double H){ return W/(H*H); } ``` 21. 費式數列(Fibonacci)是第一個和第二個數字為1,F0=F1=1,其他是前兩個數字的和Fn=Fn-1+Fn-2, n>=2, 請設計int fibonacci(int)函數顯示費式數列,參數是顯示數字的個數。 ``` int fibonacci(int n){ if(n == 1 || n == 2) return 1; else return fibonacci(n-1)+fibonacci(n-2); } ``` 30. 請設計遞迴函數計算X^n^的值,例如:5^7^、8^5^等。 ``` int compute(int x, int n){ if(n == 1) return x; else return x * compute(x,n-1); } ``` 31. 請寫出遞迴函數sum(int),可以計算1到參數值的和,例如:sum(5),就計算5+4+3+2+1。 ``` int sum(int n){ if(n == 1) return 1; else return n + sum(n-1); } ``` ## Word Rotation (檔名:hw04_01.c) Description ``` 有一個字串長度L小於1001,此字串只包含大小寫英文字母,請把此字串的第一個字母換到字尾印出,重複做L次 假設有一字串為abcde,則做一次後會輸出bcdea 測資裡面不會有空格 ``` Hint ``` 字串可以儲存在陣列裡面 假設有長度為4的字串要存,就要開字串長度+1的格子,也就是要開5個格子 例如:要存abcd,則要宣告A[5] A[0] = 'a'; A[1] = 'b' ; A[2] = 'c' ; A[3] = 'd' ; A[4] = '/0';(這個是代表這個字串結束的地方) ``` Sample Input ``` 2 Jacky Ken ``` Sample Output ``` ackyJ ckyJa kyJac yJack Jacky enK nKe Ken ``` ### Solution ```gherkin= #include <stdio.h> #include <string.h> int main(){ char s[1001]; int len,i,j,k; int T; scanf("%d",&T); for(i=0;i<T;i++){ scanf("%s",s); len = strlen(s); for(j=0;j<len;j++){ for(k=j+1;k<len;k++){ printf("%c",s[k]); } for(k=0;k<=j;k++){ printf("%c",s[k]); } printf("\n"); } if(i != T-1) printf("\n"); } return 0; } ``` ## Palindrome (檔名:hw04_02.c) Description ``` Palindrome翻譯為回文,若字串S為回文的話,S與反轉的S是一樣的。 只會出現a~z與A~Z 舉例:level,aba等等 輸入的字串長度不超過100000 請判斷輸入的字串是否為回文 ``` Sample Input ``` 3 level Level abba ``` Sample Output ``` Yes No Yes ``` ### Solution ```gherkin= #include <stdio.h> #include <string.h> int main(){ char s[1000001]; int i,j,check,T,len; scanf("%d",&T); for(i=0;i<T;i++){ scanf("%s",s); len = strlen(s); check = 1; for(j=0;j<len/2;j++){ if(s[j] != s[len-j-1]){ check = 0; break; } } if(check==1) printf("Yes"); else printf("No"); if(i != T-1) printf("\n"); } return 0; } ``` ## Practice function(檔名:hw04_03.c) Description ``` 創造函數application()把條件都寫在function裡面,main函數必須以下面原始碼為準去編寫 某個世族的女兒在網路上想要徵求一位男友 他的擇友條件如下 age : 25 <= age <= 30 height : 160 <= height <= 175 Monthly salary : at least 30,000 按照順序輸入某想應徵的男士的各個資料,判斷是否合格應徵 ``` Sample input ``` 2 21 110 10 29 174.9 30001 ``` Sample output ``` No Yes ``` ### Solution ```gherkin= #include <stdio.h> int application(int age,float height,float salary){ if(age >= 25 && age <= 30 && height >= 160 && height <= 175 && salary >= 30000) return 1; return 0; } int main(){ int T,i; int age, ans; float height, salary; scanf("%d",&T); for(i=0;i<T;i++){ scanf("%d%f%f",&age,&height,&salary); ans = application(age,height,salary); if(ans == 1) printf("Yes"); else printf("No"); if(i != T-1) printf("\n"); } return 0; } ``` ## Prime number calculator(檔名:hw04_04.c) Description ``` 給定兩個數字代表範圍,你必須要計算在這兩個數字之間的質數有多少 1不是質數呦 例如:範圍為1~10 則印出4,因為在1~10內有2、3、5、7這四個質數 輸入條件:第一個輸入為X、第二個輸入為Y 1 <= X <= Y <= 5000 ``` Sample input ``` 3 1 10 7 300 1000 5000 ``` Sample output ``` 4 59 501 ``` ### Solution ```gherkin= #include <stdio.h> #include <math.h> int main(){ int i,j,k,x,y,T; int ans=0,flag = 0; scanf("%d",&T); for(k=0;k<T;k++){ scanf("%d %d",&x,&y); ans = 0; for(i=x;i<=y;i++){ flag = 0; if(i == 1) continue; //1不是質數 if(i == 2){ ans++; //2是質數 continue; } for(j=2;j<=sqrt(i);j++){ if(i%j == 0){ flag = 1; break; } } if(flag == 0){ ans++; } } printf("%d",ans); if(k != T-1) printf("\n"); } return 0; } ``` ## Full house(檔名:hw04_05.c) Description ``` “Mannulus”賭場現在正在坎特洛特慶祝其盛大開業! 賭場的擁有者,Lightyear,向賭場介紹了最先進的技術:Farseer卡自動檢測系統。 如果運作良好,賭場將不再需要雇用任何經銷商! 問題是:系統無法按照正確的順序自動排列卡片。 因此,Lightyear決定僱用一組程序員來改進整個系統。 您作為一名初級程序員,被分配編寫一個程序來檢查一組五張卡是否構成Full House。 然後,Lightyear將為您提供T套卡片,以驗證您程序的正確性。 請不要讓他失望。 Full House的規則: https://en.wikipedia.org/wiki/List_of_poker_hands#Full_house 第一行T代表Lightyear要給你測試幾組卡牌 往後的T行,每一行都有5張卡 每張卡內容包含{A,2,3,4,5,6,7,8,9,10,J,Q,K} T的範圍在1~1000 若偵測結果是Full House 請印出YES 若不是則印出NO ``` Hint ``` 10的儲存問題,可以把輸進來的值如果是10就用其他一個字的字串去取代10,像是1、T之類的 ``` Sample input ``` 5 2 3 4 5 6 2 2 2 2 A 3 3 3 4 4 2 A 2 A 2 3 3 2 2 2 ``` Sample output ``` NO NO YES YES YES ``` ### Solution ```gherkin= #include <stdio.h> int main() { char card[6]; int T,number,time; int i,j,k; scanf("%d",&T); //總共輸入幾組卡 for(i=0;i<T;i++) { for(j=0;j<5;j++) scanf("%s",&card[i][j]); //依次輸入卡片 time = 0; //計點數歸0 for(j=0;j<5;j++) { number = 0; //同樣卡片張數歸0 for(k=0;k<5;k++) { if(card[i][j]==card[i][k]) number = number + 1; //測試每張卡片是否一樣 } if(number == 3) time = time + 1; //有三張一樣卡片+1 else if(number == 2) time = time + 1; //有兩張一樣卡片+1 } if(time == 5) printf("YES\n"); else printf("NO\n"); } return 0; } ``` ## 注意事項 1. 此作業為coding部分,==請勿抄襲== 1. 繳交期限:10/29(二)23:59前 2. 覺得自己的code的output跟sample output一模一樣的話,可以寄信給我測試(請不要有提示訊息) 3. 檔案只要.c檔即可(信件主旨:課程帳號 姓名 作業4 測試) 4. 檔名要正確,不然該檔案不幫你測 5. 所有coding分數都是以測資的正確與否評分 6. 交作業信件主旨:課程帳號 姓名 作業4