検索

ホームページ  >  に質問  >  本文

c++ - 用冒泡排序处理字符,要求BCAbca整理成AaBbCc。

小弟采用最基本的冒泡排序处理数组形式的字符,
只会按ASCII码整理得ABCabc的结果。
求高人指点,多谢!

PHP中文网PHP中文网2819日前851

全員に返信(5)返信します

  • PHP中文网

    PHP中文网2017-04-17 14:45:38

    小文字を大文字に変換して比較します

    <時間>

    この回答を嫌う人の心理はわかりません~
    C 言語の例

    #include 
    char Upper(char c){
        if (c>='a' && c<='z'){
            c = c - ' ';//32;
        }
        cを返します。
    }
    void main(){
        char str[] = {"BCAbca"};
        内部温度;
        int len = sizeof(str)/sizeof(char);
        レン = レン - 1;
        
        printf("%s\n", str);
        for(int i = 0; iUpper(str[j+1])){ // 小文字を大文字に変更して比較します
                    温度 = str[j];
                    str[j] = str[j+1];
                    str[j+1] = 温度;
                }
            }
        }
        printf("%s\n", str);
    }

    効果:

    <時間> <ブロック引用>

    「a」が「A」の後にあることを確認するにはどうすればよいですか?

    @ブレイデン

    unsigned char Upper(char c){
        char isLow = (c>='a' && c<='z');
        return ((isLow ? c-32 : c) << 1) + isLow ;
    }

    < /p>

    返事
    0
  • PHPz

    PHPz2017-04-17 14:45:38

    考え方は、a を AB 間の数値に変換する、つまり asc コード + 0.5 に似ています。

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 14:45:38

    文字を数値に変換します。例は次のとおりです。

    'A' => 0
    'a' => 1
    'B' => 2
    'b' => 3
    ...

    次のようなもの:

    int arr['z' - 'A' + 1];
    for (int i = 0; i < 26; i++) {
        arr[i] = 2 * i;
        arr[i + 'a'] = 2 * i + 1;
    

    文字 c1 と c2 を比較します:

    if (arr[c1 - 'A'] < arr[c2 - 'A'])

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 14:45:38

    構築学 C++。

     char str[]="BCAbca";
        auto cmp = [](char a, char b)
        {
            自動上限 = [](char c)
            {
                return ( c >= 'A'&&c <= 'Z' );
            };
            自動下限 = [](char c)
            {
                return ( c >= 'a'&&c <= 'z' );
            };
            if (上(a))
            {
                if (上(b))
                    <を返します。 b;
                それ以外
                    a

    返事
    0
  • 阿神

    阿神2017-04-17 14:45:38

    私の兄は答えに触発されて、答えを書こうとしました。主なアイデアは、Aa から Zz までの 52 文字を 1 から 52 にマッピングし、必要に応じて並べ替えて出力することです。
    並べ替え方法は選択並べ替えを使用します。代わりにバブルを使用することもできます。
    
    #include 
    名前空間 std を使用します。
    
    void out(int a[], int n)//整数配列を出力
    {
        for (int k = 0; k < n; k++)
            cout <<a[k]<<
        cout <<
    }
    
    void selectsort(int a[], int n)//ソートを選択
    {
        int i、j、min;
        for (i = 0; i < n; i++)
        {
            分 = i;
            for (j = i + 1; j < n; j++)
            {
                if (a[j] < a[分])
                {
                    最小 = j;
                }
            }
            swap(a[i], a[min]);
            out(a, n);// 1つずつ出力します
        }
    }
    
    ボイドメイン()
    {
        char a[11] = { 'a','f','E','c','b','n','M','d','F','N','g' };
        int b[11];
        char c[11];
        for (int i = 0; i < 11; i++)
        {
            if (a[i] >= 65 && a[i] <= 90)
            {
                b[i] = int(a[i] * 2 -129);//大文字は 1 ~ 52 の奇数に対応します
            }
            それ以外
            {
                b[i] = int(a[i] * 2 -192);//小文字は偶数に対応します
            }
        }
        選択ソート(b, 11);
        for (int j = 0; j < 11; j++)//整数を出力用の文字に変換します。
        {
            if (b[j] % 2 != 0)
            {
                c[j] = char((b[j] + 129) / 2);
            }
            それ以外
            {
                c[j] = char((b[j] + 192) / 2);
            }
        }
        選択ソート(b, 11);
        for (int k = 0; k < 11; k++)//出力文字配列
            cout <<c[k]<<
        cout <<
    }

    返事
    0
  • キャンセル返事