#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>

/*没错,用多个宏定义简化代码,这可是最新操作!*/
/*惊喜不惊喜,意外不意外?*/
#define C card_imf
#define S struct
#define SIZE sizeof(S C)
#define T count
#define H head
#define I int
#define P printf
#define N scanf

S C
{
    long number;
    char name[20];
    double money;
    I lost;
    S C *next;
};

I user_choice;
FILE *fp;
S C *Creat_new();//初次运行程序时新建链表
void Open_File(char *openmode);//打开文件
void Close_File();//关闭文件
void Build_File();//初次运行程序时新建数据文件
void Use_Card(S C *H,I T);//消费
void Insert_Card(S C *H,I T);//插入新饭卡信息
void Charge_Money(S C *H,I T);//充值
void Delete_Card(S C *H,I T);//注销饭卡
void Lost_Card(S C *H,I T);//挂失饭卡
void Search_Card(S C *H,I T);//查找指定饭卡数据
void Start_Card(S C *H,I T);//初次运行程序时输入的初始数据
void Sort_Card(S C *H,I T);//对饭卡数据进行排序
void Print_Card(S C *H);//遍历饭卡文件
I Input_Choice();//输入的选项编号
I Check_Card(S C *H,I T,I num);//检查某编号的饭卡是否存在

I main()
{
    long num;
    while((user_choice=Input_Choice())!=0)
    {
        I T=1;
        S C *H,*p;
        if(user_choice==1)
            Build_File();
        H=Creat_new();
        if(H==NULL)//由于初次执行程序时会出现群龙无首的错误,所以把「第一次接收数据」和「第N次接收数据」分类讨论(我没别的意思,别想歪了)
        {
            switch(user_choice)
            {
            case 2:
            case 3:
            case 4:
                Start_Card(H,T);
                break;
            case 5:
            case 6:
            case 7:
                P("请输入饭卡号:");
                N("%d",&num);
                P("饭卡不存在!\n");
                system("pause");
                system("cls");
                break;
            default:
                system("cls");
                break;
            }
        }
        else
        {
            p=H;
            while(p->next!=NULL)
            {
                p=p->next;
                T++;
            }
            switch(user_choice)
            {
            case 2:
                Use_Card(H,T);
                break;
            case 3:
                Charge_Money(H,T);
                break;
            case 4:
                Insert_Card(H,T);
                break;
            case 5:
                Delete_Card(H,T);
                break;
            case 6:
                Lost_Card(H,T);
                break;
            case 7:
                Search_Card(H,T);
                break;
            case 8:
                Sort_Card(H,T);
                break;
            case 9:
                Print_Card(H);
                break;
            default:
                system("cls");
                break;
            }
        }
    }
    P("感谢使用本软件。已正常退出,按任意键结束。\n");
    return 0;
}

I Input_Choice()
{

    I i,j,k;
    for(i=1; i<=14; i++)
    {
        for(j=1; j<=20; j++)
            P(" ");
        if(i==1||i==3||i==14)
        {
            for(k=1; k<=30; k++)
                P("-");
        }
        else if(i==2)
            P("☆  请输入选项编号(0-9):  ☆");
        else if(i==4)
            P("★    1--建立饭卡文件       ★");
        else if(i==5)
            P("★    2--消费               ★");
        else if(i==6)
            P("★    3--充值               ★");
        else if(i==7)
            P("★    4--添加新饭卡         ★");
        else if(i==8)
            P("★    5--注销旧饭卡         ★");
        else if(i==9)
            P("★    6--设置与解除挂失     ★");
        else if(i==10)
            P("★    7--查询饭卡信息       ★");
        else if(i==11)
            P("★    8--排序饭卡信息       ★");
        else if(i==12)
            P("★    9--遍历饭卡信息       ★");
        else if(i==13)
            P("★    0--退出系统           ★");
        P("\n");
    }
    P("\n请输入选项编号:");
    N("%d",&user_choice);
    return user_choice;
}

void Close_File()
{
    if(fclose(fp))
    {
        P("Can not close the file!\n");
        exit(0);
    }
}

void Open_File(char *openmode)
{
    if((fp=fopen("card.dat",openmode))==NULL)
    {
        P("File open error!\n");
        exit(0);
    }
}

S C *Creat_new()
{
    Open_File("r");
    S C data;
    S C *H,*tail,*p;
    H=tail=NULL;
    while(fscanf(fp,"%ld%s%lf%d",&data.number,data.name,&data.money,&data.lost)!=EOF)
    {
        p=(S C *)malloc(SIZE);
        p->number=data.number;
        strcpy(p->name,data.name);
        p->money=data.money;
        p->lost=data.lost;
        p->next=NULL;
        if(H==NULL)
            H=p;
        else
            tail->next=p;
        tail=p;
    }
    Close_File();
    return H;
}

void fp_file(S C *H,I flag)//把内存链表中储存的文本内容写回到存储介质中的文件
{
    S C *p;
    Open_File("w");
    p=H;
    while(flag>0)
    {
        fprintf(fp,"%ld\t%s\t%f\t%d\n",p->number,p->name,p->money,p->lost);
        p=p->next;
        flag--;
    }
    Close_File();
}

void Build_File()
{
    Open_File("w");
    P("文件建立成功!\n");
    Close_File();
    system("pause");
    system("cls");
}

void Use_Card(S C *H,I T)
{
    long num;
    I flag=T;
    double balance,charge;
    S C *p;
    p=H;
    P("请输入饭卡号:");
    N("%ld",&num);
    if(Check_Card(H,T,num)==-1)
        P("饭卡不存在!\n");
    else
    {
        P("请输入饭费:");
        N("%lf",&charge);
        while(T>0)//遍历饭卡,找到使用者的卡并进行扣费
        {
            if(p->number==num)
            {
                if(p->money<5)
                    P("余额不足,请充值!\n");
                else if(p->lost==1)
                    P("本卡已冻结!\n");
                else
                {
                    balance=p->money-charge;
                    if(balance<0) P("余额不足,请充值!\n");
                    else
                    {
                        P("买饭前余额:%.2f\n",p->money);
                        p->money=balance;
                        P("买饭后余额:%.2f\n",p->money);
                    }
                }
                break;
            }
            p=p->next;
            T--;
        }
        fp_file(H,flag);
    }
    system("pause");
    system("cls");
}

void Charge_Money(S C *H,I T)
{
    long num;
    I flag=T;
    double charge;
    S C *p;
    p=H;
    P("请输入饭卡号:");
    N("%ld",&num);
    if(Check_Card(H,T,num)==-1)   P("饭卡不存在!\n");
    else
    {
        P("请输入充值额:");
        N("%lf",&charge);
        while(T>0)
        {
            if(p->number==num)
            {
                if(p->lost==1)   P("本卡已冻结!\n");
                else
                {
                    P("充值前余额:%.2f\n",p->money);
                    p->money=p->money+charge;
                    P("充值后余额:%.2f\n",p->money);
                }
                break;
            }
            p=p->next;
            T--;
        }
        fp_file(H,flag);
    }
    system("pause");
    system("cls");
}

void Insert_Card(S C *H,I T)
{
    char a[5];
    S C *p1,*p2,new_data;
    p2=H;
    strcpy(a,"是");
    while(strcmp(a,"是")==0)
    {
        P("请输入饭卡号:");
        N("%ld",&new_data.number);
        if(Check_Card(H,T,new_data.number)==1)
            P("饭卡已存在!\n");
        else
        {
            P("请输入姓名:");
            N("%s",new_data.name);
            P("请输入金额:");
            N("%lf",&new_data.money);
            new_data.lost=0;
            p1=(S C *)malloc(SIZE);
            p1->number=new_data.number;
            strcpy(p1->name,new_data.name);
            p1->money=new_data.money;
            p1->lost=new_data.lost;
            while(p2->next!=NULL)
                p2=p2->next;
            p2->next=p1;
            p2=p1;
            p2->next=NULL;
            T++;
            fp_file(H,T);
        }
        P("是否继续添加饭卡号:");
        getchar();
        gets(a);
    }
    system("pause");
    system("cls");
}

void Start_Card(S C *H,I T)
{
    S C *p;
    S C new_data;
    P("请输入饭卡号:");
    N("%ld",&new_data.number);
    P("请输入姓名:");
    N("%s",new_data.name);
    P("请输入金额:");
    N("%lf",&new_data.money);
    new_data.lost=0;
    p=(S C *)malloc(SIZE);
    p->number=new_data.number;
    strcpy(p->name,new_data.name);
    p->money=new_data.money;
    p->lost=new_data.lost;
    H=p;
    H->next==NULL;
    fp_file(H,T);
    system("pause");
    system("cls");
}

void Delete_Card(S C *H,I T)
{
    long num;
    I flag=T;
    P("请输入饭卡号:");
    N("%ld",&num);
    S C *p1,*p2,*p;
    p2=p1=H;
    if(Check_Card(H,T,num)==-1)
        P("饭卡不存在!\n");
    else
    {
        Open_File("w");
        while(T>0)
        {
            if(p1->number==num)
            {
                if(p1==H)
                {
                    H=p1->next;
                }
                else
                {
                    p2->next=p1->next;
                }
                free(p1);
                goto loop;
            }
            p2=p1;
            p1=p1->next;
            T--;
        }
        loop:p=H;
        while(flag>1)
        {
            fprintf(fp,"%ld\t%s\t%f\t%d\n",p->number,p->name,p->money,p->lost);
            p=p->next;
            flag--;
        }
        Close_File();
        P("旧饭卡注销成功!\n");
    }
    system("pause");
    system("cls");
}

void Lost_Card(S C *H,I T)
{
    I flag=T;
    char a[5];
    long num;
    S C *p;
    p=H;
    P("请输入饭卡号:");
    N("%ld",&num);
    if(Check_Card(H,T,num)==-1)
        P("饭卡不存在!\n");
    else
    {
        while(T>0)
        {
            if(p->number==num)
            {
                if(p->lost==0)
                {
                    P("当前饭卡未挂失!是否挂失:");
                    N("%s",a);
                    if(strcmp(a,"是")==0)
                        p->lost=1;
                }
                else if(p->lost==1)
                {
                    P("当前饭卡已挂失!是否解除挂失:");
                    N("%s",a);
                    if(strcmp(a,"是")==0)
                        p->lost=0;
                }
            }
            p=p->next;
            T--;
        }
        fp_file(H,flag);
        P("操作成功!\n");
    }
    system("pause");
    system("cls");
}

void Search_Card(S C *H,I T)
{
    long num;
    S C *p;
    p=H;
    P("请输入饭卡号:");
    N("%ld",&num);
    if(Check_Card(H,T,num)==-1)
        P("饭卡不存在!\n");
    else
    {
        P("饭卡号\t姓名\t金额\t是否挂失\n");
        while(T>0)
        {
            if(p->number==num)
            {
                if(p->lost==0)
                    P("%ld\t%s\t%.2f\t%s\n",p->number,p->name,p->money,"否");
                else
                    P("%ld\t%s\t%.2f\t%s\n",p->number,p->name,p->money,"是");
                break;
            }
            p=p->next;
            T--;
        }
    }
    system("pause");
    system("cls");
}

I Check_Card(S C *H,I T,I num)
{
    S C *p;
    p=H;
    while(T>0)
    {
        if(p->number==num)
            break;
        T--;
        p=p->next;
    }
    if(T==0)
        return -1;
    else
        return 1;
}

void Sort_Card(S C *H,I T)//通过两个指针就能实现链表的冒泡排序
{
    S C *p1,*p2,temp;
    I i,j,k;
    p1=p2=H;

    P("1.由大到小排列\n2.由小到大排列 \n请选择排列方式:\n");
    while(i!=1&&i!=2)
    {
        N("%d",&i);
        if(i==1)
        {
            for(j=1; j<T; j++)
            {
                p2=p2->next;
                for(k=0; k<(T-j); k++)
                {
                    if((p1->number)<(p2->number))
                    {
                        temp=*p1;
                        temp.next=p2->next;
                        *p1=*p2;
                        *p2=temp;
                        p1->next=p2;
                    }
                    p2=p2->next;
                    p1=p1->next;
                }
                p2=p1=H;
            }
        }
        else if(i==2)
        {
            for(j=1; j<T; j++)
            {
                p2=p2->next;
                for(k=0; k<(T-j); k++)
                {
                    if((p1->number)>(p2->number))
                    {
                        temp=*p1;
                        temp.next=p2->next;
                        *p1=*p2;
                        *p2=temp;
                        p1->next=p2;
                    }
                    p2=p2->next;
                    p1=p1->next;
                }
                p2=p1=H;
            }
        }
        else
            P("请输入正确的选项编号!\n");
    }
    P("已按照您的选项进行排列!\n");
    fp_file(H,T);
    system("pause");
    system("cls");
}

void Print_Card(S C *H)
{
    S C *p;
    P("学生饭卡信息如下:\n");
    P("饭卡号\t姓名\t金额\t是否挂失\n");
    for(p=H;p!=NULL;p=p->next)
    {
        if(p->lost==0)
            P("%ld\t%s\t%.2f\t%s\n",p->number,p->name,p->money,"否");
        else
            P("%ld\t%s\t%.2f\t%s\n",p->number,p->name,p->money,"是");
    }
    system("pause");
    system("cls");
}

饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告) 饭卡程序实验报告(C语言专业技能训练报告)


人生有無數種可能,人生有無限的精彩,人生沒有盡頭。一個人只要足夠的愛自己,尊重自己內心的聲音,就算是真正的活著。