Autor
|
Tema: Ejercicio -nivel intermedio- [C] (Leído 4,439 veces)
|
SoyelRobert
Desconectado
Mensajes: 46
|
Hola, he estado intentando sacar este ejercicio: Y aqui el codigo que he estado picando: #include <stdio.h> #include <math.h> #define N 5 int funcion(int num); void main(){ int num, contmain; int y; while(scanf("%d", &num) && num!= 0){ //para que el 0 marque el finales de la cadena while(num/10!=0){ //while(el numero tenga como minimo, decenas) y=funcion(num); if(y==1){ contmain ++; printf("\n%d cumple la condicion", num); } if(contmain<N)printf("%d numeros que cumplen la condicion", contmain); } } } int funcion(int num){ int i, suma=num%10, cont=1; //este contador cuenta en numero de cifras del numero y la variable suma empieza con el valor de las unidades del numero int primeracifra; for(i=10;i<=1000000;i*10){ if(num/i!=0){ cont++; //contador de cifras suma+=num/i; //para ir sumando las cifras, recordemos que suma ya tiene asignado el valor de las unidades } } i=10; primeracifra=num/pow(i,cont-1); //la primera cifra es el numero divido entre i elevado al contador -1 if(primeracifra==suma) return 1; //si se cumple la condicion retorna 1 else return 0; }
el codigo compila con 0 errores y 0 warnings pero a la hora de ejecutarlo y meter los numeros se cuelga. Agradezco cualquier aportacion EDIT: disculpas por no indentar el codigo pero soy un inutil incapaz
|
|
« Última modificación: 5 Enero 2014, 23:35 pm por SoyelRobert »
|
En línea
|
getting louder!
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡Buenas! Tienes un error de lógica en la línea 15: while(num/10!=0)
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!
|
|
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
SoyelRobert
Desconectado
Mensajes: 46
|
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 sobre el codigo, he tenido en cuenta lo que me has dicho y lo he medificado tal que asi: #include <stdio.h> #include <math.h> #define N 5 int funcion(int num); void main(){ int num, contmain; int y; if(scanf("%d", &num) && (num!= 0 && num>9)){ y=funcion(num); if(y==1){ contmain ++; printf("\n%d cumple la condicion", num); } if(contmain<N)printf("%d numeros que cumplen", contmain); } } int funcion(int num){ int i, suma, cont=1; int primeracifra; suma=num%10; for(i=10;i<=1000000;i*10){ if(num/i!=0){ cont++; suma+=num/i; } else break; } primeracifra=num/(i/10); if(primeracifra*cont==suma) return 1; else return 0; }
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: for(i=10;i<=1000000;i*10){ if(num/i!=0){ cont++; suma+=num/i; } else break; }
este bucle no acaba nunca y no se a que se puede deber. salu2
|
|
|
En línea
|
getting louder!
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:
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. /* Imprimir los N primeros numeros de una secuencia separados por un espacio y terminado en cero y comprobar que la primera cifra por el numero total de digitos sea igual a la suma de los digitos. */ #include <stdio.h> #define N 5 int funcion(int num); int main() { int i,y,num, contmain=0,num_0; printf ("Introduzca un n%cmero:",163); fflush (stdout); while((scanf("%d", &num) && num!= 0)!=0) { num_0=num; if(funcion(num)==1) { contmain ++; printf("\n%6d cumple la condici%cn", num_0,162); fflush (stdout); } else if(funcion(num)==0) { contmain ++; printf("\n%6d no cumple la condici%cn", num_0,162); fflush (stdout); } } if (contmain<N) { printf("\nSe han introducido %d n%cmeros que cumplen la condicion", contmain,163); fflush (stdout); } return 0; } int funcion(int num) { int i,sum_dig=0,num_0,num_1,n_cifras=0; num_0=num_1=num; int primeracifra; for(i=10;num_0/i!=0;i*=10)//obtengo cifras de cada numero n_cifras++; while (num!=0) // { sum_dig+=(num%10); //para sacar el ultimo digito del numero num=num/10; //elimina el ultimo digito de numero } for (i=1;num_1>=10;i--) //obtengo primera cifra num_1/=10; primeracifra=num_1; if(primeracifra*(n_cifras+1)==sum_dig) return 1; //si se cumple la condicion retorna 1 else return 0; }
|
|
« Última modificación: 6 Enero 2014, 19:56 pm por leosansan »
|
En línea
|
|
|
|
SoyelRobert
Desconectado
Mensajes: 46
|
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. 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. Y lo de las variables con operaciones dentro.. si, es verdad gracias 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
|
|
|
En línea
|
getting louder!
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
........................................................................... 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. .................................................. 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! ..... !!!!
|
|
« Última modificación: 21 Enero 2014, 22:24 pm por leosansan »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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: #include <stdlib.h> int fn(int num, int *digitos, int *suma) { div_t r; *digitos = *suma = 0; do { *suma += r.rem; ++*digitos; }while ((num = r.quot) != 0); return r.rem; /* Se retorna el ultimo digito */ }
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.
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. 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. 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: while (scanf("%d", &num ) == 1 && num != 0) ...
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
SoyelRobert
Desconectado
Mensajes: 46
|
perdon por este reflote pero he estado volviendo a intentar sacar el ejercicio desde 0 y no hay manera alguien podria explicarme porque este codigo no funciona?, se que debo tener algun error de logica o algo pero no soy capaz de autocorregirme: #include <stdio.h> #include <math.h> int funcion(int numero); void main(){ int numero; int cifras; int primeracifra; int suma=0; siguiente: suma=0; scanf("%d", &numero); if(numero==0 || scanf("%d", &numero)!=1){ puts("\nfin de datos o datos incorrectos"); return; } if(funcion(numero)==-1) goto siguiente; else{ if(primeracifra*cifras==suma) printf("\n%d cumple la condicion"); fflush(stdout); goto siguiente; } } int funcion (int numero){ int cifra=1; int *cifras=cifras; int *suma=suma; int *primeracifra=primeracifra; int i=10; if(numero%i==0) return -1; //numero de una sola cifra cifra++; for(i;i<=10000000000;i=i*10){ if(numero/i==0) break; cifra++; } *cifras=cifra; for(cifra;cifra>1;cifra--){ *suma=numero/(pow(10,cifra)); *suma=*suma+*suma; } *suma=*suma+(numero%10); *primeracifra=(numero/pow(10,*cifras)); }
salu2 medificado: #include <stdio.h> #include <math.h> void funcion(int numero, int *cifrass, int *primeracifraa, int *sumaa); void main(){ int numero; int cifras; int primeracifra; int suma=0; int *cifrass; int *primeracifraa; int *sumaa; *cifrass=cifras; *primeracifraa=primeracifra; *sumaa=suma; suma=0; while(scanf("%d", &numero) && numero != 0){ if(numero/10==0) continue; funcion (numero, cifrass, primeracifraa, sumaa); if(primeracifra*cifras==suma) printf("\n%d cumple la condicion"); fflush(stdout); } } void funcion(int numero, int *cifrass, int *primeracifraa, int *sumaa){ int cifra=2; int s; int i=100; int cif; for(i;i<=10000000000;i=i*10){ if(numero/i==0) break; cifra++; } cifrass=&cifra; for(cifra;cifra>1;cifra--){ s=numero/(pow(10,cifra)); s=s+s; } cif=cifra; sumaa=&s+(numero%10); s=(numero/pow(10,cif)); primeracifraa=&s; }
sigue sin salir. edit: obviad lo del declarar a main como un void hehe
|
|
« Última modificación: 16 Enero 2014, 20:23 pm por SoyelRobert »
|
En línea
|
getting louder!
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
perdon por este reflote pero he estado volviendo a intentar sacar el ejercicio desde 0 y no hay manera
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.
*¿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 implica el uso de float o double ya no vale % sino la función fmod
* ********
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.
*Es que el final del código, por no hablar del comienzo, no tiene ni pies ni cabeza:.............................. for(i;i<=10000000000;i=i*10){ if(numero/i==0) break; cifra++; } cifrass=&cifra; for(cifra;cifra>1;cifra--){ s=numero/(pow(10,cifra)); s=s+s; } cif=cifra; sumaa=&s+(numero%10); s=(numero/pow(10,cif)); primeracifraa=&s; } .........................
* 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.
* ***************
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: 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
#include <stdio.h> #include <stdlib.h> #include <math.h> void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa); int main(){ int i,numero, cifras=0, primeracifra=0; float suma=0; int *cifrass=&cifras; int *primeracifraa=&primeracifra; float *sumaa=&suma; printf ("Introduzca un n%cmero:",163); fflush (stdout); while((scanf("%d", &numero)==1 && numero!= 0 )!=0){ cifras=0,suma=0; if (numero>9){ funcion (numero, cifrass, primeracifraa, sumaa); if(*primeracifraa*((*cifrass)+1)==*sumaa) { printf("\n%d SI cumple la condicion",numero); fflush(stdout); } else printf("\n%d NO cumple la condicion",numero); } else printf("\n%d es menor de 10",numero); } return 0; } void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa){ int i,num=numero,cifras=0; for(i=10;numero/i!=0;i=i*10) (*cifrass)++; (*primeracifraa)=numero/ pow(10,*cifrass); for(i=*cifrass;i>=0;i--){ (*sumaa)+=(int)(num/(pow(10,i))); num=(int)fmod(num,pow(10,i)) ; } }
#include <stdio.h> #include <stdlib.h> /*es solo por el system, en realidad esta de mas*/ #include <math.h> void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa); int main(){ int i,numero, cifras=0, primeracifra=0; float suma=0; int *cifrass=&cifras; int *primeracifraa=&primeracifra; float *sumaa=&suma; //printf ("*cifrass= = %d *primeracifraa=%d *sumaa=%d\n",*cifrass,*primeracifraa,*sumaa); system("pause");*/ printf ("Introduzca un n%cmero:",163); fflush (stdout); while((scanf("%d", &numero)==1 && numero!= 0 )!=0){ //printf ("\nnum=%d",numero); cifras=0,suma=0; if (numero>9){ funcion (numero, cifrass, primeracifraa, sumaa); if(*primeracifraa*((*cifrass)+1)==*sumaa) { printf("\n%d SI cumple la condicion",numero); fflush(stdout); } else printf("\n%d NO cumple la condicion",numero); } else printf("\n%d es menor de 10",numero); } return 0; } void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa){ //puts("\nENTRO"); //printf ("numero= %d *cifrass= = %d *primeracifraa=%d *sumaa=%d\n",numero,*cifrass,*primeracifraa,*sumaa); int i,num=numero,cifras=0; //*cifrass=&cifras; for(i=10;numero/i!=0;i=i*10){ (*cifrass)++; //printf ("\*cifra=%d i=%d\n",*cifrass,i); } //printf ("numero= %d *cifrass= = %d *primeracifraa=%d \n",numero,*cifrass,*primeracifraa); (*primeracifraa)=numero/ pow(10,*cifrass); //printf ("\*primeracifraa=%d \n",*primeracifraa);system("pause"); for(i=*cifrass;i>=0;i--){ (*sumaa)+=(int)(num/(pow(10,i))); num=fmod(num,pow(10,i)) ; //printf ("\nnum=%d %d sumaa=%g \n",num,(int) (num/pow(10,i)),*sumaa);system("pause"); } }
De todas formas, si querías usar punteros tal vez lo que sigue era lo adecuado:#include <stdio.h> #include <stdlib.h> #include <math.h> void funcion(int numero, int *cifras, int *primeracifra, int *suma); int main(){ int i,numero,cifras=0,suma=0,primeracifra=0; printf ("Introduzca un n%cmero:",163); fflush (stdout); while((scanf("%d", &numero)==1 && numero!= 0 )!=0){ if (numero>9){ funcion (numero, &cifras, &primeracifra, &suma); if(primeracifra*(cifras+1)==suma) { printf("\n%d SI cumple la condicion",numero); fflush(stdout); } else printf("\n%d NO cumple la condicion",numero); } else printf("\n%d es menor de 10",numero); } return 0; } void funcion(int numero, int *cifras, int *primeracifra, int *suma){ int i,num=numero; *cifras=0;*suma=0;*primeracifra=0; for(i=10;numero/i!=0;i=i*10) (*cifras)++; *primeracifra=(int)(numero/ pow(10,*cifras)); for(i=(*cifras);i>=0;i--){ *suma+=(int)(numero/ pow(10,i)); numero=(int)fmod(numero,pow(10,i)) ; } }
O si lo quieres con variables globales, cosa que en principio se desaconseja:#include <stdio.h> #include <stdlib.h> #include <math.h> int cifras, primeracifra, suma; void funcion(int numero); int main(){ int i,numero; printf ("Introduzca un n%cmero:",163); fflush (stdout); while((scanf("%d", &numero)==1 && numero!= 0 )!=0){ if (numero>9){ funcion (numero); if(primeracifra*(cifras+1)==suma) { printf("\n%d SI cumple la condicion",numero); fflush(stdout); } else printf("\n%d NO cumple la condicion",numero); } else printf("\n%d es menor de 10",numero); } return 0; } void funcion(int numero){ int i,num=numero; cifras=0;suma=0;primeracifra=0; for(i=10;numero/i!=0;i=i*10) cifras++; primeracifra=(int)(numero/ pow(10,cifras)); for(i=cifras;i>=0;i--){ (suma)+=(int)(num/ pow(10,i)); num=(int)fmod(num,pow(10,i)) ; } }
Espero que disfrutes entre tanto código. ¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 21 Enero 2014, 22:29 pm por leosansan »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
HTML5 - Nivel intermedio [MANUAL]
Desarrollo Web
|
peib0l
|
0
|
3,433
|
2 Febrero 2012, 13:33 pm
por peib0l
|
|
|
Varias dudas java , nivel intermedio
Java
|
r7pyrred
|
3
|
2,796
|
15 Febrero 2013, 17:26 pm
por BatchianoISpyxolo
|
|
|
Ejercicio c#[Nivel intermedio]
Ejercicios
|
Senior++
|
1
|
5,669
|
20 Octubre 2017, 21:43 pm
por Panzeta
|
|
|
Ejercicio javascript - Nivel Medio
Ejercicios
|
RaloGomez
|
1
|
4,004
|
16 Octubre 2016, 17:39 pm
por surfdata
|
|
|
Libro a elegir Python Nivel Intermedio
Programación General
|
enrOscar
|
1
|
4,187
|
5 Junio 2021, 14:44 pm
por DebianWizzard
|
|