質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

183閲覧

C言語の入門書の演習問題と変数の初期化

drna

総合スコア22

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/23 10:39

前提・実現したいこと

C言語の繰り返し処理を学んでいる途中です。

1 自分のプログラムを見やすくしたいです。
2 変数の初期値を知りたいです。

C言語の入門書で
「二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数全てを加えた値を表示するプログラムを作成せよ」
という問題があります。

発生している問題

1 とりあえず答え通りの結果が出たのですが、他にもっとプログラムを見やすくorシンプルにできないでしょうか?

2 最初の変数の宣言のところで int n1, n2, dif, sum;としたところ、出力の合計が-430548067となりました。sum = 0;を追加したところ改善されましたが。
てっきり変数には最初から0が入っているものと思っていました。
変数の初期値は何が入っているのでしょうか?

該当のソースコード

#include <stdio.h> int main(void){ int n1, n2, dif; int sum = 0; printf("二つの整数を入力してください。\n"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); if(n1 > n2){ dif = n1 - n2; do{ sum = sum + n2 + dif; dif = dif - 1; }while(dif >= 0); printf("%d以上%d以下の全整数の和は%dです。", n2, n1, sum); }else if(n2 > n1){ dif = n2 - n1; do{ sum = sum + n1 + dif; dif = dif - 1; }while(dif >= 0); printf("%d以上%d以下の全整数の和は%dです。", n1, n2, sum); }else{ sum = n1; printf("%d以上%d以下の全整数の和は%dです。", n1, n2, sum); } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

もっとプログラムを見やすくorシンプル

等差数列の和の公式を使う方法があります。

初項a,公差d,項数n,末項lの等差数列の和はn(a+l)/2になります。

あとは、n1よりn2が小さい場合に交換する事によって
(n2-n1+1)*(n1+n2)/2で求められます。

変数の初期値は

初期化されていない非staticなローカル変数の初期値は規格上未定義になっています。
つまり、コンパイラが自由に決めていい事になっているので
初期値を使う必要がある場合は必ず初期化しましょう。

投稿2018/11/23 11:10

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drna

2018/11/23 11:27

ありがとうございます!! 等差数列の和の公式が初耳なので、数学を勉強した方が良さそうです。 コンパイラが自由に決めているから変な数字になるんですね。 次から初期化を必ずします。
asm

2018/11/23 11:36

和の公式を使わない場合でも、n1<n2になるように交換すると 後の処理が楽になりますよ 初期化について実際には、 (高速化のために)メモリから場所だけ割り当てた結果、以前何かの変数が使ってた時の値が残るパターンと (デバッグのために)一定の値が割り当てられるパターン などがあります。
drna

2018/11/25 06:47

なるほど、、 少しハードの部分も興味が湧いてきました!
guest

0

変数の初期値は不定です。

問題は等差数列の和ですので
以下で求めることができますが、

C

1sum = (n1 + n2) * ((n1 > n2 ? n1 - n2 : n2 - n1) + 1) / 2;

投稿2018/11/23 11:20

kaba

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaba

2018/11/23 11:21

回答がかぶってしまいました。すみません
drna

2018/11/23 11:28

いえいえ、回答してくださり、ありがとうございます!
guest

0

等差数列の和という事で、回答がついていますが、、、そのまま、コードを書くとすると、以下のようにしたら、どうでしょう。

C

1 int num = n1; 2 int end = n2; 3 if (n1 > n2) { 4 num = n2; 5 end = n1; 6 } 7 sum = 0; 8 while (num <= end) { 9 sum += num++; 10 }

投稿2018/11/23 11:37

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/11/23 11:41

あ、解決済みになっていたんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問