[C言語] 0が入力されるまで入力値を配列に保存する方法

C言語でユーザーからの入力を配列に保存するには、ループを使用して入力を受け取り、特定の条件が満たされるまで続けます。

この場合、入力が0であるかどうかを確認し、0が入力されるまで配列に値を追加します。

配列のサイズを事前に決めておく必要があり、入力が配列のサイズを超えないように注意が必要です。

入力を受け取る際には、scanf関数を使用し、配列に値を格納するためにインデックスを管理します。

この方法により、ユーザーが0を入力するまでの数値を効率的に配列に保存できます。

この記事でわかること
  • 0が入力されるまでの入力処理の実装方法
  • エラーチェックや動的配列の使用方法
  • 入力値のソートや平均値の計算方法
  • 入力値の重複を排除する方法

目次から探す

0が入力されるまでの入力処理

C言語でユーザーからの入力を受け取り、0が入力されるまでその値を配列に保存する方法について解説します。

このプロセスは、ループを使用して入力を継続的に受け取り、特定の条件で終了することが求められます。

ループの条件設定

ループを使用して、ユーザーからの入力を継続的に受け取るためには、適切な条件を設定する必要があります。

C言語では、whileループやdo-whileループを使用することが一般的です。

以下にwhileループを使用した例を示します。

#include <stdio.h>
int main() {
    int input;
    int numbers[100]; // 最大100個の入力を保存
    int count = 0;
    printf("整数を入力してください (0で終了): ");
    while (1) {
        scanf("%d", &input);
        if (input == 0) {
            break; // 0が入力されたらループを終了
        }
        numbers[count] = input;
        count++;
    }
    printf("入力された数値: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}

このコードでは、while (1)を使用して無限ループを作成し、break文でループを終了させる条件を設定しています。

入力値の判定方法

入力された値が0であるかどうかを判定するためには、if文を使用します。

scanf関数で入力を受け取り、その値を変数inputに格納します。

その後、if (input == 0)の条件で0が入力されたかを判定します。

入力終了の条件

入力を終了する条件は、ユーザーが0を入力したときです。

上記のコードでは、if (input == 0)の条件が真になったときにbreak文を実行し、ループを終了します。

これにより、0が入力されるまでユーザーからの入力を受け付け、0が入力された時点で入力処理を終了します。

このようにして、C言語で0が入力されるまでの入力処理を実装することができます。

入力された値は配列に保存され、後で使用することが可能です。

実装例

ここでは、0が入力されるまでの入力値を配列に保存するための具体的な実装例を紹介します。

基本的なコードから始め、エラーチェックの追加、動的配列を使った実装までを順に解説します。

基本的なコード例

まずは、基本的なコード例を示します。

このコードは、固定サイズの配列を使用して入力を保存します。

#include <stdio.h>
int main() {
    int input;
    int numbers[100]; // 最大100個の入力を保存
    int count = 0;
    printf("整数を入力してください (0で終了): ");
    while (1) {
        scanf("%d", &input);
        if (input == 0) {
            break; // 0が入力されたらループを終了
        }
        numbers[count] = input;
        count++;
    }
    printf("入力された数値: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}

このコードは、最大100個の整数を保存できる配列numbersを用意し、0が入力されるまでの整数を保存します。

エラーチェックの追加

次に、入力時のエラーチェックを追加します。

scanf関数の戻り値を確認することで、入力が正しく行われたかをチェックします。

#include <stdio.h>
int main() {
    int input;
    int numbers[100];
    int count = 0;
    printf("整数を入力してください (0で終了): ");
    while (1) {
        if (scanf("%d", &input) != 1) {
            printf("無効な入力です。整数を入力してください。\n");
            while (getchar() != '\n'); // 入力バッファをクリア
            continue;
        }
        if (input == 0) {
            break;
        }
        numbers[count] = input;
        count++;
    }
    printf("入力された数値: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}

このコードでは、scanfの戻り値が1でない場合にエラーメッセージを表示し、入力バッファをクリアして再度入力を促します。

動的配列を使った実装

最後に、動的配列を使用して、入力数に制限がない実装を行います。

mallocreallocを使用して配列のサイズを動的に変更します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int input;
    int *numbers = NULL;
    int count = 0;
    int capacity = 10; // 初期容量
    numbers = (int *)malloc(capacity * sizeof(int));
    if (numbers == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    printf("整数を入力してください (0で終了): ");
    while (1) {
        if (scanf("%d", &input) != 1) {
            printf("無効な入力です。整数を入力してください。\n");
            while (getchar() != '\n');
            continue;
        }
        if (input == 0) {
            break;
        }
        if (count >= capacity) {
            capacity *= 2;
            numbers = (int *)realloc(numbers, capacity * sizeof(int));
            if (numbers == NULL) {
                printf("メモリの再確保に失敗しました。\n");
                return 1;
            }
        }
        numbers[count] = input;
        count++;
    }
    printf("入力された数値: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    free(numbers); // メモリの解放
    return 0;
}

このコードでは、初期容量を10に設定し、必要に応じてreallocで配列のサイズを倍に拡張します。

入力が終了した後、free関数でメモリを解放します。

これにより、入力数に制限がなくなり、柔軟な入力処理が可能になります。

応用例

ここでは、0が入力されるまでの入力値を配列に保存した後、そのデータを活用するための応用例を紹介します。

具体的には、入力値のソート、平均値の計算、重複の排除について解説します。

入力値のソート

入力された数値を昇順または降順に並べ替えることで、データの分析や表示がしやすくなります。

ここでは、バブルソートを使用して入力値を昇順にソートする例を示します。

#include <stdio.h>
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}
int main() {
    int numbers[] = {5, 3, 8, 1, 2}; // 例として固定の配列を使用
    int count = 5;
    bubbleSort(numbers, count);
    printf("ソートされた数値: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}

このコードは、バブルソートアルゴリズムを使用して配列を昇順に並べ替えます。

bubbleSort関数は、配列とその要素数を引数として受け取ります。

入力値の平均値を計算

入力された数値の平均値を計算することで、データの中心傾向を把握することができます。

以下に平均値を計算する例を示します。

#include <stdio.h>
double calculateAverage(int arr[], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += arr[i];
    }
    return (double)sum / n;
}
int main() {
    int numbers[] = {5, 3, 8, 1, 2}; // 例として固定の配列を使用
    int count = 5;
    double average = calculateAverage(numbers, count);
    printf("平均値: %.2f\n", average);
    return 0;
}

このコードでは、calculateAverage関数を使用して配列の平均値を計算します。

合計を要素数で割ることで平均値を求めます。

入力値の重複を排除

入力された数値から重複を排除することで、ユニークなデータセットを得ることができます。

以下に重複を排除する例を示します。

#include <stdio.h>
int removeDuplicates(int arr[], int n) {
    if (n == 0 || n == 1) return n;
    int temp[n];
    int j = 0;
    for (int i = 0; i < n - 1; i++) {
        if (arr[i] != arr[i + 1]) {
            temp[j++] = arr[i];
        }
    }
    temp[j++] = arr[n - 1];
    for (int i = 0; i < j; i++) {
        arr[i] = temp[i];
    }
    return j;
}
int main() {
    int numbers[] = {1, 2, 2, 3, 4, 4, 5}; // 例として固定の配列を使用
    int count = 7;
    count = removeDuplicates(numbers, count);
    printf("重複を排除した数値: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}

このコードでは、removeDuplicates関数を使用して配列から重複を排除します。

重複のない要素を一時的な配列に保存し、元の配列に戻します。

関数は新しい要素数を返します。

これらの応用例を活用することで、入力されたデータをより有効に利用することができます。

よくある質問

配列のサイズを動的に変更するにはどうすればいいですか?

C言語で配列のサイズを動的に変更するには、mallocreallocを使用します。

mallocは初期のメモリ確保に使用し、reallocは既存のメモリブロックを拡張または縮小するために使用します。

例:int *array = (int *)malloc(initial_size * sizeof(int));で初期メモリを確保し、array = (int *)realloc(array, new_size * sizeof(int));でサイズを変更します。

入力が多すぎる場合の対処法は?

入力が多すぎる場合、動的配列を使用してメモリを必要に応じて拡張することができます。

また、入力の上限を設定し、上限を超えた場合はエラーメッセージを表示して入力を停止することも考えられます。

動的配列を使用することで、メモリの無駄を減らし、必要な分だけメモリを確保することが可能です。

0以外の特定の値で入力を終了するにはどうすればいいですか?

0以外の特定の値で入力を終了するには、終了条件を変更するだけです。

例えば、-1で入力を終了したい場合、if (input == -1) { break; }のように条件を設定します。

このようにすることで、任意の値で入力を終了することができます。

まとめ

この記事では、C言語で0が入力されるまでの入力値を配列に保存する方法とその応用例について解説しました。

基本的な入力処理から始まり、エラーチェックや動的配列の使用、さらに入力値のソートや平均値の計算、重複の排除といった応用例を紹介しました。

これらの知識を活用して、より柔軟で効率的なプログラムを作成してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す