Propuesta metodología para enseñar a programar
Enfatiza Métodos /técnicas
Como generar algoritmos
Método de los refinamientos sucesivos de Wirth Nickaus
Clases Objetos arrays
Excelente guía para Profesores para que enseñen realmente a programar y a solucionar problemas
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Metodologia para resolver problemas con Programacion orientada a Objetos
1. Nota : array es sinonimo de vector o arreglo. Y con arrays de una dimensión
Un array es un grupo de datos del mismo tipos alamacdnados en la misma porción de memoria en
forma contigua, tienen un mismo nombre y una el array tiene una longitud
Se ua para almacenar muchos datos del mismo tipo.
La metodología para solucionar problemas usando la programación orientada a Objetos consiste en
su esquema mas general en :
Se parte de un problema y usando la inteligencia, la imaginación, se empieza a crear un MODELO
que permita convertir el problema en un programa de computador que soluciona el problema.
El proceso de pensar y hacer modelos se denomina ABSTRACCION eso sucede en nuestra mente
y tratamos de escribirlo en le papel.
Nota a pesar de lo largo del ejemplo vale la pena leerlo y hacerlo despacio analizando cada aso.
Los pasos del método son
Paso 1: Realizar Análisis. Establecer requerimientos.
Paso 2: Hacer un Modelo del problema Diagrama de clase.
Paso 3: Hacer un programa de Prueba (principal, main)
Paso 4: Hacer el modelo del problema . Generar los Algorimtos
Paso 5: Codificar Hacer el Programa en Java
2. Paso 6: Probar Paso a paso cada Algoritmo y ajustar
Uso de las pruebas de Escritorio
El proceso es Iterativo y en cada paso se puede devolver al anterior , o dos o tres pasos antes y
hacer ajustes. Incuso dede el paso 6 se debe incuir mejoras , cambios a los algirtimos por ejemplo,
o adicionar otro método al Diagrama de Clase.
Se ilustra el método con un ejemplo
Elaborar un programa que permita manejar Arrays de enteros y que permita realizar todas estas
operaciones en el Objeto Creado:
1 ) Crear el Objeto (constructor)
2 ) meter (adicionar) nuevos enteros
3) buscar un entero x y decir su posición
4) eliminar un entero del array
5) Modificar un dato en una posición dada
6) contar cuantas veces se repite un numero x
7) ordenar los datos ascendentemente
8) ordenar los datos descendentemente
9) hallar el mayor
10) hallar el menor
11) calcular el promedio
12) hallar el numero que mas se repite
suponiendo que solo hay uno que se repite mas.
13) desordenar (aleatoriamente)
14) imprimir los datos
15) invertir los datos
16) determinar cuantos son primos
Se usara el métodopropuesto
Se debe crear un programa (una clase ) que permita almacenar varios enteros, pueden ser 5 o 6
o 20 o miles.
Y se debe poder hacer todas las operaciones que se piden sobre los datos
Cuantos elementos se podrán almacenar ¿
3. Supongamos que el MAXIMO es 5000 pero que se pueden trabajar de 1 a 5000 con la solución que
se genere
Cada uno de las operaciones que se piden es un requerimiento por tanto el problema tiene cerca de
16 requerimientos
Hagamos dos o tres y usted debe hacer los demás como practica
R02 Adicionar nuevos enteros
Descripción
Se deben incluir o adicionar nuevos elementos. Por ejemplo un entero x
Si se tenían n elementos al adicionar uno mas se tendrán n+1
Entrada
El vector o array con n elementos
Resultado
El vector o array con n+1 elementos (el entero x estará de ulitmo)
R06 Contar repeticiones de un entero x
Descripción
Se debe contar cuantas veces se encuentra repetido el numero entero x
Entrada
El vector o array con n elementos y el entero x (que se desea busca y contar)
Resultado
Un entero resultado (con el total de veces que se repite el numero x)
R11 Calcular el promedio
Descripción
Se debe calcular el promedio de todos los números del array
La forma de calcularlo es
Se suman todos los enteros y se divide el total por n (la cantidad de datos en el array)
Entrada
El vector o array con n elementos
Resultado
Un real resultado ( con le promedio)
R12 Encontrar el numero que mas se repite
Descripción
Se debe mirar/buscar/ descubrir una forma de calcular cual es el numeor entero que mas se
repite (se supone que solo hay uno que es el que mas se repite)
Entrada
El vector o array con n elementos
Resultado
Entero r ( r será el numero que mas se repite)
4. R16 Calcular cuantos números son primos
Descripción
Se debe mirar cada uno de los números del array y determinar si es primo e ir contando los que
sean primos
Entrada
El vector o array con n elementos
Resultado
Un numero entero r (r es la cantidad de números primos)
Observe que solo se hicieron unos cuantos requerimientos .
Haga los otros usted (no haga el R01 esto de hacer constructores es algo que todo objeto o
programa que se cree debe tener , por tanto se enseñara a crearlos y simplemente siempre haga
los constructores de su objeto es parte de la Programacion orientada a Objetos POO
5. MiVector
- Constante int MAXIMO=5000
- int n
- int []
-
MiVector()
MiVector(int nro)
Adicionar(int x)
int buscarP(int x)
boolean eliminar(int x)
boolean modificar (int p, int x)
int contarepeticiones(int x)
ordenarAsc()
ordenarDesc()
int mayor()
int menor()
double promedio()
int hallarMasrepetido()
desordenar()
imprimir()
invertir()
int contarPrimos()
String toString()
El constructor
Retorna -1 si no lo
encuentra y la posición si lo
encuentra
True si lo elimina false si
no lo elimina
Reemplaza el dato de la
posición p por x.
Aquí se trata de :
ASUMIR que ya se hizo el programa, ya se soluciono el problema, ya existe la clase, se pueden
crear objetos y hacer un programa principal
public static void main(String [] args){
MiVector miv= new MiVector(); // Se crea
miv.poblar(); // se llena aleatoriamente con 20 o 30 numeros enteros
6. // este método falta se puede incluir en el diagrama de clase
miv.adicionar(14); // se incluye el 14
miv.adicionar(28); // se incluye el 28
miv.adicionar(6); // se incluye el 6
miv.eliminar(28); // se elimina el 28
miv.imprimir(); // se imprimen los datos
miv.ordenarAcs(); // se orden asendentemente
miv.imprimir(); // se imprimen los datos
miv.desOrdenar(); / se desordenan
System.out.prinln(“EL MAS REPETIDO ES “ +miv. hallarMasrepetido());
}
Hasta aquí que se ha logrado:
Se ha analizado el problema y se tiene comrendido lo que se esta pidiendo
Que haga (de que se trata el problema)
Siendo mas exactos también se ha avanzado un poco en la solucion
Se trata aquí de mirar cada método del Objeto (la clase) y determinar cuales son fáciles
Un método faciil es aquel que sin necesidad de hacerlo yo puedo iamaginarme el código en mi
mente, son pocas líneas, y además es claro
Pero si no logro “ver” el algoritmo es mejor hacerlo aquí.
Para iluatrar que se debe ir haciendo y probando paso a paso
Se creara la clase , se hara el método poblar() y se imprimirá
Para ello se requiere
El constructor MiVector()
poblar()
String toString()
E imprimir()
public class MiVector {
public static final int MAXIMO=5000;
private int n;
private int datos[];
public MiVector() {
datos = new int[MAXIMO];
n=(int)(Math.random()*20)+10;
System.out.println(n);
}
public MiVector(int nro) {
datos = new int[MAXIMO];
n=nro;
}
public void poblar(){
for (int i = 0; i < n; i++) {
datos[i]= (int)(Math.random()*20)+10;
}
}
OBSERVEQUE HAY DOS
CONSTRUCTORES
UNO Que establece el
numerode datosen forma
aleatoria
EL OTRO:recibe el numero
de datos comoun parametro
7. public String toString(){
String r="";
r= " numero de datos n: " + n +"n";
for (int i = 0; i < n; i++) {
r= r+ datos[i]+ ", ";
}
return r;
}
public void imprimir(){
System.out.println(this.toString());
}
public static void main(String [] args){
MiVector miv= new MiVector(); // Se crea
miv.poblar(); // se llena aleatoriamente con 20 o 30 numeros enteros
// este método falta se puede incluir en el diagrama de clase
miv.imprimir(); // se imprimen los datos
}
}
Observe bien
Las propiedades incluyendo la constante esta en amarillo
Los constructores (hay dos ) están en verde
Y los métodos incluyendo el main (de prueba) esta en verde
Correr este programa podría mostrar esto
Algunos algoritmos son fáciles y se usa herramientas o esquemas fáciles para hacerlos otros son
mas compilciados y usaremos el método de los refinamientos sucesivos para hacerlos
Por ejemplo
Adicionar() es facil
Siempre se quiere que el numero adicionado quede de ultimo
public void adicionar (int x){
datos[ n ]=x;
n++;
}
Se incluye en la clase (programa)
8. Y se prueba en el main
Adicionando el 14, el 28 y el 6
Se ejecuta
Y puede dar esto
Observe que los últimos son 14,28 y 6
Y asi se van haciendo cada uno de los métodos y se va probando PASO A PASO
Con disciplina.
Eso es lo se quiere decir en el Paso 6
Y allí continuaremos poco a poco haciendo cada Metodo y probando Paso a Paso
EL METODO SIGUIENTE de laclase PARA HACERY PROBARes
9. correspondienteal requerimientoR03
para buscar un enterodadox
se tiene encuentaque
si no se encuentrase dara un -1
si se encuentrase retornarala posicióndonde se encontró
asumiendoque noesFacil esdecirque no se “VE” el códigoo el algoritmo
utilizaremosdoselementosparahacerlo
el diagramade Entrada ProcesoSalida y
refinamientossucesivos
el métodoes
int buscarP(int x) Revise el requerimiento bien
No se colocaque entrael Array porque se dispone de el al seruna propiedaddel Objeto
SI SE LOGRA HACER ESTE DIAGRAMA definiendomuybienlaentrada,definiendomuy bienel
resultado(r) y colocandolaideade recorrery comparar EL METODO YA ESTA CASI RESUELTO
SI LA IDEA NO SE OCURRE ES DECIR NO TENEMOS IDEA DE QUE COLOCARALLI
INTENTE RESOLVERVARIOSEJEMPLOSA MANO Y MUY DESPACIOY HAGA TANTOSCOMO
REQUIERA HASTA QUE SURJA ALGUNA IDEA.
Esa ideaeslo que llamamosel PRIMERREFINAMIENTOo REFINAMIENTO# 1
10. LOS REFINEMIENTOS SE PUEDEN HACER EN PAPEL y se van descartandoenlamedidaque se
van haciendocadave mejoresymas detallados
Ahoraextractemos del DiagramaEPSel refinamientonumero2
REFINAMIENTO# 2
intbuscar( intx)
Inicio
Enteror=-1
Recorra todosloselementosdel arraydatosde 1 en1
Si uno de losdatos esigual
Coloque r= la posiciondel numero
Y salgase del recorrido
Retorne r
FIN
REFINAMIENTO# 3
intbuscarP( intx)
Inicio
enteror=-1
Para i de 0 a n-1 haga
Si datos [ i ] = X
r= i
salgase del ciclo
finsi
finpara
retorne r
FIN
USO DE LA PRUEBA DE ESCRITORIO
El objetivoesprobarel algoritmoantesde codificarparaversi funcionayno perdertiempo
cuandose haga el programa
Supongamoslossiguientesdatos
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
11. Uy Y sigamosel aglritmosinsturccionporintrucccion yse vancolocandolosvaloresenla tabla
de abajo
Supongamoigualmente que el valorabuscarX es igual a 23 ( n vale 16)
Y se entraal ciclo i vale 0 al iniciarel ciclo n = 16 r = -1
Se comapra datos[ 0 ] con 23 y no esigual , y nose hace nada y se sigue avanzando
Y se repite cni = 1 i=2 yasi sucesivamente hastallegar 9
X i r n
23 0 -1 16
1
2
3
4
5
6
7
8
9
Cuandose llegaa nueve se compara25 con 23 y no sonigualesse pasai a 10
10
Y se compara 23 (el datode laposición10 ) con X (=23 ) y si soniguales se coloca r=i
9 10
Y se sale del ciclo
Y retorna r que vale 10 (la posicion) SIFUNCIONA!!
Conviertiendoel métodoajavaquedaasi:
REFINAMIENTO# 3
intbuscarP( intx)
Inicio
enteror=-1
Para i de 0 a n-1 haga
Si datos [ i ] = X
r= i
salgase del ciclo
finsi
finpara
retorne r
FIN
Y EN JAVA SERIA
intbuscarP( intx)
{
iInt enteror=-1;
for (inti=0;i<n;i++){
if (datos[ i ] == x){
r= i;
break;
}
}
returnr;
}
12. Revise biencadalíneadel algoritmo(refinamiento#3) y del métodoenjava
Son casi iguales.
Entoncesque sonlos refinamientos sucesivos?
Se modificael mainpara probar
Esta podría ser lasalida
una vezresueltoeste intbuscar(intx) que retorna unint(con laposición) podemos
Hacer este que retornatrue si estay false si noesta
publicbooleanbuscar(intx){
return(buscarP(x)>=0);
}
y pasamosal métodosiguiente
13. correspondiente al requerimientoR05 el de eliminar R04 esmas difícil y losdifícilesse van
dejandoparalo ultimo.
Es muy fácil
publicbooleanmodificar(intpos,intx){
si se excede laposiciónde losdatosque hay(n)
nose puede (false)
encaso contrario
locambia y retornatrue
}
publicbooleanmodificar(intpos,intx){
if(pos>=n)
returnfalse;
datos[pos]=x;
returntrue;
}
Se incluye enel maini se prueba
14. Y se continua con losdemásmétodosde laclase
Los demásmétodosse puedenresolverconlaInformacion que se da aquí y las instrucciones
Los demásmétodosse dejancomoejerciciosytallereshágalosyestaráenlavia de aprendera
programar , solucione otrosproblemasusandoel método propuesto yestaráenla viade la
soluciónde problemasconel computadoryaprendiendorealmente aprogramar
peromerecenunaespecial atenciónlosmétodos:
int contarPrimos()
y
int hallarMasrepetido()
estosdosmétodosilustranotrasmas recomendacionesparageneraralgorimtos
especialmentelostips YLAS TECNICAS
Los refinamientossucesivosparageneraralgorimtosyprogramas(métodos)
evaluarvariasideasyelegiruna( la mas practica,fácil,agil?)
el métodoes
intcontarPrimos
inicio
enterocontador=0
retorne contador
fin
Se mete enel mainlas instruccionesparaprobar
NO SE REQUIERE
DE MUCHO CONOCIMIENTONI
MUCHA EXPERIENCIA
PARA ESTABLECER QUE EL METODO
DEBE SER ASIY DEBE TENER UN
CONTADOR DONDE CONTARA OS
PRIMOS Y LO RETORNARA
Refinamiento #1
15. REFINAMIENTO# 2
intcontarPrimos
inicio
enterocontador=0
se recorrerántodoslosdatosdel array y
se ira mirandosi cada uno esprimo
loesse cuenta
finde la parte que hace el recorrido
retorne contador
fin
REFINAMIENTO# 3
intcontarPrimos
inicio
enterocontador=0
para de i de 0 a n-1 haga
si el datos[i] esunnumeroprimo
cuente (contador++)
finsi
retorne contador
fin
REFINAMIENTO# 4 Y EN JAVA
intcontarPrimos
inicio
enterocontador=0
para de i de 0 a n-1 haga
si esPrimo( datos [ i ] )
publicintcontarPrimos(){
intcontador=0;
for (inti = 0; i < n; i++) {
if (esPrimo(datos[i] ) ) {
contador++;
Es obvioque para sabercuales
son primosse debenmirar
todos
Comose hace un reccorido
de un arrya con varios
datos?
Con unfor
16. contador ++
finsi
retorne contador
fin
}
}
returncontador;
}
Obviamente la función(método) esPrimo (…) no se ha hecho
Para versi un numeroXesprimo booleanesPrimo(int nro)
Se debe mirarsi tiene algúnnumeroque lodividaque noseani 1 ni el mismo(X)
REFINAMIENTO·#1 y EN JAVA
booleanesPrimo(intnro) {
booleanr=true;
se mirasi hay numeroentre 2 y n-1
que dividael numeroX
si lohay coloque r=false;
y retorne (salgase yretorne false)
}
}
Retorne r;
}
publicbooleanesPrimo(intnro) {
boolean r=true;
for (inti = 2; i < nro;i++) {
if(nro%i==0){
r=false;
break;
}
}
returnr;
}
Se incluyenlosdosmétodosenel programa(clase MiVector)
OBSERVEY RESPONDA
17. De que depende el numerode repeticiones?
Siguiendo…Se mete enel mainlasinstruccionesparaprobar
Y la salidapuede seresta
El otro métodonoestan fácil y esun ejmploparapensarun poco
La preguntaescomoobtenerle numeroque masse repite??
Pensemosenalgunaidea
18. que entra
en teoríalos datosdel arrya (nohay que colocarloscomoentrada) son el objeto
y se puedenusarentodoslos métodos
cual esel resutlado? Un enterocouyo valores el del numeromasrepetido
se supone solohayuno.
E P S
IDEA enteror
INICIO
?
FIN
Algunaidea??
Imeginemosunarray (arreglo ) asi n=28
O quizasunomas grande con 500 numerosenteros
Comohace para determinarel numeroque masse repite sinequivocarnos?
Comopodemosverse podría aprovechary observarhastaque finalemente despuésde un
largorato descubramosel 43 o el 48 que estándos vecesnohayotro que se repitatresveces
?
En este ejemplohaydosque se erpitendosvecesperoen nuestroproblemasuponemoque
solohay unoque se repte mas veces
Perocomo lograraveriguarlo? De que forma? Cualmseriael método?
Nuevamentecual eslaidea?
E P S
19. IDEA enteror
INICIO
?
FIN
Generemos
Por ejemplo que tal esta
Si los ordenamosde menoramayor?
Entoncesquedaríantodoslosigualesjuntosyseriamuy fácil establecerel que masse repite.
Y si son tresmillonesde números.Se ordenanperosonmuchosy visualmenteyonose
podrán“ESTABLECER” losrepetidos (visualemente)
Entoncescomo hacer?s vamo
Que tal nos vamoscontandodesde el primeroycada que el valorcambie dejamosde contary
si la cuentaes mayorque una que ya traimos, nos quedamosconestaultima(el numero,yla
cuenta) y si hasta al final .
Por ejemploeneste
6 11 11 12 13 14 14 14 14 14 19 20 23 24 28 28
Contamos 6 1
11 2 nos quedamoscon11 y 2
12 1
13 1
14 5 nos quedamoscon14 y con 5
19 1
20 1
23 1
24 1
28 2
La respuestaes14 (porque se repite 5veces) esel masrepetido
20. Aquí ya tenemosunaidea. LlamemoslaOrdenarYcontar
Peroque tal estaotra idea
Que tal si tomamosel primeroel 6 y contamoscuantasvecesesta
Y colocamoseste dato enotro vector asi y lomarcamos
11 23 20 28 12 14 14 13 14 14 19 11 24 14 28 6
marcas
x x x x x x x x
nrosUsados
11 23 20 28 12 14 13
totales
1 1 1 2 1 5 1
0 1 2 3 4 5 6 7 …
Y asi hasta contarlostodossincontar dos veceslosque yaestánmarcados
Y luegohalamosel mayorde array totalesyel que este enla posiciónde ese mayorese es.
Por ejemplo el mayor 5 corresponde ala poicion5 entotal y el numeroque estaenesa
posiciónennrosUsadosesel 14 ese esel numeromasrepetido
Escogemoslaopción1 de ordenar yContar por parecermas simple
No tiene que crearotrosarryas ni marcar ni nada asi que esmas simple
Ya tenemosunaidea
E P S
IDEA enteror
INICIO
Se ordenaenforma ascendente
Se recorre de 0 a n-1 losdatos
21. Se va contado
Si el numeroque se estaprocesandoes
Igual al anteriorse cuenta
Sino
Hay rompimiento
Se mirasi el contadorde repeticiones
Es mayorque el ultimoque se guardo
Si loes se guarda este contadory el numero
De todasformaspor haberrompimiento
De cambiael contador en1 y
El dato a procesaro a contar
FIN
REFINAMIENTO#2
Entero hallarMasrepetido()
INICIO
Enteror= 0
Ordene losnumerosascendentemente
Declare lasvariablespara contrloar
Una para el contador
Otra para el contador mayor
Una para llevarel datoque se estacontando
para i de 0 a n-1 )
si ( si se trara del mismonumero)
cuente
sino //hayrompimiento
mire si debe guardarel contador porque esmayor
inicialice todoel contador
y el dato a contar
finsi
finpara
22. r= el dato del contadorcon el valormas alto
retorne r
FIN
REFINAMIENTO#3
Entero hallarMasrepetido()
INICIO
Enteror= 0
ordenar()
EnterodatoEmproceso=datos[0]
EnterodatoMayor=datos[0]
Enterocontador=0
EnterocontadorMayor=0
para i de 0 a n-1 )
si (datos[i]==datoEmproceso)
contador++
sino //hayrompimiento
si (contador>contadorMayor){
contadorMayor=contador
datoMayor=datoEmproceso
finsi
datoEmproceso=datos[i]
contador=1
finsi
finpara
r= datoMayor;
retorne r;
FIN
23. EL programafinal enjavaquedaasi
publicinthallarMasrepetido(){
int r= 0;
ordenar();
int datoEmproceso=datos[0];
int datoMayor=datos[0];
int contador=0;
int contadorMayor=0;
for (inti = 0; i < n; i++) {
if(datos[i]==datoEmproceso){
contador++;
}
else{ //hayrompimiento
if(contador>contadorMayor){
contadorMayor=contador;
datoMayor=datoEmproceso;
}
datoEmproceso=datos[i];
contador=1;
}
}
r= datoMayor;
returnr;
}
El métodoordenaresmuysimple aprovechanalgunasopcionesyaconstruidasenjava
publicvoidordenar(){
java.util.Arrays.sort(datos,0,n);
}
Este métodopermite ordenarunarray.
Se incluye enlaclase y se prueba
24. Buenoesoestodo losdemásmétodosse dejanal lectorcomoejerciciosde comohacer
métodos(apliqueloindicadoeneste Articulo)
https://es.wikipedia.org/wiki/Resoluci%C3%B3n_de_problemas_de_programaci%C3%B3n
Este sitioeninternetle muestrayexplicael usode lasestructurasalgorítmicasusadaspara
construiry generarlosalgoritmos :condicionales,ciclos,
https://1buenanuevas.wordpress.com/2011/08/28/3-estructuras-condicionales-if-for-while-
do-while-switch/
http://es.slideshare.net/diegoandresalvarez/04-sentenciasdecontrolcondicionalesyciclos
Estos explicalasinstruccionesenjavacomo se escribensintaxisyejemplosde uso
http://www.ticbeat.com/tecnologias/mejores-metodos-intensivos-para-ser-programador-
profesion-auge/
25. Se justificaporque aprenderaprogramar enforma rápida.Y como laspersonaspuedenpagar
hasta 12.200 dólarespara aprenderaprogramar El métodoeneste artículo enseñaa
solucionarproblemasygenerarsolucionescon programación
Cómoprogramar enJava, novenaedición. Paul Deitel,harveyDeitel
http://www.fiuxy.net/ti-programacion-webmasters/4191894-como-programar-en-java-deitel-
7-y-9-edicion-pdf.html
se recomiendanestosdoscapítulos
http://www.ehu.eus/~ljrf/AED/2010/practicas/lenguaje_C/StepwiseRefinement_Wirth.pdf
este articuloclásicode withNilausde 1971 explicalatécnicade los refiamientossucsivos
para generar/construri algorimtosesexcelente .Ydefinitivamente lamejordescipcionde
como hacemosalgoritmosennuestramente cuandohacemosprogramas
videosútiles
presentranotrametodologíade soluciónde problemas peropuedenserútilesparaentender
condicionales,ciclosetc..conventanas
https://www.youtube.com/watch?v=X9iOu0-d27A introducciónaalgorimtos
https://www.youtube.com/watch?v=BSQfVoAsd2g estructurassecuenciales
https://www.youtube.com/watch?v=7wgkkWW9LAY condicional simple
https://www.youtube.com/watch?v=nCTysXv-GW0 condicional anidado
https://www.youtube.com/watch?v=siv01IaWPsE el switch