お世話になっております。
実現したい内容
2つの配列array,array2の配列をそれぞれ、ランダムに並び替え、要素である数値を-1,0,1に置換するプログラムを作成しております。
ランダムに並び替えるところ(shuffleArrayData)まではうまくいったのですが、要素を置換する関数switchnumを加えるとキャッシュフローしたような状態となります。
###全体のソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3//数字をランダムに並び替える関数 4void shuffleArrayData(int* array, int size){ 5 int i, target, tmp; 6 7 for(i = size -1; i > 0; i--){ 8 target = rand() % i; 9 tmp = array[target]; 10 array[target] = array[i]; 11 array[i] = tmp; 12 } 13 //3連続を防ぐ. 14 for(i = size -1; i > 0; i--){ 15 target = rand() % i; 16 if(array[i] == array[i+1] && array[i] == array[i+2]){ 17 tmp = array[target]; 18 array[target] = array[i]; 19 array[i] = tmp; 20 } 21 22 } 23 24 // for(i = 0; i < size; i++){ 25 // printf("%d ", array[i]); 26 // } 27} 28//数字を置換する関数 29void switchnum(int* array,int* array2,int size,int* array3){ 30 int i,j,j_i; 31 j=0; 32 33 //(int)(sizeof(array2) / sizeof(array2[0]) 34 for(i = 0; i < 10; i++){ 35 if(array2[i]==5){ 36 j_i=j+25; 37 for(j;j<j_i;j++){ 38 array3[j]=0; 39 } 40 j += 25; 41 }else if(array2[i]==10){ 42 j_i=j+50; 43 for(j;j<j_i;j++){ 44 array3[j]=0; 45 } 46 j += 50; 47 }else{ 48 j_i=j+75; 49 for(j;j<j_i;j++){ 50 array3[j]=0; 51 } 52 j += 75; 53 } 54 if(array[i]==-1){ 55 j_i=j+10; 56 for(j;j<j_i;j++){ 57 array3[j]=-1; 58 } 59 j += 10; 60 }else{ 61 j_i=j+10; 62 for(j;j<j_i;j++){ 63 array3[j]=1; 64 } 65 j += 10; 66 } 67 //printf("array2 is sizeof:%d",size); 68 printf("i:%d\n",i); 69 printf("j:%d\n",j); 70 } 71} 72 73int main(){ 74 int array[] = {-1, -1, -1, -1, -1, -1, 1,1,1,1,1,1}; 75 int array2[]={5,5,5,5,5,5,5,5,5,10,10,10,15}; 76 // 77 int data[560]; 78 //int array[] = {4, 2}; 79 //int array[] = {4}; 80 81 for(int i=0;i<15;i++){ 82 printf("=======================================================\n"); 83 printf("%d回目\n",i+1); 84 shuffleArrayData(array, (int)(sizeof(array) / sizeof(array[0]))); 85 printf("\n"); 86 shuffleArrayData(array2, (int)(sizeof(array2) / sizeof(array2[0]))); 87 88 //arrayとarray2を交互に出力 89 for(int j = 0; j < (int)(sizeof(array) / sizeof(array[0])); j++){ 90 int size=(int)(sizeof(array) / sizeof(array[0])); 91 printf("%d,%d,", array2[j],array[j]); 92 //最後に追加 93 if(j == size-1){ 94 printf("%d",array2[j+1]); 95 } 96 } 97 printf("\n"); 98 switchnum(array,array2,(int)(sizeof(data) / sizeof(data[0])),data); 99 //array3を出力 100 for(int i = 0; i < (int)(sizeof(data) / sizeof(data[0]))-1; i++){ 101 int size=(int)(sizeof(data) / sizeof(data[0])); 102 printf("%d,", data[i]); 103 //最後に追加 104 if(i == size-2){ 105 printf("%d",data[i+1]); 106 } 107 } 108 printf("\n"); 109 printf("======================================================="); 110 } 111 return 0; 112}
###該当のソースコード
c
1//数字を置換する関数 2void switchnum(int* array,int* array2,int size,int* array3){ 3 int i,j,j_i; 4 j=0; 5 6 //(int)(sizeof(array2) / sizeof(array2[0]) 7 for(i = 0; i < 10; i++){ 8 if(array2[i]==5){ 9 j_i=j+25; 10 for(j;j<j_i;j++){ 11 array3[j]=0; 12 } 13 j += 25; 14 }else if(array2[i]==10){ 15 j_i=j+50; 16 for(j;j<j_i;j++){ 17 array3[j]=0; 18 } 19 j += 50; 20 }else{ 21 j_i=j+75; 22 for(j;j<j_i;j++){ 23 array3[j]=0; 24 } 25 j += 75; 26 } 27 if(array[i]==-1){ 28 j_i=j+10; 29 for(j;j<j_i;j++){ 30 array3[j]=-1; 31 } 32 j += 10; 33 }else{ 34 j_i=j+10; 35 for(j;j<j_i;j++){ 36 array3[j]=1; 37 } 38 j += 10; 39 } 40 //printf("array2 is sizeof:%d",size); 41 printf("i:%d\n",i); 42 printf("j:%d\n",j); 43 } 44}
何かヒントだけでもご教授いただければと思っております。
よろしくお願いいたします。
なぜ「該当のソースコード」でswitchnumを再度載せられているのでしょう。何か違うのでしょうか。
「キャッシュフローしたような状態」とは具体的にどのような状態でしょうか。
「要素である数値を-1,0,1に置換する」という仕様も、どのような判断基準なのでしょう。
ご連絡ありがとうございます。
>>「キャッシュフローしたような状態」
表現が正しいのか自信がありませんが、最終的に格納する配列data[512]を出力した際に、4195346や163189952といったような数値が入っている状態のことです。
>>「要素である数値を-1,0,1に置換する」という仕様の判断基準
array[]の要素が1であった場合、array3[]に1を10こ追加する。
array[]の要素が-1であった場合、array3[]に-1を10こ追加する。
array[2]の要素が5であった場合、array3[]に0を25こ追加する。
array[2]の要素が10であった場合、array3[]に0を50こ追加する。
array[2]の要素が15であった場合、array3[]に0を75こ追加する。
となります。
data[512] が switchnum によって設定されていなければ、変な値が入っている可能性がある(いうより大抵入っている)のは c では普通です。そして、 switchnum の i の for ループが 10 回ですので、 data に入る有効データ数は(array2 の中身に依りますので)一定ではありません。
そのことは、 switchnum の j の表示を見ればお分かりかと思います。
頂いた判断基準を言い換えますと、
array3[]に"array[]の要素"を10こ追加する。
array3[]に0を"array2[]の要素"×5こ追加する。
の二つになります。回答にはそのようなコードを載せてみました。
またこのコードの関数は int を返すように変更していまして、 data に設定した"有効データ数"を返すようにしています。
main 側で data を表示する際はこの戻り値を使って 0~"有効データ数"までを表示するようにすれば、変な値は出なくなると思います。
ご連絡ありがとうございます。
ご回答といただいた内容と返信の内容を参考にさせていただきます。
勉強不足により、あまり理解が及ぼない点があり、気の利いたご返信ができず申し訳ございません。
また、私自身の説明不足な点により非常に分かりにくい質問となってしまい、重ねてお詫びいたします。
最後まで懇切丁寧にお答えいただき、誠にありがとうございました。
回答2件
あなたの回答
tips
プレビュー