[英]Loop doesn't behave properly
我已经在这个问题上停留了太长时间(6个多小时-_-)。
我正在尝试用c ++创建一个简单的游泳课预订系统。 我已经完成了90%的工作,唯一麻烦的是显示可用的时隙,特别是:
以显示所有可供预订的时隙(示例如图2所示。在该图中,“ x”表示该时隙中没有游泳教练,“ J / A / P / M / K”表示J (Jeff),A(Anna),P(Peter),M(Michael)和K(Kerry)在该时隙中都可用,“ J / A / P”表示J(Jeff),A(Anna)和P(Peter)在该时隙中都可用,但是M(Michael)和K(Kerry)在该时隙中不可用。)
对于此任务,我在“ Schedule类”内部创建了一个“获取可用性”功能(我将尽力解释这一点)。 功能如下:
bool Schedule::GetAvailability(int day, int time, int trainer){
bool available;
if(_bookingVector.empty()){
return true;
} else{
for(int i = 0; i < _bookingVector.size(); ++i){
int bTempTime = _bookingVector[i].GetTime();
int bTempDay = _bookingVector[i].GetDay();
int bTempTrainer = _bookingVector[i].GetTrainer();
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
available= false;
}else{
available= true;
}
}
}
return available;
}
此方法所做的全部工作就是访问一个向量,该向量将单个预订存储为“预订”类的对象。 每个预订对象都包含一天,一个时间和一个培训者变量。 该方法遍历矢量并访问每个预订对象以获得上述信息。 然后在调用该方法时对照输入的参数检查信息。
这项工作正常,我已对其进行了多次检查,并根据此输入正确返回了true / false。
我在显示方法中将此方法称为:
void Schedule::DisplaySchedule(){
// Create the 2d array
std::string **table;
table = new string*[_rows];
for (unsigned int row = 0; row < _rows; row++){
table[row] = new string[_cols];
}
//Fill 2d array with ""
for(int row = 0; row < _rows; row++){
for(int col = 0; col < _cols; col++){
table[row][col] = "";
}
}
//insert available trainers to correct cell
for(unsigned int row = 0; row < _rows; row++){
for(unsigned int col = 0; col < _cols; col++){
for(unsigned int x = 0; x < sizeof(_trainers)/sizeof(_trainers[0]); x++){
bool available = GetAvailability(col, row, x);
if(available == true){
table[row][col] += _trainers[x][0];
}else{
table[row][col] += "";
}
}
}
}
//DisplayDebug(); //shows debugging display
// Print out table
cout << "---------------------------------------------------------------" << endl;
for(unsigned int i = 0; i < ((sizeof(_days))/(sizeof(_days[0]))); i++){
cout << setw(_width) << _days[i];
}
cout << endl;
cout << "---------------------------------------------------------------" << endl;
cout << endl;
for(int row = 0; row < _rows; row++){
int x = 0;
cout << _timeslots[row];
for (int col = 0; col < _cols; col++){
cout << setw(_width) << table[row][col];
}
cout << endl;
}
delete table; //clean up
}
此函数创建显示可用教练的表格:
此功能的相关部分是:
//insert available trainers to correct cell
for(unsigned int row = 0; row < _rows; row++){
for(unsigned int col = 0; col < _cols; col++){
for(unsigned int x = 0; x < sizeof(_trainers)/sizeof(_trainers[0]); x++){
bool available = GetAvailability(col, row, x);
if(available == true){
table[row][col] += _trainers[x][0];
}else{
table[row][col] += "";
}
}
}
}
“行”循环遍历每个时隙,而“ col”循环遍历每一天。 最后一个循环遍历一个数组,该数组包含每个培训师的姓名(在预订对象中,培训师存储的数字为0到4,与_trainers数组中培训师的位置相对应(因此,“ 0”将为jeff ,“ 1”将是anna等)):
std::string _trainers [5] = {"Jeff", "Anna", "Peter", "Micheal", "Kerry"};
因此,在该循环中,将调用“ GetAvailability”函数,并以“ row,col和x”作为参数。
在我的脑海中,这应该可以正常工作,每当我对此进行迭代时,都应在表中的单元格中添加可用教练名称的第一个字母。 但这不是它的作用。
它仅适用于一个预订,因此,如果我在星期一的第一个时隙进行预订,则输出将是正确的:
它显示在该特定时间段内所有其他培训师都可用,除了杰夫(Jeff)已有预订。 但是现在,如果我与anna进行第二次预订,(同样的时隙,在星期一,与anna一起),我得到以下输出:
使用jeff的预订仍会保存(在屏幕快照表上方的调试输出中显示为day:0,time:0,trainer:0),但在表中显示为可用。 安娜正在预定。
我已经在这个问题上停留了很长时间了,无法弄清楚为什么会这样。 我试图对训练器循环进行硬编码(也就是:通过手动输入训练器编号来调用该函数:bool Availability0 = GetAvailability(col,row,0);),但是可以,但并不是我真正想要做的。
我尝试过创建一个布尔数组,该数组将接受来自Trainer循环内“ GetAvailability”函数的结果,但是那也不起作用,只有最新的预订才能给出结果。 因此,例如:如果我使用预订示例(jeff和anna的预订同时丢失了一天),则布尔数组应显示为:
{false,false,true,true,true};
但它显示
{true,false,true,true,true};
我只能假设自己的循环做错了什么,但是我可以弄清楚。 任何帮助将不胜感激,如果需要更多信息,请告诉我。
编辑1:
感谢您的最初答复,非常感谢。 就像你们建议的那样,我将GetAvailability函数更改为:
bool Schedule::GetAvailability(int day, int time, int trainer){
if(_bookingVector.empty()){
return true;
} else{
for(int i = 0; i < _bookingVector.size(); ++i){
int bTempTime = _bookingVector[i].GetTime();
int bTempDay = _bookingVector[i].GetDay();
int bTempTrainer = _bookingVector[i].GetTrainer();
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
return false;
}
}
}
//cout << " RETURNING " << availible;
}
更改方法后,结果如下:
现在,表格中什么也没显示,有什么建议吗?
我无法调试您的代码,但令我印象深刻的是,在您的Schedule :: GetAvailability(...)方法中,当该方法发现为培训员预订了广告位时[例如if((bTempTime == time)&&(bTempDay = =天)&&(bTempTrainer ==培训师)){available = false; } ...],您应该立即返回或退出循环。
如果在匹配的预订之后阵列中还有其他预订,则可用预订会重置为true。 这就是为什么在存在多个预订之后发生这种情况的原因。
以下各行中使用的逻辑是错误的:
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
available= false;
}else{
available= true;
}
原因如下:
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
// At this point, you just need to return false
// and not worry about checking other slots.
// available= false;
return false;
鉴于此,您不需要else
块。 这些行可以简单地替换为:
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
return false;
}
您可以在方法bool Schedule :: GetAvailability(int day,int time,int trainer)中进行for循环,如下所示。
for(int i = 0; i < _bookingVector.size(); ++i){
int bTempTime = _bookingVector[i].GetTime();
int bTempDay = _bookingVector[i].GetDay();
int bTempTrainer = _bookingVector[i].GetTrainer();
if((bTempTime == time) && (bTempDay == day) && (bTempTrainer == trainer)){
available= false;
}else{
available= true;
break;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.