NaaN日記

やったこと、覚えたことを発信する場

最大値と最小値を出す(C)

ポインタを使ってみるよ
ポインタを使った式を、もっと短くかけたので、追記。
素敵なことを教えていただいたので追記
与えられた数の中から最も大きいものと小さいものを表示するようにする

入力方式
[一つ目の値, 二つ目の値, 三つ目の値……, 最後の値,, 終了を意味する任意の値]

まずはポインタをできるだけ使わずにやってみる
#include <stdio.h>
int main(void){
	int i = 0;
	int array[10];//値を何個格納するか
	int max = 1;//入力する可能性のある最低値
	int min = 1000;//入力する可能性のある最大値
//この場合、1 ~ 1000の範囲の値を最大9個入力
	
	do{
		scanf("%d", &array[i]);
		printf("%d番:%d\n", i+1,array[i]);
		i++;
	}while(array[i - 1] != 0);//0が入力された時点で終了
	
	for (i = 0; array[i] >= 0; i++){
		if (array[i] == 0){
			break;//0のとき抜ける
		}
		else{
			if (array[i] > max){
				max = array[i];//array[i]の中で一番大きいものをmax
			}
			if (array[i] < min){
				min = array[i];//array[i]の中で一番小さいものをmin
			}
		}
	}
	printf("最小値%d\n", min);
	printf("最大値:%d\n", max);
	return 0;
}
ポインタを使うとこんな感じ
#include <stdio.h>

void calculate(int array[],int*,int*);

int main(void){
	int i = 0;
	int array[10];//値を格納
	int max, min;
	
	do {
		scanf("%d",&array[i]);
		printf("%d番:%d\n",i+1,array[i]);
		i++;
	} while (array[i-1] != 0);//0が入力された時点で終了
	
	calculate(array,&max,&min);
	
	printf("最大値:%d\n最小値:%d\n",max, min);
	
	return 0;
}

void calculate(int array[],int *max,int *min){
	int i;
	int high = 1;//最大値
    int low = 1000;//最小値

	for(i=0; array[i]!=0; i++){
	    if(array[i] > high){
	        high = array[i];
	    }
	    if(array[i] < low){
	        low = array[i];
	    }
	}
	        *max = high;
	        *min = low;
}
high lowにいれなくてもできた
void calculate(int array[], int *max, int *min){
	int i;
	*max = 1;
	*min = 1000;

	for (i = 0; array[i] != 0; i++){
		if (array[i] > *max){
			*max = array[i];
		}
		if (array[i] < *min){
			*min = array[i];
		}
	}
}
すごい
void calculate(int array[], int *max, int *min){
	int i;
	*max = *min = *array;   //max,minの初期値にarray[0]が入る

	for (i = 1; array[i] != 0; i++){
		if (array[i] > *max){
			*max = array[i];
		}
		if (array[i] < *min){
			*min = array[i];
		}
	}
}

比較の時に最初の値をmaxとminに入れておいてぐるぐるするので、
intの範囲でどんな数でも入れられるようになった

iを消した
void calculate(int array[], int *max, int *min){
	for (*min = *max = *array; *array; array++){
		if (*array > *max){
			*max = *array;
		}
		if (*array < *min){
			*min = *array;
		}
	}
}

2行短くなった!!

表示

[283 876 961 346 315 0]と入力すると、どれも
次のように表示される

1番:283
2番:876
3番:961
4番:346
5番:315
6番:0
最大値:961
最小値:283

やったね