掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27413

漢字のソート
投稿者---samurai(2006/06/29 11:20:36)


高森
青山
山田
と並んでいる名前を昇順にソートしたいのですが
<pre>void sort2(syain data[],int n)
{
int i,j;
for(i=0; i&lt;n-1; i++){
for(j=i+1; j&lt;n; j++){
if(strcmp(data[i].Name,data[j].Name)&gt;0){
swap(&amp;data[i],&amp;data[j]);
}
}
}
}
</pre
としても高森
    山田
    青山
となってしまします。どのようにしたらいいでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:漢字のソート 27414 Blue 2006/06/29 11:25:59
<子記事> Re:漢字のソート 27431 へろり 2006/06/29 18:46:58


No.27414

Re:漢字のソート
投稿者---Blue(2006/06/29 11:25:59)


普通は文字コードでソートしますけど、
どのようにソートしてもらいたいのでしょうか?

まさかフリガナとかいいませんよね?
そんなこといったら、漢字をフリガナに変換するという作業が必要になり、
結構高度です。


この投稿にコメントする

削除パスワード

No.27415

Re:漢字のソート
投稿者---samurai(2006/06/29 11:28:59)


>どのようにソートしてもらいたいのでしょうか?
結果としては
青山
高森
山田
としたいのですが難しいですか?


この投稿にコメントする

削除パスワード

No.27416

Re:漢字のソート
投稿者---Blue(2006/06/29 11:35:00)


全ての質問に答えてくれませんでしょうか?
> まさかフリガナとかいいませんよね?

それと、
> 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
を守って、きちんと明記してもらえれば、環境に依存する機能を活用すれば簡単にできる方法があるかもしれません。
(おそらく、今までのコードよりもフリガナ変換を実現するコードのほうが長くなりそうですが。)


この投稿にコメントする

削除パスワード

No.27418

Re:漢字のソート
投稿者---acid(2006/06/29 11:50:58)


コンピュータで並べ替えといえば、文字コードの順で並べ替えることを言います。
そして文字コードというのは大体音読みで並んでいます。
そのためコンピュータは、
高森 はコウシン
青山 はセイサン
山田 はサンデン
といった感じで(あくまで感じ)認識して、並べ替えをします。
なので高山(コ)山田(サ)青山(セ)の順で出力されます。

これを意図した順番に並べ替えるのは、かなり手間だと思いますよ。
例えばファイルからの入力でしたら、ふりがなも同時に読み込んで、
ふりがなでソートして対応する漢字を出力とか、
または漢字と振り仮名のマッピングをするとか?(どれだけ大きいんだよw)

ところでエクセルは訓読みソートも出来るらしいですね。
そんな所で頑張るなMicrosoft(w


この投稿にコメントする

削除パスワード

No.27419

Re:漢字のソート
投稿者---samurai(2006/06/29 13:50:33)


振り仮名でソートしないと目的には達成できないのであれば
振り仮名でソートしたいです。

visual c++6.0で行っています。


この投稿にコメントする

削除パスワード

No.27421

Re:漢字のソート
投稿者---acid(2006/06/29 14:23:30)


>振り仮名でソートしないと目的には達成できないのであれば
>振り仮名でソートしたいです。
>
>visual c++6.0で行っています。
日本語おかしいけど大丈夫ですか?
作りたいのは貴方であって、私たちではありませんよ。

まぁ振り仮名振ってでも訓読みソートしたいとしましょう。

char list[x][2]の配列を作って、
[高森][たかもり]・[青山][あおやま]・[山田][やまだ]みたいに格納します。
で、配列ごとふりがなの方でソートをかけて、出力は漢字の方を出力すればOK。
さすがに、実装の仕方までは聞かないでくださいよ。


この投稿にコメントする

削除パスワード

No.27426

Re:漢字のソート
投稿者---si(2006/06/29 16:25:10)


和布蕪を使ったサンプル(furigana.c)
(動作確認 Linux,gcc4,UTF-8)
#include <mecab.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *mecab_yomi(char *str)
{
    int argc = 3;
    char *argv[] = {"-p","-O","yomi"};
    mecab_t *mecab;
    const char *res;
    char *yomi = NULL;
    
    mecab = mecab_new (argc, argv);
    if (mecab) {
        res = mecab_sparse_tostr(mecab, str);
        if (res) {
            yomi = strdup(res);
            if (yomi == NULL) {
                printf("strdup error.\n");
            }
        } else {
            printf("Error: yomi %s: %s\n",str,mecab_strerror (mecab));
        }
        mecab_destroy(mecab);
    } else {
        puts("mecab_new error.");
    }
    
    return yomi;
}

typedef struct {
    char *name;
    char *yomi;
} name_t;

int compare(const void *p1, const void *p2)
{
    name_t *n1 = (name_t *)p1;
    name_t *n2 = (name_t *)p2;
    int res,i;
    for ( i = 0 ;
      (res = (unsigned char)n1->yomi[i] - (unsigned char)n2->yomi[i]) == 0 ;
      i++ ) {
        if (n1->yomi[i] == '\0') break;
    }
    return res;
}

int main(void)
{
    name_t names[] = {
        {"山田",NULL},{"高森",NULL},{"青山",NULL},
        {"鈴木",NULL},{"木村",NULL},{"佐藤",NULL},
        {NULL,NULL}
    };
    char *yomi;
    int i,j;
    for ( i = 0 ; names[i].name != NULL ; i++) {
        names[i].yomi = mecab_yomi(names[i].name);
        if (names[i].yomi) {
            puts(names[i].yomi);
        } else {
            for ( j = 0 ; j < i ; j++) {
                free(names[j].yomi);
            }
            return 1;
        }
    }
    qsort(names,i,sizeof(name_t),compare);
    for ( j = 0 ; j < i ; j++ ) {
        puts(names[j].name);
        free(names[j].yomi);
    }
    return 0;
}
実行:
$ gcc furigana.c -lmecab
$ ./a.out
ヤマダ

タカモリ

アオヤマ

スズキ

キムラ

サトウ

青山
木村
佐藤
鈴木
高森
山田

注:これは、和布蕪とIPA 辞書を使った読みに基づいたものです。
人名や地名等は、振りがなを入力して sort した方が良いと思う。


この投稿にコメントする

削除パスワード

No.27417

Re:漢字のソート
投稿者---nop(2006/06/29 11:40:19)


>結果としては
>青山
>高森
>山田
>としたいのですが難しいですか?

では、その様な結果になる判断基準は何ですか?


この投稿にコメントする

削除パスワード

No.27431

Re:漢字のソート
投稿者---へろり(2006/06/29 18:46:58)


>高森
>青山
>山田
>と並んでいる名前を昇順にソートしたいのですが
>

ソートを行う条件(何がより小さく、何がより大きい)のかが不明です。
仮にフリガナを50音順とするならば”笠”は”かさ”と読みますか”りゅう”
と読みますか。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧