質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

964閲覧

配列の数値を並び替え、ある条件下の規則的な数値に置換したい

nori0519

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/27 16:57

お世話になっております。

実現したい内容

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}

何かヒントだけでもご教授いただければと思っております。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/07/27 17:43

なぜ「該当のソースコード」でswitchnumを再度載せられているのでしょう。何か違うのでしょうか。
jimbe

2021/07/27 17:56 編集

「キャッシュフローしたような状態」とは具体的にどのような状態でしょうか。 「要素である数値を-1,0,1に置換する」という仕様も、どのような判断基準なのでしょう。
nori0519

2021/07/28 01:39

ご連絡ありがとうございます。 >>「キャッシュフローしたような状態」 表現が正しいのか自信がありませんが、最終的に格納する配列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こ追加する。 となります。
jimbe

2021/07/28 03:19

data[512] が switchnum によって設定されていなければ、変な値が入っている可能性がある(いうより大抵入っている)のは c では普通です。そして、 switchnum の i の for ループが 10 回ですので、 data に入る有効データ数は(array2 の中身に依りますので)一定ではありません。 そのことは、 switchnum の j の表示を見ればお分かりかと思います。 頂いた判断基準を言い換えますと、 array3[]に"array[]の要素"を10こ追加する。 array3[]に0を"array2[]の要素"×5こ追加する。 の二つになります。回答にはそのようなコードを載せてみました。 またこのコードの関数は int を返すように変更していまして、 data に設定した"有効データ数"を返すようにしています。 main 側で data を表示する際はこの戻り値を使って 0~"有効データ数"までを表示するようにすれば、変な値は出なくなると思います。
nori0519

2021/07/28 05:49 編集

ご連絡ありがとうございます。 ご回答といただいた内容と返信の内容を参考にさせていただきます。 勉強不足により、あまり理解が及ぼない点があり、気の利いたご返信ができず申し訳ございません。 また、私自身の説明不足な点により非常に分かりにくい質問となってしまい、重ねてお詫びいたします。 最後まで懇切丁寧にお答えいただき、誠にありがとうございました。
guest

回答2

0

自己解決

お世話になっております。

今回の原因としまして、
・switchnum関数内にて、jに対して、forによりarray3[]に数値を入力後、余分な数値を加算していた。
・main関数内における、data560の要素数が不足していた。→data[580]に変更
でした。
お手数おかけいたしました。

修正したソースコード

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 for(i = 0; i < size; i++){ 34 if(array2[i]==5){ 35 j_i=j+25; 36 for(j;j<j_i;j++){ 37 array3[j]=0; 38 } 39 }else if(array2[i]==10){ 40 j_i=j+50; 41 for(j;j<j_i;j++){ 42 array3[j]=0; 43 } 44 }else{ 45 j_i=j+75; 46 for(j;j<j_i;j++){ 47 array3[j]=0; 48 } 49 } 50 if(array[i]==-1){ 51 j_i=j+10; 52 for(j;j<j_i;j++){ 53 array3[j]=-1; 54 } 55 }else{ 56 j_i=j+10; 57 for(j;j<j_i;j++){ 58 array3[j]=1; 59 } 60 } 61 printf("array[i]:%d\n",array[i]); 62 printf("array2[i]:%d\n",array2[i]); 63 printf("i:%d\n",i); 64 printf("j:%d\n",j); 65 } 66} 67 68int main(){ 69 int array[] = {-1, -1, -1, -1, -1, -1, 1,1,1,1,1,1}; 70 int array2[]={5,5,5,5,5,5,5,5,5,10,10,10,15}; 71 // 72 int data[580]; 73 //int array[] = {4, 2}; 74 //int array[] = {4}; 75 76 for(int i=0;i<15;i++){ 77 printf("=======================================================\n"); 78 printf("%d回目\n",i+1); 79 shuffleArrayData(array, (int)(sizeof(array) / sizeof(array[0]))); 80 printf("\n"); 81 shuffleArrayData(array2, (int)(sizeof(array2) / sizeof(array2[0]))); 82 83 //arrayとarray2を交互に出力 84 for(int j = 0; j < (int)(sizeof(array) / sizeof(array[0])); j++){ 85 int size=(int)(sizeof(array) / sizeof(array[0])); 86 printf("%d,%d,", array2[j],array[j]); 87 //最後に追加 88 if(j == size-1){ 89 printf("%d",array2[j+1]); 90 } 91 } 92 printf("\n"); 93 switchnum(array,array2,(int)(sizeof(array2) / sizeof(array2[0])),data); 94 //array3を出力 95 for(int i = 0; i < (int)(sizeof(data) / sizeof(data[0]))-1; i++){ 96 int size=(int)(sizeof(data) / sizeof(data[0])); 97 printf("%d,", data[i]); 98 //最後に追加 99 if(i == size-2){ 100 printf("%d",data[i+1]); 101 } 102 } 103 printf("\n"); 104 printf("======================================================="); 105 } 106 return 0; 107} 108

投稿2021/07/28 05:43

nori0519

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

j の値が data のサイズを超えている辺りが問題のようですね。
仕様があっているか分かりませんが。

c

1//数字を置換する関数 2int switchnum(int* array, int* array2, int size, int* array3) { 3 int j = 0; 4 for(int i=0; i<10; i++) { 5 for(int k=0; k<array2[i]*5; k++) array3[j++] = 0; 6 for(int k=0; k<10; k++) array3[j++] = array[i]; 7 printf("i:%d\n",i); 8 printf("j:%d\n",j); 9 } 10 return j; 11}

投稿2021/07/27 18:35

編集2021/07/27 18:53
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問