CS50 IDE学习笔记(2)

首先,分享一个网站:https://cs50.readthedocs.io/#c

注:该网站还附带提升英语水平加成

接下来:上代码——

  • Q:输入卡号,判断卡的归属不合法.

INVALID :非法卡号
AMEX:34、37开头 15位(eg:378282246310005)
MASTERCARD:51~55开头 16位
VISA :4开头 13 or 16位(eg:4003600000000014)

卡号合法性判断:
1.从倒数第2位往前,每间隔的数字乘2, 并且把所有数字相加
2.将相加的结果加上卡号中未乘以2的数字
3.如果第2步的结果,以0结尾,则是合法卡号

解题代码①

# include <cs50.h>//注意cs是小写的(鄙人易错之处)
# include<stdio.h>
int main ()
{
    long int i, m, c, d, e, f, p;
    scanf("%ld", &m);
    long int b = m, s = 0, a = 1;
    while(a!=0)
    {
        a = b/100;
        k = b/10;
        b = a%10;
        l = k%10;
        s += 2*b;
        s += l;   
    }
    //判断AMEXDE条件
    c = m - 3.4e14;//printf("%.0f\n",c/(1e13));
    d = m - 3.7e14;//printf("%.0f\n",d/(1e13));
    //判断Visa条件
    e = m - 4e13;//printf("%.0f\n",e/(1e12));
    f = m - 4e15;//printf("%.0f\n",d/(1e15));
    //判断MasterCredit条件
    for (i = 51; i < 56; i++)
    {
        if((m-i*(1e13))/ (i*(1e13))==0)
      {
            p = 1;
            break;
      }
      else p = 0;
    }
    //  printf("%ld\n", p);    
    if(s%10 != 0)
        printf("您输入的为非法卡号");                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    else if((c/(1e13) <= 1&&c/(1e13) >= -1)||(d/(1e13) <= 1&&d/(1e13) >= -1))                                                                                                                                                                                                             
        printf("此卡为AMEX");
    else if((e/(1e12) - 0 <= 1&&e/(1e12) - 0 >= -1)||(f/(1e15) -0 <= 1&&f/(1e15) -0 >= -1))
        printf("此卡为Visa");
    else if(p == 1)
        printf("此卡为MasterCard");
    else
        printf("此其他类型卡");
 
    return 0;
}

解题代码②

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<cs50.h>
#define N 20

bool Luhn(string s);
int getLenth(string s);
void toArray(string s ,int arr[N]);
bool inSafe(int arr[N] ,int n);
//主函数
int main(void)
{
    int n ,i ,IDcode[N];
    string ID;
    
    ID = get_string("Numbers:");//get card ID//字符串(String)是由零个或多个字符组成的有限序列。所以可以是数字、特殊符号、空的。”
    n = getLenth(ID);//get ID size
    toArray(ID,IDcode);//convert ID int IDcode(array)
    while(inSafe(IDcode,n) == false)
    {
        ID = get_string("Retry:");//get card ID
        n = getLenth(ID);//get ID size
        toArray(ID,IDcode);//convert ID int IDcode(array)
    }//Retry if input unsafe

    // printf("IDstr:%s\n",ID);
    // printf("convert result:%lu\n",strtol(ID, NULL, 10));
    // printf("IsLuhn?:%d\n",Luhn(ID));
    // printf("IDcode:");
    // for(i=0;i<N;i++)
    //     printf("%d ",IDcode[i]);
    // printf("sizeofIDcode:%d\n",n);
    // printf("\n");

    if(Luhn(ID) == 1)/*condition of valid card*/
    {
        if(n==15 && (IDcode[n-1]==3 && (IDcode[n-2]==4 || IDcode[n-2]==7))/*condition of AmericanExpress*/)
            printf("AMEX\n");
        else if(n==16 && (IDcode[n-1]==5 && (IDcode[n-2]>=1 && IDcode[n-2]<=5))/*condition of MasterCard*/)
            printf("MASTERCARD\n");
        else if((n==13 || n==16) && IDcode[n-1]==4/*condition of Visa*/)
            printf("VISA\n");
        else
            printf("UNKNOW\n");
    }
    else
        printf("INVALID\n");
// recognize the type of card
    return 0;
}
//判断是否为合法卡号
bool Luhn(string s)//此s为ID
{
     int oddSum=0, evenSum=0;//odd奇数even偶数
     int i;
     for(i=strlen(s)-1; i>=0; i-=2)
         oddSum+=(s[i]-48);//48是0的ACII码//当字符与数字做运算(逻辑或算术)时,字符自动转化为ASII码
     for(i=strlen(s)-2; i>=0; i-=2)
     {
         int wenum=2*(s[i]-48);
         if(wenum>=10)
             evenSum+=(wenum-9);
         else
             evenSum+=wenum;
     }
     if((evenSum+oddSum)%10==0)
         return 1;
     else
         return 0;
}//luhn for string

int getLenth(string s)//得到s的字长
{
    int n;
    n = strlen(s);
    return n;
}
//字符串数组与整型数组转换
void toArray(string s, int arr[N])
{
    for(int i=0 ; i<N ; i++)
        arr[i] = s[i]-48;
}
//是否有非法字符(非数字)的输入
bool inSafe(int arr[N] ,int n)
{
    for(int i=0 ; i<n ; i++)
    {
        if(arr[i]<0 || arr[i]>9)
            return false;
    }
    return true;
}

以上代码不要在visual和Dev上运行,绝大多数也运行不了。就在CS50 IDE上编译运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值