2016-09-22 7 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は、金額のために良い変数の型ではありません」ライブデモが表示されます。デバッガでそれを開き、いくつかのメモリウィンドウを見つけて、実際にデータがメモリにどのようにレイアウトされているか、どのように構造体に問題があるかなどを調べます。

std::vectorはベアアレイと同じ方法で、ヘルパーデータをあまり持たず、必要に応じてメモリを動的に予約するので、配列の例(およびその欠点)を最初に理解することが重要です。

+0

C++を使い、 'printf'を' std :: cout'に置き換えてください。少なくとも2番目の例では – user4581301

+0

@ user4581301:私は試しましたが、 'cout'はそれほど不器用です書式設定は、私はまだ私の生産コードでも 'printf'を好む、私にストリームのものよりも読みやすい。そしてはるかに優れた書き込みをします。 – Ped7g

関連する問題