• Domingo 22 de Diciembre de 2024, 17:13

Autor Tema:  funciones retorno por puntero y return  (Leído 3020 veces)

crocop

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
funciones retorno por puntero y return
« en: Viernes 17 de Octubre de 2008, 02:20 »
0
hola como estan tengo un problema con este programa:
tengo que ingresar numeros enteros pero solo multiplos de 7 deben entrar en una matriz de m*n.
los datos no multiplos de 7 se pide devolver la cantidad de numeros y el promedio de ellos.
el problema no es en la resolucion del programa sino que tengo que devolver los 2 valores en el main principal y no por funcion osea ,   1 puntero y el otro por return.
aqui les dejo lo que tengo de antemano gracias. se agradecen lo aportes  8)
 
Código: Text
  1.  
  2. #include<stdio.h>
  3. #include<conio.h>
  4. void ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int *k,float *prom);
  5. void main ()
  6. {
  7. int m1[10][10],m2[10][10],v[20],m,n,sum,k=0;
  8. float prom=0;
  9. clrscr();
  10. printf("ingrese el tama¤o de la matrizn");
  11. scanf("%d",&m);
  12. scanf("%d",&n);
  13. ingreso(m1,m2,m,n,sum,&k,&prom);
  14. printf("la cantidad de n no multiplos son %dn",k);
  15. printf("el promedio es %gn",prom);
  16. getch();
  17. }
  18. void ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int *k,float *prom)
  19. {
  20. int i,j,p;
  21. for(i=0;i<m;i++){
  22.  for(j=0;j<n;j++){
  23. printf("ingrese los numeros a la matrizn");
  24. scanf("%d",&matriz1[i][j]);
  25. }
  26. }
  27. for(i=0;i<m;i++){
  28.  for(j=0;j<n;j++){
  29.  if(matriz1[i][j]%7==0){
  30.  matriz2[i][j]=matriz1[i][j];
  31.  }}}
  32.  for(i=0;i<m;i++){
  33.  for(j=0;j<n;j++){
  34.  if(matriz1[i][j]%7!=0){
  35.  sum=sum+matriz1[i][j];
  36.  *k++;
  37.   p++;
  38.  }}}
  39.  *prom=(sum/p);
  40.  }
  41.  
  42.  
  43.  

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: funciones retorno por puntero y return
« Respuesta #1 en: Viernes 17 de Octubre de 2008, 03:56 »
0
Cita de: "crocop"
tengo que devolver los 2 valores en el main principal y no por funcion osea ,   1 puntero y el otro por return.

estem...

devolver dos valores en el main?

o devolverlos de una funcion al main?

crocop

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: funciones retorno por puntero y return
« Respuesta #2 en: Viernes 17 de Octubre de 2008, 04:10 »
0
de una funcion al main por referencia 1 valor y el otro creo que por return. la idea es no delvolverlo en la funcion .saludos gracias por los aportes =)

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: funciones retorno por puntero y return
« Respuesta #3 en: Viernes 17 de Octubre de 2008, 04:15 »
0
oka


a q te refieres con la linea 36


para q es ese puntero aumentado, bah.. para q deberia ser, pq no esta usado, al igual q el vector v


fijate q en la funcion ingreso al final haces:     *prom=(sum/p);
sum es una variable por parametro, y cuando la pasas pasas basura pq prom no esta inicializada, y dentro de la funcion haces sum=sum+matriz1[j];  osea a basura le dejo basura + matriz[j] XDXD





ah! ya entendi para q haces *k++, pero la forma en q lo haces es incorrecta
*k++ le suma uno a el puntero k y dsp hace *
y lo q quieres no es sumarle uno a la direccion donde apunta K sino al valor de dentro entonces debes hacer

Código: Text
  1. (*k)++;
  2.  


otro error es el de no inicializar p en 0

Código: Text
  1. p++;
  2.  

p vale basura, asique basura ++ XD




ten cuidado con las no inicializaciones de las variables


Código: C
  1. #include<stdio.h>
  2.  
  3. void ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int *k,float *prom);
  4.  
  5. int main(void){
  6.     int m1[10][10],m2[10][10],/*v[20],*/m,n,sum = 0,k=0;
  7.     float prom=0;
  8.  
  9.     printf("ingrese el tama¤o de la matrizn");
  10.     scanf("%d",&m);
  11.     scanf("%d",&n);
  12.    
  13.     //sum vale basura
  14.     ingreso(m1,m2,m,n,sum,&k,&prom);
  15.    
  16.     printf("la cantidad de n no multiplos son %dn",k);
  17.     printf("el promedio es %fn",prom);
  18.     getchar();
  19.     return 0;
  20. }
  21. void ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int *k,float *prom){
  22.     int i,j,p = 0;
  23.    
  24.     for(i=0;i<m;i++){
  25.         for(j=0;j<n;j++){
  26.             printf("ingrese los numeros a la matrizn");
  27.             scanf("%d",&matriz1[i][j]);
  28.         }
  29.     }
  30.    
  31.     for(i=0;i<m;i++){
  32.         for(j=0;j<n;j++){
  33.             if(matriz1[i][j]%7==0){
  34.                 matriz2[i][j]=matriz1[i][j];
  35.             }
  36.         }
  37.     }
  38.    
  39.     for(i=0;i<m;i++){
  40.         for(j=0;j<n;j++){
  41.             if(matriz1[i][j]%7!=0){
  42.                 sum +=matriz1[i][j];
  43.                 (*k)++;
  44.                 p++;
  45.             }
  46.         }
  47.     }
  48.     (*prom)= (float)sum / (float)p;
  49.  }
  50.  
« última modificación: Viernes 17 de Octubre de 2008, 04:29 por Rombus »

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: funciones retorno por puntero y return
« Respuesta #4 en: Viernes 17 de Octubre de 2008, 04:22 »
0
:beer:


odio q usen la conio.h para hacer getch() y clrscr()
 :devil:

crocop

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: funciones retorno por puntero y return
« Respuesta #5 en: Viernes 17 de Octubre de 2008, 04:47 »
0
hola bro te agradesco un monton por tu ayuda, oye funciono perfecto ahora bien tengo unas dudas

para que cambias de void main() a int main(void)??

y el return 0; para que sirve

lo otro ahora bien los valores fueron pasados por referencia cierto del main a la funcion por punteros
. ahora como puedo pasar un resultado de la funcion al main pero sin punteros solamente devolviendolos por return como seria en el caso del promedio por ejemplo.

se agradece mucho con esto he avanzado un monton gracias..

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: funciones retorno por puntero y return
« Respuesta #6 en: Viernes 17 de Octubre de 2008, 05:00 »
0
me parece perfecto q me hagas esas preguntas   :beer:

hay otra que capaz te interese (si es que no lo habias entendido) que es esta:

Código: Text
  1. (*prom)= (float)sum / (float)p;
  2.  

primero q nada *prom entre parentesis para indicarle que quieres asignar el resultado del promedio en lo q tiene la direccion a la q apuntas, y no en el lugar donde dice a q direccion apuntar.

Luego casteo tanto sum y p a (float).

Supongamos este codigo:
Código: Text
  1. int a = 5, b = 2;
  2. float c;
  3.  
  4. c = a / b
  5.  

el resultado guardado en c seria 2.0000000, cuando lo logico hubiera sido un 2.5000000

entonces piensas "claro debo castear el resultado de a / b a float pq son enteros, el codigo quedaria asi:
Código: Text
  1. int a = 5, b = 2;
  2. float c;
  3.  
  4. c = (float)(a / b)
  5.  

y el resultado obtenido seria el mismo q antes! :O


pq el resultado de dividir el entero 5 con el entero 2 es 2 casteado a float es 2.0000000

por eso debes hacer un:
Código: Text
  1. int a = 5, b = 2;
  2. float c;
  3.  
  4. c = (float)a / (float)b
  5.  



la funcion main es una funcion como cualquier otra (con algunas particularidades) osea puede ser tanto void como int, como cualquier funcion... pero si es int debe devolver algo, un int presisamente, yo lo cambie a int main (void) y el return 0 pq uso linux y en mi compilador me tira un warning, lo q no significa q de la otra forma este mal.

el (void) significa que esa funcion no recibe parametros



y borre la conio.h y los clrscr() pq al usar linux no tengo la conio.h de borland, y el getch() se puede reemplazar por el getchar() de stdio.h q es ANSI.

una funcion solo puede devolver mediante el return un solo valor
por lo que hacer lo q quieres es medio dificil.
lo q puedes hacer es devolver un arreglo donde cada posicion tenga un dato, pero el arreglo tiene todos los elementos de un mismo tipo asique no podrias devolver dos ints y un float


si tienes mas dudas solo pregunta ;)>

crocop

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: funciones retorno por puntero y return
« Respuesta #7 en: Viernes 17 de Octubre de 2008, 05:33 »
0
hola bro yo de nuevo bueno tengo otras dudas xD

"primero q nada *prom entre parentesis para indicarle que quieres asignar el resultado del promedio en lo q tiene la direccion a la q apuntas, y no en el lugar donde dice a q direccion apuntar."

esto no lo entendi muy bien tu dices que el resultado prom en la funcion lo apuntamos a la funcion main cierto de la variable prom tambien osea el espacio de memoria .?

"claro debo castear el resultado de a / b a float pq son enteros, el codigo quedaria asi:"

castear es como redefinir el tipo de dato en un proceso del progra?

lo ultimo ahora si =)
modifique el programa ahora en ves de entregar el valor de k por puntero lo quiero entregar por return d ela funcion mira , pero no me funciono aqui esta lo que hize.
te agradesco un monton de verdad  :good:


Código: Text
  1. #include<stdio.h>
  2.     #include<conio.h>
  3.      
  4.     int ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int k,float *prom);
  5.      
  6.     int main(void){
  7.         int m1[10][10],m2[10][10],/*v[20],*/m,n,sum = 0,k=0;
  8.         float prom=0;
  9.      
  10.         printf("ingrese el tama¤o de la matrizn");
  11.        scanf("%d",&m);
  12.        scanf("%d",&n);
  13.      
  14.        //sum vale basura
  15.        ingreso(m1,m2,m,n,sum,k,&prom);
  16.      
  17.        printf("la cantidad de n no multiplos son %dn",k);
  18.        printf("el promedio es %fn",prom);
  19.        getch();
  20.        //return 0;
  21.    }
  22.    int ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int k,float *prom){
  23.        int i,j,p = 0;
  24.      
  25.        for(i=0;i<m;i++){
  26.           for(j=0;j<n;j++){
  27.                printf("ingrese los numeros a la matrizn");
  28.                scanf("%d",&matriz1[i][j]);
  29.            }
  30.        }
  31.      
  32.        for(i=0;i<m;i++){
  33.            for(j=0;j<n;j++){
  34.                if(matriz1[i][j]%7==0){
  35.                    matriz2[i][j]=matriz1[i][j];
  36.                }
  37.            }
  38.        }
  39.      
  40.        for(i=0;i<m;i++){
  41.            for(j=0;j<n;j++){
  42.                if(matriz1[i][j]%7!=0){
  43.                    sum +=matriz1[i][j];
  44.            k++;
  45.                    p++;
  46.              }
  47.            }
  48.        }
  49.      (*prom)= (float)sum / (float)p;
  50.      return(k);
  51.   }
  52.  

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: funciones retorno por puntero y return
« Respuesta #8 en: Viernes 17 de Octubre de 2008, 22:04 »
0
hola crocop!


castear es "cambiar" el tipo de dato, es entre comillas pq no camibas el tipo de dato, sino que en la instruccion donde lo utilizes la variable casteada va a ser interpretada como del tipo de dato que fue casteada, despues va a seguir siendo lo que siempre fue ;)

con respecto al prom entre parentesis

Código: Text
  1. (*prom)= (float)sum / (float)p;
  2.  

es por un tema de precedencia de operadores, agregando los parentesis a prom evitas algun posible problema de que el operador * tenga menor precedencia que el =.

lo que me refiero es que sin el parentesis el compilador podria interpretar el codigo de esta manera:

Código: Text
  1.  *(prom = (float)sum /(float)p)
  2.  

haciendo que prom apunte al resultado de la division, algo q no es razonable

pruebalo sin los parentesis, si da resultados erroneos, o una violacion de segmento es efectivamente como te dije recien, de lo contrario el operador * tiene mayor procedencia que el = .

me explico?


otra cosa, si tu main es de tipo int debe tener un return al final, pq le estas diciendo al compilador que la main devuelve un entero.
si tu main es de tipo void no hace falta ;)


el codigo esta bien, pero no te anda lo del return pq no lo agarras de ninguna lado en el main.
osea la funcion devuelve el valor y tu no lo agarras

Código: Text
  1. k = ingreso(m1,m2,m,n,sum,k,&prom);
  2.  

si haces esto, k va a "agarrar" el valor q devuelves y despues lo imprimes y list ;)









Código: C
  1. #include<stdio.h>
  2.    
  3. int ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int k,float *prom);
  4.      
  5. int main(void){
  6.     int m1[10][10],m2[10][10],/*v[20],*/m,n,sum = 0,k=0;
  7.     float prom=0;
  8.      
  9.     printf("ingrese el tama¤o de la matrizn");
  10.     scanf("%d",&m);
  11.     scanf("%d",&n);
  12.    
  13.     k = ingreso(m1,m2,m,n,sum,k,&prom);
  14.  
  15.     printf("la cantidad de n no multiplos son %dn",k);
  16.     printf("el promedio es %fn",prom);
  17.     getchar();
  18.     return 0;
  19. }
  20.  
  21. int ingreso(int matriz1[10][10], int matriz2[10][10], int m, int n,int sum,int k,float *prom){
  22.    int i,j,p = 0;
  23.  
  24.     for(i=0;i<m;i++){
  25.         for(j=0;j<n;j++){
  26.             printf("ingrese los numeros a la matrizn");
  27.             scanf("%d",&matriz1[i][j]);
  28.         }
  29.     }
  30.  
  31.     for(i=0;i<m;i++){
  32.         for(j=0;j<n;j++){
  33.             if(matriz1[i][j]%7==0){
  34.                 matriz2[i][j]=matriz1[i][j];
  35.             }
  36.         }
  37.     }
  38.  
  39.     for(i=0;i<m;i++){
  40.         for(j=0;j<n;j++){
  41.             if(matriz1[i][j]%7!=0){
  42.                 sum +=matriz1[i][j];
  43.                 k++;
  44.                 p++;
  45.             }
  46.         }
  47.     }
  48.     (*prom)= (float)sum / (float)p;
  49.     return(k);
  50. }
  51.  
  52.  

crocop

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: funciones retorno por puntero y return
« Respuesta #9 en: Sábado 18 de Octubre de 2008, 06:42 »
0
vale gracias me quedo muy claro, eres un master de la programacion  como dirian por ahi xD saludos  :beer:

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: funciones retorno por puntero y return
« Respuesta #10 en: Sábado 18 de Octubre de 2008, 17:24 »
0
XD de nada

y te recomiendo sinceramente que porgrames en ansi ;D

Saludos!

EL_UNI

  • Nuevo Miembro
  • *
  • Mensajes: 19
  • Nacionalidad: es
    • Ver Perfil
Re: funciones retorno por puntero y return
« Respuesta #11 en: Sábado 18 de Octubre de 2008, 17:49 »
0
Me gustaría aclarar una cosilla sobre el casting en este caso. No hace falta hacer un casting a los dos miembros de la operación. Simplemente con que el DIVISOR sea float, te aseguras que el resultado lo sea.

Código: C
  1.  
  2. (*prom) = sum / (float)p;
  3.  
  4.  

Lo explico en modo de aprendizaje. Nunca biene mal saber más ^^.

Otra cosa crocop, es MUY recomendable que entiendas muy bien los punteros y como funcionan (digo recomendable por no decir obligatorio) porque luego los verás y usarás a montones, a demás de que son muy útiles y prácticos (como has podido ver aquí)
Lo que no he entendido es porque querías que uno lo devolviea con return y el otro por puntero... Puedes hacer que los datos te los envíe por puntero y con el return se devuelva un entero para indicar si en la función hubo errores o no. (esto si es sobre gustos ^^)

Que main nos devuelva 0 (return 0; al final) nos indica que el programa ha concluido sin errores. Por eso también es recomendable hacerlo y tampoco es algo que sea muy laborioso.
Por cierto, Cuando a una función queremos que no se le pasen valores se puede escribir asi también. Es más cómodo:
Código: Text
  1.  
  2. int funcion()
  3. {
  4.     //Código de la función.
  5. }
  6.  
  7.  

Saludos y seguid con la programación! ^^
Programar es dejar fluir tu imaginación ^^ - EL_UNI