C 언어로 정수 또는 실수 판별하기

CBeginner
지금 연습하기

소개

이 랩에서는 사용자 입력 숫자가 정수인지 부동 소수점 (float) 인지 식별하는 C 프로그램을 작성합니다. 이는 프로그래밍의 기본 개념으로, 서로 다른 데이터 타입은 서로 다른 메모리 요구 사항과 동작을 가집니다.

입력에 소수점의 존재 여부를 감지하여 숫자가 부동 소수점 값인지 판단하는 데 중점을 둡니다. 이 랩에서는 C 의 기본적인 문자열 처리, 사용자 입력 처리 및 조건부 로직을 소개합니다.

이 랩을 마치면 다음을 이해하게 됩니다.

  • C 에서 사용자 입력을 문자열로 읽는 방법
  • 문자열 내에서 특정 문자를 확인하는 방법
  • 입력에 따라 결정을 내리기 위해 조건부 로직을 사용하는 방법
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 60%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

C 프로그램 파일 생성 및 열기

이제 프로그램을 위한 새로운 C 파일을 생성해 보겠습니다. 파일 이름을 main.c로 지정하고 프로젝트 디렉토리에 배치합니다.

  1. 먼저, 프로젝트 디렉토리에 있는지 확인합니다.
cd ~/project
  1. 이제 WebIDE 에서 "File" 메뉴를 클릭하고 "New File"을 선택한 다음 파일 이름을 main.c로 지정합니다. 또는 파일 탐색기 사이드바에서 "New File" 아이콘을 사용할 수도 있습니다.

  2. 파일 편집기가 자동으로 열립니다. 프로그램에 필요한 헤더 파일을 추가해 보겠습니다.

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

이 헤더 파일은 프로그램에 필수적입니다.

  • stdio.hprintf()scanf()와 같은 표준 입출력 연산을 위한 함수를 제공합니다.
  • string.h는 문자열 조작을 위한 함수를 제공하지만, 이 간단한 프로그램에서는 주로 문자열 길이 계산에 사용합니다.

원래 템플릿에서 언급된 conio.h를 포함하지 않았다는 점에 유의하십시오. 이는 conio.h가 표준 C 라이브러리가 아니며, Ubuntu 환경을 포함한 많은 시스템에서 사용할 수 없기 때문입니다.

main 함수 추가 및 변수 선언

이제 헤더 파일이 있으므로 main() 함수를 추가하고 프로그램에 필요한 변수를 선언해 보겠습니다.

다음 코드를 main.c 파일에 추가합니다.

int main() {
    char number[20];  // 입력 숫자를 문자열로 저장하기 위한 배열
    int flag = 0;     // 소수점이 발견되었는지 추적하는 플래그 (0 = 발견되지 않음, 1 = 발견됨)
    int i;            // 루프 카운터 변수

    // 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];  // 입력 숫자를 문자열로 저장하기 위한 배열
    int flag = 0;     // 소수점이 발견되었는지 추적하는 플래그 (0 = 발견되지 않음, 1 = 발견됨)
    int i;            // 루프 카운터 변수

    // 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. 입력에 숫자만 포함되고 소수점은 최대 하나만 포함되는지 확인하는 입력 유효성 검사.
  3. 더 명확한 프롬프트와 피드백을 제공하는 사용자 친화적인 인터페이스.

이 개선된 버전을 컴파일하고 실행합니다.

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

다음을 포함한 다양한 입력을 사용하여 테스트합니다.

  • 42와 같은 정수
  • 3.14와 같은 부동 소수점 숫자
  • abc 또는 1.2.3과 같은 잘못된 입력

이 프로그램은 이러한 모든 경우를 적절하게 처리하고 종료하도록 선택할 때까지 계속해서 숫자를 확인할 수 있도록 해야 합니다.

요약

이 랩에서는 사용자 입력 숫자가 정수인지 부동 소수점 숫자인지 판별하는 C 프로그램을 성공적으로 만들었습니다. 다음은 학습한 주요 개념입니다.

  1. C 에서의 문자열 처리 (String Handling in C): 문자 배열을 사용하여 문자열 데이터를 저장하고 처리했으며, 각 문자를 반복하여 속성을 확인했습니다.

  2. 사용자 입력 처리 (User Input Processing): scanf() 함수를 사용하여 사용자 입력을 요청하고 읽는 방법을 배웠습니다.

  3. 제어 구조 (Control Structures): 조건문 (if-else) 과 루프 (for, do-while) 를 구현하여 프로그램의 흐름을 제어했습니다.

  4. 입력 유효성 검사 (Input Validation): 개선된 버전에서는 사용자 입력이 유효한 숫자인지 확인하는 검사를 추가했습니다.

  5. 프로그램 개선 (Program Enhancement): 사용자 루프 및 입력 유효성 검사와 같은 기능을 추가하여 기본 프로그램을 개선하여 더욱 강력하고 사용자 친화적으로 만들었습니다.

이러한 개념은 많은 프로그래밍 작업의 기본이며 C 프로그래밍을 계속 배우면서 견고한 기반이 될 것입니다. 서로 다른 데이터 유형이 서로 다른 메모리 할당과 동작을 갖는 C 와 같은 강력한 형식의 언어에서 서로 다른 유형의 데이터를 구별하는 능력은 특히 중요합니다.