ページ 11

ループについて

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さん、バグさん解説ありがとうございます!