Autor Tema: Ejercicio CU00828B curso PHP: funciones de cadenas, count_chars, substr_count  (Leído 6982 veces)

erniker

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 45
    • Ver Perfil
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 :)
« Última modificación: 30 de Septiembre 2014, 09:55 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio de la entrega 28 del curso de PHP
« Respuesta #1 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!
Responsable de departamento de producción aprenderaprogramar.com

erniker

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 45
    • Ver Perfil
Re:Ejercicio CU00828B del curso de PHP: funciones de cadenas, count_chars
« Respuesta #2 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
« Última modificación: 29 de Septiembre 2014, 20:02 por erniker »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:Ejercicio CU00828B curso PHP: funciones de cadenas, count_chars, substr_count
« Respuesta #3 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>
Responsable de departamento de producción aprenderaprogramar.com

erniker

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 45
    • Ver Perfil
Gracias, César Krall, ahora si :)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".