who's theorum? lol thanks for pointing this out, though.
yes, sorry, those &&s change to ||s.. fingers' fault.
Printable View
who's theorum? lol thanks for pointing this out, though.
yes, sorry, those &&s change to ||s.. fingers' fault.
i mean how would/ should i redo my code becuase i'm getting fed up with this already. i mean i think you see what i want to do, i just can't figure out how to do it exactly
i cant see what you want to do, but i havent really looked at the big while loop.. ill look in the morning.
damm thanks
ok i completely re did my code and i get a fing segmentation fault. Where is it, i think this code is much better than the previous one i wrote. I ran GDB this is what it said for thing code
any idea what this means?Code:26 queue<rider> backIn;
(gdb)
30 string inFileName = "riders.dat";
(gdb)
34 string outFileName = "riders.out";
(gdb)
37 ifstream inFile;
(gdb)
40 ofstream outFile;
(gdb)
43 inFile.open(inFileName.c_str());
(gdb)
46 outFile.open(outFileName.c_str());
(gdb)
49 rider customer;
(gdb)
51 rider transfer = arrivals.front();
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0xb7f2e1bf in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string () from /usr/lib/libstdc++.so.6
Code:
//creates customer of the struct rider;
rider customer;
rider transfer = arrivals.front();
rider onRide = line.front();
while(inFile.good())
{
//it will loop and read from the inFile data while the customer data
//is not equal to END 0 0
while(customer.lastName != "END"))
{
//here the file will place the correct data for each customer into
//the correct variables
inFile >> customer.lastName >> customer.tickets >> customer.time;
//after the customer in that particular read is done putting
//it in the correct variables the customer gets pushed
//into arrivals queue
arrivals.push(customer);
}
transfer.time = clock;
while(transfer.time == clock)
{
line.push(transfer);
arrivals.pop();
}
while(!(arrivals.empty() && line.empty()))
{
onRide.tickets--;
if(onRide.tickets == 0)
{
outFile << onRide.lastName << clock+1 << endl;
}
else
{
backIn.push(onRide);
}
clock++;
if(transfer.time > clock)
{
clock = transfer.time;
}
while(transfer.time == clock)
{
line.push(transfer);
arrivals.pop();
}
if(!backIn.empty())
{
line.push(backIn.front());
backIn.pop();
}
}
}
//closes the infile
inFile.close();
//closes the outfile
outFile.close();
//signals ok to the os
return 0;
};
From what I read and understand of the instructions for this that were posted in this thread http://cboard.cprogramming.com/showthread.php?t=88198 you would use the clock variable to determine when you will add the item to the end of the line. It seems to me that you are setting the clock equal to the item in the queue when you should be comparing the entrance time to the clock to see if it should be added to the queue.
It looks, like you are still using the front() rider from queues that are empty.
What would arrivals.front() return before you put anything in it?
The way you do "time-travel" in your code also seems suspicious. There are situations where backIn is not empty (it's a temporary container, why can't you push onRide directly into the line, if he has tickets left?), but the clock gets turned forward according to the next arriver.
So if the first person arrived at time 1 and second at time 10, the first person can take only one ride and then the clock gets suddenly turned forward and he has to stand in queue with the second arriver?
(By the way, congratulations on removing the comments. If your teacher insists on that, add them as the last thing, because they really hindered reading the code.)
The code required is not very complicated, so may-be you could rewrite it from scratch (with a little better plan), rather than modifying it to every suggestion. A simple way to determine if the main loop should continue, is to keep a counter of people visiting the amusement park. First set it equal to the number of people planning to visit (arrivals), each time someone runs out of tickets decrement it. When it reaches 0, all riders will be served.
i have new updated code and i am still getting a segmentation fault i ran thriugh gdb and tried to fix but to no avail. If you think/know whats wrong please let me know where in the code specifically it is.
Code:#include <queue>
#include <iostream>
#include <fstream>
#include <string>
#include "rider.h"
using namespace std;
int main()
{
//variable used to keep time
int clock;
//queue that the information from the infile gets stored into
queue<rider> arrivals;
//queue that the riders with the correct clock time get put into
queue<rider> line;
//queue that the rider that needs to be put back in line gets held
queue<rider> backIn;
//string that makes it easier to remember the name of the file to open
//to read from
string inFileName = "riders.dat";
//string that makes it easier to remember the name of the file to open
//to write to
string outFileName = "riders.out";
//file read from
ifstream inFile;
//file write to
ofstream outFile;
inFile.open(inFileName.c_str());
if (!inFile)
{
// error if not inFilename entered when prompted
cout << "ERROR: Unable to open the inFile";
exit(1);
}
//open outFile
outFile.open(outFileName.c_str());
if (!outFile)
{
// error if not outFilename entered when prompted
cout << "ERROR: Unable to open the outFile";
exit(1);
}
//creates customer of the struct rider;
rider customer;
//here the file will place the correct data for each customer into
//the correct variables
inFile >> customer.lastName >> customer.time >> customer.tickets;
//it will loop and read from the inFile data while the customer data
//is not equal to END 0 0
while(!(customer.lastName == "END" && customer.tickets == 0 && customer.time == 0))
{
//after the customer in that particular read is done putting it in the
//correct variables the customer gets pushed ito arrivals queue
arrivals.push(customer);
//here the file will place the correct data for each customer into
//the correct variables
inFile >> customer.lastName >> customer.time >> customer.tickets;
}
inFile.close();
//once all the customers are read from the inFile and put into the arrivals
//queue the program and clock will have to be run where this data will be
//processed. For the processing part of the program, it will run while
//the queues arrivals and line are not empty, therefore they will stop
//running when they become empty.
while(!(arrivals.empty() && line.empty() && backIn.empty()))
{
rider transfer = arrivals.front();
if(transfer.time > clock)
{
//sets clock equal to the first customers time
clock = transfer.time;
}
//will put all the customers with the same arrival
//time as the clock into the line queue
while(transfer.time == clock)
{
//here the front of the arrivals queue is put into the line queue
line.push(transfer);
//here the old front from the arrivals queue is popped off
arrivals.pop();
transfer = arrivals.front();
}
//need to check to see if backIn is empty or not, if it is
//then it won't add anything, if not it will add the customers data
if(!backIn.empty())
{
//if the rider from the previous time still has tickets left it
//will be added after the next group of customers from that time
line.push(backIn.front());
//get ride of the rider in the backIn queue
backIn.pop();
}
//after the customers are added to the line queue the ride
//will begin to run, which entails taking away one ticket
//from the person on the ride then checking to see if any
//tickets are left and if so add to the end of the line queue
//after the next group of customers enter, if no tickets are
//left then write out the name and the clock time to the out file.
//creates a variable onRide to represent the front of the line
//queue which represents that customer going on the ride
rider onRide = line.front();
//takes 1 ticket way from the customer that is going on the line
onRide.tickets--;
//increments clock
clock++;
//after the ride is completed it checks to see if the customer
//that was just on the ride has more tickets to go back in line
//or if it should be written to the outfile
//if the customer on ride has 0 tickets the last name and the
//clock time get printed out on the line to the outfile
if(onRide.tickets == 0)
{
//write the customers lastName and clock time to the outfile
outFile << onRide.lastName << clock << endl;
line.pop();
onRide = line.front();
}
//else if the cusomters ticket count is greater than 0 the customer
//and his info will get stored into backIn to place the customer
//back in line
else
{
//places the customer on the ride's data into the backIn
//variable so they may get placed back in line
backIn.push(onRide);
line.pop();
onRide = line.front();
}
/*
//this will look to see if the transfer arrival time is equal to 0, if not
//it will set clock equal to that number then copy all the transfers that
//have that clock number.
//checks to see if the transfer time is equal to the clock time
if(!line.empty())
{
//will put all the customers with the same arrival
//time as the clock into the line queue
while(transfer.time == clock)
{
//here the front of the arrivals queue is put into the line queue
line.push(transfer);
//here the old front from the arrivals queue is popped off
arrivals.pop();
transfer = arrivals.front();
}
//need to check to see if backIn is empty or not, if it is
//then it won't add anything, if not it will add the customers data
if(!backIn.empty())
{
//if the rider from the previous time still has tickets left it
//will be added after the next group of customers from that time
line.push(backIn.front());
//remove the rider in backIn
backIn.pop();
}
//increment clock
clock++;
//after the customers are added to the line queue the ride
//will begin to run, which entails taking away one ticket
//from the person on the ride then checking to see if any
//tickets are left and if so add to the end of the line queue
//after the next group of customers enter, if no tickets are
//left then write out the name and the clock time to the out file.
//creates a variable onRide to represent the front of the line
//queue which represents that customer going on the ride
onRide = line.front();
//takes 1 ticket way from the customer that is going on the line
onRide.tickets--;
//after the ride is completed it checks to see if the customer
//that was just on the ride has more tickets to go back in line
//or if it should be written to the outfile
//if the customer on ride has 0 tickets the last name and the
//clock time get printed out on the line to the outfile
if(onRide.tickets == 0)
{
//write the customers lastName and clock time to the outfile
outFile << onRide.lastName << clock << endl;
line.pop();
onRide = line.front();
}
//else if the cusomters ticket count is greater than 0 the customer
//and his info will get stored into backIn to place the customer
//back in line
else
{
//places the customer on the ride's data into the backIn
//queue so they may get placed back in line
backIn.push(onRide);
line.pop();
onRide = line.front();
}
}*/
}
//closes the outfile
outFile.close();
//signals ok to the os
return 0;
};
give clock a value when you declare it near the top of the code. im sure this will affect your program, but i doubt its the segfault--still looking.Code:if(transfer.time > clock)
edit: you have a giant block-comment--are we supposed to ignore its content?
Here, I added some asserts for you. See where the queue whose front element you are trying to read is empty. (This doesn't mean there's nothing else wrong with the code.)
If you fix those problems, you still have the infinite loop that has already been pointed out. pop() just removes the first element from the queue, it doesn't magically change transfer.
All in all, the logic is messy. A complete rewrite (with a clearer logic) could get you there.
And when posting code again, please consider the comments below.
When posting code, please think about those that you are posting the code for.Code:#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <cassert>
using namespace std;
struct rider
{
//variable for last name of rider
string lastName;
//variable for number of tickets the rider has
int tickets;
//variable for the arrival time of the rider
int time;
};
int main()
{
//variable used to keep time
int clock;
//queue that the information from the infile gets stored into
queue<rider> arrivals;
//queue that the riders with the correct clock time get put into
queue<rider> line;
//queue that the rider that needs to be put back in line gets held
queue<rider> backIn;
//string that makes it easier to remember the name of the file to open
//to read from
string inFileName = "riders.dat";
//string that makes it easier to remember the name of the file to open
//to write to
string outFileName = "riders.txt";
//file read from
ifstream inFile;
//file write to
ofstream outFile;
inFile.open(inFileName.c_str());
if (!inFile)
{
// error if not inFilename entered when prompted
cout << "ERROR: Unable to open the inFile";
exit(1);
}
//open outFile
outFile.open(outFileName.c_str());
if (!outFile)
{
// error if not outFilename entered when prompted
cout << "ERROR: Unable to open the outFile";
exit(1);
}
//creates customer of the struct rider;
rider customer;
//here the file will place the correct data for each customer into
//the correct variables
inFile >> customer.lastName >> customer.time >> customer.tickets;
//it will loop and read from the inFile data while the customer data
//is not equal to END 0 0
while(!(customer.lastName == "END" && customer.tickets == 0 && customer.time == 0))
{
//after the customer in that particular read is done putting it in the
//correct variables the customer gets pushed ito arrivals queue
arrivals.push(customer);
//here the file will place the correct data for each customer into
//the correct variables
inFile >> customer.lastName >> customer.time >> customer.tickets;
}
inFile.close();
assert(clock == 0 && "clock probably not initialized.");
while(!(arrivals.empty() && line.empty() && backIn.empty()))
{
assert(!arrivals.empty() && "arrivals must not be empty!");
rider transfer = arrivals.front();
if(transfer.time > clock)
{
//sets clock equal to the first customers time
clock = transfer.time;
}
while(transfer.time == clock)
{
//here the front of the arrivals queue is put into the line queue
line.push(transfer);
assert(line.size() <= 4 && "How can you have more than 4 people in the line?");
//here the old front from the arrivals queue is popped off
assert(!arrivals.empty() && "arrivals must not be empty!");
arrivals.pop();
assert(!arrivals.empty() && "arrivals must not be empty!");
transfer = arrivals.front();
}
if(!backIn.empty())
{
assert(!backIn.empty() && "backIn must not be empty!");
line.push(backIn.front());
//get ride of the rider in the backIn queue
backIn.pop();
}
assert(!line.empty() && "line must not be empty!");
rider onRide = line.front();
//takes 1 ticket way from the customer that is going on the line
onRide.tickets--;
//increments clock
clock++;
if(onRide.tickets == 0)
{
//write the customers lastName and clock time to the outfile
outFile << onRide.lastName << clock << endl;
line.pop();
assert(!line.empty() && "line must not be empty!");
onRide = line.front();
}
else
{
backIn.push(onRide);
line.pop();
assert(!line.empty() && "line must not be empty!");
onRide = line.front();
}
outFile.close();
}
//signals ok to the os
return 0;
}
Make sure code is properly indented.
If you have a massive amount of comments, make a copy of your source code and remove comments that don't add anything to the understanding.
In particular remove large blocks of commented out code. Some people are reading this is the browser, where it is impossible to see where the comments start and end.
Try to provide something compilable. Contents of "riders.h" could be pasted directly into the source, rather than have people search for a small declaration in a lengthy thread.