If Else 参数被忽略
If Else Argument Ignored
我正在编写一个程序,将学生 ID 存储到 5 个不同实验室的 20 台 PC 的阵列中。我几乎明白了,就在程序检测到一个已经被使用过的 ID 时,它应该打印一条语句并重新启动程序,要求提供学生 ID。但是,当我的程序检测到已使用的 ID 时,它会继续请求实验室,然后打印声明,然后继续请求 PC 进行预订。
结帐(循环)
for(r=0;r<20;r++)
{
if(sId!=l1->pc[r] || sId!=l2->pc[r] || sId!=l3->pc[r] || sId!=l4->pc[r] || sId!=l5->pc[r])
{
printf("The Student ID '%i' has not made any booking\n", sId);
return;
}
}
结构代码:
typedef struct
{
int lId,pc[20],vunit;
}Openlab;
主要
int main()
{
Openlab lab1;
Openlab lab2;
Openlab lab3;
Openlab lab4;
Openlab lab5;
int option;
lab1.lId = 101;
lab1.vunit = 20;
lab1.pc[20];
lab2.lId = 201;
lab2.vunit = 20;
lab2.pc[20];
lab3.lId = 301;
lab3.vunit = 20;
lab3.pc[20];
lab4.lId = 401;
lab4.vunit = 20;
lab4.pc[20];
lab5.lId = 501;
lab5.vunit = 20;
lab5.pc[20];
printf("***Welcome to OpenLab Booking Service***");
while(option>3)
{
printf("\n\nPlease chose an option:");
printf("\n[1]Check In");
printf("\n[2]Check Out");
printf("\n[0]Quit");
printf("\n\nOption: ");
scanf("%i", &option);
if(option == 1)
{
check_in(&lab1,&lab2,&lab3,&lab4,&lab5);
option = 4;
printf("\nUnits Vacant Left in Lab 101: %i\n", lab1.vunit);
printf("Units Vacant Left in Lab 201: %i\n", lab2.vunit);
printf("Units Vacant Left in Lab 301: %i\n", lab3.vunit);
printf("Units Vacant Left in Lab 401: %i\n", lab4.vunit);
printf("Units Vacant Left in Lab 501: %i\n", lab5.vunit);
}
else if(option == 2)
{
check_out(&lab1,&lab2,&lab3,&lab4,&lab5);
option = 4;
printf("\nUnits Vacant Left in Lab 101: %i\n", lab1.vunit);
printf("Units Vacant Left in Lab 201: %i\n", lab2.vunit);
printf("Units Vacant Left in Lab 301: %i\n", lab3.vunit);
printf("Units Vacant Left in Lab 401: %i\n", lab4.vunit);
printf("Units Vacant Left in Lab 501: %i\n", lab5.vunit);
}
else if(option == 0)
{
printf("\n\nThanks for using the OpenLab Booking Service! See you again!\n\n");
}
}
return 0;
}
函数:
void check_in(Openlab *l1, Openlab *l2, Openlab *l3, Openlab *l4, Openlab *l5)
{
int sId,r,lab,comp;
printf("Please enter your Student ID: ");
scanf("%i", &sId);
for(r=0;r<20;r++)
{
if(sId!=l1->pc[r] && sId!=l2->pc[r] && sId!=l3->pc[r] && sId!=l4->pc[r] && sId!=l5->pc[r])
{
while(lab!=l1->lId && lab!=l2->lId && lab!=l3->lId && lab!=l4->lId && lab!=l5->lId)
{
printf("Choose a Open Lab [101,201,301,401,501]: ");
scanf("%i", &lab);
}
}
else
{
printf("The Student ID '%i' has already been used to book a PC!\n", sId);
break;
}
}
if(l1->vunit!=0 && l2->vunit!=0 && l3->vunit!=0 && l4->vunit!=0 && l5->vunit!=0)
{
while(comp>19)
{
printf("Choose a PC [0-19]: ");
scanf("%i", &comp);
}
}
else
{
printf("\nNo vacant PC left Open Lab %i!\n\n", lab);
}
if(lab==l1->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
if(l1->vunit!=0)
{
l1->vunit--;
l1->pc[comp] = sId;
}
}
else if(lab==l2->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l2->vunit--;
l2->pc[comp] = sId;
}
else if(lab==l3->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l3->vunit--;
l3->pc[comp] = sId;
}
else if(lab==l4->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l4->vunit--;
l4->pc[comp] = sId;
}
else if(lab==l5->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l5->vunit--;
l5->pc[comp] = sId;
}
}
查看:
void check_out(Openlab *l1, Openlab *l2, Openlab *l3, Openlab *l4, Openlab *l5)
{
int sId,r;
printf("Please Enter your Student ID: ");
scanf("%i", &sId);
for(r=0;r<20;r++)
{
if(sId==l1->pc[r])
{
l1->pc[r] = 0;
l1->vunit++;
printf("Removed");
//return;
}
else if(sId==l2->pc[r])
{
l2->pc[r] = 0;
l2->vunit++;
printf("Removed");
//return;
}
else if(sId==l3->pc[r])
{
l3->pc[r] = 0;
l3->vunit++;
printf("Removed");
//return;
}
else if(sId==l4->pc[r])
{
l4->pc[r] = 0;
l4->vunit++;
printf("Removed");
//return;
}
else if(sId==l5->pc[r])
{
l5->pc[r] = 0;
l5->vunit++;
printf("Removed");
//return;
}
}
}
你把逻辑搞反了。你目前得到它的方式是循环遍历所有 20 个插槽并检查所有 5 个实验室以查看是否已将学生分配给其中一个。如果不是,则您询问他们在哪个实验室并继续检查。您应该等到循环结束后再询问实验室。
而不是你得到的,你应该看看是否有学生被分配,如果他们是,打印出错误消息和函数中的 return
,因为没有继续下去的意义。
for(r=0;r<20;r++)
{
if(sId==l1->pc[r] || sId==l2->pc[r] || sId==l3->pc[r] || sId==l4->pc[r] || sId==l5->pc[r])
{
printf("The Student ID '%i' has already been used to book a PC!\n", sId);
return;
}
}
如果循环完成,那么你可以询问分配给他们的实验室。值得注意的是,您应该在使用之前为 lab
分配一个值,因为它可以包含任何值,包括一个有效的实验室 ID,这将导致它跳过 while
循环。或者,您可以将其设为 do...while()
循环,因为您总是想至少问一次问题。
do
{
printf("Choose a Open Lab [101,201,301,401,501]:\n");
scanf("%i", &lab);
}
while(lab!=l1->lId && lab!=l2->lId && lab!=l3->lId && lab!=l4->lId && lab!=l5->lId);
我正在编写一个程序,将学生 ID 存储到 5 个不同实验室的 20 台 PC 的阵列中。我几乎明白了,就在程序检测到一个已经被使用过的 ID 时,它应该打印一条语句并重新启动程序,要求提供学生 ID。但是,当我的程序检测到已使用的 ID 时,它会继续请求实验室,然后打印声明,然后继续请求 PC 进行预订。
结帐(循环)
for(r=0;r<20;r++)
{
if(sId!=l1->pc[r] || sId!=l2->pc[r] || sId!=l3->pc[r] || sId!=l4->pc[r] || sId!=l5->pc[r])
{
printf("The Student ID '%i' has not made any booking\n", sId);
return;
}
}
结构代码:
typedef struct
{
int lId,pc[20],vunit;
}Openlab;
主要
int main()
{
Openlab lab1;
Openlab lab2;
Openlab lab3;
Openlab lab4;
Openlab lab5;
int option;
lab1.lId = 101;
lab1.vunit = 20;
lab1.pc[20];
lab2.lId = 201;
lab2.vunit = 20;
lab2.pc[20];
lab3.lId = 301;
lab3.vunit = 20;
lab3.pc[20];
lab4.lId = 401;
lab4.vunit = 20;
lab4.pc[20];
lab5.lId = 501;
lab5.vunit = 20;
lab5.pc[20];
printf("***Welcome to OpenLab Booking Service***");
while(option>3)
{
printf("\n\nPlease chose an option:");
printf("\n[1]Check In");
printf("\n[2]Check Out");
printf("\n[0]Quit");
printf("\n\nOption: ");
scanf("%i", &option);
if(option == 1)
{
check_in(&lab1,&lab2,&lab3,&lab4,&lab5);
option = 4;
printf("\nUnits Vacant Left in Lab 101: %i\n", lab1.vunit);
printf("Units Vacant Left in Lab 201: %i\n", lab2.vunit);
printf("Units Vacant Left in Lab 301: %i\n", lab3.vunit);
printf("Units Vacant Left in Lab 401: %i\n", lab4.vunit);
printf("Units Vacant Left in Lab 501: %i\n", lab5.vunit);
}
else if(option == 2)
{
check_out(&lab1,&lab2,&lab3,&lab4,&lab5);
option = 4;
printf("\nUnits Vacant Left in Lab 101: %i\n", lab1.vunit);
printf("Units Vacant Left in Lab 201: %i\n", lab2.vunit);
printf("Units Vacant Left in Lab 301: %i\n", lab3.vunit);
printf("Units Vacant Left in Lab 401: %i\n", lab4.vunit);
printf("Units Vacant Left in Lab 501: %i\n", lab5.vunit);
}
else if(option == 0)
{
printf("\n\nThanks for using the OpenLab Booking Service! See you again!\n\n");
}
}
return 0;
}
函数:
void check_in(Openlab *l1, Openlab *l2, Openlab *l3, Openlab *l4, Openlab *l5)
{
int sId,r,lab,comp;
printf("Please enter your Student ID: ");
scanf("%i", &sId);
for(r=0;r<20;r++)
{
if(sId!=l1->pc[r] && sId!=l2->pc[r] && sId!=l3->pc[r] && sId!=l4->pc[r] && sId!=l5->pc[r])
{
while(lab!=l1->lId && lab!=l2->lId && lab!=l3->lId && lab!=l4->lId && lab!=l5->lId)
{
printf("Choose a Open Lab [101,201,301,401,501]: ");
scanf("%i", &lab);
}
}
else
{
printf("The Student ID '%i' has already been used to book a PC!\n", sId);
break;
}
}
if(l1->vunit!=0 && l2->vunit!=0 && l3->vunit!=0 && l4->vunit!=0 && l5->vunit!=0)
{
while(comp>19)
{
printf("Choose a PC [0-19]: ");
scanf("%i", &comp);
}
}
else
{
printf("\nNo vacant PC left Open Lab %i!\n\n", lab);
}
if(lab==l1->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
if(l1->vunit!=0)
{
l1->vunit--;
l1->pc[comp] = sId;
}
}
else if(lab==l2->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l2->vunit--;
l2->pc[comp] = sId;
}
else if(lab==l3->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l3->vunit--;
l3->pc[comp] = sId;
}
else if(lab==l4->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l4->vunit--;
l4->pc[comp] = sId;
}
else if(lab==l5->lId)
{
//printf("Booking for %i - Lab %i | PC %i ",sId,lab,comp);
l5->vunit--;
l5->pc[comp] = sId;
}
}
查看:
void check_out(Openlab *l1, Openlab *l2, Openlab *l3, Openlab *l4, Openlab *l5)
{
int sId,r;
printf("Please Enter your Student ID: ");
scanf("%i", &sId);
for(r=0;r<20;r++)
{
if(sId==l1->pc[r])
{
l1->pc[r] = 0;
l1->vunit++;
printf("Removed");
//return;
}
else if(sId==l2->pc[r])
{
l2->pc[r] = 0;
l2->vunit++;
printf("Removed");
//return;
}
else if(sId==l3->pc[r])
{
l3->pc[r] = 0;
l3->vunit++;
printf("Removed");
//return;
}
else if(sId==l4->pc[r])
{
l4->pc[r] = 0;
l4->vunit++;
printf("Removed");
//return;
}
else if(sId==l5->pc[r])
{
l5->pc[r] = 0;
l5->vunit++;
printf("Removed");
//return;
}
}
}
你把逻辑搞反了。你目前得到它的方式是循环遍历所有 20 个插槽并检查所有 5 个实验室以查看是否已将学生分配给其中一个。如果不是,则您询问他们在哪个实验室并继续检查。您应该等到循环结束后再询问实验室。
而不是你得到的,你应该看看是否有学生被分配,如果他们是,打印出错误消息和函数中的 return
,因为没有继续下去的意义。
for(r=0;r<20;r++)
{
if(sId==l1->pc[r] || sId==l2->pc[r] || sId==l3->pc[r] || sId==l4->pc[r] || sId==l5->pc[r])
{
printf("The Student ID '%i' has already been used to book a PC!\n", sId);
return;
}
}
如果循环完成,那么你可以询问分配给他们的实验室。值得注意的是,您应该在使用之前为 lab
分配一个值,因为它可以包含任何值,包括一个有效的实验室 ID,这将导致它跳过 while
循环。或者,您可以将其设为 do...while()
循环,因为您总是想至少问一次问题。
do
{
printf("Choose a Open Lab [101,201,301,401,501]:\n");
scanf("%i", &lab);
}
while(lab!=l1->lId && lab!=l2->lId && lab!=l3->lId && lab!=l4->lId && lab!=l5->lId);