| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1258 人关注过本帖
标题:扑克排序问题
只看楼主 加入收藏
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
结帖率:100%
收藏
 问题点数:0 回复次数:4 
扑克排序问题
由于版主不承认我是原创,所以我删除了,接近一个小时的努力没有得到承认。我觉得没有必要拿别人的东西来说是自己做的,那样有意思吗?我回复了别人的【扑克牌排序问题】里面有程序,请大家帮我看看算不算原创?!

[[it] 本帖最后由 josen0205 于 2008-3-29 22:58 编辑 [/it]]
搜索更多相关主题的帖子: 扑克 
2008-03-29 22:45
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
收藏
得分:0 
/*
 有6副带不同底色的扑克牌, 其底色分别为红、绿、蓝、白、粉、紫6种颜色.
 排序规则:
 1. 属性优先度:  点数 > 底色 > 花色
 2. 点数优先度:  3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > J > Q > K > A > 2 > 小王 > 大王
 3. 底色优先度:  红 > 绿 > 蓝 > 白 > 粉 > 紫
 4. 花色优先度:  红心 > 黑桃 > 方块 > 梅花
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

typedef struct Card{
    int bcolor;     /*底色 6:红 5:绿 4:蓝 3:白 2:粉 1:紫*/
    int grade;      /*点数 3 4 5 6 7 8 9 10 11(J) 12(Q) 13(K) 14(A) 15(2) 16(小王) 17(大王)*/
    int color;      /*花色 4:红心 3:黑桃 2:方块 1:梅花*/
    struct Card *next;
}*Link;

char* getbcolor(int n, char *tBuf)
{
    switch(n)
    {
    case 1:
        strcpy(tBuf, "紫");
        break;
    case 2:
        strcpy(tBuf, "粉");
        break;
    case 3:
        strcpy(tBuf, "白");
        break;
    case 4:
        strcpy(tBuf, "蓝");
        break;
    case 5:
        strcpy(tBuf, "绿");
        break;
    case 6:
        strcpy(tBuf, "红");
        break;
    default:
        strcpy(tBuf, "Bad color");
        break;
    }
    return tBuf;
}

char* getcolor(int n, char *tBuf)
{
    switch(n)
    {
    case 0:
        strcpy(tBuf, "00");
        break;
    case 1:
        strcpy(tBuf, "梅花");
        break;
    case 2:
        strcpy(tBuf, "方块");
        break;
    case 3:
        strcpy(tBuf, "黑桃");
        break;
    case 4:
        strcpy(tBuf, "红心");
        break;
    default:
        strcpy(tBuf, "Bad color");
        break;
    }
    return tBuf;
}

char* getgrade(int n, char *tBuf)
{
    switch(n)
    {
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
        sprintf(tBuf, "%d", n);
        break;
    case 11:
        strcpy(tBuf, "J");
        break;
    case 12:
        strcpy(tBuf, "Q");
        break;
    case 13:
        strcpy(tBuf, "K");
        break;
    case 14:
        strcpy(tBuf, "A");
        break;
    case 15:
        strcpy(tBuf, "2");
        break;
    case 16:
        strcpy(tBuf, "小王");
        break;
    case 17:
        strcpy(tBuf, "大王");
        break;
    default:
        strcpy(tBuf, "Bad grade");
        break;
    }
    return tBuf;
}

int InitCards(Link &L) /*生成6副牌324张,存入链表L中*/
{
    int i = 1, j = 1, k = 3;
    Link tmp, p;

    L = (Link)malloc(sizeof(struct Card));
    if(L == NULL)
    {
        printf("动态分配内存失败!");
        return -1;
    }
    p = L;
    for(i = 1; i <= 6; i++) /* 6种底色*/
    {
        /** 小王 **/
        tmp=(Link)malloc(sizeof(struct Card));
        if(tmp==NULL)
        {
            printf("动态分配内存失败!");
            return -1;
        }
        tmp->bcolor = i;
        tmp->color = 0;
        tmp->grade = 16;
        p->next = tmp;
        p = tmp;

        /** 大王 **/
        tmp=(Link)malloc(sizeof(struct Card));
        if(tmp==NULL)
        {
            printf("动态分配内存失败!");
            return -1;
        }
        tmp->bcolor = i;
        tmp->color = 0;
        tmp->grade = 17;
        p->next = tmp;
        p = tmp;
        for(j = 1; j <= 4; j++)/* 4种花色 */
        {
            for(k = 3; k <= 15; k++)
            {
                tmp=(Link)malloc(sizeof(struct Card));
                if(tmp==NULL)
                {
                    printf("动态分配内存失败!");
                    return -1;
                }
                tmp->bcolor = i;
                tmp->color = j;
                tmp->grade = k;
                p->next = tmp;
                p = tmp;
            }
        }
    }
    p->next=L->next;

    return 0;
}

int FreshCards(Link &L) /* 洗牌 */
{
    int m = 0,n = 0,r = 0,i = 0;
    Link T, p, q;

    T = L;
    srand((unsigned)time(NULL));
    r = rand();

    m = r%325;
    n = r%324 + 2;

    p = L->next;
    q = T;
    while(m-1)
    {
        p = p->next;
        m--;
    }
    while(p->next != p)
    {
        i++;
        if(i == n-1)
        {
            q->next= p->next;
            p->next = p->next->next;
            q = q->next;
            i = 0;
        }
        p = p->next;
    }
    q->next = p;
    q = q->next;
    q->next = T->next;
    
    return 0;
}

int GetCards(struct Card *CArray) /* 产生供排序使用的初始排列的6副牌 */
{
    int i = 0;
    Link L, p, s;

    InitCards(L);

    FreshCards(L);
    FreshCards(L);
    FreshCards(L);
    
    p = L->next;
    p = p->next;
    while(p != L->next)
    {
        s = p;
        p = p->next;
        CArray[i].bcolor = s->bcolor;
        CArray[i].color = s->color;
        CArray[i].grade = s->grade;
        i ++;
        free(s);
    }
    CArray[i].bcolor = p->bcolor;
    CArray[i].color = p->color;
    CArray[i].grade = p->grade;
    free(p);
    free(L);

    return 0;
}

int OrderCards(struct Card *inArray, struct Card *outArray)
{
    int i =0, j = 0;
    struct Card tmp;

    for(i = 0; i < 324; i++)
        outArray[i] = inArray[i];

    for(i = 0; i < 323; i++) /* 点数排序 */
    {
        for(j = i+1; j < 324; j++)
        {
            if(outArray[j].grade < outArray[i].grade)
            {
                tmp = outArray[i];
                outArray[i] = outArray[j];
                outArray[j] = tmp;
            }
            else if(outArray[j].grade == outArray[i].grade)
            {
                if(outArray[j].bcolor > outArray[i].bcolor)
                {
                    tmp = outArray[i];
                    outArray[i] = outArray[j];
                    outArray[j] = tmp;
                }
                else if(outArray[j].bcolor == outArray[i].bcolor)
                {
                    if(outArray[j].color > outArray[i].color)
                    {
                        tmp = outArray[i];
                        outArray[i] = outArray[j];
                        outArray[j] = tmp;
                    }
                }
            }

        }
    }

    return 0;
}

int SaveCards(char *tFileName, struct Card *CArray)
{
    int i = 0;
    char tBcolor[16], tGrade[16], tColor[16];
    FILE *fp;

    fp = fopen(tFileName, "w");
    if(fp == NULL)
    {
        printf("打开文件[%s]失败\n", tFileName);
        return -1;
    }

    for(i = 0; i < 324; i++)
    {
        memset(tBcolor, 0, sizeof(tBcolor));
        memset(tGrade, 0, sizeof(tGrade));
        memset(tColor, 0, sizeof(tColor));

        getbcolor(CArray[i].bcolor, tBcolor);
        getgrade(CArray[i].grade, tGrade);
        getcolor(CArray[i].color, tColor);

        fprintf(fp, "[%s,%s,%2s] ", tBcolor, tColor, tGrade);
        
    }
    fclose(fp);
    return 0;
}

int main()
{
    struct Card inArray[326];
    struct Card outArray[326];

    GetCards(inArray);
    OrderCards(inArray, outArray);
    SaveCards("Before.txt", inArray);
    SaveCards("After.txt", outArray);

    printf("Over!\n");

    return 0;
}

[[it] 本帖最后由 josen0205 于 2008-3-30 17:51 编辑 [/it]]

只有想不到,没有做不到
2008-03-29 23:05
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
自己写的 == 原创 ?

Fight  to win  or  die...
2008-03-30 00:25
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
收藏
得分:0 
回复 3# 的帖子
原创,就是完全你自己想出来的,自己创作出来的,自己写出来的东西。
 
转载,就是把别人“原创”的东西搬到另外一个地方(例如博客,论坛之类)。
通常是看到别人的“原创”有同感,觉得很不错,想把它放到另外一个地方让更多人看到之类的就叫转载。
敢问楼上的,你认为什么是原创呢?

只有想不到,没有做不到
2008-03-30 00:45
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
[bo]以下是引用 [un]josen0205[/un] 在 2008-3-30 00:45 的发言:[/bo]

原创,就是完全你自己想出来的,自己创作出来的,自己写出来的东西。
 
转载,就是把别人“原创”的东西搬到另外一个地方(例如博客,论坛之类)。
通常是看到别人的“原创”有同感,觉得很不错,想把它放到另外一个地方让更多人看到之 ...


个人认为版主不承认的原因可能是:
(1)不是自己写的。而是转载的。
(2)是自己写的,也是正确的,但是思路和基础是转载的或来源于已知或公认的知识。即没有技术创新性。
(3)是自己写的,也是正确的,但是技术价值不高,例如方法不够优美或者时空效率还有较大提升空间和潜力等。

虽然我没有认真研究和分析你的代码,但个人认为你的情况最可能属于第三种。

我把你代码复制下来运行了一下,运行时候显示信息NULL Pointer Assignment,打开文件发现文件里都是bad color之类的,不知道是怎么回事。细节还没有检查。但个人认为你的代码确实是花了一些心血,但是不能因为你写的比较认真和辛苦而不指出一些潜在问题:
(1)最重要的问题在于代码的效率和可维护性不好。这个问题的逻辑核心,也就是你的排序函数,使用的方法是三次O(n^2)的冒泡排序。焦点不在于冒泡,虽然结果还是O(n^2),但我觉得三次连续的排序方式是不优美也是呆板的。即使是相同渐进阶,3/2 * n^2 也是比 1/2 * n^2 时间上相差了三倍的。而且越到后面的排序的判断条件越严格。这个所谓的不美,打个实际项目的通俗的比喻,也就是你把实际的业务需求细节写死到代码里面了,体现在你 的题目里就是你的排序代码强依赖别人定义的属性,比如人家某天想把属性之间的优先级的顺序调整一下,或者增加或去掉一个属性,那么你的代码就得跟着手工改。(当然在这里如果你没有很丰富的项目经验的话,可能你并不会意识到我说的这些是什么意思。)
(2)代码中的用到的变量的hard code过多,不利于变动,直接或者间接引用自同一个变量的hardcode过多乃是代码可维护性的大忌。(代码的可维护性的经验,这些只有你做到较大规模的项目时才会有所体会,在书本上基本上是没有的或者说即使写了你没有经历到时也是体会不到为什么这样做或者不这样做的具体原因的。)

当然,我在这种练习题目上提代码可维护性实际上是没什么意义的,但从长远角度考虑,这将是一个写代码的人必须重视的问题。而代码效率我认为则是从一个人刚开始学的时候就应该一直强调的。我个人强调的大致顺序是:
逻辑正确性(可靠性)> 稳定性(容错性) > 可维护性(架构设计质量) > 时间效率 > 空间效率 > 可移植性(跨平台架构,跨语言)。
另一个不参与排序的是易用性(用户体验)。
但对于我而言,我认定的顺序也不是固定的,可能根据具体情况有所偏重和变化,有些因素之间是矛盾性的,比如时间效率和空间效率之间的矛盾,再比如代码效率和代码可读性之间的矛盾,这些都是根据实际需求和背景去制定最佳权衡。比如在嵌入式开发上,则时间和空间效率变得尤其重要,甚至是决定技术方案是否可行的关键要素。

[[it] 本帖最后由 hoodlum1980 于 2008-3-30 03:08 编辑 [/it]]
2008-03-30 01:32
快速回复:扑克排序问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056835 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved