C言語関係掲示板

過去ログ

No638 文字のソートとカウント

[戻る] [ホームページ]
No.6774

文字のソートとカウント
投稿者---サップ(2003/05/26 11:36:44)


文字のソートってどうやるんですか?
複数の単語が重複して入っているデータがあったとします。
ex)
タカシ,クミコ,ケンイチ,エミ,マサオ,ユウイチロウ,タカシ,
クミコ,ケンイチ,エミ,マサオ,
ユウイチロウ,タカシ,クミコ,ケンイチ,エミ,
マサオ,ユウイチロウ,タカシ,クミコ,

これをソートする場合はどうしたらよいのですか?
タカシ
タカシ
クミコ
クミコ
 ・
 ・
 ・
としたいのですが・・・。
どうかご教授お願いします!!


さらに重複する部分もカウントしたいのですが、余力があれば
こちらの回答もお願いします。
カウント内容は(タカシ 2,クミコ 3、・・・)です。

No.6776

Re:文字のソートとカウント
投稿者---ヒカル(2003/05/26 12:02:34)


>文字のソートってどうやるんですか?
>複数の単語が重複して入っているデータがあったとします。
...(中略)
>としたいのですが・・・。
>どうかご教授お願いします!!
>
>さらに重複する部分もカウントしたいのですが、余力があれば
>こちらの回答もお願いします。
>カウント内容は(タカシ 2,クミコ 3、・・・)です。

どうも、ヒカルです。

サップさんはどこまで自分でやっているのでしょうか。
ソースを掲示してもらえませんか?

>さらに重複する部分もカウントしたいのですが、余力があれば
>こちらの回答もお願いします。
回答を求めるのはどうかと思いますが・・・。

No.6777

Re:文字のソートとカウント
投稿者---サップ(2003/05/26 13:26:11)


すみませんでした!!
ソースは以下のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

/*比較関数*/
int compare(const void *arg1, const void *arg2)
{
    return (??????????);
}

void main()
{

    FILE            *fpr, *fpnw, *fpow;        /*ファイルポインタ(読み込み,新規,上書き)*/
    char             filename[256];           /*データ格納配列*/
    char            *mems;                    /*メモリポインタ*/
    struct stat      size;                    /*stat構造体変数(総バイト数)*/
    int              i,j;                     /*カウント用変数*/

    printf("Please input file name >");
    scanf( "%s", filename );
    
    fpr = fopen( filename, "r");
    if( fpr == NULL ){
        printf( "File is not open! [%s].\n", filename );
        exit(0);
    }
    
    if( stat ( filename, &size ) == 0){
        mems = malloc ( size.st_size );
        if( mems == NULL ){
            printf( "メモリー領域を確保できません。" );
            fclose(fpr);
            exit(0);
        }
        if ( fread (mems, size.st_size, 1, fpr) < 0){
            printf("メモリーへデータを格納できません。");
            fclose(fpr);
            exit(0);
        }
    }
    else{
        printf( "ファイルサイズを計測できません" );
        fclose(fpr);
        exit(0);
    }
    fclose(fpr);

    for ( i = 0 , j = 0 ; i <= strlen(mems) ; i++ ){
        if( mems[i] == ',' ){
            mems[i] = '\n';
            j++;
        }else if( mems[i] == '\n' ){
            j++;
        }
    }

    qsort ( mems, ???, ???, compare);


/*以降書き込み処理部*/
    free(mems);
    printf("処理が正常に終了しました。\n");
}

流れは、
ファイル名を取得
ファイルのサイズを測りその分だけメモリを確保
メモリにファイルデータ入れる(CSV)
カンマを改行に置換(置換する必要があるのか?)
置換中の変数jで区切った単語の数をカウント
です。
その下のソートがよくわからんのです。
strcmpで自分なりにやってみたのですが、ソートさ
れず文字化けしちゃいました。

すみませんがよろしくお願いします。

あと、あくまで解答ではなく回答なので・・・。

No.6786

Re:文字のソートとカウント
投稿者---TDa(2003/05/26 18:07:01)


ソースをみましたが元ファイルを一気に文字列に取り込んでいるようですが
それでうまくいきますか?

下にqsortを使用したサンプルコードを書いてみました。
仕様を読むと後者の方が必要なのでは?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char str[] = "akwejrp0a89fuba4eil5ur[0fsd987ufjanwkel;urjf";
char *strings[] = {
    "abc",
    "acce",
    "aabaic",
    "acb",
    NULL
};

int comp1(const void *v1, const void *v2)
{
    return *(char*)v1 - *(char*)v2;
}


int comp2(const void *str1, const void *str2)
{
    return strcmp((char*)str1, (char*)str2);
}


int main(void)
{
    char **p;
    
    printf("1:文字列のソート\n");
    printf("使用前 %s\n", str);

    qsort(str, strlen(str), 1, comp1);
    printf("使用後 %s\n", str);

    printf("\n===================================\n");
    printf("2:文字列の配列のソート\n");
    printf("使用前\n");
    for (p = strings; *p != NULL; ++p)
        printf("%s\n", *p);
    qsort(strings, sizeof(strings) / sizeof(strings[0]) - 1, sizeof(strings[0]), comp2);
    printf("使用後\n");
    for (p = strings; *p != NULL; ++p)
        printf("%s\n", *p);

    return 0;
}


No.6803

Re:文字のソートとカウント
投稿者---サップ(2003/05/27 11:56:35)


>ソースをみましたが元ファイルを一気に文字列に取り込んでいるようですが
>それでうまくいきますか?

いえ、ぜんぜんうまくいきません。
思ったのですが、「qsort()」は配列の並び替え・・・ということは、長さが
一定のものしかソートできないんですか?
上の自分の状態だと、改行文字までの不定のサイズで比較しようとしてい
たのですが、どうやら一定な何かに入れるほうがよろしいですね・・・。
ちょっと考えて見ます!!

No.6806

Re:文字のソートとカウント
投稿者---TDa(2003/05/27 13:30:48)



>いえ、ぜんぜんうまくいきません。
>思ったのですが、「qsort()」は配列の並び替え・・・ということは、長さが
>一定のものしかソートできないんですか?

それは配列をどう定義するかによります。私の上記のコードはchar*の配列
ですのでそれぞれの文字列の長さは異なっていますよね。

>上の自分の状態だと、改行文字までの不定のサイズで比較しようとしてい
>たのですが、どうやら一定な何かに入れるほうがよろしいですね・・・。
>ちょっと考えて見ます!!

タカシ
タカシ
クミコ
クミコ
を配列に格納するように考えるといいでしょう。


No.6808

Re:文字のソートとカウント
投稿者---サップ(2003/05/27 15:06:01)


TDaさんありがとうございます。
なんとかうまく動作しました。(無駄が多いかもしれませんが)

どうやら不定形の配列の宣言仕方はあるらしいのですが、時間が
あればそっちで作り直したいと思います!

ご指導ご鞭撻ありがとうございました!!