[英]Need help making my code efficient
所以我刚刚开始学习结构,我最近的问题要求我检查用户输入的屏幕时间,唯一有效的范围是下午 2 点、下午 5 点、晚上 8 点和晚上 11 点。 我为它制作了一个很长的代码并按预期工作,但我认为它效率不高? 我尝试为有效的屏幕时间创建一个数组,并在大小为 4 的数组中输入所有 4 个值,并在用户输入他们的选择时进行循环以检查数组中的每个值,但是当用户输入错误的选择时,它会显示 4 条错误消息因为它检查数组中的所有 4 个值,所以它是错误的。 无论如何,这是我的代码:
void main(){
typedef struct{
char movieName[20];
int screenTime;
float price;
int seatNum;
} MovieTicket;
MovieTicket ticket;
//int validTime[4] = {2, 5, 8, 11};
do{
printf("Enter your screen time: ");
scanf("%d", &ticket.screenTime);
if(ticket.screenTime != 2 && ticket.screenTime != 5 && ticket.screenTime != 8 && ticket.screenTime != 11){
printf("Invalid Screen Time! Enter again please!\n");
}
} while(ticket.screenTime != 2 && ticket.screenTime != 5 && ticket.screenTime != 8 && ticket.screenTime != 11);
system("pause");
}
感谢您的时间,我只是一个初学者,所以请耐心等待:(
使用这样的幻数是相当难以维护的(添加新的允许时间并不干净,您必须编辑条件等),您的数组版本更好。 此答案的其余部分侧重于让该解决方案按照您希望的方式工作:
它非常有效(可以通过使用std::set
或std::unordered_set
提高效率,但对于如此少量的允许值,它可以忽略不计),这不是问题。 您当前的版本与带有数组的版本一样快,因为您仍然比较相同数量的数字。
如果您的问题是它打印错误 4 次,则保留一个布尔标志以指示用户输入的有效值,并在循环后检查它:
const unsigned int VALID_TIMES_SIZE = 4;
bool validTime = false;
for (unsigned int i = 0; i < VALID_TIMES_SIZE; ++i)
{
if (ticket.screenTime == validTimes[i])
{
validTime = true;
break;
}
}
if (!validTime)
{
printf("Invalid Screen Time! Enter again please!\n");
// Redo the loop using continue, for example
}
检查 scanf 的返回以确保它成功。 如果不是,则需要清除输入流中的待处理字符。
#include <stdio.h>
typedef struct{
char movieName[20];
int screenTime;
float price;
int seatNum;
} MovieTicket;
int main( void) {
MovieTicket ticket;
int result = 0;
int validTime[] = {2, 5, 8, 11};
int limit = sizeof ( validTime) / sizeof ( validTime[0]);
int match = 0;
do{
match = 0;
printf("Enter your screen time: ");
if ( 1 == ( result = scanf("%d", &ticket.screenTime))) {
//check for matching validTime
for ( int each = 0; each < limit; each++) {
if ( validTime[each] == ticket.screenTime) {
match = 1;
break;
}
}
if ( !match) {
printf("Invalid Screen Time! Enter again please!\n");
result = 0;
}
}
else {
//scanf could not parse an int
printf("Enter Screen Time! Enter again please!\n");
while ( '\n' != getchar ( )) { }//clear input stream
}
} while ( result != 1);
system("pause");
}
为了使事情易于理解,您可以避免使用这些幻数或将它们包装在像checkTime
这样有意义的结构中,然后将其用于此类检查。 这样假设下次你被要求用一些不同的时间构建一个检查时间时,你将不必寻找硬编码时间并用它替换新事物。
例如你可以做这样的事情,
struct checkTime{
int *checkedTimes;
int length;
int (*checkIfTimeExists)(const struct checkTime* ch, int tm);
};
int checkTimerExistAux(const struct checkTime* ch,int tm)
{
for(int i=0;i<ch->length;i++)
if(ch->checktedTimes[i]==tm) return 1;
return 0;
}
Then you create an `initilaize` function which will allocate memory and do this hardcoded thing. (like putting times and all that)[2,5,8,11] in your case.
initialize(); // here you created the structure `checkTimeInst`
// struct checkTime* checkTimeInstPtr = malloc(sizeof(struct checkTime));
// checkTimeInstPtr->checkedTimes = malloc(sizeof(int)*N);
// checkTimeInstPtr->length = 0;
// checkTimeInstPtr->checkIfTimeExists = checkTimerExistAux;
do{
printf("Enter your screen time: ");
scanf("%d", &ticket.screenTime);
if(checkTimeInstPtr->checkIfTimeExists(checkTimeInstPtr,ticket.screenTime)==0){
printf("Invalid Screen Time! Enter again please!\n");
}
} while(checkTimeInstPtr->checkIfTimeExists(checkTimeInstPtr,ticket.screenTime)==0);
这不是关于加速,而是关于可维护性。
在这里,您无法加快速度。 但是,是的,如果您想更多地挤出时间,请尝试使用getchar()
或类似方法自己使用阅读器或扫描仪。
最初发布的代码假定 C++,其中 OP 要求 C 语言特定的答案或修改。 在Paul Griffiths发表评论后,我对其进行了修改以遵循该标准。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.