C言語 配列の中身とカウント数の連動の仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ruo

C言語 配列の中身とカウント数の連動の仕方

#1

投稿記事 by ruo » 6年前

C言語についてです。
指定した11桁の数字を用意し、他にランダムに11桁の数字を100個用意し、
100個の11桁数列それぞれに対して、指定した11桁の数字と一致している個数をカウントするプログラムを作成しています。

その後に、一致している個数(カウント数)が大きい順に上から数列を表示するようにしたいのですが、
カウント数の並べ替えはできても数列の並べ替えができません。
文章にしてもわかりずらいと思うので、ソースを貼らせていただきます。

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


int main(void)
{
int i,j=0,k,l,count = 0,dumy,next[11], kouho[11],
goal[]={1,2,3,4,5,6,7,8,9,1,2},Data[101][10],Count[101];

srand((unsigned)time(NULL));

printf("GOAL ");
for(i=0;i<11;i++){
printf("%d", goal);
}
printf("\n");


for(k=1;k<101;k++){
for(i = 0; i < 11; i++)
{
kouho = rand() % 10;
}

count = 0;

printf("KOUHO%d ", k);

for(i = 0; i < 11; i++){
printf("%d",kouho);
Data[k]=kouho;
}


for(i=0;i<11;i++){
if(kouho == goal){
count = count + 1;
next = kouho;

}else{
next = rand() % 10;
}
}

printf(" %d", count);
printf("\n");

Count[k]=count;

}

for(k = 1; k < 101; k++){
for(l = k + 1; l < 101; l++){

for(k = 1; k < 101; k++){
for(l = k + 1; l < 101; l++){
if(Count[k] < Count[l]){
dumy = Count[k];
Count[k] = Count[l];
Count[l] = dumy;
}
}
}

for(k=1;k<101;k++){
for(i=0;i<11;i++){
printf("%d", Data[k][i]);
}
Count[k] = Count[l];
Count[l] = dumy;
}
}
}

for(k=1;k<101;k++){
for(i=0;i<11;i++){
printf("%d", Data[k][i]);
}
printf("\n");

for(k = 1; k < 101; k++){
for(i=0;i<11;i++){
printf("%d ",Count[k]);
printf("%d", Data[k][i]);
}
printf("\n");

for(k = 1; k < 101; k++){
printf("%d ",Count[k]);

for(i=0;i<11;i++){
printf("%d", Data[k][i]);
}
printf("\n");
}
}

return 0;
}

[/code]

今回は12345678912という数列を対象に考えました。
例として01341111111という数列がでてきたときは、3と4と後ろから2番目の1の一致でカウント数3
となります。
このように100個発生させ、すべてカウントしていき、カウントが多い順に数列を並べ替えさせたいです。
どの部分を改良すればよいのか教えてほしいと思い、投稿しました。
よろしくお願いいたします。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: C言語 配列の中身とカウント数の連動の仕方

#2

投稿記事 by beatle » 6年前

codeタグの使い方が間違っていますので,投稿前に必ずプレビューして確認してくださいね.

100個のランダム列の識別番号(0から99.配列の)iと,ランダム列iについての一致カウント数niを組にして並べ替えます.
(0, n0), (1, n1), (2, n2), ... , (99, n99)
を並べ替えるということです.

並べ替えの勉強段階では,単純な数列10, 2, 8, 3, 21, ...のようなものの並べ替えをすると思います.
今回はそれではダメで,次のような並べかえをしなければなりません.

次のような(添字, 値)の列に対して
(0, 10), (1, 2), (2, 8), (3, 3), (4, 21)
カウント数が大きい順に並べ替えして
(4, 21), (0, 10), (2, 8), (3, 3), (1, 2)

添字と値の組を並べ替えると,元の列の4番目にあった要素が,並べ替えたら0番目に来たとかいうのがわかります.

これはちょっと高度な技です.
これをやるには現在のプログラムはちょっとごちゃごちゃし過ぎてますので,ランダム列の生成を関数化するとか,コメントを少し書くとか,ソースコードを整理してみませんか?

アバター
usao
記事: 1569
登録日時: 6年前

Re: C言語 配列の中身とカウント数の連動の仕方

#3

投稿記事 by usao » 6年前

とりあえず Data[101][10] → Data[100][11] かと.

あと,真ん中らへんに↓こんな箇所があるのですが,書き込み時のミスでしょうか?

コード:

for(k = 1; k < 101; k++){
for(l = k + 1; l < 101; l++){

for(k = 1; k < 101; k++){
for(l = k + 1; l < 101; l++){
オフトピック
ソートしないという選択肢…は無しでしょうねw

コード:

//桁数と候補データ数
#define DIGIT   11
#define NDATA   100

//桁数分のint配列を表示する作業関数
void PrintData( const int *pData )
{
    for( int i=0; i<DIGIT; i++ )
    {   printf( "%d", pData[i] );   }
    printf( "\n" );
}

//メイン
int main(void)
{
    const int goal[DIGIT]={1,2,3,4,5,6,7,8,9,1,2};
    int Data[NDATA][DIGIT];
    int Count[NDATA] = { 0 };

    srand((unsigned)time(NULL));

    //
    printf("GOAL:");
    PrintData( goal );

    //
    int MaxCount = 0;
    for( int k=0; k<NDATA;  k++ )
    {
        for( int i=0; i<DIGIT; i++ )
        {
            Data[k][i] = ( rand() % 10 );
            if( Data[k][i] == goal[i] )
            {   ++Count[k]; }
        }

        if( MaxCount < Count[k] )
        {   MaxCount = Count[k];    }
    }

    //
    for( int c=MaxCount;    c>=0;   c-- )
    {
        printf( "Count=%d な数列達:\n", c );

        for( int k=0; k<NDATA; k++ )
        {
            if( Count[k] == c )
            {
                printf( "  " );
                PrintData( Data[k] );
            }
        }
    }

    //
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る