Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: TheShocker en 21 Diciembre 2014, 15:07 pm



Título: Problema con codigo en C
Publicado por: TheShocker en 21 Diciembre 2014, 15:07 pm
Buenas, estoy aprendiendo a programar en C y tengo una duda.

Al compilar el programa y al hacer la media me devuelve como resultado un 0.0000 y no consigo ver cual es el problema

¿Alguien me echa una mano?








#include <stdio.h>
#include <stdlib.h>
#define DIM 100


void leer_vector(int *, int);
float media_vector (int *, int);
void escribir_vector(int *, int);

int main(int argc, char *argv[])

   
    int dim;
    int vector[DIM];
   
    printf("Introduce la dimension del vector: ");
    scanf("%d",&dim);
   
    leer_vector(vector,dim);
   
   
    printf("\n\n");
   
    escribir_vector(vector,dim);
   
    media_vector(vector,dim);
   
    printf("\n\nMedia: %f", media_vector);
   
    printf("\n\n");
   
  system("PAUSE");   
  return 0;
}


float media_vector (int *v, int dim){
      int i;
      float media;
      media = 0;
      for(i=1;i<=dim;i++){
                          media = media + v;
                          }
     
      return media/dim;
      }
     
     
void leer_vector(int *v, int dim){
     int i;
     for(i=1;i<=dim;i++){
                                      printf("\nElemento (%d): ", i);
                                           scanf("%d",&v);
                                           }
     }
     
void escribir_vector(int *v, int dim){
     int i;
     for(i=1;i<=dim;i++){
                         printf("%8d ", v);
                         }
}


Título: Re: Problema con codigo en C
Publicado por: T. Collins en 21 Diciembre 2014, 15:33 pm
Código
  1. float media_vector (int *v, int dim){
  2.      int i;
  3.      float media;
  4.      media = 0;
  5.      for(i=0;i<dim;i++){
  6.                          media = media + v[i]; // falta [i]
  7.                          }
  8.  
  9.      return media/dim;
  10.      }

Los arrays empiezan en 0 no en 1, los for tienes que ponerlos desde i=0 hasta i<dim


Título: Re: Problema con codigo en C
Publicado por: TheShocker en 21 Diciembre 2014, 16:35 pm
Ya he modificado eso pero sigue saliendome 0, no consigo verlo XDD


Título: Re: Problema con codigo en C
Publicado por: Yoel Alejandro en 21 Diciembre 2014, 16:40 pm
Buenos días TheSocker, bienvenido al apasionante mundo de C.

Como T.Collins, los arrays en C comienzan en la posición 0. Y yo añadiría otros pequeños detalles. Primero, debes saber que la función system() invoca una llamda al sistema operativo, por lo tanto es dependiente del sistema de comandos de tu SO. Esto es, corre el riesgo de que tu programa no "corra" igual en un SO que en otro. Por eso yo recomiendo usar getchar() que es una función estándar (se ejecuta igual en cualquier plataforma) y realiza casi la misma función: esperar una pulsación de tecla de parte del usuario.

Otro detalle, en la función leer_vector() debes pasar a scanf la posición (esto es, la dirección de memoria) del elemento específico del array donde copiar el valor leído. Por eso:

Código
  1. scanf("%d", &v[i] );

Como sabrás, el operador "&" devuelve la dirección del elemento apuntado, en este caso la dirección de v[ i].

Y finalmente en el main(), donde mandas imprimir la media del vector, no puedes pasar como argumento simplemente el nombre de la función, sino que debes poner "media_vector(vector,dim)" con los argumentos donde media_vector() debe ser evaluada. Te quedaría:

Código
  1. printf("\n\nMedia: %f", media_vector(vector,dim) );

Esto es anidamiento de funciones; el valor de retorno de una función pasado como argumento de otra. Finalmente el código te quedaría:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define DIM 100
  4.  
  5. void leer_vector(int *, int);
  6. float media_vector (int *, int);
  7. void escribir_vector(int *, int);
  8.  
  9. int main(int argc, char *argv[]) {
  10.  
  11.   int dim;
  12.   int vector[DIM];
  13.  
  14.   printf("Introduce la dimension del vector: ");
  15.   scanf("%d",&dim);
  16.  
  17.   leer_vector(vector,dim);
  18.  
  19.   printf("\n\n");
  20.  
  21.   escribir_vector(vector,dim);
  22.  
  23.   media_vector(vector,dim);
  24.  
  25.   printf("\n\nMedia: %f", media_vector(vector,dim) ); /* <-- revisa aqui */
  26.  
  27.   printf("\n\n");
  28.  
  29.   //system("PAUSE"); /* <-- solo para Windows */
  30.   getchar(); /* <-- es mas compatible */
  31.   return 0;
  32. }
  33.  
  34.  
  35. float media_vector (int *v, int dim) {
  36.  
  37.   int i;
  38.   float media;
  39.   media = 0;
  40.   for (i=0; i<dim; i++) {
  41.      media = media + v[i];
  42.   }
  43.  
  44.   return media/dim;
  45. }
  46.  
  47.  
  48. void leer_vector(int *v, int dim) {
  49.   int i;
  50.   for (i=0; i<dim; i++) {
  51.      printf("\nElemento (%d): ", i);
  52.      scanf("%d", &v[i] );
  53.   }
  54. }
  55.  
  56. void escribir_vector(int *v, int dim) {
  57.   int i;
  58.   for (i=0; i<dim; i++) {
  59.      printf("%4d\t", v[i] );
  60.   }
  61. }

Un ejemplo de corrida del programa:


Introduce la dimension del vector: 4

Elemento (0): 5

Elemento (1): 8

Elemento (2): 4

Elemento (3): 2


   5      8      4      2   

Media: 4.750000


Título: Re: Problema con codigo en C
Publicado por: TheShocker en 21 Diciembre 2014, 18:09 pm
Muchisimas gracias por la explicación, me ha quedado todo más claro y ya he conseguido hacer que funcione.


Título: Re: Problema con codigo en C
Publicado por: Yoel Alejandro en 22 Diciembre 2014, 01:20 am
Encantado pues  ;-)