Me estoy desesperando

Iniciado por folostia, 25 Octubre 2011, 20:20 PM

0 Miembros y 1 Visitante están viendo este tema.

folostia

Hace tres semanas que empecé un ciclo superior de desarrollo de aplicaciones multiplataforma.En general me va bien (bases de datos,lenguajes de marcas...) pero el problema es programación !!

Empecé con mucha ilusión haciendo pseudocódigo y diagramas de flujo y más o menos lo entendía,no todo pero me las apañaba.Desde hace dos semanas empezamos a programar en C y es cuando vinieron mis problemas.Las cosas muy básicas las hago sin problema,pero cuando nos mandan hacer ejercicios en casa lo intento pero no me salen!! a mis compañeros les sale (también es cierto que algunos ya sabían programar de antemano,no como yo...) pero a mi cuesta,no soy capaz de visualizar el programa.

A vosotros os pasó lo mismo cuando estabais aprendiendo0 ¿cuánto tardasteis en aprender? yo me estoy desesperando porque veo que no avanzo y mis compañeros si.

PD:nos mandan ejercicios tipo:"introduce un nº y calcula los números primos hasta ese nº" o "haz el producto de dos números mediante suma".



Un saludo
"Antes de que un software pueda ser reusable, primero ha de ser usable." (Ralph Johnson)
Usuario Linux:547941

skapunky

Mira una recomendación que te doy es que la programación no todo es arremangarse y escribir codigo. Una persona que lleve muy bien las matematicas puede hacer un programa mucho mas optimizado y sencilla que alguien que sepa programar mucho pero no lleve bien las matematicas.

No te desesperes ya que la programación es practica y no todo el mundo lo hace al mismo ritmo. Te pondré un ejemplo muy bueno:

Imagina que te piden hacer un programa que sume los primeros N numeros, por ejemplo:

N= 3 seria 1+2+3 = 6.

Una persona que sabe programar bien, pero no tiene ni puñetera idea de matematicas hará lo siguiente con el típico bucle FOR gastando en cualquier lenguaje varias líneas de codigo:


dim x as integer
.......
For x = 0 to N
x = x +1
next x
.....


El que sepa matematicas pero no sepa programar tanto, con una simple línea lo calcula sin hacer estructuras repetitivas, fijate en esta formula:

x = (n*(n+1) / 2

El resultado directo en una sola línea y sin saber demasiada programación  ;). Ánimos!
Killtrojan Syslog v1.44: ENTRAR

folostia

¿pero esto es cuestión de tener paciencia y practicar mucho o mejor me tiro? En cuanto a matemáticas no soy malo del todo,acabé bachillerato este año y me acuerdo de bastantes cosas
"Antes de que un software pueda ser reusable, primero ha de ser usable." (Ralph Johnson)
Usuario Linux:547941

skapunky

Practica, cuanto mas practiques mas soltura cogeras. Una vez te aclares bien con las estructuras basicas el resto será cuestión de agilidad/organización mental. Recuerda que un programa que resuelve un problema puede estar resuelto en codigo de muchas formas distintas.

Te recomiendo que busques programas por internet que sean de resoluciónes matematicas, por ejemplo calcular el factorial de N, calcular una serie de fibonacci, calcular el numero de numeros primos hasta N....

En el foro hay una sección de ejercicios (subforo) donde podrás encontrar problemas orientados a las matematicas.
Killtrojan Syslog v1.44: ENTRAR

folostia

Cita de: skapunky en 25 Octubre 2011, 21:43 PM
calcular el factorial de N, calcular una serie de fibonacci, calcular el numero de numeros primos hasta N....


Eso es justo lo que estamos dando y tanto me cuesta ver!!
muchas gracias
"Antes de que un software pueda ser reusable, primero ha de ser usable." (Ralph Johnson)
Usuario Linux:547941

[Case]

Creo que es mas que nada la forma en que pensamos. Yo empece a programar desde hace ya 2 años. Para ser te sincero nunca he tenido problemas para programar los problemas básicos.

Necesitas dar esa formación a tu mente, y eso solo se consigue practicando.

Aikanáro Anário

#6
Cita de: skapunky en 25 Octubre 2011, 20:54 PM
Mira una recomendación que te doy es que la programación no todo es arremangarse y escribir codigo. Una persona que lleve muy bien las matematicas puede hacer un programa mucho mas optimizado y sencilla que alguien que sepa programar mucho pero no lleve bien las matematicas.

No te desesperes ya que la programación es practica y no todo el mundo lo hace al mismo ritmo. Te pondré un ejemplo muy bueno:

Imagina que te piden hacer un programa que sume los primeros N numeros, por ejemplo:

N= 3 seria 1+2+3 = 6.

Una persona que sabe programar bien, pero no tiene ni puñetera idea de matematicas hará lo siguiente con el típico bucle FOR gastando en cualquier lenguaje varias líneas de codigo:


dim x as integer
.......
For x = 0 to N
x = x +1
next x
.....


El que sepa matematicas pero no sepa programar tanto, con una simple línea lo calcula sin hacer estructuras repetitivas, fijate en esta formula:

x = (n*(n+1) / 2

El resultado directo en una sola línea y sin saber demasiada programación  ;). Ánimos!


Curiosidad....
Quien domina bien las matemáticas le salen estas cosas así de la cabeza y punto o se llega a soluciones como esa usando ecuaciones, series... etc

Bueno, ahora que ya has puesto la función, me doy cuenta de que podría crear esa función, obtienendo valores para un número y hacer una relación entre y e x, gráficar la función, ver la forma que tiene y desarrollar la ecuación y obtener la función.

Por ejemplo:

El número 5: el resultado de sumar los números naturales anteriores a 5 será:
5, 5+4+3+2+1
5, 15

Para el 6 tenemos:
6, 6+5+4+3+2+1
6, 21

Para el 4 tenemos:
4, 4+3+2+1
4, 10

Entonces eso podrían ser puntos de una función, la función que me dará la suma de los números naturales anteriores a 5, a 6 y a 4.

Es como si le digo con el valor 5, la función me debe dar un 15, con el 6 un 21 y con el 4 un 10.
Entonces se puede hacer una relación y decir que el 5 va a ser X y el 15 Y; hacer lo mismo con las otros puntos.
Si graficamos esos puntos tenemos, esta gráfica

Que aunque tiene una pequeña curvatura, se parece más a una línea recta y la ecuación que define una línea recta es: y=ax+b, aquí hubiera cometido un error desarrollando mi algoritmo, pero como ya sé que el algoritmo es: y = x(x+1)/2, eso tiene un término cuadrático (al multiplicar x(x+1) que da x2 + x), entonces sé que no es una línea recta y por lo tanto no se usa la ecuación anterior, sino la que define una parábola, porque si una función o ecuación tiene grado 2 (érmino cuadrático), su gráfica necesariamente dará una parábola, entonces debo usar la ecuación que define una parábola: y=ax2+ bx+c
Y ahora sí puedo usar los puntos que tengo.

Nota: cuando se graficaban solamente esos tres puntos [(5,15)(6,21),(4,10)] se veía como si fuera una línea recta, pero para tener más seguridad y presición, es mejor graficar más puntos y de hecho, si los graficamos vemos que se va formando la parábola, o también es mejor graficar empezando desde 0 porque se ve mejor el curso que toma la gráfica y eso es lo que nos interesa para saber que ecuación usar.
Gráfiquemos desde 0 hasta 4:
(0,0),(1,1),(2,3),(3,6),(4,10)
y tenemos esta gŕafica

Como se ve, es una parábola, no tiene parte negativa porque no incluimos los números, pero se puede confirmar totalmente añadiendo más puntos hacia la izquierda, negativos, o graficando la función que ya sabemos que nos dará: y=x(x+1)/2

Usamos la ecuación y=ax2+bx+c con cualesquiera tres puntos de los que tenemos, podemos usar los primeros tres por facilidad y comodidad, pero yo voy a usar los del principio:
(5,15),(6,21),(4,10)

15 = a(5)2+b(5)+c
21 = a(6)2+b(6)+c
10 = a(4)2+b(4)+c

Y con eso tenemos un sistema de ecuaciones, básicamente con eso lo que estamos diciendo es que nos cree una función o ecuación que cuando le pasemos 5 me de como resultado un 15 (por que ya sabemos: 5 = 4+3+2+1 = 15) y lo mismo con los otros números, pero que pasa? que si funciona con esos tres números como la ecuación pertenece a una parábola y es continua y constante, pues también va a funcionar con todos los números, así que ya solamente tenemos que resolver ese sistemas de ecuaciones para que nos quede
y=1/2(x2)+1/2(x)
que haciendo unas cuentas operaciones, nos queda:
y=1/2(x(x+1)
que es exactamente lo mismo que dijo skapunky.

Lamento haberme extendido tanto, y repetir tanto lo mismo, solo decía las cosas como me salían de la cabeza :P, pero creo que esa es una forma de obtener algoritmos (ya a mi me ha funcionado un par de veces). Pero por lo general, soy muy malo haciendo algoritmos optimizados, lo que una persona resuelve con unas cuentas líneas de código a mi me toma el doble. Por ejemplo el algoritmo de números primos, yo nunca lo pude hacer, tuve que copiarmelo de internet xD

¿y ahora quién dice que las matemáticas no son de ayuda?  :xD
Lo que faltaba en internet: http://binar10s.blogspot.com/

skapunky

Si quieres te explico como desarrolle esa función (e.e donde ta el foro de matematicas   :laugh:).

Mira, el enunciado seria: Calcula el resultado mediante una función que calcule el sumatorio de todos los numeros hasta uno llamado N.

Fijémonos que se trata de una sucesión de números seguidos, es decir tenemos:

1+2+3+4+......+ (N-1) + N.

Asignaremos el ejemplo en un caso practico, por ejemplo N = 6 (para no hacerlo largo), entonces tenemos:

1+2+3+4+5+6

Que en el fondo es como se ha dicho  una serie de 6 elementos, ahora operemos con la serie entera haciendo lo siguiente para extraer la conclusión que detallaré:

  1+2+3+4+5+6
  6+5+4+3+2+1 
+_____________
  7+7+7+7+7+7

Es decir (7+7+7+7+7+7) equivale a multiplicar 6 veces siete, no?  ;-), con la conclusión que de momento tenemos una parte de nuestra formula

6*7 ------> Fijate -------> 6*(6+1).

Ahóra, si sabemos un poco de series (la verdad no me acuerdo demasiado) habia un teorema que hablava sobre la inversión de series. Al tratar la serie como un solo elemento se puede tratar como un número donde en el fondo es como hacer una media. Es decir: realizemos la media de la serie con el resultado anterior:

Citar(6*7)/2

Con lo que tenemos:

(6*(6+1))/2 -----> Donde queda demostrada la formula inicial: (n(n+1))/2.

A partir de aquí prueba otros numeros, por ejemplo N=20 o N=100, siempre se cumple  ;-) por lo que tenémos una expresión matemática en forma de función para este calculo concreto que no deja de ser:

F(x) = Y = (x(x+1)) / 2
Killtrojan Syslog v1.44: ENTRAR