/******************************************************。
* Last Revision Date : 2011/07/6 10:35:27 。
* Author : zengjinliang。
* Description : 简单学生成绩处理系统。
*******************************************************/。
#include<vector>。
#include<iostream>。
#include<string>。
#include<sstream>。
#include<fstream>。
#include<ctime>。
using namespace std;。
typedef int scoreType;。
const string DATAFILE="testdata.txt";。
const string RESULTFILE="result.txt";。
const scoreType ERRORCode=-999;。
//转换失败,则返回ERRORCode。
scoreType string_to_scoreType(const string& word)。
scoreType Sum = ERRORCode;。
stringstream ss;。
ss<<word;。
ss>>Sum;。
return Sum;
}
string scoreType_to_string(const scoreType integer)。
stringstream ss;。
string str;
ss<<integer;。
ss>>str;。
return str;
}
//学生信息节点
class TStudentInfo{。
public:
int getsOrder() {return sOrder;}。
string getsId() {return sId;}。
string getsName() {return sName;}。
string getsClass() {return sClass;}。
scoreType getsAvgScore() {return sAvgScore;}。
scoreType getsMidScore() {return sMidScore;}。
scoreType getsFinalScore() {return sFinalScore;}。
string getsTotalScore() {return sTotalScore;}。
string str() {。
string sTmp;。
stringstream stream;。
stream<<sOrder<<" "; 。
stream<<sId<<" "; 。
stream<<sName<<" "; 。
stream<<sClass<<" "; 。
stream<<sAvgScore<<" "; 。
stream<<sMidScore<<" "; 。
stream<<sFinalScore;。
if (""!=sTotalScore)。
stream<<" "<<"综合成绩:"<<sTotalScore;。
getline(stream,sTmp);。
return sTmp;。
}
//计算总评成绩
bool caculateTotalScore();。
TStudentInfo(){}。
bool setStudentInfo(string sInfo);。
TStudentInfo(string sInfo){。
setStudentInfo(sInfo); 。
}
TStudentInfo(int aOrder,string aId,string aName,string aClass,。
scoreType aAvgScore,scoreType aMidScore=-1,scoreType aFinalScore=-1):。
sOrder(aOrder),sId(aId),sName(aName),sClass(aClass),。
sAvgScore(aAvgScore),sMidScore(aMidScore),sFinalScore(aFinalScore){}。
virtual ~TStudentInfo() {}。
private:
int sOrder; //序号。
string sId; //学号。
string sName; //姓名。
string sClass; //班级。
scoreType sAvgScore; //平时成绩。
scoreType sMidScore; //期中成绩。
scoreType sFinalScore; //期末成绩。
string sTotalScore; //总评成绩。
};
typedef TStudentInfo TSInfo;。
typedef struct TStudentNode{。
TSInfo *aStudent;。
TStudentNode *next;。
} *TSptr;
class TScoreInfo{。
public:
bool printScore();。
bool printStatistics();。
bool saveResult();。
bool clear();。
bool fileList();。
bool insertList(TSptr newPtr);。
TScoreInfo():stateFlag(0),absentNum(0),。
sMaxScore(0),sMinScore(0),sTotalScore(0){。
list = new TStudentNode;。
list->aStudent = new TSInfo();。
list->next = 0;。
for (int i=0;i<5;i++) scores[i] = 0;。
}
~TScoreInfo(){。
clear();
delete(list->aStudent);。
list->aStudent=0;。
delete(list);}。
private:
int absentNum; //缺考人数。
int passNum; //及格人数。
TStudentNode *list; //指向学生的链表,自带空头指针。
int scores[5]; //存储期末成绩分数段人数分布。
scoreType aAvgScore;。
double aPassRate; 。
scoreType sMaxScore; 。
scoreType sMinScore;。
scoreType sTotalScore;。
//0新建、1已装载数据并处理。
int stateFlag;。
bool dealNode(TSInfo *aInfo){。
scoreType sFScore=aInfo->getsFinalScore(); 。
if (sFScore<0) return false;。
else if (sFScore<60) scores[0]++;。
else if (sFScore<70) scores[1]++;。
else if (sFScore<80) scores[2]++;。
else if (sFScore<90) scores[3]++;。
else scores[4]++;。
sTotalScore += sFScore;。
if (sFScore>sMaxScore) sMaxScore=sFScore;。
if (sFScore<sMinScore) sMinScore=sFScore;。
}
};
int main(){
TScoreInfo si;。
si.fileList();。
si.printScore();。
si.printStatistics();。
cout<<"The End!"<<endl;。
si.saveResult();。
return 0;
}
bool TStudentInfo::caculateTotalScore(){。
scoreType iTmp(0);。
if (-1==sFinalScore){。
sTotalScore = "旷考";。
return false;}。
if ((0<sMidScore)&&(100>sMidScore)){。
iTmp = (10*sAvgScore + 30*sMidScore + 60*sFinalScore)/100;。
sTotalScore=scoreType_to_string(iTmp);}。
else {
iTmp = (30*sAvgScore + 70*sFinalScore)/100;。
sTotalScore=scoreType_to_string(iTmp);}。
return true;
}
bool TStudentInfo::setStudentInfo(string sInfo){。
istringstream stream(sInfo);。
sAvgScore = -1;。
sMidScore = -1;。
sFinalScore=-1;。
stream>>sOrder; 。
stream>>sId; 。
stream>>sName; 。
stream>>sClass; 。
stream>>sAvgScore; 。
stream>>sMidScore; 。
stream>>sFinalScore; 。
bool TScoreInfo::printScore(){。
if (!stateFlag) return false;。
int scnt=0;
for (int i=0;i<5;i++) scnt+=scores[i];。
aPassRate = (double)(scnt-scores[0])/scnt;。
aAvgScore = sTotalScore/scnt;。
cout<<"共读取了"<<scnt<<"个学生的数据!其中旷考"<<absentNum。
<<"人,其余成绩如下:"<<endl;。
cout<<"序号,学号,姓名,班级,平时成绩,其中成绩,期末成绩,总评成绩。"<<endl;。
TSptr p=list->next;。
while(0!=p){
cout<< p->aStudent->str()<<endl;。
p=p->next;。
}
return true;
bool TScoreInfo::printStatistics(){。
int i;
if (!stateFlag) return false;。
cout<<endl<<"期末成绩按分数段进行划分:"<<endl;。
cout<<"0~59、60~69、70~79、80~89、90~100的人数各有(人):";。
for (i=0;i<5;i++)。
cout<<scores[i]<<" ";。
cout<<endl<<"分布图如下:"<<endl;。
//分布图待续、判断正态分布待续。
cout<<"此次期末及格率:"<<aPassRate<<endl;。
cout<<"平均分:"<<aAvgScore<<endl;。
cout<<"最高分:"<<sMaxScore<<endl;。
cout<<"最低分:"<<sMinScore<<endl;。
bool TScoreInfo::clear(){。
TSptr p=list->next;。
int j=0;
while(0!=p){
list->next = p->next;。
delete(p->aStudent);。
delete p;
p=list->next; 。
}
list->next=0;。
stateFlag = 0;。
for (int i=0;i<5;i++) scores[i] = 0;。
sMaxScore = 0; 。
sMinScore = 0;。
sTotalScore = 0;。
absentNum=0;
bool TScoreInfo::fileList(){。
ifstream sfile;。
string sSInfo;。
clear();
sfile.open(DATAFILE.c_str(),ifstream::in);。
if (!sfile.is_open()){。
cout<<"Can't open datafile!Please check the existence of this file!"<<endl;。
return false;}。
//读取第一行的标题行
getline(sfile,sSInfo);。
//读取数据
getline(sfile,sSInfo);。
while(!sfile.eof()){。
TSptr p=new TStudentNode;。
p->aStudent= new TSInfo(sSInfo);。
p->next = 0;。
p->aStudent->caculateTotalScore();。
dealNode(p->aStudent);。
insertList(p);。
getline(sfile,sSInfo);。
}
sfile.close(); 。
stateFlag=1;
return true;
bool TScoreInfo::insertList(TSptr newPtr){。
if (!newPtr) return false;。
scoreType iTScore = string_to_scoreType(newPtr->aStudent->getsTotalScore());。
if (ERRORCode!=iTScore) {。
TSptr p=list->next;。
TSptr q=list;。
while((0!=p)&&(iTScore <= string_to_scoreType(p->aStudent->getsTotalScore()))){。
q = p;
p = p->next;。
}
newPtr->next = p;。
q->next = newPtr; 。
}
else absentNum++;。
bool TScoreInfo::saveResult(){。
fstream sfile;。
string sSInfo;。
time_t now_time=time(NULL);。
char tmp[64];
strftime(tmp, sizeof(tmp),"%Y/%m/%d %a",localtime(&now_time)); 。
sfile.open(RESULTFILE.c_str(),ofstream::out|ofstream::app);。
if (!sfile.is_open()){。
cout<<"Can't write resultfile!Please check the existence of this file!"<<endl;。
return false;}。
sfile<<"****************************************"<<endl;。
sfile<<"Date: "<<tmp<<endl;。
sfile.close();。
//重定位屏幕输出到文件输出。
freopen(RESULTFILE.c_str(), "a+", stdout);。
printScore();
printStatistics();。
cout<<"****************************************"<<endl;。
return true;
#include<stdio.h>。
struct stu
{
long num;
*student[2];
void main()
{
struct stu *a;。
student[0] = (struct stu*)malloc(sizeof(struct stu));。
student[0]->num=0;。
student[1] = (struct stu*)malloc(sizeof(struct stu));。
student[1]->num=1;。
a = student[0];。
student[0] = student[1];。
student[1] = a;。
printf("student[0].num=%d\n",student[0]->num);。
printf("student[1].num=%d\n",student[1]->num);。
#include <iostream>。
#include <string>。
using namespace std;。
struct Student //声明一个名为student的结构体类型。
string name; //姓名。
long number; //学号。
double shuxue; //数学。
double yingyu; //英语。
double Cyuyan; //C语言。
double tiyu; //体育。
double ZF; //总分。
double PJF; //平均分。
};
class SYSTEM //声明类system。
{public:
SYSTEM(){n=0;} //构造函数。
void add();//添加。
void show();//显示。
void search();//查询。
void change();//修改。
void del();//删除。
void PX();//排序。
void rate();//及格率。
void MAX();//最高分。
void MIN();//最低分。
private:
Student stu[1000];//定义一个结构体类型student的变量stu,其最大值为100。
int n;
};
void SYSTEM::add()//添加。
cout<<"学号:"<<endl;。
cin>>stu[n].number;。
cout<<"姓名:"<<endl;。
cin>>stu[n].name;。
cout<<"数学:"<<endl;。
cin>>stu[n].shuxue;。
cout<<"英语:"<<endl;。
cin>>stu[n].yingyu;。
cout<<"C语言:"<<endl;。
cin>>stu[n].Cyuyan;。
cout<<"体育:"<<endl;。
cin>>stu[n].tiyu;。
stu[n].ZF= stu[n].shuxue+ stu[n].yingyu+ stu[n].Cyuyan+ stu[n].tiyu;。
stu[n].PJF=( stu[n].shuxue+ stu[n].yingyu+ stu[n].Cyuyan+ stu[n].tiyu)/4;。
n++;//学生个数增加一个。
void SYSTEM::search()//查询。
cout<<"请选择查询方式:"<<endl;。
cout<<"1.按学号查询"<<endl; 。
cout<<"2.按姓名查询"<<endl; 。
int c,i;
cin>>c;
switch (c)
{
case 1://按照学号查询。
long num;
cout<<"请输入要查询的学号:"<<endl;。
cin>>num;。
for(i=0;i<n;i++) 。
if(stu[i].number==num)。
{ cout<<"学号 姓名 数学 英语 C语言 体育 总分 平均分"<<endl;。
cout<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].shuxue<<" "<<stu[i].yingyu<<" "<<stu[i].Cyuyan<<" "<<stu[i].tiyu<<" "<<stu[i].ZF<<" "<<stu[i].PJF<<endl;。
break; }
if(stu[i].number!=num)。
cout<<"未找到该学生信息!!"<<endl;。
break;}
case 2://按照学号查询。
string name1;
cout<<"请输入要查询的姓名:"<<endl;。
cin>>name1;。
for(i=0;i<n;i++) 。
if(stu[i].name==name1)。
{ cout<<"学号 姓名 数学 英语 C语言 体育 总分 平均分"<<endl;。
cout<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].shuxue<<" "<<stu[i].yingyu<<" "<<stu[i].Cyuyan<<" "<<stu[i].tiyu<<" "<<stu[i].ZF<<" "<<stu[i].PJF<<endl;。
break;}
if(stu[i].name!=name1)。
cout<<"未找到该学生信息!!"<<endl;。
break;}
void SYSTEM::show()//显示。
{ cout<<"学号 姓名 数学 英语 C语言 体育 总分 平均分"<<endl;。
for(int i=0;i<n;i++)。
{
cout<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].shuxue<<" "<<stu[i].yingyu<<" "<<stu[i].Cyuyan<<" "<<stu[i].tiyu<<" "<<stu[i].ZF<<" "<<stu[i].PJF<<endl;。
}
}
void SYSTEM::change() //修改。
{long num;
cout<<"请输入要修改的学生学号:"<<endl;。
cin>>num;。
for(int i=0;i<n;i++)。
if(stu[i].number==num)。
{cout<<"该学号的学生信息如下:"<<endl;。
cout<<"学号 姓名 数学 英语 C语言 体育 总分 平均分"<<endl;。
cout<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].shuxue<<" "<<stu[i].yingyu<<" "<<stu[i].Cyuyan<<" "<<stu[i].tiyu<<" "<<stu[i].ZF<<" "<<stu[i].PJF<<endl;。
cout<<"请输入新的学生信息:"<<endl;。
cout<<"学号:"<<endl;。
cin>>stu[i].number;。
stu[n].number=stu[i].number;。
cout<<"姓名:"<<endl;。
cin>>stu[i].name;。
stu[n].name=stu[i].name;。
cout<<"数学:"<<endl;。
cin>>stu[i].shuxue;。
stu[n].shuxue=stu[i].shuxue;。
cout<<"英语:"<<endl;。
cin>>stu[i].yingyu;。
stu[n].yingyu=stu[i].yingyu;。
cout<<"C语言:"<<endl;。
cin>>stu[i].Cyuyan;。
stu[n].Cyuyan=stu[i].Cyuyan;。
cout<<"体育:"<<endl;。
cin>>stu[i].tiyu;。
stu[n].tiyu=stu[i].tiyu;。
stu[i].ZF= stu[i].shuxue+ stu[i].yingyu+ stu[i].Cyuyan+ stu[i].tiyu;。
stu[i].PJF=( stu[i].shuxue+ stu[i].yingyu+ stu[i].Cyuyan+ stu[i].tiyu)/4;。
break;
}
if(stu[i].number!=num)。
cout<<"无此学生信息!!"<<endl;。
void SYSTEM::del() //删除。
long num;
cout<<"请输入要删除学生的学号,然后按回车确认:"<<endl;。
cin>>num;。
for(int i=0;i<n;i++)。
if(stu[i].number==num)。
{
for(int j=i;j<n-1;j++)。
stu[j]=stu[j+1];//用后一个学生信息覆盖前一个学生信息。
n--; //学生人数减少一个。
cout<<"已成功删除该学生信息!!"<<endl;break;。
}
void SYSTEM::PX() //排序。
{cout<<"请选择排序方式:"<<endl;。
cout<<"1.按学生总分排序"<<endl;。
cout<<"2.按学生平均分排序"<<endl;。
cout<<"3.返回"<<endl;。
int k;
cin>>k; 。
switch (k)
{
case 1://按学生总分排序。
Student p;
for(int i=0;i<n;i++)。
for(int j=0;j<n-i;j++)。
{
if(stu[j].ZF<stu[j+1].ZF)。
{
p=stu[j];。
stu[j]=stu[j+1];。
stu[j+1]=p;。
}
}
cout<<"学号 姓名 数学 英语 C语言 体育 总分"<<endl;。
for(int m=0;m<n;m++)。
{cout<<stu[m].number<<" "<<stu[m].name<<" "<<stu[m].shuxue<<" "<<stu[m].yingyu<<" "<<stu[m].Cyuyan<<" "<<stu[m].tiyu<<" "<<stu[m].ZF<<endl;。
}
}break;
case 2://按学生平均分排序。
{ Student p;//定义一个Student类型的变量p。
for(int i=0;i<n;i++)。
for(int j=0;j<n-i;j++)。
{
if(stu[j].PJF<stu[j+1].PJF)。
{
p=stu[j];。
stu[j]=stu[j+1];。
stu[j+1]=p;。
}
}
cout<<"学号 姓名 数学 英语 C语言 体育 平均分"<<endl;。
for(int m=0;m<n;m++)。
{cout<<stu[m].number<<" "<<stu[m].name<<" "<<stu[m].shuxue<<" "<<stu[m].yingyu<<" "<<stu[m].Cyuyan<<" "<<stu[m].tiyu<<" "<<stu[m].PJF<<endl;。
}
}break;
case 3:return;//返回。
}
void SYSTEM::rate()//及格率。
{ int count1, count2,count3,count4,count5=0;。
count1=count2=count3=count4=count5; 。
double a1;。
double a2;
double a3;
double a4;
double a5;
for(int i=0;i<n;i++)。
{if(stu[i].shuxue>=60)。
{count1++;
a1=((double)count1/(double)n)*100;//将int类型的count1和n强制转换成double类型再运算。
}
if(stu[i].yingyu>=60)。
{count2++;
a2=((double)count2/(double)n)*100;。
}
if(stu[i].Cyuyan>=60)。
{count3++;
a3=((double)count3/(double)n)*100;。
}
if(stu[i].tiyu>=60)。
{count4++;
a4=((double)count4/(double)n)*100;。
}
if(stu[i].PJF>=60)。
{count5++;
a5=((double)count5/(double)n)*100;。
}
}
cout<<"数学及格率:"<<a1<<"%"<<endl;。
cout<<"英语及格率:"<<a2<<"%"<<endl;。
cout<<"C语言及格率:"<<a3<<"%"<<endl;。
cout<<"体育及格率:"<<a4<<"%"<<endl;。
cout<<"学生平均分及格率:"<<a5<<"%"<<endl;。
void SYSTEM::MAX()//最高分。
{double max1,max2,max3,max4,max5,max6;。
max1=stu[0].shuxue;。
max2=stu[0].yingyu;。
max3=stu[0].Cyuyan;。
max4=stu[0].tiyu;。
max5=stu[0].ZF;。
max6=stu[0].PJF;。
for(int i=0;i<n;i++)。
{ if(stu[i].shuxue>max1)。
max1=stu[i].shuxue;。
if(stu[i].yingyu>max2)。
max2=stu[i].yingyu;。
if(stu[i].Cyuyan>max3)。
max3=stu[i].Cyuyan;。
if(stu[i].tiyu>max4)。
max4=stu[i].tiyu;。
if(stu[i].ZF>max5)。
max5=stu[i].ZF;。
if(stu[i].PJF>max6)。
max6=stu[i].PJF;。
}
cout<<"数学最高 英语最高 C语言最高 体育最高 总分最高 平均分最高"<<endl;。
cout<<" "<<max1<<" "<<max2<<" "<<max3<<" "<<max4<<" "<<max5<<" "<<max6<<endl; 。
}
void SYSTEM::MIN()//最低分。
{double min1,min2,min3,min4,min5,min6;。
min1=stu[0].shuxue;。
min2=stu[0].yingyu;。
min3=stu[0].Cyuyan;。
min4=stu[0].tiyu;。
min5=stu[0].ZF;。
min6=stu[0].PJF;。
for(int i=0;i<n;i++)。
{ if(stu[i].shuxue<min1)。
min1=stu[i].shuxue;。
if(stu[i].yingyu<min2)。
min2=stu[i].yingyu;。
if(stu[i].Cyuyan<min3)。
min3=stu[i].Cyuyan;。
if(stu[i].tiyu<min4)。
min4=stu[i].tiyu;。
if(stu[i].ZF<min5)。
min5=stu[i].ZF;。
if(stu[i].PJF<min6)。
min6=stu[i].PJF;。
}
cout<<"数学最低 英语最低 C语言最低 体育最低 总分最低 平均分最低"<<endl;。
cout<<" "<<min1<<" "<<min2<<" "<<min3<<" "<<min4<<" "<<min5<<" "<<min6<<endl; 。
}
void main()
SYSTEM person;。
int b;
do//do-while循环语句是先执行循环体里的语句,再进行判断,如果不符合while条件(即b<10)时要执行一次循环体,直到b的值大于或等于10是才退出循环。
{
cout<<"***************************************************************************"<<endl;。
cout<<" 1.添加 6.排 序"<<endl;。
cout<<" 2.查询 7.及格率"<<endl;。
cout<<" 3.显示 8.最高分"<<endl;。
cout<<" 4.修改 9.最低分"<<endl;。
cout<<" 5.删除 10.退 出"<<endl;。
cout<<"***************************************************************************"<<endl;。
cout<<"请请根据你的需要选择(1~10):";。
cin>>b;。
switch(b)
{
case 1:
cout<<"请依次输入该学生的相关信息:"<<endl;。
person.add();。
break;
case 2:
person.search();。
break;
case 3:
person.show();。
break;
case 4:
person.change();。
break;
case 5:
person.del();。
break;
case 6:
person.PX();。
break;
case 7:
person.rate();。
break;
case 8:
person.MAX();。
break;
case 9:
person.MIN();。
break;
case 10:
cout<<"谢谢使用本系统!!!"<<endl;。
}
}while(b<10);。
//C++课程设计---学生成绩管理系统。
#include <stdio.h>。
#include <string.h>。
#include <iostream.h>。
#include <stdlib.h>。
#include <windows.h>。
typedef struct studentinfo //结构体定义。
int num;//学号
char name[64];//姓名。
int sex;//性别,1为男性,0为女性。
float math;//数学。
float english;//英语。
float politic;//政治。
float chinese;//语文。
float total;//总成绩。
struct studentinfo *next;。
}STUDENT;
#define FILENAME "D:\\1.txt"。
//定义默认的数据库文件
#define DELAYTIME 1500。
//显示信息,延时
void create_menu();。
STUDENT * new_student();。
STUDENT* create_linkbyfile(char *);。
STUDENT *del_info(STUDENT *);。
int save_info(char *,STUDENT *,int);。
int find_infile_printf(char *);。
int pri_whole_link(STUDENT *);。
STUDENT* printf_sort(STUDENT *);。
void free_link(STUDENT *);。
void main() //主函数。
create_menu();。
void create_menu()。
//功能:输出功能菜单,提供人-机接口。
int menu_Num;
STUDENT *head=NULL;。
char ch;
char file_name[256];。
while(1)
{
system("cls");。
cout<<"\t\t学生成绩管理系统\n";。
cout<<"##########################################\n";。
cout<<"#\t\t 1.新增学生信息\t\t #\n";。
cout<<"#\t\t 2.加载数据库\t\t #\n";。
cout<<"#\t\t 3.删除学生信息\t\t #\n";。
cout<<"#\t\t 4.保存学生信息\t\t #\n";。
cout<<"#\t\t 5.数据库查询\t\t #\n";。
cout<<"#\t\t 6.原序输出\t\t #\n";。
cout<<"#\t\t 7.排序输出\t\t #\n";。
cout<<"#\t\t 8.退出\t\t\t #\n";。
cout<<"##########################################\n";。
cout<<"请输入操作编号:";。
cin>>menu_Num;。
switch (menu_Num)。
{
case 1:
free_link(head);//释放链表空间。
head=new_student();//新增学生信息。
break;
case 2:
free_link(head);//释放链表空间。
cout<<"请输入要加载的数据库文件的路径"<<endl;。
cin>>file_name;。
head=create_linkbyfile(file_name);//读取数据文件。
if(head!=NULL)。
{
cout<<"数据库"<<file_name<<"已加载"<<endl;。
Sleep(DELAYTIME);。
}
break;
case 3:
del_info(head);//删除学生信息。
break;
case 4://保存学生信息。
if (head==NULL)。
{
cout<<"请先生成学生信息"<<endl;。
Sleep(DELAYTIME);。
}
else
{
cout<<"想将学生信息保存到哪个数据库文件?";。
cin>>file_name;。
cout<<"请选择保存方式:0追加到文件末尾 1覆盖文件\n";。
cin>>menu_Num;。
if(save_info(file_name,head,menu_Num)==0)//0表示追加,1表示覆盖。
{
cout<<"信息保存失败\n";。
}
else
{
cout<<"数据已保存到"<<file_name<<endl;。
Sleep(DELAYTIME);。
}
}
break;
case 5:
find_infile_printf(FILENAME);//数据库查询。
break;
case 6://原序输出信息。
pri_whole_link(head);。
cout<<"返回主菜单? Y/N\t";。
do
{
cin>>ch;。
}while(ch!='Y'&&ch!='y');。
break;
case 7://排序输出信息。
do
{
if((head=printf_sort(head))==NULL)。
{
cout<<"数据库未加载"<<endl;。
Sleep(DELAYTIME);。
break;
}
else
{
cout<<"选择其他方式排序? Y/N\t";。
cin>>ch;。
}
}while(ch=='Y'||ch=='y');。
break;
case 8:
free_link(head);//释放链表空间。
exit(0);
break;
default:
cout<<"输入有误!请重新输入!"<<endl;。
break;
}
}
STUDENT * new_student()。
//功能:创建学生信息(通过链表)
//返回值:头结点指针
STUDENT *pnew,*p,*head;。
float *pfloat;。
char ch;
head=NULL;
do
{
system("cls");。
pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);。
cout<<"请输入学生的学号(0表示取消): ";。
cin>>pnew->num;。
if(0>=pnew->num)。
{
break;
}
cout<<"请输入学生的姓名:";。
cin>>pnew->name;。
while(1)
{
cout<<"请输入学生的性别:0/1\t";。
cin>>pnew->sex;。
if(pnew->sex&&pnew->sex-1)。
{
cout<<"性别输入错误,0表示女性,1表示男性,请重新输入"<<endl;。
}
else
{
break;
}
}
cout<<"请依次输入学生的数学、英语、政治、语文成绩:"<<endl;。
for(pnew->total=0,pfloat=&pnew->math;pfloat<&pnew->math+4;)。
{
cin>>*pfloat;。
if(*pfloat<0||*pfloat>150)。
{
cout<<"成绩输入错误,只能为0~150"<<endl;。
}
else
{
pnew->total+=*pfloat;。
pfloat++;
}
}
if(head==NULL)。
{
head=pnew;
}
else
{
p->next=pnew;。
}
p=pnew;
pnew->next=NULL;。
cout<<"##########################该学生信息已生成#########################\n";。
cout<<"建立另一个学生的信息? Y/N\t";。
cin>>ch;。
}while(ch=='Y'||ch=='y');。
return head;
STUDENT* create_linkbyfile(char *filename)。
//功能:读取文件,创建链表
//参数:如果filename不为空,则打开该文件,如果filename为空,要求输入文件位置。
//创建的链表的所有结点的next全部修改,指向物理地址上的下一个结点。
system("cls");。
FILE *fp;
STUDENT *head,*ptemp,*pnew;。
head=NULL;//初始化head为空。
if(filename==NULL)//若filename为空,要求输入文件绝对地址。
{
char file_name[256];。
cout<<"请输入数据库文件的路径:"<<endl;。
cin>>file_name;。
if(NULL==(fp=fopen(file_name,"rb")))。
{
cout<<"数据库连接失败\n";。
return 0;
}
}
else
{
if(NULL==(fp=fopen(filename,"rb")))。
{
cout<<"数据库连接失败\n";。
return 0;
}
}
for(ptemp=NULL;;)。
{
pnew=(STUDENT *)malloc(sizeof(STUDENT)*1);。
if(fread(pnew,sizeof(STUDENT),1,fp)!=NULL)。
{
if(ptemp!=NULL)。
{
ptemp->next=pnew;。
}
else
{
head=pnew;
}
ptemp=pnew;
}
else
{
if(ptemp!=NULL)。
{
ptemp->next=NULL;。
}
else
{
head=NULL;
}
free(pnew);
break;
}
}
fclose(fp);
return head;
STUDENT *del_info(STUDENT *head)。
//根据学号,删除链表的结点
system("cls");。
STUDENT *p1,*p2;。
int num;
if (head==NULL)。
{
cout<<"数据库未加载"<<endl;。
Sleep(DELAYTIME);。
return 0;
}
cout<<"请输入要删除学生的学号:";。
cin>>num;。
for(p1=head;p1!=NULL;)。
{
if(p1->num==num)//找到。
{
if(p1==head)//要删除的结点是头结点。
{
head=p1->next;。
}
else
{
p2->next=p1->next;。
}
cout<<"成功删除!!";。
}
p2=p1;
p1=p1->next;。
}
return head;
int save_info(char *filename,STUDENT *head,int flag)。
//功能:将链表按Binary写入文件末尾。
//参数:
//1.filename文件名,绝对地址。
//2.head指向链表的头结点。
//3.flag 0追加或1覆盖数据。
//返回值:失败则返回0
system("cls");。
FILE *fp;
STUDENT *p;
char openmethod[8];。
if(flag==0)
{
strcpy(openmethod,"ab+");//追加。
}
else
{
strcpy(openmethod,"w");//覆盖。
}
if(NULL==(fp=fopen(filename,openmethod)))//。
{
cout<<"数据库连接失败"<<endl;。
Sleep(DELAYTIME);。
return 0;
}
else
{
for(p=head;p;p=p->next)。
{
if((fwrite(p,sizeof(STUDENT),1,fp))==NULL)。
{
cout<<"数据库创建失败"<<endl;。
return 0;
}
}
}
fclose(fp);
return 1;
int find_infile_printf(char *filename)。
//功能:根据学号和姓名来查询某个学生。
//参数:filename数据库文件。
//返回值:失败返回0
//直接搜索文件,缺点是速度慢。
//也可先根据文件创建链表,再搜索链表,缺点是如果文件较大,占用内存多。
system("cls");。
FILE *fp;
STUDENT stu;
int num;
char stu_name[64];。
char ch;
if(filename==NULL)。
{
return 0;
}
do
{
memset(stu_name,0,sizeof(stu_name));。
cout<<"查询学号或查询姓名? 1查询学号 0查询姓名";。
//flag=1根据学号来查询,flag=0根据姓名来查询。
cin>>num;。
if(num==1)
{
cout<<"输入要查询的学号:";。
cin>>num;。
cout<<"正在为您查询学号为"<<num<<"的学生……"<<endl;。
}
else if(num==0)。
{
cout<<"输入要查询的姓名:";。
cin>>stu_name;。
cout<<"正在为您查询姓名为"<<stu_name<<"的学生……"<<endl;。
}
else
{
cout<<"输入有误"<<endl;。
return 0;
}
if(NULL==(fp=fopen(filename,"rw")))。
{
cout<<"数据库连接失败\n";。
return 0;
}
else
{
while(fread(&stu,sizeof(STUDENT),1,fp)!=NULL)。
{
if(strcmp(stu.name,stu_name)==0||stu.num==num)。
{
cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";。
//输出该学生的所有信息。
cout<<stu.num<<"\t"<<stu.name<<"\t"<<stu.sex<<"\t"<<stu.math<<"\t"<<stu.english<<"\t"<<stu.politic<<"\t"<<stu.chinese<<"\t"<<stu.total<<endl; 。
//不加break;可支持多个相同数据的索引。
}
}
}
cout<<"##########################查询完毕#########################\n";。
cout<<"查询另一个学生的信息? Y/N\t";。
cin>>ch;。
}while(ch=='Y'||ch=='y');。
fclose(fp);
return 1;
int pri_whole_link(STUDENT *head)。
//功能:显示整条链表的学生信息。
//参数:head 头结点指针,如果head为空,返回空。
system("cls");。
STUDENT* p;
if (head==NULL)。
{
cout<<"数据库未加载"<<endl;。
Sleep(DELAYTIME);。
return 0;
}
cout<<"学号\t姓名\t性别\t数学\t英语\t政治\t语文\t总成绩\n";。
for(p=head;p;p=p->next) 。
{
cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->math<<"\t"<<p->english<<"\t"<<p->politic<<"\t"<<p->chinese<<"\t"<<p->total<<endl; 。
}
return 1;
STUDENT* printf_sort(STUDENT *head)。
//功能:根据学号|某科目成绩|总成绩对链表进行排序,然后输出。
//参数:head链表头指针,如果head为空,返回空。
//返回值:返回新的链表的头结点指针。
system("cls");。
STUDENT *p1,*p2,*ptemp,*pfinished=NULL;。
int num;
int flag;
if (head==NULL)。
{
return 0;
}
cout<<"选择排序依据 0.数学成绩1.英语成绩2.政治成绩3.语文成绩4.总成绩\n";。
cin>>num;。
// cout<<"升序/降序输出? 0.升序1.降序";。
// cin>>flag;。
for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点。
//ptemp作为中介,保存p2的上一个结点。
{
for(p2=p1;p2->next!=pfinished;)。
{
if(*(&(p2->math)+num)<*(&(p2->next->math)+num))//p2的值小于p2->next的值,交换 ptemp p2 p2->next。
{
if(p2==p1)//头结点要交换。
{
p1=p2->next;。
p2->next=p1->next;。
p1->next=p2;。
ptemp=p1;
}
else
{
ptemp->next=p2->next;。
ptemp=p2->next;。
p2->next=ptemp->next;。
ptemp->next=p2;。
}
}
else//不需要交换,则p2、ptemp前进1位。
{
ptemp=p2;
p2=p2->next;。
}
}
pfinished=p2;。
}
// if(flag==1)
// {
pri_whole_link(p1);。
// }
// else
// {
// }
cout<<"##########################信息显示完毕#########################\n";。
return p1;
void free_link(STUDENT *head)。
//释放链表空间,如果head,什么都不做。
STUDENT *p1,*p2;。
for(p1=head;p1;p1=p2)。
{
p2=p1->next;//先保存,否则。
free(p1);//free后 p1->next数据丢失。
}
public class Student {。
private String sNo;。
private String sName;。
private String sSex;。
private int sAge; 。
private int sJava;。
public Student(){}。
public Student(String no,String name,String sex,int age,int java){。
sNo=no;
sName=name;
sSex=sex;
sAge=age;
sJava=java;
public String getNo(){。
return sNo;
public String getName(){。
return sName;
public String getSex(){。
return sSex;
public int getAge(){。
return sAge;
public int getJava(){。
return sJava;
public String toString(){。
return "学号:"+sNo+",姓名:"+sName+。
",性别:"+sSex+",年龄:"+sAge+",成绩:"+sJava;。
//测试
public static void main(String[] args) {。
// TODO Auto-generated method stub。
Student[] students=new Student[5];。
students[0]=new Student("2016001","张一","男",22,80);。
students[1]=new Student("2016002","张二","男",21,85);。
students[2]=new Student("2016003","张三","女",23,90);。
students[3]=new Student("2016004","张四","男",22,70);。
students[4]=new Student("2016005","张五","女",20,88);。
//输出每个学生的信息,计算5个学生的分数总和。
double score=0;。
for(Student stu:students){。
System.out.println(stu);。
score=score+stu.getJava();。
//输出平均成绩
System.out.println("平均成绩:"+(score/5));。
//冒泡排序,从大到小
Student student=new Student();。
for(int i=0;i<students.length;i++)。
for(int j=i+1;j<students.length;j++){。
if(students[i].getJava()<students[j].getJava()){。
student=students[i];。
students[i]=students[j];。
students[j]=student;。
//输出最大,最小分数
System.out.println("分数最大为:"+students[0].getJava());。
System.out.println("分数最小为:"+students[4].getJava());。
//排序后的数组
for(Student stu:students){。
System.out.println(stu);。
结果:
学号:2016001,姓名:张一,性别:男,年龄:22,成绩:80。
学号:2016002,姓名:张二,性别:男,年龄:21,成绩:85。
学号:2016003,姓名:张三,性别:女,年龄:23,成绩:90。
学号:2016004,姓名:张四,性别:男,年龄:22,成绩:70。
学号:2016005,姓名:张五,性别:女,年龄:20,成绩:88。
平均成绩:82.6
分数最大为:90
分数最小为:70
学号:2016003,姓名:张三,性别:女,年龄:23,成绩:90。
学号:2016005,姓名:张五,性别:女,年龄:20,成绩:88。
学号:2016002,姓名:张二,性别:男,年龄:21,成绩:85。
学号:2016001,姓名:张一,性别:男,年龄:22,成绩:80。
学号:2016004,姓名:张四,性别:男,年龄:22,成绩:70。
也可以把Student类实现Comparable接口,放进list集合里。
用Collections.sort方法排序。