用C语言写一个球的程序,12个球的程序.....
12個(gè)球的程序.....
微軟的一道題目...上班很無(wú)聊 寫來(lái)玩玩
有12個(gè)外表一模一樣的小球,其中有一個(gè)的質(zhì)量和其他11個(gè)球不一樣(11個(gè)球的質(zhì)量完全相同),而且該球不知道是輕點(diǎn)還是重點(diǎn)。現(xiàn)在給你一個(gè)天平(無(wú)砝碼),只有3次測(cè)量機(jī)會(huì),請(qǐng)你找出該球。球號(hào)從a到l(小寫)
程序代碼:#include
#include
#include
#define LETTER_HEAD 97 //a的起始
#define BALL_NUM 12 //球個(gè)數(shù)
#define NORMAL_WEIGHT 2 //一般球的重量
#define HIGH_WEIGHT 3 //球超重
#define LOW_WEIGHT 1 //球失重...
#define LOOP 3 //循環(huán)次數(shù)(可稱幾次)
#define FALSE -1
#define TRUE 0
int badBallWeight;
char badBall;
//得到壞球的字符
char getBadBall()
{
srand((unsigned)time(NULL));
return (char)(random()%BALL_NUM+LETTER_HEAD);
}
//得到壞球的重量
void getBadBallWeight()
{
int type;
srand((unsigned)time(NULL));
type = random()%2;
if(1==type)
{
badBallWeight = HIGH_WEIGHT;
}
else
{
badBallWeight = LOW_WEIGHT;
}
}
//開(kāi)啟了debug后 返回FALSE
int debug(char* str)
{
if(strcmp(str, "exit") == 0)
{
exit(0);
}
if(strcmp(str, "cheat") == 0)
{
printf("CHEAT : bad ball is %c, weight is %d\n", badBall, badBallWeight);
return FALSE;
}
return TRUE;
}
//驗(yàn)證球的名字,不在a-l之間的返回FALSE
int verifyBallsName(char* str)
{
char* p;
for(p = str; *p != '\0'; p++)
{
if(*p'l')
{
return FALSE;
}
}
return TRUE;
}
//驗(yàn)證一側(cè)的球有無(wú)重復(fù),重復(fù)返回FALSE
int verifySingleRepeat(char* str)
{
char* p, *temp;
int repeat;
for(p = str; *p != '\0'; p++)
{
repeat = 0;
for(temp = str; *temp != '\0'; temp++)
{
if(*p == *temp)
repeat++;
}
if(repeat > 1)
return FALSE;
}
return TRUE;
}
//驗(yàn)證一側(cè)的錯(cuò)誤性 有錯(cuò)打印并返回FALSE,無(wú)錯(cuò)返回有幾個(gè)球
int verifySingle(char* str)
{
int err;
err = debug(str);
if(FALSE == err)
return FALSE;
err = verifyBallsName(str);
if(FALSE == err)
{
printf("\nERROR: balls name error (Usage:abcdefghijkl)\n");
return FALSE;
}
err = verifySingleRepeat(str);
if(FALSE == err)
{
printf("\nERROR: balls name repeat\n");
return FALSE;
}
return TRUE;
}
//得到單側(cè)的重量
int getSingleWeight(char* str)
{
int ballsNum, haveBadBall;
char* p;
ballsNum = strlen(str);
haveBadBall = 0;
for(p = str; *p != '\0'; p++)
{
if(*p == badBall)
haveBadBall++;
}
return ((ballsNum-haveBadBall)*NORMAL_WEIGHT+haveBadBall*badBallWeight);
}
int verifyMultiBallName(char* leftStr, char* rightStr)
{
char *l, *r;
for(l = leftStr; *l != '\0'; l++)
{
for(r = rightStr; *r != '\0'; r++)
{
if(*l == *r)
return FALSE;
}
}
return TRUE;
}
int main()
{
int loopTime, err;
int leftWeight, rightWeight;
char left[128],right[128];
char bad[16];
printf("有12個(gè)外表一模一樣的小球,其中有一個(gè)的質(zhì)量和其他11個(gè)球不一樣(11個(gè)球的質(zhì)量完全相同),\
而且該球不知道是輕點(diǎn)還是重點(diǎn)。現(xiàn)在給你一個(gè)天平(無(wú)砝碼),只有3次測(cè)量機(jī)會(huì),請(qǐng)你找出該球。球號(hào)從a到l(小寫)\n");
badBall = getBadBall();
getBadBallWeight();
for(loopTime = 1; loopTime <= LOOP; loopTime++)
{
printf("pls input left balls: ");
scanf("%s", left);
err = verifySingle(left);
if(FALSE == err)
goto error;
leftWeight = getSingleWeight(left);
printf("pls input right balls: ");
scanf("%s", right);
err = verifySingle(right);
if(FALSE == err)
goto error;
rightWeight = getSingleWeight(right);
err = verifyMultiBallName(left, right);
if(FALSE == err)
{
printf("\nERROR: one ball both in left and right\n");
goto error;
}
if(leftWeight > rightWeight)
{
printf("result %d : left > right\n", loopTime);
}
else if(leftWeight < rightWeight)
{
printf("result %d : left < right\n", loopTime);
}
else
{
printf("result %d : left = right\n", loopTime);
}
continue;
error:
loopTime--;
}
printf("pls input the bad ball name:");
scanf("%s", bad);
if(*bad == badBall)
{
printf("\ncongratulation,your selected is right!\n");
}
else
{
printf("\nsorry,your selected is wrong!\n");
}
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的用C语言写一个球的程序,12个球的程序.....的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java 线程状态流转
- 下一篇: 刚开始学C 语言 怎么编写小程序,用C