数据库2.docx
《数据库2.docx》由会员分享,可在线阅读,更多相关《数据库2.docx(11页珍藏版)》请在冰豆网上搜索。
数据库2
上一课,举了一个例子,主要实现了一个顺序表的相关操作,现在做个小小的实验,即实现一个小小的学生成绩管理系统。
需求如下:
用顺序表实现一个完成一个班级的一个学期的所有课程的管理:
能够增加、删除、修改学生的成绩记录。
假设学生有学号id,班级名class_name,学期term,性别sex,姓名name,语文chinese,英语english,数学maths等字段。
系统分析:
系统有增加,删除,修改,查找等操作,都放在一个主界面选择进行。
源码如下(实现是在VC++6.0下编译通过):
//student.cpp:
Definestheentrypointfortheconsoleapplication.
/**说明:
本程序主要实现学生成绩管理的相关操作,如添加,删除,修改,查询等****
*****************************************************************************
*****************************************************************************/
#include"stdafx.h"
#include"iostream.h"
#include
#include
#include
structstudent
{
charterm[10];//学期
char class_name[10];//班级名
intid; //学号id
charname[30];//姓名
charsex[2]; //性别
floatchinese;//语文
float english;//英语
float maths;//数学
};
typedefstructstudentDataType;// 指定structstudent为DataType
structSeqList
{
intMAXLENGTH; //顺序表中最大元素的个数
intcount; //存放线性表中元素的个数count<=MAXLENGTH
DataType*element; //element[0],element[1],...,element[n-1]存放线性表中的元素
};
typedefstructSeqList*MySeqList;
//初始化并创建空顺序表
MySeqListinitSeqList(intm);
//判断线性表是否为空
intisEmptySeqList(MySeqListmySeqList);
//在顺序表中求某元素的下标
intlocateSeqList(MySeqListmySeqList,intid);
//在顺序表中修改值
intupdateSeqList(MySeqListmySeqList,intid);
//顺序表的插入(元素p之前插入)
intinsertPreSeqList(MySeqListmySeqList,intp,DataTypex);
//顺序表的插入(元素p之后插入)
intinsertNextSeqList(MySeqListmySeqList,intp,DataTypex);
//顺序表的删除(根据下标删除)
intdeleteSeqList(MySeqListmySeqList,intp);
//顺序表的删除(根据元素值删除)
intdeleteSeqListByValue(MySeqListmySeqList,intid);
//将顺序表表示的线性表逆置
intreverseSeqList(MySeqListmySeqList);
/*
*删除线性表中所有值为x的值
*我给出的算法,在一个线性表中实现,设置了2个游标
*/
intdeleteAllVSeqList(MySeqListmySeqList,DataTypex);
//求出下标为i的元素的前驱和后继
intfindPrePostSeqList(MySeqListmySeqList,inti,DataType&m,DataType&n);
//顺序表实现部分:
找出值为x的元素的前驱和后继的存储位置(即下标)
intlocatePrePostSeqList(MySeqListmySeqList,DataTypex,int&i,int&j);
//输出线性表的元素值
voidprintSeqList(MySeqList&mySeqList);
//根据学生id,输出线性表的元素值
voidprintSeqListById(MySeqList&mySeqList,intid);
//在顺序表中修改值
intupdateSeqList(MySeqListmySeqList,intid)
{
intiRc=locateSeqList(mySeqList,id);
if(iRc==-1)
{
printf("不存在指定下标!
\n");
return(0);
}
cout<<"classname:
";
cin>>mySeqList->element[iRc].class_name;
cout<<"term:
";
cin>>mySeqList->element[iRc].term;
cout<<"学号:
";
cin>>mySeqList->element[iRc].id;
cout<<"name:
";
cin>>mySeqList->element[iRc].name;
cout<<"sex:
";
cin>>mySeqList->element[iRc].sex;
cout<<"english:
";
cin>>mySeqList->element[iRc].english;
cout<<"chinese:
";
cin>>mySeqList->element[iRc].chinese;
cout<<"maths:
";
cin>>mySeqList->element[iRc].maths;
return1;
}
//功能:
创建空顺序表
MySeqListinitSeqList(intm)
{
MySeqListmySeqList=(MySeqList)malloc(sizeof(structSeqList));//分配内存空间
if(mySeqList!
=NULL)
{
mySeqList->element=(DataType*)malloc(sizeof(DataType)*m); //为里面的元素分配m个DataType大小的内存空间,相当于初始化了一个长度为m的数组
if(mySeqList->element)
{
mySeqList->MAXLENGTH=m; //如果创建了元素,MAXLENGTH为最大元素的个数
mySeqList->count=0; //空表长度为0
return(mySeqList);
}
else
free(mySeqList); //记得要手动释放空间,否则很容易产生内存泄漏
}
printf("内存空间不足,请关闭一些程序,然后再试!
\n");//存储分配失败,提示空间不足
returnNULL;
}
//功能:
判断线性表是否为空
intisEmptySeqList(MySeqListmySeqList)
{
return(mySeqList->count==0);
}
//功能:
在顺序表中求某元素的下标,没有查找到,则返回-1
intlocateSeqList(MySeqListmySeqList,intid)
{
for(inti=0;icount;++i)
if(mySeqList->element[i].id==id) //传入一个元素x,查找到后返回下标i
return(i);
return(-1);
}
//功能:
顺序表的pos下标前面插入,插入成功返回1,失败返回0
intinsertPreSeqList(MySeqListmySeqList,intpos,DataTypex)
{
++mySeqList->count;
if(mySeqList->count>mySeqList->MAXLENGTH) //溢出
{
--mySeqList->count;
printf("表产生了溢出!
\n");
return(0);
}
if(pos<0||pos>=mySeqList->count) //不存在下标为pos的元素
{
--mySeqList->count;
printf("不存在指定下标!
\n");
return(0);
}
for(inti=mySeqList->count-1;i!
=pos;--i)
mySeqList->element[i]=mySeqList->element[i-1];//插入位置及之后的元素均后移一个位置
mySeqList->element[i]=x; //插入元素x
return
(1);
}
//功能:
顺序表的pos下标后面插入,插入成功返回1,失败返回0
intinsertNextSeqList(MySeqListmySeqList,intpos,DataTypex)
{
if(pos<0||pos>=mySeqList->count)
{
printf("不存在指定下标!
\n");
return(0);
}
++mySeqList->count;
if(mySeqList->count>=mySeqList->MAXLENGTH)
{
--mySeqList->count;
printf("表产生了溢出!
\n");
return(0);
}
for(inti=mySeqList->count-1;i!
=pos+1;--i)
mySeqList->element[i]=mySeqList->element[i-1]; //同样地,把pos+1插入位置及之后的元素均后移一个位置
mySeqList->element[i]=x; //插入元素x
return
(1);
}
//功能:
顺序表的删除(根据下标删除)
intdeleteSeqList(MySeqList mySeqList,intpos)
{
if(pos<0||pos>=mySeqList->count) //不存在下标为pos的元素,注意下标范围是从0到count-1
{
printf("不存在指定下标!
\n");
return(0);
}
for(inti=pos;icount-1;++i)
mySeqList->element[i]=mySeqList->element[i+1]; //被删除元素之后的元素均前移一个位置
--mySeqList->count; //元素个数减1
return
(1);
}
//功能:
根据元素值删除,实现顺序表的删除
intdeleteSeqListByValue(MySeqListmySeqList,intid)
{
intpos=locateSeqList(mySeqList,id);
if(pos==-1)
{
printf("不存在指定下标!
\n");
return(0);
}
deleteSeqList(mySeqList,pos);
return
(1);
}
/*
*功能:
删除线性表中所有学生ID为x的值
*/
intdeleteAllSeqListByValue(MySeqListmySeqList,intx)
{
if(mySeqList->count==0)
{
printf("该表为空!
\n");
return(0);
}
for(inti=0;i!
=mySeqList->count;++i)
{
if(mySeqList->element[i].id==x)
{
deleteSeqListByValue(mySeqList,x); //删除x,删除后要将下标减少1
i--;
}
}
return
(1);
}
/*
*功能:
删除线性表中所有值为x的值的另一种算法
*
*/
intdeleteAllVSeqList(MySeqListmySeqList,intx)
{
if(mySeqList->count==0)
{
printf("该表为空!
\n");
return(0);
}
intp=0,q=0;
while(mySeqList->element[p].id!
=x&&p!
=mySeqList->count-1) //跳过开始不是x的元素
{
++p;
++q;
}
for(;p!
=mySeqList->count-1;++p) //遍历元素,不遍历最后一个元素(为了防止越界)
{
while(mySeqList->element[p].id==x&&p!
=mySeqList->count-1)//如果元素是x,则游标p后移(用while处理多个x连续的情况)
{
++p;
}
if(p!
=mySeqList->count-1)
{
mySeqList->element[q]=mySeqList->element[p];
++q;
}
}
if(mySeqList->element[mySeqList->count-1].id!
=x)
{
mySeqList->element[q]=mySeqList->element[mySeqList->count-1];
++q;
}
mySeqList->count=q;
return
(1);
}
//功能:
找出值为x的元素的前驱和后继的存储位置(即下标)
intlocatePrePostSeqList(MySeqListmySeqList,intx,int&i,int&j)
{
intk=locateSeqList(mySeqList,x);
if(k==-1)
return(0);
if(k==0)
i=-1;
else
i=k-1;
if(k==mySeqList->count-1)
j=-1;
else
j=k+1;
return
(1);
}
//输出线性表的元素值
voidprintSeqList(MySeqList&mySeqList)
{
for(inti=0;icount;++i) //输出线性表的元素值
{
cout<<"学期:
"<element[i].term<<",班级名:
"<element[i].class_name ;
cout<<"学号:
"<element[i].id<<",姓名:
"<element[i].name<<",性别:
"<element[i].sex;
cout<<"语文:
"<element[i].chinese<<",英语:
"<element[i].english<<",数学:
"<element[i].maths;
cout< }
cout<}
//根据学生id,输出线性表的元素值
voidprintSeqListById(MySeqList&mySeqList,intid)
{
for(inti=0;icount;++i) //输出线性表的元素值
{
if(id==mySeqList->element[i].id)
{
cout<<"学期:
"<element[i].term<<",班级名:
"<element[i].class_name;
cout<<"学号:
"<element[i].id<<",姓名:
"<element[i].name<<",性别:
"<element[i].sex;
cout<<"语文:
"<element[i].chinese<<",英语:
"<element[i].english<<",数学:
"<element[i].maths;
cout< break;
}
}
}
intmain(intargc,char*argv[])
{
/*
MySeqListmySeqList=initSeqList(20);//初始化一个长20的表
for(inti=0;i<20;++i) //对表进行赋值
{
mySeqList->count++; //对表进行赋值
mySeqList->element[i]=i; //对表进行赋值
}
*/
MySeqListmySeqList=initSeqList(20);//初始化一个长20的表
L:
system("cls");
cout<<"*********************学生成绩管理系统*****************"< cout<<"***************1.添加学生信息2.查找学生信息**********"< cout<<"***************3.删除学生信息4.修改学生信息**********"< cout<<"***************5.退出学生系统 **********"< inti;
cout<<"请选择一个操作(1-5):
";
cin>>i;
if(i==1)
{
mySeqList->count=1;
intiRc=0;
while(true&&mySeqList->count<20)
{
cout<"< cout<<"classname:
";
cin>>mySeqList->element[iRc].class_name;
if(strcmp(mySeqList->element[iRc].class_name,"*")==0)
{
mySeqList->count--; //此处要减1,请思考为什么要减1哦。
gotoL;
}
cout<<"term:
";
cin>>mySeqList->element[iRc].term;
cout<<"学号:
";
cin>>mySeqList->element[iRc].id;
cout<<"name:
";
cin>>mySeqList->element[iRc].name;
cout<<"sex:
";
cin>>mySeqList->element[iRc].sex;
cout<<"english:
";
cin>>mySeqList->element[iRc].english;
cout<<"chinese:
";
cin>>mySeqList->element[iRc].chinese;
cout<<"maths:
";
cin>>mySeqList->element[iRc].maths;
cout<<"添加学生成绩信息成绩ok."< printSeqList(mySeqList);
mySeqList->count++;
iRc++;
}
}
elseif(i==2)
{
L4:
cout<<"请输入要查找的学生ID:
"<