ページ 1 / 1
ループについて
Posted: 2007年3月21日(水) 20:16
by ループ
#include <stdio.h>
int powint(int , int);
int main(){
int i;
for(i = 0; i <= 10 ; i++){
printf("%2d\t%d\n", i , powint(2,i));
}
return 0;
}
int powint(int x,int p) {
int y = 1;
while(p-- > 0) {
y *= x;
}
return y;
}
powint()内のループが良く分かりません。
まず、xには2,pにはiがきますよね。すると、while(p-- > 0)ってのは最初0 > 0となってp--
ってできないのではないのですか?よくこの中のループ理解できないです。
あと、y *= xも微妙です。y = y * xのこと?
Re:ループについて
Posted: 2007年3月21日(水) 20:26
by box
> まず、xには2,pにはiがきますよね。すると、while(p-- > 0)ってのは最初0 > 0となってp--
> ってできないのではないのですか?よくこの中のループ理解できないです。
呼び出し元の i がゼロのとき、powint関数の引数 p は同じくゼロです。
すると、while文の条件判定で偽になります。
その場合、while文の中(y *= x;)を全く実行せずに、return y; します。
つまり、2のゼロ乗である、1を呼び出し元に返しているのです。
> あと、y *= xも微妙です。y = y * xのこと?
そうです。
+=, -=, /=, %= などの演算子と同種です。
Re:ループについて
Posted: 2007年3月22日(木) 08:21
by ループ
for()でfor(;;)ていう中になにもないやつってどういうこと?無限ループってことですか?
Re:ループについて
Posted: 2007年3月22日(木) 08:46
by 管理人
そうです、
while(1)
のように無限ループになります。
Re:ループについて
Posted: 2007年3月27日(火) 14:16
by ループ
int main(void) {
int num,count,rigth,ans;
for(num = 1; num < 5; num++) {
printf("%d + %d =",num,num);
scanf("%d",&ans);
if(ans == num + num){
printf("%dは正解です\n",ans);
}else{
printf("NG\n");
printf("もう一度回答してください\n");
rigth =0;
for(count = 0; count < 3 && !rigth; count++){
printf("%d + %d =",num ,num);
scanf("%d",&ans);
if(ans == num + num) {
printf("正解\n");
rigth = 1;
}
}
if(!rigth) {
printf("%dが正解です",num + num);
}
}
return 0;
}
}
rigth =1,rigth =0とは一体なんでしょうか?どのような動きをするのでしょうか?
Re:ループについて
Posted: 2007年3月27日(火) 14:40
by Yuki
正解判定フラグとでもいいますか。
if(ans == num + num) {
printf("正解\n");
rigth = 1;
}
入力された回答が正解だったら1、間違っていたら0としているようです。
for(count = 0; count < 3 && !rigth; count++){
の部分で、正解するか、3回間違えるまでループしています、
Re:ループについて
Posted: 2007年3月27日(火) 14:49
by バグ
変数rigthはフラグとして使われているようですね。
入力された答えがNGの場合には0が、正解だった場合には1がそれぞれ代入されています。
rigthが判定に使われているのは2ヶ所ありますね。1ヶ所はforループの中、もう1ヶ所はif文です。
まずは前者のforループですが、rigthの前に!演算子がありますね。これは真・偽を逆転させる演算子です。C言語では0を偽とし、それ以外( 大抵の場合は1 )を真と判定します。
つまり、countが3以下でなおかつrigthが0の場合にループを繰り返しなさいという意味になります。ですから、今回のforループは最初の入力でNGだった場合に、更に3回のリトライを行っている事になります。
そして後者のif文ですが、先ほどのforループ内で、3回のリトライ全てに不正解だった場合には、当然rigthは0のままな訳ですから、正解を表示している訳です。これは正解が入力された場合にはrigthが1になるので、表示されません。
Re:ループについて
Posted: 2007年3月27日(火) 15:15
by ※
return 0;
の位置がおかいような。
最初のfor文が機能していません。
Re:ループについて
Posted: 2007年3月27日(火) 16:42
by ループ
Yukiさん、バグさん解説ありがとうございます!