学生综合测评系统

中国海洋大学高级程序语言程课设

题目要求:

2、学生综合测评系统

每个学生的信息为:学号、姓名、性别、联系电话、C语言、高等数学、外语三门单科成绩、考试平均成绩、考试名次、同学互评分、品德成绩、任课教师评分、综合测评总分、综合测评名次。考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%。

A、学生信息处理

(1) 输入学生信息、学号、姓名、性别、联系电话,按学号以小到大的顺序存入文件中。

提示:学生信息可先输入到数组中,排序后可写到文件中。

(2) 插入(修改)同学信息:

提示:先输入将插入的同学信息,然后再打开源文件并建立新文件,把源文件和输入的信息合并到新文件中(保持按学号有序)若存在该同学则将新记录内容替换源内容,

(3) 删除同学信息:

提示:输入将删除同学号,读出该同学信息,要求对此进行确认,以决定是否删除将删除后的信息写到文件中。

(4) 浏览学生信息:

提示:打开文件,显示该文件的学生信息。

B、学生数据处理:

(1) 按考试科目录入学生成绩并且按公式:考试成绩=(C语言+高等数学+外语)/3 计算考试成绩,并计算考试名次,提示:先把学生信息读入数组,然后按提示输入每科成绩,计算考试成绩,求出名次,最后把学生记录写入一个文件中。

(2) 学生测评数据输入并计算综合测评总分及名次。

提示:综合测评总分=(考试成绩)*0.6+(同学互评分)*0.1+品德成绩*0.1+任课老师评分*0.2。

(3) 学生数据管理

提示:输入学号,读出并显示该同学信息,输入新数据,将改后信息写入文件

(4) 学生数据查询:

提示:输入学号或其他信息,即读出所有数据信息,并显示出来。

C、学生综合信息输出

提示:输出学生信息到屏幕。

背景:小白独自从下午3点奋战到晚上11点的结果,可能很多地方写的不咋的,O(∩_∩)O哈哈~,记录一下把

代码:

#include<stdio.h>
#include<stdlib.h>
void mainMenu();//主菜单
void studentInformationInput();//学生信息输入
void Input();//学生信息输入
void rankOfExam();//考试成绩名次排序
void rankOfFinal();//综合测评名次排序
void input0returnMainMenu();//键0回主菜单
void studentInformationSearch();//学生信息查找
void studentInformationDelete();//学生信息删除
void studentInformationAdd();//学生信息增加
void studentInformationPrint();//学生信息输出
void fileOperation();//文件操作
void fileInput();//数据保存到文件
void filePrint();//文件中的数据输出
typedef struct student_data//学生的信息
{
   long long number;//学号直接以一个ll类型数据存储
   char name[10];//姓名就要以char类型的数组来存储
   char sex[10];
   char phoneNumber[20];//电话号码也以一个ll类型数据来存(毕竟学号和电话号码都以11位存储,位数足够)
   float gradeOfC;//C分
   float gradeOfMath;//数学分
   float gradeOfEnglish;//英语分
   float average;//平均分
   int rankOfExam;//按平均分计的名次
   float gradeOfClassmate;//同学互评分
   float gradeOfMorality;//品德分
   float gradeOfTeacher;//教师分
   float gradeOfFinal;//综合分
   int rankOfFinal;//按综合分计的名次
   struct student_data *next;//指向下一个学生节点的指针
}SD;
SD *head=NULL;//建立头指针
void input0returnMainMenu()
{
    int choose;
    scanf("%d",&choose);
    while(choose!=0)
    {
        printf("您的输入有误,请重新输入:");
        scanf("%d",&choose);
    }
    if(choose==0)mainMenu();
}
void rankOfExam()
{
    SD *p=head;
    float temp[100];
    int count=1;
    while(p!=NULL)
    {
        temp[count]=p->average;
        count++;
        p=p->next;
    }
    count--;
    for(int i =count-1;i>=1;i--)//从大到小进行冒泡排序
        for(int j =1;j<=i;j++)
            if(temp[j]<temp[j+1]){float tempP=temp[j];temp[j]=temp[j+1];temp[j+1]=tempP;}
    SD *p1=head;
    while(p1!=NULL)//for循环嵌套在内侧,这样是对每个节点都进行一次数组的遍历,如果分数相等,那么名次记录下来,立刻结束for循环
    {
        for(int i =1;i<=count;i++)
        if(p1->average==temp[i])
        {
            p1->rankOfExam=i;
            break;
        }
        p1=p1->next;
    }
}
void rankOfFinal()
{
    SD *p=head;
    float temp[100];
    int count=1;
    while(p!=NULL)
    {
        temp[count]=p->gradeOfFinal;
        count++;
        p=p->next;
    }
    count--;
    for(int i =count-1;i>=1;i--)//从大到小进行冒泡排序
        for(int j =1;j<=i;j++)
            if(temp[j]<temp[j+1]){float tempP=temp[j];temp[j]=temp[j+1];temp[j+1]=tempP;}
    SD *p1=head;
    while(p1!=NULL)//for循环嵌套在内侧,这样是对每个节点都进行一次数组的遍历,如果分数相等,那么名次记录下来,立刻结束for循环
    {
       for(int i =1;i<=count;i++)
       if(p1->gradeOfFinal==temp[i])
       {
         p1->rankOfFinal=i;
         break;
       }
         p1=p1->next;
     }
}
void mainMenu()//主页面函数
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    printf("\n\n\n\n\n");
    printf("\t\t\t-------------欢迎来到学生综合测评系统---------------\n"
           "\t\t\t-------------1-学生信息输入-----------------------\n"
           "\t\t\t-------------2-学生信息删除-----------------------\n"
           "\t\t\t-------------3-学生信息增加-----------------------\n"
           "\t\t\t-------------4-学生信息查找-----------------------\n"
           "\t\t\t-------------5-学生信息输出-----------------------\n"
           "\t\t\t-------------6-操作文件--------------------------\n"
           "\t\t\t-------------0-退出系统--------------------------\n\n"
           "\t\t\t-------------请输入数字编号进行选择------------------\n");
    int choose;
    scanf("%d",&choose);
    while(choose!=0&&choose!=1&&choose!=2&&choose!=3&&choose!=4&&choose!=5&&choose!=6)
    {
        printf("您的输入有误,请重新输入:\n");
        scanf("%d",&choose);
    }
    switch(choose)
    {
        case 1:studentInformationInput();break;
        case 2:studentInformationDelete();break;
        case 3:studentInformationAdd();break;
        case 4:studentInformationSearch();break;
        case 5:studentInformationPrint();break;
        case 6:fileOperation();break;
        case 0:printf("已经退出系统,感谢您的使用!\n");exit(0);
    }
}
void studentInformationInput()//学生信息输入函数
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    printf("\n\n\n\n\n");
    printf("\t\t\t-------------欢迎进行学生信息输入----------------------\n"
           "\t\t\t-------------1-学生信息输入-----------------------\n"
           "\t\t\t-------------0-返回主菜单----------------------------\n\n"
           "\t\t\t-------------请输入数字编号进行选择------------------\n"
           "\t\t\t-------------------------------\n");

    int choose;
    scanf("%d",&choose);
    while(choose!=0&&choose!=1)
    {
        printf("您的输入有误,请重新输入:\n");
        scanf("%d",&choose);
    }
    switch(choose)
    {
        case 1:Input();break;
        case 0:mainMenu();
    }

}
void Input()
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    if(head!=NULL)
    {
        printf("您之前已经在此输入过学生信息了,如果要修改学生信息,请到其他模块,请输入0以返回主菜单\n");
        input0returnMainMenu();
    }
    SD *s0=(SD*)malloc(sizeof(SD));
    head=s0;
    printf("请输入学生的学号,如果您的结束输入,请在学号处输入0\n"
           "学号的大小请务必按照从小到大的顺序排列,否则您可能要在主菜单的学生信息增加中执行您未输入的学生信息\n");
    scanf("%lld",&s0->number);
    printf("\n");
    while(s0->number!=0)
    {
        printf("请输入学生的姓名:");scanf("%s",s0->name);;
        printf("请输入学生的性别:");scanf("%s",s0->sex);
        printf("请输入学生的电话号码:");scanf("%s",s0->phoneNumber);
        printf("请输入学生的C语言的分数");scanf("%f",&s0->gradeOfC);
        printf("请输入学生的高数成绩:");scanf("%f",&s0->gradeOfMath);
        printf("请输入学生的英语成绩:");scanf("%f",&s0->gradeOfEnglish);
       s0->average=(s0->gradeOfC+s0->gradeOfMath+s0->gradeOfEnglish)/3.0;//计算平均分
       printf("请输入学生的同学互评分:");scanf("%f",&s0->gradeOfClassmate);
       printf("请输入学生的道德分数:");scanf("%f",&s0->gradeOfMorality);
       printf("请输入同学的教师评分:");scanf("%f",&s0->gradeOfTeacher);
       s0->gradeOfFinal=s0->average*0.6+s0->gradeOfClassmate*0.1+s0->gradeOfMorality*0.1+s0->gradeOfTeacher*0.2;//计算综测分
       printf("此名同学的信息已经输入完毕");
       SD *s1;
       s1=s0;
       s0=(SD*)malloc(sizeof(SD));
       s1->next=s0;
       printf("请输入学生学生的学号:");scanf("%lld",&s0->number);
       while(s0->number<=s1->number&&s0->number!=0){printf("您输入了一个和上一个学号相等或者比上一个学号更小的学号,这不符合规定,请重新输入:");scanf("%lld",&s0->number);}
       if(s0->number==0)s1->next=NULL;
    }
    rankOfExam();
    rankOfFinal();
    printf("因为您在学号处输入0,故系统认为您输入结束,请键入0返回主菜单");
   input0returnMainMenu();
}
void studentInformationSearch()//学生信息查找函数
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    rankOfExam();//在查找信息之前应该更新两个排名信息
    rankOfFinal();//
    int num;
    printf("请输入您想查找的学号:");scanf("%lld",&num);
    SD *p=head;
    while(p!=NULL)
    {
        if(p->number==num)break;
        p=p->next;
    }
    if(p==NULL){printf("查无此人,请按0返回主菜单");input0returnMainMenu();}
    printf("学号        姓名   性别  联系电话     C语言成绩  高数成绩  英语成绩  平均成绩  考试成绩名次     同学互评分    品德成绩  任课老师评分    综测成绩  综测成绩名次\n");
    printf("%-11lld%-7s%-5s%-12s",p->number,p->name,p->sex,p->phoneNumber);
    printf("%-11.2f%-9.2f%-9.2f%-9.2f%-13d",p->gradeOfC,p->gradeOfMath,p->gradeOfEnglish,p->average,p->rankOfExam);
    printf("%-11.2f%-9.2f%-13.2f%-9.2f%-12d\n",p->gradeOfClassmate,p->gradeOfMorality,p->gradeOfTeacher,p->gradeOfFinal,p->rankOfFinal);
    printf("这是这个学生的信息,您可以按0返回主菜单");input0returnMainMenu();
}
void studentInformationDelete()//学生信息删除函数
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    if(head==NULL)
    {
        printf("您还没有输入学生信息,请输入0到回到学生信息输入页面");
        int choose;
        scanf("%d",&choose);
        while(choose!=0)
        {
            printf("输入有误!请重新输入");
            scanf("%d",&choose);
        }
        if(choose==0)studentInformationInput();
    }
    printf("如果您想回到主菜单输入0,删除学生信息输入1");
    int choose;
    scanf("%d",&choose);
    while(choose!=0&&choose!=1)
    {
        printf("输入有误!请重新输入");
        scanf("%d",&choose);
    }
    if(choose==0)studentInformationInput();
    int num;
    printf("请输入您想删除的学生的学号:");
    scanf("%lld",&num);
    SD *p1,*p2;
    p1=head;
    while(num!=p1->number&&p1->next!=NULL)//在没有找到这个节点并且循环后p1还不是尾结点的时候,每循环一次后p2都是p1的上一个节点
    {
        p2=p1;p1=p1->next;
    }
    if(num==p1->number)
    {
        if(p1==head){head=p1->next;}
        else
        {
            p2->next=p1->next;//都含next,这样才会真正操作了链表
        }
        printf("已经删除此学生信息,请输入0回到主菜单");
        input0returnMainMenu();
    }
    else
    {
        printf("查无此人,按0重新输入");
        int choose;
        scanf("%d",&choose);
        while(choose!=0)
        {
            printf("输入有误!请重新输入");
            scanf("%d",&choose);
        }
        if(choose==0)studentInformationDelete();
    }

}
void studentInformationAdd()//学生信息增加函数
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    int num;
    printf("请输入您想增加的学生学号:");
    scanf("%lld",&num);
    SD *p1,*p2;
    p1=head;
    while(p1!=NULL)
    {
        if(p1->number==num)
        {
            printf("您好,输入的学号已经存在,请输入0重新输入");
            int choose;
            scanf("%d",&choose);
            while(choose!=0)
            {
                printf("输入不是0,请重新输入");
                scanf("%d",&choose);
            }
            if(choose==0);studentInformationAdd();
        }
        p1=p1->next;
    }
    SD *s0=(SD*)malloc(sizeof(SD));
    if(head==NULL){head=s0;s0->next=NULL;}//首先是头结点不存在的情况,那么就直接创建一个节点
    else//头结点存在的情况下
    {
       p1=head;
       while(p1->number<=num&&p1->next!=NULL)//p1的的学号小于等于输入的学号并且不是p1不是尾结点;循环停止有两个条件,1是p1的学号大于输入的学号,2是p是尾结点
       {
           p2=p1;p1=p1->next;
       }
       if(p1->number>num)//第一种情况,直接插入
       {
           if(p1==head){s0->next=head;head=s0;}
           else{p2->next=s0;s0->next=p1;}
       }
       else{p1->next=s0;s0->next=NULL;}//第二种情况是尾部插入
    }
   s0->number=num;
    printf("请输入学生的姓名:");scanf("%s",s0->name);;
    printf("请输入学生的性别:");scanf("%s",s0->sex);
    printf("请输入学生的电话号码:");scanf("%s",s0->phoneNumber);
    printf("请输入学生的C语言的分数");scanf("%f",&s0->gradeOfC);
    printf("请输入学生的高数成绩:");scanf("%f",&s0->gradeOfMath);
    printf("请输入学生的英语成绩:");scanf("%f",&s0->gradeOfEnglish);
    s0->average=(s0->gradeOfC+s0->gradeOfMath+s0->gradeOfEnglish)/3.0;//计算平均分
    printf("请输入学生的同学互评分:");scanf("%f",&s0->gradeOfClassmate);
    printf("请输入学生的道德分数:");scanf("%f",&s0->gradeOfMorality);
    printf("请输入同学的教师评分:");scanf("%f",&s0->gradeOfTeacher);
    s0->gradeOfFinal=s0->average*0.6+s0->gradeOfClassmate*0.1+s0->gradeOfMorality*0.1+s0->gradeOfTeacher*0.2;//计算综测分
    printf("此名同学的信息已经输入完毕,您可以输入0返回主菜单");input0returnMainMenu();
}
void studentInformationPrint()//学生信息打印函数
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    printf("\n\n\n\n\n");
    rankOfExam();//在打印之前应该更新两个排名信息
    rankOfFinal();
    printf("学号        姓名   性别  联系电话     C语言成绩  高数成绩  英语成绩  平均成绩  考试成绩名次     同学互评分    品德成绩  任课老师评分    综测成绩  综测成绩名次\n");
    SD *p=head;
    while(p!=NULL)
    {
        printf("%-11lld%-7s%-5s%-12s",p->number,p->name,p->sex,p->phoneNumber);
        printf("%-11.2f%-9.2f%-9.2f%-9.2f%-13d",p->gradeOfC,p->gradeOfMath,p->gradeOfEnglish,p->average,p->rankOfExam);
        printf("%-11.2f%-9.2f%-13.2f%-9.2f%-12d\n",p->gradeOfClassmate,p->gradeOfMorality,p->gradeOfTeacher,p->gradeOfFinal,p->rankOfFinal);
        p=p->next;
    }
    printf("如果您想回到主菜单,请输入0");
    input0returnMainMenu();
}
void fileOperation()
{
    system("cls");
    system("color 7A");//打印白底绿字
    system("date/t");//打印系统日期(注意date/t一体)
    system("time/t");//打印系统时间(具体)
    rankOfExam();//在文件操作之前应该更新两个排名信息
    rankOfFinal();//
    if(head==NULL){printf("头节点为空,好像没有输入任何数据,建议您按0返回主菜单输入数据");input0returnMainMenu();}
    printf("如果您想把数据保存进文件,请输入1\n");
    printf("如果您想把文件中的数据显示出来,请输入2\n");
    printf("如果您想返回主菜单,请输入0\n");
    int choose;
    scanf("%d",&choose);
    while(choose!=0&&choose!=1&&choose!=2)
    {
        printf("输入不合法,请重新输入");
        scanf("%d",&choose);
    }
    switch(choose)
    {
        case 1:fileInput();break;
        case 2:filePrint();break;
        case 0:mainMenu();
    }
}
void fileInput()
{
   FILE *fp;
   fp=fopen("C:\\Users\\FX\\Desktop\\data.txt","w+");
   SD *p=head;
   fprintf(fp,"学号        姓名   性别  联系电话     C语言成绩  高数成绩  英语成绩  平均成绩  考试成绩名次     同学互评分    品德成绩  任课老师评分    综测成绩  综测成绩名次\n");
   while(p!=NULL)
   {
       fprintf(fp,"%-11lld%-7s%-5s%-12s",p->number,p->name,p->sex,p->phoneNumber);
       fprintf(fp,"%-11.2f%-9.2f%-9.2f%-9.2f%-13d",p->gradeOfC,p->gradeOfMath,p->gradeOfEnglish,p->average,p->rankOfExam);
       fprintf(fp,"%-11.2f%-9.2f%-13.2f%-9.2f%-12d\n",p->gradeOfClassmate,p->gradeOfMorality,p->gradeOfTeacher,p->gradeOfFinal,p->rankOfFinal);
       p = p->next;
   }
   fclose(fp);
   printf("您已保存完毕,如果想返回主菜单请键入1,如果您想返回上一级,请键入2");
   int choose;scanf("%d",&choose);
   while(choose!=1&&choose!=2)
   {
       printf("输入不合法,请重新输入");
       scanf("%d",&choose);
   }
   switch(choose)
   {
       case 1:mainMenu();break;
       case 2:fileOperation();
   }

}
void filePrint()
{
   FILE *fp;
   fp=fopen("C:\\Users\\FX\\Desktop\\data.txt","r");
   char s[1000];
   while(fgets(s,1000,fp)!=NULL)
   {
       printf("%s\n",s);
   }
   fclose(fp);
   printf("您已读取完毕,如果想返回主菜单请键入1,如果您想返回上一级,请键入2");
   int choose;scanf("%d",&choose);
   while(choose!=1&&choose!=2)
   {
       printf("输入不合法,请重新输入");
       scanf("%d",&choose);
   }
   switch(choose)
   {
       case 1:mainMenu();break;
       case 2:fileOperation();
   }
}
int main()
{
    setbuf(stdout,NULL);
    system("pause");//暂停缓冲一下
    mainMenu();//调用主页面
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值