/*背景:两个人每人发3张牌(各从一副牌中),
每张牌包括花色(红桃(Heart)>黑桃(Spade)>方块(Diamond)>梅花(Club))和大小(从小到大依次是:2-10、J、Q、K、A),谁
手上有最大的一张或多张(如果有相同的牌)牌谁获胜。
输入:A的3张牌(未排序)和B的3张牌(未排序)。
(参见用例)
DA H2 C3
H4 H3 DJ
输出:A的3张牌的排序后的输出和B的3张牌的排序后的输出,以及A和B谁获胜。
(参见用例)
Winner is B!
A: H2 DA C3
B: H4 H3 DJ
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct card_structure{
int type;
int number;
int abs;
};
/**
* 牌的数据结构。
* type对应花色,值为1到4。
* number对应大小,值为1到13。
* 2的值为1,3的值为2……10的值为9,J的值为10,Q的值为11,K的值为12,A的值为13。
* abs为“数值绝对大小”,由number + (4- type) * 13算出。用来给牌排序。
*/
typedef struct card_structure card;
void my_input(char *c1, char *c2);
int my_analyze(char *c, card * cards);
int my_get_type_value(char type);
int my_get_number_value(char number);
void my_get_string(card * cards, char * buffer);
int my_compare (const void *a ,const void *b);
void my_tidy_cards(card * cards);
void my_get_winner(card * player1, card * player2);
/**
* 花色字典:1代表H,2代表S,3代表D,4代表C
*/
char g_types[5] = {' ', 'H', 'S', 'D', 'C'};
/**
* 牌的大小字典:2的值为1,3的值为2……10的值为9,J的值为10,Q的值为11,K的值为12,A的值为13。
* 注意!10由于是两个字符,所以用T代替。
*/
char g_numbers[14] = {' ', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
/**
* 让用户用键盘输入两个字符串到c1和c2两个字符数组。
* 作为玩家1和玩家2的牌。
* @param c1 char *
* @param c2 char *
*/
void my_input(char *c1, char * c2){
gets(c1);
gets(c2);
}
/**
* 将牌的字符串分析成数据结构
* @param c char * 牌的字符串
* @param cards card * 分析后的牌的数据结构地址
* @return int 1表示分析成功,0表示输入有误,分析失败。
*/
int my_analyze(char *c, card * cards){
int len = strlen(c);
int pos = 0;
int count = 0;
while(1){
if(pos + 1 > len - 1){
return 0;
}
char type_name = c[pos];
char number_name = c[pos + 1];
char number_name2 = c[pos + 2];/*这个可能是空格,也可能是大小为10的牌的号码10的那个0。*/
int type_value = my_get_type_value(type_name);
if(!type_value){
return 0;
}
int number_value = 0;
if('0' != number_name2){
number_value = my_get_number_value(number_name);
if(!number_value){
return 0;
}
pos += 3;
}
else if('0' == number_name2 && '1' == number_name){
number_value = my_get_number_value('T');
pos += 4;
}
else{
return 0;
}
cards[count].type = type_value;
cards[count].number = number_value;
cards[count].abs = number_value + (4 - type_value) * 13;
int j = 0;
for(;j < count; j ++){ /* 不允许有重复的牌 */
if(cards[j].abs == cards[count].abs){
return 0;
}
}
count ++;
if(count >= 3){
return 1;
}
}
}
/**
* 按花色获取值
* @param type char 花色字符。H、S、D或C。
* @return int 0到4。0代表错误,1代表H,2代表S,3代表D,4代表C。
*/
int my_get_type_value(char type){
type = toupper(type);
int len = sizeof(g_types) / sizeof(char);
int i;
for(i = 1; i < len; i ++){
if(g_types[i] == type){
return i;
}
}
return 0;
}
/**
* 按牌的大小获取值
* @param number char 牌的大小字符。2、3、4、……10、J、Q、K或A。注意!10由于是两个字符,所以用T代替。
* @return int 0到13。0代表错误。2的值为1,3的值为2……10的值为9,J的值为10,Q的值为11,K的值为12,A的值为13。
*/
int my_get_number_value(char number){
number = toupper(number);
int len = sizeof(g_numbers) / sizeof(char);
int i;
for(i = 1; i < len; i ++){
if(g_numbers[i] == number){
return i;
}
}
return 0;
}
/**
* 将牌的数据结构变为字符串。
* @param cards card * 牌的数据结构。
* @param buffer char * 字符输出缓存。
*/
void my_get_string(card * cards, char * buffer){
int i = 0;
int pos = 0;
for(;i < 3; i ++){
card cd = cards[i];
int type = cd.type;
int number = cd.number;
char type_name = g_types[type];
char number_name = g_numbers[number];
buffer[pos] = type_name;
if('T' == number_name){
buffer[pos + 1] = '1';
buffer[pos + 2] = '0';
buffer[pos + 3] = ' ';
pos += 4;
}
else{
buffer[pos + 1] = number_name;
buffer[pos + 2] = ' ';
pos += 3;
}
}
buffer[pos] = 0;
}
/**
* 给牌做排序时要用到的比较函数。
* @param a const void *
* @param b const void *
* @return int
*/
int my_compare (const void *a ,const void *b) {
card *ca=(card * ) a,*cb = (card * )b;
int aa = ca->abs, bb = cb->abs;
if(aa > bb) return -1;/*倒序排列*/
else if(aa == bb) return 0;
else return 1;
}
/**
* 将牌的数组按牌的花色和大小排序。
* @param cards card * 牌的数组首地址
*/
void my_tidy_cards(card * cards){
qsort(cards, 3, sizeof(card), my_compare);
}
/**
* 判断赢家,并做显示输出。
* @param player1 card * 玩家1的牌的数组的首地址
* @param palyer2 card * 玩家2的牌的数组的首地址
*/
void my_get_winner(card * player1, card * player2){
int i = 0;
int v1, v2;
for(;i < 3; i ++){
v1 = player1[i].abs;
v2 = player2[i].abs;
if(v1 > v2){
printf("Winner is A!\n");
return;
}
else if(v1 == v2){
continue;
}
else{
printf("Winner is B!\n");
return;
}
}
printf("Winner is X!\n");
return;
}
int main(int argc, char** argv) {
char c1[20];/*字符数组1,存放玩家1的牌的字符串*/
char c2[20];/*字符数组2,存放玩家2的牌的字符串*/
my_input(c1, c2);/*输入牌*/
card player1[3];/*玩家1的牌的数组*/
card player2[3];/*玩家2的牌的数组*/
int result;
result = my_analyze(c1, player1);/*分析玩家1的牌的字符串,放入玩家1的牌的数组*/
if(!result){
printf("Input Error!");
return -1;
}
result = my_analyze(c2, player2);/*分析玩家2的牌的字符串,放入玩家2的牌的数组*/
if(!result){
printf("Input Error!");
return -1;
}
my_tidy_cards(player1);/*玩家1的牌按花色和大小排序*/
my_tidy_cards(player2);/*玩家2的牌按花色和大小排序*/
my_get_winner(player1, player2);/*判断赢家,并显示输出。*/
char s1[20];/*整理后的牌的字符串表示*/
char s2[20];
my_get_string(player1, s1);/*将玩家牌的数组转换为字符串。*/
my_get_string(player2, s2);
printf("A: %s\nB: %s\n", s1, s2);/*输出排序后的牌*/
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
北京理工大学程序设计基础(C语言)作业代码
共83个文件
txt:83个
需积分: 25 1 下载量 148 浏览量
2021-11-17
20:19:07
上传
评论
收藏 73KB ZIP 举报
温馨提示
当初上C语言的时候做过的编程题
资源详情
资源评论
资源推荐
收起资源包目录
C语言作业代码.zip (83个子文件)
作业代码
递归求奇数和.txt 439B
分数四则运算.txt 1009B
基本四则运算表达式.txt 1KB
计算两个日期之间相差多少天.txt 2KB
安排比赛.txt 1KB
锻炼身体.txt 981B
求表示方法.txt 715B
三次方的后三位.txt 1KB
排序和插入.txt 1KB
求特定三位数.txt 1KB
子串反向——递归.txt 1005B
巧算自然数.txt 840B
成绩统计.txt 1KB
判断回文字符串.txt 711B
输出学生成绩.txt 746B
打印字母等腰三角形.txt 1023B
成绩排序.txt 1KB
洗牌.txt 2KB
扫雷.txt 2KB
链表合并.txt 2KB
学生成绩.txt 980B
求最大公约数和最小公倍数.txt 805B
数字菱形.txt 2KB
计算后续日期.txt 1KB
恭喜发财 利是窦来.txt 3KB
邮票组合.txt 2KB
母亲节是几号.txt 725B
链表排序.txt 2KB
铺地板.txt 1KB
找二维数组的鞍点.txt 1KB
组成最大数.txt 673B
晕.txt 1KB
买东西(期末题).txt 3KB
找出最大素数.txt 560B
建立正序列表.txt 1KB
单词排序.txt 2KB
文件处理 猜猜我是谁(问题代码).txt 838B
逆波兰表达式.txt 3KB
猴子吃桃子.txt 776B
字符串输入并反向显示.txt 705B
合并字符串(归并排序).txt 1KB
北理工的恶龙.txt 3KB
删除负数(期末题).txt 2KB
计算国庆节假期.txt 2KB
寻找阿姆斯特朗数.txt 1KB
打印空心倒三角形.txt 825B
子数.txt 1KB
函数递归(期末题).txt 670B
解析字符串.txt 823B
统计字符串出现次数.txt 863B
空心字符菱形.txt 1KB
查找数.txt 803B
为整数编号.txt 3KB
最大数与最小数的四则运算.txt 2KB
黑色星期五.txt 1KB
学生成绩排序.txt 2KB
计算星期几.txt 3KB
求最大公约数——递归.txt 514B
卖鸭子.txt 776B
零钱换整钱(超时).txt 1KB
拆分整数(期末题).txt 1KB
回文数.txt 1KB
Poker Time.txt 7KB
一元二次方程.txt 1KB
吃火锅.txt 2KB
输出图形(山形?).txt 865B
身份证号(用例3没过).txt 4KB
串的减法.txt 793B
字母加密对照表.txt 1021B
计算最大三角形面积(算法有误).txt 2KB
删除重复字符.txt 556B
画一个由字符组成的菱形.txt 909B
计算时钟夹角.txt 1KB
寻找特殊偶数.txt 1KB
水王争霸.txt 2KB
安全的密码.txt 2KB
数字金字塔.txt 485B
链表移动.txt 2KB
替换字符串.txt 1KB
车辆限行.txt 4KB
冒泡排序指针版.txt 740B
字母存储.txt 2KB
全能战士.txt 602B
共 83 条
- 1
lingziqing
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0