close
題目:C++撲克牌比大小
 
問題描述 :
撲克牌的遊戲有很多種,像是大老二、撿紅點等。然而,現在您要參與的是比大小遊戲,每張牌各有其花色和數字,大小比較主要以花色為主,黑桃 > 紅心 > 方塊 > 梅花;倘若花色相同時,則比較數字。
 
輸入說明 :
第一列的整數,代表撲克牌的疊數,其後有若干列,每列即為一疊牌的內容,每張牌分別以英文、數字作表示,其中 S 代表黑桃、 H 代表紅心、 D 代表方塊、 C 代表梅花。每筆資料分別以空白隔開。
 
輸出說明 :
印出排列過後的撲克牌。一行是一 疊 牌, 每張牌以空白隔開。
 
 
這題的概念是看大家會不會分批判斷大小,一關一關過,對於新手來說會比較難想
不過放心,這題只要一步一步都做好就行喽!!
 
題目一開始要我們輸入資料個數,這算是老打法了,大家就記得打完幾筆後要用 cin.ignore();來躲掉換行
 
之後將打的資料全轉成字串,再一一把他們切出來放在一維陣列裡
之後用好用的sort排大小啦(標頭檔記得打喔!!)
 
ㄟ~~不過sort不是知能用於數字大小嗎?
但這題有英文ㄟ0A0
其實sort()他括號裡是塞這些三樣東西
 
sort(arr.begin(),arr.end(),cmp規則);
 
也就是把陣列位置0到n裡的去按照規則做排序
他裏頭的排法是2筆做比較,所以她只有兩種答案
假如arr陣列中,arr[0]比較arr[1]大的話回傳true;反之,傳false
bool布林值得功能就很好用
 
bool cmp(string a,string b)
{
   <----我是規則程式碼---->
}
 
cmp裡的東西就是題目的要求
讀懂題目的各位會發現,剛開始先筆就第一個英文字母,而字母的大小剛好跟ASCII相同
所以第一個if知道後之後就是如果字母相同,那就是比數字啦
 
然而先別傻傻的真的去筆,到最後你會發現,有些它是十位數ㄟ,怎一對一筆阿(*'^´)=3
so,去比他們的長度,例如C13和C5誰比較大,膝蓋想也知道是C13
它的長度是3,C5則是2
於是搞定玩一個else if裡的其中一個if後還有2種狀況
1.長度一樣且長度是2(例如:C1和C2
2.長度一樣且長度是3(例如:C11和C12
 
用完規則後再一一印出來
 
這題其實就是把規則用好,剩下就很簡單了
 
 
如果你對sort有興趣分享這個給你看看啦( ^_^)_~~丟
 
END
 
code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <string>
#include<vector>
#include <stdlib.h>
#include <iostream>
using namespace std;
vector<string> buf;
int getCode(string s);
bool cmp(string a, string b);
int main()
{
    int many,i;
    char a;
    scanf("%d", &many);
    scanf("%c", &a);
    char str[100];
    char delim[] = " ";
    char * pch;
    char arr[100][100];
    bool x;
    for (i = 0; i < many; i++)
    {
        gets(str);
        pch = strtok(str, delim);
        while (pch != NULL)
        {
            string s(pch);
            buf.push_back(s);
            pch = strtok(NULL, delim);
        }
        sort(buf.begin(), buf.end(), cmp);
        for (int i = 0; i < many; i++)
        {
            for(int j=0;j<buf.size();j++)
            {
              strcpy(arr[i], buf[j].c_str());
            }
        }
    }
    for (int i = 0; i < many; i++)
        {
            for(int j=0;j<buf.size();j++)
            {
                printf("%s ",arr[i][j]);
            }
            printf("\n");
        }
}
int getCode(string s)
{
    int v;
    switch (s[0])
    {
    case 'S':
        v = 400;
        break;
    case 'H':
        v = 300;
        break;
    case 'D':
        v = 200;
        break;
    case 'C':
        v = 100;
        break;
    }
    v = v + atoi((s.c_str() + 1));
    return v;
}
bool cmp(string a, string b)
{
    return getCode(a) > getCode(b);
}
 
arrow
arrow
    全站熱搜

    佑佑 發表在 痞客邦 留言(0) 人氣()