次に示すプログラムは、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
10進数からN進数に変換するプロ...
-
配列を使って魔方陣
-
配列を関数に渡す方法
-
while文について、c言語...
-
if-else文および標準演算子(*...
-
C言語 数字以外を入力させない...
-
C言語です
-
c言語プログラミングで1から100...
-
raspberrypiでロータリエンコーダ
-
C言語。どうしてコンパイルでき...
-
改善すべき点を教えてください。
-
C++での乱射ショットについて教...
-
getcの改行判定
-
ガウスの消去法のプログラムが...
-
C言語:配列の最大値
-
while文を使った問題なのですが...
-
c言語です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
プログラム
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を使って魔方陣
-
getcの改行判定
-
配列を関数に渡す方法
-
プログラミングで二番目に大き...
-
C言語階乗の総和を求める
-
scanf関数を用いての加減乗除%...
-
C言語で電卓を作成する。
-
C言語 プログラム
-
C言語の二分法のプログラムにつ...
-
C言語のwhile文を使った素数判...
-
while文について、c言語...
-
10進数からN進数に変換するプロ...
-
C言語です
-
C言語でのトランプシャッフルに...
-
全角文字の判定
-
C言語のプログラミング (基礎...
おすすめ情報