Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con funciones

Estas en el tema de problema con funciones en el foro de C/C++ en Foros del Web. hola hice este programa, y despues lo quise hacer con funciones, pero siempre me da fallos, soy nuevo manejando funciones, si alguien me puede ayudar, ...
  #1 (permalink)  
Antiguo 09/11/2010, 12:56
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
problema con funciones

hola hice este programa, y despues lo quise hacer con funciones, pero siempre me da fallos, soy nuevo manejando funciones, si alguien me puede ayudar, muchas gracias

codigo original:
Código C:
Ver original
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. main()
  6. {
  7.    
  8.     int partidos=0;
  9.        
  10.     printf("\n\n Bienvenido al sistema de calculo de escanos.\n por favor siga las instrucciones, gracias\n");
  11.  
  12.     while ( partidos <2 || partidos>16){
  13.         printf("\n eliga el numero de partidos politicos que desea (numero entre 2 y 16)\t");
  14.         scanf("%d",&partidos);
  15.     }
  16.     /*system('clear');*/
  17.     int mpartidos[17][50];
  18.    
  19.     float votos;
  20.    
  21.     int i;
  22.     int f;
  23.     int c;
  24.    
  25.     for (f=0;f<partidos;f++){
  26.         for (c=0;c<50;c++){
  27.  
  28.             mpartidos[f][c]=0;
  29.         }
  30.     }
  31.     int escanos=0;
  32.         while (escanos<7 || escanos>100){
  33.         printf("\n numero de escanos:(numero entre 7 y 100)\t");
  34.         scanf("%d",&escanos);
  35.     }
  36.     /*system('clear');*/
  37.     int a=0;
  38.     printf("\n A continuacion meta los votos recibidos por cada partido:\n");
  39.     for (i=0;i<partidos;i++){
  40.         a=i+1;
  41.         printf("\n partido(%d)=\t",a);
  42.         scanf("%f",&votos);
  43.         mpartidos[i][0]=votos;
  44.     }
  45.    
  46.     printf("\n\n Ahora el programa calculara los escanos segun este  metodo:\n \n D'HONT \n \n ");
  47.      
  48.      int TAM=100;
  49.    
  50.     /*METODO DHONT*/
  51.     float mdhont[17][1000];
  52.     float aq;
  53.     int fil;
  54.     int col;
  55.     float cl;
  56.     for (fil=0;fil<partidos;fil++){
  57.         cl=0;
  58.         for (col=0;col<TAM;col++){
  59.             aq=(mpartidos[fil][0])/(cl+1);
  60.             mdhont[fil][col]=(aq);
  61.             cl++;
  62.         }
  63.         printf("\n");
  64.     }
  65.     printf("\n");
  66.    
  67.    
  68.     float mx=0;
  69.     int aa,bb;
  70.     for(i=0;i<escanos;i++){
  71.         for (fil=0;fil<partidos;fil++){
  72.             for (col=0;col<TAM;col++){
  73.                 if (mdhont[fil][col]>mx){
  74.                     mx=mdhont[fil][col];
  75.                     aa=fil;
  76.                     bb=col;
  77.                 }
  78.             }
  79.         }
  80.         mdhont[aa][bb]=0;
  81.        
  82.         mx=0;
  83.         mpartidos[aa][1]=mpartidos[aa][1]+1;
  84.     }
  85.            
  86.     /*system("clear");*/
  87.    
  88.     /*fin metodo DHONT*/
  89.    
  90.     /*system("clear");*/
  91.     printf("\n\t\tDHONT \n");
  92.     int z;
  93.     for (i=0; i<partidos; i++) {
  94.                     z=i+1;
  95.                     printf("\n partido%d \t%d  n",z,mpartidos[i][1]);
  96.                 }
  97.    
  98.    
  99.     printf("\n");
  100. }
CODIGO CON FUNCIONES:----------------------------------------------------------------------------------------
Código C:
Ver original
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5.     void traspaso(float *metodo1,float aux,int p,int T){
  6.    
  7.         int fil;
  8.         int col;
  9.         float cl=0;
  10.         for (fil=0;fil<p;fil++){
  11.             cl=0;
  12.             for (col=0;col<T;col++){
  13.                 *metodo1=(aux);
  14.                 cl++;
  15.             }
  16.             printf("\n");
  17.         }
  18.     return ;
  19.     }
  20.    
  21.     void max_escans(float *metodo2,float mpart,int esca,int p,int T){
  22.         int fil;
  23.         int col;
  24.         int i;
  25.         float mx=0;
  26.         int aa,bb;
  27.         for(i=0;i<esca;i++){
  28.             for (fil=0;fil<p;fil++){
  29.                 for (col=0;col<T;col++){
  30.                     if (*metodo2>mx){
  31.                         mx=*metodo2;
  32.                         aa=fil;
  33.                         bb=col;
  34.                     }
  35.                 }
  36.             }
  37.             metodo2=0;
  38.        
  39.             mx=0;
  40.             mpart=mpart+1;
  41.         }
  42.    
  43.     }
  44.    
  45. main()
  46. {
  47.     int partidos=0;
  48.     printf("\n\n Bienvenido al sistema de calculo de escanos.\n por favor siga las instrucciones, gracias\n");
  49.  
  50.     while ( partidos <2 || partidos>16){
  51.         printf("\n eliga el numero de partidos politicos que desea (numero entre 2 y 16)\t");
  52.         scanf("%d",&partidos);
  53.     }
  54.     /*system('clear');*/
  55.     int mpartidos[17][50];
  56.     float votos;
  57.     int i;
  58.     int f;
  59.     int c;
  60.    
  61.     for (f=0;f<partidos;f++){
  62.         for (c=0;c<50;c++){
  63.             mpartidos[f][c]=0;
  64.         }
  65.     }
  66.     int escanos=0;
  67.         while (escanos<7 || escanos>100){
  68.         printf("\n numero de escanos:(numero entre 7 y 100)\t");
  69.         scanf("%d",&escanos);
  70.     }
  71.     /*system('clear');*/
  72.     int a=0;
  73.     printf("\n A continuacion meta los votos recibidos por cada partido:\n");
  74.     for (i=0;i<partidos;i++){
  75.         a=i+1;
  76.         printf("\n partido(%d)=\t",a);
  77.         scanf("%f",&votos);
  78.         mpartidos[i][0]=votos;
  79.     }
  80.     printf("\n\n Ahora el programa calculara los escanos segun este  metodo:\n \n  D'HONT \n \n ");
  81.      
  82.      int TAM=100;
  83.     /*METODO DHONT*/
  84.     float mdhont[17][1000];
  85.     float cl;
  86.     float aux1;
  87.     int fil;
  88.     int col;
  89.     int aa;
  90.     int cc;
  91.     cc=1;
  92.     aux1=(mpartidos[fil][0])/(cl+1);
  93.     traspaso(*mdhont,aux1,partidos,TAM);
  94.     printf("\n");
  95.     max_escans(*mdhont,mpartidos[aa][cc],escanos,partidos,TAM);
  96.    
  97.     /*system("clear");*/
  98.    
  99.     /*fin metodo DHONT*/
  100.     /*system("clear");*/
  101.    
  102.     int z;
  103.     for (i=0; i<partidos; i++) {
  104.                     z=i+1;
  105.                     printf("\n partido%d  %d",z,mpartidos[i][1]);
  106.                 }
  107.    
  108.    
  109.     printf("\n");
  110. }
GRACIAS!!!!

Última edición por tommylej; 10/11/2010 a las 08:04
  #2 (permalink)  
Antiguo 10/11/2010, 11:40
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema con funciones

¿Qué quiere decir que te da fallos? ¿Qué fallos?

Veo que estás asignando valores a las variables enteras dentro de las funciones, esperando que conserven su valor luego. Eso no pasará porque por defecto las variables se copian, y la función trabaja con el valor pero no con la variable misma.
Para que los cambios se conserven tendrás que pasar un puntero o una referencia, no simplemente la variable.

Otra opción es que hagas que la función devuelva el valor que te interesa.


Sin ver el error específico es complicado dar otra solución.


Saludos.
  #3 (permalink)  
Antiguo 11/11/2010, 07:26
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: problema con funciones

el fallo es que no compila da violacion de segmento, no se como se lleva un vector o una matriz a una funcion y como se puede trabajar con ese vector o esa matriz para recorrerlo cambiar sus valores y devolverlos al main,
gracias
  #4 (permalink)  
Antiguo 11/11/2010, 08:51
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema con funciones

El mensaje "violación de segmento" aparece cuando el programa se ejecuta, así que SÍ está compilando. Usá un depurador (gdb, por ejemplo) para saber qué línea del archivo está provocando el problema. Si estás en Linux, valgrind se puede convertir en tu mejor amigo.

El error "violación de segmento", se da cuando intentás escribir en un área de memoria que no reservaste. Un índice mal puesto o mal calculado y ¡bam! Segfault

Las matrices por lo general se pasan como punteros al tipo de dato que guardan:

int mimatriz[10] = ...

funcion(mimatriz)

y la firma de "mimatriz" es, por ejemplo

int mimatriz(int* matriz)

dentro de la función accedés a los elementos normalmente, como matriz[i]. Cada cambio que se haga en la matriz, se hace en la original, porque lo que mandaste a la función fue un puntero. No necesitás devolver el valor.

Para datos más específicos, deberías depurar y pegar acá la información que obtengas.


Saludos.
  #5 (permalink)  
Antiguo 11/11/2010, 17:15
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: problema con funciones

hola esto es lo que mejor he hecho y no funciona, no compila, ayudenme por favor llevo dos dias dandole vueltas
Código C:
Ver original
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. void funci( float *metod, int *vector, int n, int escanos, int partidos );
  6.  
  7.    
  8. main()
  9. {
  10.    
  11.     int partidos=0;
  12.     int mpartidos[17][50];
  13.     float votos;
  14.     int i;
  15.     int f;
  16.     int c;
  17.     int a=0;
  18.     int TAM=100;
  19.     float metod[17];
  20.     int fil;
  21.     int vector[18];
  22.     int x=1;
  23.     int z;
  24.     printf("\n\n Bienvenido al sistema de calculo de escanos.\n por favor siga las instrucciones, gracias\n");
  25.  
  26.     while ( partidos <2 || partidos>16){
  27.         printf("\n eliga el numero de partidos politicos que desea (numero entre 2 y 16)\t");
  28.         scanf("%d",&partidos);
  29.     }
  30.     for (f=0;f<partidos;f++){
  31.         for (c=0;c<50;c++){
  32.  
  33.             mpartidos[f][c]=0;
  34.         }
  35.     }
  36.     int escanos=0;
  37.         while (escanos<7 || escanos>100){
  38.         printf("\n numero de escanos:(numero entre 7 y 100)\t");
  39.         scanf("%d",&escanos);
  40.     }
  41.        
  42.     printf("\n A continuacion meta los votos recibidos por cada partido:\n");
  43.     for (i=0;i<partidos;i++){
  44.         a=i+1;
  45.         printf("\n partido(%d)=\t",a);
  46.         scanf("%f",&votos);
  47.         mpartidos[i][0]=votos;
  48.     }
  49.    
  50.     printf("\n\n Ahora el programa calculara los escanos segun estos 4 metodos:\n \n HAMILTON \n \n D'HONT \n \n LAGUE \n \n HILL-HUNTINGTON \n \n");
  51.      
  52.         /*METODO DHONT*/
  53.    
  54.     for (fil=0;fil<partidos;fil++){
  55.             metod[fil]=mpartidos[fil][0];
  56.             vector[fil]=mpartidos[fil][1];
  57.         }
  58.    
  59.     funci (metod,vector, x, escanos, partidos );
  60.    
  61.     for (fil=0;fil<partidos;fil++){
  62.         mpartidos[fil][1]=vector[fil];
  63.         }
  64.            
  65.    
  66.     /*fin metodo DHONT*/
  67.    
  68.     printf("\n\t\tDHONT \t\tHAMILTON \t\t LEAGUE \t HILL-HUNTINGTON\n");
  69.    
  70.     for (i=0; i<partidos; i++) {
  71.                     z=i+1;
  72.                     printf("\n partido%d \t%d  \t\t  %d \t\t\t %d \t\t\t %d\n",z,mpartidos[i][1],mpartidos[i][2],mpartidos[i][3],mpartidos[i][4]);
  73.                 }
  74.     printf("\n");
  75.     return 0;
  76. }  
  77.             /*FUNCION*/
  78.        
  79.         void funci( float *metod, int *vector, int n, int escanos, int partidos ){
  80.         float metodo[17][1000];
  81.         float aq;
  82.         int fil;
  83.         int col;
  84.         float cl;
  85.         int TAM=100;
  86.         float d;
  87.         float mx=0;
  88.         int aa,bb;
  89.         int i;
  90.         for (fil=0;fil<partidos;fil++){
  91.             cl=0;
  92.             for (col=0;col<TAM;col++){
  93.                 if (n==1){
  94.                     d=cl+1;
  95.                     }
  96.                 if (n==2){
  97.                     d=(2*cl)+1;
  98.                 }
  99.                 if (n==3){
  100.                     d=sqrt(cl*(cl+1));
  101.                 }
  102.                 aq=metod(fil)/(d);
  103.                 metodo[fil][col]=(aq);
  104.                 cl++;
  105.             }
  106.            
  107.         }
  108.            
  109.         for(i=0;i<escanos;i++){
  110.             for (fil=0;fil<partidos;fil++){
  111.                 for (col=0;col<TAM;col++){
  112.                     if (metodo[fil][col]>mx){
  113.                         mx=metodo[fil][col];
  114.                         aa=fil;
  115.                         bb=col;
  116.                     }
  117.                 }
  118.             }
  119.             metodo[aa][bb]=0;
  120.        
  121.             mx=0;
  122.             vector(aa)=vector(aa)+1;
  123.         }
  124.  
  125.     }
  #6 (permalink)  
Antiguo 11/11/2010, 17:38
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con funciones

Tienes que diferenciar verctores con funciones. Loc vectores se acceden a sus datos con los cochetes. Y las funciones con parentesis.

Fijate quie en la linea 102 y 122 cometes esos errores.
  #7 (permalink)  
Antiguo 12/11/2010, 04:21
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: problema con funciones

muchas gracias, voy a cambiarlo y te digo si ya va bien, gracias de verdad
  #8 (permalink)  
Antiguo 12/11/2010, 11:11
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: problema con funciones

era ese el fallo, ya funciona, muchas gracias

Etiquetas: funciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:58.