2014-10-02 4 views
3

그래, 프로그래밍에 익숙하지는 않지만 수치 방법을 사용하여 세 가지 물질의 혼합물의 온도를 계산하는 C++ 프로그램을 작성하는 과제가 있습니다. 혼합물 중 각 물질의 엔탈피 및 퍼센트 기본적으로 h = a1 * T + a2 * T^2 + ... a6까지의 다항식입니다. 이러한 계수 a1 내지 a6은 각각 H20, H2 및 O2에 대해 표로 주어진다. 내 프로그램은 물질 방정식에 계수를 사용할 수 있도록 .dat 파일에서 계수의 물질 이름과 값을 읽을 수 있어야합니다. 그것이 내가 도움이 필요한 것입니다. 방정식에서 물질 이름과 계수 값을 입력 할 수 있도록 프로그램에 배열을 입력하려면 어떻게해야합니까? 죄송합니다 소설지만 가능한 한 많은 컨텍스트를 제공하려고했습니다. 아래의 은 정확히 내 .dat 파일에 있으며, 배열에 넣으려고합니다. 물질의 이름은 첫째, 등배열에 단어와 숫자의 파일을 입력하십시오. C++

 
H2O 406598.40 440.77751 -.12006604  .000015305539 -.00000000072544769 -4475789700 

H2 50815.714 9.9343506 -.000027849704 -.00000035332966 .000000000041898079 -14329128 

O2 961091.64 199.15972 -.052736240  .00000897950410 -.00000000063609681 -318699310 

이 지금까지 내 소스 코드,하지만이 작동하지, 나는 꽤 잃었어요 A1, A2,옵니다.

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

int main() 
{ 
double myArray[21]; 

ifstream file("thermo2.dat"); 

if (file.is_open()) 
{ 
    for (int i = 0; i < 21; ++i) 
    { 
      file >> myArray[i]; 
    } 
} 
else 
{ 
    cout << "the file did not open"; 
} 

for (int i = 0; i < 21; ++i) 
    { 
     cout << "  " << myArray[i]; 
    } 

return 0; 
} 

감사합니다!

편집 :에 호출 일치 기능 '의 getline (표준 : : ifstream & 두 번 &, 문자)': 내가 오류가 계속 .... 구조체의 배열 작업을 시도하기 시작했다. 를 heres 코드 :

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 

using namespace std; 

struct Data 
{ 
    string species; 
    double a1, a2, a3, a4, a5, a6; 
}; 

int main() 
{ 
ifstream fin; 

fin.open("thermo2.dat"); 

if (fin.fail()) 
{ 
    cout << "Failed to open file" << endl; 
} 


Data * database = new Data[3]; 
string line; 

for(int i = 0; i < 3; i++) 
{ 


    getline(fin, database[i].species, '\t'); 
    getline(fin, database[i].a1, '\t'); 
    getline(fin, database[i].a2, '\t'); 
    getline(fin, database[i].a3, '\t'); 
    getline(fin, database[i].a4, '\t'); 
    getline(fin, database[i].a5, '\t'); 
    getline(fin, database[i].a6, '\t'); 
} 


system("pause"); 


return 0; 
} 
+0

먼저 당신이 데이터를 저장하는 방법을 결정합니다. 하나의 배열 또는 3 개의 배열을 원하십니까? 파일에서 물질 이름이 필요합니까? 그렇다면 어떻게 저장해야합니까? * – Beta

+0

하나의 구조체 배열을 사용하려고합니다. 그러나 게시 된 편집을 살펴보고 그에 대한 통찰력을 제공 할 수 있다면 작동하도록 고심하고 있습니다. '위대해! –

답변

2

는 귀하의 구조를 선언 :

struct Data 
{ 
    string species; 
    double a[6]; 
} 

그리고 다음과 같이 읽어

for(int i = 0; i < 3; i++) { 
fin >> database[i].species; 
for (int j = 0; j < 6; j++) { 
    fin >> database[i].a[j]; 
} 
} 
+0

감사합니다! 이것은 많은 도움이되었습니다! –

+0

@ t.m이 것이 효과가 있다면 pls가 받아 들일 수 있습니까? –

0

나의 제안 :

  1. struct 각 물질에 대한 데이터를 보유 만듭니다.

    struct Material 
    { 
        std::string name; 
        double coeffcients[6]; 
    }; 
    
  2. 는 스트림에서 하나 Material을 읽어 함수를 만듭니다. main 함수에서
    std::istream& operator>>(std::istream& in, Material& mat) 
    { 
        // Read the name. 
        in >> mat.name; 
    
        // If there was an error, return. 
        // Let the calling function deal with errors. 
        if (!in) 
        { 
         return in; 
        } 
    
        // Read the coefficients. 
        for (int i = 0; i < 6; ++i) 
        { 
         in >> mat.coefficients[i]; 
         if (!in) 
         { 
          return in; 
         } 
        } 
        return in; 
    }; 
    
  3. 는 구동 코드를 작성.

    int main() 
    { 
        // Create a vector of materials. 
        std::vector<Material> materials; 
    
        // Open the input file. 
        ifstream file("thermo2.dat"); 
    
        // Read Materials the file in a loop and 
        // add them to the vector. 
        Material mat; 
        while (file >> mat) 
        { 
         materials.push_back(mat); 
        } 
    
        // Now use the vector of Materials anyway you like. 
    
    
        // Done with main. 
        return 0; 
    } 
    
+0

당신이 대답했다는 것을 깨닫기 전에 구조로 작동하도록 노력하고있었습니다. 이 방법으로 작동하도록 할 수있는 방법이 있습니까? a1 - a6에 대한 모든 getlines에 오류가 계속 발생합니다. 현재 코드를 편집으로 게시하십시오. –

+0

'getline'은'double'을 읽는 데 사용할 수 없습니다. 이를 위해'operator >>'를 사용하십시오. –

관련 문제