Foros del Web » Programando para Internet » PHP »

2 ejercicios PHP

Estas en el tema de 2 ejercicios PHP en el foro de PHP en Foros del Web. Hola, estoy haciendo una serie de ejercicios de PHP para prepararme para un examen y los he terminado todos salvo 2 que no consigo hacerlos. ...
  #1 (permalink)  
Antiguo 01/05/2014, 08:00
 
Fecha de Ingreso: abril-2014
Mensajes: 6
Antigüedad: 10 años
Puntos: 1
2 ejercicios PHP

Hola, estoy haciendo una serie de ejercicios de PHP para prepararme para un examen y los he terminado todos salvo 2 que no consigo hacerlos.

El primero trata de arrays y el segundo del uso de tablas.

El primero enunciado dice los siguiente:
1. Dado un vector de números positivos desordenado, recórralo y muestre
los 3 números mayores. Para generar un vector aleatorio, implemente
una función que nos devuelva el vector inicializado. Se le pasará como
parámetros el tamaño, el valor máximo y mínimo del rango a generar.


Esto es lo que he conseguido hacer. No está mal, pero no es lo que me pide.

Código PHP:
<?php
$entrada
=array(1,2,3,10,4,5,6,7,48,9); 
$mayor=$entrada[0]; 
$pos=0
for(
$j=0;$j<count($entrada);$j++)

{
  if(
$mayor<$entrada[$j])
  {
    
$mayor=$entrada[$j];
   
$pos=$j;
  }
}
echo 
"El mayor es ".$mayor
?>
El caso es que solo me da el mayor y lo que necesito es que me de los tres mayores. He probado con tres variables pero lo único que consigo es que me diga tres veces que el mayor es 48 y no el segundo y tercero mayor.


El segundo ejercicio pide lo siguiente:
Escribe un formulario que pida un número y muestre las tablas de multiplicar hasta
ese número (sin cabeceras).

Escribe un número y escribiré las tablas de multiplicar hasta ese número.



Y el resultado debe ser exactamente con el mismo aspecto que este:




Se como hacer que aparezcan todas las tablas en una sola tabla pero no tengo ni idea de como decirle que me haga la tabla del 1 en un <table>, luego la del 2, etc.

A ver si alguien me puede decir el código de ambos ejercicios para verlo y poder comprenderlo. Gracias.
  #2 (permalink)  
Antiguo 01/05/2014, 11:10
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: 2 ejercicios PHP

¿No puedes utilizar funciones predefinidas/nativas de PHP?
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 01/05/2014, 11:22
 
Fecha de Ingreso: abril-2014
Mensajes: 6
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

Es que tampoco tengo mucha idea de como hacerlos.
  #4 (permalink)  
Antiguo 01/05/2014, 11:42
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: 2 ejercicios PHP

Bueno, pues vamos a hacerlo juntos :)

Lo primero que necesitas es, como dice el ejercicio, recorrer el array. Cuando se recorre un array se hace por iteraciones. Una iteración es el paso por cada par clave valor de un array.

De manera que si tenemos el array asociativo (claves numéricas consecutivas que comienzan por 0 y no indexado, donde el programador ha creado las claves)

Código PHP:
Ver original
  1. $a=array(1, 2, 3, 4, 5, 6, 7, 8, 9);

La primera iteración se hará en la clave 0 y valor 1

Código PHP:
Ver original
  1. echo $a[0]; // imprime 1

Para recorrer arrays tienes dos opciones populares:

a) con un for.

b) con un foreach.

Para optimizar el código y que sea más legible, vamos a emplear foreach, aunque perfectamente se puede hacer también con for.

El loop foreach está específicamente creado para recorrer arrays, en PHP no sirve para otra cosa.

La sintaxis de foreach puede ser de dos maneras:

a) foreach($var as $value){

}

o si necesitamos en las iteraciones la clave

b) foreach($var as $key=>$value){

}

Así que ya tenemos claro que necesitamos un foreach.

También necesitaremos la clave para poder saber en cada momento qué iteramos y qué queremos comparar.


De manera que el código quedaría así

Código PHP:
Ver original
  1. $entrada=array(1,2,3,10,4,5,6,7,48,9);
  2.  
  3. foreach($entrada as $key=>$value){
  4.    
  5. }

¿Se te ocurre qué necesitamos hacer dentro del foreach?
__________________
Ayúdame a hacerlo por mi mismo.
  #5 (permalink)  
Antiguo 01/05/2014, 11:50
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: 2 ejercicios PHP

Bueno... yo hice el primer ejercicio completo.

Pero veo que hay alguien que quiere ayudarte para que aprendas y si yo te paso el ejercicio lo tendrás hecho (aunque tendría una breve explicación), pero para aprender tendrás que analizarlo. ¿Te paso el ejercicio o prefieres que te enseñen a hacerlo?
  #6 (permalink)  
Antiguo 01/05/2014, 11:57
 
Fecha de Ingreso: abril-2014
Mensajes: 6
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

Prefiero hacerlo yo pero necesito mas pistas jeje.

Tengo delante los apuntes de foreach pero solo sale un ejemplo y es para ver la nota que tiene cada alumno.

Sigo sin saber como hacerle entender al programa cuales son los tres números mas grandes.

Este es el ejemplo de los apuntes:
Código PHP:
$nota=array("Antonio"=>5475=>6"Luis"=>92,"Berta"=>7); 
foreach (
$nota as $i=>$v){ 
echo 
"La nota $i vale $v\n"
  #7 (permalink)  
Antiguo 01/05/2014, 12:01
 
Fecha de Ingreso: abril-2014
Mensajes: 8
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

yo tengo esto, echo todo rapido y funciona bien xD
Código PHP:
<?php 
$entrada
=array(141,2,3,10,4,55,6,7,48,9);  
$salida = array();
$posaux 0;
$salida[$posaux]=$entrada[$posaux];  


for(
$j=0;$j<count($entrada);$j++) {          
     
  if(
$salida[$posaux]>$entrada[$j])     
    
$posaux++;       

  
$salida[$posaux] = $entrada[$j];
    


for(
$x=0;$x<3;$x++) echo $salida[$x]."<br>";

?>
  #8 (permalink)  
Antiguo 01/05/2014, 12:04
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: 2 ejercicios PHP

Bueno, en el que yo hice lo trabajo más o menos así:

Son tres funciones: una que genera el vector, otra que dice cual es el numero mas grande en el vector y otra que ejecuta la segunda función, elimina el valor mayor, ejecuta la segunda función, elimina el valor mayor y vuelve a ejecutar la segunda función...

¿Qué piensas?

Última edición por zyxer; 01/05/2014 a las 12:09
  #9 (permalink)  
Antiguo 01/05/2014, 12:12
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: 2 ejercicios PHP

Resolver problemas de programación requiere de resolver problemas con perspectiva global y también específica.

No te centres en el echo de que el ejercicio te ha pedido los tres números más grandes, centrate en que primero tendrás que ordenar el array.

Si no puedes utilizar la función nativa de PHP rsort() que sirve para ordenar arrays inversamente de manera que te mostraría primero el número más grande y así hasta el número más pequeño, entonces tendrás que crear tú tu propia herramienta.

Tenemos este código

Código PHP:
Ver original
  1. $entrada=array(1,2,3,10,4,5,6,7,48,9);
  2.      
  3.     foreach($entrada as $key=>$value){
  4.        
  5.     }

Como dije anteriormente, en la primera iteración el foreach pasará por la clave 0 y el valor 1.

¿Qué hay que hacer con ese valor?

Evidentemente compararlo ¿pero con qué? ¿Con todo el array o con qué valor del array podríamos compararlo?

Para ello, necesitamos una referencia iterativa de clave externa a foreach.

Así que ya tenemos este código

Código PHP:
Ver original
  1. $entrada=array(1,2,3,10,4,5,6,7,48,9);
  2.     $i=1;
  3.     foreach($entrada as $key=>$value){
  4.        //aquí comparar el valor de la iteración actual con el valor de la siguiente iteración
  5.     }

$i será nuestra referencia externa para cada iteración.
Se iguala a 1 porque no necesitamos comparar el primer valor con el primer valor, sino con el segundo valor del array.

Entonces nos encontramos con otro problema ¿Cómo hacemos para que $i se incremente en cada iteración para que siempre apunte a la siguiente iteración?

Simplemente utilizamos $i++ al final del foreach.

Así que ¿qué código tendríamos en este punto del desarrollo del programa?
__________________
Ayúdame a hacerlo por mi mismo.
  #10 (permalink)  
Antiguo 01/05/2014, 12:12
 
Fecha de Ingreso: abril-2014
Mensajes: 8
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

Cita:
Iniciado por zyxer Ver Mensaje
Bueno, en el que yo hice lo trabajo más o menos así:

Son tres funciones: una que genera el vector, otra que dice cual es el numero mas grande y otra que ejecuta la segunda función, elimina el valor mayor, ejecuta la segunda función, elimina el valor mayor y vuelve a ejecutar la segunda función...

¿Qué piensas?
3 funciones para simplemente comparar?, me parece que estas sobrecargando datos, no hace falta realizar 3 funciones que hagan cosas independientes, bueno cada quien tiene su propia forma de pensar el codigo, esto simplemente fue saber avanzar por el primero y luego saber como asignar el dato actual para lograr comparar con el siguiente no tenia mas.
  #11 (permalink)  
Antiguo 01/05/2014, 12:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: 2 ejercicios PHP

Cita:
Iniciado por Alvarocq Ver Mensaje
3 funciones para simplemente comparar?, me parece que estas sobrecargando datos, no hace falta realizar 3 funciones que hagan cosas independientes, bueno cada quien tiene su propia forma de pensar el codigo, esto simplemente fue saber avanzar por el primero y luego saber como asignar el dato actual para lograr comparar con el siguiente no tenia mas.
Lo hace en tres funciones, entre otras razones, por un principio de programación que suele enseñarse, y que expresa que una función debe ser una tarea atómica, y no múltiple. Esto quiere decir que cuando creas una función para hacer la tarea de crear un vector, no debe contener la de recorrerlo, porque esa tarea es una responsabilidad diferente.

La idea es que te acostumbres a desmembrar un conjunto de operaciones en diferentes funciones, tal que al realizar desarrollos puedas programar con la menos o nula redundancia de tareas desperdigadas en diferentes funcionalidades.
Cuando una misma tarea se repite en diferentes procesos, es mejor atomizarlo, de modo de re-usarlo una y otra vez. Y si esa tarea sufre algún cambio, sólo se cambian en un único código.
¿Se entiende la idea?

Cuando lo aprendes desde el principio, las cosas se facilitan, y se vuelven claras de desarrollar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 01/05/2014, 12:20
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: 2 ejercicios PHP

Cita:
Iniciado por Alvarocq Ver Mensaje
3 funciones para simplemente comparar?, me parece que estas sobrecargando datos, no hace falta realizar 3 funciones que hagan cosas independientes, bueno cada quien tiene su propia forma de pensar el codigo, esto simplemente fue saber avanzar por el primero y luego saber como asignar el dato actual para lograr comparar con el siguiente no tenia mas.
Lo que pasa, querido amigo, es que tu código y el mío son muy distintos:

1) el mío genera el array de forma aleatoria CONFORME A LO QUE DICE EL MANDATO mientras tú le estás dando un vector específico inventado por ti.

2) El mío devuelve los valores en orden, el tuyo no.

3) Al mío se le puede configurar para que devuelva los 3 primeros, 4, 5 o cuanto fueran (que no lo pide el mandato, pero es un detalle que siempre agrada a los profesores).

4) En el mío, si introduces alguna variable incorrecta (por ejemplo, a la hora de generar el array, o algo así) te muestra un mensaje de error.
  #13 (permalink)  
Antiguo 01/05/2014, 12:25
 
Fecha de Ingreso: abril-2014
Mensajes: 6
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

Sinceramente, no tengo ni idea. Los ejercicios que he hecho de foreach son muchos más sencillo y al encontrarme con esto no se por donde cogerlo porque no tengo unos conocimientos básico de este tema para poder probar cosas.
  #14 (permalink)  
Antiguo 01/05/2014, 12:30
 
Fecha de Ingreso: abril-2014
Mensajes: 8
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

Cita:
Iniciado por zyxer Ver Mensaje
Lo que pasa, querido amigo, es que tu código y el mío son muy distintos:

1) el mío genera el array de forma aleatoria CONFORME A LO QUE DICE EL MANDATO mientras tú le estás dando un vector específico inventado por ti.

2) El mío devuelve los valores en orden, el tuyo no.

3) Al mío se le puede configurar para que devuelva los 3 primeros, 4, 5 o cuanto fueran (que no lo pide el mandato, pero es un detalle que siempre agrada a los profesores).

4) En el mío, si introduces alguna variable incorrecta (por ejemplo, a la hora de generar el array, o algo así) te muestra un mensaje de error.
Por lo visto solo has observado el codigo y no miraste el mensaje anterior al codigo fue echo en 2 minutos.

Cita:
Lo hace en tres funciones, entre otras razones, por un principio de programación que suele enseñarse, y que expresa que una función debe ser una tarea atómica, y no múltiple. Esto quiere decir que cuando creas una función para hacer la tarea de crear un vector, no debe contener la de recorrerlo, porque esa tarea es una responsabilidad diferente.

La idea es que te acostumbres a desmembrar un conjunto de operaciones en diferentes funciones, tal que al realizar desarrollos puedas programar con la menos o nula redundancia de tareas desperdigadas en diferentes funcionalidades.
Cuando una misma tarea se repite en diferentes procesos, es mejor atomizarlo, de modo de re-usarlo una y otra vez. Y si esa tarea sufre algún cambio, sólo se cambian en un único código.
¿Se entiende la idea?

Cuando lo aprendes desde el principio, las cosas se facilitan, y se vuelven claras de desarrollar.
En resumen CREAR CÓDIGO RE UTILIZABLE que eso lo sabemos muchos, no hace falta que escribas tanto...
  #15 (permalink)  
Antiguo 01/05/2014, 12:33
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: 2 ejercicios PHP

Yo no lo he resuelto con FOREACH, sino con WHILE (aunque puede que el FOREACH sea el más adecuado), la verdad es que me tengo que poner a trabajar en otro asunto, así que te dejo mi código para que (si no llegas a tener una idea clara de como hacerlo) lo revises y te hagas una idea (pero no le hagas hasta que llegues al borde de la desesperación XD):
Código PHP:
Ver original
  1. <?php
  2.  
  3.     function crearVector($tamano=10, $min=1, $max=100){
  4.        
  5.         $vector=array();
  6.         $i=0;
  7.        
  8.         while($i<$tamano){
  9.             $vector[$i]= mt_rand($min, $max);
  10.             $i++;
  11.         }
  12.        
  13.         return $vector;
  14.        
  15.     }
  16.  
  17.     function elementoMayor($vector=''){
  18.    
  19.         $mayor='';  
  20.         $i=0;  
  21.         $numElementos=count($vector);
  22.        
  23.         while($i<$numElementos){
  24.             if($mayor<$vector[$i]){
  25.                 $mayor=$vector[$i];
  26.                 $mayorId = $i;
  27.             }
  28.             $i++;
  29.         }
  30.        
  31.         if($mayor != ''){
  32.             return $mayorId;
  33.         }else{
  34.             return 'Error';
  35.         }
  36.    
  37.     }
  38.    
  39.     function mostrarMayores($vector='', $n=3){
  40.    
  41.         $return = '';
  42.    
  43.         while($n>0){
  44.             $mayor = elementoMayor($vector);
  45.             $return.= '- El elemento <b>'.$mayor.'</b>, que tiene valor igual a <b>'.$vector[$mayor].'</b><br>';
  46.             unset($vector[$mayor]);
  47.             $n--;
  48.         }
  49.        
  50.         if($return != ''){
  51.             return $return;
  52.         }else{
  53.             return 'Error';
  54.         }
  55.        
  56.     }
  57.    
  58.    
  59.     // Se ejecuta asi:
  60.     $vector = crearVector();
  61.     echo '<b>Para el vector:</b> '; print_r($vector);
  62.     echo '<br><br>';
  63.     echo 'Los elementos de mayor valor (en orden) son:<br>';
  64.     echo mostrarMayores($vector);
  65.    
  66.    
  67.     echo '<br><br><br>';
  68.    
  69.    
  70.     // Otra posible ejecución es esta:
  71.     $vector = crearVector(5, 1, 999); // Es esta se cambia la configura por defecto del array
  72.     echo '<b>Para el vector:</b> '; print_r($vector);
  73.     echo '<br><br>';
  74.     echo 'Los elementos de mayor valor (en orden) son:<br>';
  75.     echo mostrarMayores($vector, 2); // Aquí estoy pidiendo que solo me muestre los 2 primeros
  76.    
  77. ?>

Esto generaría un resultados, más o menos así:
Cita:
Para el vector: Array ( [0] => 56 [1] => 37 [2] => 39 [3] => 54 [4] => 9 [5] => 78 [6] => 77 [7] => 70 [8] => 57 [9] => 58 )

Los elementos de mayor valor (en orden) son:
- El elemento 5, que tiene valor igual a 78
- El elemento 6, que tiene valor igual a 77
- El elemento 7, que tiene valor igual a 70



Para el vector: Array ( [0] => 420 [1] => 753 [2] => 347 [3] => 833 [4] => 986 )

Los elementos de mayor valor (en orden) son:
- El elemento 4, que tiene valor igual a 986
- El elemento 3, que tiene valor igual a 833
  #16 (permalink)  
Antiguo 01/05/2014, 12:36
 
Fecha de Ingreso: abril-2014
Mensajes: 72
Antigüedad: 10 años
Puntos: 5
Respuesta: 2 ejercicios PHP

Cita:
Iniciado por Alvarocq Ver Mensaje
Por lo visto solo has observado el codigo y no miraste el mensaje anterior al codigo fue echo en 2 minutos.
Lo vi, pero te quise explicar los motivos por los cuales uso más funciones que tú.

Cita:
Iniciado por Alvarocq Ver Mensaje
En resumen CREAR CÓDIGO RE UTILIZABLE que eso lo sabemos muchos, no hace falta que escribas tanto...
Y si lo sabes... ¿Por qué criticas al que lo hace?
  #17 (permalink)  
Antiguo 01/05/2014, 12:47
 
Fecha de Ingreso: abril-2014
Mensajes: 8
Antigüedad: 10 años
Puntos: 1
Respuesta: 2 ejercicios PHP

Cita:
Iniciado por zyxer Ver Mensaje
Lo vi, pero te quise explicar los motivos por los cuales uso más funciones que tú.


Y si lo sabes... ¿Por qué criticas al que lo hace?
No fue critica, fue un comentario propio ya que con el tiempo te acostumbras a crear código un tanto eficiente para ciertos lenguajes y terminas por dejar a un lado el código re utilizable.
  #18 (permalink)  
Antiguo 01/05/2014, 12:58
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: 2 ejercicios PHP

Andresiko05 mi email es [email protected]

seguimos por ahí ok?
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: ejercicios, formulario, tabla, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 08:43.