函数不会从向量输出任何内容C++
function doesn't output anything from the vectors C++
基本上,我正在做一些课程,这需要我创建一个最多允许两站的航班预订系统,例如伦敦到巴黎到巴塞罗那到汉堡。我设法创建了一个一站式工作的版本,例如从伦敦到巴黎再到巴塞罗那,但我无法让这个版本工作。我在下面包含了我的代码,每当我调用这个函数并将其传递给任何两个机场时,它都不会输出任何内容。我很感激下面的代码很长,但其中很多都是重复的。我可能也以完全错误的方式对这个问题进行了编程。如果你对如何处理这个问题有什么更好的想法,请分享。
非常感谢。
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):
我基本上创建了三个向量,一个用于保存文本文件中所有可能的航班,一个保存当前旅程的航班(在每个循环中都会清除),另一个是多维向量,用于将一系列航班保存为当前旅程中的向量。
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;
}
}
}
};
现在,我应该能够像第一次尝试那样添加一些代码来检查需要多个航班的路线,并将它们添加到最终多维向量中。我已经测试了这个代码,到目前为止,它似乎适用于直航。随意指出任何看起来可能有问题的东西。
对于您的最新代码,以下是我看到的会导致一些问题的问题。
首先,不需要将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;
}
}
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- C++ 中是否有任何内置阶乘函数?
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 调用向量内的函数指针不执行任何操作
- 是否有任何挂钩接口在编译时间内更换功能
- 如何检查copy_if是否返回使用ostream_iterator范围内的任何内容
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- c ++中是否有任何内置功能可以在计划的时间运行任务
- 是否有任何内置的 UTF 在 c++ 在窗口中
- 在VC++2010中执行任何内置的ARRAY函数
- C++:如何在不使用任何内置函数的情况下将字符串转换为整数
- 是否有任何内置的CUDA函数允许CUDA内核向主机代码报告错误?
- 我如何在常数时间(O(1))内获得字母表(1-26)中字符的数值/位置,而不使用任何内置方法或函数
- C++中的任何内置哈希方法
- c++库中的任何内置夹子方法