違い

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まる

違い

#1

投稿記事 by まる » 16年前

#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:違い

#2

投稿記事 by ねこ » 16年前

!maxの「!」は反転を指します。
例えばmaxに1が入っていれば0、0が入っていれば1になります。
また2より大きい値が入っていても0になります。

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

フリオ

Re:違い

#3

投稿記事 by フリオ » 16年前

 
 "!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つ目のソースでは、比較対象にしてはいない要素を比較しています。
 

閉鎖

“C言語何でも質問掲示板” へ戻る