函数不会从向量C ++输出任何内容

时间:2015-03-05 02:08:48

标签: c++

基本上,我正在做一些课程,要求我创建一个允许最多两站的航班预订系统,例如伦敦到巴黎到巴塞罗那到汉堡。我设法创建一个版本,其中1停止工作,例如伦敦到巴黎到巴塞罗那,但我不能让这个工作。我已经在下面包含了我的代码,每当我调用此函数并将其传递给任何两个机场时,它都不输出任何内容。我很欣赏下面的代码是冗长的,但很多都是重复的。我也可能以完全错误的方式编写这个问题。如果您对如何处理此问题有任何更好的想法,请分享。

非常感谢。

void searchAllFlights(string origin, string destination)
    {

        ifstream checkNumOfLines("flights.txt");
        int numOfLines = 0;

        for(string line; getline(checkNumOfLines, line);){
            numOfLines++;
        }
        int lengthOfLines[10] = {0,0,0,0,0,0,0,0,0,0};

        checkNumOfLines.clear();
        checkNumOfLines.seekg(0, ios::beg);
        int index = 0;
        for(string line; getline(checkNumOfLines, line);){
            lengthOfLines[index] = line.length();
            index++;
        }

        int filePointers[11] = {0, lengthOfLines[0], lengthOfLines[0] + lengthOfLines[1], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2],
            lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] + lengthOfLines[3], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6] + lengthOfLines[7], lengthOfLines[0] + lengthOfLines[1] 
        + lengthOfLines[2] + lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6] + lengthOfLines[7] + lengthOfLines[8], 
        lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] + lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6] + 
        lengthOfLines[7] + lengthOfLines[8] + lengthOfLines[9]};

        ifstream flights("flights.txt");

        startingDeparturePoint = origin;
        endDestinationPoint = destination;
        totalFlightsPrice = 0;
        totalFlightDuration = 0;

        string originFromFile;
        string destFromFile;
        string airline;
        int price;;
        int flightDuration;

        cout << "No. |" << "Origin |" << "Destination |" << "Airline             |" << "Price         |" << "Duration                 |" << endl;
        cout << "----------------------------------------------------------------------------------------" << endl;

        matches = 0;

        int currentLine = 0;

        while(flights >> originFromFile >> destFromFile >> airline >> price >> flightDuration)
        {
            //flights.seekg(setfilepos, ios::beg);
            int numberOfChars = originFromFile.length() + destFromFile.length() + airline.length();


            if(originFromFile == startingDeparturePoint && destFromFile == endDestinationPoint)
            {
                matches++;
                directFlight(originFromFile, destFromFile, airline, price, flightDuration);
            }

            else if(originFromFile != startingDeparturePoint && destFromFile == endDestinationPoint)
            {
                matches++;

                string stopoverLast = originFromFile;
                string airlineLast = airline;
                int priceLast = price;
                int flightDurationLast = flightDuration;

                int currentIndex = firstOrigins.size() + 1;

                secondOrigins[currentIndex] = stopoverLast;
                secondDests[currentIndex] = destFromFile;
                secondAirlines[currentIndex] = airlineLast;
                secondPrices[currentIndex] = priceLast;
                secondFlightDurations[currentIndex] = flightDurationLast;


                ifstream flights2("flights.txt");

                string originFromFile2;
                string destFromFile2;
                string airlineFromFile2;
                int priceFromFile2;
                int flightDurationFromFile2;

                while(flights2 >> originFromFile2 >> destFromFile2 >> airlineFromFile2 >> priceFromFile2 >> flightDurationFromFile2){//1q
                    if(destFromFile2 == stopoverLast){
                        firstOrigins.push_back(originFromFile2);
                        firstDests.push_back(destFromFile2);
                        firstAirlines.push_back(airlineFromFile2);
                        firstPrices.push_back(priceFromFile2);
                        firstFlightDurations.push_back(flightDurationFromFile2);

                        if(originFromFile2 != startingDeparturePoint){
                            thirdOrigins[currentIndex] = secondOrigins[currentIndex];
                            thirdDests[currentIndex] = secondOrigins[currentIndex];
                            thirdAirlines[currentIndex] = secondOrigins[currentIndex];
                            thirdPrices[currentIndex] = secondPrices[currentIndex];
                            thirdFlightDurations[currentIndex] = secondFlightDurations[currentIndex];

                            secondOrigins[currentIndex] = firstOrigins[currentIndex];
                            secondDests[currentIndex] = firstOrigins[currentIndex];
                            secondAirlines[currentIndex] = firstOrigins[currentIndex];
                            secondPrices[currentIndex] = firstPrices[currentIndex];
                            secondFlightDurations[currentIndex] = firstFlightDurations[currentIndex];

                            ifstream flights3("flights.txt");

                            string originFromFile3;
                            string destFromFile3;
                            string airlineFromFile3;
                            int priceFromFile3;
                            int flightDurationFromFile3;

                            while(flights3 >> originFromFile3 >> destFromFile3 >> airlineFromFile3 >> priceFromFile3 >> flightDurationFromFile3){
                                if(originFromFile3 == startingDeparturePoint && destFromFile3 == secondOrigins[currentIndex]){
                                    firstOrigins[currentIndex] = originFromFile3;
                                    firstDests[currentIndex] = destFromFile3;
                                    firstAirlines[currentIndex] = airlineFromFile3;
                                    firstPrices[currentIndex] = priceFromFile3;
                                    firstFlightDurations[currentIndex] = flightDurationFromFile3;

                                    while(flights3 >> originFromFile3 >> destFromFile3 >> airlineFromFile3 >> priceFromFile3 >> flightDurationFromFile3){
                                        if(originFromFile3 == startingDeparturePoint && destFromFile3 == secondOrigins[currentIndex]){
                                            firstOrigins.push_back(firstOrigins[currentIndex]);
                                            firstDests.push_back(firstDests[currentIndex]);
                                            firstAirlines.push_back(firstAirlines[currentIndex]);
                                            firstPrices.push_back(firstPrices[currentIndex]);
                                            firstFlightDurations.push_back(firstFlightDurations[currentIndex]);

                                            secondOrigins[currentIndex + 1] = secondOrigins[currentIndex];
                                            secondDests[currentIndex + 1] = secondDests[currentIndex];
                                            secondAirlines[currentIndex + 1] = secondAirlines[currentIndex];
                                            secondPrices[currentIndex + 1] = secondPrices[currentIndex];
                                            secondFlightDurations[currentIndex + 1] = secondFlightDurations[currentIndex];

                                            thirdOrigins[currentIndex + 1] = originFromFile3;
                                            thirdDests[currentIndex + 1] = destFromFile3;
                                            thirdAirlines[currentIndex + 1] = airlineFromFile3;
                                            thirdPrices[currentIndex + 1] = priceFromFile3;
                                            thirdFlightDurations[currentIndex + 1] = flightDurationFromFile3;
                                        }
                                    }
                                }
                            }
                        }
                        else{
                            currentIndex++;
                            while(flights >> originFromFile >> destFromFile >> airline >> price >> flightDuration){
                                if(originFromFile != startingDeparturePoint && destFromFile == endDestinationPoint){
                                    matches++;

                                    stopoverLast = originFromFile;
                                    airlineLast = airline;
                                    priceLast = price;
                                    flightDurationLast = flightDuration;

                                    secondOrigins[currentIndex] = stopoverLast;
                                    secondDests[currentIndex] = destFromFile;
                                    secondAirlines[currentIndex] = airlineLast;
                                    secondPrices[currentIndex] = priceLast;
                                    secondFlightDurations[currentIndex] = flightDurationLast;

                                    firstOrigins.push_back(originFromFile2);
                                    firstDests.push_back(destFromFile2);
                                    firstAirlines.push_back(airlineFromFile2);
                                    firstPrices.push_back(priceFromFile2);
                                    firstFlightDurations.push_back(flightDurationFromFile2);

                                    while(flights2 >> originFromFile2 >> destFromFile2 >> airlineFromFile2 >> priceFromFile2 >> flightDurationFromFile2){
                                        currentIndex++;
                                        secondOrigins[currentIndex] = stopoverLast;
                                        secondDests[currentIndex] = destFromFile;
                                        secondAirlines[currentIndex] = airlineLast;
                                        secondPrices[currentIndex] = priceLast;
                                        secondFlightDurations[currentIndex] = flightDurationLast;

                                        firstOrigins.push_back(originFromFile2);
                                        firstDests.push_back(destFromFile2);
                                        firstAirlines.push_back(airlineFromFile2);
                                        firstPrices.push_back(priceFromFile2);
                                        firstFlightDurations.push_back(flightDurationFromFile2);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            break;
        }

        // loop over vectors and print out results, put in conditional statements to
        //check if 2nd and 3rd flights exist, if they do add the "-----" after

        for(int i = 0; i < firstOrigins.size(); i++){
            int mins = firstFlightDurations[i];
            int hours = 0;

            while(mins >= 60){
                hours++;
                mins -= 60;
            }
                cout << "No. |" << "Origin |" << "Destination |" << "Airline             |" << "Price         |" 
                    << "Duration " << endl;
            if(firstOrigins[i] != "-"){
                cout << left << setw(4) << setfill(' ') << 1 << right << "|";
                cout << left << setw(7) << setfill(' ') << firstOrigins[i] << right << "|";
                cout << left << setw(12) << setfill(' ') << firstDests[i] << right << "|";
                cout << left << setw(20) << setfill(' ') << firstAirlines[i] << right << "|";
                cout << left << "\x9c" << setw(13) << setfill(' ') << left << firstPrices[i] << right << "|";
                cout << left << hours << "hr(s) " << mins << "min(s)" << setw(11) << setfill(' ') << right << "|" << endl;

                if(secondOrigins[i] != "-"){
                    int mins2 = secondFlightDurations[i];
                    int hours2 = 0;

                    while(mins2 >= 60){
                        hours2++;
                        mins2 -= 60;
                    }

                    totalFlightsPrice = firstPrices[i] + secondPrices[i];
                    totalFlightDuration = firstFlightDurations[i] + secondFlightDurations[i] + thirdFlightDurations[i];

                    cout << left << setw(4) << setfill(' ') << 1 << right << "|";
                    cout << left << setw(7) << setfill(' ') << secondOrigins[i] << right << "|";
                    cout << left << setw(12) << setfill(' ') << secondDests[i] << right << "|";
                    cout << left << setw(20) << setfill(' ') << secondAirlines[i] << right << "|";
                    cout << left << "\x9c" << setw(13) << setfill(' ') << left << secondPrices[i] << right << "|";
                    cout << left << hours2 << "hr(s) " << mins2 << "min(s)" << setw(11) << setfill(' ') << right << "|" << endl;

                    if(thirdOrigins[i] != "-"){
                        int mins3 = secondFlightDurations[i];
                        int hours3 = 0;

                        while(mins3 >= 60){
                            hours3++;
                            mins3 -= 60;
                        }

                        totalFlightsPrice = firstPrices[i] + secondPrices[i] + thirdPrices[i];
                        totalFlightDuration = firstFlightDurations[i] + secondFlightDurations[i] + thirdFlightDurations[i];

                        cout << left << setw(4) << setfill(' ') << 1 << right << "|";
                        cout << left << setw(7) << setfill(' ') << thirdOrigins[i] << right << "|";
                        cout << left << setw(12) << setfill(' ') << thirdDests[i] << right << "|";
                        cout << left << setw(20) << setfill(' ') << thirdAirlines[i] << right << "|";
                        cout << left << "\x9c" << setw(13) << setfill(' ') << left << thirdPrices[i] << right << "|";
                        cout << left << hours3 << "hr(s) " << mins3 << "min(s)" << setw(11) << setfill(' ') << right << "|" << endl;

                        int totalmins = totalFlightsPrice;
                        int totalhours = 0;

                        while(totalmins >= 60){
                            totalhours++;
                            totalmins -= 60;
                        }

                        cout << left << setw(4) << setfill(' ') << " " << right << "|";
                        cout << left << setw(7) << setfill(' ') << " " << right << "|";
                        cout << left << setw(12) << setfill(' ') << " " << right << "|";
                        cout << left << setw(20) << setfill(' ') << " " << right << "|";
                        cout << left << setw(13) << setfill(' ') << "Total = \x9c" << totalFlightsPrice << right << "|";
                        cout << left << setw(6) << setfill(' ') << totalhours << "hr(s) " << totalmins << "min(s)"
                            << setw(11) << setfill(' ') << right << "|" << endl;
                        cout << "----------------------------------------------------------------------------------------" << endl;
                    }
                    else{

                        int totalmins = totalFlightDuration;
                        int totalhours = 0;

                        while(totalmins >= 60){
                            totalhours++;
                            totalmins -= 60;
                        }

                        cout << left << setw(4) << setfill(' ') << " " << right << "|";
                        cout << left << setw(7) << setfill(' ') << " " << right << "|";
                        cout << left << setw(12) << setfill(' ') << " " << right << "|";
                        cout << left << setw(20) << setfill(' ') << " " << right << "|";
                        cout << left << setw(13) << setfill(' ') << "Total = \x9c" << totalFlightsPrice << right << "|";
                        cout << left << setw(6) << setfill(' ') << totalhours << "hr(s) " << totalmins << "min(s)"
                            << setw(11) << setfill(' ') << right << "|" << endl;
                        cout << "----------------------------------------------------------------------------------------" << endl;
                    }
                }
                else{
                    cout << "----------------------------------------------------------------------------------------" << endl;
                }
            }
            else{
                cout << "No possible flight paths between the airports inputted.";
            }

            currentLine++;

            if(filePointers[currentLine] != filePointers[currentLine - 1]){
                flights.clear();
                flights.seekg(filePointers[currentLine],ios::beg);
            }
        }

编辑: 您还可以忽略checkNumOfLines文件以及filePointers和lengthOfLines数组。我以为我必须重置文件指针才能正确打印出来,但是没有。刚刚意识到它确实输出了一条可能的飞行路径,即如果我从我正在读入程序的飞行路径输入第一个原点和目的地。

编辑2: 这给了我比应有的压力更大的压力。我认为我使用的整个方法是荒谬的。有人可以简要介绍一下他们建立一个命令行程序的方法,该程序会向您显示两个用户输入的机场代码之间可能的航班列表,请允许最多2个站点。

新方法(感谢@PaulMcKenzie和@TonyD):

我基本上创建了3个向量,一个用于保存文本文件中的所有可能的飞行,一个用于保存当前行程的飞行(这在每个循环中被清除),一个是用于保存系列的多维向量航班是当前旅程中的载体。

class flightSearch
{
public:

    struct Flight
    {
        string origin;
        string destination;
        string airline;
        int price;
        int flightDuration;
    };

    vector<Flight> allFlights;
    vector<Flight> flightsInJourney;
    vector<vector <Flight> > allMatches; 
    Flight f;

    void populateFlightsVector()
    {
        ifstream flightsfile("flights.txt");
        while(flightsfile >> f.origin >> f.destination >> f.airline >> f.price >> f.flightDuration){
            allFlights.push_back(f);
        }
    }

    void searchForARoute(string userOrigin, string userDestination)
    {
        populateFlightsVector();
        for(unsigned i = 0; i < allFlights.size(); i++)
        {
            flightsInJourney.clear();
            if(allFlights[i].origin == userOrigin && allFlights[i].destination == userDestination)
            {
                flightsInJourney.insert(flightsInJourney.begin(), allFlights[i]);
            }
            allMatches.push_back(flightsInJourney);
        }
        for(unsigned i = 0; i < allMatches.size(); i++)
        {
            for(unsigned j = 0; j < allMatches[i].size(); j++){
                cout << allMatches[i][j].origin << " " << allMatches[i][j].destination << " " << allMatches[i][j].airline << endl;
            }
        }
    }
};  

现在我应该可以添加一些代码来检查需要多次飞行的路线,就像我在第一次尝试时所做的那样,并将它们添加到最终的多维向量中。我已经测试了这段代码,到目前为止它似乎适用于直飞航班。随意提出看起来可能有问题的任何内容。

1 个答案:

答案 0 :(得分:0)

使用您的最新代码,我看到的问题会导致一些问题。

首先,您不需要将flightsInJourney向量作为全局变量,因此必须重复清除searchForARoute函数中的向量。您可以将其设置为searchForARoute功能的本地功能,因为您使用它的目的是收集所有匹配的航班,然后将这些航班复制到您的allMatches向量。

其次,您在搜索功能中调用populateFlightsVector,但这不是必需的。您应该只填充一次数据文件,而不是重复填充。最好把它放在main()或类似的函数中,只调用一次来设置数据。

第三,回到searchForARoute功能,你的回路收集你找到的航班是不正确的。您应该首先收集在本地向量中找到的所有航班,然后在完成后,push_back将此向量找到的航班放到您的allMatches向量中。

简而言之,该功能可能看起来更像这样:

    void searchForARoute(const string& userOrigin, 
                         const string& userDestination)
    {
        vector<Flight> flightsInJourney;
        for(size_t i = 0; i < allFlights.size(); i++)
        {
            if(allFlights[i].origin == userOrigin && allFlights[i].destination == userDestination)
                flightsInJourney.push_back(allFlights[i]);
        }
        // push back all of the found matches
        allMatches.push_back(flightsInJourney);

        for(size_t i = 0; i < allMatches.size(); i++)
        {
            for(size_t j = 0; j < allMatches[i].size(); j++)
                cout << allMatches[i][j].origin << " " << allMatches[i] [j].destination << " " << allMatches[i][j].airline << endl;
        }
     }