求一段C语言的完整代码,复制粘贴答案后可以运行,要求如下:

1,发牌游戏,不包括大小王。

2,由用户输入发几张牌。
3,事例:用户输入“3”后,屏幕随即输出三张牌,如“梅花4 方块7 红桃11”
4,提示:用数组,rand();rand()%4;rand()%13;srand()
求完整C语言代码,可以运行的那种,请不要复制粘贴网上错误的解答,万分感谢。。。。。。。。。


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int i,n;
char string1[][100]={"方块","红桃","黑桃","梅花"};
    char string2[][10]={"2","3","4","5","6","7","8","9","10","J","Q","K","A",};
printf("请输入所需要牌的张数:");
scanf("%d",&n);
srand(time(NULL)); 
for(i=0;i<n;i++)
{
printf("%s",string1[rand()%4]); 
printf("%s",string2[rand()%13]);
printf("\n");
    }
    return 0;
}
//执行结果


希望采纳!3Q!

追问

请问char里面不应该是字符型吗 怎么可以是两个汉字呢?

追答

只要你能在纸上写的出来的,都可以看成字符,当然也就包括了汉字

追问

两个汉字不应该属于字符串型string吗。。。。

追答

C语言中没有单独的字符串型,
只是定义一个字符数组,如 char a[10],
它就可以当成容量为10的字符串
用gets(a)来输入
用puts(a)来输出

追问

谢谢。。。。。。。。。最后几个问题。。。请问为什么char string1[][100]={"方块","红桃","黑桃","梅花"};中二维数组的列数是100啊。。。。。一个汉字占12.5个字节吗?另外,第一个[]内默认的是1吗?char string2[][10]里面为什么是10啊。。。。。

追答

我只是在编程的时候测试一下,是几到无所谓,只要够用就行
至于char string[ ][100]表示一个二维数组,[ ],不是默认,是根据后面出现的个数而定
例如:char string[ ][100]={
"方块",
"红桃",
"黑桃",
"梅花"
}

这样写比较直观,[100]表示每个字符串的长度,
由上面可知[ ]内应该为3(数组从0开始的0,1,2,3,),可以直接写3,空出来是为了可以添加
例如:char string[ ][100]={
"方块",
"红桃",
"黑桃",
"梅花"
"大王"
"小王"
}

这时[ ]内应该为5了,这时一种编程技巧

追问

这个为什么要用二维数组啊 感觉一维数组也可以啊 是不是啊?我刚刚学到数组

追答

要用一维数组就会变成
char String1[10]="方块"

char String2[10]="红桃"

char String3[10]="黑桃"

char String4[10]="梅花"

这样达不到效果,也不好操作。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-02
#include <time.h>

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int index = 0;
    int inputCnt = 0;
    char *cardColor[4] = {"黑桃","红桃","梅花","方片"};
    int cardNum[13];

    for(index=0; index<13; index++)
    {
        cardNum[index] = index+1;    
    }
    
    printf("please input card num:");
    while( scanf("%d", &inputCnt) != EOF)
    {
        printf("\n");

        srand((int)time(0));  /*每次都 初始化随即数种子*/

        for(index = 0; index<inputCnt; index++)
        {
            printf("%s", cardColor[rand()%4]);
            printf("%d ",cardNum[rand()%13]);
        }
        printf("\n\n");
        printf("please input card num:");
    }

    return 0;
}
-------------------以上代码有问题,忘记判断是否牌已经发过,修改后代码如下--------------------
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

static int checkCard(int cardCnt, int (*pInput)[2]);

int main()
{
    int index = 0;
    int inputCnt = 0;
    int colorIndex = 0;
    int numIndex = 0;
    int selectedCard[52][2];

    char *cardColor[4] = {"黑桃","红桃","梅花","方块"};
    int cardNum[13];

    for(index=0; index<13; index++)
    {
        cardNum[index] = index+1;    
    }
    memset(&selectedCard[0][0], 0, sizeof(selectedCard));
 
    #if 0 /*调式牌面值是否有重复的*/
    for(index=0;index<4;index++)
        for(inputCnt=0;inputCnt<13;inputCnt++)
        {
            printf("index=%d,inputCnt=%d, sum=%d \n",index,inputCnt,(index+1)*13+inputCnt+1);
        }
    #endif

    printf("please input card num:");
    while( scanf("%d", &inputCnt) != EOF)
    {
        if(inputCnt < 53)
        {
            printf("\n");
            index = 0; /*已经找到符合要求的张数*/    
            srand((int)time(0));

            while(index < inputCnt)
            {
                colorIndex = rand()%4;
                numIndex = rand()%13;
                selectedCard[index][1] =  (colorIndex+1)*13 + numIndex + 1;  /*记录下已经发出的牌,防止重复*/
                //printf("--得到花色索引:%d,牌号索引:%d, 牌面值为:%d\n",colorIndex,numIndex,selectedCard[index][1]);
                if(0 == checkCard(index, selectedCard))
                {
                   printf("%s", cardColor[colorIndex]);
                   printf("%d ",cardNum[numIndex]);
                   index++;
                }
                else /*但发重复牌时需要清除刚才记录的牌面值*/
                {
                    selectedCard[index][1] = 0;
                }
            }
            printf("\n\n");
            printf("please input card num:");
        }
        else
        {
            printf("输入的牌数超过52张,请重新输入!\n");
            printf("please input card num:");
        }
    }

    return 0;
}

/*检查当前生成的牌是否已经发过,0:没法过,1:发送过*/
static int checkCard(int cardCnt, int (*pInput)[2])
{
    int index = 0;
    int cnt = 0;
    int ret = 0;
    int errorFlag = 0;
 
    #if 0 /*调试信息可以删除*/
    printf("--cnt = %d,得到已经发过牌的号为:\r\n",cardCnt);
    for(index=0; index<= cardCnt; index++)
    {
        printf("%d ", pInput[index][1]);
    }
    printf("\n");
    printf("--比较过程如下:");
    #endif

    while(cnt < cardCnt)
    {
        for(index=cnt+1; index <= cardCnt; index++)
        {
            //printf("%d %d\n",pInput[cnt][1], pInput[index][1]);
            if(pInput[cnt][1] == pInput[index][1])
            {
                 errorFlag = 1;
                 //printf("--ERROR--得到重复的牌--\n");
                 break;
            }
        }
        cnt = cnt + 1;
        if(errorFlag == 1)
        {
            ret = 1;
            break;
        }
    }

    return ret;
}

追问

请问char里面不应该是字符型吗 怎么可以是两个汉字呢?

第2个回答  2014-11-02
#include <stdio.h>
#include <stdlib.h>
#include <time.h> /*需引用的头文件*/
#include <string.h>
int main(void)
{
srand((unsigned)time(NULL)); /*随机种子*/
char n=(rand()%(13-1+1)+1)+'0'; /*n为X~Y之间的随机数*/
srand((unsigned)time(NULL)); /*随机种子*/
int p=rand()%(1-4+1)+1;
char pai[5]="",num[3]="";
switch(n)
{
case '1':strcpy(num,"A");break;
case ':':strcpy(num,"10");break;
case ';':strcpy(num,"J");break;
case '<':strcpy(num,"Q");break;
case '=':strcpy(num,"K");break;
default:num[0]=n;
}
switch(p)
{
case 1:strcpy(pai,"黑桃");break;
case 2:strcpy(pai,"红桃");break;
case 3:strcpy(pai,"梅花");break;
case 4:strcpy(pai,"方片");break;
}
printf("%s%s\n",pai,num);
return 0;
}

这个随机最简明.

本回答被网友采纳
第3个回答  2014-11-02
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void printShape(int shape) //打印花色
{
switch(shape)
{
case 0: //梅花
printf("梅花") ;
break ;
case 1:
printf("红桃") ;
break ;
case 2:
printf("方块") ;
break ;
case 3:
printf("黑桃") ;
break ;
}
}

void printNumber(int number) //打印数字
{
switch(number)
{
case 0:
printf("A") ;
break ;
case 1:
printf("2") ;
break ;
case 2:
printf("3") ;
break ;
case 3:
printf("4") ;
break ;
case 4:
printf("5") ;
break ;
case 5:
printf("6") ;
break ;
case 6:
printf("7") ;
break ;
case 7:
printf("8") ;
break ;
case 8:
printf("9") ;
break ;
case 9:
printf("10") ;
break ;
case 10:
printf("11") ;
break ;
case 11:
printf("12") ;
break ;
case 12:
printf("13") ;
break ;
}
}
int main()
{
int i ;
int count ;
int shape, number ; //shape和number分别记录随机产生的花色和数值
printf("请输入发牌数量:") ;
scanf("%d", &count) ;
srand(time(0)) ; //初始化随机数种子
for(i = 0; i < count; i++)
{
shape = rand()%4 ;
printShape(shape) ;
number = rand()%13 ;
printNumber(number) ;
printf(" ") ;
}
printf("\n") ;
return 0 ;
}
第4个回答  2014-11-02
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    int a;
    char type1[][5]={"黑桃","红桃","梅花","方块"},temp;
    printf("请输入纸牌数:");
    scanf("%d",&a);
    srand(unsigned(time(0)));
    while(a--)
    {
        temp=rand()%13+1;
        if(temp==11)temp='J';
        if(temp==12)temp='Q';
        if(temp==13)temp='K';
        if(temp<=10)temp+='0';
        printf("%s%c ",type1[rand()%4],temp);
    }
    printf("\n");
}

相似回答