• ベストアンサー

C++のもんだいで解けずに困っています。

ランダムに0と1がfor文を回るたびに出力されるプログラムで、 0 0 1 1 1 0 1 1 以下省略 と続くような出力になります。 この数列で連続する数字の 数 を in という配列に格納するようにしたいのです。 上の数列で考えますとまず、0が二個連続し、その後に1が出力されましたので、in[0]には2を入れ、次は、1が3つ連続して、その後に1が出力されたのでin[1]には3を入れる。といったものです。 本当に困っています。どなたか教えてください。お願いします(*TーT*)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

reallocを使って配列のサイズを増やせばいいのでは。 0と1をキーボードから入力するサンプル。(全角スペース使っています) #include <stdio.h> #include <stdlib.h> int main(void){  int i,ch,index=0,count=0,dat='0';  int *in=NULL; /* とりあえずキーボードから'0'と'1'を入力 */  while((ch=getchar())!=EOF) {   if (ch=='0' || ch=='1') {    if (ch!=dat) {     if ((in=realloc(in, sizeof(int)*(index+1)))==NULL) {free(in); return -1;}     in[index++]=count;     count=1;     dat = (dat=='0')?'1':'0';    } else {     count++;    }   }  } /* 残りを書き出す */  if (count>0) {   if ((in=realloc(in, sizeof(int)*(index+1)))==NULL) {free(in); return -1;}   in[index++]=count;  } /* 表示 */  for (i=0; i<index; i++) {   printf("in[%d]=%d\n",i,in[i]);  }  free(in);  return 0; }

すると、全ての回答が全文表示されます。

その他の回答 (4)

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

格納するのが不定長になるなら 配列はやめて vectorを使えばいいのでは

すると、全ての回答が全文表示されます。
  • don_cha
  • ベストアンサー率34% (139/407)
回答No.3

仕様の確認です。 同じ値の連続カウントということですが、例題の場合 0が2回連続、1が3回連続、0が1回、1が2回連続となっていますが、この連続数値(2,3,1,2)をin配列にどのように格納すべきかのかによって、プログラムが決まります。 1)0及び1の出現回数をカウントするのか(これは既にお答えがあるプログラムでOK)、 2)最大連続数のみを算出すればいいのか、 3)それとも配列番号0,2,4...っと偶数に0の連続数、1,3,5...っと奇数に1の連続数を保管するのでしょうか 4)その他(具体例を示していただけるとわかりやすいです) どれでしょうか?

k-haruka
質問者

補足

説明不足がありまして申し訳ありません。 このプログラムでは 0 0 1 1 1 0 1 1 0 0 0 0 1 はin配列に in[0] = 2 in[1] = 3 in[2] = 1 in[3] = 2 in[4] = 4 というふになっていきます。出力はどんどん行われ続けますので、随時配列に連続回数をカウントして代入していきたいのです。  よろしくお願いします。

すると、全ての回答が全文表示されます。
  • catby
  • ベストアンサー率65% (50/76)
回答No.2

こういう事ではないでしょうか?   int RandVal;   int in[32];   int tmp, n, cnt;   cnt = -1;   tmp = -1;   memset(in, 0, sizeof(in));   for(; RandVal = /*ランダム値*/, /*抜ける条件*/ ;) {     if(tmp == RandVal) {       in[cnt]++;     }     else {       in[++cnt]++;       tmp = RandVal;     }   } in[2]に何が入るか分かれば、確実なのですが・・・

k-haruka
質問者

補足

説明不足があり申し訳ありません。 in[2] = 1 が代入されることになります。 詳しくは上記の補足を確認していただければと思います。 どうもありがとうございます。

すると、全ての回答が全文表示されます。
  • GOGOV
  • ベストアンサー率54% (12/22)
回答No.1

int型 numberという配列に乱数が設定されていると仮定して、 for(i=0;;i++){   in[number[i] & 1]++; } もちろん、このほかにinの初期化処理やループからのbreak条件は必要です。

すると、全ての回答が全文表示されます。

関連するQ&A