見出し画像

C言語学習6

今日はアルバイト二日目でした。
バイト先の社員さんに電子工作初心者が作るのにおすすめのものを聞いたら、時計キットがいいと教えてもらいました。
仕組みまで説明できるようになったらとても良いとのことでしたので、
まずは時計キットを作って仕組みを説明できるようになろうと思いました。

疲れましたが片付けの続きを行い、苦C 15章の続きから復習して練習問題を解きました。

練習問題15
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。

苦C 15章

解答

#include <stdio.h>

void maxmin(int *max, int *min, int Value);

int main(void) {
    int max = 0;
    int min = 100;
    int inputValue;
    int i = 1;

    printf("1~100 の範囲内で数値を入力してください。\n");
    while (1) {
        do {
            printf("%2d度目の入力: ", i);
            scanf("%d", &inputValue);
        } while (inputValue < -1 || inputValue > 100);

        if (inputValue == -1) break;

        maxmin(&max, &min, inputValue);
        i++;
    }

    printf("最大値:%3d\n", max);
    printf("最小値:%3d\n", min);

    return 0;
}

void maxmin(int *max, int *min, int value) {
    if (value > *max) *max = value;
    if (value < *min) *min = value;

    return;
}

前回の解答

#include <stdio.h>

int main(void) {
    int value[10], i;
	int min = 100;
	int max = 0;
	int valueElements = sizeof(value) / sizeof(value[0]);

	for (i = 0; i < valueElements; i++) {
		int isBreak;
		do {
			printf("0~100の数値を入力(%2d / %d): ", i +1, valueElements);
			scanf("%d", &value[i]);
			if (value[i] == -1) {
				isBreak = 1;
				break;
			}
		} while (value[i] < 0 || value[i] >= 100);

		if (isBreak) break;
		if (value[i] < min) {
			min = value[i];
		}
		if (value[i] > max)	{
			max = value[i];
		}
		
	}
	
	printf("入力最小値 :%d\n入力最大値: %d\n", min, max);

    return 0;
}

ちゃんと関数分けられました。
エラーも出ましたが、ポインタについて復習したおかげでメッセージみてすぐに修正できました。
あとif文のブロック文をなくしたおかげで見やすい気がする。
気がするだけ。

入力された値を全て表示するわけじゃないんだから配列にする意味なくない!?
と思ったのでinputValueを配列にしませんでした。
国語的にはよろしくないですね。

前より良くなっているということでよし。

答え

#include <stdio.h>

void maxmin(int array[], int *max, int *min);

int main(void)
{
    int i = 0, array[10], max, min;

    do
    {
        printf("%d 番目の数:", i + 1);
        scanf("%d", &array[i]);
        i++;
    } while (array[i - 1] != -1);

    maxmin(array, &max, &min);

    printf("最大値 %d : 最小値 %d\n", max, min);

    return 0;
}

void maxmin(int array[], int *max, int *min)
{
    int i = 0;

    *max = 0;
    *min = 100;

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

やる気があったら入力値のバリデーションを書こうと思いました。
明日こそ20章やるぞ!

2024.01.19 追記

前回、ポインタ変数の命名は分かりやすくするって決めたのにしていないのと、
do-whileの条件をもっと分かりやすくできるなって思ったので修正しました。

#include <stdio.h>

void maxmin(int *ptr_max, int *ptr_min, int Value);

int main(void) {
    int max = 0;
    int min = 100;
    int inputValue;
    int i = 1;

    printf("1~100 の範囲内で数値を入力してください。\n");
    while (1) {
        do {
            printf("%2d度目の入力: ", i);
            scanf("%d", &inputValue);
        } while (!(-1 <= inputValue && inputValue <= 100));

        if (inputValue == -1) break;

        maxmin(&max, &min, inputValue);
        i++;
    }

    printf("最大値:%3d\n", max);
    printf("最小値:%3d\n", min);

    return 0;
}

void maxmin(int *ptr_max, int *ptr_min, int value) {
    if (value > *ptr_max) *ptr_max = value;
    if (value < *ptr_min) *ptr_min = value;

    return;
}

3行目を、int *max, int *min → int *ptr_max, int *ptr_min に変更。
16行目を、inputValue < -1 || inputValue > 100 → !(-1 <= inputValue && inputValue <= 100) に変更。
直感的に分かりやすくなったんじゃない!?と思いました。


この記事が気に入ったらサポートをしてみませんか?