Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Dimitar Stefanov en 09 de Mayo 2016, 22:33
-
Buenas noches. Os expongo una posible solución del ejercicio CU00829B del curso PHP desde cero:
EJERCICIO
Crear archivos php que ejecuten la tarea indicada:
a) Dadas las cadenas "aprender" y "aprende", mostrar por pantalla la cadena rellena con * a derecha e izquierda en un número de asteriscos que será siempre 5 a cada lado aunque se cambien las cadenas.
<?php
$cadena1 = "aprender";
$cadena2 = "aprende";
function rellenar($cadena){
echo str_pad($cadena, (strlen($cadena)+10) , "*", STR_PAD_BOTH);
}
echo rellenar($cadena1);
echo "<br><br><br>";
echo rellenar($cadena2);
?>
No entiendo por qué así:
<?php
$cadena1 = "aprender";
$cadena2 = "aprende";
function rellenar($cadena){
echo str_pad($cadena, (strlen($cadena)+10) , "*", STR_PAD_BOTH);
}
echo rellenar($cadena1)."<br><br><br>".rellenar($cadena2);
?>
no se imprimen por pantalla los saltos de carro.
b) Dadas las cadenas "aprender" y "aprende", mostrar por pantalla si sus tres primeros caracteres son iguales o no usando una función de comparación de subcadenas.
<?php
$cadena1 = "aprender";
$cadena2 = "aprende";
if(strncmp($cadena1, $cadena2, 3)==0){
echo "Las primeras 3 lestras de: '".$cadena1."' y '".$cadena2." son iguales";
}else{
echo "Las primeras 3 lestras de: '".$cadena1."' y '".$cadena2." NO son iguales";
}
?>
c) Dada la cadena "ApRendEr A proGraMar.cOm" transformar la cadena a minúsculas y rellenarla a derecha e izquierda con una longitud de asteriscos igual a la mitad de su longitud si es par ó igual a la mitad de (su longitud más 1) si es impar. Mostrar por pantalla la cadena en minúsculas y con el relleno indicado.
<?php
$cadena = "ApRendEr A proGraMar.cOm";
$cadena = strtolower($cadena);
if((strlen($cadena)%2)==0){
echo str_pad($cadena, strlen($cadena)+strlen($cadena)/2, "*", STR_PAD_BOTH);
}else{
echo str_pad($cadena, strlen($cadena)+((strlen($cadena)/2)+1), "*", STR_PAD_BOTH);
}
?>
Gracias.
-
Buenos días, todo bien
En el código donde indicas que no se imprimen por pantalla los saltos de carro el código HTML que veo al ejecutar en el navegador es el siguiente: *****aprender**********aprende*****<br><br><br>
Esto tiene que ver con cómo ejecuta el intérprete php las órdenes y cómo has definido la función rellenar. Es un problema interesante y en un código extenso puede ser muy difícil de detectar.
Cuando vemos esta línea: echo rellenar($cadena1).'hace frio <br><br><br>'.rellenar($cadena2);
Pensamos que se ejecuta de izquierda a derecha, como es lo habitual y pensamos que estamos concatenando cadenas. Sin embargo nos podemos encontrar con resultados no esperados como el que se obtiene aquí cuando tratamos de realizar una concatenación de funciones que ejecutan algo en lugar de devolver algo. La forma de explicarlo sería: la función rellenar que has planteado ejecuta un echo, es decir, no devuelve algo, sino que ejecuta algo sin devolver nada. Esto es importante: diferencia entre ejecutar algo y devolver algo. Al ejecutar, cuando se produce la concatenación, primero ejecuta lo que es susceptible de ejecutar, de ahí que salga por pantalla *****aprender**********aprende***** y luego realiza la concatenación ¿Qué concatena? hace frio <br><br><br> porque no hay nada más que concatenar (lo otro ya se ejecutó).
Si planteamos el código así:
<?php
$cadena1 = "aprender";
$cadena2 = "aprende";
function rellenar($cadena){
return str_pad($cadena, (strlen($cadena)+10) , "*", STR_PAD_BOTH);
}
echo rellenar($cadena1).'hace frio <br><br><br>'.rellenar($cadena2);
?>
Ya obtenemos el resultado esperado. Es importante acostumbrarse a trabajar usando return (cuando sea adecuado usarlo).
En este caso, si quieres concatenar, debes concatenar algo. Tú estabas intentando concatenar la ejecución de funciones con una cadena y esto genera un resultado no esperado. Si simplemente concatenas cadenas con otras cadenas devueltas por funciones ya todo va bien.
Saludos.
-
Buenas, Mario.
Gracias por corregir otro ejercicio más.
Me ha gustado mucho la explicación que me diste aquí. Quizás ahora no la entienda del todo, pero sé que más adelante la comprenderé. Creo que lo más importante con lo que me tendré que quedar de tu comentario es:
Al ejecutar, cuando se produce la concatenación, primero ejecuta lo que es susceptible de ejecutar, de ahí que salga por pantalla *****aprender**********aprende***** y luego realiza la concatenación ¿Qué concatena? hace frio <br><br><br> porque no hay nada más que concatenar (lo otro ya se ejecutó).
y
Si simplemente concatenas cadenas con otras cadenas devueltas por funciones ya todo va bien.
Debo reconocer que aún me cuesta un poquito acostumbrarme a trabajar con la instrucción "return" en funciones :)
Saludos.