C语言编程题:扑克牌排序问题

用struct结构体构造一副扑克牌54张(含大小王),随机抽取5张输出(不能有重复数字,像两张A),然后比大小(由小到大排序)然后输出。输出格式为如:黑桃4红桃10梅花Q... 用struct结构体构造一副扑克牌54张(含大小王),随机抽取5张输出(不能有重复数字,像两张A),然后比大小(由小到大排序)然后输出。输出格式为如:黑桃4 红桃10 梅花Q 方块K 黑桃A。(不嫌麻烦的话再把两次输出输入到一个txt文件中~)
其实我的主要问题总结一下就是三个:
怎么用struct结构定义一副扑克牌(含大小王)?
怎么随机抽出的5张不重复的牌(包含花色且也不能有大小王)?
怎么对随机抽出的5张不重复的牌(也不能有大小王)比大小,如:J和10怎么比大小,如果J是11,怎么让结果显示10与J(包含花色)?
展开
 我来答
xoaxa
推荐于2017-09-25 · TA获得超过8611个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3493万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct card {
int type; //  type 0:梅花,1:方片,2:红桃,3:黑桃,4:王
int point; // type = 0 -- 3时,point = 2 -- 14,type = 4时,point = 0 -- 1 
}CARD;

void sort(CARD a[],int n) {
int i,j,k;
CARD t;
for(i = 0; i < n - 1; ++i) {
k = i;
for(j = i + 1; j < n; ++j) {
if(a[k].point > a[j].point)
k = j;
}
if(k != i) {
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}

void show(CARD a[],int n) {
int i;
char type[4][5] = {"梅花","方片","红桃","黑桃"};
char point[] = "JQKA";
for(i = 0; i < n; ++i) {
if(a[i].type >= 0 && a[i].type <= 3) {
printf("%s",type[a[i].type]);
if(a[i].point < 11) printf("%d  ",a[i].point);
else printf("%c  ",point[a[i].point - 11]);
}
else {
if(a[i].point) printf("大王");
else printf("小王  ");
}
}
printf("\n");
}

int Has(CARD a[],int n,CARD Card) {
int i;
for(i = 0; i < n; ++i) {
if(a[i].type == Card.type && a[i].point == Card.point)
return 1;
}
return 0;
}

int main() {
CARD arr[5],t;
int i,n = 5,m;
srand((unsigned)time(NULL));
for(i = 0; i < n; ++i) {
t.type = rand()%5; 
if(t.type == 4) t.point = rand()%2;
else t.point = rand()%13 + 2;
if(Has(arr,i,t)) --i;
else arr[i] = t;
}
m = n;
for(i = 0; i < m; ++i) { // 如果有大王,则排在最后 
if(arr[i].type == 4 && arr[i].point) {
t = arr[i];
arr[i] = arr[m - 1];
arr[m - 1] = t;
--m;
}
}                      
for(i = 0; i < m; ++i) { // 如果有小王,也排在最后 
if(arr[i].type == 4) {
t = arr[i];
arr[i] = arr[m -1];
arr[m - 1] = t;
--m;
}
}
sort(arr,m);
show(arr,n);
return 0;
}
更多追问追答
追问
问题补充已提出,能不能修改一下程序再简要回答一下,麻烦啦~加了30分~
追答
1、一张扑克牌的属性可以用花色和牌点两个参数来描述,构造数据参看代码,按桥牌规则定义四种花色的排列顺序,规则外的大小王类型高于这四种类型。
2、抽取不含大小王的任意一张牌时,花色类型为 0 -- 3,语法 type = rand()%4;,可产生的序列为0 -- 3,对应的花色是:梅花,方片,红桃,黑桃;牌点的大小用 2 -- 14来表示,语法 point = rand()%13 + 2;,可产生的序列为2,3,4,5,6,7,8,9,10,11,12,13,14,对应的牌点为2,3,4,5,6,7,8,9,10,J,Q,K,A。
3、抽取含有大小王的一张牌时,花色类型为0 -- 4,语法 type = rand()%5;,type为4时,表示大小王,至于是大还是小,由 point = rand()%2;来决定,0 小王,1 大王。
4、随机抽取多张牌时,为避免重复,将已经产生的牌存放在数组中,新产生的牌与数组中已有的牌进行比对,如果有相同的,则废弃并重新产生,否则,新牌存入数组。
4、以上的牌点的定义为排序带来了方便。特殊考虑的是大小王,请参看代码。
5、可改进方面:排序时,不光考虑牌点,还要考虑花色(已经改好)。
bfdnyj
2015-03-09 · TA获得超过469个赞
知道小有建树答主
回答量:217
采纳率:100%
帮助的人:134万
展开全部

// 按你的要求写了一个程序(没调试),希望采纳!

#include<stdio.h>
#include<string.h>
#include<stdib.h>
int main(void)
{
void sort(int*, int, int);
// 定义54张牌的名称
char *pname[] = {
"草花3","方片3","红桃3","黑桃3",
"草花4","方片4","红桃4","黑桃4",
"草花5","方片5","红桃5","黑桃5",
"草花6","方片6","红桃6","黑桃6",
"草花7","方片7","红桃7","黑桃7",
"草花8","方片8","红桃8","黑桃8",
"草花9","方片9","红桃9","黑桃9",
"草花10","方片10","红桃10","黑桃10",
"草花J","方片J","红桃J","黑桃J",
"草花Q","方片Q","红桃Q","黑桃Q",
"草花K","方片K","红桃K","黑桃K",
"草花A","方片A","红桃A","黑桃A",
"草花2","方片2","红桃2","黑桃2",
"小王","大王"};

// 随机抽取10张牌(两组牌,每组5张)
int select[10], len=0, i, sel;
srand((unsigned int)(time(NULL)); // 产生不可预见的随机序列
while(len<10) // 只要随机抽取的扑克牌少于10张,就不断地循环
{
sel = rand() % 54; // 随机生成一个 0-53 的数
for(i=0; i<len; i++) // 利用循环检查之前生成的每一个数
{
// 如果新得到的数与之前生成的某个数相等就提前退出检查循环
if(select[i]==sel) break;
}
// 如果检查循环没有提前结束,说明这次生成的随机数不会与之前的重复
if(i==len)
{
select[i]=sel; // 记录这个新生成的随机数
len++; // 更新已经生成的随机数的数量记录
}
}

// 对前 5 张进行排序
sort(select, 0, 5);
// 对后 5 张进行排序
sort(select, 5, 10);

// 输出排序结果
FILE *fp; // 文件结构体指针
if(fp = fopen("poker.txt","w")) // 如果以“写入”方式打开文件成功
{
// 写入第一组
for(i=0; i<5; i++)
{
fprintf(fp, "%s ", pname[select[i]]);
}
fprintf(fp, "\n");

// 写入第二组
for(i=5; i<10; i++)
{
fprintf(fp, "%s ", pname[select[i]]);
}
fprintf(fp, "\n");

fclose(fp); // 关闭文件
}
return 0;
}

// 排序用的子函数
void sort(int *select, int start, int end)
{
int i, temp;
while(--end>start)
{
for(i=start; i<end; i++)
{
if(select[i]>select[i+1])
{
temp=select[i];
select[i]=select[i+1];
select[i+1]=temp;
}
}
}
}
更多追问追答
追问
问题补充已提出,能不能修改一下程序再简要回答一下,麻烦啦~加了30分~
追答

改好了,但由于字数限制,所以只能发附件了。


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式