• 締切済み

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

  • 無限ループをわざと作って時計をつくりたい

    無限ループをわざと作って時計を作ろうと思っています。 while(true){ 処理 } とすると無限ループを作ることができると書いてありましたので private void btnRedActionPerformed(java.awt.event.ActionEvent evt) { while(true) { taOutput.setText(""); Date d = new Date(); taOutput.append(d +":" ); Color c = new Color(102,255,255); taOutput.setBackground(c); Font f = new Font(Font.SERIF, Font.ITALIC, 25); taOutput.setFont(f);  } } として実行してボタンを押すと処理が止まって固まってしまうのです。 出力画面にOutOfMemoryErrorと書いてあるのでそのへんの理由だと思うのですが。 ちなみに for (int i = 0; i<5; i++) { } でテストするとうまく動きます。 これを固まらせずにうまく無限ループを続けさせるにはどうしたらいいのでしょうか。

    • ベストアンサー
    • Java
  • 代入されません(C言語)

    こんにちは。 早速質問させていただきます。 申し訳ありませんが、問題の概要など話し始めるととても時間がかかってしまう為省略させていただきます。 下記のプログラムなのですが(私はプロではないため醜いプログラムですがご了承ください)、 #include <stdio.h> int num[8][5] = {{0,0,0,0,0},{0,0,1,0,0},{0,1,0,0,0},{0,1,1,0,0}, {1,0,0,0,0},{1,0,1,0,1},{1,1,0,1,0},{1,1,1,0,0}}; int ic = 0; int i=0, j=0; int id=0;//IDナンバー int m0=0, m1=0, m2=0; //中間層 int z0=0, z1=0; int t0=0, t1=0; double s0=0,s1=0; //総和 double w00=0, w01=0, w02=0, w10=0, w11=0, w12=0;//重み double sikii0=1, sikii1=1; //しきい値(θ) θ0とθ1 int t; //正解 double hoge = 0.1; double mm0, mm1, mm2; //p2. 4)学習 で使用 //プロトタイプ宣言 void input(void); void tyukan(void); void souwa(void); //総和 void hantei(void); void seikai(void); void omomi1(void); void omomi2(void); main(){ while(ic<70){ if(id > 7){ id=0; i=0; j=0; } getchar(); printf("IC = %d ID = %d\n", ic, id); input(); tyukan(); souwa(); hantei(); seikai(); if(z0 != t0) omomi1(); else if(z1 != t1) omomi2(); i++; ic++; id++; } return 0; } void input(){ printf("入力データ M=%d A=%d B=%d\n", num[i][j], num[i][j+1], num[i][j+2]); } void tyukan(){ if(id == 0){ m0=0; m1=0; m2=0; mm0=0; mm1=0; mm2=0; s0=0; s1=0; } m0=num[i][0]+num[i][1]+num[i][2]; m1=num[i][0]+num[i][1]; m2=num[i][0]+num[i][2]; //中間層m0m1m2に代入 mm0 = (double)m0; mm1 = (double)m1; mm2 = (double)m2; printf("中間層 m0=%d m1=%d m2=%d \n", num[i][0]+num[i][1]+num[i][2], num[i][0]+num[i][1], num[i][0]+num[i][2]); } void souwa(void){ printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02, (double)m0*w10 + (double)m1*w11 + (double)m2*w12); } //*****関数判定***************************************** void hantei(void){ printf("判定は "); if(s0 >= sikii0){ printf("z0 = 1 "); z0=1; } else{ printf("z0 = 0 "); z0=0; } if(s1 >= sikii1){ printf("z1 = 1\n"); z1=1; } else{ printf("z1 = 0\n"); z0=0; printf("sikii1 %f\n",sikii1); printf("sikii0 %f\n",sikii0); } } void seikai(void){ printf("正解は "); printf("t0 = %d t1 = %d\n", num[id][3], num[id][4]); t0=num[id][3]; t1=num[id][4]; } void omomi1(void){ if(z0 == 0 && t0 == 1){ w00 = w00 + (hoge*mm0); w01 = w01 + (hoge*mm1); w02 = w02 + (hoge*mm2); sikii0 = sikii0-hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } else if(z0 == 1 && t0 == 0){ w00 = w00 - (hoge*mm0); w01 = w01 - (hoge*mm1); w02 = w02 - (hoge*mm2); sikii0 = sikii0+hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } } void omomi2(void){ if(z1 == 0 && t1 == 1){ w10 = w10 + (hoge*mm0); w11 = w11 + (hoge*mm1); w12 = w12 + (hoge*mm2); sikii1 = sikii1-hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } else if(z1 == 1 && t1 == 0){ w10 = w10 - (hoge*mm0); w11 = w11 - (hoge*mm1); w12 = w12 - (hoge*mm2); sikii1 = sikii1+hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } } 問題はこのプログラムがID7になった時に発生します。 関数hanteiの部分で s0 >= sikii0とs1 >= sikii1がそれぞれ真だったらz0(またはz1)に1を代入するように 作ったのですが、 IC=7 ID=7の部分では,s0が1.20でsikii0が0.9(s0>=sikii0)にもかかわらず z0に1が代入されません(s1とsikii1も同様)。 いろいろ考えてみましたが、原因が分かりませんでした。 どなたかよろしくお願いします。

  • c 言語初心者です。

    c 言語初心者です。 私は下記の構造体配列をつくりました。 しかしバッファオーバーランが起きてエラーが起きてしまいます。 ヒープ領域に問題があるのかもしれませんが、プログラム上どこに原因があるのかが良くわかりません。 どなたかよろしければ教えていただけないでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include<memory.h> struct s { int i; char name[25]; char huri[25]; char num[23]; }; void touroku(struct s *p); void hyouji(struct s *p); int main(void) { struct s data; touroku( &data ); hyouji( &data ); //data.num *= 1; /* dataはポインタではないのでドット演算子 */ hyouji( &data ); return 0; } /* 構造体のメンバを設定する */ void touroku(struct s *p) { int i=0; for(i=1;i<3;i++) { printf( "25文字以内の名前を入力して下さい\n" ); memset(p[i].name, 0, sizeof(p[i].name)); fgets( p[i].name,sizeof(p[i].name) , stdin ); if(strchr(p[i].name,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].name[strlen(p[i].name)-1]=='\n')//改行解除 { p[i].name[strlen(p[i].name)-1] = '\0'; } printf("25文字以内のふりがなを入力してください\n"); memset(p[i].huri, 0, sizeof(p[i].huri)); fgets(p[i].huri,sizeof(p[i].huri),stdin); if(strchr(p[i].huri,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].huri[strlen(p[i].huri)-1]=='\n')//改行解除 { p[i].huri[strlen(p[i].huri)-1] = '\0'; } printf( "整数を入力して下さい\n" ); memset(p[i].num, 0, sizeof(p[i].num)); fgets(p[i].num,sizeof(p[i].num),stdin ); if(strchr(p[i].num,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].num[strlen(p[i].num)-1]=='\n')//改行解除 { p[i].num[strlen(p[i].num)-1] = '\0'; } } } /* 構造体のメンバを出力する */ void hyouji(struct s *p) { int i=0; for(i=1;i<3;i++) printf("%-8s %3s %3s %d\n" ,p[i].name , p[i].huri , p[i].num , i); puts("----------------------------------------------------------------"); return ; }

  • C言語のプログラムで質問です。

    C言語のプログラムで質問です。 ヤコビ法で固有値・固有ベクトル絵を求めたいのですが、固有値は上手く出るのですが、 固有ベクトルがめちゃくちゃな値が出ます。何が間違っているのでしょうか教えてください。下のは一応自分で作ってみたプログラムです。 #include <stdio.h> #include <math.h> #define N 4 #define PI 3.14159 void jacobi(double a[N][N], double λ[N], double v[N][N]); int main(void) { int i, j; double a[N][N], λ[N], v[N][N], x; for(i=0;i<N;i++){ printf("\n a[%d][0] a[%d][1] a[%d][2] a[%d][3]=",i,i,i,i); scanf("%lf %lf %lf %lf",&a[i][0],&a[i][1],&a[i][2],&a[i][3]); } jacobi(a, λ, v); for(j=0; j<N; j++){ printf("\n固有値λ[%d]=%lf", j, λ[j]); printf("\n固有ベクトル\n"); for(i=0; i<N; i++){ printf("%lf\n", v[i][j]); } } return 0; } /* ヤコビ法による固有値計算 */ void jacobi(double a[N][N], double λ[N], double v[N][N]) { int i, j, kmax=100, repeat, p, q; double eps, c, s,theta, gmax; double apq, app, aqq, apqmax, apj, aqj, vip, viq; gmax=0.0; for(i=0; i<N; i++){ s=0.0; for(j=i+1; j<N; j++){ s += fabs(a[i][j]); } if(s>gmax) gmax=s; } eps=0.000001*gmax; for(i=0; i<N; i++){ for(j=0; j<N; j++){ v[i][j]=0.0; } v[i][i]=1.0; } for(repeat=1; repeat<kmax; repeat++){ /* 収束判定 */ apqmax = 0.0; for(p=0; p<N; p++){ for(q=0; q<N; q++){ if(p!=q){ apq=fabs(a[p][q]); if(apq>apqmax) apqmax=apq; } } } if(apqmax<eps) break; for(p=0; p<N-1; p++){ for(q=p+1; q<N; q++){ apq=a[p][q]; app=a[p][p]; aqq=a[q][q]; if(fabs(apqmax)<eps) break; /*回転角計算*/ if(fabs(app-aqq)>=1.0e-15){ theta= 0.5*atan(2.0*apq/(app-aqq)); }else{ theta= PI/4.0; } c = cos(theta); s = sin(theta); a[p][p] = app*c*c + 2.0*apq*c*s + aqq*s*s; a[q][q] = app*s*s - 2.0*apq*c*s + aqq*c*c; a[p][q] = 0.0; a[q][p] = 0.0; for(j=0; j<N; j++){ if(j!=p && j!=q){ apj = a[p][j]; aqj = a[q][j]; a[p][j] = apj*c + aqj*s; a[q][j] = -apj*s + aqj*c; a[j][p] = a[p][j]; a[j][q] = a[q][j]; } } /*固有ベクトル*/ for(i=0; i<N; i++){ v[i][p] = v[i][p]*c+v[i][q]*s; v[i][q] = -v[i][p]*s+v[i][q]*c; } } } eps=eps*1.05; } for(i=0; i<N; i++) λ[i] = a[i][i]; }

  • C言語、半角で打ち直しても多くのエラーメッセージ。

    いつも大変お世話になり、誠にありがとうございます。 標記の件。 下記に、コード、エラーメッセージを書きます。 コンパイルしたところ、多くのエラーメッセージが出ます。 こういうエラーメッセージの場合、誤って、全角で 打ってしまったのだと思い、全部を半角で打ち直します。 デモ、また大量のエラーメッセージが出ます。 全角スペースを半角で打ち直す「コツ」ってありますか? 是非とも教えてください。 ご多忙中のところ、度々申し訳ございません。 下記コードが何故コンパイルエラーを起こすのか どうか、ご回答の程宜しくお願い申し上げます。        記 コード /*文字と数値を出力する*/ #include <stdio.h> int main(void) { printf("%cは文字です。\n",'A'); printf("%dは整数です。\n",123); printf("%fは小数です。\n",10.5); return 0; } エラ-メッセージ C:\MinGW>gcc test1.c -o test1 test1.c:1:1: error: stray '\377' in program test1.c:1:2: error: stray '\376' in program test1.c:1:3: error: expected identifier or '(' before '/' token test1.c:1:4: warning: null character(s) ignored test1.c:1:6: warning: null character(s) ignored test1.c:1:7: error: stray '\207' in program test1.c:1:17: error: stray '\222' in program test1.c:1:19: error: stray '\372' in program test1.c:1:21: error: stray '\233' in program test1.c:1:25: error: stray '\213' in program test1.c:1:28: warning: null character(s) ignored test1.c:1:30: warning: null character(s) ignored test1.c:2:1: warning: null character(s) ignored # i n c l u d e < s t d i o . h > ^ test1.c:3:1: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:3: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:4: error: invalid preprocessing directive #i i n t m a i n ( v o i d ) ^ test1.c:3:5: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:7: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:9: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:11: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:13: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:15: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:17: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:21: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:23: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:25: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:27: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:29: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:31: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:33: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:35: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:3:37: warning: null character(s) ignored i n t m a i n ( v o i d ) ^ test1.c:4:1: warning: null character(s) ignored { ^ test1.c:5:1: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:3: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:5: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:7: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:11: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:13: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:15: warning: null character(s) ignored p r i n t f ( " % c o0アールW[g0Y00\ n " , ' A ' ) ; ^ test1.c:5:17: warning: null character(s) ignored 全部はコピーできませんでしたが、どうぞ、宜しくお願い申し上げます。

  • 式をC言語で立てれません

    式をC言語で立てれません 式をC 言語で立てれません こんにちは。私は今実験で円板振動子の中心軸上の音圧分布を求めています。 そこで写真のような図をプロットするために与えられた式をC言語で書いています。 式の詳細は P/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ))| です。 しかしうまくプロットできません。 プログラムは ------------------------------------- #include <stdio.h> #include <math.h> #define F 120 //周波数(Hz) #define C 1500 //音速(m/s) #define A 0.2 // 半径(m) int main() { double x, m, s, p, o, w, l; int i; for (i=0; i<100; i++) { x= (double)i; //観測点までの距離を表しました。距離が変化することで音圧が変わるためです。 l = C/F; //λをlとして音速÷周波数で定義できます。 m = x/l; //x軸です。 o = m*m + (A/l)*(A/l); //式のsinの中身です。 s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 w = fabs(s); //sin全体を絶対値に置き換えます。 p = w; //新しい変数に入れます。 printf("%9.9f %9.9f\n", m, p); } return 0; } ------------------------------ といった感じです。先生からはx軸のプログラムだけいじれば勝手に y軸も出てくるとヒントを頂いているのでx軸についてのプログラムを 書いています。コンパイルはできても写真のようにいきません。 半径やλや周波数はa/λ=2.5と書いてあったので値は推測です。 C言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。 ※式が間違っていたので新しく質問します。

  • C言語で・・

    実数データを入力し、小数点以下四捨五入したときの値を表示せよ。 自分では、以下のように作りました。 #include<stdio.h> int main(void) { float f_a,s; int i_a; printf("実数データを入力してください"); scanf("%f",&f_a); i_a=(int)f_a; s=f_a-i_a; if(s>=0.5){ i_a=i_a+1; } printf("%fを四捨五入すると%dです",f_a,i_a); return 0; } 他の作りかたがあれば、教えていただきたいのですが。IF文などの範囲でお願いします。

  • 式をC言語で立てれません

    式をC言語で立てれません こんにちは。私は今実験で円板振動子の中心軸上の音圧分布を求めています。 そこで写真のような図をプロットするために与えられた式をC言語で書いています。 式の詳細は P/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ)^2)| です。 しかしうまくプロットできません。 プログラムは ------------------------------------- #include <stdio.h> #include <math.h> #define F 120 //周波数(Hz) #define C 1500 //音速(m/s) #define A 0.2 // 半径(m) int main() { double x, m, s, p, o, w, l; int i; for (i=0; i<100; i++) { x= (double)i; //観測点までの距離を表しました。距離が変化することで音圧が変わるためです。 l = C/F; //λをlとして音速÷周波数で定義できます。 m = x/l; //x軸です。 o = m*m + (A/l)*(A/l); //式のsinの中身です。 s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 w = fabs(s); //sin全体を絶対値に置き換えます。 p = w; //新しい変数に入れます。 printf("%9.9f %9.9f\n", m, p); } return 0; } ------------------------------ といった感じです。先生からはx軸のプログラムだけいじれば勝手に y軸も出てくるとヒントを頂いているのでx軸についてのプログラムを 書いています。コンパイルはできても写真のようにいきません。 半径やλや周波数はa/λ=2.5と書いてあったので値は推測です。 C言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。

  • C++の無限ループを解決してください

    アルゴリズムを勉強するときに以下のソースを書きました; void weighted_quick_union_algorithm() { static const int volume = 10; enum status { terminate_, union_, find_ }; string str; status sta; vector<int> system(volume, 0); vector<int> size(volume, 1); for (int index = 0; index != volume; ++index) { system[index] = index; } do { cout<<"cin"<<endl; cin >> str; for (string::size_type index = 0; index != str.size(); ++index) str[index] = toupper(str[index]); if (str == "UNION") sta = union_; else if (str == "FIND") sta = find_; else if (str == "TERMINATE") sta = terminate_; switch (sta) { case(0): { cout << str << endl; break; } case(1): { cout << str << sta << endl; int p(0), q(0), i(0), j(0); while (cin >> p) { cin >> q; for (i = p; i != system[i]; i = system[i]); for (j = q; j != system[j]; j = system[j]); if (i == j) continue; if (size[i] < size[j]) { system[i] = j; size[j] += size[i]; } else { system[j] = i; size[i] += size[j]; } cout << p << " - " << q << endl; } cout<<"break"<<endl; break; } case(2): { cout << str << sta << endl; break; } } } while (sta); } しかし unionを入力しあと ; でwhile(cin>>p)をブレイクしたら cin break UNION1 cin break Union1 で無限ループ 結構時間かかったが間違いがわかりません ちなみに最少は while(cin>>p>>q)と書いていましたが同じ結果です。 どうかお願いします

  • 無限ループに陥ってしまいました。(Excel)

    シート上に文字列がランダムにばら撒かれています。 (ばら撒かれている範囲もケースバイケースを想定しています) 最終的に、文字列をA1から順番に並べたいと思いました。 手順としてA列の文字列が入力されているセル行を調べてその回数ループさせる。もし、セルの値が""ならばセルを削除し上に詰める。そのときA列の最終行数を-1する。最終行数までくるとその列は終わり。 次の列に移動し繰り返して完了。 と、もくろんだのですが、A列のみで無限ループに陥ってしまいました。どなたか?詳しい方いらっしゃいましたら教えてください。 Sub test() Set sh1 = Worksheets("sheet1") For j = 1 To 50 LastRow1 = sh1.Cells(65536, j).End(xlUp).Row For i = 1 To LastRow1 If sh1.Cells(i, j).Value = "" Then sh1.Cells(i, j).Delete (xlShiftUp) i = i - 1 LastRow1 = LastRow1 - 1 End If Next Next End Sub

専門家に質問してみよう