elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ejercicio -nivel intermedio- [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio -nivel intermedio- [C]  (Leído 2,942 veces)
SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Ejercicio -nivel intermedio- [C]
« en: 5 Enero 2014, 23:34 pm »

Hola, he estado intentando sacar este ejercicio:



Y aqui el codigo que he estado picando:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define N 5
  5.  
  6.  
  7. int funcion(int num);
  8.  
  9. void main(){
  10.  
  11. int num, contmain;
  12. int y;
  13. while(scanf("%d", &num) && num!= 0){ //para que el 0 marque el finales de la cadena
  14.  
  15. while(num/10!=0){ //while(el numero tenga como minimo, decenas)
  16.  
  17. y=funcion(num);
  18.  
  19. if(y==1){ contmain ++;
  20.                    printf("\n%d cumple la condicion", num);
  21. }
  22.  
  23. if(contmain<N)printf("%d numeros que cumplen la condicion", contmain);
  24. }
  25.  
  26. }
  27.  
  28. }
  29.  
  30. int funcion(int num){
  31.  
  32. 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
  33. int primeracifra;
  34.  
  35. for(i=10;i<=1000000;i*10){
  36.  
  37.    if(num/i!=0){
  38.            cont++; //contador de cifras
  39.            suma+=num/i;  //para ir sumando las cifras, recordemos que suma ya tiene asignado el valor de las unidades
  40.    }
  41.  
  42. }
  43. i=10;
  44.  
  45. primeracifra=num/pow(i,cont-1); //la primera cifra es el numero divido entre i elevado al contador -1
  46.  
  47. if(primeracifra==suma) return 1; //si se cumple la condicion retorna 1
  48. else return 0;
  49.  
  50. }
  51.  
  52.  

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


« Última modificación: 5 Enero 2014, 23:35 pm por SoyelRobert » En línea

getting louder!
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #1 en: 6 Enero 2014, 00:38 am »

¡Buenas!

Tienes un error de lógica en la línea 15:
Código
  1. while(num/10!=0)
  2.  

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 Desconectado

Mensajes: 46



Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #2 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
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define N 5
  5.  
  6.  
  7. int funcion(int num);
  8.  
  9. void main(){
  10.  
  11. int num, contmain;
  12. int y;
  13. if(scanf("%d", &num) && (num!= 0 && num>9)){
  14.  
  15. y=funcion(num);
  16.  
  17. if(y==1){ contmain ++;
  18.                    printf("\n%d cumple la condicion", num);
  19. }
  20.  
  21. if(contmain<N)printf("%d numeros que cumplen", contmain);
  22. }
  23.  
  24. }
  25.  
  26.  
  27.  
  28. int funcion(int num){
  29.  
  30. int i, suma, cont=1;
  31. int primeracifra;
  32.  
  33. suma=num%10;
  34.  
  35.  
  36. for(i=10;i<=1000000;i*10){
  37.  
  38.    if(num/i!=0){
  39.            cont++;
  40.            suma+=num/i;
  41.    }
  42.    else break;
  43. }
  44.  
  45.  
  46.  
  47.  
  48. primeracifra=num/(i/10);
  49.  
  50. if(primeracifra*cont==suma) return 1;
  51. else return 0;
  52.  
  53. }
  54.  

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
  1. for(i=10;i<=1000000;i*10){
  2.  
  3.    if(num/i!=0){
  4.            cont++;
  5.            suma+=num/i;
  6.    }
  7.    else break;
  8. }
  9.  

este bucle no acaba nunca y no se a que se puede deber. salu2
En línea

getting louder!
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #3 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
  1. /*
  2. Imprimir los N primeros numeros de una secuencia separados
  3.  por un espacio y terminado en cero y comprobar que la
  4.   primera cifra por el numero total de digitos sea igual
  5.   a la suma de los digitos.
  6. */
  7. #include <stdio.h>
  8. #define N 5
  9.  
  10. int funcion(int num);
  11.  
  12. int main()
  13. {
  14.    int i,y,num, contmain=0,num_0;
  15.    printf ("Introduzca un n%cmero:",163);
  16.    fflush (stdout);
  17.    while((scanf("%d", &num) && num!= 0)!=0)
  18.        {
  19.            num_0=num;
  20.            if(funcion(num)==1)
  21.                {
  22.                    contmain ++;
  23.                    printf("\n%6d cumple la condici%cn", num_0,162);
  24.                    fflush (stdout);
  25.                }
  26.            else if(funcion(num)==0)
  27.                {
  28.                    contmain ++;
  29.                    printf("\n%6d  no cumple la condici%cn", num_0,162);
  30.                    fflush (stdout);
  31.                }
  32.        }
  33.    if (contmain<N)
  34.    {
  35.        printf("\nSe han introducido %d n%cmeros que cumplen la condicion", contmain,163);
  36.        fflush (stdout);
  37.    }
  38.  
  39.    return 0;
  40. }
  41.  
  42.  
  43. int funcion(int num)
  44. {
  45.    int i,sum_dig=0,num_0,num_1,n_cifras=0;
  46.    num_0=num_1=num;
  47.    int primeracifra;
  48.    for(i=10;num_0/i!=0;i*=10)//obtengo cifras de cada numero
  49.        n_cifras++;
  50.    while (num!=0)  //
  51.        {
  52.            sum_dig+=(num%10); //para sacar el ultimo digito del numero
  53.            num=num/10; //elimina el ultimo digito de numero
  54.        }
  55.    for (i=1;num_1>=10;i--) //obtengo primera cifra
  56.        num_1/=10;
  57.    primeracifra=num_1;
  58.    if(primeracifra*(n_cifras+1)==sum_dig)
  59.        return 1; //si se cumple la condicion retorna 1
  60.    else
  61.        return 0;
  62. }
  63.  
« Última modificación: 6 Enero 2014, 19:56 pm por leosansan » En línea

SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #4 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
En línea

getting louder!
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #5 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:
« Última modificación: 21 Enero 2014, 22:24 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #6 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
  1. #include <stdlib.h>
  2.  
  3. int fn(int num, int *digitos, int *suma)
  4. {
  5.   div_t r;
  6.  
  7.   *digitos = *suma = 0;
  8.   do {
  9.      r = div(num, 10);
  10.  
  11.      *suma += r.rem;
  12.      ++*digitos;
  13.   }while ((num = r.quot) != 0);
  14.  
  15.   return r.rem; /* Se retorna el ultimo digito */
  16. }
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:
Código
  1. 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 Desconectado

Mensajes: 46



Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #7 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
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int funcion(int numero);
  5. void main(){
  6.  
  7. int numero; int cifras; int primeracifra; int suma=0;
  8.  
  9. siguiente:
  10.  
  11. suma=0;
  12.  
  13. scanf("%d", &numero);
  14.  
  15. if(numero==0 || scanf("%d", &numero)!=1){
  16.        puts("\nfin de datos o datos incorrectos");
  17.        return;
  18. }
  19. if(funcion(numero)==-1) goto siguiente;
  20. else{
  21.        if(primeracifra*cifras==suma) printf("\n%d cumple la condicion");
  22.        fflush(stdout);
  23.        goto siguiente;
  24. }
  25. }
  26.  
  27.  
  28. int funcion (int numero){
  29.  
  30. int cifra=1; int *cifras=cifras; int *suma=suma; int *primeracifra=primeracifra;
  31. int i=10;
  32.  
  33. if(numero%i==0) return -1; //numero de una sola cifra
  34. cifra++;
  35. for(i;i<=10000000000;i=i*10){
  36.    if(numero/i==0) break;
  37.    cifra++;
  38. }
  39. *cifras=cifra;
  40. for(cifra;cifra>1;cifra--){
  41.    *suma=numero/(pow(10,cifra));
  42.    *suma=*suma+*suma;
  43. }
  44. *suma=*suma+(numero%10);
  45. *primeracifra=(numero/pow(10,*cifras));
  46. }

salu2

medificado:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. void funcion(int numero, int *cifrass, int *primeracifraa, int *sumaa);
  5. void main(){
  6.  
  7. int numero; int cifras; int primeracifra; int suma=0;
  8. int *cifrass;
  9. int *primeracifraa;
  10. int *sumaa;
  11.  
  12. *cifrass=cifras;
  13. *primeracifraa=primeracifra;
  14. *sumaa=suma;
  15.  
  16.  
  17. suma=0;
  18.  
  19. while(scanf("%d", &numero) && numero != 0){
  20.  
  21. if(numero/10==0) continue;
  22. funcion (numero, cifrass, primeracifraa, sumaa);
  23. if(primeracifra*cifras==suma) printf("\n%d cumple la condicion");
  24. fflush(stdout);
  25. }
  26. }
  27.  
  28.  
  29.  
  30. void funcion(int numero, int *cifrass, int *primeracifraa, int *sumaa){
  31.  
  32. int cifra=2; int s;
  33. int i=100;
  34. int cif;
  35.  
  36. for(i;i<=10000000000;i=i*10){
  37.    if(numero/i==0) break;
  38.    cifra++;
  39. }
  40. cifrass=&cifra;
  41. for(cifra;cifra>1;cifra--){
  42.    s=numero/(pow(10,cifra));
  43.    s=s+s;
  44. }
  45. cif=cifra;
  46. sumaa=&s+(numero%10);
  47. s=(numero/pow(10,cif));
  48. primeracifraa=&s;
  49. }
  50.  

sigue sin salir.

edit: obviad lo del declarar a main como un void hehe  :silbar:
« Última modificación: 16 Enero 2014, 20:23 pm por SoyelRobert » En línea

getting louder!
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Ejercicio -nivel intermedio- [C]
« Respuesta #8 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 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. :rolleyes:

*Es que el final del código, por no hablar del comienzo, no tiene ni pies ni cabeza:


Código
  1. ..............................
  2.  
  3. for(i;i<=10000000000;i=i*10){
  4.    if(numero/i==0) break;
  5.    cifra++;
  6. }
  7. cifrass=&cifra;
  8. for(cifra;cifra>1;cifra--){
  9.    s=numero/(pow(10,cifra));
  10.    s=s+s;
  11. }
  12. cif=cifra;
  13. sumaa=&s+(numero%10);
  14. s=(numero/pow(10,cif));
  15. primeracifraa=&s;
  16. }
  17. .........................
  18.  

* 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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa);
  6.  
  7. int main(){
  8.  int i,numero, cifras=0, primeracifra=0;
  9.  float suma=0;
  10.  int *cifrass=&cifras;
  11.  int *primeracifraa=&primeracifra;
  12.  float *sumaa=&suma;
  13.  printf ("Introduzca un n%cmero:",163);
  14.  fflush (stdout);
  15.  while((scanf("%d", &numero)==1 && numero!= 0 )!=0){
  16.    cifras=0,suma=0;
  17.    if (numero>9){
  18.      funcion (numero, cifrass, primeracifraa, sumaa);
  19.      if(*primeracifraa*((*cifrass)+1)==*sumaa) {
  20.        printf("\n%d SI cumple la condicion",numero);
  21.        fflush(stdout);
  22.      }
  23.      else
  24.      printf("\n%d NO cumple la condicion",numero);
  25.    }
  26.    else
  27.      printf("\n%d es menor de 10",numero);
  28.  }
  29.  return 0;
  30. }
  31.  
  32. void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa){
  33.  int i,num=numero,cifras=0;
  34.  for(i=10;numero/i!=0;i=i*10)
  35.      (*cifrass)++;
  36.  (*primeracifraa)=numero/ pow(10,*cifrass);
  37.  for(i=*cifrass;i>=0;i--){
  38.    (*sumaa)+=(int)(num/(pow(10,i)));
  39.    num=(int)fmod(num,pow(10,i)) ;
  40.  }
  41. }
  42.  


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>  /*es solo por el system, en realidad esta de mas*/
  3. #include <math.h>
  4.  
  5. void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa);
  6.  
  7. int main(){
  8.  int i,numero, cifras=0, primeracifra=0;
  9.  float suma=0;
  10.  int *cifrass=&cifras;
  11.  int *primeracifraa=&primeracifra;
  12.  float *sumaa=&suma;
  13.  //printf ("*cifrass= = %d   *primeracifraa=%d   *sumaa=%d\n",*cifrass,*primeracifraa,*sumaa);
  14.  system("pause");*/
  15.  printf ("Introduzca un n%cmero:",163);
  16.  fflush (stdout);
  17.  while((scanf("%d", &numero)==1 && numero!= 0 )!=0){
  18.    //printf ("\nnum=%d",numero);
  19.    cifras=0,suma=0;
  20.    if (numero>9){
  21.      funcion (numero, cifrass, primeracifraa, sumaa);
  22.      if(*primeracifraa*((*cifrass)+1)==*sumaa) {
  23.        printf("\n%d SI cumple la condicion",numero);
  24.        fflush(stdout);
  25.      }
  26.      else
  27.      printf("\n%d NO cumple la condicion",numero);
  28.    }
  29.    else
  30.      printf("\n%d es menor de 10",numero);
  31.  }
  32.  return 0;
  33. }
  34.  
  35. void funcion(int numero, int *cifrass, int *primeracifraa, float *sumaa){
  36.  //puts("\nENTRO");
  37.  //printf ("numero= %d   *cifrass= = %d   *primeracifraa=%d   *sumaa=%d\n",numero,*cifrass,*primeracifraa,*sumaa);
  38.  int i,num=numero,cifras=0;
  39.  //*cifrass=&cifras;
  40.  for(i=10;numero/i!=0;i=i*10){
  41.      (*cifrass)++;
  42.      //printf ("\*cifra=%d   i=%d\n",*cifrass,i);
  43.  }
  44.  //printf ("numero= %d   *cifrass= = %d   *primeracifraa=%d  \n",numero,*cifrass,*primeracifraa);
  45.  (*primeracifraa)=numero/ pow(10,*cifrass);
  46.  //printf ("\*primeracifraa=%d \n",*primeracifraa);system("pause");
  47.  
  48.  for(i=*cifrass;i>=0;i--){
  49.    (*sumaa)+=(int)(num/(pow(10,i)));
  50.    num=fmod(num,pow(10,i)) ;
  51.    //printf ("\nnum=%d   %d   sumaa=%g \n",num,(int) (num/pow(10,i)),*sumaa);system("pause");
  52.  }
  53. }
  54.  

De todas formas, si querías usar punteros tal vez lo que sigue era lo adecuado:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5.  
  6. void funcion(int numero, int *cifras, int *primeracifra, int *suma);
  7.  
  8. int main(){
  9.  int i,numero,cifras=0,suma=0,primeracifra=0;
  10.  printf ("Introduzca un n%cmero:",163);
  11.  fflush (stdout);
  12.  while((scanf("%d", &numero)==1 && numero!= 0 )!=0){
  13.  
  14.    if (numero>9){
  15.      funcion (numero, &cifras, &primeracifra, &suma);
  16.      if(primeracifra*(cifras+1)==suma) {
  17.        printf("\n%d SI cumple la condicion",numero);
  18.        fflush(stdout);
  19.      }
  20.      else
  21.      printf("\n%d NO cumple la condicion",numero);
  22.    }
  23.    else
  24.      printf("\n%d es menor de 10",numero);
  25.  }
  26.  return 0;
  27. }
  28.  
  29. void funcion(int numero, int *cifras, int *primeracifra, int *suma){
  30.  int i,num=numero;
  31.  *cifras=0;*suma=0;*primeracifra=0;
  32.  for(i=10;numero/i!=0;i=i*10)
  33.      (*cifras)++;
  34.  *primeracifra=(int)(numero/ pow(10,*cifras));
  35.  for(i=(*cifras);i>=0;i--){
  36.    *suma+=(int)(numero/ pow(10,i));
  37.    numero=(int)fmod(numero,pow(10,i)) ;
  38.  }
  39. }
  40.  

O si lo quieres con variables globales, cosa que en principio se desaconseja:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int  cifras, primeracifra, suma;
  6.  
  7. void funcion(int numero);
  8.  
  9. int main(){
  10.  int i,numero;
  11.  printf ("Introduzca un n%cmero:",163);
  12.  fflush (stdout);
  13.  while((scanf("%d", &numero)==1 && numero!= 0 )!=0){
  14.    if (numero>9){
  15.      funcion (numero);
  16.      if(primeracifra*(cifras+1)==suma) {
  17.        printf("\n%d SI cumple la condicion",numero);
  18.        fflush(stdout);
  19.      }
  20.      else
  21.      printf("\n%d NO cumple la condicion",numero);
  22.    }
  23.    else
  24.      printf("\n%d es menor de 10",numero);
  25.  }
  26.  return 0;
  27. }
  28.  
  29. void funcion(int numero){
  30.  int i,num=numero;
  31.  cifras=0;suma=0;primeracifra=0;
  32.  for(i=10;numero/i!=0;i=i*10)
  33.      cifras++;
  34.  primeracifra=(int)(numero/ pow(10,cifras));
  35.  for(i=cifras;i>=0;i--){
  36.    (suma)+=(int)(num/ pow(10,i));
  37.    num=(int)fmod(num,pow(10,i)) ;
  38.  }
  39. }
  40.  

Espero que disfrutes entre tanto código. ;) ;) ;)

¡¡¡¡ Saluditos! ..... !!!!



« Última modificación: 21 Enero 2014, 22:29 pm por leosansan » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
HTML5 - Nivel intermedio [MANUAL]
Desarrollo Web
peib0l 0 2,631 Último mensaje 2 Febrero 2012, 13:33 pm
por peib0l
Varias dudas java , nivel intermedio
Java
r7pyrred 3 1,874 Último mensaje 15 Febrero 2013, 17:26 pm
por BatchianoISpyxolo
Ejercicio c#[Nivel intermedio]
Ejercicios
Senior++ 1 3,652 Último mensaje 20 Octubre 2017, 21:43 pm
por Panzeta
Ejercicio javascript - Nivel Medio
Ejercicios
RaloGomez 1 2,233 Último mensaje 16 Octubre 2016, 17:39 pm
por surfdata
Libro a elegir Python Nivel Intermedio
Programación General
enrOscar 1 1,597 Último mensaje 5 Junio 2021, 14:44 pm
por NEZU
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines