Título: Ejercicio -nivel intermedio- [C] Publicado por: SoyelRobert en 5 Enero 2014, 23:34 pm Hola, he estado intentando sacar este ejercicio:
(http://i42.tinypic.com/144bs75.png) Y aqui el codigo que he estado picando: Código
el codigo compila con 0 errores y 0 warnings pero a la hora de ejecutarlo y meter los numeros se cuelga. Agradezco cualquier aportacion :rolleyes: :rolleyes: :rolleyes: ;D :xD EDIT: disculpas por no indentar el codigo pero soy un inutil incapaz Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: do-while en 6 Enero 2014, 00:38 am ¡Buenas!
Tienes un error de lógica en la línea 15: Código
Dentro del cuerpo del bucle no modificas num, luego si entra en el bucle, nunca saldrá. Lo que puedes hacer es leer en número antes de llegar al primer bucle, y al final del while que hay en su interior, justo antes de la llave de cierre, leer el siguiente número. Por ejemplo. No he mirado si hay mas errores. Por cierto, no tengas miedo de utilizar el tabulador, tu código quedará mas organizado y será mas fácil leerlo (tal y como está es un caos y molesta bastante tener que leerlo). ¡Saludos! Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: SoyelRobert en 6 Enero 2014, 13:17 pm Dentro del cuerpo del bucle no modificas num, luego si entra en el bucle, nunca saldrá. Lo que puedes hacer es leer en número antes de llegar al primer bucle, y al final del while que hay en su interior, justo antes de la llave de cierre, leer el siguiente número. Por ejemplo. No he mirado si hay mas errores. Por cierto, no tengas miedo de utilizar el tabulador, tu código quedará mas organizado y será mas fácil leerlo (tal y como está es un caos y molesta bastante tener que leerlo). ¡Saludos! muchas gracias, si lo de tabularlo es verdad lo que ocurre es que no se cuales son las tabulaciones correctas :rolleyes: :rolleyes: sobre el codigo, he tenido en cuenta lo que me has dicho y lo he medificado tal que asi: Código
otra vez pido disculpas por no tabularlo correctamente, si pudiera alguien pasar un link o algo para aprender me comprometo a hacerlo. haciendo un par de pruebas creo que el problema está en el for que empieza en la linea 36: Código
este bucle no acaba nunca y no se a que se puede deber. salu2 Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: leosansan en 6 Enero 2014, 13:25 pm Antes que nada un par de detallitos:
* la función main es de tipo int, así lo establece el estándar del C, y por tanto hay que declararla como tal, con su consiguiente return al final de la misma. * tienes que acostumbrarte a indentar y/o sangrar y/o tabular el código, si no es casi imposible seguirlo. Respecto al código: * hay que poner printf o puts antes de la introducción de datos, si no queda la pantalla parpadeando y quien vaya a usarlo y no sepa de que va se quedará muy, pero que muy, mosqueado. ;) ;) ;) * tal como lo tienes faltaría un break en el if de la función, sin el else, si no no sale del bucle y se queda la pantalla como si no ocurriera nada. * no hay mayor problema con el segundo while de la función main, salvo que está de más y te complica todo el código. * un error frecuente en este tipo de ejercicios es que haces uso de una variable aplicándole una operación, tipo "num/=10" y pasa lo que pasa, que al volver a querer usar esa variable con su valor original ya no es el valor actual, de ahí que yo use num y num_0 para no perder el valor inicial por si te hiciera falta, que efectivamente te va a hacer falta. * debes habituarte a poner printf, tantos como sean necesarios, para ver como evolucionan las variables a lo largo del código. En tu caso es conveniente que pongas un printf justo antes del último if de la función y veras que sorpresa te llevas con los valores de suma y cont. No paran de salir distintos valores para cada una de las variables y, curiosamente el valor de la variable "cont" siempre vale dos. Hazlo y piensa en el por qué. * no tiene como mucho sentido un for y que dentro de su cuerpo de sentencias lo que aparezca sea un if, con su condición correspondiente. Te puedes ahorrar el if poniendo la condición entre los dos puntos y coma del for, que para eso está. Y me dejo de rollo. He aquí una salida al código que te propongo: Citar Introduzca un número:2411 135 20305 111 15 22 69 102 12356 68259 0 2411 cumple la condición 135 no cumple la condición 20305 cumple la condición 111 cumple la condición 15 no cumple la condición 22 cumple la condición 69 no cumple la condición 102 cumple la condición 12356 no cumple la condición 68259 cumple la condición He cambiado, además de quitar el segundo while que está en main, sencillamente estaba de más, la forma de calcular el número de dígitos o cifras del número y la forma de obtener la primera cifra; no hacía falta el uso de la función pow y,por ende, de la librería math,h. también te cambié la forma de obtener la suma, la que tenías puesta no había por donde cogerla. ;) ;) ;) Y ya está bien de rollo, ya te dejo con el código. Si tienes dudas ya sabes donde estamos y enhorabuena por el curro que te has pegado. Aunque el código es cortito no deja de ser denso y/o espeso, especialmente esa forma tan peculiar de introducir los datos. ;) ;) ;) Código
Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: SoyelRobert en 6 Enero 2014, 14:31 pm Antes que nada un par de detallitos: * la función main es de tipo int, así lo establece el estándar del C, y por tanto hay que declararla como tal, con su consiguiente return al final de la misma. * tienes que acostumbrarte a indentar y/o sangrar y/o tabular el código, si no es casi imposible seguirlo. Respecto al código: * hay que poner printf o puts antes de la introducción de datos, si no queda la pantalla parpadeando y quien vaya a usarlo y no sepa de que va se quedará muy, pero que muy, mosqueado. ;) ;) ;) * tal como lo tienes faltaría un break en el if de la función, sin el else, si no no sale del bucle y se queda la pantalla como si no ocurriera nada. * no hay mayor problema con el segundo while de la función main, salvo que está de más y te complica todo el código. * un error frecuente en este tipo de ejercicios es que haces uso de una variable aplicándole una operación, tipo "num/=10" y pasa lo que pasa, que al volver a querer usar esa variable con su valor original ya no es el valor actual, de ahí que yo use num y num_0 para no perder el valor inicial por si te hiciera falta, que efectivamente te va a hacer falta. * debes habituarte a poner printf, tantos como sean necesarios, para ver como evolucionan las variables a lo largo del código. En tu caso es conveniente que pongas un printf justo antes del último if de la función y veras que sorpresa te llevas con los valores de suma y cont. No paran de salir distintos valores para cada una de las variables y, curiosamente el valor de la variable "cont" siempre vale dos. Hazlo y piensa en el por qué. * no tiene como mucho sentido un for y que dentro de su cuerpo de sentencias lo que aparezca sea un if, con su condición correspondiente. Te puedes ahorrar el if poniendo la condición entre los dos puntos y coma del for, que para eso está. Y me dejo de rollo. He aquí una salida al código que te propongo: Bueno antes de nada aprovecho para darte la enhorabuena a ti también, llevo poco en el foro pero desde que he entrado todas las respuestas que he visto por tu parte son claras, completas y precisas, tratando siempre de modificar lo menos posible el codigo inicial y la verdad es que da gusto con gente así ;) Vamos por partes: Respecto a lo de la funcion main tipo int... si la verdad es que ya lo explicaste en otro hilo y soy consciente de ello, solamente que lo he hecho así por vago y ahorrar el return. Sobre lo de indentar el codigo, tambien estoy consciente de ello... la verdad es que desde un principio no lo he hecho y ahora me va a costar acostumbrarme. Sobre las printf, si. tienes razon, lo que ocurre es que estos codigos son ejercicios de examen y nos piden expresamente que obviemos printfs y demas, el motivo es que en mi universidad, los examenes son escritos y el programa nunca sera siquiera compilado por lo que carece de sentido las printfs y solo nos quitarian tiempo. Tambien las uso para ver el valor que tiene una variable en un momento determinado, pero como en un examen escrito me es imposible hacerlo trato de evitarlo e intento sacar el codigo de una tacada y que este perfecto antes de compilarlo, que seria la unica manera de tenerlo perfecto en el examen.... La verdad es que con este ejercicio (como con muchisimos otros :-[ :-[) he tenido que tirar de ello jaja, aun asi gracias por el consejo). Sobre lo del breake sin el else, la verdad es que no tenia ni idea pensaba que seria indiferente poner el else que no. :-X Una duda que me ha surgido ahora al leer tu codigo es que en todas las printfs hay al final un 163 0 un 162 que no se para que sirven. :-X Y lo de las variables con operaciones dentro.. si, es verdad gracias :rolleyes: :rolleyes: Ah y sobre lo de "dejarte de rollos" no! porfavor no!, la verdad es que todos estos ejercicios ni siquiera tengo que entregarlos, solamente los hago para coger agilidad de cara al examen, solo busco aprender lo maximo posible, y un par de comentarios y explicaciones me ayudan mas que cualquier codigo ya hecho ;) Muchisimas gracias Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: leosansan en 6 Enero 2014, 14:42 pm ........................................................................... Una duda que me ha surgido ahora al leer tu codigo es que en todas las printfs hay al final un 163 0 un 162 que no se para que sirven. :-X .................................................. Son los códigos ASCII de los acentos implicados, si los pones directamente en el código salen símbolos raros, para eso está el ASCII. Googlea sobre códigos ASCII versión extendida y amplia tus conocimientos. Por cierto, existe otra forma abreviada de ponerlos usando el modo hexadecimal, tipo \xA4 y cosas así. Lo dicho, googlea un poco sobre ese tema. Y de nada, para eso estamos. ¡¡¡¡ Saluditos! ..... !!!! :rolleyes: ;) ;) ;) :rolleyes: Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: rir3760 en 6 Enero 2014, 19:06 pm Si revisamos con cuidado el enunciado este indica que la función debe realizar las tres tareas (obtener el primer dígito, el numero de estos y su suma) y retornarlos lo que implica utilizar el valor de retorno de la función y dos parámetros de salida.
Una forma de implementarla utilizando el tipo div_t y la función div es: Código Es en la función main donde se deben leer los números, llamar a la función e imprimir el numero si se cumplen las condiciones. ---- Respecto a lo de la funcion main tipo int... si la verdad es que ya lo explicaste en otro hilo y soy consciente de ello, solamente que lo he hecho así por vago y ahorrar el return. La intención de que te apegues al estándar y que indentes el código es darnos todas las facilidades para resolver la dudas que se presentan, así cada quien pone su parte.Sobre lo de indentar el codigo, tambien estoy consciente de ello... la verdad es que desde un principio no lo he hecho y ahora me va a costar acostumbrarme. Y para indentar el código fuente cualquier IDE o PTE que se apegue a lo natural y las buenas costumbres debe ser capaz de, al menos, indentar el código fuente conforme este se introduce. También (y esto ya lo comento amchacon) puedes utilizar una aplicación que haga el trabajo por ti, por ejemplo astyle. ---- Por ultimo la función scanf retorna el numero de conversiones realizadas con éxito o, si no se realizo ninguna debido a error o fin de archivo, el valor EOF. Por ello para verificar si se leyó con éxito un entero diferente de cero se debe utilizar: Código Un saludo Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: SoyelRobert en 16 Enero 2014, 15:50 pm perdon por este reflote pero he estado volviendo a intentar sacar el ejercicio desde 0 y no hay manera :rolleyes:
alguien podria explicarme porque este codigo no funciona?, se que debo tener algun error de logica o algo pero no soy capaz de autocorregirme: Código
salu2 medificado: Código
sigue sin salir. edit: obviad lo del declarar a main como un void hehe :silbar: Título: Re: Ejercicio -nivel intermedio- [C] Publicado por: leosansan en 21 Enero 2014, 11:33 am perdon por este reflote pero he estado volviendo a intentar sacar el ejercicio desde 0 y no hay manera :rolleyes: alguien podria explicarme porque este codigo no funciona?, se que debo tener algun error de logica o algo pero no soy capaz de autocorregirme: Esta vez no me voy a tomar la molestia de explicarte el código: analizalo, estudialo, compara con lo que tú habías puesto y haz lo mismo con lo códigos que anteriormente te habíamos posteado. Se trata de aprender, ¿no?. Para ello lo mejor es lo que te indico. Claro que cuando no has hecho ni *uto caso de las observaciones que te indiqué en el post anterior: * main es int y requiere un return. * hay que indentar el código, Si no lo quieres hacer por ti, hazlo por nosotros que es más sencillo de analizar. * el uso de los printf. Sí, ya sé que en la UNI no te dejan, pero mientras aprendes ponlos y así observarás por ti mismo donde te equivocas. Ya cuando estés suelto podrás pasar, y sólo en principio, de ellos. * vuelves a poner un if justo después de un for, cuando, como ya te indiqué anteriormente, puedes en este caso ahorrarte el if poniendo la condición en el for. * por qué poner i<=10000000000 como condición cuando es más sencillo "numero/i!=0", que ya te lo había puesto. Ya que vas dividiendo el número entre potencias de 10, se trata de que cuando dé más pequeño que 10, o sea cero, se paren las divisiones. Además los int no llegan a tantas cifras como ceros tiene el número que has puesto. Es otro tema a estudiar por tu parte, los límites de los números que puedes usar. :silbar: *¿Por qué en la función cifras=2 como valor para inicializar la variable?. Hay que calcularlas una a una y desde cifras=0. *Esto está mal: for(cifra;cifra>1;cifra--). En todo caso sería for(i=*cifrass;i>=0;i--) y la suma casi como la tenías: (*sumaa)+=(int)(num/(pow(10,i)));. Fíjate en lo de int, que es hacer un cast y no es otra cosa que forzar a una variable de un tipo, en este caso float por la presencia de pow, a entero, que es lo que corresponde a la suma de cifras. Es como obligar al programa a que redondee los decimales que pudiera originar pow y la división. ;) *el uso de pow implica que la variable sea float o double y tú la usas con int y claro salen cosas raras. * y como pow (http://www.cplusplus.com/reference/cmath/pow/?kw=pow) implica el uso de float o double ya no vale % sino la función fmod (http://www.cplusplus.com/reference/cmath//) * ******** Vamos, que por lo que veo no has estudiado y/o exprimido los códigos anteriores. Así avanzarás a duras penas ..... y lo que es peor, nos aburres y dejaremos de hacerte caso. * ¿Y ese cambio a punteros?, ¿te dio un flash o un mal aire?. Por si no es así te lo he respetado, modificando tu código justito lo necesario para que funcione y veas por comparación los errores que has cometido. Pero sería más lógico en tu caso, y con los conocimientos que se intuyen tienes, haber usado variables globales y dejarte de punteros. Claro que a lo mejor es lo que pretendías, usar punteros. :rolleyes: *Es que el final del código, por no hablar del comienzo, no tiene ni pies ni cabeza: Código
* s+s ...¿eso que es? * uso de la variable cif cuando ya tienes cifras. * primeracifraa=&s; Si ya habías hecho antes la asociación. :rolleyes: * *************** Te dejo una salida del código que te pongo a posteriori sin y con con muchos printf,. Actívalos para que veas lo que el programa hace, que es ni más ni menos que lo que tú quieres: Citar Introduzca un número:22 11 8 132 324 9 2132 6972 6515 0 22 SI cumple la condicion 11 SI cumple la condicion 8 es menor de 10 132 NO cumple la condicion 324 SI cumple la condicion 9 es menor de 10 2132 SI cumple la condicion 6972 SI cumple la condicion 6515 NO cumple la condicion Código
Código
De todas formas, si querías usar punteros tal vez lo que sigue era lo adecuado: Código
O si lo quieres con variables globales, cosa que en principio se desaconseja: Código
Espero que disfrutes entre tanto código. ;) ;) ;) ¡¡¡¡ Saluditos! ..... !!!! (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) |