学生成绩管理系统(附文档)

查看文档请点击这里

主要包含以下项目

            账号信息:id,密码,身份信息.

         学生信息:id,姓名,c语言成绩,英语成绩,数学成绩,总成绩.

采用二进制文本的形式储存
       实现有以下功能:
                    添加学生(教师)账号信息
                    浏览所有学生信息
                    按照指定id查询信息

             修改指定id信息

             删除指定id信息

             修改密码

             重置系统

扩展功能:
                    排序浏览
                    学生和账号信息分别存放在不同的文件中    

      把文件中的学生和账号信息导入的程序中

另附:c语言班费收支系统

        学生用餐管理系统

实现方式都不一样,可供参考
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#define SUPERKEY 123456
typedef struct Class {
    long long id;
    char name[10];
    int cScore;
    int mathScore;
    int englishScore;
    int allScore;
    struct Class *next;
} Class;
typedef struct Identity {
    long long id;
    long long key;
    int identity;            ///1表示教师,0表示学生;
    struct Identity *next;
} Identity;
void Show(char*);
void Print(Class *s) {       ///对内容进行输出
    printf("     %-10lld  %-13s%-13d%-13d%-13d%-5d\n",s->id,s->name,s->cScore,s->mathScore,s->englishScore,s->allScore);
};

void Init();                                                     ///系统重置
void GotoTeacher(long long,long long,Identity*,Class*);          ///教师端
void GotuStudent(long long,long long,Identity*,Class*);          ///学生端
void Admin(void*);                                               ///管理员界面

void LogIn();                                                    ///登录端口
void GotoXY(int,int);                                            ///移动光标到输入栏
long long KeyIn();                                               ///密文输入
int LoadInformation(long long,long long);                        ///加载账号信息;

void SaveFile(void *,char*);                                     ///存文件
void *readFile(char*);                                           ///读取文件

void Add(Class*,Identity*,char*);                                ///添加
void Change(long long,void*,char*);                              ///修改
void *Find(long long id,void *head,char*func);                   ///查找(*->next即为查找到的数据)
void ViewAll(Class *);                                           ///查看所有
void Delete(long long,Class*,Identity*,char*);                   ///删除
void Sort(Class*);                                             ///排序
int main() {
    LogIn();
    return 0;
}

long long KeyIn() {           ///密文输入****
    char key[20], c;
    int i = 0;
    memset(key,0,sizeof(key));
    while ((c = getch())!='\r') {
        if(c != 8) {
            key[i++] = c;
            printf("*");
        } else {
            printf("\b \b");
        }
    }
    key[i] = 0;
    return atoll(key);
}
void GotoXY(int x,int y) {	  ///定位光标位置到指定坐标
    HANDLE hOut;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos= {x,y};
    SetConsoleCursorPosition(hOut,pos);
}

void LogIn() {                ///登录界面
    long long id;
    long long key;
    while(1) {
        Show("Login");
        GotoXY(13,3);
        scanf("%lld",&id);
        GotoXY(13,5);
        key = KeyIn();
        LoadInformation(id,key);

    }
}
int LoadInformation(long long id,long long key) {
    Identity *accont = (Identity*)readFile("ACC");
    Class *student = (Class*)readFile("STU");
    Identity *p = accont;
    Show("Load");
    while(p = p->next) {
        if(p->id == id&&p->key == key) {
            if(p->identity)
                GotoTeacher(id,key,accont,student);
            else
                GotuStudent(id,key,accont,student);
            return 0;
        }
    }
    long long superKey;
    system("cls");
    printf("┌────────────────────────────────────┐\n");
    printf("│账号密码错误!!!                     │\n");
    printf("│请输入管理员密码:                   │\n");
    printf("└────────────────────────────────────┘\n");
    GotoXY(19,2);
    superKey = KeyIn();
    if(superKey == SUPERKEY)
        Admin(accont);
    else {
        getchar();
        printf("\n\n密码错误!");
        Sleep(2000);
    }
    system("cls");
    return 1;
}

void ViewAll(Class *head) {
    Class *p = head;
    Show("splitter");
    while(p = p->next)
        Print(p);
}

void ViewAllAcc(Identity*head) {
    Identity *p = head;
    Show("splitter");
    while(p = p->next)
        printf("%10lld%10d\n",p->id,p->key);
}

void Add(Class *student,Identity*accont,char*func) {
    Identity *addAccont = (Identity*)malloc(sizeof(Identity));
    printf("请输入你要添加的id:\n");
    if(strcmp(func,"STU")==0) {
        Class *add = (Class*)malloc(sizeof(Class));
        scanf("%lld",&add->id);
        if(((Identity*)Find(add->id,accont,"ACC"))->next) {
            printf("此id已存在\n");
            free(add);
            free(addAccont);
            return;
        }
        printf("请输入该生名字:\n");
        scanf("%s",add->name);
        printf("请输入c成绩,数学成绩,英语成绩(以空格隔开)\n");
        scanf("%d%d%d",&add->cScore,&add->mathScore,&add->englishScore);
        add->allScore = add->cScore+add->mathScore+add->englishScore;

        addAccont->id = add->id;
        addAccont->key = 123456;
        addAccont->identity = 0;

        add->next = student->next;
        student->next = add;
        SaveFile(student,"STU");
    } else {
        scanf("%lld",&addAccont->id);
        if(((Identity*)Find(addAccont->id,accont,"ACC"))->next) {
            printf("此id已存在\n");
            free(addAccont);
            return;
        }
        printf("请输入该账号的初始密码:\n");
        addAccont->key = KeyIn();
        addAccont->identity = 1;
    }
    addAccont->next = accont->next;
    accont->next = addAccont;
    SaveFile(accont,"ACC");
}
void Change(long long id,void *head,char* func) {
    if(strcmp(func,"STU")==0) {
        Class *Cur = ((Class*)Find(id,head,"STU"))->next;
        if(Cur) {
            printf("请按照姓名,c语言成绩,数学成绩,英语成绩的格式输入(以空格隔开)\n");
            scanf("%s%d%d%d",Cur->name,&Cur->cScore,&Cur->mathScore,&Cur->englishScore);
            Cur->allScore = Cur->cScore + Cur->englishScore + Cur->mathScore;
        } else
            printf("查无此人\n");
        SaveFile(head,"STU");
    } else {
        Identity *Cur = ((Identity*)Find(id,head,"ACC"))->next;
        printf("请输入新密码:\n");
        Cur->key = KeyIn();
        printf("\n");
        SaveFile(head,"ACC");
    }
}
void Delete(long long id,Class*student,Identity*accont,char*func) {
    if(strcmp(func,"STU")==0) {
        Class *p = Find(id,student,"STU");
        if(p->next) {
            Class *r = p->next;
            p->next = r->next;
            free(r);
        } else {
            printf("操作有误\n");
            return;
        }
        SaveFile(student,"STU");
    }

    Identity *p = Find(id,accont,"ACC");
    if(p->next) {
        if(p->identity==0) {
            Class *r = p->next;
            p->next = r->next;
            free(r);
        }
    } else {
        printf("操作有误\n");
    }
    SaveFile(accont,"ACC");
    printf("成功!!!\n");
}
void *Find(long long id,void *head,char *func) {
    if(strcmp(func,"STU")==0) {
        Class *p = (Class*)head;
        while(p->next&&p->next->id !=id)
            p = p->next;
        return p;
    } else {
        Identity *p = (Identity*)head;
        while(p->next&&p->next->id !=id)
            p = p->next;
        return p;
    }
}
void *readFile(char*func) {
    FILE* fp;
    if(strcmp(func,"STU")==0) {
        Class *head = (Class*)malloc(sizeof(Class));
        Class *p,*r = head;
        head->next = NULL;
        fp = fopen("student.txt", "ab+");
        while(1) {
            p=(Class*)malloc(sizeof(Class));
            if(fread(p,sizeof(Class)-sizeof(Class*),1,fp)) {
                r->next = p;
                r = p;
            } else
                break;
        }
        r->next = NULL;
        return head;
    } else {
        Identity *head = (Identity*)malloc(sizeof(Identity));
        Identity *p,*r = head;
        head->next = NULL;
        fp = fopen("accont.txt", "ab+");
        while(1) {
            p=(Identity*)malloc(sizeof(Identity));
            if(fread(p,sizeof(Identity)-sizeof(Identity*),1,fp)) {
                r->next = p;
                r = p;
            } else
                break;
        }
        r->next = NULL;
        return head;
    }
}

void SaveFile(void *head,char*func) {
    FILE *fp;
    if(strcmp(func,"STU")==0) {
        fp = fopen("student.txt","wb");
        Class* p = (Class*)head;
        while(p = p->next)
            fwrite(p,sizeof(*p)-sizeof(Class*),1,fp);
    } else {
        fp = fopen("accont.txt","wb");
        Identity* p = (Identity*)head;
        while(p = p->next)
            fwrite(p,sizeof(*p)-sizeof(Identity*),1,fp);
    }
    fclose(fp);
}

void GotuStudent(long long id,long long key,Identity* accont,Class*student) {   ///学生端
    int input;
    while(1) {
        Show("student");
        scanf("%d",&input);
        switch(input) {
        case 1:
            Show("splitter");
            Print(((Class*)(Find(id,student,"STU")))->next);
            break;
        case 2:
            Change(id,accont,"ACC");
            break;
        case 3:
            return;
        default:
            printf("输入有误");
        }
        system("pause");
    }
}

void GotoTeacher(long long id,long long key,Identity*accont,Class*student) {               ///教师端
    while(1) {
        Show("teacher");
        int input;
        scanf("%d",&input);
        switch(input) {
        case 1:
            Add(student,accont,"STU");
            break;
        case 2:
            Sort(student);
            ViewAll(student);
            break;
        case 3: {
            long long findId;
            printf("请输入查询的id:\n");
            scanf("%lld",&findId);
            Class* find = ((Class*)Find(findId,student,"STU"))->next;
            if(find) {
                Show("splitter");
                Print(find);
            } else
                printf("查无此人\n");
            break;
        }
        case 4: {
            long long changeId;
            printf("请输入修改的id:\n");
            scanf("%lld",&changeId);
            Change(changeId,student,"STU");
        }
        break;
        case 5: {
            long long deleteId;
            printf("请输入要删除的id:\n");
            scanf("%lld",&deleteId);
            Delete(deleteId,student,accont,"STU");
            break;
        }
        case 6:
            Change(id,accont,"ACC");
            break;
        case 7:
            return;
        default:
            printf("输入错误,请重新输入\n");
            Sleep(1000);
        }
        system("pause");
    }
}
void Admin(void *head) {
    while(1) {
        system("cls");
        Show("Admin");
        int input;
        scanf("%d",&input);
        switch(input) {
        case 1:
            Add(NULL,head,"ACC");
            break;
        case 2: {
            long long deleteId;
            printf("请输入要删除的id:\n");
            scanf("%lld",&deleteId);
            Delete(deleteId,NULL,head,"ACC");
            break;
        }
        case 3:
            return;
        case 4:
            Init();
            break;
        default:
            printf("输入有误\n");
        }
        system("pause");
    }
}
void Show(char *func) {
    system("cls");
    if(strcmp(func,"splitter")==0) {     ///Splitter
        printf("     id          姓名      c语言成绩      数学成绩      英语成绩     总分\n");
        printf("==========================================================================\n");
    } else if(strcmp(func,"teacher")==0) { ///Teacher;
        printf("┌───────────────────────────────────┐\n");
        printf("│           学生成绩管理系统        │\n");
        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("└───────────────────────────────────┘\n");
    } else if(strcmp(func,"student")==0) {
        printf("┌────────────────────────────────────┐\n");
        printf("│──────────学生成绩管理系统──────────│\n");
        printf("│────────────────────────────────────│\n");
        printf("│       查询自己成绩信息      -->1   │\n");
        printf("│       修改密码              -->2   │\n");
        printf("│       退出系统              -->3   │\n");
        printf("└────────────────────────────────────┘\n");
    } else if(strcmp(func,"Login")==0) {
        printf("┌────────────────────────────────────┐\n");
        printf("│──────────学生成绩管理系统──────────│\n");
        printf("│────────────────────────────────────│\n");
        printf("│请输入账号:                        │\n");
        printf("│────────────────────────────────────│\n");
        printf("│请输入密码:                        │ \n");
        printf("└────────────────────────────────────┘\n");
    } else if(strcmp(func,"Admin")==0) {
        printf("┌───────────────────────────────────┐\n");
        printf("│          学生成绩管理系统         │\n");
        printf("│              管理员端             │\n");
        printf("│───────────────────────────────────│\n");
        printf("│       添加教师账号          -->1  │\n");
        printf("│       删除教师账号          -->2  │\n");
        printf("│       退出系统              -->3  │\n");
        printf("│       重置系统              -->4  │\n");
        printf("└───────────────────────────────────┘\n");
    } else {      ///Load
        char loadR[] = {">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"};
        char loadL[] = {"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"};
        const int leng = sizeof(loadR)/sizeof(char);
        char *ploadR[leng+5],*ploadL[leng+5];
        int i;

        printf("\n\n");
        for(i=0;i<leng;i++){
            ploadR[i] = &loadR[i];
            ploadL[i] = &loadL[i];
        }
        for(i=1;i <= leng; i++) {
            printf("\r%50s    Loading %3d%%    %-50s",ploadL[leng-i],i*2,ploadR[leng-i]);
            Sleep(40);
        }
    printf("\n");
    }
}
void Init() {                           ///重置系统
    printf("请注意,该操作将会清空系统内所有信息!\n");
    Sleep(1000);
    printf("1.执行\n2.不执行\n");
    int flag;
    scanf("%d",&flag);
    if(flag==1) {
        FILE *fin = fopen("student.txt","w");
        FILE *fout = fopen("accont.txt","w");
        fclose(fin);
        fclose(fout);
        printf("重置成功!\n");
        Sleep(1000);
        return;
    } else if(flag==2)
        return;
    else
        printf("输入有误,默认返回\n");
    Sleep(1000);
    return;
}
void Sort(Class* head) {        ///冒泡,q,p为交换数据的前一个节点
    Class* p = head,*q;
    while(p->next){
        q = p;
        while(q = q->next){
            if(q->next&& p->next->allScore > q->next->allScore){
                Class *tmp = p->next;
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = tmp;
            }
        }
        p = p->next;
    }
}







posted @ 2018-04-19 21:30  秃头大师  阅读(328)  评论(0)    收藏  举报