其他linux相关作业点这里(传送门)
Ø基本功能:
对学生成绩进行管理。要求实现数据的基本操作:学院和学生信息以及学生成绩的增加,修改,删除,统计
所有文件操作必须使用linux系统下文件控制相关API,不能使用C库中文件操作相关的库函数。可以使用数据库。
程序预览
主菜单模块
学生管理模块
- 学生信息插入
- 学生信息删除
- 学生信息修改
4、学生信息查询
学院管理模块
- 学院信息插入
- 学院信息删除
- 学院信息修改
4、学院信息查询
成绩管理模块
- 成绩信息插入
- 成绩信息删除
- 成绩信息修改
4、成绩信息查询
成绩分析
(1)总排名前五
(2)学科前三名
源代码:(混合调用了一些c++函数,整体是c语言)
#include<bits/stdc++.h>
#include <unistd.h>
#include <fcntl.h>
using namespace std;
#define STU_FILE_NAME "student.txt" //本地文件名
#define SCO_FILE_NAME "score.txt"
#define COL_FILE_NAME "college.txt"
#define OFFSET 0 //文件指针偏移量
int stu_file,sco_file,col_file;
int sco_num,stu_num,col_num;
struct student{ //学生类
char no[20],name[20],belong[20],state[20];
int sum;
}stu[1000];
struct score{ //成绩类
char no[20],object[20],flag[20];
int grade;
}sco[1000];
struct college{ //学院类
char no[20],name[20];
}col[1000];
void init(){ //初始化函数 加载本地文件到内存中
stu_num=sco_num=col_num=0;
student te; score t2; college t3;
stu_file=open(STU_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(stu_file<0){printf("open file error!!!\n");exit(1);}
while(read(stu_file,&te,sizeof(student))>0) stu[stu_num++] = te;
sco_file=open(SCO_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(sco_file<0){printf("open file error!!!\n");exit(1);}
while(read(sco_file,&t2,sizeof(score))>0) sco[sco_num++] = t2;
col_file=open(COL_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(col_file<0){printf("open file error!!!\n");exit(1);}
while(read(col_file,&t3,sizeof(college))>0) col[col_num++] = t3;
printf("从本地文件读取了\n学生记录%d条 \n成绩记录%d条\n学院记录%d条\n\n",stu_num,sco_num,col_num);
}
void student_file(){ //学生类文件保存
int cl=open(STU_FILE_NAME,O_RDWR|O_TRUNC); close(cl); // clear file
lseek(stu_file,OFFSET,SEEK_SET); //指针还原
int si = sizeof(student);
for(int i = 0; i < stu_num; i++) write(stu_file,&stu[i],si); //写入到本地
cout<<"成功更新"<<stu_num<<"条学生记录"<<endl;
}
void score_file(){ //成绩类文件保存
int cl=open(SCO_FILE_NAME,O_RDWR|O_TRUNC); close(cl); // clear file
lseek(sco_file,OFFSET,SEEK_SET); //指针还原
int si = sizeof(score);
for(int i = 0; i < sco_num; i++) write(sco_file,&sco[i],si); //写入到本地
cout<<"成功更新"<<sco_num<<"条成绩记录"<<endl;
}
void college_file(){ //学院类文件保存
int cl=open(COL_FILE_NAME,O_RDWR|O_TRUNC); close(cl); // clear file
lseek(col_file,OFFSET,SEEK_SET); //指针还原
int si = sizeof(college);
for(int i = 0; i < col_num; i++) write(col_file,&col[i],si); //写入到本地
cout<<"成功更新"<<col_num<<"条学院记录"<<endl;
}
int student_find(char a[]){ //学生查找,返回学生在结构体数组的下标
for(int i = 0; i < stu_num; i++)
if(strcmp(stu[i].no,a) == 0) return i;
return -1;
}
int college_find(char a[]){ //学院查找,返回学院在结构体数组的下标
for(int i = 0; i < col_num; i++)
if(strcmp(col[i].no,a) == 0) return i;
return -1;
}
int score_find(char a[], char b[]){ //传入学号,科目,判断成绩是否重复
for(int i = 0; i < sco_num; i++)
if(strcmp(sco[i].no,a) == 0&&strcmp(sco[i].object,b)==0 ) return i;
return -1;
}
void student_add(){ //学生增加
student te;
cout<<"请输入学号,姓名, 学院"<<endl;
cin>>te.no>>te.name>>te.belong;
cout<<"请输入学籍状态 1、在学 2 、休学 3、退学"<<endl;
cin>>te.state;
if(student_find(te.no) != -1){
puts("已存在该学生,添加失败");
return;
}
if(college_find(te.belong) == -1){
puts("不存在该学院,添加失败");
return;
}
stu[stu_num++]=te;
student_file();
}
void student_del(){ //学生删除
student te;
//char no[]
cout<<"请输入要删除的学生学号"<<endl;
cin>>te.no;
int ob = student_find(te.no) ;
if(ob== -1){
puts("不存在该学生,删除失败");
return;
}
for(int i = ob+1; i < stu_num; i++)
stu[i-1]=stu[i];
stu_num -= 1; // 学生数量减一
student_file();
puts("删除成功");
}
void student_upd(){ //学生更新
student te;
//char no[]
cout<<"请输入要修改的学生学号"<<endl;
cin>>te.no;
int ob = student_find(te.no) ;
if(ob== -1){
puts("不存在该学生,无法修改");
return;
}
cout<<"请重新输入学生信息:姓名, 学院编号"<<endl;
cin>>stu[ob].name>>stu[ob].belong;
student_file();
puts("修改成功");
}
void student_que(){ //学生查询
cout<<"共有"<<stu_num<<"名学生"<<endl;
// cout<<"---------------------------------------"<<endl;
cout<<"学号-姓名-学院编号-学籍状态"<<endl;
for(int i = 0; i < stu_num; i++) cout<<stu[i].no<<" "<<stu[i].name<<" "<<stu[i].belong<<" "<<stu[i].state<<endl;
}
void score_add(){ //成绩增加
cout<<"请输入学号,科目 , 成绩, 说明"<<endl;
score te;
cin>>te.no>>te.object>>te.grade>>te.flag;
int ob = student_find(te.no) ;
if(ob== -1){
puts("不存在该学生,无法添加");
return;
}
if(score_find(te.no,te.object) !=-1 ){
puts("已经存在该记录,无法修改");
return;
}
sco[sco_num++]=te;
score_file();
}
void score_del(){ //成绩删除
score te;
//char no[]
cout<<"请输入学号,科目"<<endl;
cin>>te.no>>te.object;
int ob = score_find(te.no,te.object) ;
if(ob== -1){
puts("不存在该记录,删除失败");
return;
}
for(int i = ob+1; i < sco_num; i++)
sco[i-1]=sco[i];
sco_num -= 1; // 成绩记录减一
score_file();
puts("删除成功");
}
void score_upd(){ //成绩更新
score te;
//char no[]
cout<<"请输入学号,科目, 成绩"<<endl;
cin>>te.no>>te.object;
int ob = score_find(te.no,te.object) ;
if(ob== -1){
puts("不存在该记录,修改失败");
return;
}
cout<<"请重新输入成绩"<<endl;
cin>>sco[ob].grade;
student_file();
puts("修改成功");
}
void score_que(){ //成绩查询
cout<<"共有"<<sco_num<<"条成绩记录"<<endl;
cout<<"---------------------------------------"<<endl;
for(int i = 0; i < sco_num; i++) cout<<sco[i].no<<" "<<sco[i].object<<" "<< sco[i].grade<<" "<< sco[i].flag<<endl;
}
void college_add(){ //学院增加
cout<<"请输入学院编号,学院名字"<<endl;
college te;
cin>>te.no>>te.name;
if(college_find(te.no) != -1){
puts("已存在该学院,添加失败");
return;
}
col[col_num++]=te;
college_file();
// puts("增加成功");
}
void college_del(){ //学院删除
college te;
//char no[]
cout<<"请输入学院编号"<<endl;
cin>>te.no;
int ob = college_find(te.no) ;
if(ob== -1){
puts("不存在该记录,删除失败");
return;
}
for(int i = ob+1; i < col_num; i++)
col[i-1]=col[i];
col_num -= 1; // 学院记录减一
college_file();
puts("删除成功");
}
void college_upd(){ //学院更新
college te;
cout<<"请输入学院编号"<<endl;
cin>>te.no;
int ob = college_find(te.no) ;
if(ob== -1){
puts("不存在该学院,无法修改");
return;
}
cout<<"请输入学院新名字"<<endl;
cin>>col[ob].name;
college_file();
puts("修改成功");
}
void college_que(){ //学院查询
cout<<"共有"<<col_num<<"个学院"<<endl;
cout<<"---------------------------------------"<<endl;
for(int i = 0; i < col_num; i++) cout<<col[i].no<<" "<<col[i].name<<endl;
}
void student_ope(){
cout<<"输入指令 增加 删除 修改 查询"<<endl; int cmd;
cin>>cmd;
switch(cmd){
case 1:student_add(); break;
case 2:student_del(); ; break;
case 3:student_upd() ; break;
case 4:student_que(); break;
default:return ;
}
}
void score_ope(){
cout<<"输入指令 增加 删除 修改 查询"<<endl; int cmd;
cin>>cmd;
switch(cmd){
case 1:score_add(); break;
case 2:score_del(); ; break;
case 3:score_upd() ; break;
case 4:score_que(); break;
default:return ;
}
}
void college_ope(){
cout<<"输入指令 增加 删除 修改 查询"<<endl; int cmd;
cin>>cmd;
switch(cmd){
case 1:college_add(); break;
case 2:college_del(); ; break;
case 3:college_upd() ; break;
case 4:college_que(); break;
default:return ;
}
}
bool cmp(student & a, student &b){
return a.sum>b.sum;
}
struct ss{ //成绩排名辅助数组
string no,name;
int grade;
ss(){}
ss(string n1, string n2, int n3){
no = n1;
name = n2;
grade = n3;
}
bool operator < (const ss &b)const{
return grade > b.grade;
}
};
map< string, int> ma;
string ha[100];
vector<ss>ve[100];
void score_ana(){ //成绩分析
int ob;
for(int i = 0; i < stu_num;i++) stu[i].sum=0; //将总分清零
for(int i = 0; i < sco_num;i++){
ob = student_find(sco[i].no);
stu[ob].sum+=sco[i].grade;
}
cout<<"总分成绩如下-------------------------\n"<<endl;
cout<<"学号-姓名-总分"<<endl;
for(int i = 0; i < stu_num; i++) cout<<stu[i].no<<" "<<stu[i].name<<" "<<stu[i].sum<<endl;
sort (stu,stu+stu_num,cmp);
cout<<"\n总分前三名----------------------------\n"<<endl;
cout<<"学号-姓名-总分"<<endl;
for(int i = 0; i < 3; i++) cout<<stu[i].no<<" "<<stu[i].name<<" "<<stu[i].sum<<endl;
cout<<"\n各个科目前三名------------------------"<<endl;
for(int i = 0; i < 100; i++) ve[i].clear();
ma.clear();
int id = 0,grade,now;
string no,name;
for(int i = 0; i < sco_num;i++){
no = sco[i].no;
name = stu[student_find(sco[i].no)].name;
grade = sco[i].grade;
if(ma.count(sco[i].object) == 0){
ma[sco[i].object]=++id;
ha[id]=sco[i].object; //哈希映射
}
now = ma[sco[i].object];
//cout<<"now"<<now<<endl;
ve[now].push_back(ss(no,name,grade));
}
for(int i = 1 ; i <= id; i++){
sort(ve[i].begin(), ve[i].end());
cout<<"\n科目:"<<ha[i]<<endl;
cout<<"学号-姓名-分数"<<endl;
ss s1;
for(int k = 0; k < ve[i].size(); k++){
s1 = ve[i][k];
cout<<s1.no<<" "<<s1.name<<" "<<s1.grade<<endl;
}
}
}
int main()
{
init();
int cmd;
while(1){
cout<<"\n输入指令 1.学生管理 2. 成绩管理 3.学院管理 4.成绩分析"<<endl;
cin>>cmd;
switch(cmd){
case 1:student_ope(); break;
case 2:score_ope() ;break;
case 3:college_ope(); break;
case 4:score_ana(); break;
default:return 0;
}
}
return 0;
}