学 号: 20062431
姓 名: 张 兆 平
指导老师: 于滨
C++课程设计报告
1、课程设计目的
深入理解C++面向对象程序设计思想,运用已学知识解决实际问题
2、课程设计内容
2.1课程设计的题目及简介
学生成绩管理系统
先建立一个全班学生的链表,每个结点包含:学号、姓名、性别,系名,班级,生日住址,英语、数学、C++以及三门成绩。
要求利用面向对象程序设计思想的完成以下功能:
1、建立链表 (包含学号、姓名、性别,系名,班级,生日住址,英语、数学、C++以及三门成绩并以特殊数据作为结束)
2、排序 可以按对所有学生进行排序。
3、插入 输入一个学生的信息将它插入链表中,假定链表按学号有序。
4、查找 输入一个学生学号,输出其各科成绩,总成绩各平均成绩。
5、删除 从链表中按输入的学号删除该学生的所有信息。
6、统计 对各分数段人数进行统计并显示
7、存盘 将建立起来的链表以文件的形式存盘
8、读入 将原来已经存盘的文件读入内存,进行管理和修改。
2.2程序数据处理流图
2.3一个功能的算法流程图
2.3.1建立链表
2.3.2、排序
2.3.3、插入
2.3.4、查找
2.3.5、删除
2.3.6统计
2.4程序代码
#include
#include
#include
int size=0;
struct node
{
char num[15]; //学号
char name[20]; //姓名
char sex[20]; //性别
char birthday[20]; //生日
char department[20]; //系名
char classid[20]; //班级
char address[20]; //住址
float eng,math,cpp,Total,eva;
node *next;
}head; //定义结构体
class GradeManage{
public:
node *create(void);
void print(const node *head);
node *sort(node *head);
node *insert(node *head,node *p);
void search(node *head,char *p);
node *Deleteonenode(node *head,char *p);
void count(node *head,float g1,float g2);
void DeleteChain(node *head);
}; //定义类
node *GradeManage::create(void)
{
node *p1,*p2,*head=0;
char s1[20],s2[20],s3[20],s4[20],s5[20],s6[20],s7[20];
float s8,s9,s10;
cout<<"请输入学生信息,以字符0结束:"<
cout<<" "<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"生日"<<" "<<"系名"<<" "
<<"班级"<<" "<<"住址"<<" "<<"英语"<<" "<<"数学"<<" "<<"C++"<
cin>>s1>>s2>>s3>>s4>>s5>>s6>>s7>>s8>>s9>>s10;
while(strcmp(s1,"0")!=0)
{
p1=new node;
strcpy(p1->num,s1);
strcpy(p1->name,s2);
strcpy(p1->sex,s3);
strcpy(p1->birthday,s4);
strcpy(p1->department,s5);
strcpy(p1->classid,s6);
strcpy(p1->address,s7);
p1->eng=s8;
p1->math=s9;
p1->cpp=s10;
p1->Total=s8+s9+s10;
p1->eva=(s8+s9+s10)/3;
if(head==0)
{
head=p1;p2=p1;
}
else
{
p2->next=p1;p2=p1;
}
size++;
cout<<"继续输入"<
cin>>s1>>s2>>s3>>s4>>s5>>s6>>s7>>s8>>s9>>s10;
}
cout<<"输入结束!"<
for (int i=0;i<80;i++)
cout<<'-';
p2->next=0;
return(head);
}
void GradeManage::print(const node *head)
{
const node *p=head;
cout<<" "<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"生日"<<" "<<"系名"<<" "<<"班级"<<" "<<"住址"<<" "<<"英语"<<" "<<"数学"<<" "<<"C++"<<" "<<"平均"<
while(p!=0)
{
cout<
<<" "<
p=p->next;
}
for (int i=0;i<80;i++)
cout<<'-';
cout<<'\n';
}
node *GradeManage::sort(node* head)
{
node **p;
p= new node*[size];
if(head==0)
{
cout<<"链为空,产生错误!"<
return(NULL);
}
if(head->next==0)
{
cout<<"只有一个数据!"<
return(head);
}
else
{
node *temp;
p[0]=head;
int i;
for(i=1;i
{
p[i]=p[i-1]->next;
}
p[size-1]->next=NULL;
for(i=0;i
for(int j =0; j< size-1-i;j++)
if(strcmp(p[j]->num,p[j+1]->num)>0)
{
temp=p[j];p[j]=p[j+1];p[j+1]=temp;
}
}
p[size-1]->next=NULL;
head=p[0];
for(int i=1;i
{
p[i-1]->next=p[i];
}
p[size-1]->next=0;
cout<<"排序后:"<
print(head);
delete [] p;
return(head);
}
node *GradeManage::insert(node *head,node *p)
{
node *p1,*p2;
if(head==0){p->next=0;return(p);}
if(strcmp(head->num,p->num)>=0)
{
p->next=head;
return(p);
}
p2=p1=head;
while(p2->next&&strcmp(p2->num,p->num)<0)
{
p1=p2;p2=p2->next;
}
if(strcmp(p2->num,p->num)<0)
{
p2->next=p;p->next=0;
}
else
{
p->next=p2;p1->next=p;
}
return(head);
}
void GradeManage::search(node *head,char *p)
{
node *p1,*p2;
if(head==0)
{
cout<<"链为空,无法找到所要查找的学生信息!";
return;
}
if(strcmp(head->num,p)==0)
{
p1=head;
cout<<" "<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"生日"<<" "<<"系名"<<" "<<"班级"<<" "<<"住址"<<" "<<"英语"<<" "<<"数学"<<" "<<"C++"<<"Total"<<" "<<"eva"<
cout<
p1->classid<<" "<
}
else
{
p1=head;p2=head->next;
while(p2->next&&strcmp(p2->num,p)!=0)
{
p1=p2;p2=p2->next;
}
if(strcmp(p2->num,p)==0)
{
cout<<" "<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"生日"<<" "<<"系名"<<" "<<"班级"<<" "<<"住址"<<" "<<"英语"<<" "<<"数学"<<" "<<"C++"<<" "<<"Total"<<" "<<"eva"<
cout<
p2->classid<<" "<
}
else
cout<<"链上没有找到要找的学生信息!"<
}
return;
}
node *GradeManage::Deleteonenode(node *head,char *p)
{
node *p1,*p2;
if(head==0)
{
cout<<"链为空,无法找到所要删除的学生信息!"<
return(0);
}
if(strcmp(head->num,p)==0)
{
p1=head;
head=head->next;
delete p1;
cout<<"*********"<<"已成功删除!"<<"*********"<
}
else
{
p1=head;p2=head->next;
while(p2->next&&strcmp(p2->num,p)!=0)
{
p1=p2;p2=p2->next;
}
if(strcmp(p2->num,p)==0)
{
p1->next=p2->next;
delete p2;
cout<<"*********"<<"已成功删除!"<<"*********"<
}
else
cout<<"*********"<<"链上没有找到要删除的学生信息!"<<"*********"<
}
return(head);
}
void GradeManage::count(node *head,float g1,float g2)
{
node *p=head;
int n=0;
while(p!=0)
{
if(p->Total>=g1 && p->Total
{
n++;
}
p=p->next;
}
cout<<"*********"<<"总成绩在"<
cout<
return;
}
void GradeManage::DeleteChain(node *head)
{
node *p;
while(head)
{
p=head;
head=head->next;
delete p;
}
}
int main()
{
GradeManage class1;
node *head;
char s1[10],s2[20],s3[20],s4[20],s5[20],s6[20],s7[20];
float s8,s9,s10;
float ave;
node *p1;
head=class1.create(); //新建链表
class1.print(head);
cout<<"请输入要插入学生的信息!"<
cout<<" "<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"生日"<<" "<<"系名"<<" "<<"班级"<<" "<<"住址"<<" "<<"英语"<<" "<<"数学"<<" "<<"C++"<<" "<
cin>>s1>>s2>>s3>>s4>>s5>>s6>>s7>>s8>>s9>>s10;
p1=new node;
strcpy(p1->num,s1);
strcpy(p1->name,s2);
strcpy(p1->sex,s3);
strcpy(p1->birthday,s4);
strcpy(p1->department,s5);
strcpy(p1->classid,s6);
strcpy(p1->address,s7);
p1->eng=s8;
p1->math=s9;
p1->cpp=s10;
p1->Total=s8+s9+s10;
p1->eva=(s8+s9+s10)/3;
head=class1.insert(head,p1);
cout<<"插入后:"<
class1.print(head);
size++; //完成排序功能
head=class1.sort(head);
char s11[15]; //完成查找功能
cout<<"你要查找的学生的学号:";
cin>>s11;
class1.search(head,s11);
for (int i=0;i<80;i++)
cout<<'-';
cout<<"请输入你要删除的学生的学号:"; //完成删除功能
char s12[15];
cin>>s12;
head=class1.Deleteonenode(head,s12);
for (int j=0;j<80;j++)
cout<<'-';
cout<<"你想知道哪一个分数段(g1,g2)的人数?请输入(?--?):";//完成统计功能
float g1,g2;
cin>>g1>>g2;
class1.count(head,g1,g2);
class1.DeleteChain(head);
}
2.5运行实例
2.5.1运行显示界面
2.5.2完成输入和插入界面
2.5.3查找界面
2.5.4删除界面
3课程设计总结
因为去年选课的问题,没有选到C++实践课,在隔了一年这后,再拿起不太常用的C++,而且也是有一定难度的题目,是思考了很久,最后又结合别人的程序才有了上面的程序成果。
因为这次实习,让我知道真C++的应用是广泛的,而且实践与理论学习是有很大不同的。
1. 首先,要对一个事件有一个非常清楚了解,包括它的常规与非常规的现象,已经在这个事件中可能出现的一些特殊的情况等等。
2. 其实,要把自己已知的事件,转变为一个程序思想,这个转化过程是应用的关键,也是难点所在,这要求自己对C++的理论有一个较好的掌握,转化为自己的程序思想。
3. 最后,把自己的程序思想转化为现实的程序,这更要很大的耐力,通过反复的试验也能得到最好的结果。
综上所述,C++课是有实用性的,课程设计是必要的!
本文来源:https://www.2haoxitong.net/k/doc/6a7f978371fe910ef12df81c.html
文档为doc格式