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個発生させ、すべてカウントしていき、カウントが多い順に数列を並べ替えさせたいです。
どの部分を改良すればよいのか教えてほしいと思い、投稿しました。
よろしくお願いいたします。
C言語 配列の中身とカウント数の連動の仕方
Re: C言語 配列の中身とカウント数の連動の仕方
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番目に来たとかいうのがわかります.
これはちょっと高度な技です.
これをやるには現在のプログラムはちょっとごちゃごちゃし過ぎてますので,ランダム列の生成を関数化するとか,コメントを少し書くとか,ソースコードを整理してみませんか?
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番目に来たとかいうのがわかります.
これはちょっと高度な技です.
これをやるには現在のプログラムはちょっとごちゃごちゃし過ぎてますので,ランダム列の生成を関数化するとか,コメントを少し書くとか,ソースコードを整理してみませんか?
Re: C言語 配列の中身とカウント数の連動の仕方
とりあえず 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;
}