Determining if a number is either a multiple of ten or within a particular set of ranges

后端 未结 13 1441
Happy的楠姐
Happy的楠姐 2021-01-31 07:01

I have a few loops that I need in my program. I can write out the pseudo code, but I\'m not entirely sure how to write them logically.

I need -

if (num is          


        
13条回答
  •  北恋
    北恋 (楼主)
    2021-01-31 07:28

    A plea for readability

    While you already have some good answers, I would like to recommend a programming technique that will make your code more readable for some future reader - that can be you in six months, a colleague asked to perform a code review, your successor, ...

    This is to wrap any "clever" statements into a function that shows exactly (with its name) what it is doing. While there is a miniscule impact on performance (from "function calling overhead") this is truly negligible in a game situation like this.

    Along the way you can sanitize your inputs - for example, test for "illegal" values. Thus you might end up with code like this - see how much more readable it is? The "helper functions" can be hidden away somewhere (the don't need to be in the main module: it is clear from their name what they do):

    #include 
    
    enum {NO, YES, WINNER};
    enum {OUT_OF_RANGE=-1, ODD, EVEN};
    
    int notInRange(int square) {
      return(square < 1 || square > 100)?YES:NO;
    }
    
    int isEndOfRow(int square) {
      if (notInRange(square)) return OUT_OF_RANGE;
      if (square == 100) return WINNER; // I am making this up...
      return (square % 10 == 0)? YES:NO;
    }
    
    int rowType(unsigned int square) {
      // return 1 if square is in odd row (going to the right)
      // and 0 if square is in even row (going to the left)
      if (notInRange(square)) return OUT_OF_RANGE; // trap this error
      int rowNum = (square - 1) / 10;
      return (rowNum % 2 == 0) ? ODD:EVEN; // return 0 (ODD) for 1-10, 21-30 etc.
                                           // and 1 (EVEN) for 11-20, 31-40, ...
    }
    
    int main(void) {
      int a = 12;
      int rt;
      rt = rowType(a); // this replaces your obscure if statement
    
      // and here is how you handle the possible return values:
      switch(rt) {
      case ODD:
        printf("It is an odd row\n");
        break;
      case EVEN:
        printf("It is an even row\n");
        break;
      case OUT_OF_RANGE:
        printf("It is out of range\n");
        break;
      default:
        printf("Unexpected return value from rowType!\n");
      }
    
      if(isEndOfRow(10)==YES) printf("10 is at the end of a row\n");
      if(isEndOfRow(100)==WINNER) printf("We have a winner!\n");
    }
    

提交回复
热议问题