码迷,mamicode.com
首页 > 其他好文 > 详细

学生成绩管理系统

时间:2015-05-15 15:12:53      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N sizeof(struct st)
#define M 100
#define FORMAT "%s   %s   %d   %d   %d\n",snum,name,math,english,physics

struct st{
        char snum[11];
        char name[11];
        int math;
        int english;
        int physics;
        struct st *next;
    };
struct st *head;                        //头指针
char filename[11];                      //文件名
void creat_user(void);                  //创建账户
void entry(void);                       //登录账户
void input_txt(struct st *head);        //存储进文件
void insert_im(struct st *head);        //按学号顺序插入信息
struct st *creat(void);                 //创建链表
void inquiry(struct st *head);          //按学号查询函数
void inquiry_by_name(struct st *head);  //按姓名查询函数
void delete1(struct st *head);          //按学号删除链表结点
void display(struct st *head);          //打印函数
int num(struct st *head);               //学生的个数
void _sort(struct st *head);            //排序并输入存储于新文件
void revise_by_snum(struct st *head);   //根据学号修改学生成绩
void revise_by_name(struct st *head);   //根据姓名修改学生成绩
void display_by_sort(struct st *head);  //按平均成绩打印学生信息
void census_of_math(struct st *head);   //统计数学成绩大于多少分学生的信息
void census_of_english(struct st *head);//统计英语成绩大于多少分学生的信息
void census_of_physics(struct st *head);//统计物理成绩大于多少分学生的信息
void rate(struct st *head);             //各科成绩及格的比率
void free_of_link(struct st *head);     //清除链表
void read_file(void);                   //读取文件信息
void about_this_software(void);         //关于此软件的信息
void interface1(void);                  //界面1
void quit(void);                        //退出
void interface2(void);                  //界面2
void interface3(void);                  //界面3
void interface4(void);                  //界面4

/*
 *界面函数
 */
#include "1.c"
#include "3.c"
void interface1(void)                  //界面1
{
    while(1){
    int x;
    printf("\n****************************************\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("10、存储进文件                         *\n");
    printf("11、按学号删除链表结点                 *\n");
    printf("12、按平均成绩打印学生信息             *\n");
    printf("13、读取我的文件信息                   *\n");
    printf("14、关于此软件                         *\n");
    printf("15、退出程序                           *\n");
    printf("****************************************\n");
    printf("PS:要使用2—12功能必须先创建链表\n");
    printf("请根据菜单选择您要使用的功能:");
    scanf("%d",&x);
    while(1)
    {
        if(x<1||x>15)
        {
            printf("输入有误,请重新输入:");
            scanf("%d",&x);
        }
        if(x>=1&&x<=15)
            break;
    }
    switch(x)
    {
        case 1:head=creat();break;
        case 2:display(head);break;
        case 3:interface2();break;
        case 4:_sort(head);break;
        case 5:interface3();break;
        case 6:interface4();break;
        case 7:rate(head);break;
        case 8:free_of_link(head);break;
        case 9:insert_im(head);break;
        case 10:input_txt(head);break;
        case 11:delete1(head);break;
        case 12:display_by_sort(head);break;
        case 13:read_file();break;
        case 14:about_this_software();break;
        case 15:quit();break;
    }
}
}


void interface2(void)
{
     int x;
     printf("****************************************\n");
     printf("1、按学号查询学生成绩                  *\n");
     printf("2、按姓名查询学生成绩                  *\n");
     printf("3、返回主菜单                          *\n");
     printf("****************************************\n");
     printf("请根据子菜单选择您要使用的功能:");
     scanf("%d",&x);
     while(1)
     {
        if(x<1||x>3)
        {

            printf("输入有误,请重新输入:");
            scanf("%d",&x);
        }
        if(x==1||x==2||x==3)
            break;
     }
    switch(x)
    {
        case 1:inquiry(head);interface2();break;
        case 2:inquiry_by_name(head);interface2();break;
        case 3:interface1();break;
    }
}


void interface3(void)
{
    int x;
    printf("****************************************\n");
    printf("1、根据学号修改学生成绩                *\n");
    printf("2、根据姓名修改学生成绩                *\n");
    printf("3、返回主菜单                          *\n");
    printf("****************************************\n");
    printf("请根据子菜单选择您要使用的功能:");
    scanf("%d",&x);
    while(1)
    {
        if(x>3||x<1)
        {
            printf("输入有误,请重新输入:");
            scanf("%d",&x);
        }
        if(x>=1&&x<=3)
            break;
    }
    switch(x)
    {
        case 1:revise_by_snum(head);interface3();break;
        case 2:revise_by_name(head);interface3();break;
        case 3:interface1();break;
    }
}


void interface4(void)
{
    int x;
    printf("*******************************************\n");
    printf("1、统计数学成绩大于60分的人数比           *\n");
    printf("2、统计英语成绩大于60分的人数比           *\n");
    printf("3、统计物理成绩大于60分的人数比           *\n");
    printf("4、返回主菜单                             *\n");
    printf("*******************************************\n");
    printf("请根据子菜单选择您要使用的功能:");
        scanf("%d",&x);
    while(1)
    {
        if(x>4||x<1)
        {
            printf("输入有误,请重新输入:");
            scanf("%d",&x);
        }
        if(x<=4&&x>=1)
            break;
     }
    switch(x)
    {
        case 1:census_of_math(head);interface4();break;
        case 2:census_of_english(head);interface4();break;
        case 3:census_of_physics(head);interface4();break;
        case 4:interface1();break;
    }

}

/*
 *各种函数
 */
#include "4.c"
void quit()
{
    exit(1);
}

void about_this_software(void)
{
    printf("*****************************\n");
    printf("名称:学生成绩管理系统      *\n");
    printf("制作人:WT                  *\n");
    printf("制作日期:2015年3月25日     *\n");
    printf("*****************************\n");
    getchar();
}


void creat_user(void)    //创建账户
{
    int i=0,j;
    FILE *fp;
    char user[20],password[20],unpassword[20],ch;
    fp=fopen("e:\\user.txt","a+");
    printf("请输入用户名(用户名必须是7位):");
    scanf("%s",user);
    while(1)
    {
        if(strlen(user)>7)
        {
            fflush(stdin);
            printf("输入有误,请重新输入:");
            scanf("%s",user);
        }
        if(strlen(user)<=7)
            break;
    }
    fputs(user,fp);
    fputc(\n,fp);
    fflush(stdin);
    printf("请输入密码(密码必须是7位):");
    ch=getch();
    while ( (ch & 0xff) != 13)  //输入字符ch不为Carriage Return
    {
        if ( (ch & 0xff) == 8)  //输入字符ch为Back Space
        {
            printf("%c %c",ch,ch);
            i--;
        }
        else
        {
            printf("*");
            password[i] = ch;
            i++;
        }

        ch = getch(); //继续输入字符ch
    }
    password[i]=\0;
    i=0;
    while(1)
    {
         if(strlen(password)>7)
         {
            fflush(stdin);
            printf("\n输入有误,请重新输入:");
                ch=getch();
    while ( (ch & 0xff) != 13)
    {
        if ( (ch & 0xff) == 8)
        {
            printf("%c %c",ch,ch);
            i--;
        }
        else
        {
            printf("*");;
            password[i] = ch;
            i++;
        }
        ch=getch(); //继续输入字符ch
    }
        password[i]=\0;
            getch();
                if(strlen(password)<=7)
                    break;
           }
      if(strlen(password)<=7)
        break;
    }
    for(i=0;i<7;i++)
       unpassword[i]=password[i];
    for(i=0;i<7;i++)                //加密
        password[i]=unpassword[6-i];
    password[7]=0;
    fputs(password,fp);
    fputc(\n,fp);
    fclose(fp);
    printf("\n创建账户成功\n");
}


void entry(void)            //登录账户
{
    FILE *fp;
    int n=0,i=0,j;
    char user[20],password[20],temp[20],unpassword[20],ch;
    fp=fopen("e:\\user.txt","r");
    printf("请输入用户名(用户名必须是7位):");
    fflush(stdin);
    scanf("%s",user);
    while(1)
    {
        if(strlen(user)>7)
        {
            fflush(stdin);
            printf("\n输入有误,请重新输入:");
            scanf("%s",user);
        }
         if(strlen(user)<=7)
         {
            rewind(fp);
            while(fgets(temp,8,fp)!=NULL)
            {
                if(strcmp(user,temp)==0)
                {
                    i=1;
                    break;
                }
                fgetc(fp);

            }
            if(i==0)
            {
                printf("账号不存在,请重新输入:");
                scanf("%s",user);
                while(1)
                {
                    if(strlen(user)>7)
                    {
                            fflush(stdin);
                            printf("\n输入有误,请重新输入:");
                            scanf("%s",user);
                    }
                    if(strlen(user)<=7)
                        break;
                }
            }
        }
   if(i==1)
    break;
}

    while(1)
    {
        if(strcmp(temp,user)==0)
         {
            fgetc(fp);
            fflush(stdin);
            printf("\n请输入密码(密码必须是7位):");
            i=0;
            ch=getch();
            while ( (ch & 0xff) != 13)  //输入字符ch不为Carriage Return
            {
                if ( (ch & 0xff) == 8)  //输入字符ch为Back Space
                {
                    printf("%c %c",ch,ch);
                    i--;
                }
                else
                {
                    printf("*");;
                    password[i] = ch;
                    i++;
                }
                ch = getch(); //继续输入字符ch
            }
            password[i]=\0;
        //     getchar();
            i=0;
            if(strlen(password)>7)
            {
                   // printf("\n");
                    printf("\n密码有误,请重新输入:");
                    ch=getch();
                   while ( (ch & 0xff) != 13)  //输入字符ch不为Carriage Return
                    {
                        if ( (ch & 0xff) == 8)  //输入字符ch为Back Space
                        {
                            printf("%c %c",ch,ch);
                            i--;
                        }
                        else
                        {
                            printf("*");;
                            password[i] = ch;
                            i++;
                        }

                        ch = getch(); //继续输入字符ch
                    }
                    password[i]=\0;
            }
                   //  getchar();
            if(strlen(password)>7)
                n++;
            if(n>4)
            {
                printf("密码输入错误很多次,程序自动结束");
                exit(1);
            }
         }
            for(i=0;i<7;i++)
                unpassword[i]=password[i];
            for(i=0;i<7;i++)                      //解密
                password[i]=unpassword[6-i];
            password[7]=0;
            if(strcmp(password,fgets(temp,8,fp))==0)
                interface1();
    }         //while
}



void read_file(void)
{
    char array1[100];
    char snum[11];
    char name[11];
    int math;
    int english;
    int physics;
    FILE *fp;
    fp=fopen(filename,"r");
    if(fp==NULL)
    {
        printf("文件打开失败");
        getchar();
        exit(1);
    }
    fgets(array1,100,fp);
    printf("%s",array1);
    while(1)
    {

        fscanf(fp,"%s    %s   %d   %d   %d",snum,name,&math,&english,&physics);
        fgetc(fp);
        if(feof(fp)!=0)
        break;
        printf(FORMAT);
    }
}


struct st *creat(void)       //创建链表
{
    int i=1,n;
    struct st *p1,*p2;
    printf("请输入学生的人数:");
    scanf("%d",&n);
    p1=head=(struct st *)malloc(N);
    printf("请按次序输入学生的学号,姓名,数学成绩,英语成绩,物理成绩(用空格隔开):");
    p2=(struct st *)malloc(N);
    scanf("%s%s%d%d%d",p2->snum,p2->name,&p2->math,&p2->english,&p2->physics);
    while(i<n)
    {
        p1->next=p2;
        p1=p2;
        p2=(struct st *)malloc(N);
        printf("请按次序输入学生的学号,姓名,数学成绩,英语成绩,物理成绩(用空格隔开):");
        scanf("%s%s%d%d%d",p2->snum,p2->name,&p2->math,&p2->english,&p2->physics);
        i++; //人数变化量
    }
    p1->next=p2;
    p2->next=NULL;
    printf("创建链表成功\n");
    getchar();
    getchar();
    return head;
}


void input_txt(struct st *head)   //创建存储文件并将学生成绩输入存储
{
    FILE *fp;
    struct st *p;
    getchar();
    printf("请输入文件路径及文件名:");
    scanf("%[^\n]",filename);
    fp=fopen(filename,"w");
    if(fp==NULL)
    {
        printf("文件创建失败");
        getchar();
        exit(1);
    }
    p=head->next;
    fputs("学号 姓名 数学 英语 物理\n",fp);
    while(p!=NULL)
    {
        fprintf(fp,"%s    %s   %d   %d   %d\n",p->snum,p->name,p->math,p->english,p->physics);
        p=p->next;
    }
    printf("存储成功\n");
    fclose(fp);
    getchar();
}


void inquiry(struct st *head)    //按学号查询函数
{
    struct st *p;
    char no[11];
    int i=0;
    fflush(stdin);
    printf("请输入学号:");
    scanf("%[^\n]",no);
    p=head->next;
    while(p!=NULL)
    {
        if(strcmp(no,p->snum)==0)
        {
            i=1;
            printf("学号:%s  姓名:%s  数学:%d  英语:%d  物理:%d\n",p->snum,p->name,p->math,p->english,p->physics);
        }
    p=p->next;
    }
    if(i==0)
    printf("未查询到此学号\n");
    getchar();
}


void inquiry_by_name(struct st *head)    //按照姓名查询成绩
{
    struct st *p;
    char name[11];
    int i=0;
    fflush(stdin);
    printf("请输入姓名:");
    scanf("%[^\n]",name);
    p=head->next;
    while(p!=NULL)
    {
        if(strcmp(name,p->name)==0)
        {
            i=1;
            printf("学号:%s  姓名:%s  数学:%d  英语:%d  物理:%d\n",p->snum,p->name,p->math,p->english,p->physics);
        }
        p=p->next;
    }
    if(i==0)
    printf("未查询到此姓名\n");
    getchar();
}


void delete1(struct st *head)  //删除
{
    struct st *p,*p2=head;
    int i=0;
    char snum[11];
    printf("请输入要删除的学生成绩的学号:");
    scanf("%s",snum);
    p=head->next;
    while(p!=NULL)
    {
        if(strcmp(snum,p->snum)==0)
        {
            i=1;
            p2->next=p->next;
            free(p);
            return;
        }
    p2=p;
    p=p->next;
    }
    if(i==0)
    printf("出错,输入的学号有误\n");
    getchar();
}


void display(struct st *head)       //打印函数
{
    struct st *p=head;
    while(p->next!=NULL)
    {
        p=p->next;
        printf("学号:%s 姓名:%s 数学:%d 英语:%d 物理:%d\n",p->snum,p->name,p->math,p->english,p->physics);
    }
    getchar();
    getchar();
}


int num(struct st *head)  //学生的个数
{
    struct st *p=head;
    int i=0;
    p=p->next;
    while(p!=NULL)
    {
        i++;
        p=p->next;
    }
    return i;
}


void _sort(struct st *head)    //排序并输入存储于新文件
{
    FILE *fp;
    struct st s[M],temp,*p=head;
    int i=0,j,n=num(head);
    double  ave[M],t;
    char filename1[11];
    p=p->next;
    while(p!=NULL)
    {
        strcpy(s[i].snum,p->snum);
        strcpy(s[i].name,p->name);
        s[i].math=p->math;
        s[i].english=p->english;
        s[i].physics=p->physics;
        i++;
        p=p->next;
    }
    for(i=0;i<n;i++)
        ave[i]=(s[i].math+s[i].english+s[i].physics)/3.0;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-1-i;j++)
            if(ave[j]<ave[j+1])
            {
                temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
                t=ave[j];
                ave[j]=ave[j+1];
                ave[j+1]=t;
            }
    printf("请输入要存储的文件名:");
    getchar();
    scanf("%[^\n]",filename1);
    fp=fopen(filename,"w");
    if(fp==NULL)
    {
        printf("文件未创建成功");
        getchar();
        exit(1);
    }
    fputs("学号 姓名 数学 英语 物理\n",fp);
    for(i=0;i<n;i++)
        fprintf(fp,"%s    %s   %d   %d   %d\n",s[i].snum,s[i].name,s[i].math,s[i].english,s[i].physics);
    printf("存储成功\n");
    getchar();
}


void revise_by_snum(struct st *head)    //根据学号修改学生成绩
{
    struct st *p=head;
    char no[11];
    fflush(stdin);
    printf("请输入要修改成绩学生的学号:");
    scanf("%[^\n]",no);
    p=p->next;
    while(p!=NULL)
    {
        if(strcmp(no,p->snum)==0)
    {
        fflush(stdin);
        printf("是否修改此学生的数学成绩(y/n):");
        if(getchar()==y)
        {
            printf("请输入数学成绩:");
            scanf("%d",&p->math);
            printf("%d",p->math);
            printf("修改成功\n");
        }
        printf("是否修改此学生的英语成绩(y/n):");
        fflush(stdin);
        if(getchar()==y)
        {
            printf("请输入英语成绩:");
            scanf("%d",&p->english);
            printf("修改成功\n");
        }
        printf("是否修改此学生的物理成绩(y/n):");
        fflush(stdin);
        if(getchar()==y)
        {
            printf("请输入物理成绩:");
            scanf("%d",&p->physics);
            printf("修改成功\n");
        }
    }
    p=p->next;
}
    getchar();
}


void revise_by_name(struct st *head)    //根据学号修改学生成绩
{
    struct st *p=head;
    char name[11];
    fflush(stdin);
    printf("请输入要修改成绩学生的姓名:");
    scanf("%[^\n]",name);
    p=p->next;
    while(p!=NULL)
    {
    if(strcmp(name,p->name)==0)
    {
        printf("是否修改此学生的数学成绩(y/n):");
        if(getchar()==y)
    {
        printf("请输入数学成绩:");
        scanf("%d",&p->math);
        printf("修改成功\n");
    }
    printf("是否修改此学生的英语成绩(y/n):");
    fflush(stdin);
    if(getchar()==y)
    {
        printf("请输入英语成绩:");
        scanf("%d",&p->english);
        printf("修改成功\n");
    }
    printf("是否修改此学生的物理成绩(y/n):");
    fflush(stdin);
    if(getchar()==y)
    {
        printf("请输入物理成绩:");
        scanf("%d",&p->physics);
        printf("修改成功\n");
    }
}
    p=p->next;
}
    getchar();
}


void display_by_sort(struct st *head)
{
    struct st s[M],temp,*p=head;
    int i=0,j,n=num(head),k;
    double ave[M],t;
    p=p->next;
    while(p!=NULL)
    {
        strcpy(s[i].snum,p->snum);
        strcpy(s[i].name,p->name);
        s[i].math=p->math;
        s[i].english=p->english;
        s[i].physics=p->physics;
        i++;
        p=p->next;
    }
    for(i=0;i<n;i++)
        ave[i]=(s[i].math+s[i].english+s[i].physics)/3.0;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-1-i;j++)
            if(ave[j]<ave[j+1])
            {
                temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
                t=ave[j];
                ave[j]=ave[j+1];
                ave[j+1]=t;
            }
    printf("要查询第几名学生的成绩:");
    scanf("%d",&k);
    printf("学号:%s  姓名:%s  数学:%d  英语:%d  物理:%d\n",s[k-1].snum,s[k-1].name,s[k-1].math,s[k-1].english,s[k-1].physics);
    getchar();
}


void census_of_math(struct st *head)  //统计数学成绩大于多少分学生的信息
{
    struct st *p=head;
    int  score;
    p=p->next;
    printf("请输入统计学生数学成绩的最低分数:");
    scanf("%d",&score);
    while(p!=NULL)
    {
        if(p->math>=score)
            printf("数学成绩:%d\n",p->math);
        p=p->next;
}
    getchar();
}


void census_of_english(struct st *head)  //统计英语成绩大于多少分学生的信息
{
    struct st *p=head;
    int score;
    p=p->next;
    printf("请输入统计学生英语成绩的最低分数:");
    scanf("%d",&score);
    while(p!=NULL)
    {
        if(p->english>=score)
            printf("英语成绩:%d\n",p->english);
        p=p->next;
    }
    getchar();
}


void census_of_physics(struct st *head)  //统计物理成绩大于多少分学生的信息
{
    struct st *p=head;
    int score;
    p=p->next;
    printf("请输入统计学生物理成绩的最低分数:");
    scanf("%d",&score);
    while(p!=NULL)
    {
        if(p->physics>=score)
        printf("物理成绩:%d\n",p->physics);
        p=p->next;
    }
    getchar();
}


void rate(struct st *head)   //各科成绩及格的比率
{
    struct st *p=head;
    int i=0,rate_of_math=0,rate_of_english=0,rate_of_physics=0,rate_of_ave=0,n=num(head);
    double ave;
    p=p->next;
    while(p!=NULL)
    {
        if((ave=(p->math+p->english+p->physics)/3.0)>=60.0)
            rate_of_ave++;
        if(p->english>=60)
            rate_of_english++;
        if(p->physics>=60)
            rate_of_physics++;
        p=p->next;
    }
    printf("平均分大于60的人数占%%%f\n数学成绩大于60的人数占%%%f\n英语成绩大于60的人数占%%%f\n物理成绩大于60的人数占%%%f\n",rate_of_ave*1.0/n,rate_of_math*1.0/n,rate_of_english*1.0/n,rate_of_physics*1.0/n);
    getchar();
}


void free_of_link(struct st *head)
{
    struct st *p,*p2=head;
    p=head->next;
    while(p!=NULL)
    {
        p=p2->next;
        free(p2);
        p2=p;
    }
    printf("清除链表成功\n");
    getchar();
}


void insert_im(struct st *head)      //按学号顺序插入信息
{
    struct st *p=(struct st *)malloc(N),*p2=head;
    printf("请按次序输入学生的学号,姓名,数学成绩,英语成绩,物理成绩(用空格隔开):");
    scanf("%s%s%d%d%d",p->snum,p->name,&p->math,&p->english,&p->physics);
    while(p2->next!=NULL&&strcmp(p2->next->snum,p->snum)<0)
        p2=p2->next;
    p->next=p2->next;
    p2->next=p;
    printf("插入成功\n");
    getchar();
    getchar();
}

    //#include "4.c"  //界面
#include "5.c"  //函数

int main()
{
 //   system("color A");
    creat_user();
    entry();
    return 0;
}

这也是自己写的一个小项目吧,因为自己写了makefile,可能文件包含有点看不懂,各位看官就将就着看吧

学生成绩管理系统

标签:

原文地址:http://www.cnblogs.com/s742780906/p/4505866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!