2016-09-22 23 views
0

所以我試圖製作一個租賃程序,用汽車列表(年份,品牌,型號,價格,如果可用)讀取文件。 我還必須做出選擇,例如顯示所有的汽車並讓用戶看一輛特定的汽車(例如,他們輸入1,它會顯示文本文件上的頂部汽車)。這是我感到困惑的地方,我嘗試製作car1,car2等幾款汽車。但是我無法將第一輛汽車註冊到car1中。使用數據結構分別註冊某些字符陣

這是一個示例文件。

CarData.txt

2014 Toyota Tacoma 115.12 1 
2012 Honda CRV 85.10 0 
2015 Ford Fusion 90.89 0 
2013 GMC Yukon 110.43 0 
2009 Dodge Neon 45.25 1 
2011 Toyota Rav4 65.02 1 
2012 Mazda CX5 86.75 1 
2016 Subaru Outback 71.27 0 
2015 Ford F150 112.83 1 
2010 Toyota Corolla 50.36 1 

源代碼:

#include <iostream> 
#include <fstream> 


using namespace std; 

struct car 
{ 
    int year; 
    char make[10]; 
    char model[10];  
    float price; 
    int available; 

}car1[1], car2[1], car3[1], car4[1], car5[1], car6[1], car7[1], car8[1], car9[1], car10[1]; 



void copy_string(char d[][50], char s[][50]); 

int my_strcmp(char *a, char *b); 


// Main Function 
int main() 
{ 
// declare variables 
int choice; 
car carLib[10]; 
char array[30][50]; 
char filename[10]; 
ifstream carInData; 


    //prompt user for input file 
cout << " Enter file name: "; 
cin >> filename; 

cout << " 1 - Show Cars\n"; 
cout << " 2 - Rental Cost\n"; 
cout << " 3 - Most Expensive Car\n"; 

carInData.open(filename); 

    cin >> choice; 



    if(carInData.is_open()); 
    { 
    int count = 0; 
    // read list of names into array 


     for(count; count < 1; count++){ 
    carInData >> car1[count].year >> car1[count].make >> car1[count].model >> car1[count].price >> car1[count].available; 
    carInData >> car2[count].year >> car2[count].make >> car2[count].model >> car2[count].price >> car2[count].available; 


     switch (choice){ 
     case 1: 

     cout << car1[count].year << " " << car1[count].make << " " << car1[count].model << " " << car1[count].price << " " << car1[count].available << " " << "\n"; 
     cout << car2[count].year << " " << car2[count].make << " " << car2[count].model << " " << car2[count].price << " " << car2[count].available << " " << "\n"; 

     break; 



      } 


     } 
    } 
    return 0; 
} 
// copy function 
void copy_string(char d[], char s[]) { 
    int c = 0; 

    while (s[c] != '\0') { 
     d[c] = s[c]; 
     c++; 
    } 
    d[c] = '\0'; 
} 

// string copy 
int my_strcmp(char *a, char *b) 
{ 
    while (*a && *b && *a == *b) { ++a; ++b; } 
    return *a - *b; 
} 
+2

在處理字符串時,你應該使用'std :: string'。 – NathanOliver

+1

這是100%C,如果你實際上用C++編程,請使用一些方便的庫助手類,比如'std :: string','std :: vector'等。 –

+0

@NathanOliver我不能使用數據字符串類型。 –

回答

0

這裏是例如源,如何與結構類型的陣列,如car carLib[300];工作:

#include <iostream> 

struct car 
{ 
    int year; 
    char make[10]; 
    char model[10];  // that's only 9 letters for zero-terminated strings 
    float price; 
    int available; 
}; 

int main() 
{ 
    constexpr size_t maxCarLib = 300; 
    car carLib[maxCarLib];  // array of memory reserved for several cars 
    size_t carLibCount = 0;  // current allocation of array (zero cars entered) 

    carLib[carLibCount++] = car {1993, {"Nohda"}, {"XYZ"}, 123.45, 0}; 
    carLib[carLibCount++] = car {1994, {"Frod"}, {"Peon"}, 543.21, 1}; 
    carLib[carLibCount++] = car {1977, {"Nohda"}, {"ABC"}, 3.32, 0}; 

    std::cout << "Cars in library: " << carLibCount << std::endl; 
    for (size_t carIndex = 0; carIndex < carLibCount; ++carIndex) { 
     const car & carI = carLib[carIndex]; 
     printf("Car at index %lu: %d %s %s %f %d\n", 
      carIndex, carI.year, carI.make, carI.model, carI.price, carI.available); 
    } 

    // Find most expensive car 
    float mostExpensivePrice = 0;    // most expensive price found 
    size_t mostExpensiveIndex = carLibCount; // index points beyond array ("no car") 
    for (size_t carIndex = 0; carIndex < carLibCount; ++carIndex) { 
     if (carLib[carIndex].price <= mostExpensivePrice) continue; 
     // the car at carIndex is more expensive than old maximum, remember it 
     mostExpensivePrice = carLib[carIndex].price; 
     mostExpensiveIndex = carIndex; 
    } 

    if (mostExpensiveIndex == carLibCount) { 
     std::cout << "Most expensive car not found." << std::endl; 
    } else { 
     const car & carI = carLib[mostExpensiveIndex]; 
     printf("Most expensive car at index %lu: %d %s %s %f %d\n", 
      mostExpensiveIndex, carI.year, carI.make, carI.model, carI.price, carI.available); 
    } 
} 

Live demo

請注意,這只是數組索引的例子,這種「舊C」代碼風格很容易出錯索引超出範圍的代碼,覆蓋內存或訪問錯誤的內存。這就是爲什麼在現代C++中,您可以使用std::vector<car> carLib;,這更適合這樣的任務。

向量例如:

#include <iostream> 
#include <vector> 

struct car 
{ 
    int year; 
    char make[10]; 
    char model[10];  // that's only 9 letters for zero-terminated strings 
    float price; 
    int available; 
}; 

int main() 
{ 
    std::vector<car> carLib; 

    carLib.push_back(car {1993, {"Nohda"}, {"XYZ"}, 123.45, 0}); 
    carLib.push_back(car {1994, {"Frod"}, {"Peon"}, 543.21, 1}); 
    carLib.push_back(car {1977, {"Nohda"}, {"ABC"}, 3.32, 0}); 

    std::cout << "Cars in library: " << carLib.size() << std::endl; 
    for (const auto & kar : carLib) { 
     printf("%d %s %s %f %d\n", 
      kar.year, kar.make, kar.model, kar.price, kar.available); 
    } 

    if (0 < carLib.size()) { 
     // indexing trough size_t index still possible with vector 
     std::cout << "Last car price is: " << 
      carLib[carLib.size()-1].price << std::endl; 
     // Last valid index being size()-1, because first index is 0 
    } 
} 

但是,類似C是很好的爲你學習有關計算機內存的詳細信息,也它不向你介紹「float不是量的好變量類型」,如現場演示顯示。因此,在調試器中打開它,並找到一些內存窗口,並研究數據是如何在內存中實際佈置的,10個字母長的汽車名稱如何使您的結構出現問題,等等......

std::vector將結構與裸數組相同的方式,只需要更少的輔助數據,並根據需要動態保留內存,因此首先理解數組示例(及其缺點)同樣重要。

+0

不妨用完整的C++並用'std :: cout'代替'printf's,至少在第二個例子中。 – user4581301

+0

@ user4581301:我確實嘗試過,但當它出現時,'cout'是如此笨拙格式化,我仍然更喜歡'printf',即使在我的生產代碼中,讀取比流的東西更好。寫得好多了。 – Ped7g