Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 ISBN 번호 유효성 검사하는 프로그램

주어진 문자열이 올바른 ISBN 번호인지 아닌지 판별하는 것이 이번 글의 목표입니다. C++ 코드 예제와 함께 ISBN의 개념부터 검증 알고리즘까지 차근차근 살펴보겠습니다.

ISBN 번호란 무엇인가?

ISBN은 International Standard Book Number, 즉 국제 표준 도서번호의 약자입니다. 2006년 12월까지는 10자리 번호 체계가 사용되었으며, 2007년 1월 1일부터는 13자리 번호로 개정되었습니다. 이 글에서는 기존 방식인 10자리 ISBN의 구현 방법을 다룹니다.

ISBN의 각 자리에는 다음과 같은 규칙이 있습니다.

  • 앞의 9자리는 해당 책의 제목, 출판사, 그룹(국가/언어권) 정보를 나타내며, 각 자리의 값은 0~9 사이입니다.
  • 마지막 1자리는 ISBN이 올바른지 검증하는 용도로 사용됩니다. 마지막 자리의 값이 10일 경우에는 숫자 대신 기호 'X'로 표기합니다.

10자리 ISBN 검증 방법

주어진 10자리 숫자가 유효한 ISBN인지 확인하는 절차는 다음과 같습니다.

  • 문자열의 첫 번째 자리부터 시작하여 10을 곱합니다(ISBN이 10자리이므로 첫 가중치는 10).
  • 다음 자리로 이동할 때마다 곱하는 값(가중치)을 1씩 줄여갑니다. 즉, 두 번째 자리는 9, 세 번째 자리는 8과 곱합니다.
  • 모든 곱셈 결과를 더합니다.
  • 합계를 11로 나눕니다.
  • 나눗셈 결과에 따라 조건을 판단합니다.
    • 나머지가 0이라면(11로 나누어떨어진다면) 해당 번호는 유효한 ISBN입니다.
    • 나머지가 0이 아니라면 해당 번호는 유효하지 않은 ISBN입니다.

예시

입력: 002442142X
출력: Not ISBN

입력: 007462542X
출력: It's ISBN

알고리즘

Start
Step 1-> ISBN 유효성 검사 함수 선언
   bool isvalid(string &isbn_number)
      int n = isbn_number.length() 설정
      IF (n != 10)
         return false
      End
      int sum = 0 설정
      Loop For int i = 0 and i < 9 and i++
         int value = isbn_number[i] - '0' 설정
         If (0 > value || 9 < value)
            return false
         End
         sum += (value * (10 - i))
      End
      char last_val = isbn_number[9] 설정
      IF (last_val != 'X' && (last_val < '0' || last_val > '9'))
         return false
      End
      sum += ((last_val == 'X') ? 10 : (last_val - '0'))
      return (sum % 11 == 0)
Step 2-> main() 함수에서
   string isbn_number = "002442142X" 설정
   IF (isvalid(isbn_number))
      "is Valid" 출력
   Else
      "is invalid" 출력
   End
Stop

C++ 구현 예제

#include <bits/stdc++.h>
using namespace std;
// 유효한 ISBN인지 검사하는 함수
bool isvalid(string &isbn_number) {
   int n = isbn_number.length();
   if (n != 10)
      return false;
   int sum = 0;
   for (int i = 0; i < 9; i++) {
      int value = isbn_number[i] - '0';
      if (0 > value || 9 < value)
         return false;
      sum += (value * (10 - i));
   }
   char last_val = isbn_number[9];
   if (last_val != 'X' && (last_val < '0' || last_val > '9'))
      return false;
   sum += ((last_val == 'X') ? 10 : (last_val - '0'));
   return (sum % 11 == 0);
}
int main() {
   string isbn_number = "002442142X";
   if (isvalid(isbn_number))
      cout<<isbn_number<<" is Valid";
   else
      cout<<isbn_number<<" is invalid";
   return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

002442142X is invalid

코드의 동작 원리를 요약하면, 먼저 입력된 문자열의 길이가 10자리인지 확인합니다. 그다음 앞의 9자리가 모두 숫자인지 검사하면서 각 자리에 10부터 2까지의 가중치를 곱해 합산합니다. 마지막 자리는 숫자 또는 'X'만 허용되며, 'X'라면 값 10으로 처리합니다. 최종적으로 전체 합을 11로 나눈 나머지가 0이면 유효한 ISBN으로 판정합니다. 위 예제의 "002442142X"는 이 조건을 만족하지 못하므로 유효하지 않은 ISBN으로 출력됩니다.