忙しい中失礼します。
”素数”を確認するプログラムについて質問があります。
現在独習Cを用いて勉強中なのですが、下記のプログラム理解に苦しんでいます。
宜しければアドバイスを下さい。
下記のプログラム/*素数テスタ*/内から、
質問(1)部:for(; num <=1; )の意味は’1’よりも大きな数字を入れれば、for文のループを抜ける→この考えで合っている、と自分では思っていますが、間違っているのでしょうか? ご指摘願います。
質問(2)部:
1.num=5の場合、for ( i=2; i <= num / 2; i = i+1) → i <= num / 2はi <= 2となる。→i <= 2となり、for文のループを抜ける。→
if ((num % i) == 0)の条件は成り立たない。→ is_prime = 1のため、"素数です"と表示される。→納得!
2.num=9の場合、for ( i=2; i <= num / 2; i = i+1)→ i <= num / 2は i(=2) <= 4となり、 i = i+1の’i’部が’4’となった後for文のループを抜ける。→if ((num % i) == 0)はnum % iは 9%4で’1’余り、となり、if ((num % i) == 0)の条件は成り立たない。→is_prime == 1 の状態がキープされる。→"素数です"と表示される、と思いきや"素数ではありません"と表示される。
で、ここで何故"素数ではありません"と表示されるのかが分かりません。頭の中では’9’が素数ではないのは分かりますが、プログラムの中でどういう経路を辿り、"素数ではありません"と表示されるのでしょうか。その過程の説明を欲しています。
宜しければ、アドバイスを下さい。
/*素数テスタ*/
#include <stdio.h>
int main(void)
{
int num = 0, i, is_prime;
for(; num <=1; ){ //質問(1)
printf("判定したい数を入力して下さい: ");
scanf("%d", &num);
}
/*約数があるかどうかを調べる*/
is_prime = 1;
for ( i=2; i <= num / 2; i = i+1)//質問(2)
if ((num % i) == 0)//質問(2)
is_prime = 0;//質問(2)
if (is_prime == 1 )
printf("素数です");
else
printf("素数ではありません");
return 0;
}
No.6ベストアンサー
- 回答日時:
> 「何かの処理」は”0”回通る
予想通りのお答え、ありがとうございます。
思ったとおり、for文の本質がおわかりになっていないようです。
くだんのfor文は、以下の動きをします。
1)iを10で初期化する。
2)i <= 10 の条件を満たしているので、「何かの処理」を実行する。
3)iに1を加える。iは11になる。
4)i <= 10 の条件を満たさなくなったので、ループから抜ける。
というわけで、正解は「1回実行する」です。
ちなみに、くだんのfor文は、「何かの処理」にcontinue; を含んでいない場合、
以下の文と等価です。
i = 10;
while (i <= 10) {
/* 何かの処理 */
i++;
}
while文の意味合いが「カッコ内の条件を満たしている間、
{ ~ }の中を実行し続ける」というものであることとあわせて、
for文の意味合いを今一度ご確認ください。
asuncionさん回答ありがとうございました。
”予想通りのお答え、ありがとうございます。”→!やった正解だ!と私の心の中では少し喜びましたが、それから先の文を読んで、さっき喜んだ自分が恥ずかしくなりました。
とはいえ、asuncionさん貴重な時間の中の丁寧な指導及び回答ありがとうございました。
上記の回答は!そうだったのか!と思える程、私の中では衝撃的な”真実”でした。
いい勉強ありがとうございました。
No.4
- 回答日時:
> 2)i++(i=i+1の省略型)を使い1ずつ足し算を行う。
> 3)i==10となった時、i <= 10の条件を満たすので、forループ条件から抜ける。
iが10のとき、くだんのfor文によるループの中身を
実行すると思いますか?実行しないと思いますか?
for文によるループを継続する条件と
ループから抜ける条件とを取り違えているように見えます。
!ANo.5が先に答えられる、と思い先に書き込みました。が、
「iが10のとき」による回答は、ANo.5により、”実行しない”と思います。
ループを継続する条件:for ( i=1; i <= 10; i = i+1)であれば、i=10になるまで、ループを継続する、で下の条件に行く
ループを抜ける条件:i=10となる → i<=10の条件を満たす → ループに入る必要なし とプログラム側で判断する → ループから抜ける
以上が私の回答です。
No.2
- 回答日時:
> 1.num=5の場合、for ( i=2; i <= num / 2; i = i+1)
> → i <= num / 2はi <= 2となる。→i <= 2となり、for文のループを抜ける。
> → if ((num % i) == 0) の条件は成り立たない。
> → is_prime = 1のため、"素数です"と表示される。→納得!
納得してはいけません。結論は正しいですが、過程が誤っています。
1)iを2で初期化する。
2)i <= num / 2 の条件が成立する。for文のループを実行する。抜けるのではありません。
3)if ((num % i) == 0) の条件は成立しない。
4)iに1を加える。3になる。
5)i <= num / 2 の条件は成立しない。ここで、for文のループから抜けます。
6)is_primeは1のままなので、"素数です"と出力する。
よろしいでしょうか?
例えば、
for (i = 1; i <= 10; i++)
というfor文の動きを日本語で説明すると、どうなりますか?
この回答への補足
asuncionさん丁寧なアドバイスありがとうございます。
その回答で十分満足しています。
for (i = 1; i <= 10; i++)について、私なりにお答えします。
1)iを1で初期化する
2)i++(i=i+1の省略型)を使い1ずつ足し算を行う。
3)i==10となった時、i <= 10の条件を満たすので、forループ条件から抜ける。
以上です。
これが私の回答です。
No.1
- 回答日時:
> 質問(1)部:for(; num <=1; )の意味は’1’よりも大きな数字を入れれば、for文のループを抜ける
「numが1以下」と言う条件が満たされている間ループが継続されることになるので、
言い換えるとnumが1を超えるとループを抜けることになります。
なので、あってます。
あと、別にforでも良いんだけど、普通は継続条件だけならwhileを使うと思う。
> 質問(2)部
num==9ならi==3の時にif文の条件は満たされます。
アドバイスありがとうございました。
質問(2)部は、ANo.1の回答を読んだ後、Wernerさんのいわんとすることを納得しました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
繰り返し文の利点について
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
ループの特定入力終了
-
C言語forループが完結した場合...
-
if文を使わずに奇数・偶数を判断
-
階層型ニューラルネットに準ニ...
-
アルゴリズムです!四つの数字...
-
C言語のfor文です。 繰り返しの...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
*をユーザーが入力した数字の数...
-
fgetsなどのときのstdinのバッ...
-
C言語で%を使わない余りの出し方
-
C言語
-
プログラムでの数字につく”f”の...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
ループを途中で抜けたいのですが。
-
入力した数値を倍々するプログラム
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
Excel VBAで年度をまたぐ期間の...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
C言語、whileループを抜け出す...
-
PAD図の書き方
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
他言語で言うcontinue文
-
C言語のプログラムみてください...
-
ループの特定入力終了
-
COBOLのEVALUATE文
-
for文while文の無限ループの違...
おすすめ情報