|
| 1 | +(* |
| 2 | + * EJERCICIO: |
| 3 | + * - Muestra ejemplos de asignación de variables "por valor" y "por referencia", según |
| 4 | + * su tipo de dato. |
| 5 | + * - Muestra ejemplos de funciones con variables que se les pasan "por valor" y |
| 6 | + * "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas. |
| 7 | + * (Entender estos conceptos es algo esencial en la gran mayoría de lenguajes) |
| 8 | + * |
| 9 | + * DIFICULTAD EXTRA (opcional): |
| 10 | + * Crea dos programas que reciban dos parámetros (cada uno) definidos como |
| 11 | + * variables anteriormente. |
| 12 | + * - Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia. |
| 13 | + * Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno |
| 14 | + * se asigna a dos variables diferentes a las originales. A continuación, imprime |
| 15 | + * el valor de las variables originales y las nuevas, comprobando que se ha invertido |
| 16 | + * su valor en las segundas. |
| 17 | + * Comprueba también que se ha conservado el valor original en las primeras. |
| 18 | + *) |
| 19 | +program fduron; |
| 20 | + |
| 21 | +{$APPTYPE CONSOLE} |
| 22 | + |
| 23 | +{$R *.res} |
| 24 | + |
| 25 | +uses |
| 26 | + System.SysUtils; |
| 27 | + |
| 28 | +procedure SumarPorReferencia(ValorBase: Integer; var Valor1: Integer; var Valor2: Integer); |
| 29 | +begin |
| 30 | + { Los parámetros por referencia son modificados dentro del contexto del |
| 31 | + procedimiento o función que los manda llamar } |
| 32 | + Valor1 := ValorBase + Valor1; |
| 33 | + Valor2 := ValorBase + Valor2; |
| 34 | +end; |
| 35 | + |
| 36 | +procedure ConcatenarPorReferencia(var Cadena1: String; Cadena2: String); |
| 37 | +begin |
| 38 | + { El resultado de la concatenación se almacena en la variable Cadena1, que es |
| 39 | + un parámetro por referencia } |
| 40 | + Cadena1 := Cadena1 + '+' + Cadena2; |
| 41 | +end; |
| 42 | + |
| 43 | +function ConcatenarPorValor(Cadena1, Cadena2: String): String; |
| 44 | +begin |
| 45 | + { El resultado de la concatenación se regresa en el resultado de la función |
| 46 | + ya que ambos parámetros son por valor } |
| 47 | + |
| 48 | + // Los parámetros pueden cambiar su valor en el contexto de esta función |
| 49 | + Cadena1 := Cadena1+ '+'; |
| 50 | + Result := Cadena1 + Cadena2; |
| 51 | +end; |
| 52 | + |
| 53 | +procedure SumarPorValor(ValorBase, Valor1, Valor2: Integer); |
| 54 | +begin |
| 55 | + Valor1 := ValorBase + Valor1; |
| 56 | + Valor2 := ValorBase + Valor2; |
| 57 | + WriteLn('"SumaPorValor"'); |
| 58 | + WriteLn('Valor1: ', Valor1); |
| 59 | + WriteLn('Valor2: ', Valor2); |
| 60 | +end; |
| 61 | + |
| 62 | +procedure DificultadExtraPorValor(ParametroUno, ParametroDos: String); |
| 63 | +var |
| 64 | + VariableTemporal: String; |
| 65 | +begin |
| 66 | + VariableTemporal := ParametroUno; |
| 67 | + ParametroUno := ParametroDos; |
| 68 | + ParametroDos := VariableTemporal; |
| 69 | +end; |
| 70 | + |
| 71 | +procedure DificultadExtraPorReferencia(var ParametroUno, ParametroDos: String); |
| 72 | +var |
| 73 | + VariableTemporal: String; |
| 74 | +begin |
| 75 | + VariableTemporal := ParametroUno; |
| 76 | + ParametroUno := ParametroDos; |
| 77 | + ParametroDos := VariableTemporal; |
| 78 | +end; |
| 79 | + |
| 80 | +Var |
| 81 | + VarEjemplo1, VarEjemplo2: Integer; |
| 82 | + CadenaUno, CadenaDos: String; |
| 83 | + OriginalUno, OriginalDos, NuevaUno, NuevaDos: String; |
| 84 | + |
| 85 | +begin |
| 86 | + VarEjemplo1 := 15; |
| 87 | + VarEjemplo2 := 23; |
| 88 | + CadenaUno := 'quince'; |
| 89 | + CadenaDos := 'veintitrés'; |
| 90 | + |
| 91 | + SumarPorReferencia(10, VarEjemplo1, VarEjemplo2); |
| 92 | + WriteLn('los valores + 10 son: ', VarEjemplo1, ' ', VarEjemplo2); |
| 93 | + |
| 94 | + CadenaUno := 'quince'; |
| 95 | + CadenaDos := 'veintitrés'; |
| 96 | + ConcatenarPorReferencia(CadenaUno, CadenaDos); |
| 97 | + WriteLn('Concatenar texto usando un procedimiento con parámetros por referencia: ', |
| 98 | + CadenaUno); |
| 99 | + |
| 100 | + CadenaUno := 'quince'; |
| 101 | + CadenaDos := 'veintitrés'; |
| 102 | + WriteLn('Concatenar texto usando una función con parámetros por valor: ', |
| 103 | + ConcatenarPorValor(CadenaUno, CadenaDos) ); |
| 104 | + |
| 105 | + SumarPorValor(10, 27, 16); |
| 106 | + |
| 107 | + WriteLn; |
| 108 | + WriteLn('************************************************'); |
| 109 | + WriteLn(' DIFICULTAD EXTRA'); |
| 110 | + WriteLn('************************************************'); |
| 111 | + WriteLn; |
| 112 | + |
| 113 | + OriginalUno := '*Texto número uno*'; |
| 114 | + OriginalDos := '-TEXTO NÚMERO DOS-'; |
| 115 | + NuevaUno := OriginalUno; |
| 116 | + NuevaDos := OriginalDos; |
| 117 | + |
| 118 | + DificultadExtraPorValor(NuevaUno, NuevaDos); |
| 119 | + WriteLn('Ejemplo "Por valor"'); |
| 120 | + WriteLn('Varialbes originales: ', OriginalUno, ' ', OriginalDos); |
| 121 | + WriteLn('Varialbes nuevas: ', NuevaUno, ' ', NuevaDos); |
| 122 | + WriteLn; |
| 123 | + |
| 124 | + OriginalUno := '*Texto número uno*'; |
| 125 | + OriginalDos := '-TEXTO NÚMERO DOS-'; |
| 126 | + NuevaUno := OriginalUno; |
| 127 | + NuevaDos := OriginalDos; |
| 128 | + DificultadExtraPorReferencia(NuevaUno, NuevaDos); |
| 129 | + WriteLn('Ejemplo "Por referencia"'); |
| 130 | + WriteLn('Varialbes originales: ', OriginalUno, ' ', OriginalDos); |
| 131 | + WriteLn('Varialbes nuevas: ', NuevaUno, ' ', NuevaDos); |
| 132 | + ReadLn; |
| 133 | +end. |
0 commit comments