歳とったな〜〜と思ったことは?

forの直後で1+2+3+4+5+・・・・・・・と加算し続ける式がわからないので教えてください。

#include<stdio.h>

int main(void)
{
char moji;
int i,sum;

printf("正の整数を1から順に加算します。n\");
printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n");

moji=getchar();
if(moji==y)
{
for(i=2;sum>=1001;i++)
{
この部分がわかりません;
printf("加算値は%dです。¥n",sum);
}
}else if(moji=='n'){
printf("終了します。\n");
}else{
printf("YまたはNを入力してください。\n");
}


return 0;

}

A 回答 (4件)

 密かに、あなたの考えていることと、例示されているソースに書いてあることが違うような気がします。


 まぁ、実際に動かしてみるのがいちばんの勉強な訳ですが・・・

printf("正の整数を1から順に加算します。n\");

 この行は少しおかしいですね。最後の改行文字は、「\n」です。ちなみに、元のままだと、「"」をエスケープしますので、文字列が終わりません。多分、一見意味不明のコンパイルエラーになります。(プログラムが終わるまでにeofになっただのそんなエラーかな?)

printf("正の整数を1から順に加算します。\n");

moji=getchar();
 
 この行までは、たぶん問題はありません。

if(moji==y)
{

 ここは、文法上の問題がひとつ。運用上の微妙な問題がひとつあります。
 まず文法上正しくすると次の通り。
if ( moji == 'y' )
{

 「y」は文字定数ですから「'」で囲う必要がありますね。
 もう一つは、キーボードの状態の問題。
 説明文では、大文字のYを打つように指定されてますが、判定は小文字のyですね。まぁ、Yのキーを打てばいいんだ!というのが普通の発想でしょうが、そうするとプログラムは

if (moji == 'y' || moji == 'Y')
{

となります。

 さて、本題。ここには、けっこうたくさんの問題が潜んでいそうです。

for(i=2;sum>=1001;i++)
{
この部分がわかりません;
printf("加算値は%dです。¥n",sum);
}

 まず、最初は、sumの初期値です。最初にsum>=1001が判定されるときには、まだsumには何も代入されていません。よって不定値となりますので、この条件はその時の運で成立するかどうかが決まります。sumには、加算値が入るようですから、何も足していないときの値は0です。for文の前に

sum=0;

が必要です。
 さらに、最初の1も表示しないといけないでしょうから、for文の初期値設定項は、

for (i=1;

 となると思います。
 次に、for文の条件判定項ですが「sum >= 1001」です。これは、「sumが1001以上の間、forの中を繰り返す。」ですから、何もしないことになってしまいます。等号が逆ですね。

for (i=1; sum <=1001;

ところで、あなたは、表示が終了するのはどの段階にしたかったですか?ちなみに、このままだと、「答えの数字が1001より大きくなったら」計算を終了します。もし、期待されている結果が、1から1001までの数字の足し算なら、for文の条件は

for (i=1; i <= 1001;

 ですね。
 ところで、1001は計算したかったですか?それとも不要ですか?もし不要なら

for (i=1; i < 1001;

for (i=1; i <= 1000;
です。両方の行を混同してしまっている気配が1001という中途半端な数字にかすかに見えるので書いておきます。

 ここまでで、for文の行は次の通り。
for (i=1; i <= 1000 ; i++)
{

 ですね。
 で、不明の行には、
 sum += i;
 が入ります。sumにiを加算してその結果を表示すると素直に書いただけ。

printf("加算値は%dです。¥n",sum);

ですが、最後の改行が全角文字で書いているような・・・これは、半角にしてくださいね。でないと「¥n」と表示します。


 このブロックをまとめると
sum=0;
for (i=1 ; i < 1001 ; i++)
{
sum += i;
printf("加算値は%dです。\n",sum);
}

 となります。もし、本当に加算結果が1001より大きくなったら停止でよいなら、for文を
for (i=1 ; sum <=1001 ; i++)
に戻してください。
 あと、微妙な問題ですが、1から1000までの加算とすると、その結果は、500500になります。もしかすると、sumの型は、long以上の精度にしておいた方がよいかもしれません。(環境がわからないので?です。もしその環境がintで、50万を表現できるならok)

}else if(moji=='n'){

 この行は、さっきと同じ。多分、
} else if (moji == 'n' || moji == 'N') {
 でしょう。
 また、プログラムのスタイルの問題として、ifやforとおなじ行に「{」を書くか、次の行に書くかは自分の好みでよいですからちゃんと決めておく方がよいです。今回は、両方のパターンが混在してますが、こうなると、「{}」の対応が見つけにくくなり、入れ子が深くなったとき苦労することになります。

 後は、多分問題ありません。
 相当お節介に書いててみました。(本来は、「この部分が・・・」と書いてある行だけでよかったのかも?)
    • good
    • 0

#1です。


#2さん、正解。

済みません細部まで見て無かったです。見直してびっくりした。
あっちもこっちも。。。ったく(; ̄□ ̄)yヾ ポロ

※「この部分が…」と書いてあったじゃないか!w
    • good
    • 0

if(moji=='y')



では?

for(i=2;sum<=1001;i++)

では?(sum>=1001じゃ、ループが回らない。)

単純に書くなら、for文の前後ですけど、、、

sum = 1;
for(i=2;sum<=1001;i++)
{
sum = sum + i;
printf("加算値は%dです。\n",sum);
}

でしょう。
単純に足していくだけですね。

でも、こういう場合、普通はfor文で2から始めるのではなく、1から始めます。
やるなら、↓こう。

sum = 0; /* 明示的に 0 にしてるだけ */
for(i=1;sum<=1001;i++)
{
sum = sum + i;
printf("加算値は%dです。\n",sum);
}

※sum += i;
※って使えたかな?忘れた。(^^;
    • good
    • 0

#include<stdio.h>



int main(void)
{
char moji;
int i,sum;

sum=0; /*追加:一応初期化*/


printf("正の整数を1から順に加算します。n\");
printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n");

moji=getchar();
if(moji==y)
{
for(i=2;sum>=1001;i++)
{
sum+=i;/*この部分がわかりません;*/
printf("加算値は%dです。¥n",sum);
}
}else if(moji=='n'){
printf("終了します。\n");
}else{
printf("YまたはNを入力してください。\n");
}


return 0;

}
    • good
    • 0

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


おすすめ情報