有双证的在职研究生吗?:高分奖励请人指点一段C程序错误

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/06 10:49:23
以下是一段猜数字的程序.随机产生5个不同的数.然后输入5个数与其比较.数字一样位置也一样为A.数字一样但位置不同为B.现在这段代码的问题是当输入与随机产生的数完全相同的数时却不是显示为5A0B.而是其他xxAxxB.哪位高手指点下哪里错了.
#include <stdio.h>
#include <time.h>
#include <stdlib.b>
void main()
{
int a[5],b[5],q=0,i,p=0;
srand((unsigned)time(NULL));
do{
for(i=0;i<5;i++)
a[i]=rand()%10;
printf("\n%d%d%d%d%d",a[0],a[1],a[2],a[3],a[4]);
}while(a[0]==a[1]||a[0]==a[2]||a[0]==a[3]||a[0]==a[4]||a[1]==a[2]||a[1]==a[3]||a[1]==a[4]

||a[2]==a[3]||a[2]==a[4]||a[3]==a[4]);

for(i=0;i<5;i++)

scanf("%d",&b[5]);
for(i=0;i<5;i++)
{
if(b[i]==a[i])
{
q++;
if(q==5)
break;
}
else
if((b[i]==a[i+1])||(b[i]==a[i+2])||(b[i]==a[i+3])||(b[i]==a[i+4]))
{
p++;
continue;
}
}
printf("%dA%dB",q,p);
}
根据第1条回复算A是正确了.可是B的问题还是存在.而且每次算出来的数都比较大.谁在改下

问题在 scanf("%d",&b[5]);
它的错误有两个:
1:数组b[]的范围为b[0]到b[4]。
2:根本就没有输入值 &b[5] 表示的指针为 b+5 (有效范围以外)而b[0],b[1],b[2],b[3],b[4]仍然为数组定义时的初始值(随机的)。

所以应该改为:
for(i=0;i<5;i++)
{
scanf("%d",&b[i]);
}

------------------------------------------------------------
关于你说的另一个错误,问题在于:
if((b[i]==a[i+1])||(b[i]==a[i+2])||(b[i]==a[i+3])||(b[i]==a[i+4]))
这一句中。

这时候i是在不断的变化的
也就是说

当i = 2 时
这一句就为:
((b[2]==a[3])||(b[2]==a[4])||(b[2]==a[5])||(b[2]==a[6]))
又出现好多的数组超出范围。
同样 i = 1, i = 3, i = 4 都有同样的问题。

所以这里应该改为:
for(int j = 0; j < 5; j++)
{
if(i != j && b[i] == a[j])
{
p++;
continue;
}
}