| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1624 人关注过本帖
标题:自己写的学生成绩管理,但是运行添加成员时会停止,求大神指点错误
取消只看楼主 加入收藏
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:6 
自己写的学生成绩管理,但是运行添加成员时会停止,求大神指点错误
小白依旧是小白,暑假的时候自学c后一点一点编写的,但是选择添加后,输入完全部成绩,按回车就会停止运行,自己检查了好久看不出来,求大神可以指点一下错误在哪里。拜托了!!!!!
程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
#define LINE -------------------------------------------
#define PUT "|学号|姓名|性别|班级|语文|数学|英语|生物|物理|化学|总分|平均分|\n"
#define PUT1 "|%d  |%s    |%c |%d|%.1f |%.1f |%.1f |%.1f |%.1f |%.1f |%.1f |%.1f |\n"
#define PUT2 p->grade.num, p->grade.name, p->grade.sex, p->grade.class1, p->grade.ywg, p->grade.sxg, p->grade.yyg, p->grade.swg, p->grade.wlg, p->grade.hxg, p->grade.total, p->grade.ave
FILE *fp;
int i;
int saveflag=0;
struct student
{
    int num;
    char name[30];
    char sex;
    int class1;
    float ywg;
    float sxg;
    float yyg;
    float swg;
    float wlg;
    float hxg;
    float total;
    float ave;
};
typedef struct node
{
    struct student grade;
    struct node *next;
}LINK;
LINK *exam;
void Save(LINK *L)
{
    LINK *p;
    p=L->next;
    fp=fopen("grades.txt","w+");
    if(fp==NULL)
    {
        printf("打开失败!\n");
        return;
    }
    while(p!=NULL)
    {
    fwrite(p,sizeof(LINK),1,fp);
    p=p->next;
    }
fclose(fp);
}
void menu()
{
    printf("---------------学生成绩管理系统---------------\n");
    printf("\t0.退出       1.显示记录\n\t2.添加记录   3.删除记录\n\t4.查询记录   5.修改记录\n\t6.统计成绩   7.插入记录\n\t8.排序并输出 9.保存\n");
    printf("----------------------------------------------\n");
}
void Read(LINK *L)
{
    LINK *p;
    p=L->next;
    if(p=NULL)
    {
    printf("不存在!");
    return;
    }
    printf(PUT);
    while(p!=NULL)
    {
        printf(PUT1,PUT2);
    }
}
void Add(LINK *L)
{
    LINK *r,*p,*q;
    char ch;
    r=(LINK*)malloc(sizeof(LINK));
    if(r==NULL)
    {
        printf("分配失败!\n");
        exit(1);
    }
    printf("是否添加记录(y/s)?\n");
    scanf("%s",&ch);
    if(ch=='y')
    {
            printf("请输入数据:\n");
            printf("学号:");scanf("%d",&r->grade.num);
            for(p=L->next;p!=NULL;p=p->next)
            if(p->grade.num==r->grade.num)
            {printf("此学生已经存在!");return;}
            printf("姓名:");scanf("%s",&r->grade.name);
            printf("性别:");scanf("%s",&r->grade.sex);
            printf("班级:");scanf("%d",&r->grade.class1);
            printf("语文成绩:");
            scanf("%f",&r->grade.ywg);
            printf("数学成绩:");
            scanf("%f",&r->grade.sxg);
            printf("英语成绩:");
            scanf("%f",&r->grade.yyg);
            printf("生物成绩:");
            scanf("%f",&r->grade.swg);
            printf("物理成绩:");
            scanf("%f",&r->grade.wlg);
            printf("化学成绩:");
            scanf("%f",&r->grade.hxg);
            r->grade.total=r->grade.ywg+r->grade.sxg+r->grade.yyg+r->grade.swg+r->grade.wlg+r->grade.hxg+r->grade.swg;
            r->grade.ave=r->grade.total/6;
            if(L->next==NULL)
            {
            L->next=r;
            q=r;
            q->next=NULL;
            }
            else
            {
            q=L->next;
            while(q->next!=NULL)
            {
                q=q->next;
            }
            q->next=r;
            q=r;
            q->next=NULL;
            }
    }
    Save(L);
}
void Del(LINK *L)
{
    int ch;
    LINK *p,*q,*r;
    printf("请输入删除的学号:\n");
    scanf("%d",&ch);
    for(p=L;p!=NULL;p=p->next)
    {
        q=p;
        p=p->next;
        r=p->next;
        if(p->grade.num==ch)
        {
        q->next=r;
        free(p);
        break;
        }
        else
        p=q;
    }
    if(p==NULL)
    printf("此记录不存在!\n");
    Save(L);
}
void Query(LINK *L)
{
    LINK *p;
    int ch;
    printf("请问是按学号(按1)还是姓名(按2)查询?\n");
    scanf("%d",&ch);

    if(ch==1)
    {
        printf("请输入学号:\n");
        scanf("%d",&exam->grade.num);
        for(p=L->next;p!=NULL;p=p->next)
        if(p->grade.num==exam->grade.num)
        {
            printf(PUT);
            printf(PUT1,PUT2);
            break;
        }
        if(p==NULL)
        printf("此学号不存在!\n");
    }
    if(ch==2)
    {
        printf("请输入姓名:");
        scanf("%s",&exam->grade.name);
        for(p=L->next;p!=NULL;p=p->next)
        if(!strcmp(p->grade.name,exam->grade.name))
        {
            printf(PUT);
            printf(PUT1,PUT2);
            break;
        }
        if(p==NULL)
        printf("此姓名不存在!\n");
    }
}
void Modify(LINK *L)
{
    LINK *p;
    printf("请输入要修改的学号:");
    scanf("%d",&exam->grade.num);
    for(p=L->next;p!=NULL;p=p->next)
    {
    if(p->grade.num==exam->grade.num)
    {
        printf("请输入修改后的成绩:\n");
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("班级:");scanf("%d",&p->grade.class1);
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("数学成绩:");scanf("%f",&p->grade.sxg);
        printf("英语成绩:");scanf("%f",&p->grade.yyg);
        printf("生物成绩:");scanf("%f",&p->grade.swg);
        printf("物理成绩:");scanf("%f",&p->grade.wlg);
        printf("化学成绩:");scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        break;
    }
}
Save(L);
}
void Tongji(LINK *L)
{
    LINK *p,*r;
    r=L->next;
    while(r!=NULL)
    {
        if(r->grade.total > r->next->grade.total)
        {
            p=r;
        }
        else
        {
            p=r->next;
        }

         r=r->next;
    }
    printf("总分最高是:\n");
    printf(PUT);
    printf(PUT1,PUT2);
}
void Insert(LINK *L)
{
    LINK *p,*r;
    p=(LINK*)malloc(sizeof(LINK));
    printf("请输入插入的学号:");
    scanf("%d",&p->grade.num);
    r=L->next;
    if(r==NULL)
    {
        r=p;
        p->next=NULL;
    }
    else
    {
    if(p->grade.num < r->grade.num)
    {
    p->next=r;
    L->next=p;
    }
    else
    {
    for(;r->next!=NULL;r=r->next)
    {
        if(r->grade.num==p->grade.num)
        {
            printf("这个学号已经存在!\n");
            return;
        }
        else if((r->grade.num < p->grade.num)&&(p->grade.num < r->next->grade.num))
        {
        p->next=r->next;
        r->next=p;
        }
    }
    if(r->next==NULL)
    {
    r->next=p;p->next=NULL;
    }
    }
    }
        printf("姓名:");
        scanf("%s",p->grade.name);
        printf("性别:");
        scanf("%s",&p->grade.sex);
        printf("班级:");
        scanf("%d",&p->grade.class1);
        printf("语文成绩:");
        scanf("%f",&p->grade.ywg);
        printf("数学成绩:");
        scanf("%f",&p->grade.sxg);
        printf("英语成绩:");
        scanf("%f",&p->grade.yyg);
        printf("生物成绩:");
        scanf("%f",&p->grade.swg);
        printf("物理成绩:");
        scanf("%f",&p->grade.wlg);
        printf("化学成绩:");
        scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        Save(L);
}
void Sort(LINK *L)
{
    LINK *p,*q,*r;
    if(L->next==NULL)
    printf("无记录!\n");
    else
    {
    p=L->next;
    r=p;
    q->next=r;
    r->next=NULL;
    for(p=p->next;p!=NULL;p=p->next)
    {
        if(p->grade.num < q->next->grade.num)
        {
            p->next=q->next;
            q->next=p;
        }
        r=q->next;
        while((p->grade.num > q->next->grade.num)&&(r->next!=NULL))
        {
            if(p->grade.num < r->next->grade.num)
            {
                p->next=r->next;
                r->next=p;
                break;
            }
            r=r->next;
        }
        if(r->next==NULL)
        {
        r->next=p;
        p->next=NULL;
        r=p;
        }
    }
   

    }
Save(L);
}

int main()
{
    LINK *L;
    LINK *p,*q;
    int select,m=1;
    L=(LINK*)malloc(sizeof(LINK));
    if(L==NULL)
    {
        printf("分配失败!\n");
        return 0;
    }
    L->next=NULL;
    q=L;
    fp=fopen("grades.txt","r");
    if(fp==NULL)
    {
        fp=fopen("grades.txt","w+");
        i=0;
    }
    else
    {
        while(!feof(fp))
        {
            p=(LINK*)malloc(sizeof(LINK));
            if(p==NULL)
            {
                printf("分配失败!\n");
                return 0;
            }
            if(fread(p,sizeof(LINK),1,fp)==1)
            {
                p->next=NULL;
                q->next=p;
                q=p;
                i++;
            }
        }
    }
    fclose(fp);
    printf("\n打开成功,一共有%d条记录。\n",i);
    while(m)
    {
        menu();
        printf("请选择选项:(0~9):\n");
        scanf("%d",&select);
        switch(select)
        {
            case 0:if(saveflag==0)
            m=0;
            else if(saveflag==1)
            Save(L);
            m=0;break;
            case 1:Read(L);break;
            case 2:Add(L);break;
            case 3:Del(L);break;
            case 4:Query(L);break;
            case 5:Modify(L);break;
            case 6:Tongji(L);break;
            case 7:Insert(L);break;
            case 8:Sort(L);break;
            case 9:Save(L);saveflag=0;break;
            default:printf("请输入0~9的选项:\n");break;
         }

    }
    system("pause");
    return 0;
}


2017-02-25 14:32
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 2楼 yslief
这个问题解决了,运行后显示有多少条记录,可是查询的哪一项又出问题了,输入学号后就停止了,不知道是为什么,我又看了一遍,没看出来。。。。。
2017-02-25 21:21
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
程序代码:
其实我都已经改过来了,现在的代码是这样的,只是没贴出来。能力还是不够,别人不说就是找不到哪里出错了,下面是现在的代码


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
#define LINE -------------------------------------------
#define PUT "|学号|姓名|性别|班级|语文|数学|英语|生物|物理|化学|总分|平均分|\n"
#define PUT1 "|%d  |%s    |%c |%d|%.1f |%.1f |%.1f |%.1f |%.1f |%.1f |%.1f |%.1f |\n"
#define PUT2 p->grade.num, p->grade.name, p->grade.sex, p->grade.class1, p->grade.ywg, p->grade.sxg, p->grade.yyg, p->grade.swg, p->grade.wlg, p->grade.hxg, p->grade.total, p->grade.ave
FILE *fp;
int i;
int saveflag=0;
struct student
{
    int num;
    char name[30];
    char sex;
    int class1;
    float ywg;
    float sxg;
    float yyg;
    float swg;
    float wlg;
    float hxg;
    float total;
    float ave;
};
typedef struct node
{
    struct student grade;
    struct node *next;
}LINK;
LINK *exam;
void Save(LINK *L)
{
    LINK *p;
    p=L->next;
    fp=fopen("grades.txt","w+");
    if(fp==NULL)
    {
        printf("打开失败!\n");
        return;
    }
    while(p!=NULL)
    {
    fwrite(p,sizeof(LINK),1,fp);
    p=p->next;
    }
fclose(fp);
}
void menu()
{
    printf("---------------学生成绩管理系统---------------\n");
    printf("\t0.退出       1.显示记录\n\t2.添加记录   3.删除记录\n\t4.查询记录   5.修改记录\n\t6.统计成绩   7.插入记录\n\t8.排序并输出 9.保存\n");
    printf("----------------------------------------------\n");
}
void Read(LINK *L)
{
    LINK *p;
    p=L->next;
    if(p=NULL)
    {
    printf("不存在!");
    return;
    }
    printf(PUT);
    while(p!=NULL)
    {
        printf(PUT1,PUT2);
    }
}
void Add(LINK *L)
{
    LINK *r,*p,*q;
    char ch;
    r=(LINK*)malloc(sizeof(LINK));
    if(r==NULL)
    {
        printf("分配失败!\n");
        exit(1);
    }
    printf("是否添加记录(y/s)?\n");
    scanf("%s",&ch);
    if(ch=='y')
    {
            printf("请输入数据:\n");
            printf("学号:");scanf("%d",&r->grade.num);
            for(p=L->next;p!=NULL;p=p->next)
            if(p->grade.num==r->grade.num)
            {printf("此学生已经存在!");return;}
            printf("姓名:");scanf("%s",r->grade.name);
            printf("性别:");scanf("%s",&r->grade.sex);
            printf("班级:");scanf("%d",&r->grade.class1);
            printf("语文成绩:");
            scanf("%f",&r->grade.ywg);
            printf("数学成绩:");
            scanf("%f",&r->grade.sxg);
            printf("英语成绩:");
            scanf("%f",&r->grade.yyg);
            printf("生物成绩:");
            scanf("%f",&r->grade.swg);
            printf("物理成绩:");
            scanf("%f",&r->grade.wlg);
            printf("化学成绩:");
            scanf("%f",&r->grade.hxg);
            r->grade.total=r->grade.ywg+r->grade.sxg+r->grade.yyg+r->grade.swg+r->grade.wlg+r->grade.hxg+r->grade.swg;
            r->grade.ave=r->grade.total/6;
            if(L->next==NULL)
            {
            L->next=r;
            q=r;
            q->next=NULL;
            }
            else
            {
            q=L->next;
            while(q->next!=NULL)
            {
                q=q->next;
            }
            q->next=r;
            q=r;
            q->next=NULL;
            }
    }
}
void Del(LINK *L)
{
    int ch;
    LINK *p,*q,*r;
    printf("请输入删除的学号:\n");
    scanf("%d",&ch);
    for(p=L;p!=NULL;p=p->next)
    {
        q=p;
        p=p->next;
        r=p->next;
        if(p->grade.num==ch)
        {
        q->next=r;
        free(p);
        break;
        }
        else
        p=q;
    }
    if(p==NULL)
    printf("此记录不存在!\n");
}
void Query(LINK *L)
{
    LINK *p,*exam;
    int ch;
    printf("请问是按学号(按1)还是姓名(按2)查询?\n");
    scanf("%d",&ch);

    if(ch==1)
    {
        printf("请输入学号:\n");
        scanf("%d",&exam->grade.num);
        for(p=L->next;p!=NULL;p=p->next)
        {
        if(p->grade.num==exam->grade.num)
        {
            printf(PUT);
            printf(PUT1,PUT2);
            break;
        }
        else
        if(p==NULL)
        printf("此学号不存在!\n");
        }
    }
    if(ch==2)
    {
        printf("请输入姓名:");
        scanf("%s",exam->grade.name);
        for(p=L->next;p!=NULL;p=p->next)
        {
        if(!strcmp(p->grade.name,exam->grade.name))
        {
            printf(PUT);
            printf(PUT1,PUT2);
            break;
        }
        else if(p==NULL)
        printf("此姓名不存在!\n");
        }
    }
}
void Modify(LINK *L)
{
    LINK *p;
    printf("请输入要修改的学号:");
    scanf("%d",&exam->grade.num);
    for(p=L->next;p!=NULL;p=p->next)
    {
    if(p->grade.num==exam->grade.num)
    {
        printf("请输入修改后的成绩:\n");
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("班级:");scanf("%d",&p->grade.class1);
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("数学成绩:");scanf("%f",&p->grade.sxg);
        printf("英语成绩:");scanf("%f",&p->grade.yyg);
        printf("生物成绩:");scanf("%f",&p->grade.swg);
        printf("物理成绩:");scanf("%f",&p->grade.wlg);
        printf("化学成绩:");scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        break;
    }
}
}
void Tongji(LINK *L)
{
    LINK *p,*r;
    r=L->next;
    while(r!=NULL)
    {
        if(r->grade.total > r->next->grade.total)
        {
            p=r;
        }
        else
        {
            p=r->next;
        }

         r=r->next;
    }
    printf("总分最高是:\n");
    printf(PUT);
    printf(PUT1,PUT2);
}
void Insert(LINK *L)
{
    LINK *p,*r;
    p=(LINK*)malloc(sizeof(LINK));
    printf("请输入插入的学号:");
    scanf("%d",&p->grade.num);
    r=L->next;
    if(r==NULL)
    {
        r=p;
        p->next=NULL;
    }
    else
    {
    if(p->grade.num < r->grade.num)
    {
    p->next=r;
    L->next=p;
    }
    else
    {
    for(;r->next!=NULL;r=r->next)
    {
        if(r->grade.num==p->grade.num)
        {
            printf("这个学号已经存在!\n");
            return;
        }
        else if((r->grade.num < p->grade.num)&&(p->grade.num < r->next->grade.num))
        {
        p->next=r->next;
        r->next=p;
        }
    }
    if(r->next==NULL)
    {
    r->next=p;p->next=NULL;
    }
    }
    }
        printf("姓名:");
        scanf("%s",p->grade.name);
        printf("性别:");
        scanf("%s",&p->grade.sex);
        printf("班级:");
        scanf("%d",&p->grade.class1);
        printf("语文成绩:");
        scanf("%f",&p->grade.ywg);
        printf("数学成绩:");
        scanf("%f",&p->grade.sxg);
        printf("英语成绩:");
        scanf("%f",&p->grade.yyg);
        printf("生物成绩:");
        scanf("%f",&p->grade.swg);
        printf("物理成绩:");
        scanf("%f",&p->grade.wlg);
        printf("化学成绩:");
        scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
}
void Sort(LINK *L)
{
    LINK *p,*q,*r;
    if(L->next==NULL)
    printf("无记录!\n");
    else
    {
    p=L->next;
    r=p;
    q->next=r;
    r->next=NULL;
    for(p=p->next;p!=NULL;p=p->next)
    {
        if(p->grade.num < q->next->grade.num)
        {
            p->next=q->next;
            q->next=p;
        }
        r=q->next;
        while((p->grade.num > q->next->grade.num)&&(r->next!=NULL))
        {
            if(p->grade.num < r->next->grade.num)
            {
                p->next=r->next;
                r->next=p;
                break;
            }
            r=r->next;
        }
        if(r->next==NULL)
        {
        r->next=p;
        p->next=NULL;
        r=p;
        }
    }
   

    }
}

int main()
{
    LINK *L;
    LINK *p,*q;
    int select,m=1;
    L=(LINK*)malloc(sizeof(LINK));
    if(L==NULL)
    {
        printf("分配失败!\n");
        return 0;
    }
    L->next=NULL;
    q=L;
    fp=fopen("grades.txt","r");
    if(fp==NULL)
    {
        fp=fopen("grades.txt","w+");
        i=0;
    }
    else
    {
        while(!feof(fp))
        {
            p=(LINK*)malloc(sizeof(LINK));
            if(p==NULL)
            {
                printf("分配失败!\n");
                return 0;
            }
            if(fread(p,sizeof(LINK),1,fp)==1)
            {
                p->next=NULL;
                q->next=p;
                q=p;
                i++;
            }
        }
    }
    fclose(fp);
    printf("\n打开成功,一共有%d条记录。\n",i);
    while(m)
    {
        menu();
        printf("请选择选项:(0~9):\n");
        scanf("%d",&select);
        switch(select)
        {
            case 0:if(saveflag==0)
            m=0;
            else if(saveflag==1)
            Save(L);
            m=0;break;
            case 1:Read(L);break;
            case 2:Add(L);break;
            case 3:Del(L);break;
            case 4:Query(L);break;
            case 5:Modify(L);break;
            case 6:Tongji(L);break;
            case 7:Insert(L);break;
            case 8:Sort(L);break;
            case 9:Save(L);saveflag=0;break;
            default:printf("请输入0~9的选项:\n");break;
         }

    }
    system("pause");
    return 0;
}


2017-02-26 09:07
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 6楼 renkejun1942
这个函数指针自己还没有用过,怕用错了,我试一试。可是函数运行的问题是什么啊?用函数指针可以解决掉吗?
2017-02-26 18:30
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
回复 8楼 xzlxzlxzl
的确这样改了之后显示和添加没问题了,原来还要返回头指针才可以,但是查询的还是不行,选择学号查询后输入学号就会停止。。。我还是看不出来哪里有问题,不知道哪个细节没有注意到
2017-02-26 22:50
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
一些问题是解决了,但是查询和修改还是有问题,就是一旦输入学号回车之后就会停止,不知道输入函数哪里用错了,求指点。。。。指针还是不太会用,不知道用数组会不会出问题,但是数组没有这个方便。。。下面是现在的代码
程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
#define LINE -------------------------------------------
#define PUT "|学号       | 姓名 | 性别 | 班级 | 语文 | 数学 | 英语 | 生物 | 物理 | 化学 | 总分 | 平均分 |\n"
#define PUT1 "|%11d|%6s|%6c|%6d|%6.1f|%6.1f|%6.1f|%6.1f|%6.1f|%6.1f|%6.1f|%8.1f|\n"
#define PUT2 p->grade.num, p->grade.name, p->grade.sex, p->grade.class1, p->grade.ywg, p->grade.sxg, p->grade.yyg, p->grade.swg, p->grade.wlg, p->grade.hxg, p->grade.total, p->grade.ave
FILE *fp;
int i;
int saveflag=0;/*用于确定数据是否修改过*/

struct student
{
    int num;
    char name[30];
    char sex;
    int class1;
    float ywg;
    float sxg;
    float yyg;
    float swg;
    float wlg;
    float hxg;
    float total;
    float ave;
};/*学生成绩信息*/

typedef struct node
{
    struct student grade;
    struct node *next;
}LINK;/*用于链表的结构体*/

LINK *exam;/*用于函数中保存临时的数据*/

void Save(LINK *L)/*保存输入的数据到文件*/

{
    LINK *p;
    p=L->next;
    fp=fopen("grades.txt","w+");
    if(fp==NULL)
    {
        printf("打开失败!\n");
        return;
    }
    while(p!=NULL)
    {
    fwrite(p,sizeof(LINK),1,fp);
    p=p->next;
    }
fclose(fp);
}
void menu()/*用于显示菜单*/

{
    printf("---------------学生成绩管理系统---------------\n");
    printf("\t0.退出       1.显示记录\n\t2.添加记录   3.删除记录\n\t4.查询记录   5.修改记录\n\t6.统计成绩   7.插入记录\n\t8.排序并输出 9.保存\n");
    printf("----------------------------------------------\n");
}
void Read(LINK *L)/*用于显示链表中的数据*/

{
    LINK *p;
    p=L->next;
    if(p==NULL)
    {
    printf("不存在!\n");
    return;
    }
    printf(PUT);
    while(p!=NULL)
    {
        printf(PUT1,PUT2);
        p=p->next;
    }
}
LINK *Add(LINK *L)/*用于添加信息*/

{
    LINK *r,*p,*q;
    char ch;/*确定是否继续添加*/

    r=(LINK*)malloc(sizeof(LINK));/*保存输入的数据*/

    if(r==NULL)
    {
        printf("分配失败!\n");
        exit(1);
    }
    printf("是否添加记录(y/s)?\n");
    scanf("%s",&ch);
    if(ch=='y')
    {
            printf("请输入数据:\n");
            printf("学号:");scanf("%d",&r->grade.num);
            for(p=L->next;p!=NULL;p=p->next)
            if(p->grade.num==r->grade.num)
            {printf("此学生已经存在!");return L;}
            printf("姓名:");scanf("%s",r->grade.name);
            printf("性别:");scanf("%s",&r->grade.sex);
            printf("班级:");scanf("%d",&r->grade.class1);
            printf("语文成绩:");
            scanf("%f",&r->grade.ywg);
            printf("数学成绩:");
            scanf("%f",&r->grade.sxg);
            printf("英语成绩:");
            scanf("%f",&r->grade.yyg);
            printf("生物成绩:");
            scanf("%f",&r->grade.swg);
            printf("物理成绩:");
            scanf("%f",&r->grade.wlg);
            printf("化学成绩:");
            scanf("%f",&r->grade.hxg);
            r->grade.total=r->grade.ywg+r->grade.sxg+r->grade.yyg+r->grade.swg+r->grade.wlg+r->grade.hxg+r->grade.swg;
            r->grade.ave=r->grade.total/6;
            if(L->next==NULL)/*连接链表*/

            {
            L->next=r;
            q=r;
            q->next=NULL;
            }
            else
            {
            q=L->next;
            while(q->next!=NULL)
            {
                q=q->next;
            }
            q->next=r;
            q=r;
            q->next=NULL;
            }
    }
    return L;

}
LINK *Del(LINK *L)/*删除信息*/

{
    int ch;/*保存要删除的学号*/

    LINK *p,*q,*r;
    q=L;
    printf("请输入删除的学号:\n");
    scanf("%d",&ch);
    for(p=L->next;p!=NULL;p=p->next)
    {
        r=p->next;
        if(p->grade.num==ch)
        {
        q->next=r;
        free(p);
        p=NULL;
        return L;
        }
        else
        q=p;
    }
    if(p==NULL)
    printf("此记录不存在!\n");
   

    return L;
}
void Query(LINK *L)/*查询信息*/

{
    LINK *p,*exam;
    exam=NULL;
    int ch;
    printf("请问是按学号(按1)还是姓名(按2)查询?\n");
    scanf("%d",&ch);

    if(ch==1)
    {
        printf("请输入学号:\n");
        scanf("%d",&exam->grade.num);
        for(p=L->next;p!=NULL;p=p->next)
        {
        if(p==NULL)
        {
            printf("记录为空!\n");
            return;   

        }
        if(p->grade.num==exam->grade.num)
        {
            printf(PUT);
            printf(PUT1,PUT2);
            return;
        }
        }
        if(p==NULL)
        printf("此学号不存在!\n");
        return;                               

    }
    if(ch==2)
    {
        printf("请输入姓名:");
        scanf("%s",exam->grade.name);
        for(p=L->next;p!=NULL;p=p->next)
        {
        if(p==NULL)
        {
           

            printf("记录为空!\n");
            return;
        }   

        if(!strcmp(p->grade.name,exam->grade.name))
        {
            printf(PUT);
            printf(PUT1,PUT2);
            return;;
        }
        }
        if(p==NULL)
        printf("此姓名不存在!\n");
        return;
    }
}
LINK *Modify(LINK *L)/*修改信息*/

{
    LINK *p;
    printf("请输入要修改的学号:");
    scanf("%d",&exam->grade.num);
    for(p=L->next;p!=NULL;p=p->next)
    {
        if(p==NULL)
        {
            printf("记录为空!\n");
            return L;
        }
    if(p->grade.num==exam->grade.num)
    {
        printf("请输入修改后的成绩:\n");
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("班级:");scanf("%d",&p->grade.class1);
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("数学成绩:");scanf("%f",&p->grade.sxg);
        printf("英语成绩:");scanf("%f",&p->grade.yyg);
        printf("生物成绩:");scanf("%f",&p->grade.swg);
        printf("物理成绩:");scanf("%f",&p->grade.wlg);
        printf("化学成绩:");scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        return L;
    }
    }
    if(p==NULL)
    {
        printf("这个记录不存在!\n");
    }
    return L;
}
void Tongji(LINK *L)/*统计信息*/

{
    LINK *p,*r;
    r=L->next;
    while(r!=NULL)
    {
        if(r->grade.total > r->next->grade.total)
        {
            p=r;
        }
        else
        {
            p=r->next;
        }

         r=r->next;
    }
    printf("总分最高是:\n");
    printf(PUT);
    printf(PUT1,PUT2);
}
LINK *Insert(LINK *L)/*插入信息*/

{
    LINK *p,*r;
    p=(LINK*)malloc(sizeof(LINK));/*保存临时的信息*/

    p=NULL;
    printf("请输入插入的学号:");
    scanf("%d",&p->grade.num);
    r=L->next;
    if(r==NULL)/*链表为空*/

    {
        r=p;
        p->next=NULL;
    }
    else
    {
    if(p->grade.num < r->grade.num)
    {
    p->next=r;
    L->next=p;
    }
    else
    {
    for(;r->next!=NULL;r=r->next)
    {
        if(r->grade.num==p->grade.num)
        {
            printf("这个学号已经存在!\n");
            free(p);
            return L;
        }
        else if((r->grade.num < p->grade.num)&&(p->grade.num < r->next->grade.num))
        {
        p->next=r->next;
        r->next=p;
        break;
        }
    }
    if(r->next==NULL)
    {
    r->next=p;p->next=NULL;
    }
    }
    }
        printf("姓名:");
        scanf("%s",p->grade.name);
        printf("性别:");
        scanf("%s",&p->grade.sex);
        printf("班级:");
        scanf("%d",&p->grade.class1);
        printf("语文成绩:");
        scanf("%f",&p->grade.ywg);
        printf("数学成绩:");
        scanf("%f",&p->grade.sxg);
        printf("英语成绩:");
        scanf("%f",&p->grade.yyg);
        printf("生物成绩:");
        scanf("%f",&p->grade.swg);
        printf("物理成绩:");
        scanf("%f",&p->grade.wlg);
        printf("化学成绩:");
        scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        free(p);
        return L;
}
void Sort(LINK *L)/*按学号排序*/

{
    LINK *p,*q,*r;
    if(L->next==NULL)
    printf("无记录!\n");
    else
    {
    p=L->next;
    r=p;
    q->next=r;
    r->next=NULL;
    for(p=p->next;p!=NULL;p=p->next)
    {
        if(p->grade.num < q->next->grade.num)
        {
            p->next=q->next;
            q->next=p;
        }
        r=q->next;
        while((p->grade.num > q->next->grade.num)&&(r->next!=NULL))
        {
            if(p->grade.num < r->next->grade.num)
            {
                p->next=r->next;
                r->next=p;
                break;
            }
            r=r->next;
        }
        if(r->next==NULL)
        {
        r->next=p;
        p->next=NULL;
        r=p;
        }
    }
   

    }
}

int main()/*主函数*/

{
    LINK *L;
    LINK *p,*q;
    int select,m=1;
    L=(LINK*)malloc(sizeof(LINK));
    if(L==NULL)
    {
        printf("分配失败!\n");
        return 0;
    }
    L->next=NULL;
    q=L;
    fp=fopen("grades.txt","r");
    if(fp==NULL)
    {
        fp=fopen("grades.txt","w+");
        i=0;
    }
    else
    {
        while(!feof(fp))
        {
            p=(LINK*)malloc(sizeof(LINK));
            if(p==NULL)
            {
                printf("分配失败!\n");
                return 0;
            }
            if(fread(p,sizeof(LINK),1,fp)==1)
            {
                p->next=NULL;
                q->next=p;
                q=p;
                i++;
            }
        }
    }
    fclose(fp);
    printf("\n打开成功,一共有%d条记录。\n",i);
    while(m)
    {
        menu();
        printf("请选择选项:(0~9):\n");
        scanf("%d",&select);
        switch(select)
        {
            case 0:if(saveflag==0)
            m=0;
            else if(saveflag==1)
            Save(L);
            m=0;break;
            case 1:Read(L);break;
            case 2:Add(L);break;
            case 3:Del(L);break;
            case 4:Query(L);break;
            case 5:Modify(L);break;
            case 6:Tongji(L);break;
            case 7:Insert(L);break;
            case 8:Sort(L);break;
            case 9:Save(L);saveflag=0;break;
            default:printf("请输入0~9的选项:\n");break;
         }

    }
    system("pause");
    return 0;
}


2017-02-27 08:28
姚萌萌
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:40
专家分:55
注 册:2016-12-25
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
#define LINE -------------------------------------------
#define PUT "|学号       | 姓名 | 性别 | 班级 | 语文 | 数学 | 英语 | 生物 | 物理 | 化学 | 总分 | 平均分 |\n"
#define PUT1 "|%11d|%6s|%6c|%6d|%6.1f|%6.1f|%6.1f|%6.1f|%6.1f|%6.1f|%6.1f|%8.1f|\n"
#define PUT2 p->grade.num, p->grade.name, p->grade.sex, p->grade.class1, p->grade.ywg, p->grade.sxg, p->grade.yyg, p->grade.swg, p->grade.wlg, p->grade.hxg, p->grade.total, p->grade.ave
FILE *fp;
int i;
int saveflag=0;/*用于确定数据是否修改过*/

struct student
{
    int num;
    char name[30];
    char sex;
    int class1;
    float ywg;
    float sxg;
    float yyg;
    float swg;
    float wlg;
    float hxg;
    float total;
    float ave;
};/*学生成绩信息*/

typedef struct node
{
    struct student grade;
    struct node *next;
}LINK;/*用于链表的结构体*/

LINK *exam;/*用于函数中保存临时的数据*/

void Save(LINK *L)/*保存输入的数据到文件*/

{
    LINK *p;
    p=L->next;
    fp=fopen("grades.txt","w+");
    if(fp==NULL)
    {
        printf("打开失败!\n");
        return;
    }
    while(p!=NULL)
    {
    fwrite(p,sizeof(LINK),1,fp);
    p=p->next;
    }
fclose(fp);
}
void menu()/*用于显示菜单*/

{
    printf("---------------学生成绩管理系统---------------\n");
    printf("\t0.退出       1.显示记录\n\t2.添加记录   3.删除记录\n\t4.查询记录   5.修改记录\n\t6.统计成绩   7.插入记录\n\t8.排序 9.保存\n");
    printf("----------------------------------------------\n");
}
void Read(LINK *L)/*用于显示链表中的数据*/

{
    LINK *p;
    p=L->next;
    if(p==NULL)
    {
    printf("不存在!\n");
    return;
    }
    printf(PUT);
    while(p!=NULL)
    {
        printf(PUT1,PUT2);
        p=p->next;
    }
}
LINK *Add(LINK *L)/*用于添加信息*/

{
    LINK *r,*p,*q;
    char ch;/*确定是否继续添加*/

    r=(LINK*)malloc(sizeof(LINK));/*保存输入的数据*/

    if(r==NULL)
    {
        printf("分配失败!\n");
        exit(1);
    }
    printf("是否添加记录(y/s)?\n");
    scanf("%s",&ch);
    if(ch=='y')
    {
            printf("请输入数据:\n");
            printf("学号:");scanf("%d",&r->grade.num);
            for(p=L->next;p!=NULL;p=p->next)
            if(p->grade.num==r->grade.num)
            {printf("此学生已经存在!");return L;}
            printf("姓名:");scanf("%s",r->grade.name);
            printf("性别:");scanf("%s",&r->grade.sex);
            printf("班级:");scanf("%d",&r->grade.class1);
            printf("语文成绩:");
            scanf("%f",&r->grade.ywg);
            printf("数学成绩:");
            scanf("%f",&r->grade.sxg);
            printf("英语成绩:");
            scanf("%f",&r->grade.yyg);
            printf("生物成绩:");
            scanf("%f",&r->grade.swg);
            printf("物理成绩:");
            scanf("%f",&r->grade.wlg);
            printf("化学成绩:");
            scanf("%f",&r->grade.hxg);
            r->grade.total=r->grade.ywg+r->grade.sxg+r->grade.yyg+r->grade.swg+r->grade.wlg+r->grade.hxg+r->grade.swg;
            r->grade.ave=r->grade.total/6;
            if(L->next==NULL)/*连接链表*/

            {
            L->next=r;
            q=r;
            q->next=NULL;
            }
            else
            {
            q=L->next;
            while(q->next!=NULL)
            {
                q=q->next;
            }
            q->next=r;
            q=r;
            q->next=NULL;
            }
    }
    return L;

}
LINK *Del(LINK *L)/*删除信息*/

{
    int ch;/*保存要删除的学号*/

    LINK *p,*q,*r;
    q=L;
    printf("请输入删除的学号:\n");
    scanf("%d",&ch);
    for(p=L->next;p!=NULL;p=p->next)
    {
        r=p->next;
        if(p->grade.num==ch)
        {
        q->next=r;
        free(p);
        p=NULL;
        return L;
        }
        else
        q=p;
    }
    if(p==NULL)
    printf("此记录不存在!\n");
   

    return L;
}
void Query(LINK *L)/*查询信息*/

{
    LINK *p,q;
    exam=&q;
    int ch;
    printf("请问是按学号(按1)还是姓名(按2)查询?\n");
    scanf("%d",&ch);

    if(ch==1)
    {
        printf("请输入学号:\n");
        scanf("%d",&exam->grade.num);
        for(p=L->next;p!=NULL;p=p->next)
        {
        if(p==NULL)
        {
            printf("记录为空!\n");
            return;   

        }
        if(p->grade.num==exam->grade.num)
        {
            printf(PUT);
            printf(PUT1,PUT2);
            return;
        }
        }
        if(p==NULL)
        printf("此学号不存在!\n");
        return;                               

    }
    if(ch==2)
    {
        printf("请输入姓名:");
        scanf("%s",exam->grade.name);
        for(p=L->next;p!=NULL;p=p->next)
        {
        if(p==NULL)
        {
           

            printf("记录为空!\n");
            return;
        }   

        if(!strcmp(p->grade.name,exam->grade.name))
        {
            printf(PUT);
            printf(PUT1,PUT2);
            return;;
        }
        }
        if(p==NULL)
        printf("此姓名不存在!\n");
        return;
    }
}
LINK *Modify(LINK *L)/*修改信息*/

{
    LINK *p,q;
    exam=&q;
    printf("请输入要修改的学号:");
    scanf("%d",&exam->grade.num);
    for(p=L->next;p!=NULL;p=p->next)
    {
        if(p==NULL)
        {
            printf("记录为空!\n");
            return L;
        }
    if(p->grade.num==exam->grade.num)
    {
        printf("请输入修改后的成绩:\n");
        printf("班级:");scanf("%d",&p->grade.class1);
        printf("语文成绩:");scanf("%f",&p->grade.ywg);
        printf("数学成绩:");scanf("%f",&p->grade.sxg);
        printf("英语成绩:");scanf("%f",&p->grade.yyg);
        printf("生物成绩:");scanf("%f",&p->grade.swg);
        printf("物理成绩:");scanf("%f",&p->grade.wlg);
        printf("化学成绩:");scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        return L;
    }
    }
    if(p==NULL)
    {
        printf("这个记录不存在!\n");
    }
    return L;
}
void Tongji(LINK *L)/*统计信息*/

{
    LINK *p,*r;
    r=L->next;
    p=r;
    if(L->next==NULL)
    {
        printf("无记录!\n");
        return;
    }
    while(r!=NULL && r->next!=NULL)
    {
        if(r->grade.total > r->next->grade.total)
        {
            p=r;
        }
        else
        {
            p=r->next;
        }

         r=r->next;
    }
    printf("总分最高是:\n");
    printf(PUT);
    printf(PUT1,PUT2);
}
LINK *Insert(LINK *L)/*插入信息*/

{
    LINK *p,*r;
    p=(LINK*)malloc(sizeof(LINK));/*保存临时的信息*/

    printf("请输入插入的学号:");
    scanf("%d",&p->grade.num);
    for(r=L->next;r!=NULL;r=r->next)
    if(r->grade.num==p->grade.num)
        {
            printf("这个学号已经存在!\n");
            free(p);
            return L;
        }
        printf("姓名:");
        scanf("%s",p->grade.name);
        printf("性别:");
        scanf("%s",&p->grade.sex);
        printf("班级:");
        scanf("%d",&p->grade.class1);
        printf("语文成绩:");
        scanf("%f",&p->grade.ywg);
        printf("数学成绩:");
        scanf("%f",&p->grade.sxg);
        printf("英语成绩:");
        scanf("%f",&p->grade.yyg);
        printf("生物成绩:");
        scanf("%f",&p->grade.swg);
        printf("物理成绩:");
        scanf("%f",&p->grade.wlg);
        printf("化学成绩:");
        scanf("%f",&p->grade.hxg);
        p->grade.total=p->grade.ywg+p->grade.sxg+p->grade.yyg+p->grade.swg+p->grade.wlg+p->grade.hxg+p->grade.swg;
        p->grade.ave=p->grade.total/6;
        r=L->next;
    if(r==NULL)/*链表为空*/

    {
        L->next=p;
        p->next=NULL;
    }
    else
    {
    if(p->grade.num < r->grade.num)
    {
    p->next=r;
    L->next=p;
    }
    else
    {
    for(;r->next!=NULL;r=r->next)
    {
     if((r->grade.num < p->grade.num)&&(p->grade.num < r->next->grade.num))
        {
        p->next=r->next;
        r->next=p;
        return L;
        }
    }
    if(r->next==NULL)
    {
    r->next=p;p->next=NULL;
    }
    }
    }
    return L;
}
LINK *Sort(LINK *L)/*按学号排序*/

{
    LINK *p,*q,*r;
    q=(LINK*)malloc(sizeof(LINK));
    r=(LINK*)malloc(sizeof(LINK));
    if(L->next==NULL)
    printf("无记录!\n");
    else
    {
    p=L->next;
    r=p;
    q->next=r;

    for(p=p->next;p!=NULL;p=p->next)
    {
        if(p->grade.num < q->next->grade.num)
        {
            p->next=q->next;
            q->next=p;
        }
        r=q->next;
        while((p->grade.num > r->grade.num)&&(r->next!=NULL))
        {
            if(p->grade.num < r->next->grade.num)
            {
                p->next=r->next;
                r->next=p;
                break;
            }
            r=r->next;
        }
        if(r->next==NULL)
        {
        r->next=p;
        p->next=NULL;
        r=p;
        }
    }
    }
    L=q;
    return L;
}

int main()/*主函数*/

{
    LINK *L;
    LINK *p,*q;
    int select,m=1;
    L=(LINK*)malloc(sizeof(LINK));
    if(L==NULL)
    {
        printf("分配失败!\n");
        return 0;
    }
    L->next=NULL;
    q=L;
    fp=fopen("grades.txt","r");
    if(fp==NULL)
    {
        fp=fopen("grades.txt","w+");
        i=0;
    }
    else
    {
        while(!feof(fp))
        {
            p=(LINK*)malloc(sizeof(LINK));
            if(p==NULL)
            {
                printf("分配失败!\n");
                return 0;
            }
            if(fread(p,sizeof(LINK),1,fp)==1)
            {
                p->next=NULL;
                q->next=p;
                q=p;
                i++;
            }
        }
    }
    fclose(fp);
    printf("\n打开成功,一共有%d条记录。\n",i);
    while(m)
    {
        menu();
        printf("请选择选项:(0~9):\n");
        scanf("%d",&select);
        switch(select)
        {
            case 0:if(saveflag==0)
            m=0;
            else if(saveflag==1)
            Save(L);
            m=0;break;
            case 1:Read(L);break;
            case 2:Add(L);break;
            case 3:Del(L);break;
            case 4:Query(L);break;
            case 5:Modify(L);break;
            case 6:Tongji(L);break;
            case 7:Insert(L);break;
            case 8:Sort(L);break;
            case 9:Save(L);saveflag=0;break;
            default:printf("请输入0~9的选项:\n");break;
         }

    }
    system("pause");
    return 0;
}


2017-02-28 21:33
快速回复:自己写的学生成绩管理,但是运行添加成员时会停止,求大神指点错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.206124 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved