【程序设计实验报告(2)试卷管理系统】(中二版)-创新互联

创新互联专业为企业提供左贡网站建设、左贡做网站、左贡网站设计、左贡网站制作等企业网站建设、网页设计与制作、左贡企业网站模板建站服务,10余年左贡做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
#include#include#include#includetypedef struct CHOOSE
{
    int n;
    char a[10000];
    char b[10000];
    char c[10000];
    char d[10000];
    char e[10000];
    char A[10000];
    struct CHOOSE *k;
}X;
typedef struct HOOL
{
    int n;
    char a[10000];
    char A[10000];
    struct HOOL *k;
}Y;

int a=1;
void r1(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            char z;
            printf("新增题目的题号是%d\n",a);
            printf("这道题的题型是( 1 是选择 , 2 是填空 )\n");
            scanf("%c",&z);
            getchar();
            if(z=='1')
            {
                c1=(X*)malloc(sizeof(X));
                if(h1==NULL)
                h1=c1;
                else
                t1->k=c1;
                c1->k=NULL;
                c1->n=a;
                printf("题干:\n");
                gets(c1->a);
                printf("选项:\n");
                gets(c1->b);
                gets(c1->c);
                gets(c1->d);
                gets(c1->e);
                printf("答案:\n");
                gets(c1->A);
                t1=c1;
                a++;
            }
            else if(z=='2')
            {
                c2=(Y*)malloc(sizeof(Y));       
                if(h2==NULL)
                h2=c2;
                else
                t2->k=c2;
                c2->k=NULL;
                c2->n=a;
                printf("题干:\n");
                gets(c2->a);
                printf("答案:\n");
                gets(c2->A);
                t2=c2;
                a++;
            }
            else if(z!='1'&&z!='2')
            printf("错了错了,重新来过吧,勇者,试炼之路还很长呢~\n");
            printf("请输入「回车」以继续您的征程\n");
            getchar();
}
void r2(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            int q,u=0;
            printf("您要将圣剑斩向何处(请选择您要删除的题号)\n");
            scanf("%d",&q);
            getchar();
            c1=h1,c2=h2;
            if(h1==NULL)
            {
                printf("此处黑暗不复存在,但满是阴霾(题库 1 已经清空了)\n");
            }
            else
            {
                if(h1->n==q)
                {
                    h1=h1->k;
                    printf("光明已斩尽黑暗\n");
                    u++;
                }
                else
                {
                    while(c1->k!=NULL)
                    {
                        if(c1->k->n==q)
                        {
                            c1->k=c1->k->k;
                            printf("光明已斩尽黑暗\n");
                            u++;
                        }
                        else
                        c1=c1->k;
                    }
                }
            }
            if(h2==NULL)
            {
                printf("此处黑暗不复存在,但满是阴霾(题库 2 已经清空了)\n");
            }
            else
            {
                if(h2->n==q)
                {
                    h2=h2->k;
                    printf("光明已斩尽黑暗\n");
                    u++;
                }
                else
                {
                    while(c2->k!=NULL)
                    {
                        if(c2->k->n==q)
                        {
                            c2->k=c2->k->k;
                            printf("光明已斩尽黑暗\n");
                            u++;
                        }
                        else
                        c2=c2->k;
                    }
                }
            }
            if(u==0)
            printf("此处黑暗已消失殆尽(题库中没有此题,删除失败)\n");
            printf("请输入「回车」以继续您的征程\n");
            getchar();
        }
void r3(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            h1=NULL;
            h2=NULL;
            a=1;
            printf("当前世界已被刷新(题库已经清空)\n");
            printf("请输入「回车」以继续您的征程\n");
            getchar();
}
void r4(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            FILE *e1=fopen("T1 copy.txt","w+"),*e2=fopen("T2 copy.txt","w+");
            c1=h1;
            c2=h2;
            while(c1!=NULL&&c1->n!=0)
            {
                fprintf(e1,"%d\n",c1->n);
                fprintf(e1,"%s\n",c1->a);
                fprintf(e1,"%s\n",c1->b);
                fprintf(e1,"%s\n",c1->c);
                fprintf(e1,"%s\n",c1->d);
                fprintf(e1,"%s\n",c1->e);
                fprintf(e1,"%s\n",c1->A);
                c1=c1->k;
            }
            while(c2!=NULL&&c2->n!=0)
            {
                fprintf(e2,"%d\n",c2->n);
                fprintf(e2,"%s\n",c2->a);
                fprintf(e2,"%s\n",c2->A);
                c2=c2->k;
            }
            printf("刚刚在地图上标记好了你的进程(备份完毕)\n");
            fclose(e1);
            fclose(e2);
            printf("请输入「回车」以继续您的征程\n");
            getchar();
}
void r5(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            int i,r=0;
            printf("简要展示一下你的风之印记(请输入需要修改的题号)\n");
            scanf("%d",&i);
            getchar();
            if(h1==NULL)
            {
                printf("不好,此处所有风之印记都被巨龙摧毁了(题库 1 是空的)\n");
            }
            else
            {
                if(h1->n==i)
                {
                    printf("看来这道题是个选择题\n");
                    printf("修改题干吧\n");
                    gets(h1->a);
                    printf("修改选项吧\n");
                    gets(h1->b);
                    gets(h1->c);
                    gets(h1->d);
                    gets(h1->e);
                    printf("修改答案吧\n");
                    gets(h1->A);
                    printf("风之印记已经更改了\n");
                    r++;
                }
                else
                {
                    while(c1!=NULL)
                    {
                        if(c1->n==i)
                        {
                            printf("看来这道题是个选择题\n");
                            printf("修改题干吧\n");
                            gets(c1->a);
                            printf("修改选项吧\n");
                            gets(c1->b);
                            gets(c1->c);
                            gets(c1->d);
                            gets(c1->e);
                            printf("修改答案吧\n");
                            gets(c1->A);
                            printf("风之印记已经更改了\n");
                            r++;
                            break;
                        }
                        else
                        c1=c1->k;
                    }
                }
            }
            if(h2==NULL)
            {
                printf("不好,此处所有风之印记都被巨龙摧毁了(题库 2 是空的)\n");
            }
            else
            {
                if(h2->n==i)
                {
                    printf("看来这道题是个填空题\n");
                    printf("修改题干吧\n");
                    gets(h2->a);
                    printf("修改答案吧\n");
                    gets(h2->A);
                    printf("风之印记已经更改了\n");
                    r++;
                }
                else
                {
                    while(c2!=NULL)
                    {
                        if(c2->n==i)
                        {
                            printf("看来这道题是个填空题\n");
                            printf("修改题干吧\n");
                            gets(c2->a);
                            printf("修改答案吧\n");
                            gets(c2->A);
                            printf("风之印记已经更改了\n");
                            r++;
                            break;
                        }
                        else
                        c2=c2->k;
                    }
                }
            }
        if(r==0)
        printf("你并没有在这个地方标记风之印记\n");
        printf("请输入「回车」以继续您的征程\n");
        getchar();
        }
void r6(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            int i,r=0;
            printf("请选择你想看的魔法在《魔法禁书目录》的代码(请输入需要查看的题目的题号)\n");
            scanf("%d",&i);
            getchar();
            if(h1==NULL)
            {
                printf("不好,《魔法禁书目录(上)》全破损了(题库 1 是空的)\n");
            }
            else
            {
                if(h1->n==i)
                {
                    printf("题目是\n");
                    puts(h1->a);
                    printf("选项是\n");
                    puts(h1->b);
                    puts(h1->c);
                    puts(h1->d);
                    puts(h1->e);
                    printf("答案是\n");
                    puts(h1->A);
                    printf("已经找到了,希望你好好学习,成为不讲武德的黏氰人\n");
                    r++;
                }
                else
                {
                    while(c1!=NULL)
                    {
                        if(c1->n==i)
                        {
                            printf("题目是\n");
                            puts(c1->a);
                            printf("选项是\n");
                            puts(c1->b);
                            puts(c1->c);
                            puts(c1->d);
                            puts(c1->e);
                            printf("答案是\n");
                            puts(c1->A);
                            printf("已经找到了,希望你好好学习,成为不讲武德的黏氰人\n");
                            r++;
                            break;
                        }
                        else
                        c1=c1->k;
                    }
                }
            }
            if(h2==NULL)
            {
                printf("不好,《魔法禁书目录(下)》全破损了(题库 2 是空的)\n");
            }
            else
            {
                if(h2->n==i)
                {
                    printf("看来这道题是个填空题\n");
                    printf("题目是\n");
                    puts(h2->a);
                    printf("答案是\n");
                    puts(h2->A);
                    printf("已经找到了,希望你好好学习,成为不讲武德的黏氰人\n");
                    r++;
                }
                else
                {
                    while(c2!=NULL)
                    {
                        if(c2->n==i)
                        {
                            printf("看来这道题是个填空题\n");
                            printf("题目是\n");
                            puts(c2->a);
                            printf("答案是\n");
                            puts(c2->A);
                            printf("已经找到了,希望你好好学习,成为不讲武德的黏氰人\n");
                            r++;
                            break;
                        }
                        else
                        c2=c2->k;
                    }
                }
            }
        if(r==0)
        printf("年轻人,你是不是记错了呀,希望你耗子尾汁\n");
        printf("请输入「回车」以继续您的征程\n");
        getchar();
        }
void r7(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            printf("让DIO统计一下你一共吃了多少块史莱姆小面包吧(统计题库中所有试题的数量)\n");
            int r=0;
            c1=h1,c2=h2; 
            while(c1!=NULL)
            {
                c1=c1->k;
                r++;
            }
            while(c2!=NULL)
            {
                c2=c2->k;
                r++;
            }
            printf("嗯,一共是 %d 哒!\n",r);
            printf("请输入「回车」以继续您的征程\n");
            getchar();
        }
void r8(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            printf("请描述一下那位神秘人的特征(输入部分信息以搜题)\n");
            char s[100];
            gets(s);
            int r=0;
            c1=h1,c2=h2;
            while(c1!=NULL)
            {
                if(strstr(c1->a,s)!=NULL&&c1->n!=0)
                {
                    puts("||||||||这是一位嫌疑人:||||||||");
                    puts("题号是");
                    printf("%d\n",c1->n);
                    puts("题干是");
                    puts(c1->a);
                    puts("选项是");
                    puts(c1->b);
                    puts(c1->c);
                    puts(c1->d);
                    puts(c1->e);
                    puts("答案是");
                    puts(c1->A);
                    r++;
                    c1=c1->k;
                }
                else
                {
                    c1=c1->k;
                }     
            }
            while(c2!=NULL)
            {
                if(strstr(c2->a,s)!=NULL&&c2->n!=0)
                {
                    puts("||||||||这是一位嫌疑人:||||||||");
                    puts("题号是");
                    printf("%d\n",c2->n);
                    puts("题干是");
                    puts(c2->a);
                    puts("答案是");
                    puts(c2->A);
                    r++;
                    c2=c2->k;
                }
                else
                {
                    c2=c2->k;
                }     
            }
            if(r==0)
            printf("俺们村可没有这一号人(未找到符合条件的题目)\n");
            else
            printf("就这些了,我可没有故意隐瞒啊,勇者大人\n");
            printf("请输入「回车」以继续您的征程\n");
            getchar();
        }
void r9(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            int h[100],w=0,k=0,l=0;
            FILE *v=fopen("TEST.txt","w+");
            FILE *g=fopen("ANSWER.txt","w+");
            int e,r;
            c1=h1,c2=h2;
            while(c1!=NULL)
            {
                c1=c1->k;
                k++;
            }
            while(c2!=NULL)
            {
                c2=c2->k;
                l++;
            }
            printf("你终于想要进行最终考验了,勇者!\n");
            printf("输入你要生成的选择题的数量\n");
            scanf("%d",&e);
            getchar();
            printf("输入你要生成的填空题的数量\n");
            scanf("%d",&r);
            getchar();
            if(e>k||r>l)
            {
                if(e>k)
                printf("要求生成的选择题数量超过了题库保存的总额\n");
                if(r>l)
                printf("要求生成的填空题数量超过了题库保存的总额\n");
            }
            else
            {
                printf("要开始了呦\n");
                for(int d=0;dn==w)
                    {
                        fprintf(v,"%d\n",h1->n);
                        fprintf(v,"%s\n",h1->a);
                        fprintf(v,"%s\n",h1->b);
                        fprintf(v,"%s\n",h1->c);
                        fprintf(v,"%s\n",h1->d);
                        fprintf(v,"%s\n",h1->e);
                        fprintf(v,"\n");
                        fprintf(g,"%d\n",h1->n);
                        fprintf(g,"%s\n",h1->A);
                        fprintf(g,"\n");
                        printf("2\n");
                        r++;    
                    }    
                    else
                    {
                        while(c1!=NULL)
                        {
                            if(c1->n==w)
                            {
                                fprintf(v,"%d\n",c1->n);
                                fprintf(v,"%s\n",c1->a);
                                fprintf(v,"%s\n",c1->b);
                                fprintf(v,"%s\n",c1->c);
                                fprintf(v,"%s\n",c1->d);
                                fprintf(v,"%s\n",c1->e);
                                fprintf(v,"\n");
                                fprintf(g,"%d\n",c1->n);
                                fprintf(g,"%s\n",c1->A);
                                fprintf(g,"\n");
                                printf("3\n");
                                r++;
                                break;
                            }
                            else
                            c1=c1->k;
                        }        
                    }               
                    if(r==0)
                    {
                        d--;
                        printf("4\n");
                        continue;
                    }
                }
                printf("又开始了呦\n");
                for(int c=e;cn==w)
                    {
                        fprintf(v,"%d\n",h2->n);
                        fprintf(v,"%s\n",h2->a);
                        fprintf(v,"\n");
                        fprintf(g,"%d\n",h2->n);
                        fprintf(g,"%s\n",h2->A);
                        fprintf(g,"\n");
                        r++;    
                        printf("22\n");
                    }    
                    else
                    {
                        while(c2!=NULL)
                        {
                            if(c2->n==w)
                            {
                                fprintf(v,"%d\n",c2->n);
                                fprintf(v,"%s\n",c2->a);
                                fprintf(v,"\n");
                                fprintf(g,"%d\n",c2->n);
                                fprintf(g,"%s\n",c2->A);
                                fprintf(g,"\n");
                                r++;
                                printf("33\n");
                                break;
                            }
                            else
                            c2=c2->k;
                        }        
                    }               
                    if(r==0)
                    {
                        c--;
                        printf("44\n");
                        continue;
                    }
                }
                printf("结束了。。。。\n");
            }
            fclose(v);
            fclose(g);
            printf("请输入「回车」以继续您的征程\n");
            getchar();
        }
void r0(X *h1,X *t1,X *c1,Y *h2,Y *t2,Y *c2)
{
            FILE *o1=fopen("T1.txt","w+"),*o2=fopen("T2.txt","w+");
            c1=h1;
            c2=h2;
            while(c1!=NULL&&c1->n!=0)
            {
                fprintf(o1,"%d\n",c1->n);
                fprintf(o1,"%s\n",c1->a);
                fprintf(o1,"%s\n",c1->b);
                fprintf(o1,"%s\n",c1->c);
                fprintf(o1,"%s\n",c1->d);
                fprintf(o1,"%s\n",c1->e);
                fprintf(o1,"%s\n",c1->A);
                c1=c1->k;
            }
            while(c2!=NULL&&c2->n!=0)
            {
                fprintf(o2,"%d\n",c2->n);
                fprintf(o2,"%s\n",c2->a);
                fprintf(o2,"%s\n",c2->A);
                c2=c2->k;
            }
            fclose(o1);
            fclose(o2);
            printf("那就好好休息吧,勇者也要好好睡一觉呢(程序结束)\n");
}
int main()
{
    srand((unsigned)time(NULL));//播种,使得rand()函数在程序运行的每个时刻生成的随机数都是不同的
    FILE *p1=fopen("T1.txt","r+"),*p2=fopen("T2.txt","r+");
    X *h1,*t1,*c1;
    Y *h2,*t2,*c2;
    h1=NULL,h2=NULL;
    t1=(X*)malloc(sizeof(X)),t2=(Y*)malloc(sizeof(Y));

    int x,y;

    int c,d;
    c=feof(p1),d=feof(p2);
    while(fscanf(p1,"%d\n",&a)!=EOF)
    {
        c1=(X*)malloc(sizeof(X));
        if(h1==NULL)
        h1=c1;
        else
        t1->k=c1;

        c1->k=NULL;

        fscanf(p1,"%s\n",c1->a);
        fscanf(p1,"%s\n",c1->b);
        fscanf(p1,"%s\n",c1->c);
        fscanf(p1,"%s\n",c1->d);
        fscanf(p1,"%s\n",c1->e);
        fscanf(p1,"%s\n",c1->A);
        c1->n=a;
        t1=c1;
        a++;
    }
    while(fscanf(p2,"%d\n",&a)!=EOF)
    {
        c2=(Y*)malloc(sizeof(Y));
        if(h2==NULL)
        h2=c2;
        else
        t2->k=c2;

        c2->k=NULL;

        fscanf(p2,"%s\n",c2->a);
        fscanf(p2,"%s\n",c2->A);
        c2->n=a;
        t2=c2;
        a++;
    }
    fclose(p1);
    fclose(p2);
    while(1)
    {
        printf("来吧,年轻的小小勇者,每个人都需要在某个时候打破自己的局限,不是吗\n");
        printf("/\n");
        printf("输入 1 添加题目\n");
        printf("输入 2 删除指定题目\n");
        printf("输入 3 删除所有题目\n");
        printf("输入 4 备份所有题目\n");
        printf("输入 5 修改指定题目\n");
        printf("输入 6 查询指定题目\n");
        printf("输入 7 统计题目总数\n");
        printf("输入 8 模糊查找题目\n");
        printf("输入 9 生成一套自定义各种类型题目数量的试卷\n");
        printf("输入 0 终止此次冒险\n");
        printf("/\n");
        printf("What's your choice?\n");
        scanf("%d",&x);
        getchar ();
        if(x==1)
            r1(h1,t1,c1,h2,t2,c2);
        else if(x==2)
            r2(h1,t1,c1,h2,t2,c2);
        else if(x==3)
            r3(h1,t1,c1,h2,t2,c2);
        else if(x==4)
            r4(h1,t1,c1,h2,t2,c2);
        else if(x==5)
            r5(h1,t1,c1,h2,t2,c2);
        else if(x==6)
            r6(h1,t1,c1,h2,t2,c2);
        else if(x==7)
            r7(h1,t1,c1,h2,t2,c2);
        else if(x==8)
            r8(h1,t1,c1,h2,t2,c2);
        else if(x==9)
            r9(h1,t1,c1,h2,t2,c2);
        else if(x==0)
            {
                r0(h1,t1,c1,h2,t2,c2);
                break;
            }
        else 
        {
            printf("错了错了,重新来过吧,勇者,试炼之路还很长呢~\n");
            printf("请输入「回车」以继续您的征程\n");
            getchar();
        }
    }
    return 0;
}

(用适当的形式表达算法设计思想与算法实现步骤)

步骤及思路:

前期

为了模拟真实出题情况,系统自带题库(当然,也选择清空题库,即一开始就让题库是空的)

题库有两个,一个是选择题题库,另一个是填空题题库

创建两种链表分别对应两种题型

开始

打开两个题库文件,创建链表头指针

申请动态内存

将题库中原有的题读入链表中(此过程需要间接结构体指针)

将最后一个结点的指向下一个结点的指针为空

设置一个循环,对于想要执行的操作输入相对应的字符, 进行判断,执行完操作之后返回菜单,直到输入结束的指令

按照依次增大的方式生成升序题号

“添加题目”选项

先判断头指针是否为空(两个链表分别判断)

选则需要添加的题型,判断写入那个指针

将添加的题型写入指针储存起来

“删除题目”选项

令中介指针等于头指针,依次寻找下一个结点,判断题号是否等于需要删除的题号,如果是,则令结点指针跳过这个结点,指向下一个结点(这样链表中就删除了这个结点);如果在两个题库中遍历之后没有找到,则回复 没有这道题 ;如果有一个题库是空的,就回复 选择题(或填空题)题库是空的

“删除题库”选项

令头指针为空,实现丢弃链表,题库就被清空了

“备份题库”选项

定义两个文件指针,新开两个备份题库的文件,分别备份选择题和填空题,把两个链表内容分别写入对应的文件中

“根据题号查找题目”选项

令中介指针等于头指针,遍历链表,查找是否有题号等于需要查找的题号,如果有,则将链表对应的内容打印出来;若没有,则反馈查无此题;若题库为空,则反馈题库为空

“模糊查找以实现搜题”选项

使用字符串函数strstr()进行模糊查找,令中介指针等于头指针,遍历链表,若有相同内容则返回非空,则将内容打印出来;若没有找到相应内容,则反馈查无此题;若题库为空则反馈题库为空

“统计题目数量”选项

遍历两个链表,若链表指针不为空,则被统计为一个题,依次增加,达到计数的目的

“生成试卷”

输入需要生成的选择题数目和填空题数目,统计选择题以及填空题的总题目数量,如果少于要生成的题目,则进行反馈 选择/填空题库题数不足;结合随机数函数随机生成题号,并进行查重,如果某道题已经出过则不再生成

“程序终止”

这一步操作较为关键,在实行操作终止时,以写入的方式,会先将链表写入题库,实现题库的更新

(详细记录在调试过程中出现的问题及解决方法。记录实验执行的结果)

如何做到生成题号且不重复

定义一个全局变量a,并令a为1,每次添加一个完题目,就令a增加1,这样实现生成的题目的题号都是升序的且不重复的

在读取题库中原有的题目的时候,令a等于读取到的题目的序号,并在读取完一个题之后令a加一,这样就实现了保证每次新增题目题号都是顺序且为大的题号

判断是否出错(安全性常规检查)

检查的内容主要有:

1.是否在选择执行哪种操作时输入了规定选项以外的内容,此时应报错,并跳过此次循环

2.在查询、修改、删除以及生成试卷操作时,要判断是否有此题以及题库是否为空,解决方法就是遍历链表,如果链表头指针是空,则为题库空,如果链表无需要查找的题目,则为无此题

(对实验结果进行分析,问题回答,实验心得体会及改进意见)

实验结果分析:

能满足实验所有要求

回答问题:

问题一:

怎么实现的删除指定题目,并且进行安全性检查

令中介指针等于头指针,依次寻找下一个结点,判断题号是否等于需要删除的题号,如果是,则令结点指针跳过这个结点,指向下一个结点(这样链表中就删除了这个结点);如果在两个题库中遍历之后没有找到,则回复 没有这道题 ;如果有一个题库是空的,就回复 选择题(或填空题)题库是空的

问题二:

如何做到生成题号且不重复

定义一个全局变量a,并令a为1,每次添加一个完题目,就令a增加1,这样实现生成的题目的题号都是升序的且不重复的

在读取题库中原有的题目的时候,令a等于读取到的题目的序号,并在读取完一个题之后令a加一,这样就实现了保证每次新增题目题号都是顺序且为大的题号

心得总结:

这个实验我写了三遍,每一遍都有不同的感悟,在写第一遍的时候,对于指针安排比较混乱,并且内存分配逻辑不清晰,以至于程序写完之后反复出现bug,但是很难找到错误的地方;第二遍的时候优化了内存分配,使得程序可读性增强,容易找到指针位置,但是有缺点就是都写在了main函数里面,导致运行效率低且main函数内部冗杂;第三遍将各个操作都写在了自定义函数里面,并且这样写有利于后期优化修改。

通过写这次实验,我更好地理解了动态内存分配,并对链表有了更深刻的认识,提高了我的逻辑性。通过修改子函数,提高了我对传参的理解。另外还学习到了模糊查找字符串内容的函数strstr()。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站标题:【程序设计实验报告(2)试卷管理系统】(中二版)-创新互联
分享网址:http://myzitong.com/article/dspjjc.html