---
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