• 締切済み

一点だけを並び替えてすべて表示したいのですが・・・

一次元配列に0~Nまでの数字を重複しないでランダムに入れて、その配列の中から一つをランダムに選び、その数字だけを並び替えて表示したいのです。 例えば、x[N]の配列があって、x[4]だったとします。 x[0] = 3, x[1] = 2, x[2] = 0, x[3] = 1と重複しない0~N(この場合は3)までの数字をランダムに配列に入れます。ここで、表示すると3201となります。 そして、その中からランダムに一つ選びます。この場合、x[2] = 0を選んだとします。それで、0321 3021 3201 3210と、x[2]だけを移動させるものを表示したいのですが良く分かりません。 重複しない乱数や、ランダムに一つ選ぶところは分かっているので、移動させて表示させる部分を教えてください。初歩的かもしれませんがお願いします。

みんなの回答

回答No.3

はじめまして 参考に最初から作ってみました。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int x[5],q[5]; int i,j,n=1; int h,k,g,jp; while(n!=0) { srand((unsigned)time(NULL)); for(i=0;i<5;i++) { x[i]=rand()%100+1; /* 0から100までの乱数 */ } n=0; for(i=0;i<4;i++) { h=x[i]; for(j=i+1;j<5;j++) { if(h==x[j]){n++;} /* 重複した数字があれば値を変更する */ } } } for(i=0;i<5;i++) { printf(" %d ",x[i]); /* 重複してない数字を表示*/ } printf("\n"); k=rand()%4+1; /* ランダムに箱の番号を決める*/ for(i=0;i<5;i++) { q[i]=x[i]; /* 他の箱に移し変え */ } g=q[k]; /* 移動する箱の数字を取っておく */ for(i=k;i>=1;i--) { q[i]=q[i-1]; /*0から先ほど決めた箱の番号までひとつずつずらす */ } q[0]=g; /*上で動かすとq[0] だけあくので、そこに先ほど取っておいた数字を代入*/ for(i=0;i<5;i++) { printf(" %d ",q[i]); } printf("\n"); for(i=0;i<4;i++) { jp=q[i]; q[i]=q[i+1]; /*先ほど決めた箱の値を先頭に移動したので、それ以降は前後の数字を入れ替えるだけです*/ q[i+1]=jp; for(j=0;j<5;j++) { printf(" %d ",q[j]); } printf("\n"); } } 一応、各プログラムの行に説明をつけておきました。 このプログラムは、値決め、移動する箱の番号、ともに乱数を使用しています。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

実際に、移動させると結構、負荷になるかもしれないんで、表示だけでの処理。 #include <stdio.h> void main(void){ int x[]={3, 2, 0, 1 }; int size=sizeof(x)/sizeof(int); int choice=2; int i,j,c; for(i=0;i<size;i++){ for(j=0,c=0;c<size;j++){ if(i==c){ printf("%d",x[choice]); if(++c==size)break; } if(j!=choice){ printf("%d",x[j]); c++; } } printf("\n"); } }

  • _ae
  • ベストアンサー率69% (9/13)
回答No.1

なんだかな。元のデータなくなるけど。 #include <stdio.h> int main(void) { // たとえば3番目の9が選ばれたとする。 int data[9] = {3, 1, 9, 0, 8, 7, 2, 5, 6}, cho_pt = 2; int i, j, swap; for (i = cho_pt; i > 0; i--) { swap = data[i]; data[i] = data[i - 1]; data[i - 1] = swap; } for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { printf("%d", data[j]); } swap = data[i]; data[i] = data[i + 1]; data[i + 1] = swap; putchar('\n'); } return 0; }

関連するQ&A