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: Cabanota en 18 de Junio 2015, 09:58

Título: Ejercicios PHP resueltos compara cadenas strcmp longitud strlen relleno CU00829B
Publicado por: Cabanota en 18 de Junio 2015, 09:58
Hola compañeros. Aquí planteo una posible solución a los ejercicios de este tema. Espero me digan si tengo falencias y me digan de que manera puedo optimizar el código. De ante mano, muchas gracias.

Citar
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.

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.

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.

NOTA: El punto "c" no estoy seguro si esta bueno, porque cuando la cadena es impar le quedan mas asteriscos del lado derecho que del izquierdo y creo que ese no es el objetivo. me gustaría saber si entendí bien el ejercicio o que. Gracias.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
</head>
<body>
<?php		$cadena1 = "aprender";		$cadena2 = "aprende";		$cadena3 = "ApRendEr A proGraMar.cOm";		//punto a.		echo str_pad($cadena1, (strlen($cadena1)+10), "*", STR_PAD_BOTH). "<br/>";		echo str_pad($cadena2, (strlen($cadena2)+10), "*", STR_PAD_BOTH). "<br/>";				echo "-----------------------------------------<br/>";				//punto b.		for ($i=0; $i < 3; $i++) { 			$aux1 = substr($cadena1, $i, 1);			$aux2 = substr($cadena2, $i, 1);			if (strcmp($aux1, $aux2) == 0) {				echo "\"" . $aux1 . "\" es igual a \"" . $aux2 . "\".<br/>";			}else{				echo "\"" . $aux1 . "\" es diferente de \"" . $aux2 . "\".<br/>";			}		}		echo "-----------------------------------------<br/>";		//punto c.		$tranosformada = strtolower($cadena3);		$resul = (strlen($tranosformada) % 2);		$aux = strlen($tranosformada);				if ($resul == 0) {			$longitud = $aux + ($aux / 2);			echo "Resul: " . str_pad($tranosformada, $longitud,"*" , STR_PAD_BOTH);		}else{			$longitud = $aux + (($aux / 2) + 1);			echo "Resul: " . str_pad($tranosformada, ($longitud),"*" , STR_PAD_BOTH);		}	?>

</body>
</html>
Título: Re:Ejercicios PHP resueltos compara cadenas strcmp longitud strlen relleno CU00829B
Publicado por: Ogramar en 21 de Junio 2015, 17:26
Hola, el punto a) lo tienes perfecto, es decir, si se cambia la longitud de la palabra siguen mostrándose siempre cinco asteriscos a derecha e izquierda

El punto b) haz hecho una comparación de cada letra. Podrías completarlo añadiendo si las tres letras (en conjunto) son iguales o no. Abajo te pongo cómo sería el código con este añadido.

El punto c)

La cadena "ApRendEr A proGraMar.cOm" tiene una longitud de 24 caracteres (incluyendo los espacios).

La mitad es 12. Por tanto debería rellenarse con 12 asteriscos a derecha e izquierda. En tu código tienes escrito

$longitud = $aux + ($aux / 2);

De este modo la nueva longitud es 24 más 12 que quedan como 6 asteriscos + 24 caracteres + 6 asteriscos

Para rellenar con 12 asteriscos a derecha e izquierda simplemente usaríamos $longitud = 2*$aux; para el caso de que sea par, de este modo la cadena pasa a tener 48 caracteres y se conforma así: 12 asteriscos + 24 caracteres + 12 asteriscos.


Supongamos que la cadena tenga 25 caracteres. En este caso la mitad resulta 12.50 y usamos entones la mitad de su longitud más uno, es decir la mitad de 26 que es 13. La cadena tiene que quedar con 13 asteriscos a la izquierda + 25 caracteres + 13 asteriscos a la derecha, total de 51 caracteres. Aquí la cadena era de 25 y el relleno en total es de 26.

Para lograr esto usamos $longitud = 2*$aux + 1;

De este modo siempre quedan el mismo número de asteriscos al lado derecho e izquierdo.

El código con estos pequeños cambios queda así:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
</head>
<body>
<?php		$cadena1 = "aprender";		$cadena2 = "aprende";		$cadena3 = "ApRendEr A proGraMar.cOm";		//punto a.		echo str_pad($cadena1, (strlen($cadena1)+10), "*", STR_PAD_BOTH). "<br/>";		echo str_pad($cadena2, (strlen($cadena2)+10), "*", STR_PAD_BOTH). "<br/>";				echo "-----------------------------------------<br/>";				//punto b.		$tresLetrasSonIguales = true;		for ($i=0; $i < 3; $i++) { 			$aux1 = substr($cadena1, $i, 1);			$aux2 = substr($cadena2, $i, 1);			if (strcmp($aux1, $aux2) == 0) {				echo "\"" . $aux1 . "\" es igual a \"" . $aux2 . "\".<br/>";			}else{				$tresLetrasSonIguales = false;				echo "\"" . $aux1 . "\" es diferente de \"" . $aux2 . "\".<br/>";			}		}		echo '<br/> Como resultado final podemos decir que las tres letras son: ';		if ($tresLetrasSonIguales == true) { echo 'iguales';} else {echo 'no iguales';}		echo "<br/>-----------------------------------------<br/>";		//punto c.		$tranosformada = strtolower($cadena3);		$resul = (strlen($tranosformada) % 2);		$aux = strlen($tranosformada);				if ($resul == 0) {			$longitud = 2*$aux;			echo "Resul: " . str_pad($tranosformada, $longitud,"*" , STR_PAD_BOTH);		}else{			$longitud = 2*$aux + 1;			echo "Resul: " . str_pad($tranosformada, ($longitud),"*" , STR_PAD_BOTH);		}	?>

</body>
</html>