Dios, que agonia!. Tengo un problema:
Determina los valores de cada variable despues que se haya ejecutado el cálculo. Suponga que cuando empieza cada enunciado, todas las variables tienen el valor de 5.
result = ++x + x;
Pues resulta que el resultado es:
result = 12
x = 6
ME LO EXPLIQUEN
Segun mis calculos y empezando de derecha a izquierda a mi me da lo que sigue:
result = 11 (o sea lo que obtengo de x)
x = 11 (sumo las dos x teniendo encuenta que ++x es 5+1)
LLEVO DOS DIAS DANDOLE VUELTAS Y NO LO ENTIENDO. Explicadme con detalle por qué esto es así.
S2.
Como el operado ++ esta delante de x, es lo primero que se hace. Osea que si x=5, tras ++x (x=x+1) tenemos x=6
Luego se hace result = x+x; osea que 6 +6 = 12
Empiezo a entender.
Pero no me queda claro lo de tener el ++ delante o tras la variable.
Por ejemplo:
result = ++x;
Deduzco que:
x=6
result=6
Por contra si el enunciado es:
result = x++;
x sigue siendo 6 (hasta aqui lo entiendo)
result=5 (¿por qué no vale 6 si x++ es lo primero que calculó?)
S2.
He ahí la diferencia entre pre-incremento y post-incremento. Cuando utilizas el preincremento (++x) el cambio a la variable x se realizará ANTES de efectuar ninguna otra operación. Cuando usas el postincremento (x++) el cambio a la variable x se realizará AL FINALIZAR la instrucción en curso.
Eso es parcialmente cierto, cada compilador es libre de implementar eso como quiera el standard lo dice asi, vamos, no dice nada al respecto xD.
saludos
Ahora tengo:
z = 2
y = 15
Calcula (z) e (y) en:
y += z++ * z++
Solo puedo entender que:
z = 4
Pero cuando voy a por (y) sencillamente... no se hacerlo. Se supone que me tiene que dar 19, pero ¿podeis explicarme como he de deducirlo?
¿Dónde está mi fallo?
Para calcular (y) lo que yo hago es lo siguiente:
-Lo pongo de forma mas "entendible" para mi, o sea:
y = y + (z++ * z++)
Primero multiplico 2*2 y el resultado se lo sumo al 2 obtenido de los (++) (++). De manera que resulta 6. El paso que me queda entonces es:
y = 15 + 6
Dandome como resultado ¡¡un 21 como una catedral!!
¿¿¡¡ QUÉ COÑO ESTOY HACIENDO MAL !!??
Si no le sumo los (++) me quedo con un 15 + 4 = 19!!!!!!
Pero... ¿por qué no habría de sumarlos? ¿¿no habeis cmentado que en este caso, por estar "detras" de la variable he de hacerlo pero al final de la operación??
(NO CUNDA EL PÁNICO)
S2.
Haciendo una traza:
(y=15, z=2)
(Instruccion y += z++ * z++)
1º z++ * z++ (* tiene prioridad sobre +=)
resultado 4 (2*2)
2º y += 4
resultado 19 (15+4)
3º z++ (al haberse finalizado la operacion GLOBAL)
resultado 4
OJO que no soy un guru del C, y que posiblemente me haya explicado mal o la haya pifiado en algo. Gente, corregid :ojo:
J_F_NASH, relájate un poco :) En mi explicación te he comentado que el postincremento sólo tiene lugar una vez acabada la instrucción (no sólo la operación, sino toda la orden hasta llegar al final de su evaluación). La traza ya te la ha puesto rrc2soft.
A ver si esta pequeña "regla" te aclara las cosas: el preincremento tiene preferencia sobre todas las demás órdenes; se calcula el nuevo valor y se utiliza para todos los cálculos. El postincremento no afecta a la variable hasta que se ha finalizado la instrucción en la que se evaluaba: es decir, usas la z tal y como está y, al acabar de usarla en la instrucción (no sólo en la operación), la incrementas. Tómate un postincremento como un "acuérdate que al acabar de hacer todo lo que tienes que hacer has de incrementar la variable" y punto.
jejeje q gambazo xD relajarseeee
Vale, AHORA lo entiendo.
S2.
Mas dudas:
¿Cual es la diferencia entre (while) y (for)?
Los veo bien parecidos, salvo que con (for) haces lo mismo pero con menos lineas. ¿Es esa la diferencia?
S2.
Son dos estructuras de control distintas. En un for, pasas obligatoriamente por todo el rango de valores que le asignes a una variable. Esto suele ser muy útil cuando sabes de antemano el número de veces que quieras que se ejecute el bucle (por ejemplo, para recorrer una matriz que sabes que es de 3x3). Pero ¿y si no sabes ese número a priori? Es entonces cuando necesitas la estructura while. De hecho, hasta mediados del siglo pasado se pensaba que con un bucle for se podía hacer cualquier algoritmo. En base a los avances que en la materia efectuaron gente como Turing, se dieron cuenta que había algoritmos para los que el bucle for no era suficiente (creo que la función de Ackerman es uno de esos algoritmos).
Con un bucle while sí se puede utilizar para todos los algoritmos.
Por cierto, estoy hablando de bucles "estándar", nada de hacerle guarradas a la variable del for ni cosas así. ¿Todo claro?
En resumen, con for le dices "me vas a hacer esto este número de veces"; con while le dices "mientras se cumpla esta condición, me has a hacer esto".
Hombreeeeeeeeeeeeee for para cosas sencillas el control q llevas con un Do While vamos... :D no es =. Mars te lo ha comentao :P
Un poco de historia no hace daño a nadie. Tal vez esto no tendría que estar aquí, pero creo que en algún punto habla del tema de que no se necesita (al menos de momento) ninguna estructura de control más potente que el while. Hoy he mantenido una breve charla con el FM donde me decía "pero yo puedo hacer for(;contador==100;) y eso es igual de potente con un while". Pues a eso me refería con que hablo de for's estándar, sin hacerle guarrerías. Internamente, lo de antes se traduciría como un while(contador==100). Cuando no había whiles había que buscarse la vida de otra forma (en este ejemplo podría ser muy simple, pero hay casos en los que no es nada simple).
Aquí dejo el link sin más dilación:
http://www3.uji.es/~martine/DOC/E45/historia.pdfEdito: por cierto, que forma parte del temario de mi asignatura de Teoría de Autómatas y Lenguajes Formales, así que podéis fiaros ;) espero no estar infringiendo ninguna ley extraña por poner esto aquí XD si no, ya hablaré con Gloria, la amenazo con un recital de trompeta y fijo que se olvida del asunto XD
Que bonita es TALF... esos 9 creditazos cuatrimestrales... (al menos en la UCO) que bonitos son lex y yac...
Anda, en la UAM también son 9 créditos. Pero el lex y el yac se ven en Procesadores del Lenguaje (Compiladores vamos), que son otros 9 créditos... Un saludo,
Vicente
El nene tiene 10 de TALF y no me suena que veamos eso. Igual todavía está por llegar, no sé, hasta ahora no lo hemos visto. Pero a mí sí que me gusta.
La única diferencia que yo veo es que están pensados para cosas distintas, pero pueden hacer exactamente lo mismo.
Ni for ni while ni leches, piensa que al final todo se va a traducir en saltos condicionales al pasar a ensamblador. Lo que sí es posible es que, para funcionar como contador, el compilador te optimice mejor un for() que un while() (por ejemplo, asignando la variable contador del for a un registro directamente) Lo recomendable supongo que es usarlas para lo que estan pensadas.
sync
Y yo te digo que la estructura while es más potente que la for, que el "while(condición)" es más potente que el "for i=x to n do" :) Ya he expuesto las razones antes. Matemáticamente hay algoritmos que no se pueden hacer sólo con bucles for, mientras que donde hay un for siempre puedes poner un while. Al contrario no ocurre.
Mars: es verdad, en todos los lenguajes no, pero sí en C, C++, Java, etc... y como el thread va de C, por eso lo ponía.
while(condición)
{
}
es exactamente equivalente a
for(;condición;)
{
}
pruébalo con el código que quieras, con un buscar y reemplazar :-P
sync
¿No has leído lo que he escrito cinco posts más arriba? Es que eso NO es una estructura de control for estándar, eso es un for modificado. También podrías hacer un for(i=0;iHablemos en pseudocódigo y nos entenderemos mejor.
Es más potente un
mientras(condición) haz
...instrucciones...
finmientras
que un
para i=x hasta n paso y haz
...instrucciones...
finpara
Lo que comentas forma parte de la flexibilidad que se le ha dado a algunos lenguajes para decir lo mismo de otras formas, pero a costa de perder la declaración estándar del bucle de control for, en este caso.
Y no es que lo diga para llevarte la contraria, estoy completamente de acuerdo que un for(;condición;) es idéntico a un while(condición), pero es que entonces este for(;condición;) no es realmente una estructura de control for, sino otra manera de escribir el while. Lo que has puesto se traduciría como "para mientras condición, haz" que es una forma algo más enrevesada de decir "mientras condición, haz". Pero, ¿y si no tienes la manera de decir "mientras"? Entonces no puedes usar esa estructura. Por eso surgió la estructura de control while, más potente que el for, y por eso después de ella no han surgido estructuras de control más potentes (¿nunca te has preguntado por qué no ha salido "nada nuevo bajo el sol" desde hace cuarenta años en el tema de las estructuras de control? Precisamente porque después del while de momento no hace falta ninguna más, que se sepa).
Jejeje, de ser estándar, es estándar (ANSI C de toda la vida) Ya sé que tú le estás dando un enfoque algorítmico pero lo hago pa picarte putilla XDDD
La pregunta que él hace es referente a programación en C y no a algorítmica en general, por eso lo he puesto ;)
sync
Vale, pero es conveniente aclarar la idea de base, para que no piense que para qué hace falta usar whiles, si con fors hace lo mismo (o viceversa). Lalala.
Así me gusta, que propugnes el buen hacer ^_^
sync
A ver para aclarar a este chavla pq la cosa se esta extendiendo algo para un tema... tan ligero.
La eleccion de FOR y WHILE es mas un tema de concepto q no de cual es mejor o peor ya q cm se ha hablado aki los 2 pueden "hacer lo mismo".
El for ya lo pillas supongo.
Tonces WHILE cm te decia es mas de concepto, mira:
DO{
i++;
}WHILE(i!=50);
HAZME "el incremento de i" MIENTRAS "no sea igual a 50" (o lo q es lo mismo hasta 50)
yo recomiendo DO----WHILE es para mi mas poderoZo :P pero while = con tu condicion mientras("condicion se cumpla"){"hazme lo q sea"}
Lo q yo te diga cuestion de conceptos
Emmm... tampoco es lo mismo un while que un do while. En el primero la condición la evalúas antes de ejecutar las instrucciones. En el segundo la evalúas después de haberlas ejecutado. Se pueden hacer equivalentes con un pequeño cambio en el diseño del algoritmo, no obstante.
Si has dicho lo mismo que estoy poniendo yo, lo siento, pero escribes tan raro que no te he entendido bien.
(Edito) Por cierto, no sé si has querido decir que do while es más poderoso que while (tampoco lo he entendido bien), pero por si acaso, ambos tienen el mismo poder computacional. Como he dicho antes, pueden hacerse equivalentes en su forma estándar. No ocurre lo mismo, repito, con el for y con el while. Siento repetirme tanto, pero es algo que debería quedar muy claro. Quizás si hubieras empezado con Pascal lo hubieras visto mucho más claro.
Ya hombre pero por eso digo q prefiero un DO--WHILE pq usar de la misma manera indistintamente un for q un while........ yo usaria FOR casi en todas ocasiones, y el while para cosillas muyyyy concretas.Me referia a q no debe decantarse por usar FORs o WHILEs pq uno es mejor q otro y tal, ya q cm yo lo veo... es cuestion de cada uno, de cm programe,Si no ta enteraou MarZ pos a ver.
USA FORs y PARA COSAS MAS "complejas" DO--WHILE ya q para mi el WHILE a pelo no me mola mucho y lo uso mu poco.(Mi recomendacion)
*Mars ere un puñetero
Pues no sé, tampoco creo que sea adecuado hablar en términos como "mejor" y "peor", o de usar for "todo lo que puedas" y cuando menos uses while mejor... Me parece que le tienes un poco de miedo a los whiles ;)
Todas las estructuras de control son importantes, cada cual tiene asociadas unas funciones para las que son más lógicas, y si quieres supeditar su uso a las preferencias personales, pues... en fin, cada cual haga lo que le parezca. Yo uso fors cuando veo que es más lógico usar fors y uso whiles cuando veo más lógico usar whiles, no tengo ninguna preferencia :)
Sí, soy un puñetero XD
Bueno, le he echado otro vistazo a los apuntes y le he preguntado a la profa vía mail si podría darme algún ejemplo concreto que mostrara mejor las cosas.
En uno de los articulillos de los apuntes se menciona la función de Ackermann (buscadlo en el google si queréis saber más, es un poco chunga y recursiva de describir) y un programa que resuelva con aritmética entera el cero de |x^2 - elcuadradoque quieras| = 0 (aritmética entera => no vale usar sqrt)
Copipasteo un trozo del mail:
<acotación, que es el que se basa en que si a un número entero le sumas el que obtienes al invertir sus dígitos, y vas repitiendo el proceso, al final te sale un número capicúa. Si son capaces de hacerlo con un for (sin break, of course ;-) me lo digas.... Otro por el estilo, si haces el algoritmo del número maravilloso*... tampoco sé de ninguna acotación a priori, hay que parar cuando se alcanza el 1.>>
*consultad también al google si queréis saber más sobre esto. Resulta que hay números para todos los gustos; números maravillosos, números perfectos, números apocalípticos, números satánicos... seguro que jelorol sabe algo de ellos, y si no, le encomiendo encarecidamente que ponga un artículo sobre ellos en su estupenda web :)
Venga, un saludo.
¡Vaya!. Muy interesante todo lo que se ha dicho. Ahora voy a intentar aclararme :oops:
S2.
:P
Mars q no esq le tenga miedo a los while, sino q mi concepto de programacion me dice "PON UN FOR pa q mas?" y cuando pienso en un WHILE lo pongo.Lo q pasa esq pongo mas fors q whiles pq los while los suelo usar en DO-WHILE :P:P:P:P:P:P:P
J_F_NASH espero q te ayamos ayudado, yo ya te digo... es cuestion de cm pienses programando, tienes un munton de posibilidades q te da C/C++ para todo esto.
Hola,
pues ahora, pensandolo rápido, no le veo tanta diferencia al for y al while. En el while, haces algo mientras no se cumpla una condición. Lo mismo le pasa al for. Esa condición tendrá que estar inicializada en algún lado, el for la inicializa con su primer "parametro". Y el tercer parámetro... pues las perrerías que he visto poner a alguno de mis profesores sobre todo en examenes ;) Venga, un saludo!
Vicente
P.D.: como se me haya escapado una gran burrada...
Creo que éste puede ser un gran problema de comenzar aprendiendo C directamente. En este sentido Pascal dejaba las cosas muy claras.
Bueno, mas dudas.
Tengo el siguiente programa:
#include
#define RESPONSE_SIZE 40
#define FREQUENCY_SIZE 11
main()
{
int answer, rating;
int responses[RESPONSE_SIZE] = {1, 2, 6, 4, 8, 5, 9, 7, 8, ... };
int frecuency[FECUENCY_SIZE] = {0};
for(answer = 0; answer <= RESPONSE_SIZE - 1; answer++)
++frecuency[responses[answer]];
printf("%s%17sn", rating", "frequency");
for(rating = 1; rating <= FRECUENCY_SIZE -1; rating++)
printf("%6d%17dn", rating, frecuency{rating});
return 0;
}
Lo que visualizamos en pantalla es esto:
Rating_____________Frecuency
____1_________________2
____2_________________2
____3_________________2
____4_________________2
____5_________________5
____6_________________11
____._________________.
____._________________.
____._________________.
El Problema es que no me cuadran los resultados de Frecuency para nada. ¿Cuales son los pasos para resolver cada Rating?. Ya no se por donde tirar. Me he leido la explicación del ejercicio mil veces, asi como el tema. Esto es exasperante.
S2.