Universidade Federal de Minas Gerais
Instituto de Ciências Exatas
Departamento de Ciência da Computação

Algoritmos e Estruturas de Dados I

Regras e programas para o cálculo dos dígitos/caracteres verificadores de ISBN10 e ISBN13

O programa abaixo lê nove caracteres/dígitos e determina o dígito/caractere verificador de um ISBN10. As regras são similares às regras do CPF, o último dígito/caractere deve ser tal que a soma dos dígitos, cada um multiplicado por seu respectivo peso, (verificador*1+unidade*2+dezena*3+...ultimo*10) é um múltiplo de 11

Os projetistas do ISBN10 não fizeram adaptação de haver apenas a presença de dígitos de 0 a 9 como ocorre com o CPF. O ISBN10 utiliza o “dígito” X para representar o valor 10.

#include <stdio.h>
#include <stdlib.h>

//0-13-110362-8: The C Programming Language

int main(int argc, char *argv[]){

  printf("Forneca os 9 digitos do ISBN-10:");
  char d0, d1, d2, d3, d4, d5, d6, d7, d8;
  scanf("%c%c%c%c%c%c%c%c%c",
           &d8,&d7,&d6,&d5,&d4,&d3,&d2,&d1,&d0);

  int somaprod;
  char carVer;
  int restoAux;

  d0=d0-'0'; d1=d1-'0'; d2=d2-'0';
  d3=d3-'0'; d4=d4-'0'; d5=d5-'0';
  d6=d6-'0'; d7=d7-'0'; d8=d8-'0';

  somaprod=d0*2+d1*3+d2*4+d3*5+d4*6+d5*7+d6*8+d7*9+d8*10;
  restoAux=somaprod%11;
  carVer=(restoAux==1) ? 'X' : ( (restoAux==0) ? '0' : '0'+(11-restoAux) );
  printf("ISBN %d%d%d%d%d%d%d%d%d", d8,d7,d6,d5,d4,d3,d2,d1,d0);
  printf("-%c\n",carVer);
 
  system("PAUSE");
  return 0;
}

O programa abaixo lê doze caracteres e determina o dígito verificador de um ISBN13. A Abordagem do ISBN13 é bem diferente da base teórica do CPF e do ISBN10 e portanto as “garantias” de erros de transposição etc são bem distintas. Observe que os dígitos são multiplicados por 3 ou por 1 sucessivamente, e que o dígito verificador deve garantir que a soma destes produtos seja divisível por 10! Neste esquema não se apresenta a questão de haver ou não um caractere para representar o “dígito 10”.

 

#include <stdio.h>
#include <stdlib.h>

/* 978-0-306-40615-7
   978-0-470-87180-5
*/

int main(int argc, char *argv[]) {

  printf("Forneca os 12 digitos do ISBN-13:");
  char d0, d1, d2, d3, d4, d5, d6, d7, d8, d9,d10,d11;
  scanf("%c%c%c%c%c%c%c%c%c%c%c%c",&d11,&d10,&d9,&d8,&d7,&d6,&d5,&d4,&d3,&d2,&d1,&d0);

  int somaprod;
  int digVer;
  int restoAux;

  d0=d0-'0'; d1=d1-'0'; d2=d2-'0';
  d3=d3-'0'; d4=d4-'0'; d5=d5-'0';
  d6=d6-'0'; d7=d7-'0'; d8=d8-'0';
  d9=d9-'0'; d10=d10-'0'; d11=d11-'0';

  somaprod=d0*3+d1+d2*3+d3+d4*3+d5+d6*3+d7+d8*3+d9+d10*3+d11;
  digVer=10-somaprod%10;
  printf("ISBN %d%d%d%d%d%d%d%d%d%d%d%d",

          d11,d10,d9,d8,d7,d6,d5,d4,d3,d2,d1,d0);
  printf("-%d\n",digVer);

  system("PAUSE");
  return 0;
}