Program NumberNine;
{$mode objfpc}{$H+}
const MaxNum = 999999999;
var P, V, Numero: Longint;
//------------------------------------------------------------------------------
// IntroV
// Definicion de la variable V
//------------------------------------------------------------------------------
function IntroP(var MiP: Integer): Boolean;
begin
IntroP := false;
Write('Introduzca el valor de P [1..9] ');
Readln(MiP);
if (MiP < 1) or (MiP > 9) then
writeln('Error en la definicion de P')
else
IntroP := true;
end;
//------------------------------------------------------------------------------
// IntroV
// Definicion de la variable V
//------------------------------------------------------------------------------
function IntroV(var MiV: Integer): Boolean;
begin
IntroV := false;
Write('Introduzca el valor de V [0..9] ');
Readln(MiV);
if (MiV < 0) or (MiV > 9) then
writeln('Error en la definicion de V')
else
IntroV := true;
end;
//------------------------------------------------------------------------------
// IntroNumero
// Definicion de Numero
//------------------------------------------------------------------------------
function IntroNumero(var MiNumero: Longint): Boolean;
begin
IntroNumero := false;
Write('Introduzca el valor de Numero [1..999999999] - [0 para terminar] ');
Readln(MiNumero);
if (MiNumero < 0) or (MiNumero > MaxNum) then
writeln('Error en la definicion de Numero')
else
IntroNumero := true;
end;
//------------------------------------------------------------------------------
// NumeroDeNueves
// Devuelve un numero compuesto de tantos nueves como el valor de NumCifras
//------------------------------------------------------------------------------
function NumeroDeNueves(NumCifras: Integer): Longint;
var n: Integer;
begin
NumeroDeNueves := 0;
if (NumCifras >= 1) and (NumCifras <= 9) then
begin
NumeroDeNueves := 9;
while (NumCifras > 1) do
begin
NumeroDeNueves := NumeroDeNueves * 10 + 9;
NumCifras := NumCifras - 1;
end;
End;
end;
//------------------------------------------------------------------------------
// CambiarNumero
// Cambia la cifra que se encuentra en la posicion MiP (contando desde las
// unidades) por el valor MiV
//------------------------------------------------------------------------------
function CambiarNumero(var MiP: Integer; MiV: Integer; MiNumero: Longint): Longint;
var Numero2, Resultado: Longint;
i, NumCifras: Integer;
begin
NumCifras := 0; // Numero de cifras de MiNumero
Resultado := 0;
Numero2 := MiNumero;
While Numero2 > 0 do
begin
Numero2 := Numero2 div 10;
NumCifras := NumCifras + 1;
end;
Numero2 := 1; // Numero2 ira tomando valores 1, 10, 100...
i := 1;
if MiP > NumCifras then // Posicion fuera del tiesto; salir
Resultado := NumeroDeNueves(NumCifras)
else
Repeat
if i = MiP then
Resultado := Numero2 * MiV + Resultado
else
Resultado := Numero2 * ((MiNumero div Numero2) mod 10) + Resultado;
Numero2 := Numero2 * 10;
i := i + 1;
Until i > NumCifras;
CambiarNumero := Resultado;
end;
//------------------------------------------------------------------------------
// Programa principal
//------------------------------------------------------------------------------
Begin
Repeat
V := 0;
P := 0;
Numero := 0;
if IntroNumero(Numero) and (Numero > 0) then
if IntroP(P) then
if IntroV(V) then
Writeln('And the Oscar goes to... ', CambiarNumero(P, V, Numero));
Until Numero = 0;
Writeln('Hasta otra ocasion. Pulse RTN, haga el favor.');
Readln;
End.