⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f.cpp

📁 超简单的C++学生成绩管理
💻 CPP
字号:
// f.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream> 
#include <string> 
#include <iomanip> 
#include <fstream> 
using namespace std; 

struct List 
{ 
string m_Name; 
string m_ID;//可能有的学号里有字母,所以用string类型。 
short int m_Chinese; 
short int m_Match; 
short int m_English; 
struct List *Next; //指针域。 
}; 

typedef struct List Node; 
typedef Node *Link; 


//---------------函数声明------------------- 
Link Create(Link Head); 
Link Search(Link Head); 
Link Search_front(Link Head); 
void Release(Link Head); 
void Display(Link Head); 
void Display_One(Link Head); 
void Display(Link Head,fstream& ofile); 
Link AddInfo(Link Head); 
Link DelInfo(Link Head); 
Link Modify(Link Head); 
void Grade_Stat(Link Head); 
Link Sort(Link Head); 
//---------------函数实现------------------- 
Link Create(Link Head) 
{ 
/*构造一个头节点*/ 
Head=(Link)new Node; 
if(!Head) 
{ 
cout<<"分配内存失败。"<<endl; 
exit(-1); 
} 
Head->m_Name=""; 
Head->m_ID=""; 
Head->m_Chinese=0; 
Head->m_Match=0; 
Head->m_English=0; 
Head->Next=NULL; 
return Head; 
} 

Link Search(Link Head) 
{ 
cout<<" 1.按姓名查询 2.按学号查询 "<<endl; 
int select; 
cin>>select; 
while(cin.fail()) 
{ 
cout<<"请选择正确的菜单项:"; 
cin.clear(); 
fflush(stdin); 
cin>>select; 
} 
Link ptr; 
ptr=Head; 
if(select==1) 
{ 
string name; 
cout<<"请输入要查询的姓名:"; 
cin>>name; 
while(ptr!=NULL) 
{ 
if(ptr->m_Name==name) 
{ 
Display_One(ptr); 
return ptr; 
} 
ptr=ptr->Next; 
} 
cout<<"没找到,怎么办?"<<endl; 

} 
else if(select==2) 
{ 
string ID; 
cout<<"请输入要查询的学号:"; 
cin>>ID; 
while(ptr!=NULL) 
{ 
if(ptr->m_ID==ID) 
{ 
Display_One(ptr); 
return ptr; 
} 
ptr=ptr->Next; 
} 
cout<<"没找到,怎么办?"<<endl; 
} 
return ptr; 
} 

Link Search_front(Link Head) 
{//返回前驱节点。 
cout<<" 1.按姓名删除 2.按学号删除 "<<endl; 
int select; 
cin>>select; 
while(cin.fail()) 
{ 
cout<<"请选择正确的菜单项:"; 
cin.clear(); 
fflush(stdin); 
cin>>select; 
} 
Link ptr; 
Link front; 
ptr=Head->Next; 
front=Head; 
if(select==1) 
{ 
string name; 
cout<<"请输入要删除的姓名:"; 
cin>>name; 
while(ptr!=NULL) 
{ 
if(ptr->m_Name==name) 
{ 
Display_One(ptr); 
return front; 
} 
ptr=ptr->Next; 
front=front->Next; 
} 
cout<<"没找到,怎么办?"<<endl; 

} 
else if(select==2) 
{ 
string ID; 
cout<<"请输入要删除的学号:"; 
cin>>ID; 
while(ptr!=NULL) 
{ 
if(ptr->m_ID==ID) 
{ 
Display_One(ptr); 
return front; 
} 
ptr=ptr->Next; 
front=front->Next; 
} 
cout<<"没找到,怎么办?"<<endl; 
} 
return front; 
} 

void Release(Link Head) 
{ 
Link ptr; 
while(Head!=NULL) 
{ 
ptr=Head; 
Head=Head->Next; 
delete ptr; 
} 
} 

void Display(Link Head) 
{ 
Link ptr; 
ptr=Head->Next; 
cout<<"----------------------------------------------------------------------"<<endl; 
cout<<"---------------------------- 所有学生信息 --------------------------"<<endl; 
cout<<"---姓名--------学号-----------语文-----------数学-----------英语------"<<endl; 
while(ptr!=NULL) 
{ 
cout<<setw(15)<<left<<ptr->m_Name 
<<setw(15)<<left<<ptr->m_ID 
<<setw(15)<<left<<ptr->m_Chinese 
<<setw(15)<<left<<ptr->m_Match 
<<setw(15)<<left<<ptr->m_English<<endl; 
ptr=ptr->Next; 

} 
} 
void Display(Link Head,fstream& ofile) 
{ 
Link ptr; 
ptr=Head->Next; 
ofile<<"----------------------------------------------------------------------"<<endl; 
ofile<<"---------------------------- 所有学生信息 --------------------------"<<endl; 
ofile<<"---姓名--------学号-----------语文-----------数学-----------英语------"<<endl; 
while(ptr!=NULL) 
{ 
ofile<<setw(15)<<left<<ptr->m_Name 
<<setw(15)<<left<<ptr->m_ID 
<<setw(15)<<left<<ptr->m_Chinese 
<<setw(15)<<left<<ptr->m_Match 
<<setw(15)<<left<<ptr->m_English<<endl; 
ptr=ptr->Next; 

} 
} 


void Display_One(Link Head) 
{ 
Link ptr; 
ptr=Head; 
cout<<"----------------------------------------------------------------------"<<endl; 
cout<<"---------------------------- 查询结果信息 --------------------------"<<endl; 
cout<<"---姓名--------学号-----------语文-----------数学-----------英语------"<<endl; 
cout<<setw(15)<<left<<ptr->m_Name 
<<setw(15)<<left<<ptr->m_ID 
<<setw(15)<<left<<ptr->m_Chinese 
<<setw(15)<<left<<ptr->m_Match 
<<setw(15)<<left<<ptr->m_English<<endl; 
} 

Link AddInfo(Link Head) 
{ 
Link ptr; 
ptr=Head; 
while(ptr->Next!=NULL) 
{ 
ptr=ptr->Next; 
} 
Link ptr2; 
char again; 
do 
{ 
ptr2=(Link)new Node; 
if(!ptr2) 
{ 
cout<<"内存分配失败!"<<endl; 
exit(-1); 
} 
//数据域 
string Name,ID; 
short int Chinese,Match,English; 
cout<<"输入姓名:"; 
cin>>Name; 
cout<<endl<<"输入学号:"; 
cin>>ID; 
cout<<endl<<"语文成绩:"; 
cin>>Chinese; 
cout<<endl<<"数据成绩:"; 
cin>>Match; 
cout<<endl<<"英语成绩:"; 
cin>>English; 

ptr2->m_Name=Name; 
ptr2->m_ID=ID; 
ptr2->m_Chinese=Chinese; 
ptr2->m_Match=Match; 
ptr2->m_English=English; 

//指针域 
ptr2->Next=NULL;//作为尾节点。 
ptr->Next=ptr2;//连接入链表。 
ptr=ptr2;//将ptr2作为下一次产生的节点的前驱节点. 

cout<<"是否继续输入?(Y/N) "; 
cin>>again; 

}while(again=='Y'||again=='y'); 
return Head; 
} 

Link DelInfo(Link Head) 
{ 
Link ptr; 
Link ptr2; 
ptr=Head; 
Link f_ptr;//前驱节点。 
f_ptr=Search_front(ptr); 

ptr2=f_ptr->Next; 
f_ptr->Next=f_ptr->Next->Next; 
delete ptr2; 
return Head; 
} 

Link Modify(Link Head) 
{ 
Link ptr; 
ptr=Head; 
ptr=Search(ptr); 
cout<<"修改前信息为:"<<endl; 
Display_One(ptr); 
//cout<<"请选择你要修改的选项:A:姓名 B:学号 C:语文成绩 D:数学成绩 E:英语成绩"<<endl; 
string name,ID; 
float Chinese,Match,English; 
cout<<"输入新姓名:"; 
cin>>name; 
cout<<endl<<"输入新学号:"; 
cin>>ID; 
cout<<endl<<"输入新语文成绩:"; 
cin>>Chinese; 
cout<<endl<<"输入新数学成绩:"; 
cin>>Match; 
cout<<endl<<"输入新英语成绩:"; 
cin>>English; 

ptr->m_Name=name; 
ptr->m_ID=ID; 
ptr->m_Chinese=Chinese; 
ptr->m_Match=Match; 
ptr->m_English=English; 

cout<<endl<<"修改后信息为:"<<endl; 
Display_One(ptr); 

return Head; 
} 

void Grade_Stat(Link Head) 
{//成绩统计。 
Link ptr; 
ptr=Head; 
cout<<"请输入你要查询的课程名(chinese|match|english)和一个分数范围[min,max]."<<endl; 
string name; 
short int min,max; 
int SwitchNum; 
cout<<"课程名:"; 
cin>>name; 
cout<<endl<<"分数下限:"; 
cin>>min; 
cout<<endl<<"分数上限:"; 
cin>>max; 
if(name=="chinese") 
SwitchNum=1; 
else if(name=="match") 
SwitchNum=2; 
else if(name=="english") 
SwitchNum=3; 
else 
{ 
cout<<"请输入一个正确的课程名:"<<endl; 
return; 
} 
while(ptr!=NULL) 
{ 
switch(SwitchNum) 
{ 
case 1: 
if(ptr->m_Chinese<=max&&ptr->m_Chinese>=min) 
Display_One(ptr); 
break; 
case 2: 
if(ptr->m_Match<=max&&ptr->m_Match>=min) 
Display_One(ptr); 
break; 
case 3: 
if(ptr->m_English<=max&&ptr->m_English>=min) 
Display_One(ptr); 
} 
} 

} 

Link Sort(Link Head) 
{//我创建的是带头节点的链表。用直接插入法。 
cout<<"请输入你想排序的课程名(用中文):"; 
string course_name; 
cin>>course_name; 
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。 
{ 
cout<<"数据节点数少于2个,不用排序!"<<endl; 
return Head; 
} 
//-----------第二步; 
Link ptr; 
Link ptr_F; 
Link ptr_N; 
ptr=Head->Next->Next; 
ptr_F=Head; 
Head->Next->Next=NULL;//到此,分成了两个链表。 
//第三步。 
while(ptr) 
{ 
ptr_N=ptr->Next; 
ptr_F=Head;//ptr_F的归位。 
while(ptr_F->Next) 
{ 
if(course_name=="语文") 
{ 
if(ptr->m_Chinese>ptr_F->Next->m_Chinese) 
{ 
ptr->Next=ptr_F->Next; 
ptr_F->Next=ptr; 
break; 
}//if 
else 
{ 
ptr_F=ptr_F->Next; 
} 
} 
if(course_name=="数学") 
{ 
if(ptr->m_Match>ptr_F->Next->m_Match) 
{ 
ptr->Next=ptr_F->Next; 
ptr_F->Next=ptr; 
break; 
}//if 
else 
{ 
ptr_F=ptr_F->Next; 
} 
} 
if(course_name=="英语") 
{ 
if(ptr->m_English>ptr_F->Next->m_English) 
{ 
ptr->Next=ptr_F->Next; 
ptr_F->Next=ptr; 
break; 
}//if 
else 
{ 
ptr_F=ptr_F->Next; 
} 
} 
}//while(ptr_F->Next) 
if(ptr_F->Next==NULL) 
{ 
ptr->Next=ptr_F->Next; 
ptr_F->Next=ptr;//表示插到有序链表的最后面了。 
} 

ptr=ptr_N;//归位,准备下一次排序。 

}//while(ptr) 
cout<<"从高到低,排序成功!"<<endl; 
return Head; 
} 


//----------主函数---------------------- 
int main() 
{ 

fstream ofile; 
ofile.open("e:\\student.txt",ios_base::out); 
if(!ofile) 
{ 
cout<<"文件打开失败。"<<endl; 
exit(-1); 
} 

Link head=0; 
head=Create(head); 

while(1) 
{ 

cout<<"*****************************************************"<<endl; 
cout<<"*** 1.添加信息 2.修改信息 3.删除信息 4.信息查询 ***"<<endl; 
cout<<"*** 5.成绩统计 6.排 序 7.显示/保存 0.退 出 ***"<<endl; 
cout<<"*****************************************************"<<endl; 
cout<<"请选择正确的菜单项:"; 
int sel; 
cin>>sel; 
while(cin.fail()) 
{ 
cout<<"请选择正确的菜单项:"; 
cin.clear(); 
fflush(stdin); 
cin>>sel; 
} 
switch(sel) 
{ 
case 0: 
exit(0); 
case 1: 
head=AddInfo(head); 
break; 
case 2: 
head=Modify(head); 
break; 
case 3: 
head=DelInfo(head); 
break; 
case 4: 
Search(head); 
break; 
case 5: 
Grade_Stat(head); 
break; 
case 6: 
Sort(head); 
break; 
case 7: 
Display(head);//在标准显示器上显示。 
Display(head,ofile);//在文件中显示。 
break; 
default: 
break; 
} 
} 

Release(head); 
return 0; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -