次に示すプログラムは、100までの素数を表示するものです。
見てのとおり、C言語のwhile文を使って書いてあります。
#include <stdio.h>
int main(void)
{
int a, b;
int flag = 0;
a = 2;
b = 2;
while(b <= 100){
*ここ*
while(a < b){
if(b%a == 0){
flag = 0;
break;
}
else{
flag = 1;
}
a++;
}
if(flag == 1){
printf("%dは素数\n", b);
}
b++;
}
getch();
return 0;
}
最初、手本を参考にしながら上記のように書きましたが、うまく機能せず、3から100までの数字すべてが素数であると表示されました。
どこが間違っているのかと、手本と厳密に見比べてみたら、8行目の
a = 2
が*ここ*と書いてある場所に書かれていました。
まさかないだろうと思いつつ、もとあったのを消して*ここ*に書き換えたら、正しく素数が表示されるようになりました。
値を代入する場所が違うだけで、なぜこのような違いが起こるのか全く理解できません。
教えてください。
(一応、書いておきますが使っているコンパイラはBorlandのやつです
コンパイラのせいってことはないですよね)
No.4ベストアンサー
- 回答日時:
>つまり、a = 2 はwhileの{}に入れないといけないということで、あってますか?
はい。
#2は無視か,flag = 1の誤り(変数の初期化時も)。勘違いしていた,すまん。
>下のほうは、なぜ値が増えていかないのですか?
毎回
a=0;
が実行されるから。
#1の「階乗」とは言わないだろうな。なんと言うか思いつかんけど。
> >下のほうは、なぜ値が増えていかないのですか?
> 毎回
> a=0;
> が実行されるから。
この文でかなりすっきりしました。
a = 0 は一度実行されたら、それ以降は関係ないと思い込んでいました。
たしかに、printf("debug:%d",a); で見た時もaの値は毎回2にリセットされてました。
1から10まで全部表示されるのを階乗とは言わないですね…
すみません、訂正します…
flagはどこに入れても問題ありませんが、なんか、こうするといいっていうのがあるみたいですね。(自分には分かりませんが)
ひとまず、解決まで導いていただきありがとうございました。
No.6
- 回答日時:
>#5
>flag の初期化」は意味をなしません
うん,自分でも解ってて,
>flag = 1;
>a = 2;
>while (a < b) {
>if (b % a == 0) {
>flag = 0;
>break;
>}
>a++;
>}
自分はこの形を望んでいたからflagを初期化する処理を書いたんだけど,
コードを書いて説明するのが面倒くさかったものだから
>2は無視か,
っていう部分が入っているの(汗。やっぱり無駄に混乱させる分俺の回答自体が害悪になっちゃったかなあ?
結論から言うと、Tacosanさんと同じように flag = 1 にする else はいらない、
だから、flag を 1 で初期化すべしってことですね。
害悪なんてことはないです。
#4は自分が求めていたような回答でした。
何回も質問を見ていただき、ありがとうございました。
No.5
- 回答日時:
えぇと, このプログラムにおいて「flag の初期化」は意味をなしません>#4. だからどこにあってもいいしどんな値にしてもいいのですが, 本質をいうとこのプログラムは「動作はあっているけど論理的に間違っている」と思います. 内側の while ループで if の else 部分が無駄ですし, 変数 flag が「b が素数なら 1, そうでなければ 0」という値を取る以上「素数かどうかをチェックする途中で 1 にする」のは誤解を招きかねません.
flag = 1;
a = 2;
while (a < b) {
if (b % a == 0) {
flag = 0;
break;
}
a++;
}
の方が「しなければならないことを過不足なく表している」という点でより正しい. もっとコンパクトにするなら
a = 2;
while (b % a != 0) {
a++;
}
でも (あとの if の条件を a == b に変えれば) 同じような動作になりますが, あんまりお勧めしない.
回答ありがとうございます。
flag = 0 としていた(flag の初期化)のは、もとのプログラムでは何も意味をなしていなかったんですね。
最初に flag = 1 とすることで
else{
flag = 1;
}
の部分が省けて、分かりやすくすることができました。
それ以上コンパクトにすると自分には少し分かりづらそうな気がするのでやめておきます。
論理は分かりますが…
No.3
- 回答日時:
プログラムは、書いてある命令を書いてあるとおりに実行していきます。
書いてある内容が変われば実行結果は変わるのが当然です。もちろん、たまたま変わらない場合もありますが、この場合は変わると言うことです。a=0;
for(i=0;i<10;i++){
a++;
printf("%d\n",a);
}
と、
for(i=0;i<10;i++){
a=0;
a++;
printf("%d\n",a);
}
の違いがわかりますか?
この回答への補足
回答ありがとうございます。
違いはよく分かりません。
でも、やってみたら、上は1の階乗が表示されましたが、
下は1だけが表示されました。
下のほうは、なぜ値が増えていかないのですか?
himajin100000さんに違いを教えていただいて解決しました。
a++が実行オブジェクトであるのと同じようにa=0も実行オブジェクト
ただ、それだけのことが分からずに悩んでたみたいです。
ありがとうございました。
No.1
- 回答日時:
やっていることがそもそも違うから
その処理だと
2は素数(a == 2,b==2)
3は素数(3 % 2 == 1)
4は素数(4 % 3 == 1) ←ここで 4 % 2 == 0をチェックしない
5は素数(5 % 4 == 1) ←ここで 5 % 3 == 0, 5 %2 == 0はチェックしない
6は素数(6 % 5 == 1) ←ここで 6 % 4 == 0, 6 % 3 == 0, 6 % 2 == 0はチェックしない
となっちゃうよね?
while(a < b){
printf("debug:%d",a); /* ここで値を見張ってみればたぶん一目瞭然 */
/* 略 */
}
この回答への補足
回答ありがとうございます。
やっていることが違うのは分かりました。
つまり、a = 2 はwhileの{}に入れないといけないということで、あってますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使って魔方陣
-
#if 1 #elseの意味について
-
行列をべき乗させるプログラム
-
構文エラー";"が型の前にあり...
-
10進数からN進数に変換するプロ...
-
計算結果がlong型以上になる場...
-
10進数を2進数に変換したい...
-
プログラミングの配列で
-
for文について
-
c言語for文
-
C言語 プログラム
-
C言語・最大値を算出するプロ...
-
C言語 数字以外を入力させない...
-
プログラミングで二番目に大き...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
C言語で、条件をつけて総和を求...
-
???ダメなんです(分からないん...
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
10進数からN進数に変換するプロ...
-
getcの改行判定
-
C言語で電卓を作成する。
-
プログラミングで二番目に大き...
-
配列を使って魔方陣
-
C言語プログラムが理解できなくて…
-
計算結果がlong型以上になる場...
-
scanfが実行されません
-
素因数分解のプログラムを作成...
-
プログラム
-
while文を使った問題なのですが...
-
C言語階乗の総和を求める
-
C言語 エラー表示 break の位...
-
C言語の二分法のプログラムにつ...
-
階乗のプログラム!!
-
初心者です。for文、if文を使っ...
おすすめ情報