アプリ版:「スタンプのみでお礼する」機能のリリースについて

(問題)
二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。

(自分の解答)
#include <stdio.h>

int main(void)
{
int num1,num2;
int sum=0;

do {
printf("整数1>整数2となる整数をそれぞれ入力してください\n");
printf("整数1:"); scanf("%d",&num1);
printf("整数2:"); scanf("%d",&num2);

if (num1 < num2) printf("整数1>整数2としてください\n");
} while (num1 < num2);

printf("%d以上%d以下の全整数の和は",num2,num1);

for (num2;num2 <= num1;num2++) {

sum=sum+num2;
}
printf("%dです。",sum);

return 0;
}


これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか?

回答お願いします。

A 回答 (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);
としても大丈夫です。
    • good
    • 0

たぶん、これでも良いでしょう。



#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;
}

(等差数列の和の公式より)
    • good
    • 0

こっちでもいいか…。



#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;
}
    • good
    • 0

#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;
}
    • good
    • 0

この形だと num1 と num2 の比較が 2か所になるのがいまいちかなぁ. まあ無理すれば 1つにできるけど, だからといって美しいわけじゃないのでなんとも言えない.



と書いておくけど, 実はこのプログラム自体が問題の条件を完全には満たしていないんじゃないかな? 「二つの整数値を読み込んで」と書いてはあるけど, その大小関係は書いてないよね. だから, どちらが大きかろうと気にせず動くプログラムを求めているのかもよ.
    • good
    • 0

そんなにごちゃごちゃはしていないと思いますよ。

あとは好みの問題になるかもしれませんね。

一応、参考として別の例(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に投稿する時、インデントを見易くする為、スペースを全角としてあります。コピー&ペーストする時は、半角スペースに直してください。

ご参考に。
    • good
    • 0

>printf("%d以上%d以下の全整数の和は",num2,num1);


>printf("%dです。",sum);

この2行を切り離す意味がない。
答えを計算後にまとめて出力すれば、かなりすっきりします。
(今のPCなら、どんな数値でも瞬時に計算されるので余計な心配無用)

例)
printf("%d以上%d以下の全整数の和は%dです",num2,num1,sum);

コーディングの話しではありませんが・・・
以上および以下には当該数字も含まれるので、小さい数=大きい数もありです。
この場合、どういう結果となるべきか?考えた通りに動くか?
この点に着目し、今一度確認してみて下さい。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!