用C语言结构体指针编程序实现输入十个学生的学号,期中和期末成绩,计算输出成绩表和学生平均分
#include<iostream>
#include<string>
using namespace std;
//=============<开始定义结构体>===================================================
struct combox{
int num;
int mark;
string name;
combox *next;
};
//=============<结束定义结构体>===================================================
//=============<开始定义Commonbox类>==============================================
//-----类体开始------------------------
class Commonbox{
private:
combox *head;void Swap(combox *,combox *); //交换两个combox变量的数据域
void Print(combox *); //输出一combox指定的记录
combox *Find(int); //查找条例条件的记录,并返回该记录的指针
public:
Commonbox(){head=NULL;}
int ListCount(); //统计当前链表的记录总数,返回一个整数
void AddItem(int num, string name, int mark); //添加一条记录到表尾
void RemoveItem(int); //删除一条指定的记录
void List(); //列出当前链表中的所有记录
void Sort(); //对当前链表进行排序
void Search(int); //在当前链表查找指定记录并输出
float Average(); //计算平均成绩
扩展资料
用C语言结构体指针编程序应用方法:
将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
(1) 用结构体变量名作参数。一般较少用这种方法。
(2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
(3) 用结构体变量的引用变量作函数参数。
在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。C语言中是利用库函数malloc和free来分配和撤销内存空间的。
2009-04-16
#include<string>
using namespace std;
//=============<开始定义结构体>===================================================
struct combox{
int num;
int mark;
string name;
combox *next;
};
//=============<结束定义结构体>===================================================
//=============<开始定义Commonbox类>==============================================
//-----类体开始------------------------
class Commonbox{
private:
combox *head;
void Swap(combox *,combox *); //交换两个combox变量的数据域
void Print(combox *); //输出一combox指定的记录
combox *Find(int); //查找条例条件的记录,并返回该记录的指针
public:
Commonbox(){head=NULL;}
int ListCount(); //统计当前链表的记录总数,返回一个整数
void AddItem(int num, string name, int mark); //添加一条记录到表尾
void RemoveItem(int); //删除一条指定的记录
void List(); //列出当前链表中的所有记录
void Sort(); //对当前链表进行排序
void Search(int); //在当前链表查找指定记录并输出
float Average(); //计算平均成绩
};
//-----类体结束------------------------
//-----类成员函数开始----------------------------------
int Commonbox::ListCount(){//统计当前链表的记录总数,返回一个整数
if(! head)return 0;
combox *p=head;
int n=0;
while(p){
n++;
p=p->next;
}
return n;
}
void Commonbox::AddItem(int num, string name, int mark){//添加一条记录到表尾
if(! head){
head=new combox;
head->mark=mark;
head->num=num;
head->name=name;
head->next=NULL;
return;
}
combox *t=head;
while(t && t->num!=num)
t=t->next;
if(t){
cout<<"操作失败:学号为"<<num<<"的记录已经存在!"<<endl;
return;
}
combox *p=head;
while(p->next)p=p->next;
combox *p1=new combox;
p1->num=num;
p1->mark=mark;
p1->name=name;
p1->next=NULL;
p->next=p1;
return;
}
void Commonbox::RemoveItem(int num){//删除一条指定的记录
combox *t=Find(num);
if(! t)return;
combox *p=head;
//如果要删除的记录位于表头
if(head==t){
head=head->next;
delete p;
cout <<"成功删除学号为 "<<num<<" 的记录!"<<endl<<endl;
return;
}
while(p->next!=t)p=p->next;
combox *p1=p->next;
p->next=p1->next;
delete p1;
cout <<"成功删除学号为 "<<num<<" 的记录!"<<endl<<endl;
return;
}
void Commonbox::Print(combox *p){//输出一combox指定的记录
cout<p->num<<"\t\t";
cout<<p->name<<"\t\t";
cout<<p->mark<<endl;
return;
}
void Commonbox::List(){//列出当前链表中的所有记录
if (ListCount==0){
cout <"错误:当前的列表为空!"<<endl;
return;
}
combox *p=head;
cout<"共有记录:"<<ListCount()<endl;
cout<"学号\t\t姓名\t\t分数"<<endl;
while(p){
Print(p);
p=p->next;
}
cout <<endl;
return;
}
void Commonbox::Search(int num){//在当前链表查找指定记录并输出
cout <"Searching...."<<endl;
combox *p=Find(num);
if(p){
cout<"学号\t\t姓名\t\t分数"<<endl;
Print(p);
}
cout <endl;
}
combox *Commonbox::Find(int num){
if (ListCount()==0){
cout <"错误:当前的列表为空!"<<endl;
return NULL;
}
combox *p=head;
while(p){
if(p->num==num)break;
p=p->next;
}
if(! p){
cout <<"错误:找不到该记录!\n";
return NULL;
}
return p;
}
void Commonbox::Swap(combox *p1, combox *p2){//交换两个combox变量的数据域
combox *temp=new combox;
temp->num=p1->num;
temp->mark=p1->mark;
temp->name=p1->name;
p1->num=p2->num;
p1->mark=p2->mark;
p1->name=p2->name;
p2->num=temp->num;
p2->mark=temp->mark;
p2->name=temp->name;
}
void Commonbox::Sort(){//对当前链表进行排序
cout <<"Sorting..."<<endl;
if(ListCount()2) return;
combox *temp=NULL,*p=NULL,*p1=NULL,*p2=NULL,*k=NULL;
int n=ListCount(),i,j;
p=head;
for(i=1;i<n;i++){
k=p;
p1=p->next;
for(j=0;j<n-i;j++){
if(k->num > p1->num){
k=p1;
}
p1=p1->next;
}
if(p!=k)Swap(k,p);
p=p->next;
}
cout <<"Complete successfully!"<<endl<<endl;
return;
}
float Commonbox::Average(){ //计算平均成绩
if (ListCount()==0){
cout <"错误:当前的列表为空!"<<endl;
return -1;
}
int sum=0,n=0;
combox *p=head;
while(p){
sum += p->mark;
p=p->next;
n++;
}
return float(sum)/n;
}
//-----类成员函数结束----------------------------------
//=============<结束定义Commonbox类>==============================================
Commonbox student; //定义全局变量
int Menu(){
cout <<"===========[主选单:]==========="<<endl;
int n=1,select=-1;
cout <n++<".输入学生成绩;"<<endl<<endl;
cout <n++<".按学号排序;"<<endl<<endl;
cout <n++<".按学号查找记录;"<<endl<<endl;
cout <n++<".删除由学号指定的记录;"<<endl<<endl;
cout <n++<".列出所有记录;"<<endl<<endl;
cout <n++<".计算平均成绩;"<<endl<<endl;
cout <"0.退出;"<<endl<<endl;
cout <"[请选择(输入相应数字)]:";
cin >>select;
return select;
}
char Exit(){ //返回一个字符患,用于确认退出
char s;
cout<<"确定要退出程序吗?[Y/N]:";
cin >>s;
return s;
}
void Input(int *num, string *name, int *mark){ //输入学生信息
cout <<"请输入 学号 姓名 分数:";
cin >>*num;
if(*num==-1)return;
cin >>*name>>*mark;
return;
}
void AddNew(){ //增加记录
int num=0,mark=0;
string name="";
cout<<endl<<"当输入的学号为-1时表示结束输入."<<endl;
Input(&num, &name, &mark);
while(num!=-1){
student.AddItem(num,name,mark);
Input(&num, &name, &mark);
}
return;
}
void DoFind(){ //按学号查找
int num;
cout<endl<<"当输入的学号为-1时表示结束输入."<<endl;
do{
cout <"请输入要查找的学生的学号: ";
cin>>num;
if(num==-1)continue;
student.Search(num);
}while(num!=-1);
return;
}
void DoDelete(){ //删除记录
cout<<endl<<"当输入的学号为-1时表示结束输入."<<endl;
int num;
do{
cout <"请输入要删除的学生的学号:";
cin>>num;
if(num==-1)continue;
student.RemoveItem(num);
}while(num!=-1);
return;
}
void ShowAverage(){ //输出平均数
float avr=student.Average();
if(avr>0){
cout<<"共有记录:\t"<<student.ListCount()<endl<<endl;
cout<"平均成绩:\t"<<avr<<endl<<endl;
}
return;
}
//-------******主函数开始>******-------
int main(){
cout<<"Welcome!\n学生成绩管理系统\nVer 1.01\nBy FondBoy\n\n";
int select;
char s;
while(1){
select=Menu();
switch(select){
case 0: //退出程序
s=Exit();
if(s=='y' || s=='Y')return 0;
break;
case 1: //输入学生成绩
AddNew();
break;
case 2: //按学号排序
student.Sort();
break;
case 3: //按学号查找记录
DoFind();
break;
case 4: //删除由学号指定的记录
DoDelete();
break;
case 5: //列出所有记录
student.List();
break;
case 6: //输出平均成绩
ShowAverage();
break;
default:
cout<<"无效输入!"<<endl;
}
}
return 0;
}
//-------******主函数结束>******-------
//------!!!!!!---------EOF-[程序代码结束]-------------------
参考资料: http://zhidao.baidu.com/question/30031897.html?fr=qrl