2015-12-07 29 views
-4

我越來越有麻煩得到正確的輸出這個 功能我有我的任務試圖獲得最高溫度低溫麻煩,AVG

void getStats(int month, const struct DailyData yearData[],int sz,struct MonthlyStatistic* monthly)

有反正有人能夠幫助?這是我的任務。我只需要有人指點我正確的方向。

Your function must find minimum temperature, the maximum temperature, the 
average temperature and total precipitation for a given month using the 
data in the array with a matching month. The results are passed back to 
the calling function by storing them into the appropriate data members of 
monthStats. 


#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
/*V 1.1: 
Changes: 

1) declared i outside of loop, you don't need -std=c99 to compile anymore 
2) added a check for existence of historicaldata.csv 
*/ 

/*an instance of this struct holds the weather data for a single day*/ 
struct DailyData{ 
    int day; 
    int month; 
    int year; 
    float high; 
    float low; 
    float precipitation; 
    char condition; 
}; 

/*an instance of this struct holds summary information for the weather 
for a given month*/ 
struct MonthlyStatistic{ 
    float minTemperature; 
    float maxTemperature; 
    float averageTemperature; 
    float totalPrecipitation; 
}; 
int readDailyData(FILE* fp, struct DailyData allData[]); 

int getRelevantRecords(int yearWanted, const struct DailyData allData[], int sz, struct DailyData yearData[]); 
void sortYearData(struct DailyData yearData[], int sz); 
void getStats(int month, const struct DailyData yearData[], int sz, struct MonthlyStatistic* monthStats); 
void printMonthlyStatistic(int month, const struct MonthlyStatistic* monthly); 
void graphLine(int month, const struct MonthlyStatistic* monthly); 
void printVerbose(const struct DailyData yearData[],int sz); 
char symbolToDraw(char condition, float avgTemp); 
float average(float first, float second); 
void draw(char c, int num); 


int main(void){ 
    FILE* fp = fopen("historicaldata.csv","r"); 
    if(!fp){ 
     printf("you need to put historicaldata.csv into this directory\n"); 
     exit(0); 
    } 
    struct DailyData allData[3000]; 
    struct DailyData yearData[366]; 
    int numTotalRecords; 

    numTotalRecords = readDailyData(fp, allData); 
    int year; 
    int reportType; 
    int i; 
    struct MonthlyStatistic monthly[12]; 
    printf("Please enter the year for the report: "); 
    scanf("%d",&year); 
    printf("Please enter the type of report you wish to generate:\n"); 
    printf("1) summary\n"); 
    printf("2) detailed\n"); 
    scanf("%d",&reportType); 
    int numDays = getRelevantRecords(year,allData,numTotalRecords,yearData); 
    sortYearData(yearData,numDays); 

    for(i=0;i<12;i++){ 
     getStats(i+1,yearData,numDays,&monthly[i]); 
    } 

    printf("Weather summary for %d\n",year); 
    printf("| Month | High | Low | Avg | Precip |\n"); 
    printf("|-----------|-------|-------|-------|---------|\n"); 
    for(i=0;i<12;i++){ 
     printMonthlyStatistic(i+1,&monthly[i]); 
    } 
    printf("\n\n"); 
    printf("Precipitation Graph\n\n"); 
    for (i=0;i<12;i++){ 
     graphLine(i+1,&monthly[i]); 
    } 
    if(reportType == 2){ 
     printf("\n\n"); 
     printf("Detailed report:\n"); 
     printVerbose(yearData,numDays); 
    } 
    return 0; 
} 
int readDailyData(FILE* fp, struct DailyData allData[]){ 
    int i=0; 
    while(fscanf(fp,"%d,%d,%d,%f,%f,%f,%c\n", 
     &allData[i].year,&allData[i].month,&allData[i].day, 
     &allData[i].high,&allData[i].low,&allData[i].precipitation, 
     &allData[i].condition) == 7){ 
     i++; 
    } 
    return i; 
} 
int getRelevantRecords(int yearWanted, const struct DailyData allData[], int sz, struct DailyData yearData[]){ 
int i; 
int j=0; 
    for(i = 0; i < sz; i++){ //here is my for loop incrimenting i there are 3000 files 

     if(allData[i].year == yearWanted){ 
       //copying a record to another struct and if the year wanted matches and incimenting a variable to count how many times it happened 
     yearData[i] = allData[i]; 
     j++; 
     } 
    } 
    return j; 
} 
void sortYearData(struct DailyData yearData[], int sz){ 
    int i; 
    int temp; 
    int temp1; 
    for(i = 0; i < sz ; i++){ 
     if(yearData[i].month > yearData[i+1].month){ 
      temp1=yearData[i].month; 
      yearData[i].month=yearData[i+1].month; 
      yearData[i+1].month=temp1; 
     }else if(yearData[i].month = yearData[i+1].month && yearData[i].day > yearData[i+1].day){ 
      temp=yearData[i].day; 
      yearData[i+1].day=yearData[i].day; 
      yearData[i+1].day=temp; 
     } 
    } 
} 
void getStats(int month, const struct DailyData yearData[],int sz,struct MonthlyStatistic* monthly){ 
    float runningTotal = 0; 
    int totalItems = 0; 
    float highTemp = 0; 
    float lowTemp = 0; 
    float temp; 
    int i; 
    for(i = 0; i < sz; i++){ 
     if(month = yearData[i].month){ 
      runningTotal += (yearData[i].high + yearData[i].low/2); 
      totalItems ++; 
    } 
    highTemp+=yearData[i+1].high; 
    lowTemp+=yearData[i].low; 
} 
monthly->averageTemperature = runningTotal/totalItems; 
monthly->maxTemperature = highTemp; 
monthly->minTemperature = lowTemp; 

} 
void printMonthlyStatistic(int month,const struct MonthlyStatistic* monthly){ 
    if(month == 1){ 
     printf("|%10January|%10.2f| %.2f | %.2f | %.2f |\n", monthly->maxTemperature, monthly->minTemperature, monthly->averageTemperature, monthly->totalPrecipitation); 
    }if(month == 2){ 
     printf("| Febuary |\n"); 
    } 
} 
void graphLine(int month,const struct MonthlyStatistic* monthly){ 
    //put your code here 
// printf(" %d | %d\n", month ,monthly->totalPrecipitation); 
} 
void printVerbose(const struct DailyData allData[],int sz){ 
    //put your code here 
} 
char symbolToDraw(char condition, float avgTemp){ 
//this function was made so that if the condition is equal to any of these 
    char c = '~'; 
    char p = ';'; 
    char s = '@'; 
    char l = '*'; 
    if(avgTemp < 0 && condition == 'p'){ 
     condition = '*'; 
    }else if (condition == 'p'){ 
     condition = ';'; 
    }else if(condition == 's'){ 
     condition = '@'; 
    }else if(condition == 'c'){ 
     condition = '~'; 
    } 
return condition; 
} 
float average(float first, float second){ 
    float avg; 
    avg = (first + second)/2; 
    return avg;// this function is for average it takes the first paramater and the second and adds it together then divides by the total of paramters to return a value 
} 
void draw(char c, int num){ 
    int i;//This function is for drying the amount of symbols needed 
    for(i=0; i < num; i++){ 
     printf("%c", c); 
     } 
} 
+3

而且......你有什麼措施來解決這個問題? –

+0

從SO調試從站有一個downCloseVote。 –

回答

1

錯誤計算平均值,最小值和最大值。更正如下。

void getStats(int month, const struct DailyData yearData[],int sz, 
    struct MonthlyStatistic* monthly){ 
    float runningTotal = 0; 
    int totalItems = 0; 

    float highTemp = -FLT_MAX; 
    float lowTemp = FLT_MAX; 

    // float temp; 
    int i; 
    for(i = 0; i < sz; i++){ 
    // if(month = yearData[i].month){ 
    if(month == yearData[i].month){ 
     // runningTotal += (yearData[i].high + yearData[i].low/2); 
     runningTotal += (yearData[i].high + yearData[i].low)/2; 
     totalItems ++; 
    } 

    // highTemp+=yearData[i+1].high; 
    if (TempyearData[i].high > high) high = TempyearData[i].high; 
    // lowTemp+=yearData[i].low; 
    if (TempyearData[i].low < low) low = TempyearData[i].low; 
    } 
    ... 
+0

當然可以逆轉測試:'如果(高

+0

@天氣風向標您的「路線」是正確的。謝謝。 – chux

+0

你能否解釋你的解決方案,因爲我不理解? –

相關問題