C语言用链表实现管理系统

C语言用链表实现电脑配件管理系统

第一次发表Blog,有些问题处理的不是很好,望体谅,同学们可以在评论区询问我相关的问题并指出我的不足。

本人在某偏远地区末流985大学(就是这样:自己的学校只允许自己人喷)软件工程专业学习,大一第一个学期学习了C语言,第二个学期前两个月要求编写C语言完整的管理系统,这个管理系统主要由我和我的一个队友用<CodeBlocks17.02>完成。(第一次编写完整的C语言程序,题目要求接近完成,但我自己对这个系统还有很多不满意的地方,关注我Blog,我以后会只用C语言对此系统一直修改完善,强迫症,莫得办法。。)

发一下大体要求:(具体要求未征询出题老师同意,不方便透露)
这张截图是我们的题目
补充:
1.我们设定批发时,规定数量50,规定额度5000,如果超过就会出现赠品。
2.在统计金额时,默认初始资金为5,000,000。

遇到的问题有很多,大部分都尝试解决了。下面分享一下编写电脑配件管理系统的要注意的地方与我们的代码,希望对同学们有帮助。

1.重点)首先一定要仔细读题,理解题目。把题目中的每一个要求都读懂,不要和我们一样,在编程中期时发现我们写的函数有些与题目中的要求不一样,才修改,而且因为程序是一个整体,所以大改会有些麻烦。但是,即使我们又理解了一遍题意,仍然有些地方没有处理好。例如:按照(4)中要求题目中暗示要将配件按照大小型分类,但我们完全没有考虑到这个问题。

2.重点)一定要先写好主函数,然后在编写每一个分函数,思路要清晰。我发一下我写的主函数,大家可以借鉴一下。

//主函数
int main(int argc, char *argv[]){
    system("color F5");//背景颜色
    SetConsoleTitle("计算机配件管理系统");//标题
    login();//登入函数
    while(1)//无限循环
    {
        switch(menu())//选择函数
        {
            case 0:
                system("CLS");
                rewrite();//密码修改函数
                break;

            case 1:
                system("CLS");
                gotoxy(55,1);//光标移动函数
                printf("*------------------------------计算机配件信息添加-----------------------------*");
                add();//添加函数
                break;

            case 2:
                system("CLS");
                money();//可以实时改变的统计金额函数
                gotoxy(55,6);
                printf("*------------------------------计算机配件信息修改-----------------------------*");
                revise();//修改函数
                break;

            case 3:
                system("CLS");
                gotoxy(55,6);
                printf("*------------------------------计算机配件信息删除-----------------------------*");
                Delete();//删除函数
                break;

            case 4:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*-------------------------按照顺序排序生成目前库存报表-----------------------*");
                queryone();//库存函数
                break;

            case 5:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*-------------------------按照时间排序成目前库存报表-----------------------*");
                querytwo();//按照时间排序
                break;

            case 6:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*-------------------------计算机配件信息查询(顺序排序)-----------------------*");
                choice();//查询函数
                break;

            case 7:
                system("CLS");
                money();
                gotoxy(55,2);
                printf("*------------------------------计算机配件统计赠品-----------------------------*");
                statisticsfour();//统计赠品函数
                break;

            case 8:
                system("CLS");
                money();
                gotoxy(55,1);
                printf("*---------------------------计算机配件进货时间查询----------------------------*");
                timequery();//时间查询函数
                break;

            case 9:
                system("CLS");
                end();//结束函数
                break;
        }
    }
    return 0;
}

3.程序中出现名称的地方尽量用英语来表示,用汉语拼音来表示感觉有点难受(个人观点)。(我们写到大概三分之一时,发现了这个问题,改的时候也比较麻烦)

4.一定要写注释,有的同学为了省事,注释写的很少,这会影响程序的可读性,而且以后自己想要修改也会有些麻烦。我们也做的不好,前期写的还挺多,后期也懒得写了。(但我会在我的博客上慢慢增加的)

完整代码
(分函数按照在主函数中出现的顺序排列)
下面分享一下我们写的完整代码与运行过程图片,再之后会在之后我的Blog中对我感觉重要的函数进行讲解。(按照具体要求,我们不需要在程序中创建文本文件,所以要求我们提前在外部C语言程序所在文件中创建好txt文件,而且要在不同的txt文件中按照规定的格式(在写入文件函数中寻找)输入至少一条信息,当然,这些样本文件我也会上传到我的Blog上【估计两三天以后就会审核通过】,如果大家想直接运行程序,可以先下载并将其移动其到正确位置即可运行

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<ctype.h>
#include<time.h>
#include <stdbool.h>

//密码
char passport[99]="123456";//初始密码为123456
//时间结构体
struct time{
    char month[20];
    char day[20];
    char hour[20];
    char minute[20];
};

//配件结构体
struct buygoods{
    struct time in;
    char name[20];
    char type[20];
    char creat[20];//制造商
    char unitprice[20];//单价
    char amount[20];
    char totalprice[20];//总价
    char supplier[20];
    struct buygoods*next;
};

//配件+赠品结构体
struct giftgoods{
    struct time in;
    char name[20];
    char type[20];
    char creat[20];//制造商
    char unitprice[20];//单价
    char amount[20];
    char totalprice[20];//总价
    char supplier[20];//供货商
    char present[20];//赠品
    struct giftgoods*next;
};

void login();//登入函数
bool is_pass();//密码函数
int menu();//菜单函数
void money();//统计营业额、盈利额
void gotoxy();//光标移动函数
void add();//添加函数
void Time(char*,char*,char*,char*);//时间函数
void jd(char*);//时间完善函数
void jd1(char*);//检验回车函数
int judge(char*);//检验字符函数
void surplus(char*,char*,char*,char*,char*,char*);//剩余输入
void rewrite();//修改密码
int deal(struct buygoods *,int*);//库存检验函数

void writefileone(struct buygoods*h);//写入进货记录文件函数
void writefiletwo(struct buygoods*h);//写入批发销售文件函数
void writefilethree(struct buygoods*h);//写入零售销售入文件函数
void writefilefour(struct giftgoods*h);//写入批发赠品函数

struct buygoods*readfileone();//读入进货记录函数
struct buygoods*readfiletwo();//读批发销售入函数
struct buygoods*readfilethree();//读入零售销售函数
struct giftgoods*readfilefour();//读入批发赠品函数

void revise();//修改函数
void Delete();//删除函数
void queryone();//按照顺序排序生成目前的库存报表

void statisticsone();//统计进货记录函数
void statisticstwo();//统计批发销售货物函数
void statisticsthree();//统计零售销售函数
void statisticsfour();//统计批发赠品函数

void querytwo();//按照时间排序生成目前的库存报表
void choice();//查询函数
int menutwo();//选择录入菜单
void choiceone();//排序配件函数
void choicetwo();//排序供货商函数
void choicethree();//排序客户历史采购信息函数

void timequery();//按照时间查询函数
void end();//结束界面

//主函数
int main(int argc, char *argv[]){
    system("color F5");
    SetConsoleTitle("计算机配件管理系统");
    login();
    while(1)
    {
        switch(menu())
        {
            case 0:
                system("CLS");
                rewrite();
                break;

            case 1:
                system("CLS");
                gotoxy(55,1);
                printf("*------------------------------计算机配件信息添加-----------------------------*");
                add();
                break;

            case 2:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*------------------------------计算机配件信息修改-----------------------------*");
                revise();
                break;

            case 3:
                system("CLS");
                gotoxy(55,6);
                printf("*------------------------------计算机配件信息删除-----------------------------*");
                Delete();
                break;

            case 4:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*-------------------------按照顺序排序生成目前库存报表-----------------------*");
                queryone();
                break;

            case 5:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*-------------------------按照时间排序成目前库存报表-----------------------*");
                querytwo();
                break;

            case 6:
                system("CLS");
                money();
                gotoxy(55,6);
                printf("*-------------------------计算机配件信息查询(顺序排序)-----------------------*");
                choice();
                break;

            case 7:
                system("CLS");
                money();
                gotoxy(55,2);
                printf("*------------------------------计算机配件统计赠品-----------------------------*");
                statisticsfour();
                break;

            case 8:
                system("CLS");
                money();
                gotoxy(55,1);
                printf("*---------------------------计算机配件进货时间查询----------------------------*");
                timequery();
                break;

            case 9:
                system("CLS");
                end();
                break;
        }
    }
    return 0;
}

//登入函数
void login(){
    gotoxy(60,14);
    puts("---------------------------------------------------------------");
    gotoxy(60,18);
    puts("------------欢 迎 来 到 计 算 机 配 件 管 理 系 统-------------");
    gotoxy(60,22);
    puts("---------------------------------------------------------------");
    gotoxy(60,24);
    puts("---------------------请按任意键继续!--------------------------");
    gotoxy(85,28);
    getch();
    system("cls");
    char pas[99999];
    int i;
    i=5;
    int length,length1;
    while(i>0)
    {
        gotoxy(60,15);
        puts("-----------------------------------------------------------------------");
        gotoxy(60,18);
        printf("--------------请输入密码:(密码为6位,错误次数还剩%i次)----------------\n",i);
        gotoxy(60,21);
        puts("-----------------------------------------------------------------------");
        gotoxy(85,24);
        int q=0;
        while((pas[q]=getch())!='\r')
       {
           if(pas[q]=='\b')
          {
            printf("\b \b");
            q--;
          }
           else
          {
            printf("*");
            q++;
          }
       }
        pas[q]='\0';
        length=strlen(pas);
        length1=strlen(passport);
        if(is_pass(pas)&&length==length1)
        {
            break;
        }
        else
        {
            gotoxy(82,28);
            puts("密码错误,请重新输入");
            gotoxy(82,31);
            puts("请按任意键继续!");
            gotoxy(82,33);
            getch();
            i--;
            if(i>0)
                system("cls");
            continue;
        }
    }
    if(i==0)
    {
        system("cls");
        gotoxy(60,15);
        puts("------------------------------------------------------------------------");
        gotoxy(60,19);
        puts("--------------您输入密码错误次数已达5次,无法使用该程序!---------------");
        gotoxy(60,23);
        puts("-------------------------------------------------------------------------");
        exit(0);
    }
}

//密码函数
bool is_pass(char *ch){
    int i;
    for(i=0; i<6; i++)
    {
        if(passport[i]!=*(ch+i))
            return 0;
    }
    return 1;

}

//菜单函数
int menu(){
    char n;
    do
    {
        system("cls");
        gotoxy(55,6);
        printf("*------------------------------计算机配件管理系统-----------------------------*");
        gotoxy(55,10);
        printf("\t\t\t|-------------------------------------------------|\n");
        gotoxy(55,11);
        printf("\t\t\t|                                                 |\n");
        gotoxy(55,12);
        printf("\t\t\t|                  *欢迎使用                      |\n");
        gotoxy(55,13);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,14);
        printf("\t\t\t|-------------------------------------------------|\n");
        gotoxy(55,15);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,16);
        printf("\t\t\t|          0.修改密码                             |\n");
        gotoxy(55,17);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,18);
        printf("\t\t\t|          1.添加信息                             |\n");
        gotoxy(55,19);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,20);
        printf("\t\t\t|          2.修改信息                             |\n");
        gotoxy(55,21);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,22);
        printf("\t\t\t|          3.删除信息                             |\n");
        gotoxy(55,23);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,24);
        printf("\t\t\t|          4.按照顺序排序生成交易信息报表         |\n");
        gotoxy(55,25);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,26);
        printf("\t\t\t|          5.按照时间排序生成交易信息报表         |\n");
        gotoxy(55,27);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,28);
        printf("\t\t\t|          6.查询(按照顺序排序)                  |\n");
        gotoxy(55,29);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,30);
        printf("\t\t\t|          7.统计赠品信息                         |\n");
        gotoxy(55,31);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,32);
        printf("\t\t\t|          8.打印某段时间范围内的交易信息         |\n");
        gotoxy(55,33);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,34);
        printf("\t\t\t|          9.退出                                 |\n");
        gotoxy(55,35);
        printf("\t\t\t|                                                 |\n");
        gotoxy(50,36);
        printf("\t\t\t|-------------------------------------------------|\n");
        gotoxy(35,38);
        printf("\t\t\t   请选择0-9:");
        n=getch();
    }while(n<'0'||n>'9');
    return (n-48);
}

//统计营业额、盈利额
void money(){
    struct buygoods*h,*p;
    float  businessvolume=0,purchasevolume=0,salesvolume=0,i;
    h=readfiletwo();
    for(p=h;p->next!=NULL;p=p->next)
    {
        i=atof(p->totalprice);
        businessvolume+=i;
    }
    h=readfilethree();
    for(p=h;p->next!=NULL;p=p->next)
    {
        i=atof(p->totalprice);
        businessvolume+=i;
    }
    gotoxy(130,40);
    printf("%10s","营业额(销售总额)");
    gotoxy(130,41);
    printf("----------------------------------");
    gotoxy(130,42);
    printf("%10f",businessvolume);

    h=readfileone();
    for(p=h;p->next!=NULL;p=p->next)
    {
        i=atof(p->totalprice);
        purchasevolume+=i;
    }
    salesvolume=businessvolume-purchasevolume;
    gotoxy(130,43);
    printf("%10s\n","盈利额(销售额-进货额)");
    gotoxy(130,44);
    printf("----------------------------------");
    gotoxy(130,45);
    printf("%10f",salesvolume);
    gotoxy(130,46);
    printf("%10s\n","流动资金");
    gotoxy(130,47);
    printf("----------------------------------");
    gotoxy(130,48);
    printf("%10f",5000000+salesvolume);
    gotoxy(0,0);
}

//光标移动函数
void gotoxy(int x,int y){
    COORD pos= {x,y};               //一个坐标结构体,代表窗口的点阵
    HANDLE hOutput;
    /*将调用的参数读入结构体,编译得到窗口上一个具体的坐标*/
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput,pos);
    /*句柄操作,实现对光标的移动*/
}

//时间完善函数
void jd(char *a){
    int length;
    char y[3];
    length=strlen(a);
    if(length==0)
    {
        strcpy(a,"未知");
    }
    if(length==1)
    {
        y[0]='0';
        y[1]=a[0];
        strcpy(a,y);
    }
}

//检验字符函数
void jd1(char *a){
    int length;
    length=strlen(a);
    if(length==0)
    {
        strcpy(a,"未知");
    }
}

//添加函数
void add(){
    gotoxy(55,1);
    printf("*------------------------------计算机配件信息添加-----------------------------*");
    money();
    int kucun;
    int kuc[16],kn;
    FILE *fk;
    if((fk=fopen("计算机配件库存数量信息.txt","r"))==NULL)
    {
       printf("\t\t文件出错,按任意键退出!");
       getch();
       exit(1);
     }
     for(kn=0;kn<16;kn++)
     {
         fscanf(fk,"%8d",&kuc[kn]);
     }
     fclose(fk);
    struct buygoods *h,*t;
    char a;
    int l1,l2,l3,l4;
    printf("\n\n");
    gotoxy(0,4);
    printf("\t\t_____________________________________\n");
    gotoxy(0,5);
    printf("\t\t|                                    |\n");
    gotoxy(0,6);
    printf("\t\t|        *输入1添加进货记录          |\n");
    gotoxy(0,7);
    printf("\t\t|        *输入2添加批发销售          |\n");
    gotoxy(0,8);
    printf("\t\t|        *输入3添加零售销售          |\n");
    gotoxy(0,9);
    printf("\t\t|______________按0返回_______________|\n");
    gotoxy(200,4);
    printf("\n\t\t |--------------------------------------当前库存--------------------------------------------------------------------------|\n");
    gotoxy(200,5);
    printf("\n\t\t |         A.A型   %8d个           A.A型   %8d个            A.A型   %8d个              A.A型   %8d个  |\n",kuc[0],kuc[4],kuc[8],kuc[12]);
    gotoxy(200,6);
    printf("\n\t\t | 1.键盘  B.B型   %8d个   2.鼠标  B.B型   %8d个    3.显卡  B.B型   %8d个   4.移动硬盘 B.B型   %8d个  |\n",kuc[1],kuc[5],kuc[9],kuc[13]);
    gotoxy(200,7);
    printf("\n\t\t |         C.C型   %8d个           C.C型   %8d个            C.C型   %8d个              C.C型   %8d个  |\n",kuc[2],kuc[6],kuc[10],kuc[14]);
    gotoxy(200,8);
    printf("\n\t\t |         D.D型   %8d个           D.D型   %8d个            D.D型   %8d个              D.D型   %8d个  |\n",kuc[3],kuc[7],kuc[11],kuc[15]);
    gotoxy(200,9);
    printf("\n\t\t |-----------------------------------------------------------------------------------------------------------------------|\n");
    gotoxy(200,10);
    printf("\n\t\t|--------您所需要添加的信息------|");
    gotoxy(200,11);
    printf("\n\t\t| (输入)时间:月 日 时 分        |");
    gotoxy(200,12);
    printf("\n\t\t|       (选择)配件种类         |");
    gotoxy(200,13);
    printf("\n\t\t|       (选择)配件型号         |");
    gotoxy(200,14);
    printf("\n\t\t|       (选择)配件数量         |");
    gotoxy(200,15);
    printf("\n\t\t|  (输入)供货商/客户信息       |");
    gotoxy(200,16);
    printf("\n\t\t|--------------------------------|\n");
    while(a!='1'&&a!='2'&&a!='3'&&a!='0')
    {
        a=getch();
    }
    if(a=='0')
    {
        return;
    }
    if(a=='1')
    {
        h=readfileone();
        printf("\n添加进货记录:");
    }
    else if(a=='2')
    {
        h=readfiletwo();
        printf("\n添加批发记录:");
    }
    else if(a=='3')
    {
        h=readfilethree();
        printf("\n添加零售记录:\n");
    }
    printf("\n\t\t_____________________________________________________\n");
    printf("\t\t|________________添加配件信息_______________________|\n");
    printf("\t\t|___________________________________________________|\n");
    printf("\n\t*注意事项:若您不知道所让输入的信息,直接按回车键跳过(月、日输入0会默认为未知时间)!\n");
    t=(struct buygoods*)malloc(sizeof(struct buygoods));
    Time(t->in.month,t->in.day,t->in.hour,t->in.minute);
    surplus(t->name,t->type,t->creat,t->unitprice,t->amount,t->totalprice);
    float i=atof(t->totalprice);
    if(i-10000000>0)
    {
        printf("\n\t\t超过最高额度,无法录入,按任意键直接返回!");
        getch();
        return;
    }
    printf("\n");
    int lengthc,n,n1;
    int flag=0;
    if(a=='1')
    {
        printf("\n\t\t*请输入供货商:");  gets(t->supplier); jd1(t->supplier);
        lengthc=strlen(t->supplier); n1=lengthc;
        while(flag==0)
      {
         flag=1;
         for(n=0;n<lengthc;n++)
         {
            if(t->supplier[n]==' ')
             {
                n1--;
                flag=0;
                break;
             }
         }
         if(n1!=lengthc)
         {
              printf("\n\t\t*输入不合理,请重新输入(不能包含空格)");
              printf("\n\n\t\t*请输入供货商:");  gets(t->supplier);jd1(t->supplier);
              lengthc=strlen(t->supplier);n1=lengthc;
         }
       }
        if(strcmp(t->name,"键盘")==0&&strcmp(t->type,"A型")==0) kuc[0]+=atoi(t->amount);
        else if(strcmp(t->name,"键盘")==0&&strcmp(t->type,"B型")==0) kuc[1]+=atoi(t->amount);
        else if(strcmp(t->name,"键盘")==0&&strcmp(t->type,"C型")==0) kuc[2]+=atoi(t->amount);
        else if(strcmp(t->name,"键盘")==0&&strcmp(t-&
  • 19
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的用 C 语言双向链表实现图书管理系统的示例代码。该系统可以添加、删除和查找图书,每个图书包括书名、作者、ISBN 号、出版社和数量等信息。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义图书结构体 typedef struct Book { char title[50]; char author[50]; char ISBN[20]; char publisher[50]; int quantity; struct Book *prev; struct Book *next; } Book; // 定义全局变量 Book *head = NULL; Book *tail = NULL; // 函数声明 void addBook(); void deleteBook(); void searchBook(); void display(); int main() { int choice; // 显示菜单 printf("图书管理系统\n"); printf("1. 添加图书\n"); printf("2. 删除图书\n"); printf("3. 查找图书\n"); printf("4. 显示所有图书\n"); printf("0. 退出\n"); // 处理用户输入 while (1) { printf("\n请输入选项:"); scanf("%d", &choice); switch (choice) { case 1: addBook(); break; case 2: deleteBook(); break; case 3: searchBook(); break; case 4: display(); break; case 0: exit(0); default: printf("非法输入,请重新输入\n"); } } } // 添加图书 void addBook() { Book *p = (Book*) malloc(sizeof(Book)); printf("\n请输入书名:"); scanf("%s", p->title); printf("请输入作者:"); scanf("%s", p->author); printf("请输入ISBN号:"); scanf("%s", p->ISBN); printf("请输入出版社:"); scanf("%s", p->publisher); printf("请输入数量:"); scanf("%d", &p->quantity); // 添加节点到链表末尾 if (head == NULL) { head = p; tail = p; } else { tail->next = p; p->prev = tail; tail = p; } printf("添加成功!\n"); } // 删除图书 void deleteBook() { char ISBN[20]; Book *p = head; printf("\n请输入要删除的图书的ISBN号:"); scanf("%s", ISBN); // 查找节点并删除 while (p != NULL) { if (strcmp(p->ISBN, ISBN) == 0) { if (p == head) { head = p->next; if (head != NULL) { head->prev = NULL; } } else if (p == tail) { tail = p->prev; tail->next = NULL; } else { p->prev->next = p->next; p->next->prev = p->prev; } free(p); printf("删除成功!\n"); return; } p = p->next; } printf("未找到该图书!\n"); } // 查找图书 void searchBook() { char ISBN[20]; Book *p = head; printf("\n请输入要查找的图书的ISBN号:"); scanf("%s", ISBN); // 查找节点并显示信息 while (p != NULL) { if (strcmp(p->ISBN, ISBN) == 0) { printf("\n书名:%s\n", p->title); printf("作者:%s\n", p->author); printf("ISBN号:%s\n", p->ISBN); printf("出版社:%s\n", p->publisher); printf("数量:%d\n", p->quantity); return; } p = p->next; } printf("未找到该图书!\n"); } // 显示所有图书 void display() { Book *p = head; printf("\n所有图书信息如下:\n"); while (p != NULL) { printf("\n书名:%s\n", p->title); printf("作者:%s\n", p->author); printf("ISBN号:%s\n", p->ISBN); printf("出版社:%s\n", p->publisher); printf("数量:%d\n", p->quantity); p = p->next; } } ``` 需要注意的是,在实际应用中,还需要考虑一些其他的因素,例如数据的持久化存储、并发访问的问题等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值