ページ 11

違い

Posted: 2009年6月12日(金) 17:37
by まる
#include<stdio.h>
int main(void) 
{ int a[51];
int i, max; 

for (i=1, max=0; i<=50; i++) 
{ 
printf("%d人目の点数 ", i); 
scanf("%d", &a); 
if (!max || a[max] < a) max = i; 
} 

printf("MAXはa[%d]=%d点", max, a[max]); 
}


というプログラムを作っていただいたのですが

#include<stdio.h>

int main(void) 
{ int a[51];
int i, max=0; 

for (i=1;  i<=50; i++) 
{ 
printf("%d人目の点数 ", i); 
scanf("%d", &a); 
if ( a[max] < a) max = i; 
}

にしてみても動いたのですが。
!max ||やfor (i=1, max=0; i<=50; i++)のはどういった働きなのでしょうか?
なくても問題ないのでしょうか?

printf("MAXはa[%d]=%d点", max, a[max]);
}

Re:違い

Posted: 2009年6月12日(金) 17:44
by ねこ
!maxの「!」は反転を指します。
例えばmaxに1が入っていれば0、0が入っていれば1になります。
また2より大きい値が入っていても0になります。

予測なのですが、本来はfor( i = 0; i < 50; i++ )だったんじゃないでしょうか?
そのif文では最高得点の配列添え字を保持してますので最初に入力された点数を保持する目的としては
!maxではなくmax==1が正しい判定だと思います。

Re:違い

Posted: 2009年6月12日(金) 21:45
by フリオ
 
 "!m"は、"m == 0"と同値です。


 ソースについては、確かなことは書いた人でないとわかりませんが、

ひょっとしたら、"printf("%d人目の点数 ", i);"の"%d人目"と"i"をあわす為に、
わざわざ"int a[51];"と宣言して a[1] ~ a[50] を使い、
a[0] を比較対象からはずすために、"if (!max || a[max] < a)"として、
m が 0 の時は無条件に 1 と入れ替えているのではないでしょうか。

ただ、"%d人目"と"i"をあわしたいなら、
int a[50];
...
for(i = 0, m = 0; i < 50; ++ i){
	printf("%d人目の点数 ", i + 1);
...
}

 
とすればいいですし、

a[0] を比較対象からはずしたいなら
for (i=1, max=0; i<=50; i++) 
{ 
...
	if (!max || a[max] < a) max = i;
...

を、

for(i = 1, max = 1; i <= 50; ++ i){
...
	if (a[max] < a) max = i;
...

とすればいいです。


 2つ目のソースは、
a[0] という1つ目のソースでは、比較対象にしてはいない要素を比較しています。