2014-02-23 113 views
0

我很難讓程序以正確的格式輸出東西。 setw功能似乎沒有做我想做的事情。另外,平均值,低點和高點給我錯誤的答案。該程序應該讀入一個文件並對其進行處理,以查找當天所有臨時工的最高溫度,最低溫度和平均溫度。每一天都有與前一天相同的值。沒有得到正確的輸出

有人能指出我做錯了什麼嗎?

#include <iostream> 
#include <iomanip> 
#include <conio.h> 
#include <fstream> 
#include <string> 

double averageTemp(double total, int number); 
double lowTemp(double valueLow); 
double highTemp(double valueHigh); 
double high = 0; 
double low = 0; 

int main() 
{ 
    std::string dummy = ""; 
    int day, time = 0; 

    double input1[10][50], input5[10][50], input25[10][50]; 
    /* 
    Keeps track of the data: 
     Dimension 1: stores the input for each time of the day. 
    */ 

    double m1[10][3], m5[10][3], m25[10][3]; 
    /* 
    Process data: 
     Dimension 1: 
      Index 1: Keeps track of day 
     Dimension 2: 
      Index 1: Average temp 
      Index 2: Low temp 
      Index 3: High temp 
    */ 

    std::ifstream datain; 
    std::ofstream dataout; 

    datain.open("curiosity234X.dat"); 
    dataout.open("output.dat"); 

    for (unsigned int i = 0; i < 4; i++) 
    { 
     getline(datain, dummy); 
    } 

    int dayCount = 0, loopDay; 

    while (datain >> day >> dummy >> dummy >> input1[day][time] 
        >> input5[day][time] >> input25[day][time]) 
    { 
        while (dayCount == 0) 
        { 
         loopDay = day - 1; 
         dayCount++; 
        } 

    m1[day][0] = averageTemp(input1[day][time], time); 
    m1[day][1] = lowTemp(input1[day][time]); 
    m1[day][2] = highTemp(input1[day][time]); 

    m5[day][0] = averageTemp(input5[day][time], time); 
    m5[day][1] = lowTemp(input5[day][time]); 
    m5[day][2] = highTemp(input5[day][time]); 

    m25[day][0] = averageTemp(input25[day][time], time); 
    m25[day][1] = lowTemp(input25[day][time]); 
    m25[day][2] = highTemp(input25[day][time]); 

    time++; 
    } 

    dataout << std::setw(5) << std::fixed; 
    dataout << "Average" << "Low" << "High" << std::endl 
      << "Temp" << "Temp" << "Temp" <<std::endl 
      << "1 meter" << ".5 meters" << ".25 meters" << std::endl; 

    std::cout << std::setw(5) << std::fixed; 
    std::cout << "Average" << "Low" << "High" << std::endl 
       << "Temp" << "Temp" << "Temp" <<std::endl 
      << "1 meter" << ".5 meters" << ".25 meters" << std::endl; 

    for (unsigned int i = loopDay; i < day; i++) 
    { 
     dataout << std::fixed << std::setprecision(1) << std::setw(5); 
     dataout 
       << m1[day][0] << m1[day][1] << m1[day][2] 
      << m5[day][0] << m5[day][1] << m5[day][2] 
       << m25[day][0] << m25[day][1] << m25[day][2] 
       << std::endl; 

     std::cout << std::fixed << std::setprecision(1) << std::setw(5); 
     std::cout 
        << m1[day][0] << m1[day][1] << m1[day][2] 
      << m5[day][0] << m5[day][1] << m5[day][2] 
       << m25[day][0] << m25[day][1] << m25[day][2] 
        << std::endl; 
    } 

    std::cout << std::endl << std::endl << std::endl 
       << "The output.dat file has been written and transmitted." 
       << std::endl; 

    _getch(); 
    return 0; 
} 

double lowTemp(double valueLow) 
{ 
    if (valueLow < low) 
    { 
     ::low = valueLow; 

     return valueLow; 
    } else 
    { 
     return low; 
    } 
} 

double highTemp(double valueHigh) 
{ 
    if (valueHigh > high) 
    { 
     ::high = valueHigh; 

     return valueHigh; 
    } else 
    { 
     return high; 
    } 
} 

double averageTemp(double total, int number) 
{ 
    double average = total/double(number); 

    return average; 
} 
+1

請您詳細說明這個「不正確的輸出」?你期望什麼產出,你會得到什麼? – PakkuDon

+0

@PakkuDon:它應該讀入一個文件,並找出文件中記錄的每一天的最高溫度,最低溫度和一天中所有臨時的平均值。 – Brandon

+2

你不能一次性寫這麼多的代碼,並期待它的工作。從小而簡單的事情開始,測試它,讓它完美工作,添加一點功能,測試它,重複,直到它完成所有你想要的。 – Beta

回答

1
  • 請檢查此循環:
    for (unsigned int i = loopDay; i < day; i++) { ... }

    i變量不是循環體內部使用,所以你做同樣的事情,n次。我認爲你應該改變m1[day][...]m1[i][...]m5m25相同)。

  • 關於loopDay變量:

    while (dayCount == 0) 
    { 
        loopDay = day - 1; 
        dayCount++; 
    } 
    

    我想你的意思是:

    if (dayCount == 0) 
        loopDay = day; 
    
    ++dayCount; 
    

    這樣loopDay店看到的第一天(你會在打印的第一天for循環)。考慮到dayCount沒有在源代碼中的其他點引用,你可以擺脫它,寫:

    if (time == 0) 
        loopDay = day; 
    
  • 現在你要改變的上限在for循環:最後一天,你有看過必須包含,所以< day必須是<= day

還有其他的事情要改變,但這是一個起點。