--- tags: CSE --- # HW2 ## 題目說明 Objective : 學會使用 C 函式 scanf 輸入訊息、printf 輸出訊息及基本 數學運算。 ### 2-1 設計一個程式,在輸入一介於 1-999 之間的數字後,計算 並輸出可用多少個 100、50、10、5、1 元貨幣組合而成。 Input : 963 Output :  ### 2-2 設計一個程式,在輸入一介於 1-15 之間的數字後,將其 以二進位表示法輸出。 ( 提示:輸出為4bits 之 unsigned 二進位數 ) Input : 9 Output:  ## 程式碼 基本的include和寫在主函式裡之後就不提了 (好像本來就不用提 **2-1** ```c= int num; ``` 宣告一個整數型態的變數叫做「num」, 負責記錄輸入的數字。 ```c=2 printf("How much is it : "); scanf("%d", &num); ``` 按照題意敘述輸出並提示使用者輸入數字。 ```c=4 printf("NT 100 : %d\n", num/100); ``` 這裡%d在輸出時會變成逗號後面的「num/100」, 我們先假設這裡將num設為567, 這裡的num/100就會變成567/100 = 5。 為什麼會是5? 因為這裡num的資料型態是 **int** (integer), 先前宣告的int num即代表num是一個可以存入「整數」性質的變數, 而整數與整數進行運算後仍會是整數, 因此567/100以數學運算來說會是5.67, 但在int型態的整數運算中會扣除小數點後部分, 所以最後輸出答案會變為5。 若以本題範例input:963為例,輸出答案就是9。 ```c=5 printf("NT 50 : %d\n", num%100/50); ``` 再來是50塊的部分, num%100的意思是將num的數值除以100後得到的餘數, 以963%100為例,答案就是63, 接著再除以50就會得到商數為1(找一個50塊)。 ```c=6 printf("NT 10 : %d\n", num%50/10); ``` 這邊沒有%100的原因是%50過程就包含%100了, 963%50 = 13, 13/10 = 1。 ```c=7 printf("NT 5 : %d\n", num%10/5); ``` 同理,%10的過程即等於%50也等於%100, 963%10 = 3, 3/5 = 0。 ```c=8 printf("NT 1 : %d", num%5); ``` 若要寫的跟上面程式碼一樣的話還要加個/1, 但不加也沒差。 即完成題目2-1。 **2-2** 忘記這題當初在想什麼了== 因為題目限制數字1~15, 所以我直接硬算。 如果想要學如何將十進制換算成二進制, 千萬不要參考這個程式碼。 ```c= int num, ans, timer = 4; printf("Please enter number : "); scanf("%d", &num); ``` 這裡的num會是一開始輸入的數字, ans會是最後輸出的答案, timer是用來記我在算第幾位數的, 在小於十進制16的數字中轉換為二進制時不會超過四位數, 所以我的timer一開始設為4。 ```c if (num%2==1 && timer == 4) { ans += 1; num /= 2; } ``` ans += 1的意思是 ans = ans + 1, 也就是將ans+1的值賦予給ans自己, 白話就是將ans加上1。 num /= 2的意思是 num = num / 2, 也就是將num/2的值賦予給num自己, 白話就是將num除以2。 當初學轉換二進制都是用短除法, 而這裡if判斷的就是num除以2的餘數是否等於1, 並且timer=4時,則將ans+1,再將num除以2。 借下面這張圖片說明(十進制的11轉二進制答案為1011)  我們這一行判斷式做的事情就是11%2也就是第一個步驟, 若11%2\==1時(判斷式中的判定要用兩個等於「==」表示), 如短除法所示, 我們給ans(待會輸出的答案)加上1, 這時的timer為4,代表著進行到第4位數。 接下來直接把整段程式碼貼出來比較好懂 ```c=4 while (timer > 0) { if (num%2==1 && timer == 4) { ans += 1; num /= 2; } else if (num%2==1 && timer == 3) { ans += 10; num /= 2; } else if (num%2==1 && timer == 2) { ans += 100; num /= 2; } else if (num%2==1 && timer == 1) { ans += 1000; num /= 2; } else { num /= 2; } timer -= 1; } ``` 那行if判斷式的邏輯套用在所有else if上就可以瞭解了, else的部分則是因為餘數為0, ans加上0直接省略。 每次執行完timer都會-1, 當timer=0的時候while迴圈便會停止並跳出。 ```c=32 printf("Output : %04d", ans); ``` 最後就是輸出答案, %04d是%d的變形, 其中的4表示輸出4位數, 其中的0表示原先沒有數字的部分就補0上去。 2-2到此結束。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up