P_70_E14-Calcular+letra+NIF

=__**Cálculo de la letra del NIF**__= >

Realizar un programa que permita calcular el N.I.F., conocido el D.N.I. de una persona.

El programa deberá leer, sobre una cadena de caracteres, el número del D.N.I. del interesado.

Seguidamente deberá averiguar si es un valor válido (todos los caracteres deben ser numéricos y representar un valor entre 100000 y 99999999).

Si la entrada es válida se deberá calcular el N.I.F. y sobre la cadena inicial se deberán insertar los puntos de los millares y millones en las posiciones correspondientes, así como la letra del N.I.F., al final de la cadena de caracteres separada por un espacio en blanco.

Si no es un valor válido muestra un mensaje de error y finaliza el programa.

Cálculo de la letra del N.I.F.:

=
=================

Se obtiene el resto de la división del número del D.N.I. entre el valor 23, y en función del resultado se asigna un carácter según la siguiente tabla:
 * 0 = 'T' ||  || 7 = 'F' ||   || 14 = 'Z' ||   || 21 = 'K' ||
 * 1 = 'R' ||  || 8 = 'P' ||   || 15 = 'S' ||   || 22 = 'E' ||
 * 2 = 'W' ||  || 9 = 'D' ||   || 16 = 'Q' ||   ||   ||
 * 3 = 'A' ||  || 10 = 'X' ||   || 17 = 'V' ||   ||   ||
 * 4 = 'G' ||  || 11 = 'B' ||   || 18 = 'H' ||   ||   ||
 * 5 = 'M' ||  || 12 = 'N' ||   || 19 = 'L' ||   ||   ||
 * 6 = 'Y' ||  || 13 = 'J' ||   || 20 = 'C' ||   ||   ||

code format="pascal" PROGRAM strin_14 ; CONST iLONG_MAX_DNI = 12 ; iNUM_LETRAS_NIF = 23 ;

TYPE tsCadenaDNI   = STRING [iLONG_MAX_DNI] ; tsCadenaLetras = STRING [iNUM_LETRAS_NIF] ;

PROCEDURE ObtenerNumero (   sCadena    :  tsCadenaDNI ;                         VAR loNumero   :  LongInt ;                         VAR boCorrecto : Boolean) ; VAR iError  : Integer) ; BEGIN   boCorrecto := TRUE ;   Val (sCadena, loNumero, iError) ;

IF iError <> 0 THEN boCorrecto := FALSE ELSE IF (loNumero < 100000) OR (99999999 < loNumero) THEN boCorrecto := FALSE END ;

FUNCTION fnsFormatear (sCadena: tsCadenaDNI ; cNif : Char) : tsCadenaDNI ; BEGIN Insert ('.', sCadena, Length (sCadena) - 2) ;

IF Length (sCadena) > 7 THEN Insert ('.', sCadena, Length (sCadena) - 6) ;

fnsFormatear := sCadena + '-' + cNif ; END ;

FUNCTION fncLetraNIF (loNumero : LongInt) : Char ; VAR sLetrasPosibles : tsCadenaLetras ; iPosicLetra    : Byte ; BEGIN sLetrasPosibles := 'TRWAGMYFPDXBNJZSQVHLCKE' ;

iPosicLetra := loNumero MOD iNUM_LETRAS_NIF + 1 ;

{   { si D.N.I. rNumero fuera de tipo Real en lugar de LongInt } Calcular el resto :

iPosicLetra := Round (Frac (rNumero / 23) * 23) + 1) ; }

fncLetraNIF := sLetrasPosibles [iPosicLetra]

END ;

{--- Variables del Programa Principal -} VAR liDni     : LongInt ; sCadenaDNI, sCadenaNIF : tsCadenaDNI ; boCorrecto : Boolean ; cLetra    : Char ;

BEGIN { Programa Principal ---} REPEAT Write ('Número del DNI (100000..99999999): ') ; Readln (sCadenaDNI) ; ObtenerNumero (sCadenaDNI, loDni, boCorrecto) ; IF NOT boCorrecto THEN Writeln ('ERROR: El D.N.I. debe ser un número entre 100000 y 99999999') UNTIL boCorrecto ;

cLetra := fncLetraNIF (loDni) ;

sCadenaNIF := fnsFormatear (sCadenaDNI, cLetra) ; Writeln ('El NIF es: ', sCadenaNIF) ;

Readln ; END. code