
(問題)
二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。
(自分の解答)
#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;
}
これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか?
回答お願いします。
No.4ベストアンサー
- 回答日時:
問題を文章通りに受けとれば「異なる二つの整数値を大きい順に」ではないから、同じ値を入れても、大小の順番が逆でも対応しないといけない気がします。
> 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);
としても大丈夫です。
No.7
- 回答日時:
たぶん、これでも良いでしょう。
#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;
}
(等差数列の和の公式より)
No.6
- 回答日時:
こっちでもいいか…。
#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;
}
No.5
- 回答日時:
#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;
}
No.3
- 回答日時:
この形だと num1 と num2 の比較が 2か所になるのがいまいちかなぁ. まあ無理すれば 1つにできるけど, だからといって美しいわけじゃないのでなんとも言えない.
と書いておくけど, 実はこのプログラム自体が問題の条件を完全には満たしていないんじゃないかな? 「二つの整数値を読み込んで」と書いてはあるけど, その大小関係は書いてないよね. だから, どちらが大きかろうと気にせず動くプログラムを求めているのかもよ.
No.2
- 回答日時:
そんなにごちゃごちゃはしていないと思いますよ。
あとは好みの問題になるかもしれませんね。一応、参考として別の例(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に投稿する時、インデントを見易くする為、スペースを全角としてあります。コピー&ペーストする時は、半角スペースに直してください。
ご参考に。
No.1
- 回答日時:
>printf("%d以上%d以下の全整数の和は",num2,num1);
>printf("%dです。",sum);
この2行を切り離す意味がない。
答えを計算後にまとめて出力すれば、かなりすっきりします。
(今のPCなら、どんな数値でも瞬時に計算されるので余計な心配無用)
例)
printf("%d以上%d以下の全整数の和は%dです",num2,num1,sum);
コーディングの話しではありませんが・・・
以上および以下には当該数字も含まれるので、小さい数=大きい数もありです。
この場合、どういう結果となるべきか?考えた通りに動くか?
この点に着目し、今一度確認してみて下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
プログラミングに関して
-
C言語の二分法のプログラムにつ...
-
初心者です。for文、if文を使っ...
-
while文を使った問題なのですが...
-
C言語階乗の総和を求める
-
C言語で分からないことがありま...
-
C言語 マスターマインドゲーム...
-
教えてください
-
プログラム
-
販売金額の合計などを求める問題
-
C言語・アルゴリズムの勉強法(...
-
配列を関数に渡す方法
-
Enterキーを押されたら次の処理...
-
*をユーザーが入力した数字の数...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
C言語階乗の総和を求める
-
初心者です。for文、if文を使っ...
-
配列を関数に渡す方法
-
C言語 マスターマインドゲーム...
-
C言語 入力した数値の平均値の...
-
C言語の二分法のプログラムにつ...
-
配列を使って魔方陣
-
scanf関数を用いての加減乗除%...
-
10進数からN進数に変換するプロ...
-
c言語のwhile文を使った計算で...
-
全角文字の判定
-
C言語 数字以外を入力させない...
-
プログラミングで二番目に大き...
-
while文を使った問題なのですが...
-
getcの改行判定
-
C言語
-
c言語で平均をだす
おすすめ情報