• 締切済み

C言語での無限ループについて。

Cを使ってシミュレーションを行っているんですが、質問があります。 例えば、以下の内容を無限ループの中に入れていたとして、 ある一定の条件に達したものをループから外すにはどうしたらいいんでしょうかね。 ループから外れたものはもうそれ以降は完全に無視したいんですよね。 どうしたらいいでしょうか。 for(i=0;i<NUM;i++){  S[i].f = -m * g + F;  S[i].a = S[i].f / m;  S[i].v = S[i].v + S[i].a * dt;  S[i].p = S[i].p + 0.5 * S[i].a * dt * dt + S[i].v * dt; } 例えばこれで、S[i].p が一定の位置に来た場合、 それ以降、その存在を無視する。みたいな感じにしたいんです。 よろしくお願いします。

みんなの回答

  • Interest
  • ベストアンサー率31% (207/659)
回答No.5

ANo.4 = Interest です。 「リスト構造」が分からないということでしょうか。リスト構造は「アルゴリズムとデータ構造」を学ぶと必ず出てきます。 例えば、 http://www.geocities.jp/ky_webid/algorithm/index.html の第10章にで扱っている「線形リスト」がそれです。 構造体、ポインタ、メモリ管理などの知識が必要になります。(やりながら覚えるという手もありますね。) 自己参照というテクニックが出てきます。リスト構造はデータ構造の最も基本的なものの一つです。 S と SList を別けて書いたのは、私が最近 Java を使っている影響です。いまsosohohoさんがお使いの S構造体に一切手を加えなくて済むスマートな手です。保持したいデータの構造体とリスト処理のための構造体を切り分けることでメンテナンス性をよくする狙いがあります。 SList_size(list) はリストの要素数を返す関数 SList_get(list, i) はリストから i 番目の要素を取り出す関数 SList_remove(list, i ) はリストから i 番目の要素を削除する関数 として書きました。これらは全部自作する必要があります。 後は具体的にどこがわからないでしょうか?

sosohoho
質問者

補足

時間をかけて読んではみたのですが…いまいち全体的にちんぷんかんぷんです…。 すみません…。 具体的にどのように書けばいいのかを教えていただければ幸いです。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.4

話が進展しないようですので、ちょっとでしゃばってみます。 私なら、リスト構造を使って、いらなくなったら削除しちゃうかもしれません。例えば、 S *s; SList *list; を定義しておき、 for(i=0; i< SList_size(list); i++){ s = SList_get(list, i); S_update( s ); /* ここで力、加速度、速度、位置を更新する。*/ if( s->p が範囲外 ) SList_remove(list, i ); } SList は S構造体をリストとして扱うための構造体として定義します。 こんな感じでいかがでしょうか?

sosohoho
質問者

補足

ありがとうございます。 ただ、私、プログラミングに関する知識が乏しいものでして・・・。 もう少し詳しく説明していただけると幸いです。。。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.3

#1の解凍はちょっと勘違いだったようですので無視してください >消滅したとみなしたいんですよ 消滅となるとS[i]の中身をすべて前送りしてデータを消す必要がありますよ。そうなると複雑な構造になります。 S[i]にあらたに判断用の配列S[i].xとかを作ってゼロクリアをしておいて 無視する物にはこの配列に1を入れてfor(i=0;i<NUM;i++){処理}文が終わった後で改めて配列を整理するようにしてはどうでしょう。

  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.2

if文で判定すれば、一定の位置に来るまではS[i].pの値を処理できます。こういう事をしたいのですよね!? for(i=0;i<NUM;i++){  S[i].f = -m * g + F;  S[i].a = S[i].f / m;  S[i].v = S[i].v + S[i].a * dt;  if(S[i].p < 一定の位置)  {   S[i].p = S[i].p + 0.5 * S[i].a * dt * dt + S[i].v * dt;  } }

sosohoho
質問者

補足

んーちょっと違うんですよね。 これはあくまでも例でして、ある一定の位置に達したら、消滅したとみなしたいんですよ。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

if文でS[i].p をチェックして条件にあったらiにNUMを入れてやったらどうでしょう。

sosohoho
質問者

補足

具体的にはどういうことでしょうか?

関連するQ&A