【学习ios之路:C语言】小程序:实现类似ATM取款机功能.

小程序:模拟ATM机取款的过程

1).定义两个能保存5个整形数的数组,一个用于保存5个人的卡号,一个用于保存对应卡号的密码

2).判断输入的卡号是否在数组中。

3).如果在数组中就让输入密码,判断是否和卡号对应的密码匹配。

4).判断密码,24小时内只允许输入3次错误的密码。输入错误应该提示还剩下的输入次数,3次都输入错误提示24小时内不允许操作该卡。

5).密码正确就让用户对该账户进行相应的操作。

6).注意取款的限制。

7).述功能对于一个ATM机是循环的过程,也就是说每个客户都会按照上面的操作进行操作,一个用户操作完成,下一个用户来了还可以进行相应的操作.

1.函数声明部分:

<span style="font-size:14px;">

//随机产生卡号
void InputCard(int m[],int count);

//随机产生密码
void InputPwd(int m[],int count);

//随机产生money
void InputMoney(int m[], int count);

//判断卡号是否正确
BOOL isCard(int m[],int count,int username);

//输出卡号和密码
void OutputCard_Pd(int m[], int count);

//判断密码是否正确
BOOL isPwd(int password, int pwd);

//根据账号获取密码
int requestPwd(int username, int m[], int count);

//取款操作
int OutputMoney(int a, int b);

//转账操作
BOOL tranMoney(int a, int m[], int count);

//存款操作
int  cunMoney(int a , int b);
</span>

2.对应方法实现

<span style="font-size:14px;">

#import <Foundation/Foundation.h>

//随机输入

void InputValue(float a[], int count){
    for (int i = 0; i < count; i++) {
        a[i] = arc4random() % (40 - 20 + 1) + 20.5;
    }
}

//升序方法
void tempSort(float a[], int x, int y) {
    if (a[x] > a[y]) {
        float temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}

//排序函数
void sort(float a[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0 ; j < count - 1 - i; j++) {
            //换位方法
            tempSort(a, j, j+1);
        }
    }
}

//输出
void OutputValue(float a[], int count) {
    printf("\n");
    for (int i = 0; i < count; i++) {
        printf("%.1f ",a[i]);
    }
}

//随机产生卡号
void InputCard(int m[],int count) {
    for (int i = 0; i < count ; i++) {
        m[i] = arc4random() % (9000 - 1000 + 1) + 1000;
    }
}
//随机产生密码
void InputPwd(int m[],int count) {
    for (int i = 0; i < count ; i++) {
        m[i] = arc4random() % (200 - 100 + 1) + 100;
    }
}

//随机产生money
void InputMoney(int m[],int count) {
    for (int i = 0; i < count ; i++) {
        m[i] = arc4random() % (10000 - 10 + 1) + 10;
    }
}

//判断卡号是否正确

BOOL isCard(int m[],int count ,int username) {
    BOOL flag = NO;
    for (int i = 0; i < count; i++) {
        if (username == m[i]) {
            flag = YES;
        }
    }
    return flag;
}

//判断密码是否正确
BOOL  isPwd(int password, int pwd){
    BOOL flag = NO;
        if (password == pwd) {
            flag = YES;
        }
    return flag;
}

//输出卡号和密码
void OutputCard_Pd(int m[], int count) {
    for (int i = 0; i < count; i++) {
        printf("%4d ", m[i]);
    }
    printf("\n");
}

//通过账号获取密码下标.
int requestPwd(int username,int m[],int count) {
    int index = 0;
    for (int i = 0; i < count; i++) {
        if (username == m[i]) {
            index = i;
        }
    }
    return index;
}
//取款操作
int OutputMoney(int a, int b) {
    int x = a - b;
        a = x;
    return x;
}

//存款操作
int  cunMoney(int a , int b) {
    int x = a + b;
    a = x;
    return x ;
}</span>

 

3.功能实现

<span style="font-size:14px;">

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

     //定义2个整形数组
    int username[5] = {0};//定义数组,并初始化为0
    int password[5] = {0};
    int money[5] = {0};//账户余额

    InputCard(username, 5);     //随机卡号
    InputPwd(password, 5);      //随机密码
    InputMoney(money, 5);       //随机money
    OutputCard_Pd(username, 5); //取出卡号
    OutputCard_Pd(password, 5); //取出密码
    OutputCard_Pd(money, 5);    //随机money

    int card_jie[5] = {0, 0, 0, 0, 0};//存放被冻结的卡号.

    while(1){ //死循环.

        int user = 0; //定义卡号初始化,
        int s = 0;//如果s为1,冻结,如果为0,继续执行
        while (1) {
            printf("请输入银行卡号:\n");
            scanf("%d",&user); //输入卡号
            if (isCard(username, 5, user)) { //判断卡号是否存在
                printf("卡号正确!\n");
                break; //结束循环
            }else{
                printf("该卡不存在,请重新输入\n");
            }
        }

        int j = requestPwd(user, username, 5); //获取对应用户名的下标
        int pwd = 0; //定义变量密码,初始化为0

        //判断卡是否冻结
        for (int i = 0; i < 5; i++) {
            if (card_jie[i] == username[j]) { //判断密码是否存在
                s  = 1;  //如果存储冻结卡号的数组中有这个卡号  s = 1;
                printf("你的卡已经被冻结,24小时之内不能操作\n");
                break;
            }
        }

        //用户名正确,操作.
        if (isCard(username, 5, user)) {

            if (s == 0) {  //没有被冻结.

                //账号正确
                for (int i = 3; i >= 0; i--) {
                    printf("请输入密码:\n");
                    scanf("%d",&pwd);
                    if (isPwd(password[j], pwd)) { //判断密码
                        printf("你输入的密码正确\n");
                        break;
                    } else {
                        if (i == 1) { //第三次的时候
                            printf("密码错误,你已经输入3次,24小时之内不能操作.\n");
                            //卡冻结时把冻结卡号存放在数组中
                            for (int i = 0; i < 5; i++) {
                                if (card_jie[i] == 0) {
                                    card_jie[i] = username[j]; //如果为0,将卡号保存在数组中
                                    //printf("asdasd = %d\n",card_jie[i]);
                                    break;//循环结束,挨个存储.
                                }
                            }
                            break;
                        }
                        printf("你输入的密码不正确,你还有%d 次机会,请重新输入\n",i - 1);
                    }
                }
            }
        }
        //当账号密码正确
        int x = money[j]; //定义变量x,将money操作后的值,赋值给x.
        if(isCard(username, 5, user)){
            if (isPwd(password[j], pwd)) {//用户名密码正确后,进行操作.
                while(1){
                    int num = 0;
                    printf("请选择你要进行的操作: 1.查询余额 2.取款 3.转账 4.存款 5.退出\n");
                    scanf("%d",&num);
                    if (num == 1) {
                        //查询余额操作
                        printf("你的账户余额为:%d\n",x);
                    } else if(num == 2) {
                        //取款
                        int mon = 0;
                        printf("请输入你要取款的金额:\n");
                        scanf("%d",&mon);
                        if (x < mon) {
                            printf("你的余额不足!");
                        } else {
                            x = OutputMoney(x, mon);//取款
                            printf("取款成功,卡上余额为:%d\n", x);
                        }
                    } else if(num == 3) {
                        //转账
                        printf("请输入你要转的账户卡号:\n");
                        int phone = 0;
                        scanf("%d",&phone);
                        if (isCard(username, 5, phone)) {
                            int c = requestPwd(phone, username, 5); //通过卡号,获取卡号的下标.
                            printf("请输入你要转账的金额:\n");
                            int m = 0;
                            scanf("%d",&m);
                            if (m > x) {
                                printf("余额不足,你不能转账\n");
                            } else {
                                x = x - m ;
                                money[c] = money[c] + m; //把对方账户钱数加上转账钱数.
                                printf("转账成功!,你所剩余额为:%d\n",x);
                            }
                        } else {
                            printf("你输入的卡号不正确\n");
                        }
                    } else if(num == 4) {
                        //存款
                        printf("请输入你要存的钱数:\n");
                        int y = 0;
                        scanf("%d",&y);
                        x = cunMoney(x, y);//存款操作
                        printf("存款成功,你的余额为:%d\n", x);
                    } else if(num == 5) {
                        //退出
                        money[j] = x; //推出时,把原来的余额替换成操作后的.
                        break;
                    }

                }

            }
        }

    }

    return 0;
}</span>

时间: 2024-12-13 22:41:47

【学习ios之路:C语言】小程序:实现类似ATM取款机功能.的相关文章

【学习ios之路:C语言】存储区内存划分

一. 内存存储区的划分: 1.栈区:栈区主要存放函数内部定义的变量,数组.函数调用时,开辟空间,函数执行完毕,回收空间,空间的开辟与回收有系统管理. 2.堆区:堆区最大的特点:空间的开辟与释放有开发人员手动管理. 3.全局区静态区:主要存放函数外部定义的全局变量以及静态变量,空间一旦开辟,就不会回收.直到应用程序执行结束. 4.常量区:存储常量.1.整形常量.2.浮点型常量.3,字符串常量.4.字符串常量. 5.代码区:存放程序编译之后生成的cpu指令. 二.malloc,在堆区开辟空间. //

【学习ios之路:C语言】函数及递归的简单应用

函数定义: 返回值类型 函数名(形参列表){函数体(函数的实现内容)}; 函数定义的四种形式: //函数定义第一种形式: 无参数, 无返回值 void byMilk() { //如果没有参数,小括号必不可少. printf("没钱\n"); } //函数名的命名规范:由多个英文单词组成,除了第一个单词的首字母小写,其余单词首字母大写. //函数定义第二种形式,有返回值,无参数 float salary() { printf("同志们辛苦了\n"); return 0

【学习ios之路:C语言】C语言中容易出错的试题整理.

注:此类题都是比较基础的试题,但是都容易让人忽视,或者平常不在意的. 1.表达式3.6-5/2+1.2+5%2的值是(D). A. 4.3  B. 4.8  C.3.3  D. 3.8 2.设有说明:char w;int x;float y;double z;则表达式w*x+z-y值的数据类型为:(D) A. float   B. char  C. int  D. double 3.以下关于运算符优先顺序的描述中正确的是:(C) A.关系运算符<算术运算符<赋值运算符<逻辑与运算符  

【学习ios之路:C语言】一维数组,数组排序,字符数组

1.数组 数组,快速定义多个变量. 数组定义: 数据类型 数组名[数组元素的个数] = {值1, 值2, 值 3}; 数组所占存储空间大小 = 数组元素个数 * 每个元素所占的存储空间大小. %lu  unsigned long 无符号的长整型. 无符号 >=0 sizeof 存储大小值  //用来计算一个变量,类型,以及数组所占存储空间的大小. int a[5] = { 2, 7, 4, 3, 6 };  printf("%lu\n", sizeof(arr)); //5 in

【学习ios之路:C语言】指针

指针 1.指针定义,即简单用法. <span style="font-size:14px;"> //指针变量:专门用来存储地址的变量. int *p = NULL;//NULL == 0 /** * 变量定义时: * (int *):指针类型 * p: 变量名 NULL:初始值. * NULL(指向了一个无效的区域) * *的作用: 告诉编译器,后面变量是指针变量,用来存储地址. * int作用: 1.当通过指针变量取数据时,一次性读取几个字节的数据. 2.当指针变量+1时

【学习ios之路:C语言】循环方面试题

1.打印出如下所示图形  : * *  * * * * 代码如下: for (int i = 0; i < 3; i++) { for (int j = 2; j > i; j--) { printf(" "); } for (int k = 0; k < i + 1; k++) { printf(" *"); } printf("\n"); } 2. 打印出如下图形: * *   * *  *  * *   * * 代码如下:

【学习ios之路:C语言】总结整理:学好Object-C---C语言必备知识点

一.基本数据类型.常量.变量.运算符 1.数据类型 int. short.char.long.float.double. 2.常量的分类.(1).整型常量 (2)浮点型常量 (3)字符常量 (4)字符串常量. 3.常量的特性:常量存储在常量区,常量区的内容不可被更改. 4.变量的定义与本质.数据类型 变量名 = 初值 . 本质变量就是一个容器. 5.变量名的命名规范 6.运算符. (1)赋值运算符 = (2)算数运算符 +  -  *  /  %  ++  -- (3)复合运算符  +=  -+

【学习ios之路:C语言】数组.循环.语句总和运用试题练习

1).求一个数组中的第二大值.数组中的值范围10 - 30 ,存储空间大小为10. 代码如下: int a[10] = {0}; int max = 0, secMax = 0; //定义第一大值,第二大值. for (int i = 0; i< 10; i++) { a[i] = arc4random() %(30 - 10 + 1) + 10;//随机值 10-30 printf("a[%d] = %d\n" ,i ,a[i]); } for (int i = 0 ; i &

【学习ios之路:C语言】②高级指针应用

1.指针与字符数组 <span style="font-size:14px;"> /** 定义字符串的2种方式 * 1.利用数组 * char name[] = "itcast" * *特点:字符串里面的字符是可以修改的 * *使用场合:字符串的内容需要经常修改. * 2.利用指针 * char *name = "itcast"; * *特点:字符串其实是一个常量字符串,里面的字符是不能修改的; * *使用场合:字符串内容不需要修改,