“C 编程现代方法”中的问题

问题描述 投票:0回答:4

第 7 章 q11:
机票被分配了冗长的识别号码,例如 47715497443。为了有效,该号码的最后一位数字必须与其他数字(作为一组)除以 7 时的余数相匹配。编写一个程序来测试机票是否有效。

我的代码是:

main(){ 

    char c;
    int remainder = 0;
    
    printf("Enter a ticket number: ");
    
    while((c = getchar()) != '\n'){
       c -= '0';
       remainder = (remainder * 10 + c) % 7;
    }

    return 0;
}

但是,我无法弄清楚如何挑出航空公司号码的最后一位数字,以便不将其包含在余数计算中,并使用它来验证机票。

如有任何帮助,我们将不胜感激。

c
4个回答
0
投票

您只需缓冲

'\n'
之前输入的最后一位数字即可。

使用它来测试输入的每个字符的有效性可能是明智的:

isdigit( (unsigned char)ch )
strchr( "0123456789", ch ) != NULL

这使用循环计数器来确保至少输入两位数字。

#include <stdio.h>

int main( void ) {
    for(;;) { // infinite loop for testing
        char pending = '0'; // previous digit entered (starts as 0)
        int remainder = 0;

        printf( "Enter a ticket number: " );

        int cnt, cin;
        for( cnt = 0; ( cin = getchar() ) != '\n' && cin != EOF; cnt++ ) {
            remainder = ( remainder * 10 + (pending - '0') ) % 7;
            pending = (char)cin;
        }

        if( cin != EOF )
            printf( "%s\n", (cnt >= 2 && remainder == pending - '0') ? "Valid" : "Invalid" );
    }
    /* NOTREACHED */

    return 0;
}

0
投票

首先,您应该将您的票号存储为一个很长的整数,因为它很长!然后你应该将最后一位数字存储在一个变量中,并将该数字除以 10。最后你可以检查余数是否等于最后一位数字。

#include <stdio.h>
int main() {
    long long int ticketNumber;
    int lastDigit;
    int remainder;
    scanf("%lld",&ticketNumber);
    lastDigit = ticketNumber %10;
    ticketNumber/=10;
    if(ticketNumber % 7 == lastDigit){
        printf("Ticket is valid!");
    }else{
        printf("Ticket is not valid!");
    }
    return 0;
}

0
投票

这就是我想出来的。我不认为这是最好的解决方案,但它确实有效。

int main(void) {

char c;
int remainder = 0;
int i = 0;
char str[20] = "";

printf("Enter a ticket number: ");

while ((c = getchar()) != '\n')
{
    str[i] = c;
    i++;
}

for (int x = 0;x<i-1;x++)
{       
    remainder = (remainder * 10 + (str[x]-'0')) % 7;        
}

if (remainder == (str[i-1]-'0'))
    printf("Valid");
else
    printf("Invalid");


return 0;

0
投票

我最近做了这个问题,由于其他答案使用了书中尚未介绍的功能,所以我决定将我的解决方案放在这里。

int main(){
      int remainder = 0, flag = 0;
      char ch;
      
      printf("Enter ticket number: ");
      
      while ((ch = getchar()) != '\n') {
            ch -= '0';
            
            if (remainder == ch)
                  flag = 1;
            else
                  flag = 0;
            
            remainder = (remainder * 10 + ch) % 7;
      }
      
      if (flag)
            printf("VALID\n");
      else
            printf("INVALID\n");

      return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.