面試,急!!這個問題如何解決,最好附代碼???(50分)

  • 主题发起人 主题发起人 yie28658340
  • 开始时间 开始时间
Y

yie28658340

Unregistered / Unconfirmed
GUEST, unregistred user!
程序名称: 猜数字游戏
1. 自动产生四个0~9的数字作为随机数,这个四位数相互之间不能相同。
2. 使用者输入猜的四个数字(这四个数字之间也不能相同, 如果有相同的则提示使用者,并让它重新输入),最多可以猜十次,超过十次则游戏结束,使用者可以选择再玩一次或离开(再玩一次的随机数必须重新产生)
3. 当使用者输入一组四位数字时,程序把这组数字跟自动产生的那组做比对,当比对结果为一个数字的值相同且位置一样,计算器印出1A;如果四个数字中有数字的值一样但位置不同,计算器印出1B,例如计算器产生的数字为 2345
当使用者输入    1378
计算器印出     1A
当使用者输入    1078
计算器印出     0A0B
当使用者输入    2378
计算器印出     2A
当使用者输入    1038
计算器印出     1B
当使用者输入    2038
计算器印出     1A1B
当使用者输入    5432
计算器印出     4B
4. 游戏中使用者可随时查询历史
 
procedure CompareAB(const OriStr,GuessStr:String;out A,B:Integer);
var
n,i,j:Integer;
begin
n:=Length(GuessStr);
A:=0;
B:=0;
if Length(OriStr)<>n then
exit;
for i:=1 to ndo
begin
for j:=1 to ndo
if GuessStr=OriStr[j] then
begin
if i=j then
//数字相同
Inc(A) //位置相同
else
Inc(B);
//位置不同
break;
end;
end;
end;

function GenRandStr(const N:Integer):String;
var
i,j:Integer;
M:array[0..9] of Char;
begin
for i:=0 to 9do
M:=Char(Byte('0')+i);
SetLength(Result,N);
for i:=0 to N-1do
begin
j:=Random(10-i);
Result[i+1]:=M[j];
M[j]:=M[9-i];
end;
end;

eg:
procedure TForm1.Button1Click(Sender: TObject);
var
Str:String;
A,B:Integer;
begin
Str:=GenRandStr(4);
Memo1.Lines.Add(Str);
CompareAB(Str,'1234',A,B);
Memo1.Lines.Add(Format('--1234: A %d B %d',[A,B]));
CompareAB(Str,'5678',A,B);
Memo1.Lines.Add(Format('--5678: A %d B %d',[A,B]));
end;

核心算法写好了,至于查询历史等功能就不写了 :)
 
不会很难,你自己动手,做得出来的。
 
面试的题都要别人帮做?服了
 
没记错的话,这种题很久前讨论过的。
自己去找找看。
 
for ...
pos 一下就可以了嘛
 
后退
顶部