繁体   English   中英

需要帮助使我的代码高效

[英]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::setstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM