struct
Student
*create()
/*create函数定义,此函数实现创建单向动态链表*/
{
struct
Student
*head=NULL,*p1,*p2
/*head,链表的头指针;*p1,*p2,中间指针变量*/
puts("\n现在请输入学院名:")
scanf("%s",college)
puts("\n年级:")
scanf("%s",grade)
puts("\n专业和班级:")
scanf("%s",classname)
puts("\n下面请按提示依次输入数据:\n(如果要结束输入,请输入学号0)")
p1=p2=(struct
Student
*)malloc(LEN)
puts("输入第一个学生的学号:")
scanf("%ld",&p1->num)
puts("输入此学生成绩:\n英语:")
scanf("%f",&p1->score.english)
puts("数学:")
scanf("%f",&p1->score.math)
puts("计算机:")
scanf("%f",&p1->score.computer)
total_and_aver(p1)/*计算总分和平均分*/
p1->grade=mark_grade(p1)
for(p1->num!=0)
{
len++
if(len==1)
head=p1
else
p2->next=p1
p2=p1
p1=(struct
Student
*)malloc(LEN)
puts("输入下一个学生的学号:")
scanf("%ld",&p1->num)
puts("输入此学生成绩:\n英语:")
scanf("%f",&p1->score.english)
puts("数学:")
scanf("%f",&p1->score.math)
puts("计算机:")
scanf("%f",&p1->score.computer)
total_and_aver(p1)/*计算总分和平均分*/
p1->grade=mark_grade(p1)
}
p2->next=NULL
return
(head)
}
struct
Student
*del(struct
Student
*head,long
del_num)
/*del函数定义,此函数实现从现有链表中删除一个结点*/
{
struct
Student
*p1,*p2
if(head==NULL)
puts("空表,没有任何数据记录。\n")
else
{
for(p1=head!(del_num==p1->num||p1->next==NULL)p2=p1,p1=p1->next)
if(del_num==p1->num)
{
if(p1==head)head=p1->next
else
p2->next=p1->next
printf("学号为%ld学生的数据删除成功。\n",del_num)
--len
}
else
printf("未找到学号为%ld学生的记录。\n",del_num)
}
return
(head)
}
struct
Student
*insert(struct
Student
*head,struct
Student
*new_student)
/*insert函数定义,此函数实现向现有链表中插入一个结点或覆盖相同学号的数据*/
{
struct
Student
*p0=new_student,*p1=head,*p2
char
control
if(head==NULL)
{
head=p0
p0->next=NULL
puts("数据插入成功。\n")
}
else
{
for(((*p0).num>(*p1).num)&&(p1->next!=NULL)p2=p1,p1=p1->next)
if((*p0).num==(*p1).num)
{
printf("已经存在一个学号为%ld的学生的数据,要覆盖原有数据吗?\n输入
Y
=覆盖原有数据\n输入其它=保留原有数据\n",p0->num)
FFLUSH
scanf("%c",&control)
FFLUSH
switch
(control)
{
case
'Y':
case
'y':if(p1==head){head=p0p0->next=p1->next}
else
{p2->next=p0p0->next=p1->next}
puts("数据已经更新\n")break
default:break
}
len--
}
else
if((*p0).num<(*p1).num)
{
if(p1==head)head=p0
else
p2->next=p0
p0->next=p1
puts("数据插入成功。\n")
}
else
{
p1->next=p0
p0->next=NULL
puts("数据插入成功。\n")
}
}
++len
return
(head)
}
struct
Student
*sort(struct
Student
*head)
/*sort函数定义,此函数实现对链表中的数据按照平均分高低排序*/
{
struct
Student
*p1,*p2
for(p1=headp1->next!=NULLp1=p1->next)
for(p2=p1->nextp2!=NULLp2=p2->next)
{
if(p1->score.average<p2->score.average)
{
SWAP(p1->num,p2->num)
SWAP(p1->grade,p2->grade)
SWAP(p1->score.english,p2->score.english)
SWAP(p1->score.math,p2->score.math)
SWAP(p1->score.computer,p2->score.computer)
SWAP(p1->score.total,p2->score.total)
SWAP(p1->score.average,p2->score.average)
}
}
return
head
}
/*接下一楼*/
#include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>#include <iostream>#include <ctime>using namespace std#define max 100//////////////////////////////////////////////////////////////////////////strcut stustruct stu //学生资料结构体{ char name[10] char num[20] //学号 char adress[8] float x,y,z,score int number}
//////////////////////////////////////////////////////////////////////////////student.cppint count=0int temp=0int Exchang=0 //定义数据修改标志,若修改则为1,否则为0class student //学生类{private: stu data[max] char start_delpublic: void input(char *ch1,char *num,char *ch2,float x,float y,float z)//输入 void find(char *num) //查找 void del(char *num) //删除 int check_num(char *num) //确定没有重复学号 { int m=0 while(m<=count) if(!strcmp(num,data[m++].num)) //判断是否相同 break if(m>count) return 0 else return 1 } void taxis() //总分排序 void show() void save()//保存学生资料 void read()//从文件"student"读取学生资料}
void student::input(char *ch1,char *num,char *ch2,float x,float y,float z){ strcpy(data[count].name,ch1) strcpy(data[count].num,num) strcpy(data[count].adress,ch2) data[count].x=x data[count].y=y data[count].z=z count++ Exchang=1//设置已修改数据标志}void student::find(char * num){ int m=0 while(m<=count) if(!strcmp(num,data[m++].num)) break if(m>count) { cout <<"很抱歉,没有该学号的学生" <<endl start_del='n' getch() } else { temp=count count=mstart_del='y' cout <<"该学生的资料为" <<endl <<"序号\t姓名\t学号\t\t地址\t\t\t高数\t英语\t计算机" <<endl show() count=temp getch() }}void student::del(char *num){ char chose find(num) if(start_del=='y') {
cout <<"确实要删除该学生资料? Y/N" <<endl cin >>chose if(chose=='y') { int m=0 while(m<count) if(strcmp(num,data[m++].num)==0)//错在这里 break temp=count count=m if(temp==count) { count=temp-1printf("2") cout <<"该学生资料已删除" <<endl Exchang=1//设置已修改数据标志 } else { while(count<temp) { strcpy(data[count-1].name,data[count].name) strcpy(data[count-1].num,data[count].num) strcpy(data[count-1].adress,data[count].adress) data[count-1].x=data[count].x data[count-1].y=data[count].y data[count-1].z=data[count].z count++
}printf("1") count=temp-1 cout <<"该学生资料已删除" <<endl Exchang=1//设置已修改数据标志 } } else cout <<"学生资料未删除" <<endl getch()
}}void student::taxis(){ int x,y,array[max] int change for(x=0x<countx++) array[x]=data[x].score=data[x].x+data[x].y+data[x].z for(x=0x<count-1x++) for(y=0y<count-1-xy++) if(array[y]<array[y+1]) { change=array[y] array[y]=array[y+1] array[y+1]=change } cout <<"总分\t姓名\t学号\t\t地址\t\t高数\t英语\t计算机" <<endl for(x=0x<countx++) for(y=0y<county++) if(array[x]==data[y].score) { cout <<data[y].score <<"\t" <<data[y].name <<"\t" <<data[y].num <<"\t" <<data[y].adress <<"\t" <<data[y].x <<"\t" <<data[y].y <<"\t" <<data[y].z <<endl } getch() Exchang=1//设置已修改数据标志}
void student::show(){ cout <<count <<"\t" <<data[count-1].name <<"\t" <<data[count-1].num <<"\t" <<data[count-1].adress <<"\t\t" <<data[count-1].x <<"\t" <<data[count-1].y <<"\t" <<data[count-1].z <<endl}
//////////////////////////////////////////////////////////////////////main.cppvoid main(){ student st char *ch1,*ch2,chose char flag[2],num[20],find[20],del[20] char ch
float x,y,z time_t t time(&t)
while(1) { system("cls") cout <<"------------------------学生管理系统------------------------" <<endl
<<" 1.输入/添加学生资料 "<<endl <<" 2.输出学生资料" <<endl <<" 3.查找 " <<endl <<" 4.删除" <<endl <<" 5.总分排序" <<endl <<" 6.退出" <<endl <<endl <<"请选择你要的服务(1-6)"<<endl cin >>chose if(chose=='6') { break } switch(chose) { case '1': // 输入学生信息 { do { cout <<"请输入学生姓名:" <<endl ch1=new char[] ch2=new char[] cin >>ch1 cout <<"请输入学号:" <<endl cin >>num while(st.check_num(num)) { cout <<"学号重复,请重新输入" <<endl cin >>num } cout <<"请输入地址:"<<endl cin >>ch2 cout <<"请输入高数成绩:"<<endl cin >>x cout <<"请输入英语成绩:" <<endl cin >>y cout <<"请输入计算机成绩:" <<endl cin >>z st.input(ch1,num,ch2,x,y,z) printf("\n是否继续输入学生信息?(\"y\"继续)") scanf("%s", flag) }while(strcmp(flag, "y") == 0) }break case '2':// 输出学生资料 { temp=count count=1 cout <<"序号\t姓名\t学号\t\t地址\t\t\t高数\t英语\t计算机" <<endl while(count<=temp) { st.show() count++ } count-- getch() }break case '3': { cout <<"请输入你要查找学生的学号" <<endl cin >>find st.find(find) }break case '4': { cout <<"请输入你要删除的学生学号" <<endl cin >>del st.del(del) }break case '5': { st.taxis() }break
default: { cout <<"输入错误!!!,请重新输入" <<endl getch() } } } cout <<"感谢你的使用!\n" <<endl getch()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)