dポイントプレゼントキャンペーン実施中!

“初項1公差1の等差数列において、数値XとYを入力して、この数列におけるX項からY項までの数列の和を算出する”プログラムを作っています。
実行結果を
『第X項から:1
 第Y項まで:10
 初項1公差1の等差数列において、
 第1項から第10項までの和は55です。』としたいのですが、
上手くいきません。どこが間違っているのでしょうか?
(初心者なのでかなりミスがあると思いますが…。)

↓作ったプログラム

#include<stdio.h>
main()
{
int X;
int sum = 0;
int Y;

printf("第X項から:");
scanf("%d",&X);
printf("第Y項まで:");
scanf("%d",&Y);

while(X <= Y);
{
sum = sum + X;
X = X + 1;
}

printf("初項1公差1の等差数列において、\n");
printf("第%d",X);
printf("項から第%d",Y);
printf("項までの数列の和は%d",sum);
printf("です。");
}

A 回答 (8件)

> 『別の変数に変更前のXの値を保持する』にはどうしたらよいですか?



変数X、sum、Y以外に、別の変数を用意します。
Xに何らかの計算を施す前(今回の場合、whileループ前)に、
その別の変数にXの値を代入すれば良いです。
下に例を載せておきます。追加&変更したところに左矢印をいれておきました。

#include<stdio.h>
int main(void)
{
int X;
int sum = 0;
int Y;
int temp; ←これが『whileループ前のXの値』を保存するための変数

printf("第X項から:");
scanf("%d",&X);
printf("第Y項まで:");
scanf("%d",&Y);

temp = X; ←この行で、変数tempに『whileループ前のXの値』を代入する

while(X <= Y)
{
sum = sum + X;
X = X + 1;
}

printf("初項1公差1の等差数列において、\n");
printf("第%d",temp); ←変数tempに、『whileループ前のXの値』が格納されている
printf("項から第%d",Y);
printf("項までの数列の和は%d",sum);
printf("です。");
}
    • good
    • 0
この回答へのお礼

有難うございます!
「別の変数を用意する」のをどうしたらよいのか分からなかったのですが、例まで載せていただいて、とても分かりやすく助かりました!!

お礼日時:2008/06/04 19:24

No5です。


>なるほど…。
>やり方はいろいろあるんですね。
No.6さんの、別の変数を用意する方法、
No.7さんの、関数にする方法、
が出ましたから、ついでにもうひとつ。
「Xを使う前に出力する」という方法もあります。

つまり、No.6さんのプログラムの
 temp = X;
の部分に、
 printf("初項1公差1の等差数列において、\n");
 printf("第%d",X);
を移動させて、Xの値が使われて変化する前に表示してしまい、whileループを実行する訳です。

#趣味の回答でした。
プログラミングって面白いでしょ?
質問者さんがプログラミングを楽しく感じてもらえればうれしいです。
    • good
    • 0

>プログラミングの問題集を解いていて出てきた問題です。


>『繰り返し処理』の単元で、X、Yにはいろいろな数値が入るのですが、
>今回はX=1、Y=10で考えてみようということです。

他の方の回答は全然読んでないんですけど、
最低でも「第 X 項から第 Y 項までの和を求める」部分は関数にしましょう。

関数の実装は while ループを回すもよし、和の公式を用いるもよし。

そうすれば、変更前の X を何処に保存しておこう、などと悩む必要はなくなります。
関数の引数に X を渡せば、勝手に値がコピーされて元の X が変更されることはありません。
    • good
    • 0
この回答へのお礼

なるほど…。
やり方はいろいろあるんですね。
試してみます。有難うございました!!

お礼日時:2008/06/04 19:26

>『第11項から第10項までの数列の和は55です。


>なぜ、第11項からなんですか?
「printf("第%d",X);」が実行されるときのXは、4行上の「X=X+1]によって、1,2,3・・・、11になっているからです。
    • good
    • 0
この回答へのお礼

有難うございます。
今気づきました・・・ 。

先ほど解答していただいた方にもありましたが、
『第1項から』にするにはどうしたらよいですか?

お礼日時:2008/06/03 00:10

> 上手くいきません。

どこが間違っているのでしょうか?

何が上手くいかないのでしょうか?
それが分からないと適切なアドバイスができません。
それから言語は何でしょうか?
C言語だとしたら、次の点が間違っています。

> main()

これは間違っているかどうかは分かりませんが、普通、

int main(void)

と記述します。
それからmain関数内の最後に

return(0);

が無いのも怪しいです。

> while(X <= Y);

while(条件式)の後ろに;をつけてはいけません。なので;を消して下さい。
もしコンパイルエラーが発生するなら、先ほど述べた箇所とこの行が原因かもしれません。

それから、whileループ内で変数Xの値が変更されているので、
whileループの後の『 printf("第%d",X);』では
変更後のXの値が表示されます(ANo.2の方が指摘しています)。
本来は、変更前のXの値を表示したいのではないでしょうか?
そうであれば、『 printf("第%d",X);』をwhileループ前に配置するか、
別の変数に変更前のXの値を保持するなどの対策をとって下さい。

これ以外に上手くいかないことがあるなら、それを教えて下さい。

この回答への補足

補足じゃないんですが…。
第11項からになるのは、Xが変更されているからですね。
気づくの遅くてスミマセン。
『別の変数に変更前のXの値を保持する』にはどうしたらよいですか?

補足日時:2008/06/03 00:03
    • good
    • 0
この回答へのお礼

有難うございます!
while(条件式)の後ろの;が原因でした。
これで上手く出力できたのですが、
『第11項から第10項までの~』と、なぜか第11項になっています。
どこか式がおかしいのでしょうか?

お礼日時:2008/06/02 23:59

第 X 項から Y 項までの和がいくつになるのかは「分かっている」んだから


わざわざプログラムで順番に足し算する必要などないのでは?
    • good
    • 0
この回答へのお礼

スミマセン。
プログラミングの問題集を解いていて出てきた問題です。
『繰り返し処理』の単元で、X、Yにはいろいろな数値が入るのですが、今回はX=1、Y=10で考えてみようということです。

お礼日時:2008/06/02 23:38

うん。

このままだと、

> 初項1公差1の等差数列において、
> 第11項から第10項までの数列の和は55です。

と出力されそうな予感。
違うのかな?
    • good
    • 0
この回答へのお礼

ありがとうございます。
『第11項から第10項までの数列の和は55です。』
なぜ、第11項からなんですか?

お礼日時:2008/06/02 23:41

X は変更していいの?

    • good
    • 0
この回答へのお礼

ありがとうございます。
Xを変更するとは、数値を変更?もしくはXそのものを変更ですか?

ちなみに、X、Yにはいろいろな数値が入っても、数列の和が計算できるようにしたいです。今回は、X=1、Y=10で考えてみようということだと思います。(多分そのような問題だと思いますが…。)

お礼日時:2008/06/02 23:46

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