初めて自分の家と他人の家が違う、と意識した時

第X項から第Y項までの和を求めるプログラムを作りたいのですが、どうしてもうまくいきません、問題はこうなっています
初項1公差1の等差数列がある(An={1 2 3 4 5 ・・・n})。数値XとYを入力して、この数列におけるX項からY項までの数列の和を算出するプログラムを作成せよ。実行結果の例を以下に示す。
私はこの問いに対してこのようにプログラミングしました
#include<stdio.h>

void main()
{
int X;
int Y;
    int sum=0;

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

while(X<=Y)
{
sum=sum+X;
X++;
    }
printf("初項1交差1の等差数列において、\n");
printf("第%d項から第%d項までの数列の和は%dです。",X,Y,sum);
}
こうすると最後のX項の値がY項より1大きく表示されてしまいます、どうしたらよろしいのでしょうか?どなたかわかる方返答をお願い致します。

A 回答 (4件)

処理を実施して、x++;した後に条件判断でx>yを判断しているから、x+1とyが等しくなるのは当たり前。


ループから抜けたら
x--;
の一文を加えればOK。
    • good
    • 0
この回答へのお礼

edmin2004さんのおっしゃる通りやってみたのですが私の知識がない分うまくいきませんでした。すいません、初心者で申し訳ございません。
質問の内容が具体的でなく伝わりにくかったと思いますので、もう一度お教えくださいm・・m
たとえばXに3Yに8を代入すると最後の文では
第9項から第8項までの数列の和は33です。
と表示されてしまうのです。本当ならば第3項から第8項までと表示させたいのですが・・・

お礼日時:2008/12/29 18:38

#3さんの回答の最後に書いてある考え方を採用して、



#include <stdio.h>

int main(void)
{
int x, y, sum = 0;

printf("第X項から:");
scanf("%d", &x);
printf("第Y項まで:");
scanf("%d", &y);
printf("初項1交差1の等差数列において、\n");
printf("第%d項から第%d項までの数列の和は", x, y);
while (x <= y) {
sum += x;
x++;
}
printf("%dです。\n", sum);
return 0;
}
    • good
    • 0
この回答へのお礼

すごいです!わかりました、このように、和で区切るとは思いもしなかったです!ほんとうにありがとうございまたm・・m
でもみなさんが教えてくれた、新しい変数を使ったプログラミングをすることも挑戦してみます!!
答えてくださったみなさん本当にありがとうございました!

お礼日時:2008/12/29 20:17

初期値X=3,Y=8の時のwhile文のある位置でのX,Y,sumの値を紙に書いてみればわかりますよ。


1回目 X=3,Y=8,sum=0
2回目 X=4,Y=8,sum=3
3回目 X=5,Y=8,sum=7
4回目 X=6,Y=8,sum=12
5回目 X=7,Y=8,sum=18
6回目 X=8,Y=8,sum=25
7回目 X=9,Y=8,sum=33
7回目でwhile文は偽になり{から}までのブロックは実行されません。
ですからprintfが実行される時点ではXは9、Yは8、sumは33になります。
やり方は二通りあります。
変数をひとつ追加する方法と、変数を追加しないでprintfの書き方をを少し工夫する方法です。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
asuncionさんとQuantさんの助言の通りこのようにプログラムを作り直したのですが、X=3、Y=8のときに和が36となってしまいました。何がおかしいのでしょうか?本当に初心者ですいませんm・・m
#include<stdio.h>

void main()
{
int X;
int Y;
int sum=0;
int Z=X;

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

while(Z<=Y)
{
sum=sum+Z;
Z++;
}

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


}

お礼日時:2008/12/29 20:02

#1さんの回答は正しくありません。



Xの値をインクリメントしている限り、
while文のループを抜けてからデクリメントしてもしなくても、
最初に入力したXの値とは異なっているのですから、
正しい結果を得ないのは当然です。

対策は、最初に入力したXの値を「別の変数」に保存しておき、
最後のprintfのXのかわりに、その「別の変数」の値を出力することです。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報