学生作业管理系统

作者在 2011-07-14 00:37:08 发布以下内容
#include <stdio.h>
#include <stdlib.h>
#include <io.h>



typedef struct student
{
    char name[10];
    int schoolnumber;
    int classnumber;
    float score[10];
    struct student *next;
} stu,*stupt;
stupt st=NULL;//学生信息的头指针
stupt qt=NULL;//学生信息的尾指针
FILE* fp;//文件指针


//////////////////////////////////////////////////////////////////////////////////////////////////
void Printf_help()
{
    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("│    a.导出至文件                                                          │\n");
    printf("│    0.退出系统                                                            │\n");
    printf("╰─────────────────────────────────────╯\n");
    printf("");

}
//////////////////////////////////////////-1-////////////////////////////////////////////////////////
void inpu(stupt p)
{
    int n;
    int m=0;
    int flag;
    while(m<10)//成绩初始化为0
    {
        p->score[m]=0;
        m++;
    }
    printf("请输入:姓名:");
    scanf("%s",p->name);
    printf("请输入:学号:");
    scanf("%d",&p->schoolnumber);
    printf("请输入:班级(如:101):");
    scanf("%d",&p->classnumber);
    do
    {
        printf("请输入:第几次作业(1~10):");
        scanf("%d",&n);
        printf("请输入:该次作业成绩:");
        scanf("%f",&p->score[n-1]);
        getchar();//清空缓冲区
        printf("是否继续输入该生成绩,退出请按q,其他键继续:");
        flag=getchar();
    }
    while(flag!='q');
}

void input(stupt&st,stupt&qt)
{

    char flag;
    stupt p,q;
    p=q=NULL;
    printf("确认输入?y.是 n.取消(注意大小写)\n");
    while((flag=getchar())!='n')
    {
        getchar();//清空缓冲区
        if(flag=='y')
        {
            p=(stupt)malloc(sizeof(stu));
            if(p==NULL) exit(1);
            inpu(p);
            getchar();//清空inpu()带来的缓冲区堆积
            if(st==NULL) st=qt=p;
            else if(qt!=NULL)
            {
                qt->next=p;    //尾指针非空(及链表已存在)接着尾指针建立链表
                qt=p;
            }

        }
        else
        {
            getchar();//清空非法输入带来的回车符
            printf("存在非法输入!请进入菜单界面重新选择(按8或9):");
            return;
        }
        printf("是否继续输入?y.是 n.否(注意大小写)\n");
    }
    if(flag=='n')
    {
        Printf_help();
    }
    getchar();//清空缓冲区
    if(p!=NULL&&qt!=NULL)
    {
        qt->next=NULL;
    }

}
///////////////////////////////////////////////-2-///////////////////////////////////////////////////
void read(stupt p,FILE* fp)
{
    fscanf(fp,"%s",p->name);
    fscanf(fp,"%d",&p->classnumber);
    fscanf(fp,"%d",&p->schoolnumber);
    fscanf(fp,"%f",&p->score[0]);
    fscanf(fp,"%f",&p->score[1]);
    fscanf(fp,"%f",&p->score[2]);
    fscanf(fp,"%f",&p->score[3]);
    fscanf(fp,"%f",&p->score[4]);
    fscanf(fp,"%f",&p->score[5]);
    fscanf(fp,"%f",&p->score[6]);
    fscanf(fp,"%f",&p->score[7]);
    fscanf(fp,"%f",&p->score[8]);
    fscanf(fp,"%f",&p->score[9]);
    //fread(p,sizeof(stu),1,fp);

}
/*int judge(FILE * fp)
{
    int ch;
    ch=fgetc(fp);
    fseek(fp,-1l,SEEK_CUR);//回退一个字符位
    if(ch==EOF)
    return 1;
    else
    return 0;
}//返回1文件结尾
*/
void filep_read_to_st(stupt &st,FILE* fp)
{
    //int k;
    stupt p;
    st=NULL;//置空st,准备从文件中导入学生信息
    while(1)
    {
        //if(judge(fp)) break;
        p=(stupt)malloc(sizeof(stu));
        read(p,fp);
        if(feof(fp)) break;
        if(st==NULL) st=qt=p;
        else if(qt!=NULL)
        {
            qt->next=p;    //尾指针非空(即链表已存在)接着尾指针建立链表
            qt=p;
        }
    }
    if(feof(fp))
    {
        qt->next=NULL;    //如果文件结束,尾指针next指空
    }
    //k=judge(fp);
    
//printf("%d",k);
    if(st!=NULL&&feof(fp)) printf("文件导入成功!\n");
    else printf("导入失败,请重新导入!\n");

}
void readfile(stupt &st,FILE* fp)
{
    char flag,flag_1;
    char filename[90];
    printf("如导入前有过手动输入,请先导出至文件后再进行导入,否则输入那部分数据将丢失!\n");
    printf("任意键继续,退出请按q:");
    flag_1=getchar();
    getchar();
    if(flag_1=='q')
    {
        return;
    }
lab_2:
    printf("请选择:a.程序默认路径导入(之前导出时需要是默认导出) b.自定义导入路径(请确保导入路径合法):");
    flag=getchar();
    getchar();
    if(flag=='b')
    {
        printf("请输入导入路径(请确保导入路径合法!)(如c:.\\student_homework_infor.txt):");
        scanf("%s",filename);
        getchar();
        if(access(filename,0)==1)
        {
            printf("路径不合法或文件不存在,请重新选择!\n");
            goto lab_2;
        }
        fp=fopen(filename,"r");
        if(fp==NULL)
        {
            printf("打开%s文件失败,请返回主菜单重试!\n",filename);
            return;
        }
        else
            filep_read_to_st(st,fp);
        fclose(fp);

    }
    else if(flag=='a')
    {
        fp=fopen("student_homework_infor.txt","r");
        if(access("student_homework_infor.txt",0)==1)
        {
            printf("文件不存在!\n");
        }
        if(fp==NULL)
        {
            printf("打开程序所在目录下的student_homework_infor.txt文件失败,请返回主菜单重试!\n");
            return;
        }
        else filep_read_to_st(st,fp);
        fclose(fp);
    }
    else printf("非法输入!程序将返回主菜单...\n");

}
///////////////////////////////////////////////-3-/////////////////////////////////////////////////////////////////////
void printf_score(stupt p)
{
    int n=0;
    printf("前十次成绩如下:\n");
    printf("-----------------------------------------------------------------------------\n");
    while(n<10)
    {
        printf("%f   ",p->score[n]);
        n++;
    }
    printf("\n");
}

void search(stupt&st,int snum)
{
    stupt p,q;
    if(st==NULL)
    {
        printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息\n");
        return;
    }
    else
    {
        p=st;
        q=p->next;
    }
    if(p->schoolnumber==snum)
    {
        printf_score(p);    //查找成功输出并返回上级函数
        return;
    }
    while(q!=NULL)
    {
        if(q->schoolnumber==snum)
        {
            printf_score(q);    //查找成功输出并返回上级函数
            return;
        }
        q=q->next;//下一个
    }
    printf("查询失败,该学号学生信息不存在\n");

}

void school_num_search(stupt&st)
{
    int snum;
    char flag;
    do
    {
        printf("请输入要查找的学生学号(如221):");
        scanf("%d",&snum);
        getchar();//清空scanf结束时进入缓冲的enter符
        search(st,snum);
        //getchar();//清空scanf结束时进入缓冲的enter符
        printf("按任意键继续查找,退出请按q:");
        flag=getchar();
        getchar();//清空回车符
    }
    while(flag!='q');
    if(flag=='q')
    {
        Printf_help();
    }
}
/////////////////////////////////////////////-4-/////////////////////////////////////////////////////////
void printf_infor(stupt p)
{
    printf("%-5d%-7s%-5d%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f%-6.1f\n",p->classnumber,p->name,p->schoolnumber,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[5],p->score[7],p->score[8],p->score[9]);
    printf("──────────────────────────────────────\n");
}
void search_2(stupt st,int clnum)
{
    stupt p,q;
    int f=0;
    if(st==NULL)
    {
        printf("未建立学生信息表,请返回主菜单输入所有学生的信息(请按确认键)\n");
        return;
    }
    else
    {
        p=st;
        q=p->next;
    }
    printf("班级  姓名 学号 成绩1 成绩2 成绩3 成绩4 成绩5 成绩6 成绩7 成绩8 成绩9 成绩10\n");
    printf("──────────────────────────────────────\n");
    if(p->classnumber==clnum)
    {
        printf_infor(p);
        f++;
    }//查找成功输出
    while(q!=NULL)
    {
        if(q->classnumber==clnum)
        {
            printf_infor(q);
            f++;
        }//查找成功输出
        q=q->next;//下一个

    }
    if(f==0)
    {
        printf("没有该班级学生信息\n");
    }

}

void  class_num_search(stupt st)
{
    int clnum;
    char flag;
    do
    {
        printf("请输入班级(如101):");
        scanf("%d",&clnum);
        getchar();//清空scanf结束时进入缓冲的enter符
        search_2(st,clnum);
        printf("按任意键继续查找,退出请按q:");
        flag=getchar();
        getchar();//清空回车符
    }
    while(flag!='q');
    if(flag=='q')
    {
        Printf_help();
    }
}
////////////////////////////////////////////////-5-/////////////////////////////////////////////////////
void change_name(stupt& p)
{
    printf("原姓名为:%s\n",p->name);
    printf("请输入新姓名:");
    scanf("%s",p->name);
    getchar();
}
void change_class(stupt& p)
{
    printf("原班级为:%d\n",p->classnumber);
    printf("请输入新班级:");
    scanf("%d",&p->classnumber);
    getchar();
}
void change_score(stupt&p)
{
    int n;
    char flag;
    do
    {
        printf("请输入:修改作业次数(1~10):");
        scanf("%d",&n);
        printf("原成绩为:%f\n",p->score[n]);
        printf("请输入:该次作业新成绩:");
        scanf("%f",&p->score[n]);
        getchar();//清空缓冲区
        printf("是否继续修改该生成绩,退出请按q,其他键继续");
        flag=getchar();
    }
    while(flag!='q');
    getchar();
}
void printf_help_2()
{
    printf("╭──────────────────────╮\n");
    printf("│ 请选择操作:                               │\n");
    printf("│    1.修改姓名                              │\n");
    printf("│    2.修改班级                              │\n");
    printf("│    3.修改成绩                              │\n");
    printf("│    0.返回主菜单                            │\n");
    printf("╰──────────────────────╯\n");
    printf("");
}
void change(stupt&p)
{
    char a;
    printf_help_2();
    while((a=getchar())!='0')
    {

        getchar();
        switch(a)
        {
        case '1':
        {
            printf("您选择了:1.修改姓名\n");
            change_name(p);
            break;
        }
        case '2':
        {
            printf("您选择了:2.修改班级\n");
            change_class(p);
            break;
        }
        case '3':
        {
            printf("您选择了:3.修改成绩\n");
            change_score(p);
            break;
        }

        default:
        {
            printf("非法输入,请重新选择!\n");
            break;
        }
        }
        printf_help_2();
    }
    if(a=='0')
    {
        printf("您选择了:0.返回\n");
    }

}
void search_3(stupt&st,int snum)
{
    stupt p,q;
    int f=0;
    if(st==NULL)
    {
        printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息\n");
        return;
    }
    else
    {
        p=st;
        q=p->next;
    }
    if(p->schoolnumber==snum)
    {
        change(p);    //查找成功并修改
        f++;
        return;
    }
    while(q!=NULL)
    {
        if(q->schoolnumber==snum)
        {
            change(q);    //查找成功并修改
            f++;
            return;
        }
        q=q->next;//下一个
    }
    if(f==0)
    {
        printf("没有该学生信息\n");
    }
}
void school_num_change(stupt&st)
{
    int snum;
    char flag;
    do
    {
        printf("请输入要修改学生学号(如101):");
        scanf("%d",&snum);
        getchar();//清空scanf结束时进入缓冲的enter符
        search_3(st,snum);
        getchar();//清空scanf结束时进入缓冲的enter符
        printf("按任意键继续按学号查找修改信息,退出请按q:");
        flag=getchar();
        getchar();//清空回车符
    }
    while(flag!='q');
    if(flag=='q')
    {
        Printf_help();
    }
}
/////////////////////////////////////////////////-6-/////////////////////////////////////////////////////

void delete_pt(stupt&st,int snum)
{
    stupt p,q;
    if(st==NULL)
    {
        printf("未建立学生信息表,请返回主菜单输入或导入所有学生的信息\n");
        return;
    }
    else
    {
        p=st;
        q=p->next;
    }
    if(p->schoolnumber==snum)
    {
        st=q;    //查找成功删除并返回上级函数
        free(p);
        printf("删除成功!\n");
        return;
    }
    while(q!=NULL)
    {
        if(q->schoolnumber==snum)
        {
            p->next=q->next;    //查找成功删除并返回上级函数
            free(q);
            printf("删除成功!\n");
            return;
        }
        else//下一个
        {
            p=q;
            q=p->next;
        }
    }
    printf("删除失败,该学号学生信息不存在\n");

}

void school_num_delete(stupt&st)
{
    int snum;
    char flag;
    do
    {
        printf("请输入要删除的学生学号(如221):");
        scanf("%d",&snum);
        getchar();//清空scanf结束时进入缓冲的enter符
        delete_pt(st,snum);
        printf("按任意键继续删除,退出请按q:");
        flag=getchar();
        getchar();//清空回车符
    }
    while(flag!='q');
    if(flag=='q')
    {
        Printf_help();
    }
}
/////////////////////////////////////////////////-7-////////////////////////////////////////////////////

void printf_help_3()
{
    printf("╭──────────────────────╮\n");
    printf("│ 请选择操作:                               │\n");
    printf("│    1.按学号查看学生平均成绩                │\n");
    printf("│    2.按班级查看学生平均成绩                │\n");
    printf("│    3.查看学生平均成绩降序序列              │\n");
    printf("│    0.返回主菜单                            │\n");
    printf("╰──────────────────────╯\n");
    printf("<
文章评论,共2条
好学青年
2011-11-09 22:27
1
上面的表格能输出吗
维海(作者)
2011-11-15 16:18
2
<div class="quote"><span class="q"><b>好学青年</b>: 上面的表格能输出吗</span></div>蒽,可以的
游客请输入验证码