[C言語] 0が入力されるまで入力値を配列に保存する方法
C言語でユーザーからの入力を配列に保存するには、ループを使用して入力を受け取り、特定の条件が満たされるまで続けます。
この場合、入力が0であるかどうかを確認し、0が入力されるまで配列に値を追加します。
配列のサイズを事前に決めておく必要があり、入力が配列のサイズを超えないように注意が必要です。
入力を受け取る際には、scanf
関数を使用し、配列に値を格納するためにインデックスを管理します。
この方法により、ユーザーが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でない場合にエラーメッセージを表示し、入力バッファをクリアして再度入力を促します。
動的配列を使った実装
最後に、動的配列を使用して、入力数に制限がない実装を行います。
malloc
とrealloc
を使用して配列のサイズを動的に変更します。
#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言語で0が入力されるまでの入力値を配列に保存する方法とその応用例について解説しました。
基本的な入力処理から始まり、エラーチェックや動的配列の使用、さらに入力値のソートや平均値の計算、重複の排除といった応用例を紹介しました。
これらの知識を活用して、より柔軟で効率的なプログラムを作成してみてください。