- ベストアンサー
C言語で整数の範囲内の整数を加えるプログラムの作成方法
- C言語で、二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムの簡潔な作成方法を教えてください。
- 現在は多くのコードが含まれているため、見やすく簡潔なコードにする方法をご教示ください。
- プログラムを実行すると、整数1と整数2を入力するように求められ、整数1が整数2よりも小さい場合は再入力を促されます。最終的に、整数2以上整数1以下の全ての整数を加えた値が表示されます。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
問題を文章通りに受けとれば「異なる二つの整数値を大きい順に」ではないから、同じ値を入れても、大小の順番が逆でも対応しないといけない気がします。 > for (num2;num2 <= num1;num2++) { > sum=sum+num2; > } 間違いではないですが for (num2; のnum2は不要。 全部に同じ変数を書かないといけないように思うかもしれませんが、実際には、3つの式は互いに無関係でもかまいません。 int i,j,k,n; (略) ; for(i=0;j<j;n++) なんてのも、文法上は問題ありません。動作上の問題はあるかもしれませんが。 私見ですが、 num2を変化させているのが少し気持ち悪いです。 変数num2に「入力した整数」と「途中計算に使う変化する値」の2つの意味を持たせています。短いプログラムならいいですが、長くなってくると、どちらの値が入っているかわからなくなってきます。 #1さんの「同じ機能はまとめる」という意見に賛成なのですが、残念ながら、このnum2が変化する、ということを見逃してしまったようで、printf("%d以上%d以下の全整数の和は",num2,num1);を移動してしまうと、期待した出力になりません。 できるだけ、一つの変数には一つの意味だけ持たせるようにした方がいいと思います。 今回のなら for (i=num2;i <= num1;i++) { sum += i; } と別な変数を使えばnum2は入力した値がそのまま残っていますから printf("%d以上%d以下の全整数の和は%dです。",num2,num1,sum); としても大丈夫です。
その他の回答 (6)
たぶん、これでも良いでしょう。 #include <stdio.h> #define sum(x, y) (((y-x+1) * (x+y)) / 2) #define swap(x, y) { int t = x; x = y; y = t; } int main(void) { int x, y; printf("2つの整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d", &x); printf("整数2:"); scanf("%d", &y); if (y < x) swap(x, y); printf("%d以上%d以下の全整数の和は%dです。\n", x, y, sum(x, y)); return 0; } (等差数列の和の公式より)
- asuncion
- ベストアンサー率33% (2127/6289)
こっちでもいいか…。 #include <stdio.h> int main(void) { int m, n, s, i, j, k; printf("2つの整数を入力してください\n"); printf("1個目:"), scanf("%d", &m); printf("2個目:"), scanf("%d", &n); i = m, j = n; if (m > n) i = n, j = m; for (s = 0, k = i; k <= j; k++) s += k; printf("%dから%dまでの数の合計は%d\n", i, j, s); return 0; }
- asuncion
- ベストアンサー率33% (2127/6289)
#include <stdio.h> int main(void) { int m, n, s, i, j, k; do { printf("2つの異なる整数を入力してください\n"); printf("1個目:"), scanf("%d", &m); printf("2個目:"), scanf("%d", &n); } while (m == n); i = m, j = n; if (m > n) i = n, j = m; for (s = 0, k = i; k <= j; k++) s += k; printf("%d以上%d以下の数の合計は%d\n", i, j, s); return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
この形だと num1 と num2 の比較が 2か所になるのがいまいちかなぁ. まあ無理すれば 1つにできるけど, だからといって美しいわけじゃないのでなんとも言えない. と書いておくけど, 実はこのプログラム自体が問題の条件を完全には満たしていないんじゃないかな? 「二つの整数値を読み込んで」と書いてはあるけど, その大小関係は書いてないよね. だから, どちらが大きかろうと気にせず動くプログラムを求めているのかもよ.
- KEIS050162
- ベストアンサー率47% (890/1879)
そんなにごちゃごちゃはしていないと思いますよ。あとは好みの問題になるかもしれませんね。 一応、参考として別の例(for 文を使わない例) while(1) { printf("整数1>整数2となる整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d",&num1); printf("整数2:"); scanf("%d",&num2); if (num1 <= num2) printf("整数1>整数2としてください\n"); else break; } sum = ( (num1+num2) * (num1-num2+1) ) / 2; printf("%d以上%d以下の全整数の和は%dです。\n",num2, num1, sum); ・While文 これは好みの範疇ですが、while(1) として敢えて無限ループにして、Breakの条件をif 文で記述する。Break条件が複数ある時に、すっきりかけます。(今回の例題では質問者殿の記述でもスッキリしていると思います。) ・for文 今回の例題では、for文を使わなくても算出できるので、この方がスッキリしていて、処理も早くなると思います。 ・最後の出力分 出力文の途中に演算が入るとちょっと見難いので、出力文を一本にしました。 ・蛇足 最初のif 文の判定は、題意からすると、num1 < num2 より、 num1 <= num2 の方が適切かと思います。 ※OKWAVEに投稿する時、インデントを見易くする為、スペースを全角としてあります。コピー&ペーストする時は、半角スペースに直してください。 ご参考に。
- black2005
- ベストアンサー率32% (1968/6046)
>printf("%d以上%d以下の全整数の和は",num2,num1); >printf("%dです。",sum); この2行を切り離す意味がない。 答えを計算後にまとめて出力すれば、かなりすっきりします。 (今のPCなら、どんな数値でも瞬時に計算されるので余計な心配無用) 例) printf("%d以上%d以下の全整数の和は%dです",num2,num1,sum); コーディングの話しではありませんが・・・ 以上および以下には当該数字も含まれるので、小さい数=大きい数もありです。 この場合、どういう結果となるべきか?考えた通りに動くか? この点に着目し、今一度確認してみて下さい。