一道用到数组的C语言编程题,要求用刀随机

题目在图片里,,,你把答案发在下面或者加我534233854~~~题目在图片~~... 题目在图片里,,,你把答案发在下面或者加我534233854~~~
题目在图片~~
展开
 我来答
黄邦勇帅哥哥
2010-04-18 · TA获得超过3989个赞
知道大有可为答主
回答量:1199
采纳率:100%
帮助的人:526万
展开全部

楼主可以试下以下程序,可能你的程序产生的随机数方式不一样,我使用的是VS2005,需要使用srand函数,才能产生随机数。

只复制主函数吧,头文件自已加了

void main()

{int s,i=1,j;

int a[32]={0};

bool b[32]={false};

int k=0;

srand( (unsigned)time(NULL));  //VS2005随机数需要这样生成,如果系统不一样,就按照你的系统生成随机数,这个比较简单

a[0]=rand()%32;  //把生成的第一个随机数赋给a[0]

while(i<32){  //循环生成32位不相同的随机数

s=rand()%32;

a[i]=s;  //把生成的随机数赋给a[i]

if(a[1]==a[0]){a[0]=s;continue;} //判断第数组第1和2项是否相等,若相等,则重新生成随机数,一直到第1项与第2项不相等为止,并且不让i增加

for(j=i-1,k=j;j>=0;j=j-1) //循环判断产生的随机数是否与以前的相同。把j的值赋给k,这样k和j的初值就相同

{if(a[i]!=a[j])  //若产生的随机数不相同,则把计数器k减1,若k减到与j相等,即为-1时,也就是表示a[i]与其前的所有项都不相同。

{k--;}}

if(k==-1){a[i]=s; i++;}  //如果k=-1则表示a[i]和以前的所有的值都不相同,所以把产生的随机数赋给a[i]

else a[i]=0;  //否则产生的a[i]与以前的数相同,把当前值置0。

}

printf("game     player\n");

for(int i=0,j=0;i<16;i++,j=j+2)

{

printf("%d       %d-%d\n",i+1,a[j]+1,a[j+1]+1);

}

   system("pause");

运行结果见下图

百度网友c5643a89b
2010-04-18 · TA获得超过128个赞
知道答主
回答量:99
采纳率:0%
帮助的人:78.6万
展开全部
。。给你个思路。
rand函数是0~1的小数,你将rand*31则是产生0~31的数。
你用int类型。因为int类型可以截取的。也就是说float类型的3.33
转换成int类型是3。
然后你用循环,不停的随机。你将随机获得的数放入int a[32]的数组里。

第一次随机的时候将数放入a[0]里,然后第二次随机的时候要判断你随机的数数组里有没有(可以用循环判断),如果有则继续随机知道随机的数数组里没有为止。然后将数输出。

这种算法不好,但可以完成你题目的要求。

我讲一下第二个算法,用的是数据结构里的内容,不知道你学过数据结构没有。

构建32个空间的链表。List[32]。里面放1~32个数,思路和上面一样。但是不用循环。首先随机,然后将随机的数输出,然后将其从链表中删除。然后第二次随机,用rand*30。然后将随机的数输出,然后将随机得到的数删除。然后第三次随机,用rand*29,依次类推,可以用循环。
随机的数对应的是链表索引。
也就是说 如果 (int)rand*31 得到3的话,则对应的是将list[3]输出,然后将list[3]这个节点删除。然后随机(int)rand*30。如果得到28的话讲list[28]输出,然后删除。
依次循环,这样就不需要第一种方法的循环判断了。

链表的特点是可以将节点删除。而C中数组是不可以的,链表要自己定义。
如:用数据结构的知识第一如下大小为4的链表list
list:
索引: 1 2 3 4
内容: 1 2 3 4
删除2的时候,新链表为:
新索引: 1 2 3
data: 1 3 4
删除1的时候,
新索引: 1 2
data: 3 4
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ankchl
2010-04-19 · TA获得超过405个赞
知道小有建树答主
回答量:116
采纳率:0%
帮助的人:0
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//int player[32];

int generate()
//随机产生一个1~32的数
{
return rand()%32+1;
}

int equal(int player1,int player2,int i,int play[])
//player1与player2是否已经存在
//已经存在返回0,否则返回1
{
int k=0,cout=0;
for(k;k<i;k++)
{
if(player1==play[k]||player2==play[k])
{
cout=0;
break;
}
cout=1;
}
return cout;
}

int main()
{
int player[32];//存放32个队员
int player1,player2;//一组队员
srand((unsigned)time(NULL));
int i,j=0;
printf("Game\t\tPlayer\n");
for(i=0;i<16;)
{
player1=generate();
player2=generate();
if(player1==player2)continue;
//产生的两个随机数相等,则返回循环继续产生随机数
else
{
player[j]=player1;
player[j+1]=player2;
if(i==0||equal(player1,player2,j,player))
//产生的两个队员还没有进行编排,则将他们进行配对
{
printf("%d\t\t%d - %d\n",i+1,player1,player2);
i++;
j+=2;
}
}
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友5579b7cd8b
2010-04-19 · TA获得超过2850个赞
知道小有建树答主
回答量:897
采纳率:67%
帮助的人:433万
展开全部
必须按照图片中的提示吗?我的想法很简单
把1-32放到数组中随机的进行交换,就好像是洗牌一样,洗的次数可多可少,当然次数越多越随机。
洗完后,在第1的一般不会是1号,最后的一般不会是32号,既然已经是随机的了,怎么配对都无所谓了。
我就让第1个和第17个,第2个和第18个。。。第16个和第32个配对。

程序如下:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
main()
{
int a=0,b=0,t=0,i;
int game[32];
for(i=0;i<32;i++) game[i]=i+1;
srand( (unsigned)time(NULL));
for(i=0;i<100;i++)/*洗牌100次*/
{ /*每次随机从中抽两个交换次序*/
a=rand()%32;
b=rand()%32;
t=game[a];
game[a]=game[b];
game[b]=t;
}
printf("Game\tPlayers\n");
for(i=0;i<16;i++)
printf("%d\t%d-%d\n",i+1,game[i],game[i+16]);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
稀有梦幻123
2010-04-19
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
答案已经发给你QQ了,自己看~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式