MrCell escribió:Gracias![]()
Hay mucha diferencia entre C y C++?
MrCell escribió:Gracias![]()
Me estoy mirando C++ y como a todo se le tiene miedo jeje.
Hay mucha diferencia entre C y C++?
maponk escribió:
Dos signos de +.........
Si ,es malo,pero lo tenia que decir.....![]()
![]()
![]()
MrCell escribió:jjajajajjaa muy buena![]()
Empezaré primero por C y luego C++
d34th escribió:Yo te recomiendo C++ directamente, all principio no te tendras que pelear con cosas memoria dinamica (vector, string...) ni con punteros para el paso de parametros
Tambien esta bien java (aunque lo he tocado muy poco), tiene un cierto parecido a C++, pero no te permite tantas guarradas
Python no te lo recomiendo para nada para aprender, primero por que la sintaxir es muy "debil" y luego con cualquier, aunque te obliga a indentar bien el codigo (error bastante comun en la gente que empieza a programar) pero especialmente por que no tiene tipos, ni es necesario declarar variables y eso puede hacer que cojas muy malos habitos
MrCell escribió:Creo que te haré caso jeje.
Empezaré directamente con C++ aún que sea duro![]()
Me he mirado manuales y seguramente me compraré algun libro.
Muchas gracias a todos![]()
Yo soy (casi) ingeniero y en la carrera en primero me enseñaron Python... luego C, ensamblador, C++ y PHP entre otros, pero el primero para los novatillos es Python, que como dije en posts atras, es menos quisquilloso.
Razorblade escribió:Aquí cada uno opina una cosa, pero lo que está claro es lo que dijo amuchamu:
A los ingenieros de teleco se les enseña Pascal. A los ingenieros de informática, ADA.
Y luego ya se da el paso a C, Java, ensamblador, .. y todo lo demás.
Es porque Pascal y ADA te estructuran la cabeza, y se aprende a programar de manera correcta con ellos.
MrCell escribió:jjajajajjaa muy buena![]()
Empezaré primero por C y luego C++
JAPosti escribió:Yo optaría por empezar con C y continuar con C#.
zheo escribió:Y ese cambio? Para eso empiezas con c++ haciendo algo de prog estructurada y clases, y luego ya vas a lo fácil.
Nulukkizdin escribió:zheo, python tiene tipado fuerte.
lo que en realidad hace por dentro también puedes investigarlo en python... si te interesa
En C++ por suerte existen las referencias y los iteradores, que te abstraen un poco de todo eso.
AuRoN344 escribió:Java es realmente intuitivo, todo son objetos. Todo es a base de 'news', olvidandote de rollos de punteros, direcciones de memoria, etc.
Es ideal para los n00bs![]()
AuRoN344 escribió:En java todo son punteros, si, pero no hay que declararlos de la misma manera que en C. Si el autor del post se lia con C con tanto '*' y '&' siempre puede empezar con java, que como he dicho, todo se reduce a news (que si, que un new no es mas que un puntero al heap, pero vamos, es mas intuitivo que C).
...
No si llevas razon, claro. Aprendiendo C aprendes mucho mas y te familiarizas con la mecanica que realmente se lleva en muchos lenguajes de programacion. Yo lo decia por si al autor del post le costaba mucho C y no lo entendia, si lo que queria era programar, que siempre podia 'desviarse a otras ramas' como Java.
zheo escribió:He querido decir tipado estático
a = "hola amigo"
b = ", que tal?"
c = 34.56
print (a+b)
b = c
print (a+b)
Y tenemos un pete
El problema no es que te interese, el problema es que es algo que se debe saber, al menos a un nivel básico.
Y estos lenguajes te lo ocultan. No son buenos para el principiante.
Pues no se cómo vas a mínimamente entender las referencias y los iteradores sobre todo, sin saber lo que son los punteros...
Al contrario, hay que saberlo a un nivel avanzado, cuando ya sabes programar.
Estos lenguajes te lo ocultan. Son buenos para el principiante. Te abstraen de peculiaridades del lenguaje sin importancia PARA LO QUE QUIERES EN ESE MOMENTO, que es aprender a programar. He visto docenas de alumnos dejar Introducción a la Programación frustrados por este motivo. Podían aprender a programar pero se quedaron en sumar direcciones de memoria.
Por su interfaz. Se llama abstracción. Es como si dijeras "pues no sé cómo vas a usar la clase map si no sabes cómo está hecha internamente". Sé usarla porque tiene una interfaz que me da lo que necesito para trabajar y no más. Si quiero más, ya me preocuparé de mirarlo... si me apetece. Es lo bueno de la abstracción, te permite centrarte en lo que interesa.
zheo escribió:yo pongo ese código en el intérprete de comandos o en un IDE y le doy a run, y peta cuando llega a esa línea
Y para saber lo que estás haciendo y cómo lo haces, es necesario saber como funcionan.
Para aprender a programar no necesitas sumar direcciones de memoria. Tampoco para aprender a usar punteros y lo que significan.
Y si se frustran por eso, pues a lo mejor es que no sabían dónde se metían en realidad.
los punteros no son particularidades del lenguaje.
Me parece que yo estoy hablando de programar y tú estás hablando de picar código.
Yo me refiero a saber lo que estás haciendo.
Si no sabes lo que hace por dentro la clase map (y no me refiero a saber implementarla), es decir, si no sabes lo que es un diccionario y las particularidades que tiene
Nulukkizdin escribió:pues eso, un error sintáctico. si fuera un error en tiempo de ejecución, no te saldría ningún mensaje, petaría el programa y ya está. No veo qué problema hay con eso. ¿No es bueno que dé un error sintáctico cuando intentas sumar datos de distinto tipo? Es muy lógico. Las variables son eso, variables. Como en matemáticas. Ahora le meto un entero, ahora una cadena, ahora una lista. Bien. El problema viene cuando intentas sumar cosas que no se pueden sumar porque esa operación no existe. Como mínimo, igual de lógico que el tipado estático.
Pues no. Yo no tengo ni idea de cómo estan implementados los iteradores. Me dijeron que son como punteros, pues vale.
Tampoco tengo idea de cómo procesa mysql una sentencia, ni me importa. No lo necesito. Yo hago:
select * from tabla;
Y me da igual en qué tablespace esté la tabla, en qué agrupamiento, qué índices utiliza, en qué fichero está almacenada, qué estructura de datos usa mientras la tiene en memoria... joder qué martirio si tuviera que preocuparme de todo eso cada vez que hago una consulta.
¿Cuándo tengo que preocuparme de eso? Cuando yo administre la base de datos y me lleguen quejas de que los informes tardan en salir. Ahí ya me tengo que preocupar de la eficiencia y de muchos más parámetros... pero en esa fase yo ya conozco el lenguaje.
Para hacerlo en C sí lo necesitas. Y más cosas aún, como los famosos *, & y ->. ¿Cómo vas a recorrer un vector sin sumar punteros? ¿Usando los corchetes? Pues los corchetes te están abstrayendo de la representación interna del vector, eso que tú dices que no se debe hacer.
¿Cómo lo van a saber? Es su primer día de clase. Vienen a aprender programación estructurada y lo primero que ven son directivas del preprocesador.
Sí lo son. La prueba es que en pseudocódigo no hay.
Para saber lo que es un diccionario y sus particularidades no necesito saber lo que hace por dentro.Sólo necesito su interfaz.
¿Has usado la STL alguna vez? A mí casi me da un patatús de la alegría cuando me la enseñaron.
def rec(x):
rec(x)
Nulukkizdin escribió:vaya hombre, te saltas medio mensaje porque "es irrelevante"... pues cojonudo...
ahora resulta que los errores en tiempo de ejecución no existen en los lenguajes interpretados... para qué tendrá python las excepciones, digo yo... será para que la gente que viene de C++ no se traumatice
Va, pongamos que estás en línea de comandos. Un error sintáctico no se puede interpretar porque la evaluación falla. Es lo que pasa en tu ejemplo. El programa no se puede ejecutar.
En cambio, prueba a poner esto:def rec(x):
rec(x)
sintácticamente es correcto, así que lo evalúa y lo interpreta. Si el resto del programa también es correcto sintácticamente (imagínate que eso forma parte de un programa más grande), no hay ningún problema en lanzarlo. Si durante la ejecución del programa no llamas a rec, éste terminará sin más, sin errores. Sólo dará el error cuando la función rec se ejecute: se lanzará la excepción "maximun recursion depth excedeed". Espero que se vea la diferencia.
a = "hola amigo"
b = ", que tal?"
c = 34.56
print (a+b)
b = c
print (a+b)
Por lo que pongo arriba.Lo de las variables... ¿y por qué no va a poder tener una variable cosas de distinto tipo?
al venir de bachillerato, de matemáticas, ven el tipado estático como una restricción absurda (da igual que lo sea o no realmente: hablamos de lenguajes para aprender).
Y más aún cuando un año después tienes que explicarles el chanchullo de las plantillas de C++ para conseguir precisamente la funcionalidad del tipado dinámico.
iteradores... for(i = v.begin(); i != v.end(); ++i) { //... }
¿punteros? ¿qué es un puntero? a mí no me líes, yo sólo uso iteradores... ah espera, que si no sé lo que son los punteros ese bucle no funciona. El compilador comprueba mi estado cerebral antes de evaluar esa expresión que no requiere en absoluto conocer lo que es un puntero... aunque en realidad prefiero una sintaxis tal que así:
for elemento in vector
//...la vida es bella de esta manera.
coño, ahora tampoco se deben usar los corchetes en C... en qué estaría pensando ritchie cuando los incluyó. Puedo pasar sin aritmética de punteros para explicar lo que es... pero entonces los estoy abstrayendo de su funcionamiento real, de modo que los utilizarán sin conocer realmente qué están haciendo, ¿eso no era malo, decías...?
perder tiempo cambiando cosas que podría haber hecho bien desde el principio... bonita forma de llamar al desarrollo incremental, al ciclo de vida evolutivo, en definitiva, cosillas sin importancia de ingeniería del software que en realidad sólo son "picar código". Muy, muy útil, enseñar bases de datos empezando desde el principio, ahí, como debe ser: almacenamiento físico. Los clusters. Pedagogísimo. A propósito, "desde el principio" quiere decir desde el primer día...? O tampoco.
Como en pseudocódigo no están, son cosas del lenguaje. pues... sí, mira. No veo muy lógica la frase "como en pseudocódigo no están, son cosas del pseudocódigo", la verdad.
1 function Kruskal(G)
2 for each vertex v in G do
3 Define an elementary cluster C(v) ← {v}.
4 Initialize a priority queue Q to contain all edges in G, using the weights as keys.
5 Define a tree T ← Ø //T will ultimately contain the edges of the MST
6 // n es el número total de vértices
7 while T has fewer than n-1 edges do
8 // edge u,v is the minimum weighted route from/to v
9 (u,v) ← Q.removeMin()
10 // previene ciclos en T. suma u,v solo si T no contiene una arista que una u y v.
11 // Nótese que el cluster contiene más de un vértice si una arista une un par de
12 // vértices que ahn sido añadidos al árbol.
13 Let C(v) be the cluster containing v, and let C(u) be the cluster containing u.
14 if C(v) ≠ C(u) then
15 Add edge (v,u) to T.
16 Merge C(v) and C(u) into one cluster, that is, union C(v) and C(u).
17 return tree T
No conozco máquinas que no usen la memoria para guardar variables, pero conozco lenguajes que te permiten centrarte en los algoritmos y dejarle al traductor que él gestione esas cosas accesorias que te alejan de tu objetivo, que es aprender a implementar algoritmos. No aprender truquitos específicos de C.
Por alguna razón intento desviar la conversación... ah, ya descubriste mis "motivaciones ocultas"...
Lo que digo que no se debería hacer es usar los corchetes en un array sin saber lo que en realidad abstraen.
for each vertex v in G do
for vertex in g:
No copio de nuevo lo que pones porque vuelves al estúpido tono condescendiente explicándome lo que es un intérprete de comandos, y a la par demostrando que no leíste la parte en que decía que lo COMPILÉ DESDE UN IDE (IDLE concretamente)Nulukkizdin escribió:...
La recursividad infinita "funciona" en C++ porque C++ le deja la responsabilidad de lanzar la excepción al programador, mientras que python la lanza para no quedarse eternamente calculando.
La programación puede ser tan satisfactoria o tan frustrante para el estudiando como el profesor quiera. Si a final de cuatrimestre quieres tener a seis alumnos en tu clase, enseña las cosas "como debe ser, desde el principio, sentando las bases, bla bla". Primer día: primer programa: primera línea: las directivas del preprocesador. Seguimos: los ficheros de cabecera. Luego, la función main, con sus argumentos. Por fin llegamos a la función que hace lo que queremos, imprimir hola mundo (idea del estudiante: joder, ¿y por qué no puedo poner sólo printf, que es lo que hace que imprima el letrero?). La orden return. Y así hasta fin de curso. O bien explicar el printf y decir "las otras seis o siete líneas las veremos el mes que viene".
vectora;
vectorb;
b = a;
¿otra vez? Que python tiene TIPADO FUERTEEE. Eso no se puede hacer en python, da un error SINTACTICO (recordatorio: en los lenguajes interpretados TAMBIEN existen los errores sintácticos). Me desespero, ¿eh? Me desespero.
Lo del punto y la flecha. ¿No recuerdas que fue una de las cosas que puse como PEGAS en un mensaje anterior? ¿Y no has visto el segundo tipo de bucle, el que prefiero, mucho más sencillo e intuitivo, más cercano al pseudocódigo, y por tanto mejor para aprender?
Y por tanto, les enseñas que v[5] es *(v+5). Pero eso no es aritmética de punteros, es un bug.
Veo tu ejemplo de pseudocódigo y lo primero que veo es:for each vertex v in G do
vaya hombre, si es un bucle al estilo python, php y otros... implementemos eso en python:for vertex in g:
conciso, directo al grano... aunque, si quieres, también puedes hacerlo al estilo C. Tú eliges. En C no. De hecho, Kruskal en C es lo más coñazo que puedes echarte a la cara. En python los algoritmos son más legibles y fáciles de programar.
3 Define an elementary cluster C(v) ← {v}.
4 Initialize a priority queue Q to contain all edges in G, using the weights as keys.
Gracias, programadores de C, por hacer lenguajes que me permiten abstraerme de cosas accesorias para mi objetivo, que es aprender (y enseñar) a programar.
ercea escribió:En cambio aprender de primeras algun lenguaje abstracto... el que no ha dao programación en su vida pues si... seguira adelante y motivado... pero no se lo mereceDDDDD se merece el castigo cruel de aprender C, punteros, direcciones de memoria, punteros a funcion, etc, etc xDDDD
Es más por el tema de no intentar hacer creer que algo complejo como es la programación, se puede volver sencillo, y no es así.Además... así nos ahorramos intrusismo, habrá pocos programadores (pero buenos ^^) y seguiremos teniendo trabajo sin que se nos cuele el tipico listillo de turno por haberse leio un manualDD
Si yo buen rollo lo tengo. El problema viene es cuando me dicen burradas, como confundir errores en tiempo de ejecución con errores de sintaxis, o intentar compara éstos últimos con una construcción del lenguaje como es una excepción, o decir que en un lenguaje no puedes hacer x y resulta que en mi entorno yo puedo hacerlo. En esos casos suelo creer más a lo que veo, y si el lenguaje me dice que es posible, pues me creeré eso antes que al que me intenta decir que no. A fin de cuentas la probabilidad de que yo me haya bajado una versión distinta del lenguaje que permite hacer cosas que otros no pueden es bastante bastante pequeña, has de reconocérmelosaludos y buen royo smile_;)!
zheo escribió:Jústamente hoy discutía lo mismo con unos compañeros, ya que uno también defendía que en nuestro plan de estudios aprender c++ es una tontería. Uno opinaba que tendríamos que dar Java desde el principio y los otros 3 que no, que se empieza con c++ y luego se debería dar Java. Sim embargo lo que hacemos es empezar con c++, seguir con c++ y punto, lo que también está fatal, ya que lo del Java va porque soy de Asturias, y aquí piden muchísimos puestos de trabajo con Java (por ahí les ha dado). De hecho hay varios cursos y masters gratuitos para aprender el "framework del principado", un framework de trabajo en Java que se usa en las administraciones de aquí.
Y en nuestra carrera no hueles java en ningún momento (excepto en redes para hacer sockets ya ves), así que struts, beans o cualquier cosa te lo tienes que mirar tú. .NET también te lo tienes que mirar rú por supuesto... de lenguajes como python o Ruby sólo oyes hablar si conoces a alguien que a su vez los conoce... supongo que sabes cómo va esto.
Es más por el tema de no intentar hacer creer que algo complejo como es la programación, se puede volver sencillo, y no es así.
Efectivamente, estudié en Gijónresakosix escribió:
Veo que estudiaste en Gijón o en Oviedo con el plan viejo, porque ahora en Oviedo nos meten Java en todas las asignaturas menos an una cuatrimestral de segundo donde se ve C y C++. Python, Ruby, la plataforma .NET, sabemos que tienen que ver con la programación porque el profestor de TcP los nombra en sus clases, supongo que intentando que nos interesemos nosotros por ello (cosa que debe funcionar para un 0.01% del alumnado).
A mi me parece un error, porque empiezas con Java, que es muy fácil, y no te tienes por que preocupar de nada de lo que pasa cuando das a compilar y ejecutar, y cuando te pones a aprender C es una cuesta arriba tremenda, porque aunque "sabes programar" nunca te has molestado de lo que pasa a un nivel más bajo, y cuesta mucho.
De todas maneras, nos forman para ser ingenieros, por lo que (en teoría), si estamos bien formados no debería suponer ningún problema el pasarnos de un lenguaje a otro, si podemos conocer cómo funciona.
Yo ahora es cuando aprenderé Java (por fin!), en una optativa (Programación en Entornos Cliente/Servidor), y es en el 2º Ciclo... tambien en la técnica había una optativa que nos enseñaba Java (Programación Concurrente y Distribuida)
(sin embargo hay un tribunal de PFC que como no esté en Java ya les caes mal xD).