以……为代价 英文:c++求助,帮忙看看这个循环

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/29 11:57:55
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
#include<time.h>
void shuffle( int [][ 13 ] );
void deal( const int [][ 13 ], const char *[], const char *[] );

int main()
{
const char * suit[ 4 ] =
{ "Hearts", "Diamonds", "Clubs", "Spades" };
const char * face[ 13 ] =
{ "Ace", "Deuce", "Three", "Four",
"Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Jack", "Queen", "King" };
int deck[ 4 ][ 13 ] = { 0 } ;

srand(time(0));

shuffle( deck );

return 0;
}

void shuffle( int wDeck[ ][ 13 ] )
{
int row, column;

for(int card = 1; card <= 52; card++ ) {
do{
row = rand() % 4;
column = rand() % 13;
} while( wDeck[ row ][ column ] != 0 );

wDeck[ row ][ column ] = card;
}
}

这是一个模拟的洗牌发牌程序得部分,
我怎么看着do{
row = rand() % 4;
column = rand() % 13;
} while( wDeck[ row ][ column ] != 0 );

这个循环 会一直循环下去?
上面不是int deck[ 4 ][ 13 ] = { 0 } ?
每一项都应当是0 啊,不会出现 !=0啊
但是执行的时候没问题,我不明白,全部代码在下面,希望帮我看看,谢谢

全部代码:
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
#include<time.h>
void shuffle( int [][ 13 ] );
void deal( const int [][ 13 ], const char *[], const char *[] );

int main()
{
const char * suit[ 4 ] =
{ "Hearts", "Diamonds", "Clubs", "Spades" };
const char * face[ 13 ] =
{ "Ace", "Deuce", "Three", "Four",
"Five", "Six", "Seven", "Eight",
"Nine", "Ten", "Jack", "Queen", "King" };
int deck[ 4 ][ 13 ] = { 0 } ;

srand(time(0));

shuffle( deck );
deal( deck, face, suit );

return 0;
}

void shuffle( int wDeck[ ][ 13 ] )
{
int row, column;

for(int card = 1; card <= 52; card++ ) {
do{
row = rand() % 4;
column = rand() % 13;
} while( wDeck[ row ][ column ] != 0 );

wDeck[ row ][ column ] = card;
}
}

void deal( const int wDeck[ ][ 13 ], const char * wFace[ ] ,
const char *wSuit[] )
{
for (int card = 1; card <= 52; card++ )

for ( int row = 0; row <= 3; row++ )

for ( int column = 0; column <= 12; column++ )

if ( wDeck[ row][ column ] == card )
cout << setw(8) << setiosflags( ios::right )
<< wFace[ column ] <<" of"
<< setw( 8 ) << setiosflags( ios::left )
<< wSuit[ row ]
<< ( card % 2 == 0 ? '\n' : '\t' );
}

外层的for循环会执行52次,刚好对52张牌进行初始化,里层的一个do 循环是为了随机的找到一个还没有初始化的牌,因为int deck[ 4 ][ 13 ] = { 0 };
则每张牌的默认值就是 0,而每对一张牌完成初始化则会变为非零的值(因为wDeck[ row ][ column ] = card; 而card是从1开始计数的),刚好进行52次,所以每次do 循环都能找到一个为0 的值,并对其初始化,进行完52次,即没有再为0的值时,for循环也执行完毕。
因此不会一直循环。
不知道你明不明白,这个例子我在《C how to program》上见过,你可以在上面找一找

不等于0的时候才继续循环,这个循环的外层for循环就是要将每个牌赋值