中国海洋大学高级程序语言程课设
题目要求:
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();//调用主页面
}