C 言語で整数か浮動小数点数かを判定する

CBeginner
オンラインで実践に進む

はじめに

この実験では、ユーザーが入力した数値が整数か浮動小数点数かを識別する C 言語のプログラムを作成します。これは、異なるデータ型が異なるメモリ要件と動作を持つというプログラミングの基本的な概念です。

入力に小数点が存在するかどうかを検出することに焦点を当て、数値が浮動小数点数かどうかを判断します。この実験では、C 言語における基本的な文字列処理、ユーザー入力の処理、および条件分岐ロジックを紹介します。

この実験の終わりまでに、以下のことができるようになります。

  • C 言語でユーザー入力を文字列として読み取る
  • 文字列内の特定の文字をチェックする
  • 入力に基づいて判断を下すために条件分岐ロジックを使用する

C プログラムファイルの作成と開き方

まず、プログラム用の新しい C ファイルを作成しましょう。このファイルを main.c と名付け、プロジェクトディレクトリに配置します。

  1. まず、プロジェクトディレクトリにいることを確認します。
cd ~/project
  1. 次に、WebIDE で「File」メニューをクリックし、「New File」を選択して、ファイル名を main.c とします。または、ファイルエクスプローラーのサイドバーにある「New File」アイコンを使用することもできます。

  2. ファイルエディタが自動的に開きます。必要なヘッダーファイルをプログラムに追加しましょう。

#include <stdio.h>
#include <string.h>

これらのヘッダーファイルは、プログラムにとって不可欠です。

  • stdio.h は、printf()scanf() などの標準入出力操作の関数を提供します。
  • string.h は、文字列操作の関数を提供します。このシンプルなプログラムでは、主に文字列の長さを計算するために使用します。

元のテンプレートで言及されていた conio.h を含めていないことに注意してください。これは、conio.h は標準の C ライブラリではなく、Ubuntu 環境を含む多くのシステムで利用できないためです。

メイン関数の追加と変数の宣言

ヘッダーファイルが用意できたので、main() 関数を追加し、プログラムで必要な変数を宣言しましょう。

main.c ファイルに以下のコードを追加します。

int main() {
    char number[20];  // Array to store the input number as a string
    int flag = 0;     // Flag to track if a decimal point is found (0 = not found, 1 = found)
    int i;            // Loop counter variable

    // Program will continue here...

    return 0;
}

これらの変数について理解しましょう。

  • number[20]: これは、ユーザーの入力を格納するための文字配列(文字列)です。大きな数値も収容できるように、サイズを 20 文字に増やしています。
  • flag: この整数型の変数は、ブール型のフラグとして機能します。入力に小数点が見つかった場合、この値を 1 に設定します。
  • i: ループ用の単純なカウンター変数です。

main() 関数は、C プログラムのエントリーポイントです。私たちが書くすべてのコードは、この関数の中に記述されます。最後の return 0 文は、プログラムが正常に実行されたことを示します。

この時点で、あなたのファイルは次のようになっているはずです。

#include <stdio.h>
#include <string.h>

int main() {
    char number[20];  // Array to store the input number as a string
    int flag = 0;     // Flag to track if a decimal point is found (0 = not found, 1 = found)
    int i;            // Loop counter variable

    // Program will continue here...

    return 0;
}

プログラムロジックの実装

では、ユーザーの入力を読み取り、その数値が整数か浮動小数点数かを判断するための残りのコードを追加しましょう。

「Program will continue here...」というコメントを以下のコードに置き換えます。

    // Prompt the user to enter a number
    printf("Enter a number: ");
    scanf("%s", number);

    // Check each character in the number string for a decimal point
    for(i = 0; number[i] != '\0'; i++) {
        if(number[i] == '.') {
            flag = 1;  // Set flag to 1 if decimal point is found
            break;
        }
    }

    // Display the result based on the flag value
    if(flag) {
        printf("The entered number is a floating point number.\n");
    } else {
        printf("The entered number is an integer number.\n");
    }

このコードが何を行っているか見てみましょう。

  1. printf() 文は、ユーザーに数値の入力を促すプロンプトを表示します。
  2. scanf() 関数は、ユーザーの入力を文字列として読み取り、number 配列に格納します。
  3. for ループを使用して、文字列の各文字をヌル終端文字 ('\0') に達するまで繰り返し処理します。
  4. ループ内で、各文字が小数点 ('.') かどうかをチェックします。小数点が見つかった場合、flag を 1 に設定してループを抜けます。
  5. 最後に、if 文を使用して flag が設定されているかどうかをチェックします。設定されている場合は、ユーザーに数値が浮動小数点数であることを通知します。そうでない場合は、整数であることを通知します。

これで、あなたの完成したプログラムは次のようになるはずです。

#include <stdio.h>
#include <string.h>

int main() {
    char number[20];  // Array to store the input number as a string
    int flag = 0;     // Flag to track if a decimal point is found (0 = not found, 1 = found)
    int i;            // Loop counter variable

    // Prompt the user to enter a number
    printf("Enter a number: ");
    scanf("%s", number);

    // Check each character in the number string for a decimal point
    for(i = 0; number[i] != '\0'; i++) {
        if(number[i] == '.') {
            flag = 1;  // Set flag to 1 if decimal point is found
            break;
        }
    }

    // Display the result based on the flag value
    if(flag) {
        printf("The entered number is a floating point number.\n");
    } else {
        printf("The entered number is an integer number.\n");
    }

    return 0;
}

プログラムのコンパイルと実行

これでプログラムが書けたので、コンパイルして実行し、動作を確認しましょう。

  1. まだ保存していない場合は、ファイルを保存します(Ctrl+S または [ファイル] > [保存])。

  2. WebIDE でターミナルを開きます(まだ開いていない場合)。

  3. プロジェクトディレクトリに移動し、GCC コンパイラを使用してプログラムをコンパイルします。

cd ~/project
gcc main.c -o main

gcc コマンドは C ソースファイルをコンパイルし、-o main オプションは出力される実行ファイルの名前を main と指定します。

  1. コンパイルしたプログラムを実行します。
./main
  1. プロンプトが表示されたら、数値を入力します。まずは整数、例えば 42 を試してみましょう。
Enter a number: 42

次のような出力が表示されるはずです。

The entered number is an integer number.
  1. 再度プログラムを実行し、3.14 のような浮動小数点数を試してみます。
./main
Enter a number: 3.14

次のような出力が表示されるはずです。

The entered number is a floating point number.

このプログラムは、入力に小数点が含まれているかどうかに基づいて、整数と浮動小数点数を正しく識別します。

プログラムの機能強化

プログラムをより使いやすく、堅牢にするために機能拡張を行いましょう。ユーザーがプログラムを再起動することなく複数の数値をチェックできるようにループを追加し、入力検証も追加します。

main.c ファイルを以下のコードで更新します。

#include <stdio.h>
#include <string.h>
#include <ctype.h>  // For isdigit function

int main() {
    char number[20];
    int flag, i;
    char choice;

    do {
        flag = 0;  // Reset flag for each iteration

        // Prompt the user to enter a number
        printf("\nEnter a number: ");
        scanf("%s", number);

        // Input validation - check if the input contains only digits and at most one decimal point
        int valid = 1;
        int decimal_count = 0;

        for(i = 0; number[i] != '\0'; i++) {
            if(number[i] == '.') {
                decimal_count++;
                if(decimal_count > 1) {
                    valid = 0;
                    break;
                }
            } else if(!isdigit(number[i])) {
                valid = 0;
                break;
            }
        }

        if(!valid) {
            printf("Invalid input! Please enter a valid number.\n");
            continue;
        }

        // Check if the number is integer or float
        for(i = 0; number[i] != '\0'; i++) {
            if(number[i] == '.') {
                flag = 1;
                break;
            }
        }

        // Display the result
        if(flag) {
            printf("The entered number is a floating point number.\n");
        } else {
            printf("The entered number is an integer number.\n");
        }

        // Ask if the user wants to continue
        printf("\nDo you want to check another number? (y/n): ");
        scanf(" %c", &choice);

    } while(choice == 'y' || choice == 'Y');

    printf("\nThank you for using the program!\n");
    return 0;
}

この拡張版には以下の機能が含まれています。

  1. ユーザーが複数の数値をチェックできる do-while ループ。
  2. 入力が数字のみで、小数点が最大で 1 つであることを確認する入力検証。
  3. より明確なプロンプトとフィードバックを備えた、使いやすいインターフェース。

この拡張版をコンパイルして実行します。

cd ~/project
gcc main.c -o main
./main

以下を含む様々な入力でテストしてみましょう。

  • 42 のような整数
  • 3.14 のような浮動小数点数
  • abc1.2.3 のような無効な入力

プログラムはこれらのすべてのケースを適切に処理し、ユーザーが終了を選択するまで数値のチェックを続けることができます。

まとめ

この実験では、ユーザーが入力した数値が整数か浮動小数点数かを判定する C プログラムを成功させました。学んだ主要な概念は以下の通りです。

  1. C 言語における文字列処理: 文字配列を使用して文字列データを格納し、各文字を反復処理してその特性をチェックしました。

  2. ユーザー入力の処理: scanf() 関数を使用してユーザー入力を促し、読み取る方法を学びました。

  3. 制御構造: 条件文 (if-else) とループ (for, do-while) を実装して、プログラムの流れを制御しました。

  4. 入力検証: 拡張版では、ユーザー入力が有効な数値であることを確認するチェックを追加しました。

  5. プログラムの機能拡張: ユーザーループや入力検証などの機能を追加することで基本的なプログラムを改善し、より堅牢で使いやすくしました。

これらの概念は多くのプログラミングタスクにおいて基本的なものであり、C 言語の学習を続ける上で強固な基礎となります。異なるデータ型を区別する能力は、異なるデータ型が異なるメモリ割り当てと動作を持つ C のような静的型付け言語では特に重要です。