#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*
注:快排等高效率排序写不起 老卡死 以下排序都说选择排序
还有很多功能可写
期末成绩录入与读取 由学生结构体来写
int cal_how_many_data_in_txt();//计算文件数据个数
读取 void fetch();//由文件传递已有数据 该程序将自动读取
void entry();//由结构体数据传入文件储存
1.排序 void sort_low_to_high();从低到高
2.排序 void sort_high_to_low();//包含多种形式排序 具体由该函数实现 从高到低
3.增加 void add();
4.删除 void delete_data();
5.更新 void updata();
6.显示 void show_data();
7.查找 void find();//包含多种形式查找 具体由该函数实现 二分查找
8.菜单显示 void show_menu();
9.排序 void sort_due_to_data();//按所选学生信息排序 如 姓名 学号 班级 专业
0.退出
student* auto_expand_data(student*);//扩展数据个数
student* set();//建立学生信息结构体
*/
static int BEGIN=20;//起始数目 这个将会随数据个数而变化
static int size=0;//数据个数
const int BEISHU=3;//扩展用的倍数 水平有限只能先这样
struct student{
double score[5];//包含高数 英语 面向对象 物理 思修
double credit[5];//每门学分 这个由分数决定
char* name;//姓名
char* student_id;//学号
char* student_class;//学生班级
char* student_major;//学生专业
};
int cal_how_many_data_in_txt();//计算文件数据个数
void fetch(student*);//由文件传递已有数据 该程序将自动读取
void entry(student*);//由结构体数据传入文件储存
void sort_low_to_high(student*);//包含多种形式排序 具体由该函数实现 从低到高排序
void sort_high_to_low(student*);//包含多种形式排序 具体由该函数实现 从高到低排序
void sort_due_to_data(student*);//按所选学生信息排序 如 姓名 学号 班级 专业
void add(student*);//增加记录
void delete_data(student*);//删除记录
void update(student*); //更新记录
void show_data(student*);//显示数据
int find(student*);//包含多种形式查找 具体由该函数实现 二分查找
void sort(student*);//辅助find()二分查找
void show_menu();//显示菜单
student* set();//建立学生信息结构体
student* auto_expand_data(student*);//扩展数据个数
int main()
{
student* data=set();
show_menu();
int select,flag=0;
if(cal_how_many_data_in_txt())
flag=1;
while(1){
printf("choice your select:");
scanf("%d",&select);
if(select==0){
printf("退出学生成绩系统成功!\n");
break;
}
if(select==3){
add(data);
flag=1;
}
if(flag){
if(select==1)
sort_low_to_high(data);
if(select==2)
sort_high_to_low(data);
if(select==4)
delete_data(data);
if(select==5)
update(data);
if(select==6)
show_data(data);
if(select==7)
find(data);
if(select==8)
show_menu();
if(select==9)
sort_due_to_data(data);
}else
printf("无数据存在,请增加数据再进行此类操作!\n");
}
entry(data);
return 0;
}
void show_menu(){
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("0.退出\n");
}
void fetch(student* data){//由文件传递已有数据 该程序将自动读取
FILE *fp = NULL;
fp = fopen("test.txt", "r");
int count=cal_how_many_data_in_txt();
printf("自动为您读取%d条数据\n",count);
for(;size<count;size++){
//以下free不free没区别 局部
data[size].name=(char*)malloc(10*sizeof(char));
data[size].student_id=(char*)malloc(20*sizeof(char));
data[size].student_class=(char*)malloc(15*sizeof(char));
data[size].student_major=(char*)malloc(15*sizeof(char));
fscanf(fp, "%s %s %s %s", data[size].name,data[size].student_id,data[size].student_class,data[size].student_major);
fscanf(fp,"%lf %lf %lf %lf %lf",&data[size].score[0],&data[size].score[1],&data[size].score[2],&data[size].score[3],&data[size].score[4]);
fscanf(fp,"%lf %lf %lf %lf %lf",&data[size].credit[0],&data[size].credit[1],&data[size].credit[2],&data[size].credit[3],&data[size].credit[4]);
}
fclose(fp);
}
void sort_due_to_data(student* data){//按所选学生信息排序 如 姓名 学号 班级 专业
int select;
printf("选择你要以什么为依据排序:1.姓名;2.学号;3.班级;4.专业:");
scanf("%d",&select);
if(select==1)
for(int i=0;i<size-1;i++){
int k=i;
for(int j=i+1;j<size;j++){
if(strcmp(data[k].name,data[j].name)>0)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
else if(select==2)
for(int i=0;i<size-1;i++){
int k=i;
for(int j=i+1;j<size;j++){
if(strcmp(data[k].student_id,data[j].student_id)>0)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
else if(select==3)
for(int i=0;i<size-1;i++){
int k=i;
for(int j=i+1;j<size;j++){
if(strcmp(data[k].student_class,data[j].student_class)>0)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
else if(select==4)
for(int i=0;i<size-1;i++){
int k=i;
for(int j=i+1;j<size;j++){
if(strcmp(data[k].student_major,data[j].student_major)>0)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
printf("排序成功!\n");
}
void sort(student* data){//辅助find()二分查找
for(int i=0;i<size-1;i++){
int k=i;
for(int j=i+1;j<size;j++){
if(strcmp(data[k].name,data[j].name)>0)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
/*
快排怎么死了。。。。 mdzz
student temp=data[l];
int i=l,j=r;
if(l>=r)
return;
while(i!=j){
while(i<j&&strcmp(data[j].name,temp.name)>0) j--;
if(i<j)
data[i]=data[j];
while(i<j&&strcmp(data[i].name,temp.name)<0) i++;
if(i<j)
data[j]=data[i];
}
data[i]=temp;
sort(data,l,i-1);
sort(data,i+1,r);*/
}
void entry(student* data){//由结构体数据传入文件储存 水平有限只能这样写
FILE *fp = NULL;
fp = fopen("test.txt", "r");
fclose(fp);
fp = fopen("test.txt", "w+");
for(int i=0;i<size;i++){
fprintf(fp,"%s %s %s %s\n", data[i].name,data[i].student_id,data[i].student_class,data[i].student_major);
fprintf(fp,"%lf %lf %lf %lf %lf\n",data[i].score[0],data[i].score[1],data[i].score[2],data[i].score[3],data[i].score[4]);
fprintf(fp,"%lf %lf %lf %lf %lf\n",data[i].credit[0],data[i].credit[1],data[i].credit[2],data[i].credit[3],data[i].credit[4]);
}
fclose(fp);
printf("自动为您储存%d条数据(详细请看test文档)\n",size);
}
void sort_low_to_high(student* data){//包含多种形式排序 具体由该函数实现 低到高排序
int select;
printf("选择你要按什么排序:1.高数成绩;2.英语成绩;3.面向对象成绩;4.思修成绩;5.物理成绩;6.总分;");
scanf("%d",&select);
if(select==6){
for(int i=0;i<size-1;i++){
int k=i;
double sum1=data[i].score[0]+data[i].score[1]+data[i].score[2]+data[i].score[3]+data[i].score[4];
for(int j=i+1;j<size;j++){
double sum2=data[j].score[0]+data[j].score[1]+data[j].score[2]+data[j].score[3]+data[j].score[4];
if(sum1>sum2)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
}else{
select--;
for(int i=0;i<size-1;i++){
int k=i;
double sum1=data[i].score[select];
for(int j=i+1;j<size;j++){
double sum2=data[j].score[select];
if(sum1>sum2)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
}
printf("排序成功!\n");
}
void sort_high_to_low(student* data){//从高到低排序
int select;
printf("选择你要按什么排序:1.高数成绩;2.英语成绩;3.面向对象成绩;4.思修成绩;5.物理成绩;6.总分;");
scanf("%d",&select);
if(select==6){
for(int i=0;i<size-1;i++){
int k=i;
double sum1=data[i].score[0]+data[i].score[1]+data[i].score[2]+data[i].score[3]+data[i].score[4];
for(int j=i+1;j<size;j++){
double sum2=data[j].score[0]+data[j].score[1]+data[j].score[2]+data[j].score[3]+data[j].score[4];
if(sum1<sum2)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
}else{
select--;
for(int i=0;i<size-1;i++){
int k=i;
double sum1=data[i].score[select];
for(int j=i+1;j<size;j++){
double sum2=data[j].score[select];
if(sum1<sum2)
k=j;
}
if(k!=i){
student temp=data[k];
data[k]=data[i];
data[i]=temp;
}
}
}
printf("排序成功!\n");
}
void add(student* data){
char flag;//判断是否继续添加数据
while(1){
printf("依次输入姓名 学号 班级 专业 5门分数(依次为高数 英语 面向对象 思修 物理):\n");
data[size].name=(char*)malloc(10*sizeof(char));
data[size].student_id=(char*)malloc(20*sizeof(char));
data[size].student_class=(char*)malloc(15*sizeof(char));
data[size].student_major=(char*)malloc(15*sizeof(char));
scanf("%s %s %s %s",data[size].name,data[size].student_id,data[size].student_class,data[size].student_major);
for(int i=0;i<5;i++){
scanf("%lf",&data[size].score[i]);
if(data[size].score[i]>=90)
data[size].credit[i]=5;
else if(data[size].score[i]>=80)
data[size].credit[i]=4;
else if(data[size].score[i]>=70)
data[size].credit[i]=3;
else if(data[size].score[i]>=60)
data[size].credit[i]=2;
else
data[size].credit[i]=1;
}
size++;
if(size>=BEGIN){
BEGIN*=BEISHU;
data=auto_expand_data(data);
}
printf("是否继续增加记录(Y/N):");
getchar();
scanf("%c",&flag);
if(flag!='y'&&flag!='Y')
break;
}
}
void delete_data(student* data){
int delete_index=find(data);
if(delete_index!=-1){
char flag;
printf("确定删除改信息吗(Y/N):");
getchar();
scanf("%c",&flag);
if(flag=='y'||flag=='Y'){
if(delete_index<size-1)
for(int i=delete_index;i<size-1;i++)
data[i]=data[i+1];
size--;
printf("删除成功!\n");
}
else
printf("删除失败!(你未确定删除)\n");
}
}
void update(student* data){
int updata_index=find(data),select;
char flag;
if(updata_index!=-1){
char* new_data=NULL;
while(1){
printf("选择您要修改的内容1.姓名;2.学号;3.班级;4.专业;5.成绩:");
scanf("%d",&select);
switch(select){
case 1:new_data=(char*)malloc(10*sizeof(char));
printf("输入您要修改的信息:");
scanf("%s",new_data);
printf("姓名修改成功:原名:%s---->新名:%s",data[updata_index].name,new_data);
strcpy(data[updata_index].name,new_data);
break;
case 2:new_data=(char*)malloc(20*sizeof(char));
printf("输入您要修改的信息:");
scanf("%s",new_data);
printf("学号修改成功:原学号:%s---->新学号:%s",data[updata_index].student_id,new_data);
strcpy(data[updata_index].student_id,new_data);
break;
case 3:new_data=(char*)malloc(15*sizeof(char));
printf("输入您要修改的信息:");
scanf("%s",new_data);
printf("班级修改成功:原班级:%s---->新班级:%s",data[updata_index].student_class,new_data);
strcpy(data[updata_index].student_class,new_data);
break;
case 4:new_data=(char*)malloc(15*sizeof(char));
printf("输入您要修改的信息:");
scanf("%s",new_data);
printf("专业修改成功:原专业:%s---->新专业:%s",data[updata_index].student_major,new_data);
strcpy(data[updata_index].student_major,new_data);
break;
case 5:{
int type;
printf("选择你要修改的课程:1.高数;2.英语;3.面向对象;4.思修;5.物理\n");
scanf("%d",&type);
if(type>0&&type<=5){
type--;
int old=data[updata_index].score[type];
printf("输入你要修过的成绩:");
scanf("%lf",&data[updata_index].score[type]);
printf("成绩修改成功!\n");
if(type==0)
printf("高数原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
else if(type==1)
printf("英语原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
else if(type==2)
printf("面向对象原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
else if(type==3)
printf("思修原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
else
printf("物理原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
}
else
printf("你的选择有误自动返回上一层!\n");
break;
}
default:printf("你的选择有误自动返回上一层!\n");
}
printf("是否继续修改(Y/N):");
getchar();
scanf("%c",&flag);
if(flag!='Y'&&flag!='y')
break;
}
}
}
void show_data(student* data){
for(int i=0;i<size;i++){
printf("姓名:%s 学号:%s 班级:%s 专业:%s\n",data[i].name,data[i].student_id,data[i].student_class,data[i].student_major);
printf("学生%s成绩信息如下:\n",data[i].name);
printf("高数:分数:%.1lf 学分:%.1lf\n",data[i].score[0],data[i].credit[0]);
printf("英语:分数:%.1lf 学分:%.1lf\n",data[i].score[1],data[i].credit[1]);
printf("思修:分数:%.1lf 学分:%.1lf\n",data[i].score[3],data[i].credit[3]);
printf("物理:分数:%.1lf 学分:%.1lf\n",data[i].score[4],data[i].credit[4]);
printf("面向对象:分数:%.1lf 学分:%.1lf\n",data[i].score[2],data[i].credit[2]);
}
}
int find(student* data){//包含多种形式查找 具体由该函数实现 二分查找
char* find_data=NULL;
int select;
int flag=0,i=0;
sort(data);//排序 二分前提
printf("选择你通过什么查询,1.姓名;2.学号:");
scanf("%d",&select);
switch(select){
case 1:find_data=(char*)malloc(20*sizeof(char));
break;
case 2:find_data=(char*)malloc(20*sizeof(char));
break;
default:find_data=NULL;
break;
}
if(find_data!=NULL){
if(select==1)
printf("请输入姓名:");
else
printf("请输入学号:");
scanf("%s",find_data);
int l=0,r=size-1;
if(select==1){
while(l<=r){
i=(l+r)/2;
if(strcmp(find_data,data[i].name)>0)
l=i+1;
else if(strcmp(find_data,data[i].name)<0)
r=i-1;
else{
flag=1;
break;
}
}
}else{
while(l<=r){
i=(l+r)/2;
if(strcmp(find_data,data[i].student_id)>0)
l=i+1;
else if(strcmp(find_data,data[i].student_id)<0)
r=i-1;
else{
flag=1;
break;
}
}
}
if(!flag){
if(select==1)
printf("未找与姓名:%s有关的信息\n",find_data);
else
printf("未找与学号:%s有关的信息\n",find_data);
return -1;
}
else{
printf("信息如下:\n姓名:%s 学号:%s 班级:%s 专业:%s\n",data[i].name,data[i].student_id,data[i].student_class,data[i].student_major);
printf("学生%s成绩信息如下:\n",data[i].name);
printf("高数:分数:%.1lf 学分:%.1lf\n",data[i].score[0],data[i].credit[0]);
printf("英语:分数:%.1lf 学分:%.1lf\n",data[i].score[1],data[i].credit[1]);
printf("思修:分数:%.1lf 学分:%.1lf\n",data[i].score[3],data[i].credit[3]);
printf("物理:分数:%.1lf 学分:%.1lf\n",data[i].score[4],data[i].credit[4]);
printf("面向对象:分数:%.1lf 学分:%.1lf\n",data[i].score[2],data[i].credit[2]);
return i;
}
}else{
printf("选择错误,返回上一层!\n");
return -1;
}
}
student* set(){//建立学生信息结构体
printf("自动为您建立学生通讯录\n");
while(cal_how_many_data_in_txt()>=BEGIN)
BEGIN*=BEISHU;
student* data=(student*)malloc(BEGIN*sizeof(student));
fetch(data);
return data;
}
student* auto_expand_data(student* old){//扩展数据个数
student* data=(student*)malloc(BEGIN*sizeof(student));
for(int i=0;i<size;i++)
data[i]=old[i];
return data;
}
int cal_how_many_data_in_txt(){//计算文件数据个数 待优化 经验不足 只能这样写
FILE *fp = NULL;
fp = fopen("test.txt", "r");
int i=0;
char* name=(char*)malloc(200*sizeof(char));
while(fgets(name,200,(FILE *)fp )!=NULL)
i++;
fclose(fp);
return i/3;
}
学生成绩管理c语言
最新推荐文章于 2021-05-23 11:17:53 发布