C言語のwhile文を使った計算で困っています、助けてください

このQ&Aのポイント
  • 初項1公差1の等差数列のX項からY項までの和を求めるプログラムを作成したが、最後のX項の値がY項より1大きく表示されてしまう
  • C言語のwhile文を使用して数列の和を求めるプログラムにおいて、最後の項の値の取得方法に問題がある
  • X項からY項までの和を求めるC言語のプログラムで、最後の項の値が正しく表示されない問題が発生している
回答を見る
  • ベストアンサー

c言語のwhile文を使った計算で困っています、助けてくださいm・・m

第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大きく表示されてしまいます、どうしたらよろしいのでしょうか?どなたかわかる方返答をお願い致します。

  • sr-ns
  • お礼率75% (3/4)

質問者が選んだベストアンサー

  • ベストアンサー
noname#77845
noname#77845
回答No.1

処理を実施して、x++;した後に条件判断でx>yを判断しているから、x+1とyが等しくなるのは当たり前。 ループから抜けたら x--; の一文を加えればOK。

sr-ns
質問者

お礼

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

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

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

sr-ns
質問者

お礼

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

  • Quant
  • ベストアンサー率18% (23/122)
回答No.3

初期値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の書き方をを少し工夫する方法です。

sr-ns
質問者

お礼

返答ありがとうございます。 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); }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

#1さんの回答は正しくありません。 Xの値をインクリメントしている限り、 while文のループを抜けてからデクリメントしてもしなくても、 最初に入力したXの値とは異なっているのですから、 正しい結果を得ないのは当然です。 対策は、最初に入力したXの値を「別の変数」に保存しておき、 最後のprintfのXのかわりに、その「別の変数」の値を出力することです。

関連するQ&A

  • プログラミング

    “初項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("です。"); }

  • 数列の結果の表示

    いつもお世話になっています。 プログラミングの初心者で勉強中です。 初項1公差1の等差数列で、X項からY項までの和を求めるプログラミングを作っています。 次のようにプログラムを作ったのですが、結果の表示がうまくいきません。最後の第X項から第Y項までの数列の和は・・・のX項の部分がおかしな数字で出てきます。 間違っているところを教えていただけますか? #include<stdio.h> main() { int X = 1; int Y; int sum = 0; printf("第X項から:"); scanf("%d",&X); printf("第Y項まで:"); scanf("%d",&Y); while (X <= Y) { sum = sum + X; X = X + 1; } printf("初項1公差1の等差数列において、\n第%d項から第%d項までの数列の和は%dです。",X,Y,sum); }

  • C言語のfor文について質問です。

    C言語の課題がわかりません‼︎ for文を使って初項a、公差dの等差数列を初項からn項までを加える計算を行うプログラムを作りなさい。その時、a.d.nはscanfを用いて入力できるようする。 また、等差数列の和の公式は使えないものとする。 どなたか回答よろしくお願いします。

  • while文でπ/4の近似値を求める

    π/4=1-(1/3)+(1/5)-(1/7)+(1/9)-(1/11)+...... 上式でπ/4を求める時、第何項まで求めれば 3.14159/4との差の絶対値が0.0001より小になるか その項数とそのときのπ/4の近似値を求めよ という問題なんですが、 3.14159/4との差の絶対値が0.0001より小になるという 部分がわかりません・・。 私は、3.14159を4で割ったものが0.7853975を使って 下のようにしたのですが、うまくできません。 上式のようにプラスとマイナスが繰り返される場合 sum=-sumという風にするというのは習ったのですが・・ 計算式だとうまくいきません・・・ 初心者でプログラミング始めたばかりなので わかりやすく教えていただけると嬉しいです。 私の作ってみたプログラムは一応こんな感じです。 #include<stdio.h> #include<conio.h> int main(void){ int k,i=0; double sum; sum = 0,0; printf("k = "); scanf("%d",&k); while(0.7853975-sum<0.0001){ i++; sum=-sum; sum=(double)1/((2*i)-1); } printf("第%d項までの和は%f\n",k,sum); getch(); return 0; }

  • 数学Bの問題

    数列に関する問題 下記の問題の解答と解説もお願いします 1, 一般項が次の式で表される数列について (1) an=3n-4 初項から第5項まで (2) an=(2n+1)^2 初項から第5項まで 2. 次の等差数列の一般項と第30項 (1) 初項 -2, 公差 3 (2) 9,3,-3,-9 ・・・ 3,次の等差数列の末項が第何項なのか (1) 3,8,13,・・・,38 (2) -4,-6,-8,・・・,-42 4, 第6項が -2, 第15項が 25, である等差数列{an}の初項,公差,一般項 5, 次の等差数列の和 (1) -2,1,4,7,10,13,16,19 (2)初項 -9, 公差 -4, 項数 36 (3)初項 16, 公差 -4, 項数 n 6, 次の等比数列の一般項 (1) 3,-6,12,-24・・・ (2) 3, -3/2, 3/4, -3/8,・・・ 7, 次の等比数列の末項は第何項か (1) 1,2,4,8・・・,512 (2) 3,12,48・・・,768

  • 数学の問題です

    数がいくつかあるのですがすいません><; 1.初項5 公差2の等差数列に対して、初項から第何項までの我がはじめて777より大きくなるか答えよ 2.初項がaで、公差dが自然数である等差数列anが2つの条件  A: a3+a5+a7=93 B:an>100となる最小のnは15 (1)公差d? (2)初項a? (3)a1+a2+・・・・+an>715となる最小のn? 3. 初項が6で 公差dの等差数列がある。初項から第4項までの輪と初項から第12項までの我が等しいとき、第n項から第n+7項までの和をTnとするとき、|Tn|の最小値とそのときのn? 答え: 1.26 2.(1)d=7 (2)a=3 (3)n=15 3・n=5のとき。最小値0 という答えなのですが。やり方などが全く分からないので・・ 出来れば詳しい解説とともにお願いします・・

  • 等差数列です。

    等差数列{an}はa2+a4=16, a3+a5=22を満たしている。このとき、数列{an}の初項(ア),公差(イ)である。また等差数列{bn}は初項から第5項までの和が45、第6項から第10項までの和が145である。この時数列{bn}との初項は(ウ),公差は(エ)である。二つの数列{an}に共通な項を小さい順にC1,C2,C3....,,,,とすると数列{Cn}は初項が(オ)、公差が(カキ)の等差数列である。 また、二つの数列{an}と{bn}の少なくとも一方に含まれている項を小さい順に並べて、d1,d2,d3,......とする。ただし共通な項はいずれか一方のみを並べるものとする。この時、dn>100を満たす最小の整数nは(クケ)であり、d(クケ)=(コサシ)であるさらにΣ[i=k,n],(クケ)=(スセソタ)である。 よろしくお願いします。上手く書けませんでした御理解いただけたでしょうか。

  • 数列で・・・

    公差が正整数の等差数列があり、そのある項は0で、 初項から第35項までの和は665である。この数列の公差を求めよ。 という問題がありましたが、難しすぎて解けませんでした。 どうかお助けください。よろしくお願いいたします。

  • 等差数列の公差と初項を・・・

    第15項が25、第10項から第15項までの和が120 の等差数列の公差、初項を求めたいのですが、どのようにとけば良いのか分かりません。至急教えて下さい。

  • 等差数列の基本的な問題

    第7項が29、第10項から第19項までの和が815である等差数列の初項と公差を求めよ 一応答えが出たのですが、その答えだと和が会わないような気がするんです。 初項239 公差-35 連立するときに間違えたと思い何度も確認したのですが、よくわからないのです。 以下の式でいいのでしょうか? a+6d=29 1/2*10*(2a+9d)=815 かなり初歩的な質問と思われますが、宜しくお願いします

専門家に質問してみよう