ayuda con subprograma que calcule promedio de vector

Iniciado por adriana13, 12 Noviembre 2018, 23:26 PM

0 Miembros y 1 Visitante están viendo este tema.

adriana13

Hola necesito ayuda con este ejercicio, me da como resultado 0, no le encuentro el error al codigo


/*Generar un subprograma que permita, dado un vector de 5400 posiciones,
obtener el promedio de los elementos del vector. Los valores del vector son enteros, y el resultado real.*/


  #include<stdlib.h>
#include <stdio.h>
#include<time.h>

int promedio_V(int vector[], int );
int vector[5400], i; const int tam= 5400;
int main(){
   
   
    srand(time(0));
   
    for(i=0; i<5400; i++){
      
      vector= 1+ rand() % 100;
      
   }
      for (i=0;i<5400; i++){
   printf("\n%i", vector);}


   printf ("el promedio del vector es %.2f", promedio_V(vector,tam));
   return 0;}
   
int promedio_V(int vector[], int tam) {
   float suma=0;
   
   for (i=0; i<tam; i++){
      
      suma=(suma+ vector[tam])/5400;
      
   }
      
   return suma ;
   
}

Beginner Web

#1
Hola Adriana, deje en comentarios las lineas de codigo que estaban algo mal
#include<stdlib.h>
#include <stdio.h>
#include<time.h>

int promedio_V(int vector[]);
int vector[5400], i; const int tam= 5400;
int main(){
   
   
    srand(time(0));
   
   for(i=0; i<5400; i++){
       
      vector[i]= 1+ rand() % 100;//vector= 1+ rand() % 100;
     
   }
   for (i=0;i<5400; i++){
  printf("\n%d", vector[i]);//printf("\n%i", vector);}
}


   printf ("el promedio del vector es %d", promedio_V(vector));//printf ("el promedio del vector es %.2f", promedio_V(vector,tam));
   return 0;}
   
int promedio_V(int vector[]) {//int promedio_V(int vector[], int tam) {
  int suma=0;//float suma=0;
 
  for (i=0; i<tam; i++){
     
     suma+=vector[i];//suma=(suma+ vector[tam])/5400;
     
  }
     
  return suma/tam ;//return suma ;
 
}
7w7

K-YreX

Varias cosas a tener en cuenta. Aunque en este programa al ser sencillo no afectan al funcionamiento:

Hay que limitar el uso de variables globales, ya que estas se pueden alterar desde cualquier parte del programa. Por eso es mejor declarar como global y constante el tamaño del vector pero el vector es mejor declararlo dentro del main (date cuenta de que si el vector es global no es necesario pasarlo como parámetro de la función ya que se puede usar directamente).

Si declaramos una constante <TAM> para el tamaño del vector, usar esa constante en la declaración del vector. Así si queremos cambiar el tamaño del vector sólo tendríamos que cambiarlo en el valor de <TAM> y el programa ya estaría modificado.

En el prototipo de la función es cierto que no hace falta indicar el nombre de las variables, solo su tipo. Pero ya que está el nombre del vector, quedaría mejor poner el nombre del segundo parámetro (el tamaño en este caso). Recalcar que al ser variables globales no sería necesario pasarlas como parámetros ya que ya existen en todo el programa. Nótese también que en el main se utiliza la variable <TAM> que es global mientras que en el cuerpo de la función se utiliza <tam> ya que es el nombre con el que nos referimos al segundo parámetro. Podría eliminarse ese segundo parámetro y usar <TAM> dentro de la función también.

En el main hay dos bucles: uno para rellenar el vector y otro para mostrar cada elemento. Esto se puede hacer en un solo bucle para ahorrar tiempo y no tener que recorrer el bucle completo dos veces.
Además de eso se especifica que el resultado es real, por lo que la función debe devolver un float o un double, no un int.

Puedes probar a cambiar algunas de las cosas que he comentado arriba para entender su funcionamiento y si tienes alguna duda no dudes en preguntar.
El código final quedaría algo por el estilo:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int TAM = 5400;

float promedio_V(int vector[], int tam);

int main(){
int vector[TAM];

srand(time(0));

for(int i = 0; i < TAM; i++){
vector[i] = 1 + rand() % 100;
printf("%d\n", vector[i]);
}

printf("El promedio del vector es %.2f\n", promedio_V(vector, TAM));

return 0;
}

float promedio_V(int vector[], int tam){
float suma = 0;

for(int i = 0; i < tam; i++)
suma += vector[i];

return suma/tam;
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

adriana13

muchas gracias chicos voy a probar modificar el codigo con sus sugerencias!!

adriana13

Cita de: YreX-DwX en 14 Noviembre 2018, 04:10 AM
Varias cosas a tener en cuenta. Aunque en este programa al ser sencillo no afectan al funcionamiento:

Hay que limitar el uso de variables globales, ya que estas se pueden alterar desde cualquier parte del programa. Por eso es mejor declarar como global y constante el tamaño del vector pero el vector es mejor declararlo dentro del main (date cuenta de que si el vector es global no es necesario pasarlo como parámetro de la función ya que se puede usar directamente).

Si declaramos una constante <TAM> para el tamaño del vector, usar esa constante en la declaración del vector. Así si queremos cambiar el tamaño del vector sólo tendríamos que cambiarlo en el valor de <TAM> y el programa ya estaría modificado.

En el prototipo de la función es cierto que no hace falta indicar el nombre de las variables, solo su tipo. Pero ya que está el nombre del vector, quedaría mejor poner el nombre del segundo parámetro (el tamaño en este caso). Recalcar que al ser variables globales no sería necesario pasarlas como parámetros ya que ya existen en todo el programa. Nótese también que en el main se utiliza la variable <TAM> que es global mientras que en el cuerpo de la función se utiliza <tam> ya que es el nombre con el que nos referimos al segundo parámetro. Podría eliminarse ese segundo parámetro y usar <TAM> dentro de la función también.

En el main hay dos bucles: uno para rellenar el vector y otro para mostrar cada elemento. Esto se puede hacer en un solo bucle para ahorrar tiempo y no tener que recorrer el bucle completo dos veces.
Además de eso se especifica que el resultado es real, por lo que la función debe devolver un float o un double, no un int.

Puedes probar a cambiar algunas de las cosas que he comentado arriba para entender su funcionamiento y si tienes alguna duda no dudes en preguntar.
El código final quedaría algo por el estilo:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int TAM = 5400;

float promedio_V(int vector[], int tam);

int main(){
int vector[TAM];

srand(time(0));

for(int i = 0; i < TAM; i++){
vector[i] = 1 + rand() % 100;
printf("%d\n", vector[i]);
}

printf("El promedio del vector es %.2f\n", promedio_V(vector, TAM));

return 0;
}

float promedio_V(int vector[], int tam){
float suma = 0;

for(int i = 0; i < tam; i++)
suma += vector[i];

return suma/tam;
}



Hola!! hice las modificaciones que me sugeriste, el tema es que sigue sin dar el resultado, compila pero siempre me da como resultado 0.00

K-YreX

Podrías copiar el código del programa para echarle un vistazo?
Ya que yo probé a ejecutar el programa con las modificaciones que había hecho y si me funcionaba.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

adriana13

el codigo completo es este: con las modificaciones tal cual me indicaste

/*Generar un subprograma que permita, dado un vector de 5400 posiciones,
obtener el promedio de los elementos del vector. Los valores del vector son enteros, y el resultado real.*/


  #include<stdlib.h>
#include <stdio.h>
#include<time.h>
const int TAM= 5400;
float promedio_V(int vector[], int tamx );

int main(){
   int vector[TAM];
   int i;
    srand(time(0));
   
    for(int i=0; i<5400; i++){
      
      vector = 1+ rand() % 100;
      printf("\n%i", vector);
   }
   

   printf ("\nel promedio del vector es %.2f", promedio_V(vector,TAM));
   return 0;}
   
   float promedio_V(int vector[], int tamx) {
   int i;
   float suma=0;
   
   for ( int i=0; i<tamx; i++){
      
      suma += vector;
      return suma/tamx;}
   }
      
   
   

K-YreX

El código tiene los siguientes errores, todos en <promedio_V>:
- En primer lugar estás declarando dos veces la i. Dentro del bucle for se puede declarar el contador (i en este caso) usando <int i = 0> pero si ya está declarado de antes dentro del for solo debe aparecer    <i = 0>. Es decir, tienes que eliminar una de las dos declaraciones.
- Dentro del for no estás accediendo a cada posición del vector. Para ello tienes que usar el operador de indexación [ ] de esta forma <vector[posicion]>.
- El for solo debe repetir la instrucción <suma += vector>, no el return también. El return va fuera del for.

Con todo esto el código quedaría así:
Código (C++) [Seleccionar]

float promedio_V(int vector[], int tamx) {
   float suma=0;
   
   for (int i = 0; i < tamx; i++){
      suma += vector[i];
   }
  return suma/tamx;
}


Además comentarte que cuando tienes un bloque de sentencias (if, while, for,...) que sólo repite una instrucción, esta no es necesario ponerla entre { }. Es decir que el for se puede hacer así (esto ya depende de gustos):

Código (C++) [Seleccionar]

for(int i = 0; i < tamx; i++)
    suma += vector[i];
return suma/tamx;


También en el for de la función <main> para mostrar cada elemento del vector; debes usar el [ ] para referirte a cada posición del vector (tanto para guardar un valor en él como para mostrarlo). El código quedaría así:

Código (C++) [Seleccionar]

for(int i=0; i<5400; i++){   
    vector[i] = 1+ rand() % 100;
    printf("\n%i", vector[i]);
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;