- ベストアンサー
改行について パート2
改行には\nを使いますがfor文やif文をたくさん使う場合のときはいったいどこに「3つごとに改行」などのif文を入れたらよいですか。 素数を100まで求めるとするとき以下のプログラミングになると思いますが。 #include <stdio.h> main() { int i,n; for (n == 2 ; n <= 100 ; n++){ for (i=2; i<n ;i++){ if(n%i == 0){ break; } } if(i == n){ printf("%d ",i); } } } では、3つごとに表示するときは if(i%3==0){ printf("\n"); } と、文はこうなると思います。これはどこに書き加えたらいいですか
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
補足に対する回答 if(i == n){ printf("%d ",i); j++;/*追加*/ if(j%3==0){/*追加*/ printf("\n");/*追加*/ }/*追加*/ } 元のソースに4行追加です。 変数jの初期化部分はh_hikitaさんのソースを参考にしてください。 注)条件分のJ!=0は不要でした。すみません。 またn==2でも実行できた理由は、コンパイラによってはAUTO変数を0に初期化するものや、たまたま割り当てられたアドレスが0の場合もあったりします。 後者の場合、修正してコンパイルしなおすと、別のバグが発生と言う事もあります。 また、前者の場合は初期化しなくても問題ないのですが、別OS等に移植した時に 大変な目にあったりします。
その他の回答 (3)
蛇足です(^_^; プログラムを組む場合、大事なのは「データの出力され方」を頭の中で想像してみることです。 たとえば構造として、 1.数字を出力する。 2.数字を出力する。 3.数字を出力する。 4.改行する。 5.数字を出力する。 6.以下続く こういうロジックになることは分かりますよね? とすれば、「数字を3つ出力したあとで改行を出力する」というプログラムを組めばいいのです。 ならば、if文としては「数字が3回出力されたかどうか」を判定することになります。 すると、「数字を出力する前」に判定をしても意味がないですよね。数字が出力される前に行う判定は「これから3回目が出力されるかどうか」ですから。 当然、判定文を挿入するのは「数字を出力したあと」ということになります。 とまあ、こういうふうに考えていけばいいのです。 今ここにロジックを追加すれば、プログラムはどういう挙動をするか、ということを考えながら組んでいきます。 また、どうしても結果が想像できないときは、実際に適当な場所に入れてみて実際に動かしてみる、ということもよくやります。その結果が気に食わなければやりなおせばいいことですから。 まあ、こういうのは慣れですから、言われなくてもすぐに感覚つかめるとは思いますが(笑)
お礼
説明をしてくださった文章で改めて考えると、とても納得できました。あたりまえのことですが、数をこなして本に載っていたこと以外のものを自分で見つけていきたいです。まだまだ道のりは遠そうです,,,。
- h_hikita
- ベストアンサー率40% (104/257)
こんな感じにでもなるかと思います。 #include <stdio.h> main() { int i,n; int j; //追加 j=0; //追加 //for (n == 2 ; n <= 100 ; n++){ ←nに初期値入ってないので一回も実行されない... for (n = 2 ; n <= 100 ; n++){ for (i=2; i<n ;i++){ if(n%i == 0){ break; } } if(i == n){ printf("%d ",i); /* 追加部分始 */ j= (j+1) %3; if(j==0) printf("\n"); /* 追加部分終 */ } } } }
お礼
改行のやり方にしてもif(j%3==0)というやり方以外にも h hikitaさんのやり方もあるのですね。早速返事を(しかもご丁寧にコメント付きで)書いて下さりありがとうございます!!
- madman
- ベストアンサー率24% (612/2465)
変数jを追加し、jをインクリメントしそのjであまりを算出する。 printfの次の行に j++; if(j%3==0 && j!= 0){ printf("\n"); } nのループの外でjを初期化するのを忘れないように。 あと最初のforがn==2になっているがn=2の間違い?
補足
n==2は n=2でした。ごめんなさい。 ただn==2でもできたので気付きませんでした。それとprintfの次ということは if(i == n){ printf("%d",i); } の「 }」をとってprintf("%d",i); j++ と入れたらよいのでしょうか。
お礼
早速実行してみました。n==2とn=2のちがいも=の1つの違いだけでも バグの発生が起こったりするのですね。大変な目にあう前に勉強できました。ありがとうございます、無事解決です。