课程设计代码
时间: 1ms 内存:128M
描述:
请提交如下内容,注意只允许提交一次
一、文件清单:
例如:
1. add.c
2. sub.c
3. score.c
4. score.h
二、各文件代码:
1. add.c 文件代码
*********
********
********
2. sub.c 文件代码
********
********
********
3. score.c 文件代码
********
********
********
4. score.h 文件代码
********
********
********
输入:
输出:
示例输入:
示例输出:
提示:
参考答案(内存最优[0]):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
typedef struct //定义学生信息结构体
{
char name[30];
int num;
float score[3];
}std;
int record(FILE*fp) // 测量函数,测量文件的长短
{
int n;
fseek(fp,0,SEEK_END);
n=ftell(fp)/sizeof(std);
return n;
}
int findnum(FILE*fp,int num)//查找函数,用于查找文件中学生的学号
{
int no=-1;
int i,n;
std stud;
n=record(fp);
rewind(fp);
for(i=0;i<n;i++)
{
fread((void*)&stud,sizeof(std),1,fp);
if(stud.num==num)
{
no=i;
break;
}
}
return no;
}
void insertinfo()//输入函数,此函数主要用于增加学生信息
{
int i,n;
int numb;
std stu1[100];
FILE *fp;
fp=fopen("studentdata.dat","ab+");
printf("是否自动产生学号?\n");//判断是否自动生成学号
printf("1: Yes 2: No \n");
int sw;
scanf("%d",&sw);
printf("请输入您要增加的学生人数为:\n");
printf("添加学生人数不能高于90\n");
scanf("%d",&n);
if(sw==2)//否,手动输入
{
printf("请输入您要增加的学生信息:\n");
printf("学生信息包括学生姓名、学号以及高数 语文 英语成绩(每个数据间以空格断开)\n");
printf("注:学生成绩按指定顺序键入 \n");
for(i=0;i<n;i++)
scanf("%s%d%f%f%f",stu1[i].name,&stu1[i].num,&stu1[i].score[0],&stu1[i].score[1],&stu1[i].score[2]);
for(i=0;i<n;i++)
fwrite((void*)(stu1+i),sizeof(std),1,fp);
}
if(sw==1)//是
{
printf("请输入您要增加的学生信息:\n");
printf("学生信息包括学生姓名以及高数 语文 英语成绩(每个数据间以空格断开)\n");
printf("注:学生成绩按指定顺序键入 \n");
int o,c;
o=record(fp);
if(o==0)//判断文件中是否有学生信息,若无,学号默认从一开始
numb=1;
else//若有,学号从数据中最大的学号下一位开始
{
numb=com(fp);//调用比较函数
numb=numb+1;//学号从下一位开始
}
for(i=0;i<n;i++)//将数据输入进文件中
{
scanf("%s%f%f%f",stu1[i].name,&stu1[i].score[0],&stu1[i].score[1],&stu1[i].score[2]);
stu1[i].num=numb;
numb++;
fwrite((void*)(stu1+i),sizeof(std),1,fp);
}
}
printf("您已成功添加!\n");
fclose(fp);
}
FILE *delete(FILE *fp)//删除函数,将指定学生信息从文件中删除
{
int no,i,j,n;
int num;
std *ant;
printf("请选择将要删除学生的学号\n");
scanf("%d",&num);
no=findnum(fp,num);//调用查找学号函数
if(no==-1)//如果文件中没有学生信息
{
printf("this num don't exit!\n");
return fp;
}
n=record(fp);//调用长度函数
if(n==1)
{
fclose(fp);
fp=fopen("studentdata.dat","wb+");
return fp;
}
ant=(std*)malloc(sizeof(std)*(n-1));//重开一个数组空间,大小为n-1
rewind(fp);//指针复位
for(i=j=0;i<n;i++)
{
fread((void*)(ant+j),sizeof(std),1,fp);//读出文件信息,逐条
if((ant+j)->num==num)//若找到该生学号,跳过
{
continue;
}
j++;
}
fclose(fp);//关闭文件
fp=fopen("studentdata.dat","wb+");//以写入方式打开文件
fwrite((void*)ant,sizeof(std),n-1,fp);//重写文件
printf("删除成功!");
return fp;
}
int main()
{
FILE*fp;
int d;
fp=fopen("studentdata.dat","ab+");
printf("************************************************\n");
printf("*************欢迎进入学生管理系统***************\n");
printf("*************Welcome to the System***************\n");
printf(" \n");
printf("*************以回车键结束您的键入***************\n");
printf(" \n");
printf("*************请问您的要求为");
printf("(请输入下列代码);*******\n");
printf(" \n");
printf("*********** 1: Insert 2: Delete ***********\n");
printf(" \n");
printf("*********** 3: Change 4: Show ***********\n");
printf(" \n");
printf("*********** 5: Find 6: Count ***********\n");
printf(" \n");
printf("*********** 7: Rank 0: Exit ************ ");
printf(" \n");
printf("*****************************************************\n");
printf(" \n");
printf(" \n");
while(d!=0)
{
printf("键入您选择的操作 enter your choice: ");
scanf("%d",&d);
if(d!=1&&d!=2&&d!=3&&d!=4)//判断指令是否正确,保护数据
{
printf("输入指令有错误,程序将于2秒后强行退出...\n");
return 0;
}
switch(d)
{
case 1:
insertinfo();
break;
case 2:
fp=delete(fp);
break;
case 3:
fp=fopen("studentdata.dat","rb+");
changeinfo(fp);
break;
case 4:
screen(fp);
break;
case 5:
find(fp);
break;
case 6:
countnum(fp);
break;
case 7:
ranknum(fp);
break;
}
}
}
void changeinfo(FILE*fp)//修改函数,用于修改学生的信息
{
std stuc;
int no,n,num;
printf("请输入您要修改的学生的学号:");
scanf("%d",&num);
no=findnum(fp,num);//调用查找学号函数
if(no==-1)
{
printf("this num don't exit!\n");
return;
}
fseek(fp,no*sizeof(std),SEEK_SET);//定位该名学生的位置
fread((void*)&stuc,sizeof(std),1,fp);
printf("请输入学生姓名、学号、成绩:\n");
scanf("%s%d%f%f%f",stuc.name,&stuc.num,&stuc.score[0],&stuc.score[1],&stuc.score[2]);
fseek(fp,-1L*(long)sizeof(std),SEEK_CUR);//重输该生信息
fwrite((void*)&stuc,sizeof(std),1,fp);
printf("修改成功!\n");
return;
}
void screen(FILE*fp)//显示函数
{
std stus;
int i,n=0;
n=record(fp);
fp=fopen("studentdata.dat","r");
printf("姓名\t学号\t高数\t英语\t中文\n");
for(i=0;i<n;i++)
{
fread((void*)&stus,sizeof(std),1,fp);//循环显示文件中学生信息
printf("%s\t%d\t%g\t%g\t%g\n",stus.name,stus.num,stus.score[0],stus.score[1],stus.score[2]);//显示在屏幕上
}
return;
}
void find(FILE*fp)//查找函数,用于查找学生信息
{
std stuf;
int no=0,num;
printf("请输入您要查找学生的学号:\n");
scanf("%d",&num);
no=findnum(fp,num);//调用查学号函数
if(no==-1)//如果查不到
{
printf("查无此人!");
return;
}
else//查到
{
fp=fopen("studentdata.dat","r");
fseek(fp,no*sizeof(std),SEEK_SET);
fread((void*)&stuf,sizeof(std),1,fp);
printf("姓名\t学号\t高数\t中文\t外语\n");
printf("%s\t%d\t%g\t%g\t%g\n",stuf.name,stuf.num,stuf.score[0],stuf.score[1],stuf.score[2]);//在屏幕中显示
}
}
int com(FILE*fp)//比较函数,比较学生的信息
{
std stuco;
int temp;
int i,n;
std stud;
n=record(fp);
int t[n+1];
rewind(fp);
for(i=0;i<n;i++)
{
fread((void*)&stuco,sizeof(std),1,fp);
t[i]=stuco.num;
}
temp=t[0];
for(i=1;i<n;i++)
{
if(t[i]>temp)
temp=t[i];
}
return temp;//返回学生信息中最大的学号
}
void countnum(FILE*fp)//统计函数
{
std stucut;
int n,num,ncount=0,i;
float nmin,nmax;
printf("请输入您要统计的学科:\n");
printf("1: 数学 2: 中文 3: 外语\n");
scanf("%d",&n);
printf("请输入您要统计的分数段:\n");
scanf("%f%f",&nmin,&nmax);
fp=fopen("studentdata.dat","rb");
num=record(fp);//记录数据条目
if(n!=1&&n!=2&&n!=3)//判断指令是否正确,保护数据
{
printf("输入指令有错误,程序将于2秒后强行退出...\n");
return 0;
}
switch(n)
{
case 1 :
rewind(fp);//指针复位
for(i=0;i<num;i++)
{
fread((void*)&stucut,sizeof(std),1,fp);//读出信息
if(stucut.score[0]>=nmin&&stucut.score[0]<=nmax)//比较该生信息是否满足要求
ncount++;//计数+1
}
break;
case 2:
rewind(fp);
for(i=0;i<num;i++)
{
fread((void*)&stucut,sizeof(std),1,fp);
if(stucut.score[1]>=nmin&&stucut.score[1]<=nmax)
ncount++;
}
break;
case 3:
rewind(fp);
for(i=0;i<num;i++)
{
fread((void*)&stucut,sizeof(std),1,fp);
if(stucut.score[2]>=nmin&&stucut.score[2]<=nmax)
ncount++;
}
break;
}
printf("统计人数为:%d\n",ncount);//输出结果
}
void ranknum(FILE*fp)
{
int n,i,j,d;
n=record(fp);
std stur[n],temp;
rewind(fp);
fp=fopen("studentdata.dat","rb");
printf("请选择您要排序的要求:\n");
printf("1: 高数 2: 外语 3:中文 4: 学号\n");
scanf("%d",&d);
if(d!=1&&d!=2&&d!=3&&d!=4)//判断指令是否正确,保护数据
{
printf("输入指令有错误,程序将于2秒后强行退出...\n");
return 0;
}
switch(d)
{
case 1:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].score[0]<stur[j].score[0])
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
break;
case 2:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].score[1]<stur[j].score[1])
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
break;
case 3:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].score[2]<stur[j].score[2])
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
break;
case 4:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].num<stur[j].num)
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
}
printf("姓名\t学号\t高数\t英语\t中文\n");
for(i=0;i<n;i++)
printf("%s\t%d\t%g\t%g\t%g\n",stur[i].name,stur[i].num,stur[i].score[0],stur[i].score[1],stur[i].score[2]);//显示在屏幕上
fclose(fp);
fp=fopen("studentdata.dat","wb+");
fwrite((void*)&stur,sizeof(std),n,fp);
fclose(fp);
}
参考答案(时间最优[0]):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
typedef struct //定义学生信息结构体
{
char name[30];
int num;
float score[3];
}std;
int record(FILE*fp) // 测量函数,测量文件的长短
{
int n;
fseek(fp,0,SEEK_END);
n=ftell(fp)/sizeof(std);
return n;
}
int findnum(FILE*fp,int num)//查找函数,用于查找文件中学生的学号
{
int no=-1;
int i,n;
std stud;
n=record(fp);
rewind(fp);
for(i=0;i<n;i++)
{
fread((void*)&stud,sizeof(std),1,fp);
if(stud.num==num)
{
no=i;
break;
}
}
return no;
}
void insertinfo()//输入函数,此函数主要用于增加学生信息
{
int i,n;
int numb;
std stu1[100];
FILE *fp;
fp=fopen("studentdata.dat","ab+");
printf("是否自动产生学号?\n");//判断是否自动生成学号
printf("1: Yes 2: No \n");
int sw;
scanf("%d",&sw);
printf("请输入您要增加的学生人数为:\n");
printf("添加学生人数不能高于90\n");
scanf("%d",&n);
if(sw==2)//否,手动输入
{
printf("请输入您要增加的学生信息:\n");
printf("学生信息包括学生姓名、学号以及高数 语文 英语成绩(每个数据间以空格断开)\n");
printf("注:学生成绩按指定顺序键入 \n");
for(i=0;i<n;i++)
scanf("%s%d%f%f%f",stu1[i].name,&stu1[i].num,&stu1[i].score[0],&stu1[i].score[1],&stu1[i].score[2]);
for(i=0;i<n;i++)
fwrite((void*)(stu1+i),sizeof(std),1,fp);
}
if(sw==1)//是
{
printf("请输入您要增加的学生信息:\n");
printf("学生信息包括学生姓名以及高数 语文 英语成绩(每个数据间以空格断开)\n");
printf("注:学生成绩按指定顺序键入 \n");
int o,c;
o=record(fp);
if(o==0)//判断文件中是否有学生信息,若无,学号默认从一开始
numb=1;
else//若有,学号从数据中最大的学号下一位开始
{
numb=com(fp);//调用比较函数
numb=numb+1;//学号从下一位开始
}
for(i=0;i<n;i++)//将数据输入进文件中
{
scanf("%s%f%f%f",stu1[i].name,&stu1[i].score[0],&stu1[i].score[1],&stu1[i].score[2]);
stu1[i].num=numb;
numb++;
fwrite((void*)(stu1+i),sizeof(std),1,fp);
}
}
printf("您已成功添加!\n");
fclose(fp);
}
FILE *delete(FILE *fp)//删除函数,将指定学生信息从文件中删除
{
int no,i,j,n;
int num;
std *ant;
printf("请选择将要删除学生的学号\n");
scanf("%d",&num);
no=findnum(fp,num);//调用查找学号函数
if(no==-1)//如果文件中没有学生信息
{
printf("this num don't exit!\n");
return fp;
}
n=record(fp);//调用长度函数
if(n==1)
{
fclose(fp);
fp=fopen("studentdata.dat","wb+");
return fp;
}
ant=(std*)malloc(sizeof(std)*(n-1));//重开一个数组空间,大小为n-1
rewind(fp);//指针复位
for(i=j=0;i<n;i++)
{
fread((void*)(ant+j),sizeof(std),1,fp);//读出文件信息,逐条
if((ant+j)->num==num)//若找到该生学号,跳过
{
continue;
}
j++;
}
fclose(fp);//关闭文件
fp=fopen("studentdata.dat","wb+");//以写入方式打开文件
fwrite((void*)ant,sizeof(std),n-1,fp);//重写文件
printf("删除成功!");
return fp;
}
int main()
{
FILE*fp;
int d;
fp=fopen("studentdata.dat","ab+");
printf("************************************************\n");
printf("*************欢迎进入学生管理系统***************\n");
printf("*************Welcome to the System***************\n");
printf(" \n");
printf("*************以回车键结束您的键入***************\n");
printf(" \n");
printf("*************请问您的要求为");
printf("(请输入下列代码);*******\n");
printf(" \n");
printf("*********** 1: Insert 2: Delete ***********\n");
printf(" \n");
printf("*********** 3: Change 4: Show ***********\n");
printf(" \n");
printf("*********** 5: Find 6: Count ***********\n");
printf(" \n");
printf("*********** 7: Rank 0: Exit ************ ");
printf(" \n");
printf("*****************************************************\n");
printf(" \n");
printf(" \n");
while(d!=0)
{
printf("键入您选择的操作 enter your choice: ");
scanf("%d",&d);
if(d!=1&&d!=2&&d!=3&&d!=4)//判断指令是否正确,保护数据
{
printf("输入指令有错误,程序将于2秒后强行退出...\n");
return 0;
}
switch(d)
{
case 1:
insertinfo();
break;
case 2:
fp=delete(fp);
break;
case 3:
fp=fopen("studentdata.dat","rb+");
changeinfo(fp);
break;
case 4:
screen(fp);
break;
case 5:
find(fp);
break;
case 6:
countnum(fp);
break;
case 7:
ranknum(fp);
break;
}
}
}
void changeinfo(FILE*fp)//修改函数,用于修改学生的信息
{
std stuc;
int no,n,num;
printf("请输入您要修改的学生的学号:");
scanf("%d",&num);
no=findnum(fp,num);//调用查找学号函数
if(no==-1)
{
printf("this num don't exit!\n");
return;
}
fseek(fp,no*sizeof(std),SEEK_SET);//定位该名学生的位置
fread((void*)&stuc,sizeof(std),1,fp);
printf("请输入学生姓名、学号、成绩:\n");
scanf("%s%d%f%f%f",stuc.name,&stuc.num,&stuc.score[0],&stuc.score[1],&stuc.score[2]);
fseek(fp,-1L*(long)sizeof(std),SEEK_CUR);//重输该生信息
fwrite((void*)&stuc,sizeof(std),1,fp);
printf("修改成功!\n");
return;
}
void screen(FILE*fp)//显示函数
{
std stus;
int i,n=0;
n=record(fp);
fp=fopen("studentdata.dat","r");
printf("姓名\t学号\t高数\t英语\t中文\n");
for(i=0;i<n;i++)
{
fread((void*)&stus,sizeof(std),1,fp);//循环显示文件中学生信息
printf("%s\t%d\t%g\t%g\t%g\n",stus.name,stus.num,stus.score[0],stus.score[1],stus.score[2]);//显示在屏幕上
}
return;
}
void find(FILE*fp)//查找函数,用于查找学生信息
{
std stuf;
int no=0,num;
printf("请输入您要查找学生的学号:\n");
scanf("%d",&num);
no=findnum(fp,num);//调用查学号函数
if(no==-1)//如果查不到
{
printf("查无此人!");
return;
}
else//查到
{
fp=fopen("studentdata.dat","r");
fseek(fp,no*sizeof(std),SEEK_SET);
fread((void*)&stuf,sizeof(std),1,fp);
printf("姓名\t学号\t高数\t中文\t外语\n");
printf("%s\t%d\t%g\t%g\t%g\n",stuf.name,stuf.num,stuf.score[0],stuf.score[1],stuf.score[2]);//在屏幕中显示
}
}
int com(FILE*fp)//比较函数,比较学生的信息
{
std stuco;
int temp;
int i,n;
std stud;
n=record(fp);
int t[n+1];
rewind(fp);
for(i=0;i<n;i++)
{
fread((void*)&stuco,sizeof(std),1,fp);
t[i]=stuco.num;
}
temp=t[0];
for(i=1;i<n;i++)
{
if(t[i]>temp)
temp=t[i];
}
return temp;//返回学生信息中最大的学号
}
void countnum(FILE*fp)//统计函数
{
std stucut;
int n,num,ncount=0,i;
float nmin,nmax;
printf("请输入您要统计的学科:\n");
printf("1: 数学 2: 中文 3: 外语\n");
scanf("%d",&n);
printf("请输入您要统计的分数段:\n");
scanf("%f%f",&nmin,&nmax);
fp=fopen("studentdata.dat","rb");
num=record(fp);//记录数据条目
if(n!=1&&n!=2&&n!=3)//判断指令是否正确,保护数据
{
printf("输入指令有错误,程序将于2秒后强行退出...\n");
return 0;
}
switch(n)
{
case 1 :
rewind(fp);//指针复位
for(i=0;i<num;i++)
{
fread((void*)&stucut,sizeof(std),1,fp);//读出信息
if(stucut.score[0]>=nmin&&stucut.score[0]<=nmax)//比较该生信息是否满足要求
ncount++;//计数+1
}
break;
case 2:
rewind(fp);
for(i=0;i<num;i++)
{
fread((void*)&stucut,sizeof(std),1,fp);
if(stucut.score[1]>=nmin&&stucut.score[1]<=nmax)
ncount++;
}
break;
case 3:
rewind(fp);
for(i=0;i<num;i++)
{
fread((void*)&stucut,sizeof(std),1,fp);
if(stucut.score[2]>=nmin&&stucut.score[2]<=nmax)
ncount++;
}
break;
}
printf("统计人数为:%d\n",ncount);//输出结果
}
void ranknum(FILE*fp)
{
int n,i,j,d;
n=record(fp);
std stur[n],temp;
rewind(fp);
fp=fopen("studentdata.dat","rb");
printf("请选择您要排序的要求:\n");
printf("1: 高数 2: 外语 3:中文 4: 学号\n");
scanf("%d",&d);
if(d!=1&&d!=2&&d!=3&&d!=4)//判断指令是否正确,保护数据
{
printf("输入指令有错误,程序将于2秒后强行退出...\n");
return 0;
}
switch(d)
{
case 1:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].score[0]<stur[j].score[0])
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
break;
case 2:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].score[1]<stur[j].score[1])
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
break;
case 3:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].score[2]<stur[j].score[2])
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
break;
case 4:
for(i=0;i<n;i++)
fread((void*)(stur+i),sizeof(std),1,fp);
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
if(stur[i].num<stur[j].num)
{
temp=stur[i];
stur[i]=stur[j];
stur[j]=temp;
}
}
}
printf("姓名\t学号\t高数\t英语\t中文\n");
for(i=0;i<n;i++)
printf("%s\t%d\t%g\t%g\t%g\n",stur[i].name,stur[i].num,stur[i].score[0],stur[i].score[1],stur[i].score[2]);//显示在屏幕上
fclose(fp);
fp=fopen("studentdata.dat","wb+");
fwrite((void*)&stur,sizeof(std),n,fp);
fclose(fp);
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。