- ベストアンサー
改行について パート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"); } と、文はこうなると思います。これはどこに書き加えたらいいですか
- C・C++・C#
- 回答数4
- ありがとう数5
- みんなの回答 (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++ と入れたらよいのでしょうか。
関連するQ&A
- 10個出力で改行したいのですが・・・
#include <stdio.h> main() { int i, n; for( i = 1, n = 0; n < i; i++ ) { if(i%3 == 2 && i%4 == 1 && i<1000 ) { printf("%4d,",i); if(i%10==0) printf("\n"); n++; } } printf("\n"); } このプログラムは、3で割ると2余り、4で割ると1余る自然数で1000より小さいものを小さい順に表示するもので、 一行に10個ずつ表示して改行したいのですが、どうすればいいでしょうか? if文が間違っていると思うのですが・・・
- 締切済み
- C・C++・C#
- 変わらない・・・。
↓のプログラムについて (1)break文をexit(0)とreturn(0)にするとどうなるか? (2)13行目と14行目にif(i>=n){break;}を入れるとどうなるか? *プログラムは書き換えてよい。 という問題なんですが私にはさっぱりです・・・。 #include<stdio.h> int main() { int i,n,total; while(1){ printf("整数n?"); scanf("%d",&n); if(i>=n){break;} total=1; for(i=n;1<=i;i++){ printf("i=%d ",i); total*=i; } printf("total=%d\n",total); } printf("Thanks\n"); return(0) } できたら理由も教えてください。 よろしくおねがいします。
- 締切済み
- C・C++・C#
- 改行について 1行に何個かづつ表示するとき
よく画面に回数を入力した分だけhello!worldと表示しましょうとありますよね? そのプログラミングはこうなると思うのですが #include<stdio.h> main() { int i,a; printf("回数を入力 → "); scanf("%d",&a); for(i=1;i<=a;i++){ printf(" hello! world "); } } 改行をする場合worldのあとに\nをいれますよね。では例えば 10回表示して1行に3個づつ表示する場合はどうしたらいいですか。 考えてみたのはif(a%3==0) printf("/n");か、if(a<=3) printf("\n"); の2つが思い浮かびました。上の画面のprintf命令のあとに入れてみましたが うまくいきません。こんなことを気にしないほうがいいのかもしれませんが 気になります。どこが間違っているのでしょうか。位置ですか。それとも 2つの案がはじめから違いますか。
- ベストアンサー
- C・C++・C#
- C言語 エラー表示 break の位置が誤っている(関数 main )
#include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓
- ベストアンサー
- C・C++・C#
- Cプログラミング
素数を判定するプログラミングの作成で以下のプログラミングを作成したのですが、すべて 素数でないとでてしまいます。どなたか間違いをおしえていただけませんでしょうか。 #include<stdio.h> int main(void) { int num,i; printf("Please input a number:"); scanf("%d",&num); for (i=2; i < num ; i++){num % i; if (num % i == 0) break; } if (num % i == 0) printf("%d is not prime. \n" ,num); else printf("%d is prime. \n" ,num); return 0; }
- ベストアンサー
- C・C++・C#
- 2から120以下の素数を求める
2以上120以下の素数を全て求めて表示するプログラムを書きなさい。 素数か否かの判定には以下のアルゴリズム[処理手順] (2 <= n <= 120のときのみ有効)を用いなさい。 i) nが2, 3, 5, 7, 11のうちのどれかと等しければNは素数 ii) nが2, 3, 5, 7, 11の全てに対して割切れなければNは素数 iii) それ以外(iもiiも不成立)のとき、Nは素数ではない。 *) 2, 3, 5, 7, 11は最初に出力してしまい、 n=12から120までをfor文のなかで判定すればよい。 というC言語の課題です。 自分でプログラムを作ったのですが、うまくできません・・。 if文が働いてないようなのですが、どこが間違っているのでしょうか? #include <stdio.h> int main(void) { int i; printf("2\n"); printf("3\n"); printf("5\n"); printf("7\n"); printf("11\n"); for (i=12;i<=120;i++){ if (i%2!=0 || i%3!=0 || i%5!=0 || i%7!=0 || i%11!=0){ printf("%d\n",i); } else{ printf(""); } } printf( "\n" ); return 0; }
- ベストアンサー
- C・C++・C#
- for文~break
break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? for文はどこまで影響下にありますか? if ( i==5 ) printf ("サーバーが見つかりません"); まででしょうか? また if ( i == 5 ) で5なら、実行としていますが、 6,や,8など5 以外でも、サーバーが見つかりません と if文が実行される見たいですが、なぜですか? 教えてください。 #include<stdio.h> int main(void) { int array[5][2]={ {1,14}, {2,28}, {3,19}, {4,8}, {5,15}, }; int sever; int i; printf("番号を入力してください"); scanf("%d",&sever); for( i=0 ; i<5 ; i++ ) if ( sever == array[i][0] ){ printf ( "%d 番には, %d 人います。\n",sever,array[i][1]); break; } if (i==5) printf("サーバーが見つかりません"); return 0; }
- ベストアンサー
- C・C++・C#
- プログラミングCの質問です
現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }
- 締切済み
- C・C++・C#
- 素数 再帰関数
メイン #include<stdio.h> extern void count_primes(void); extern void print_primes(void); int max; int count; int primes[1000] int main(void) { printf("Uper limit: "); scanf("%d",&max); count_primes(); print_primes(); } 素数を求める(関数呼び出し) extern int nextprime(int n); extern int max; extern int count; extern int primes[]; void count_primes(void) { int i; count=0; for(i=2;i<=max;i=nextprime(i)){ primes[count++]=i; } リカーバシブ(次の素数) int nextprime[int n] { int i; for(;;){ n++; for(i=2;i*i<=n;i=nextprime(i)){ if(n%i==0) break; } if(i*i>n) break; } return n; } 素数プリント #include<stdio.h> extern int count; extern int primes[]; void print_primes(void) { int i for(i=0;i<count;i++){ if((i>0)&&(i%10==0) printf("\n"); printf(" %6d",primes[i]); } printf("\n素数の数 %d\n",count); } これら4つのモジュールで素数 nが求められますがアルゴリズム理解できません。この2つの関数のアルゴリズムについて、ご教授ください。め
- 締切済み
- C・C++・C#
- 簡単なfor文
#include <stdio.h> int main(void) { int n; int i; for(n=0 ;n<10;n++){ for(i=0; i<=n ;i++){ printf("*"); } printf("\n"); } return(0); } こういったプログラムを実行すると、以下のように表示されるのですがなんででしょうか? * ** *** 以下略 自分の考えですと、*は毎回一つしか表示されずに改行されると思うのですが・・・ * * * * 以下略 i個分の*を表示するなどという指示をプログラムはなされていないと思うのですがなぜなんでしょうか? 一つ目のfor文では10回ループが繰り返され改行 二つ目のfor文で*を永遠に表示 といった僕の解釈ではおかしいですよね。 当方C言語初心者で、周りに聞く人がいないため教えていただけると非常に助かりますm(__)m
- ベストアンサー
- C・C++・C#
お礼
早速実行してみました。n==2とn=2のちがいも=の1つの違いだけでも バグの発生が起こったりするのですね。大変な目にあう前に勉強できました。ありがとうございます、無事解決です。