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

obtener la media de un vector

Estas en el tema de obtener la media de un vector en el foro de C/C++ en Foros del Web. Hola, quiero obtener la media de 4 números almacenados en un vector, pero cuando lo compilo me sale esto: La media es 0.000000 @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 20/06/2010, 13:16
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
obtener la media de un vector

Hola, quiero obtener la media de 4 números almacenados en un vector, pero cuando lo compilo me sale esto: La media es 0.000000

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define TAM 4
  5.  
  6. int main(){
  7.         int v[TAM];
  8.         int i;
  9.         int mayor=0;
  10.         double media=0.0;
  11.  
  12.         for(i=0; i<TAM; i++){
  13.             printf("Introduce el número: ");
  14.             scanf("%d", &v[i]);
  15.         }
  16.  
  17.         mayor=v[0];
  18.         int pos=0;
  19.  
  20.         for(i=1; i<TAM; i++){
  21.            if(v[i] > mayor){
  22.               mayor=v[i];
  23.               pos=i;
  24.            }
  25.         media += v[i];
  26.         i++;
  27.         }
  28.         media = media/(double)v[i];
  29.         printf("El mayor es el %d y está en la posición %d\n", mayor, pos);
  30.         printf("La media es %lf\n", media);  
  31. }
  #2 (permalink)  
Antiguo 20/06/2010, 15:38
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 14 años, 4 meses
Puntos: 95
Respuesta: obtener la media de un vector

Con media te refieres al promedio?
En todo caso, la ultima instrucción sería:
media = media/TAM;
  #3 (permalink)  
Antiguo 21/06/2010, 06:10
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

He modificado la última instrucción, pero cuando compilo no me sale el resultado correcto.
Ejemplo: Introduce el número: 5
Introduce el número: 2
Introduce el número: 8
Introduce el número: 1
La media es 0.750000
  #4 (permalink)  
Antiguo 21/06/2010, 06:14
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

Ya lo he solucionado. Gracias de todos modos.
  #5 (permalink)  
Antiguo 21/06/2010, 06:33
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 6 meses
Puntos: 228
Respuesta: obtener la media de un vector

Fijate que el for empieza desde el 1, y no desde el cero. Creeria que fue eso lo que modificaste.
  #6 (permalink)  
Antiguo 21/06/2010, 11:47
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

Quiero obtener la media de una serie de números usando el bucle while, tengo definido un vector de 100 elementos, pero no lo quiero llenar todo. Cuando lo compilo me salen un montón de números. ¿Dónde está el fallo?. Gracias.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define TAM 100
  5.  
  6. int main(){
  7.         double v[TAM];
  8.         int i;
  9.         char op;
  10.         double media = 0.0;
  11.  
  12.         while((op == 's') || (op == 'S') && (i < TAM)){
  13.             printf("Introduce un número: ");
  14.             scanf("%lf", &v[i]);
  15.             printf("Otro? (s/n)");
  16.             i++;
  17.         }
  18.         for(i=0; i<TAM; i++){
  19.            media += v[i];
  20.         }
  21.         media = media/TAM;
  22.         printf("La media es %lf\n", media);  
  23. }
  #7 (permalink)  
Antiguo 21/06/2010, 12:01
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

Quiero obtener la media de una serie de números usando el bucle while, tengo definido un vector de 100 elementos, pero no lo quiero llenar todo. Cuando lo compilo me salen un montón de números. ¿Dónde está el fallo?. Gracias.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define TAM 100
  5.  
  6. int main(){
  7.         double v[TAM];
  8.         int i;
  9.         char op;
  10.         double media = 0.0;
  11.  
  12.         while((op == 's') || (op == 'S') && (i < TAM)){
  13.             printf("Introduce un número: ");
  14.             scanf("%lf", &v[i]);
  15.             printf("Otro? (s/n)");
  16.             scanf("%1s", &op);
  17.             i++;
  18.         }
  19.         for(i=0; i<TAM; i++){
  20.            media += v[i];
  21.         }
  22.         media = media/TAM;
  23.         printf("La media es %lf\n", media);  
  24. }
  #8 (permalink)  
Antiguo 21/06/2010, 15:06
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 6 meses
Puntos: 228
Respuesta: obtener la media de un vector

Primero que todo, que significan que salen un monton de numero? Segundo, pareceria que nunca va a entrar al while porque la variable op nunca tiene valor 's' o 'S'...
  #9 (permalink)  
Antiguo 21/06/2010, 21:49
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 8 meses
Puntos: 1
Respuesta: obtener la media de un vector

te recomiendo k te acostumbres a incializar tus variables.
en este caso
int i =0;
char op = 's';

el while estructuralo asi,
while((op == 's' || op == 'S') && i < TAM)
  #10 (permalink)  
Antiguo 22/06/2010, 00:14
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: obtener la media de un vector

Buenos días. Si inicializas op a 's' cómo te han recomendado, quita esas condiciones del bucle y elimina esa variable, ya que estás aumentando el tiempo de ejecución y el consumo de recursos de tu programa innecesariamente. Sí, me diréis que estoy loco y que con los procesadores y las memorias que hay hoy día, no digo más que tonterías, pero mejor hacer las cosas bien. Yo te he dicho que la borres y quites las condiciones porque no estas haciendo nada de provecho con ella, pero el programa así también funciona.

Coincido con margarito04 en que inicialices la variable i a cero, ya que en el bucle while no tiene un valor definido y podría darte problemas.

Saludos,
gonzo
  #11 (permalink)  
Antiguo 22/06/2010, 11:18
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

Quiero obtener la media de una serie de números usando el bucle while, tengo definido un vector de 100 elementos, pero no lo quiero llenar todo. Cuando lo compilo me salen un montón de números. ¿Dónde está el fallo?. Gracias.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define TAM 100
  5.  
  6. int main(){
  7.         double v[TAM];
  8.         int i=0;
  9.         char op='s';
  10.         double media = 0.0;
  11.  
  12.         while((op == 's' || op == 'S') && i < TAM){
  13.             printf("Introduce un número: ");
  14.             scanf("%lf", &v[i]);
  15.             i++;
  16.             printf("Otro? (s/n)");
  17.             scanf("%1s", &op);
  18.         }
  19.        
  20.    
  21.         for(i=0; i<TAM; i++){
  22.            media += v[i];
  23.         }
  24.         media = media/TAM;
  25.         printf("La media es %lf\n", media);  
  26. }

Lo he modificado, pero cuando me pregunta otro? y le doy que no me sale esto: La media es -36046567220424589234939396830662451860003361833015 92255111297581995373750199930335461571543890924931 09131176869294238647659570211196542036750048357292 83776432528038557023420812026399371832605259905736 61170783473515539887375226900090476181804184871137 6158064640.000000
No se por qué gonzo 13 dice que quite las condiciones del while, si las quito el programa no funcionará. El bucle while está para decirle yo la cantidad de números que quiero.

Última edición por minette1988; 22/06/2010 a las 11:28 Razón: modificación
  #12 (permalink)  
Antiguo 22/06/2010, 12:46
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: obtener la media de un vector

Hola minette. Quería pedirte disculpas porque yo te respondí mirando una versión anterior de tu código.

Viendo tu último código, yo diría que tienes un posible error en el segundo scanf del bucle while. Pregunta por un caracter (%c) en lugar de por una cadena de tamaño uno (%1s).

Cuando dices:
Cita:
"Cuando lo compilo me salen un montón de números. ¿Dónde está el fallo?. Gracias."
¿Te refieres a que te aparecen errores o warnings de compilación o a la ejecución que detallas debajo?

Si es por la ejecución, primero deberías inicializar la tabla "v" a cero antes de comenzar a solicitar los datos con un simple bucle, por ejemplo (aprovechando que i=0):


Código C:
Ver original
  1. while ( i < TAM)
  2. {
  3. v[i] = 0;
  4. i++;
  5. }

De esta manera conseguirás que al dejar de introducir datos, la media se obtenga sumando "ceros", lo cual no varía el resultado.


Saludos,
gonzo
  #13 (permalink)  
Antiguo 22/06/2010, 23:10
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 14 años, 4 meses
Puntos: 95
Respuesta: obtener la media de un vector

Te salen un monton de números simple y sencillamente porque estás asumiendo que el usuario ha metido los 100 números, siendo que 100, es solamente el tamaño máximo de tu vector.

En otras palabras:
Código C++:
Ver original
  1. while((op == 's' || op == 'S') && i < TAM){
  2. printf("Introduce un número: ");
  3. scanf("%lf", &v[i]);
  4. i++;
  5. printf("Otro? (s/n)");
  6. scanf("%1s", &op);
  7. }
  8. for(i=0; i<TAM; i++){
  9. media += v[i];

En While, estas teniendo una variable de control 'i' para mantener a tu vector dentro de los limites especificados (0<i<100)
Sin embargo cuando estas calculando la media, estas recorriendo el vector completo y si no has "limpiado" el vector, antes de utilizarlo, estas sumando la informacion que contenían anteriormente esas posiciones.

En otras palabras, tienes un vector de 100 posiciones. Cuando la computadora asigna el espacio de memoria para colocar a tu vector, no limpia la información que tenía ese vector.

Si tu llenas solo 20 casillas de ese vector, las otras 80 casillas restantes van a estar llenas de basura. En este caso, serían números enteros con diferentes valores.

Para corregir ese problema te propongo dos alternativas, y ambas igual de faciles de implementar.
La primera es que antes de empezar a pedir números, incluyas el siguiente proceso
Código C:
Ver original
  1. for(i=0;i<=TAM;i++)
  2. {
  3. v[i] = 0;
  4. }
De esta manera, todas las casillas de tu vector van a estar "limpias", es decir, cada casilla tendrá almacenado el valor 0, que al momento de recorrer tu vector, no alteraras la suma.

La siguiente alternativa es un poco mas tediosa, pero es la mas efectiva, es simplemente agregar una variable de control a tu programa, para que al momento de que recorras el vector, no lo recorra hasta la posicion numero 99

Te anexo el código modificado:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 100
  4.  
  5. int main(){
  6. double v[TAM];
  7. int i=0;
  8. int control_vector=0;
  9. char op='s';
  10. double media = 0.0;
  11. while((op == 's' || op == 'S') && i < TAM){
  12. printf("Introduce un número: ");
  13. scanf("%lf", &v[i]);
  14. i++;
  15. printf("Otro? (s/n)");
  16. scanf("%1s", &op);
  17. }
  18. control_vector = i;
  19. for(i=0; i<=control_vector; i++){
  20. media += v[i];
  21. }
  22. media = media/TAM;
  23. printf("La media es %lf\n", media);
  24. }

Agregué la variable control_vector.
Una vez que hayas terminado de llenar todas las posiciones del vector, le asignas el valor de la variable i (que para cuando salgas de While, va a contener el número máximo de casillas llenas). Y utilizas ese variable como límite o "tope" para el recorrido y el calculo de la media aritmetica de tu vector.
  #14 (permalink)  
Antiguo 23/06/2010, 05:34
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

He probado el último código que has publicado el que dices que es más tedioso, a la hora de pedir los números funciona correctamente, pero el resultado de la media no es el correcto. ¿Qué es lo que falla?. Gracias.
  #15 (permalink)  
Antiguo 23/06/2010, 08:00
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 14 años, 4 meses
Puntos: 95
Respuesta: obtener la media de un vector

de nuevo la ultima instrucción, olvidé modificarla.
Estas dividiendo
media = media/TAM

Estamos asumiendo que el tamaño del vector es de 100...
Entonces l a instruccion correcta debería ser:
media = media/control_vector

que es el número máximo de elementos insertados, haciendo esa modificación debe darte la media correcta.
  #16 (permalink)  
Antiguo 23/06/2010, 12:07
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

Gracias, ya me salió bien. Esto de la programación es difícil hay que echarle muchas horas y gracias por tus explicaciones me han servido para entender mejor este ejercicio.
  #17 (permalink)  
Antiguo 23/06/2010, 12:23
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: obtener la media de un vector

He intentado en el mismo ejercicio introducir números enteros en lugar de decimales, modificando double v[TAM] por un int, pero el resultado de la media me da un número negativo decimal.

La media es -405369727.333333
  #18 (permalink)  
Antiguo 24/06/2010, 14:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: obtener la media de un vector

has modificado el tipo a media?

Gonzo
  #19 (permalink)  
Antiguo 25/06/2010, 16:30
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 6 meses
Puntos: 228
Respuesta: obtener la media de un vector

Modificale el tipo a media y tambien al printf....poruqe piensa que le pasaste un double y es un entero.

Etiquetas: media, vectores
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 00:57.