Post by huangno1 on Mar 2, 2017 20:29:43 GMT -8
程式說明
猜數字!假設只有四位數字 (4 digits),每位數字均介於1~9且皆相異 (digits are distinct and in [1, 9])。若猜測答案和正確答案的某一位數字相符且位置相符,記為A,若數字相符但位置不符,記為B。
若正確答案為 1234 (1234 is the answer),下表為猜測答案的判定結果。
猜測答案 (guess) A/B
5678 0A0B
1567 1A0B
1243 2A2B
4321 0A4B
1234 4A0B
本功能會讓使用者先輸入正確答案 (input the correct answer first),再由使用者進行猜數字遊戲 (then start the guessing procedure)。
(1) 支援函式:Transform()
(1.1) 該函式有三個參數,依序傳入一個整數陣列 (arr),轉換的位數 (NumDigits),和一個整數值 (value)。
(1.2) 該函式會將 value 拆成 NumDigits 個數字,依序存入 arr 陣列中。
(1.3) 例如 value 若為 5274,NumDigits 為 4,則 arr[0] 為 5,arr[1] 為 2,arr[2] 為 7,arr[3] 為 4。
(2) 支援函式:CountAB()
(2.1) 該函式有五個參數,依序傳入兩個整數陣列,陣列大小,以及兩個整數指標 (countA, countB)。
(2.2) 該函式會比較兩個陣列中的數字,若有相同數字且位置相同,則 countA 指向的變數 +1,若相同數字但位置不同,則 countB 指向的變數 +1。
(3) 支援函式:GuessDigits()
(3.1) 該函式有兩個參數 ans 和 max_num_guesses,均為整數型態。ans代表標準答案 (ans is the correct answer),max_num_guesses代表最多可以猜幾次。
(3.2) 該函式的回傳值為布林型態 (bool)。
(3.3) 該函式會反覆要求使用者輸入所猜測的數字,輸出 A/B 判定結果。(repeats inputting the guess and outputting ?A?B)
(3.4) 若使用者輸入的猜測答案與正確答案完全相同 (4A0B),結束函式,回傳true。(return true if the guess matches exactly)
(3.5) 若使用者已輸入 max_num_guesses 次但未能猜中正確答案,結束函式,回傳false。(return false after max_num_guesses incorrect guesses)
(4) 主函式功能:
使用者將會先輸入一個四位數字代表正確答案。接著便開始進行猜數字遊戲。若十次之內(含第十次)無法猜中 (10 incorrect guesses),輸出 "Oh, you lose!";若十次內猜中了,輸出 "Great! You got it!"。
#include <stdio.h>
// ----------------------------------------------------------------------------
// Assume that value is 5274, NumDigits is 4,
// then arr[0] = 5, arr[1] = 2, arr[2] = 7, arr[3] = 4.
// ----------------------------------------------------------------------------
void Transform(
int arr [ ]
, int NumDigits, int value)
{
for (int i=0; i<NumDigits; i+=1)
{
arr = value%10;
value /= 10;
}
}
// ----------------------------------------------------------------------------
void CountAB(
int ans [ ]
,
int guess [ ]
, int NumDigits,
int *countA
,
int *countB
)
{
*countA = 0 ; *countB = 0 ;
// reset to zero
for (int i=0; i<NumDigits; i+=1)
{
for (int j=0; j<NumDigits; j+=1)
{
if (
ans [ i ] == guess [ j ]
)
{
if (i==j)
{
*countA
+= 1; // same digit and same position
}
else
{
*countB
+= 1; // same digit but different position
}
}
}
}
}
// ----------------------------------------------------------------------------
bool GuessDigits(int answer, int max_num_guesses)
{
constexpr int NumDigits = 4;
int ans[NumDigits] = {0}, guess[NumDigits] = {0};
Transform(
ans , NumDigits , answer
); // Transform answer to ans.
int num_guess = 0;
do
{
int num;
printf("Guess...>");
scanf("%d", &num);
num_guess += 1;
Transform(
guess , NumDigits , num
); // Transform num to guess.
int countA = 0, countB = 0;
CountAB(
ans , guess , NumDigits , &countA , &countB
); // Count A/B.
if (countA == 4)
{
return true;
}
else
{
printf("%dA%dB\n", countA, countB);
}
}
while (num_guess < max_num_guesses);
return false;
}// GuessDigits()
// ----------------------------------------------------------------------------
int main()
{
printf("Guess Number\n");
int num = 0;
printf("Set the answer...>");
scanf("%d", &num);
if (GuessDigits(num, 10))
{
printf("Great! You got it!\n");
}
else
{
printf("Oh, you lose!\n");
}
}
猜數字!假設只有四位數字 (4 digits),每位數字均介於1~9且皆相異 (digits are distinct and in [1, 9])。若猜測答案和正確答案的某一位數字相符且位置相符,記為A,若數字相符但位置不符,記為B。
若正確答案為 1234 (1234 is the answer),下表為猜測答案的判定結果。
猜測答案 (guess) A/B
5678 0A0B
1567 1A0B
1243 2A2B
4321 0A4B
1234 4A0B
本功能會讓使用者先輸入正確答案 (input the correct answer first),再由使用者進行猜數字遊戲 (then start the guessing procedure)。
(1) 支援函式:Transform()
(1.1) 該函式有三個參數,依序傳入一個整數陣列 (arr),轉換的位數 (NumDigits),和一個整數值 (value)。
(1.2) 該函式會將 value 拆成 NumDigits 個數字,依序存入 arr 陣列中。
(1.3) 例如 value 若為 5274,NumDigits 為 4,則 arr[0] 為 5,arr[1] 為 2,arr[2] 為 7,arr[3] 為 4。
(2) 支援函式:CountAB()
(2.1) 該函式有五個參數,依序傳入兩個整數陣列,陣列大小,以及兩個整數指標 (countA, countB)。
(2.2) 該函式會比較兩個陣列中的數字,若有相同數字且位置相同,則 countA 指向的變數 +1,若相同數字但位置不同,則 countB 指向的變數 +1。
(3) 支援函式:GuessDigits()
(3.1) 該函式有兩個參數 ans 和 max_num_guesses,均為整數型態。ans代表標準答案 (ans is the correct answer),max_num_guesses代表最多可以猜幾次。
(3.2) 該函式的回傳值為布林型態 (bool)。
(3.3) 該函式會反覆要求使用者輸入所猜測的數字,輸出 A/B 判定結果。(repeats inputting the guess and outputting ?A?B)
(3.4) 若使用者輸入的猜測答案與正確答案完全相同 (4A0B),結束函式,回傳true。(return true if the guess matches exactly)
(3.5) 若使用者已輸入 max_num_guesses 次但未能猜中正確答案,結束函式,回傳false。(return false after max_num_guesses incorrect guesses)
(4) 主函式功能:
使用者將會先輸入一個四位數字代表正確答案。接著便開始進行猜數字遊戲。若十次之內(含第十次)無法猜中 (10 incorrect guesses),輸出 "Oh, you lose!";若十次內猜中了,輸出 "Great! You got it!"。
#include <stdio.h>
// ----------------------------------------------------------------------------
// Assume that value is 5274, NumDigits is 4,
// then arr[0] = 5, arr[1] = 2, arr[2] = 7, arr[3] = 4.
// ----------------------------------------------------------------------------
void Transform(
int arr [ ]
, int NumDigits, int value)
{
for (int i=0; i<NumDigits; i+=1)
{
arr = value%10;
value /= 10;
}
}
// ----------------------------------------------------------------------------
void CountAB(
int ans [ ]
,
int guess [ ]
, int NumDigits,
int *countA
,
int *countB
)
{
*countA = 0 ; *countB = 0 ;
// reset to zero
for (int i=0; i<NumDigits; i+=1)
{
for (int j=0; j<NumDigits; j+=1)
{
if (
ans [ i ] == guess [ j ]
)
{
if (i==j)
{
*countA
+= 1; // same digit and same position
}
else
{
*countB
+= 1; // same digit but different position
}
}
}
}
}
// ----------------------------------------------------------------------------
bool GuessDigits(int answer, int max_num_guesses)
{
constexpr int NumDigits = 4;
int ans[NumDigits] = {0}, guess[NumDigits] = {0};
Transform(
ans , NumDigits , answer
); // Transform answer to ans.
int num_guess = 0;
do
{
int num;
printf("Guess...>");
scanf("%d", &num);
num_guess += 1;
Transform(
guess , NumDigits , num
); // Transform num to guess.
int countA = 0, countB = 0;
CountAB(
ans , guess , NumDigits , &countA , &countB
); // Count A/B.
if (countA == 4)
{
return true;
}
else
{
printf("%dA%dB\n", countA, countB);
}
}
while (num_guess < max_num_guesses);
return false;
}// GuessDigits()
// ----------------------------------------------------------------------------
int main()
{
printf("Guess Number\n");
int num = 0;
printf("Set the answer...>");
scanf("%d", &num);
if (GuessDigits(num, 10))
{
printf("Great! You got it!\n");
}
else
{
printf("Oh, you lose!\n");
}
}