2016-06-23 12 views
0

Also ich versuche, eine Standardabweichung und Varianzfunktion zu machen, und ich kann nicht wirklich herausfinden, warum es nicht funktioniert. Ich werde Varianz in Fall 3 und SD in Fall 4 nennen. Alles andere funktioniert im Programm. Wenn du etwas siehst, das nicht gut aussieht, lass es mich wissen.Programmvarianz und Standardabweichung mit Zeigerfunktion

#include <stdio.h> 
#include <math.h> 
#define Max_Nums 20 

void sortNums(float nums[], int size); 
float meanValue(float nums[],int size); 
float medianValue(float nums[], int size); 
void var_stdDev(float nums[],int size,float *var,float *stdDev); 
float sqrtf(float); 

int main (void) 

{ 

    int NumValue = 0; 
    float array[Max_Nums]; 
    int i=0; 
    int choice=0; 
    float avg=0; 
    float median=0; 

    printf("How many numbers do you wish to enter (Max of 20): "); 
    scanf("%d",&NumValue); 

    while (NumValue<1 || NumValue>Max_Nums) 
    { 
     printf("Invalid response. You must enter a value between 1 and 20.\n"); 
     scanf("%d",&NumValue); 
    } 
    printf("Enter %d real numbers: ",NumValue); 

    for (i=0;i<NumValue;i++) 
    { 
     scanf("%f", &array[i]); 
    } 

    do 
    { 
     sortNums(array,NumValue); 
     printf("-----Menu-----\n\a"); 
     printf("Enter 1 for mean value\n"); 
     printf("Enter 2 for median value\n"); 
     printf("Enter 3 for variance\n"); 
     printf("Enter 4 for standard deviation\n"); 
     printf("Enter 5 to exit the program\n"); 
     scanf("%d",&choice); 

     switch(choice) 
     { 
      case 1: 
       avg=meanValue(array,NumValue); 
       printf("The mean is:%.2f\n",avg); 
       break; 
      case 2: 
       median=medianValue(array,NumValue); 
       printf("The median is:%.2f\n",median); 
       break; 
      case 3: 
       //printf("The variance is:%.2f",variance); 
       //break; 
      case 4: 
       //printf("The standard deviation is:%.2f\n"); 
       //break; 
      case 5: 
       printf("Exiting the program\n"); 
       break; 
      default: 
       printf("\nInvalid, try again"); 
       break; 
     } 
    }while (choice!=5); 


return 0; 
} 

void sortNums(float nums[], int size) 
{ 
    int x; 
    int y; 
    float z; 

    for(x=0;x<(size-1);x++) 
    { 
     for(y=0;y<size-x-1;y++) 
     { 
      if(nums[y]>nums[y+1]) 
      { 
       z=nums[y]; 
       nums[y]=nums[y+1]; 
       nums[y+1]=z; 
      } 
     } 
    } 
} 

float meanValue(float nums[],int size) 
{ 
    int i; 
    float avg; 
    float sum; 

    for(i=0;i<size;i++) 
    { 
     sum+=nums[i]; 
    } 
    avg = (sum/size); 
    return avg; 
} 

float medianValue(float nums[], int size) 
{ 
    float EvenMed; 
    float Med; 
    void sortNums(float nums[], int size); 
    if (size%2==0) 
    { 
     EvenMed=(nums[size/2]+nums[size/2-1])/2; 
     return EvenMed; 
    } 
    else 
    { 
     Med=nums[size/2]; 
     return Med; 
    } 

} 

void var_stdDev(float nums[],int size,float *var,float *stdDev) 
{ 
    int i; 
    float sum; 
    float meanValue(float nums[],int size); 
    for(i=0;i<size;i++) 
    { 
     sum+=pow((nums[i]-meanValue,2); 
    } 
    *var=sum/(float)size; 
    *stdDev=sqrt(*var); 



} 
+1

Bitte erklären Sie besser das Problem, das Sie haben – mik1904

+1

'Summe' ist in 2 Ihrer Funktionen nicht initialisiert ...Initialisiere 'sum' auf' 0' in 'meanValue()' und 'var_stdDev()' Funktionen. – Cherubim

+0

@ mik1904dies ist der Fehler, der "In function 'var_stdDev' erscheint: | error: ungültige Operanden zu binary - (habe 'float' und 'float (*) (float *, int)') ||| === Build fehlgeschlagen: 1 Fehler, 0 Warnung (en) (0 Minute (n), 0 Sekunde (n)) === | " – Nate

Antwort

2

Diese Zeile ist falsch:

sum+=pow((nums[i]-meanValue,2); 

Dieser versucht, einen Funktionszeiger von einer Zahl zu subtrahieren, das macht keinen Sinn. Sie müssen Anruf die meanValue Funktion, um den Mittelwert zu erhalten, und dann subtrahieren.

Außerdem haben Sie sum nicht vor dem Hinzufügen initialisiert.

void var_stdDev(float nums[],int size,float *var,float *stdDev) 
{ 
    int i; 
    float sum = 0; 
    float mean = meanValue(nums, size); 
    for(i=0;i<size;i++) 
    { 
     sum+=pow((nums[i]-mean,2); 
    } 
    *var=sum/(float)size; 
    *stdDev=sqrt(*var); 
} 

gibt es keine Notwendigkeit, eine Erklärung von meanValue innerhalb var_stdDev zu haben, die Erklärung am Anfang der Datei dient, die im gesamten Zweck.

In medianValue() haben Sie eine Deklaration von sortNums(), aber Sie rufen es nie, also sind die Zahlen nicht sortiert (es scheint, dass Sie den Unterschied zwischen einem Prototyp und einem Anruf nicht verstehen).

float medianValue(float nums[], int size) 
{ 
    float EvenMed; 
    float Med; 
    sortNums(nums, size); 
    if (size%2==0) 
    { 
     EvenMed=(nums[size/2]+nums[size/2-1])/2; 
     return EvenMed; 
    } 
    else 
    { 
     Med=nums[size/2]; 
     return Med; 
    } 
} 
0

Neben erklärt @Barmar, Code der OP hat eine Reihe von Problemen:

void var_stdDev(float nums[],int size,float *var,float *stdDev) { 
    int i; 
    // sum not initialize 
    float sum; 
    // unneeded function declaration 
    float meanValue(float nums[],int size); 

    // missing code to find the mean 

    for(i=0;i<size;i++) { 
     // improper call to accumulate the average derivation from the mean 
     sum+=pow((nums[i]-meanValue,2); 
    } 
    ... 

einen neuen Ansatz Berechnung der Standardabweichung empfehlen

enter image description here von here

std = sqrt(n*sum_of_squares - sum_of_x*sum_of_x)/n 

Empfohlene Verbesserungen:

Verwenden Sie double für die Zwischenberechnung. float ist in Ordnung, um Speicher und manchmal für Geschwindigkeit zu reduzieren. Dennoch subtrahieren Statistiken häufig Werte, die zu einem erheblichen Genauigkeitsverlust führen. Verwenden Sie double.

Aufgrund der Rundung kann die Auswahl von Datensätzen zu einer kleinen negativen Zahl führen - auch wenn das Ergebnis mathematisch> = 0.0 sein sollte. So gut, Zeichen vor sqrt() zu überprüfen.

Behandeln Sie den Fall, wenn size == 0 und führen Sie keine Laufzeit-Division von 0.

void var_stdDev2(const float x[], size_t size, float *var, float *stdDev) { 
    double sumx = 0.0; 
    double sumxx = 0.0; 
    double std = 0.0; // Used when size == 0.0 - or set to NaN 
    if (size > 0) { 
    for (size_t i = 0; i < size; i++) { 
     sumx += x[i]; 
     sumxx += 1.0 * x[i] * x[i]; 
    } 
    double std = sumxx * size - sumx * sumx; 
    std = std >= 0.0 ? sqrt(std) : 0.0; 
    std /= size; 
    } 
    if (stdDev) *stdDev = (float) std; 
    if (var) *var = (float) sqrt(std); 
} 

Minor Bits:

eine const in der Signatur Verwendung als Funktion nicht nums[] nicht verändert.

Array sind am besten mit size_t statt int indiziert.

Verwandte Themen