Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: erniker en 28 de Septiembre 2014, 20:20

Título: Ejercicio CU00828B curso PHP: funciones de cadenas, count_chars, substr_count
Publicado por: erniker en 28 de Septiembre 2014, 20:20
El enunciado dice esto:
Crear archivos php que ejecuten la tarea indicada:

a) Dada la cadena "El abecedario completo es algo largo y detallarlo exhaustivamente es costoso", indicar cuántas veces aparece cada vocal usando funciones para cadenas PHP.

b) Dada la cadena "El abecedario completo es algo largo y detallarlo exhaustivamente es costoso", indicar qué consonantes son las que aparecen y cuántas veces aparecen usando funciones para cadenas PHP.

c) Dada la cadena "El abecedario completo es algo largo y detallarlo exhaustivamente es costoso", mostrar la cadena donde todas las a hayan sido sustituídas por el símbolo *. Por ejemplo en lugar de <<El abecedario…>> se habrá de mostrar <<El *beced*rio…>>

d) Dada la cadena "El abecedario completo es algo largo y detallarlo exhaustivamente es costoso", mostrar la subcadena desde la primera aparición de <<completo>> excluyendo completo, es decir, deberá mostrarse << es algo largo y detallarlo exhaustivamente es costoso>>. Para ello usa una o varias funciones para cadenas PHP.


El codigo que yo he escrito es este:

Código: [Seleccionar]
<html>
<head><title>Ejemplo aprenderaprogramar.com</title></head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<?php
echo '<h1> Apartado a)</h1>';
//Apartado a)
$cadena 'El abecedario completo es algo largo y detallarlo exhaustivamente es costoso';
$a 0$e 0$i 0$o 0$u 0;
for ($cont=0$cont<=strlen($cadena)-1$cont++) {
switch ($cadena[$cont]) {
case 'a': case 'A':
$a++;
break;
case 'e': case 'E':
$e++;
break;
case 'i': case 'I':
$i++;
break;
case 'o': case 'O':
$o++;
break;
case 'u'; case 'U':
$u++;
break;
}
}
echo 'Letra: a encontrada '.  $a.' veces<br/>';
echo 'Letra: e encontrada '.  $e.' veces<br/>';
echo 'Letra: i encontrada '.  $i.' veces<br/>';
echo 'Letra: o encontrada '.  $o.' veces<br/>';
echo 'Letra: u encontrada '.  $u.' veces<br/>';
echo '</br></br>';
echo '<h1> Apartado b)</h1>';
//Apartado b)
$cadena 'El abecedario completo es algo largo y detallarlo exhaustivamente es costoso';
$b 0$c 0$d 0$f 0$g 0$h 0;
$j 0$k 0$l 0$m 0$n 0$ñ 0;
$p 0$q 0$r 0$s 0$t 0$v 0;
$w 0$x 0$y 0$z 0;
for ($cont=0$cont<=strlen($cadena)-1$cont++) {
switch ($cadena[$cont]) {
case 'b': case 'B':
$b++;
break;
case 'c': case 'C':
$c++;
break;
case 'd': case 'D':
$d++;
break;
case 'f': case 'F':
$f++;
break;
case 'g'; case 'G':
$g++;
break;
case 'h': case 'H':
$h++;
break;
case 'j': case 'J':
$j++;
break;
case 'k': case 'K':
$k++;
break;
case 'l': case 'L':
$l++;
break;
case 'm'; case 'M':
$m++;
break;
case 'n': case 'N':
$n++;
break;
case 'ñ': case 'Ñ':
++;
break;
case 'p': case 'P':
$p++;
break;
case 'q': case 'Q':
$q++;
break;
case 'r'; case 'R':
$r++;
break;
case 's': case 'S':
$s++;
break;
case 't': case 'T':
$t++;
break;
case 'v': case 'V':
$v++;
break;
case 'x': case 'X':
$x++;
break;
case 'y'; case 'Y':
$y++;
break;
case 'z'; case 'Z':
$z++;
break;
}
}
echo 'Letra: b encontrada '.  $b.' veces<br/>';
echo 'Letra: c encontrada '.  $c.' veces<br/>';
echo 'Letra: d encontrada '.  $d.' veces<br/>';
echo 'Letra: f encontrada '.  $f.' veces<br/>';
echo 'Letra: g encontrada '.  $g.' veces<br/>';
echo 'Letra: h encontrada '.  $h.' veces<br/>';
echo 'Letra: j encontrada '.  $j.' veces<br/>';
echo 'Letra: k encontrada '.  $k.' veces<br/>';
echo 'Letra: l encontrada '.  $l.' veces<br/>';
echo 'Letra: m encontrada '.  $m.' veces<br/>';
echo 'Letra: n encontrada '.  $n.' veces<br/>';
echo 'Letra: ñ encontrada '.  .' veces<br/>';
echo 'Letra: p encontrada '.  $p.' veces<br/>';
echo 'Letra: q encontrada '.  $q.' veces<br/>';
echo 'Letra: r encontrada '.  $r.' veces<br/>';
echo 'Letra: s encontrada '.  $s.' veces<br/>';
echo 'Letra: t encontrada '.  $t.' veces<br/>';
echo 'Letra: v encontrada '.  $v.' veces<br/>';
echo 'Letra: w encontrada '.  $w.' veces<br/>';
echo 'Letra: x encontrada '.  $x.' veces<br/>';
echo 'Letra: y encontrada '.  $y.' veces<br/>';
echo 'Letra: z encontrada '.  $z.' veces<br/>';
echo '</br></br>';
echo '<h1> Apartado c)</h1>';
//Apartado c)
$cadena 'El abecedario completo es algo largo y detallarlo exhaustivamente es costoso';
echo str_replace("a""*"$cadena);
echo '</br></br>';
echo '<h1> Apartado d)</h1>';
//Apartado d)
$cadena 'El abecedario completo es algo largo y detallarlo exhaustivamente es costoso';
echo strstr($cadena"es"false);
?>

</body>
</html>
Ovbiamente, seguro que los dos primeros apartados se pueden optimizar muchisimo, pero no he encontrado la manera.
Si se os ocurre como optimizarlo, decidmelo please :)
Título: Re:Ejercicio de la entrega 28 del curso de PHP
Publicado por: César Krall en 29 de Septiembre 2014, 17:42
Pues como dices el código funciona pero no está optimizado. Este ejercicio trata de que se apliquen las funciones para manejo de cadenas que utiliza php y que se explican en el texto del curso. Te digo lo que serían las ideas para mejorarlo.

Apartado a): Para contar la aparición de vocales en una palabra: usar count_chars. La función count_chars sirve para contar el número de apariciones de un carácter en una cadena.

Para el apartado b): usar también count_chars, pero primero tendrás que extraer letra a letra los caracteres de la palabra y comprobar si no han sido extraidos previamente. Para ello puedes usar un array asociativo. Por ejemplo si extraes la h puedes hacer $extraido['h']=1; lo que significa que ya se ha extraido una h, por tanto si vuelves a encontrar otra h ya no tendrías que extraerla. Luego con un for each puedes ver qué consonantes han aparecido sin necesidad de recorrer todo el abecedario.

Una buena idea puede ser crear una función que reciba dos parámetros: uno será el carácter cuya búsqueda queremos comprobar y otro la cadena. La función devolvería con un return el número de apariciones del carácter en la cadena (usando count_chars), de esta manera te evitas tener que estar repitiendo código.

Plantea primero si quieres el apartado a) y lo vamos corrigiendo apartado a apartado, así no tienes que escribirlo todo para después corregirlo todo.

Saludos!
Título: Re:Ejercicio CU00828B del curso de PHP: funciones de cadenas, count_chars
Publicado por: erniker en 29 de Septiembre 2014, 19:59
Cesar, ya intente usar la funcion count chart y bucles foreach para tratar de contar las bocales y despues las consonantes, pero no acaba de funcionar...
Lo unico que consigo es contar todas las letras, pero no distinguir entre vocales y consonantes... por eso acabé haciendolo a lo bestia :P

Este codigo es lo que tengo (sdolo hay que hacer cuatro modificaciones a un ejemplo de la entrega)
Código: [Seleccionar]
<html>
<head><title>Ejemplo aprenderaprogramar.com</title></head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<?php
echo '<h1> Apartado a)</h1>';
//Apartado a)
$cadena 'El abecedario completo es algo largo y detallarlo exhaustivamente es costoso';
$Array count_chars $cadena1);
foreach ($Array as $indiceNum => $veces) {
echo 'Letra: '.chr($indiceNum).' , encontrada '.  $veces.' veces<br/>';
}
?>

</body>
</html>
Pero esto cuenta todas las letras, no solo las vocales, o no solo las consonantes... y no encuentro como modificarlo para que haga lo que tiene que hacer
Título: Re:Ejercicio CU00828B curso PHP: funciones de cadenas, count_chars, substr_count
Publicado por: César Krall en 30 de Septiembre 2014, 09:58
Releyendo el texto del curso la función substr_count es la que parece que permite resolver más fácilmente este tipo de problemas (mejor que count_chars). Para cada apartado habría que buscar la función que mejor se adapta a resolver el problema.

El código para contar las vocales sería este:

Código: [Seleccionar]
<html>
<head><title>Ejemplo aprenderaprogramar.com</title></head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<?php
echo '<h1> Apartado a)</h1>';
//Apartado a)
$cadena 'El abecedario completo es algo largo y detallarlo exhaustivamente es costoso';

$numeroDeAs substr_count($cadena"a")+substr_count($cadena"A");
$numeroDeEs substr_count($cadena"e")+substr_count($cadena"E");
$numeroDeIs substr_count($cadena"i")+substr_count($cadena"I");
$numeroDeOs substr_count($cadena"o")+substr_count($cadena"O");
$numeroDeUs substr_count($cadena"u")+substr_count($cadena"U");

echo 'Cadena: '.$cadena.'<br/><br/>';
echo 'Letra: a encontrada '.  $numeroDeAs.' veces<br/>';
echo 'Letra: e encontrada '.  $numeroDeEs.' veces<br/>';
echo 'Letra: i encontrada '.  $numeroDeIs.' veces<br/>';
echo 'Letra: o encontrada '.  $numeroDeOs.' veces<br/>';
echo 'Letra: u encontrada '.  $numeroDeUs.' veces<br/>';
echo '</br></br>';
?>

</body>
</html>
Título: Re:Ejercicio CU00828B curso PHP: funciones de cadenas, count_chars, substr_count
Publicado por: erniker en 04 de Octubre 2014, 17:37
Gracias, César Krall, ahora si :)