ayuda calcular media y desviacion estandar en c

#1
hola comunidad, nesesito ayuda, hago un programa en lenguaje c y lo que tengo que hacer, es calcular la media (varianza me parece) y la desviacion estandar, pretendia hacer:

ingreo un numero n de datos, despues hacer un ciclo for para ingresar los datos, y asi sumarlos y sacar la media, y eso los complete, nomas me falta la desviacion estandar, y queria hacer que mientrs yo ingresaba los datos inyectar dicho datos en una arreiglo unidimensional y depsues ya sumarlo para despues llamar ese arreiglo para poder calcular la desviacion, mi problema esta en que tengo errores con mi arreiglo aqui les dejo el codigo


#include <stdio.h>
#include <math.h>
main()
{
int n;
float suma = 0;
int x;
float media;
float ld;
float de;
double des =0;
int y;
double pow;
float dato;
int w= n+1;
printf("cuantos numeros introduciras.\n");
scanf("%d", &n);
for (x = 1; x <=n; x++){
printf("Introduce un valor.\n");
scanf("%f", &dato);
int ld[w] = dato;
suma = suma + dato;
}
media = (suma / n);

for(y=1; y<=n; y++)
{
des = (pow(ld[w] - media), double 2.0f ) + 1.0f;
}
de = pow(double(suma * des) / (n-1.0f), double 0.5f );

printf("La media es: %f \n", media);
system("pause");
return 0;
}

y mis errores son
In function `main':
21 variable-sized object may not be initialized
28 subscripted value is neither array nor pointer
28 called object is not a function
28 syntax error before "double"
30 syntax error before "double"

no entiendo como puedo hacer eso del arreiglo, ya que, ingreso datos en el arreiglo y luego es suma= suma + dato y asi repitiendo el ciclo for, y depsues a la hora de calcular mi desviacion pues voy a querer llamar al arreiglo para que el dato uno se reste con la media y se eleve el cuadrado y asi con el dato dos, y asi consecutivamente, espero haberme explicado, como queira sigo intentando
 
#2
A ver, de entrada puedo ver estos errores:
1.- int w = n+1; cuanto vale 'n'? no la estas iniacializando.
2.- No estas declarando ninguna matriz... (float ld;)
3.- Una matriz [int ld[w] = dato;] NO puede ser 'dinamica', es decir, siempre tienes que declarar al inicio su dimensión (si es para 5 registros, 10, 15, etc)... *ver punto 2*
4.- Tu contador, que se supone es 'w', NO lo estas aumentando (para que quieres el contador?)
5.- "pow" es un comando de C, no lo puedes usar para declarar una variable.
6.- ---> des = (pow(ld[w] - media), double 2.0f ) + 1.0f; esto lo estas metiendo en un ciclo for, pero tu "indice" es 'y' e intentas aumentar 'w'.. imposible!!!
7.- Para que es esto: de = pow(double(suma * des) / (n-1.0f), double 0.5f );??
para sacar la media unicamente debes de sumar todos los valores y dividirlos por la cantidad de datos ingresados. Y ni siquiera pintas en pantalla a "de".

Vas mal chavo.
Creo que deberias de considerar comenzar tu programa de nuevo.


Saludos!
 

oldBoy

Bovino adicto
#3
Yo creo que debes estructurar mejor tu programa.
Esta bien que tú mismo te entiendas pero trata de ponerle nombres más específicos a las variables, digo, la longitud de caracteres es lo suficiente para que pongas que simboliza cada una.

3.- Una matriz [int ld[w] = dato;] NO puede ser 'dinamica', es decir, siempre tienes que declarar al inicio su dimensión (si es para 5 registros, 10, 15, etc)... *
No creo. Estoy seguro que está usando un compilador que soporte C99, lo cuál hace posible los arreglos dinámicos así como otras cosillas útiles como inicializar variables en la declaración de un for etc.
Y sí, recomiendo que lo vuelvas a empezar pero antes estructuralo bien tu programa con mapas mentales, seudocódigo o algo así.
 
#4
Dudo mucho que sea eso :p
Ni siquiera tiene declarada la matriz.

Yo creo que debes estructurar mejor tu programa.
Esta bien que tú mismo te entiendas pero trata de ponerle nombres más específicos a las variables, digo, la longitud de caracteres es lo suficiente para que pongas que simboliza cada una.



Estoy seguro que está usando un compilador que soporte C99, lo cuál hace posible los arreglos dinámicos.
 
#5
1.- int w = n+1; cuanto vale 'n'? no la estas iniacializando.
( ese w= n+1 no es un contador,ahi quise meter de que, nesesito sacar media y desviacion estandar, quise usar arreiglos unidimensionales, y ya saben que si en un arreiglo, si tu quieres ingresar 5 registros, debe de haber 6 campos, por el campo nulo, a mi el profesor me lo explico ya hace facil 2 años creo, que si yo quiero poner 10 numero, digamos, 1,2,3,4,5,6,7,8,9,10 debo de poner arreiglo[11] y como es sacar ese rollo con un ´n´ numeros pense, ok, si yo ingreso, de que 5 ese n+1 es igual a 6 para dico campo vacio, ya un profe me dijo, que no se podia hacer eso, que se tiene que inicializar que mejor lo hiciera con listas enlazadas, que es lo que intento buscar ahorita como.


5.- "pow" es un comando de C, no lo puedes usar para declarar una variable.
6.- ---> des = (pow(ld[w] - media), double 2.0f ) + 1.0f; esto lo estas metiendo en un ciclo for, pero tu "indice" es 'y' e intentas aumentar 'w'.. imposible!!!
7.- Para que es esto: de = pow(double(suma * des) / (n-1.0f), double 0.5f );??
esto lo hago para declarar la desviacion estandar, de= desviacion estandar, pow(elevar potencia) (suma, que es una suma que hice para calcular la media, * des que lo utilize para hacer la suma en la parte de la desviacion estandar) y eso elevarlo al cuadrado, y el mas 1 es por que todo eso lo hice como contador)

ya que la desviacion estandar es,raiz de sumatoria (xi-media)^2/n-1

yo se que hice un desmadre, la verdad me falta practica, como mencione, ya saque la media pero me falta la desviacion estandar, hice un diagrama de flujo, nomas que lo que me causa relajo es que, al momento que queria ingresar los datos, para hacar la sumatoria, queria inyectarlos en un registro, y luego sumarlo traduccion

inicio/ dame n ( osea los numeros que quieres ingresar)/ w= n+1 (por eso de los registros del campo nulo)/ ciclo for/ dame dato/ ese dato inyectarlo a un campo del arreiglo/ despues hac
er mi contador de suma= suma + dato/ fin ciclo for/ media es igual a suma/n / ciclo for/ eh aqui el desmadre, queria hacer de que, para no volver a ingresar los datos, guardarlos en dicho arreiglo, y llamarlos para hacer la desciacion estandar / y ya hacer los calculos
 

registro500

Bovino adolescente
#6
bueno amigo me puse trabaajr en tu problema aca tienes el programa funcionando... pero tendras que añadir la parte de llenado del vector muestra y su respectivo n .
Código:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
    int muestra[10]={1,2,2,3,4,3,4};
    int i,n=7;
    double suma;
    double promedio;
    double varianza;
    double desvEstandar;
    
    /*calculando promedio*/
    suma=0;
    for(i=0; i<n; i++){
       suma = suma + muestra[i];
    }
    promedio = suma/n;
    
    
    /*calculando la varianza*/
    suma=0;
    for(i=0; i<n; i++){       
       suma = suma + pow((muestra[i] - promedio), 2 );
    }    
    varianza = suma/n;
    
    /*calculando la desviacion Tipica o estandar*/
    desvEstandar = sqrt(varianza);
    
   printf("promedio :%f\n", promedio);
   printf("varianza :%f\n", varianza);
   printf("desviacion Tipica :%f\n", desvEstandar);
   system("PAUSE");    
  return 0;
}

suerte..... saludos.
 
#7
bueno amigo me puse trabaajr en tu problema aca tienes el programa funcionando... pero tendras que añadir la parte de llenado del vector muestra y su respectivo n .
Código:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
    int muestra[10]={1,2,2,3,4,3,4};
    int i,n=7;
    double suma;
    double promedio;
    double varianza;
    double desvEstandar;
    
    /*calculando promedio*/
    suma=0;
    for(i=0; i<n; i++){
       suma = suma + muestra[i];
    }
    promedio = suma/n;
    
    
    /*calculando la varianza*/
    suma=0;
    for(i=0; i<n; i++){       
       suma = suma + pow((muestra[i] - promedio), 2 );
    }    
    varianza = suma/n;
    
    /*calculando la desviacion Tipica o estandar*/
    desvEstandar = sqrt(varianza);
    
   printf("promedio :%f\n", promedio);
   printf("varianza :%f\n", varianza);
   printf("desviacion Tipica :%f\n", desvEstandar);
   system("PAUSE");    
  return 0;
}

suerte..... saludos.
muchas gracias registro, la verdad, se nota que me gusta complicarmelo, pero bueno, con tu permiso y respeto, analizare eso, ya que, si realmente quiero aprender, que mucha falta me hace practicar, no le voy a dar copy paste, si no, basarme en ello, como mensione, me recomendaro que usara listas enlazadas y otros lo hicieron, desde un archivo, donde ponia los datos llamar a dicho archivo y que me lo calcule, pero me falta mas practica y conocimiento como dominio de eso, pero por cuestion de tiempo, seguire con registros, namas que auhora inicializare mi arreiglo con un valor exagerado como de [50] no creo que se pongan andar registrando 50 datos y no tienen el tiempo, gracias a todos, y la verdad espero seguir reciviendo ayuda para asi poder mejorar mis habilidades de progrion que se puedo decir que ando en pañales
 
#8
hola, aclaro no pretendo hacer spam pero aqui les dejo mi otra duda

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
main()
{
int n;
float suma = 0;
int x;
float media;
float dato;
int sde[100];
float des;
int y;
int pow;
int i;
float deo;
printf("Dame el valor de n.\n");
scanf("%d", &n);
for (x = 1; x <=n; x++){
printf("Introduce un valor.\n");
scanf("%f", &dato);
sde = dato;
suma = suma + dato;
}
media = (suma / n);
for(y=1; y<=n; y++)
{
deo = pow((sde - media), 2);
des = des + deo;
}
double de = pow((suma * des) / (n-1), double 0.5f );
printf("La media es: %f y la desviacion estandar es: %f \n", media, des);
system("pause");
return 0;
}


los errores que me arroja son

In function `main':
28 called object is not a function
31 syntax error before "double"

enserio me falta practica en esto, ya que por mas que lea libros no le hagarrare bien al lenguaje, pero quisiera saber que esta mal y por que, me base un poco en el programa del compañero que me lo resolvio pero como comente, no me sirve de nada hacer copy paste
 

registro500

Bovino adolescente
#9
Hola fnz....
aca tienes el programa funcionando toma encuenta comentarios // y los //error
y otro detalle debrias revisar la formula de la desviacion estandart.. algo no calcula bien.
saludos....
Código:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

//main()
int main()
{

int n;
//float suma = 0;
double suma= 0;
int x;
float media;
int dato; // dato es int por que sde[]  es de tipo int 
//float dato;
int sde[100]; 
//float des;
double des;  //  sqrt y pow te retornan como double
int y;
//int pow;<---error  pow es reservado
int i;
//float deo;
double deo; //  sqrt y pow te retornan como double
printf("Dame el valor de n.\n");
scanf("%d", &n);
for (x = 1; x <=n; x++){
printf("Introduce un valor.\n");

//scanf("%f", &dato);
scanf("%d", &dato);
//sde[i] = dato; <--error
sde[x] = dato;

suma = suma + dato;
}
media = (suma / n);

/*antes del for debes inicializar la variable 'des' */
des=0;
for(y=1; y<=n; y++)
{
//deo = pow((sde[i] - media), 2);  <-- error sde[i]
deo = pow((sde[y] - media), 2); 
des = des + deo;
}

//double de = pow((suma * des) / (n-1), double 0.5f ); <--error
/* se nota que quieres sacar la raiz cuadrada por tanto debe usar SQRT ejemp*/
double de = sqrt( (suma * des) / (n-1) );
printf("La media es: %f y la desviacion estandar es: %f \n", media, des);

system("pause");
return 0;
}
 
Arriba