数据结构课程设计学生成绩管理系统

更新时间:2023-06-08 16:07:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

这是自己写的课程设计,嘿嘿。

课程设计报告

课程设计题目:1:学生成绩管理系统 2:joseph环 3:猴子选大王

姓名洪军

学号 201420180706 班级1421807 指导教师邹国华

2015年 12月 17日

这是自己写的课程设计,嘿嘿。

1:学生成绩管理系统

1, 问题分析;

定义一个学生管理系统实现对学生基本数据的管理, 录入:输入每位学生的信息; 输出:输出每位学生的信息;

查询:可以按3学号和4姓名查询某个学生的信息;

修改:可以修改学生(按1学号修改,按2成绩修改)的信息; 插入:可以插入一个学生的信息;

删除:可以删除(按1学号删除,按2成绩删除)满足条件的学生信息; 排序:可以按学生的总成绩排序。

2 结构分析

首先分析结果我采用的是单链表的存储结构通过此系统可以实现如下功能: 定义一个学生类型student(学号,姓名,四门课程成绩),学生链表student,含有学生数组和学生数。

3 实现流程分析

定义数据类型typedefstruct student

初始化结构体并输入学生的数据inputstu(stu&s,int n)

重载运算符便于输入输出学生的成绩

输出函数输出全部学生的信息output(stu s)

查找学生 3按学号查找getstu1(stus,char i[]) 4按姓名查找getstu2(stus,char c[])

插入学生insetstu(stu&s,inti,char nu[],char na[],char se[],intsc[])

1按学号删除学生deletestu1(stu&s),2按姓名删除学生deletestu2(stu&s)

这是自己写的课程设计,嘿嘿。

1按学号修改学生的信息update1(stu&s)2按姓名修改学生的信息update2(stu&s)

对总成绩排序sort(stu&s,structshushuzu[])

CPP文件实现所有功能

4 算法实现

头文件status.h

typedefint status; #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define N 10

typedefstruct student{ //学生结构体(链表)

char num[9]; char name[15]; char sex[2]; int score[4];

student *next; }student,*stu;

structshu{ //辅助结构体数组存储学生总成绩和学号便于排序

float allscore; char num[9];

}shuzu[10];

ostream&operator<<(ostream&os,stu&s); //运算符的重载 istream&operator>>(istream&is,stu&s); //运算符的重载 void inputstu(stu&s,int n) //初始化并且输入函数 {

student *p,*r;

int i; r=s; {

p=(student *)malloc(sizeof(student)); //申请链表空间

s=(stu)malloc(sizeof(student)); //申请头节点 for(i=0;i<n;i++)

这是自己写的课程设计,嘿嘿。

cin>>p; }

status output(stu s) //输出函数 { }

status getstu1(stus,char i[])//按学号查找 { }

status getstu2(stus,char c[])//按名字查找 {

student *p=s->next;

while(strcmp(p->name,c)!=0) { }

if(p) //判断结点存在并且输出 { else

return ERROR; cout<<p;return 0;} p=p->next; student *p=s;

while(strcmp(p->num,i)!=0) //结点的名字相比较 { }

if(p) //判断结点存在并且输出 { } else

return ERROR; cout<<p; return TURE; p=p->next; student *r; r=s; r=r->next;

while(r) //判断结点存在 {

cout<<r; //输出结点 } return 0;

r=r->next; r->next=p; r=p; }

r->next=NULL; //最后节点指像空

这是自己写的课程设计,嘿嘿。

}

status insetstu(stu&s,inti,char nu[],char na[],char se[],intsc[]) //插入学生 { }

status deletestu1(stu&s) //按学号删除学生 {

char i[10];

cout<<"请输入你要删除学生的学号"<<endl; cin>>i;

while(strcmp(p->next->num,i)!=0) //找到修改学生 { }

if(p) //存在就删除不存在就返回错误 { r=p->next; p->next=r->next; free(r);

p=p->next; student *p=s,*q; int j=0,m;

while(j<i-1&&p->next) //找到学生的位置 { } if(j==i-1) { }

else

return ERROR;

q=(student*)malloc(sizeof(student)); //申请新结点 if(!q)return OVERFLOW; //申请失败返回错误 { }

strcpy(q->name,na); //赋值

strcpy(q->num,nu); for(m=0;m<4;m++) q->score[m]=sc[m]; strcpy(q->sex,se); q->next=p->next; p->next=q; return OK;

p=p->next; j++;

student *p=s,*r;

这是自己写的课程设计,嘿嘿。

}

} else

return ERROR;

status deletestu2(stu&s) //按姓名删除学生 { }

status update1(stu&s) //按学号修改学生的信息 { }

char i[10];

cout<<"请输入你要修改学生的学号"<<endl; cin>>i;

while(strcmp(p->num,i)!=0) //找到修改学生 { } if(p) { } else

return ERROR; cin>>p; return 0; p=p->next; char i[10];

cout<<"请输入你要删除学生的姓名"<<endl; cin>>i;

while(strcmp(p->next->name,i)!=0) //找到修改学生 { } if(p) { r=p->next; p->next=r->next; free(r); return 0; } else

return ERROR; p=p->next;

student *p=s,*r;

student *p=s;

这是自己写的课程设计,嘿嘿。

status update2(stu&s) //按姓名修改学生的信息 { }

void sort(stu&s,structshushuzu[]) //对总成绩排序 {

int n=0,i,j,k; student *p=s->next;

while(p){ //获取多少个人数 }; p=s->next;

for(i=1;i<=n;i++) //对结构体进行赋值 { shuzu[i].allscore=0; }

for(i=1;i<n;i++){ //对结构体进行排序

k=i;

if(shuzu[j].allscore>shuzu[k].allscore)

k=j; if(k!=j)

{shuzu[0].allscore=shuzu[i].allscore;

strcpy(shuzu[0].num,shuzu[i].num); strcpy(shuzu[i].num,shuzu[k].num);

for(j=i+1;j<=n;j++)

for(j=0;j<4;j++)shuzu[i].allscore=shuzu[i].allscore+p->score[j]; strcpy(shuzu[i].num,p->num); p=p->next; n++; p=p->next; char i[10];

cout<<"请输入你要修改学生的姓名"<<endl; cin>>i;

while(strcmp(p->name,i)!=0) //找到修改学生 { } if(p) { } else

return ERROR; cin>>p; return 0; p=p->next;

student *p=s;

shuzu[i].allscore=shuzu[k].allscore; shuzu[k].allscore=shuzu[0].allscore;

这是自己写的课程设计,嘿嘿。

}

}

}

strcpy(shuzu[k].num,shuzu[0].num);

for(i=1;i<=n;i++)

{ //对总成绩从大到小输出 p=s->next; }

{ }

while(strcmp(p->num,shuzu[i].num)!=0) //按学号查找相对应的学生信息

p=p->next;

cout<<p<<" 总成绩为 :"<<shuzu[i].allscore<<endl;

ostream&operator<<(ostream&os,stu&s) //输出函数的重载 { }

istream&operator>>(istream&is,stu&s) //输入函数的重载

{ cout<<""<<"学号 "<<"姓名 "<<"性别 "<<"科目1 "<<"科目2 "<<"科目3 "<<"科目4 "<<endl; is>>s->num>>s->name>>s->sex>>s->score[0]>>s->score[1]>>s->score[2]>>s->score[3];

return is;

os<<"学号:"<<s->num<<" 姓名:"<<s->name<<" 性别:"<<s->sex<<"科目1 "<<s->score[0]<<"科目2 return os;

"<<s->score[1]<<"科目3 "<<s->score[2]<<"科目4 "<<s->score[3]<<endl;

}CPP文件

#include<iostream.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include"Status.h" void menu() {

cout<<"* * * * * * * *学生管理系统* * * * * * *"<<endl; cout<<"* * * 1:添加学生 * * *"<<endl;

cout<<"* * * 2:显示信息 * * *"<<endl; cout<<"* * * 3:按学号查找 * * *"<<endl; cout<<"* * * 4:按姓名查找 * * *"<<endl; }

cout<<"* * * 5: 插入学生 * * *"<<endl; cout<<"* * * 6: 删除学生 * * *"<<endl; cout<<"* * * 7: 修改学生 * * *"<<endl; cout<<"* * * 8: 学生总成绩排序 * * *"<<endl; cout<<"* 其他:返回主菜单"<<endl; cout<<"请选择";

这是自己写的课程设计,嘿嘿。

int main() { stu s;

structshushuzu[10]; inti,k[4],j;

char c[9],p[9]; char x[20],o[20]; char l[3];

menu(); while(1) { }

static int n; scanf("%d",&n); switch(n) {

case 1:cout<<"输入多少个学生"<<endl;cin>>n;inputstu(s,n);break; case 2:output(s);break;

case 3:cout<<"请输入你要找的学生学号:";cin>>c;getstu1(s,c);break; case 4:cout<<"请输入你要找的学生姓名:";cin>>x;getstu2(s,x);break;

case 5:cout<<"需要插入位置,学号,姓名,性别,科目1,科目2,科目3,科目4"<<endl;

cin>>i>>p>>o>>l;for(j=0;j<4;j++)cin>>k[j]; insetstu(s,i,p,o,l,k);break; switch(j){

case 1:deletestu1(s);break; case 2:deletestu2(s);break; };break; switch(j){

case 1:update1(s);break; case 2:update2(s);break; };break;

case 6:cout<<"1:按学号删除学生的信息;2:按姓名删除学生的信息"<<endl;cin>>j;

case 7:cout<<"1:按学号修改学生的信息;2:按姓名修改学生的信息"<<endl;cin>>j;

case 8:sort(s,shuzu);break; default:return 0; }

调试结果

这是自己写的课程设计,嘿嘿。

这是自己写的课程设计,嘿嘿。

这是自己写的课程设计,嘿嘿。

这是自己写的课程设计,嘿嘿。

5 课程小结

我采用的是链表来存储学生的信息,最大的难点就是总成绩的排序,其他的功能实现还是比较简单,总成绩排序我用啦一个辅助结构体structshu来存储每个学生的学号char num来记录学生以及便于排序的时候查找,还有总成绩float allscore,且用结构体数组来存储首先对每个学生的学号及总成绩赋值给结构体数组shuzu[],然后对结构体数组进行从大到小排序(选择排序)然后对结构体一一查找相应的信息。假如用顺序表来存储可以避免这方面的麻烦。最后对一个管理系统具有较好的结构,即对链表的一系列的操作熟悉及运用

同时也对数据结构这方面的认识深刻,数据存储的重要性。数据结构在程序设计的重要性。

这是自己写的课程设计,嘿嘿。

2:joseph环

1 任务分析

编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。 要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。 测试数据:

m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么? 要求:

输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。

输出形式:建立一个输出函数,将正确的输出序列

2结构分析

采用链表来存储每个人的密码每一次出列将密码为下一次报道的M。并输出这个人。直到所有人输出

3算法实现

头文件status.h

typedefint status; #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2

typedefstruct node{ //结构体存储密码

intmima; struct node *next;

}nodelist,*nodeli;

void creatlist(nodeli&s,int n) //创建循环链表 {

nodelist *p,*r,*q; int i;

s=(nodeli)malloc(sizeof(nodelist)); //申请空间 r=s;

这是自己写的课程设计,嘿嘿。

}

cout<<"输入他们的密码:"<<endl; //输入他们的密码 for(i=0;i<n;i++) { } r->next=q;

p=(nodelist*)malloc(sizeof(nodelist)); //创建人 if(i==0) { } else { }

cin>>p->mima;//输入密码 r=p;

r->next=p; //开始下一个

q=p; r->next=p; r=p;

cin>>p->mima; //输入密码

void joseph(nodeli&s,intm,int n) //joseph函数 { }

nodelist *p=s,*q; int i; while(n!=0) {

while(i<m) { }

if(i=m) // 找到目标 { } }

cout<<"\n";

q=p->next; p->next=q->next;

cout<<q->mima<<" ";//输出密码

m=q->mima; //把密码在复制给M找下一个 p=p->next; free(q); n--;

i++;p=p->next;

i=1;

这是自己写的课程设计,嘿嘿。

Cpp文件

#include<stdio.h> #include<stdlib.h> #include<iostream.h> #include"status.h" void main() {

nodeli s; //定义个链表 intn,m=20,l;

cout<<"输入人的个数"<<endl; cin>>n; //输入人的个数 creatlist(s,n); //创建链表 cout<<"输入初始的M "<<endl; cin>>l; m=l; joseph(s,m,n); //JOSEPH函数调用 }

调试结果

4课程小结

这是一个典型的约瑟夫环差不多的问题只要熟练链表的操作就可以比较容易实现。关键在于每一个的输出。找下一个以上一次输出链表的密码来实现的。关键对数据结构分析的重要。链表的运用熟练

这是自己写的课程设计,嘿嘿。

3:猴子选大王

1 任务分析

7、 猴子选大王

一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:

输入数据:输入m,nm,n 为整数,n<m

输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能

2结构分析

采用链表来存储每个猴子的序号每一次出列将序号为下一次报道的M。并输出这个猴子。直到所有人输出最后的猴子为大王下次

3算法实现

Cpp文件

#include<stdio.h> #include<stdlib.h>

typedefstructhouzinode{ intnum; //猴子编号 structhouzinode *next;

}houzinode,*houzilist; //猴子类型

void houzidawan(houzilist&s,intn,int m) //求解猴子选大王问题最后输出的为大王 { inti,j; houzinode *r,*p,*q; s=(houzilist)malloc(sizeof(houzinode)); //头结点 r=q=s; //r p 指向头结点 q=r;

for(i=1;i<=n;i++){

p=(houzilist)malloc(sizeof(houzinode));//产生结点 p->num=i; //给猴子赋值 r->next=p;r=p; }

r->next=q->next;//指向第一个猴子

这是自己写的课程设计,嘿嘿。

p=q->next;

for(i=1;i<n;i++){

for(j=1;j<m;j++){ //找猴子正好报这个数 r=p; p=p->next; }

printf("%d ",p->num); //输出即将淘汰的猴子 r->next=p->next; free(p); //淘汰去 p=r->next; }

printf("大王为%d\n",r->num);//最后一个猴子 free(r); }

int main() { intn,m; houzilist s; }

printf("* * * * * *猴子选大王* * * * * *\n"); printf("输入N,M:"); scanf("%d %d",&n,&m); printf("出列人员的顺序为:\n"); houzidawan(s,n,m);//调用函数 return 0;

调试结果

这是自己写的课程设计,嘿嘿。

}4

课程小结

这是一个典型的约瑟夫环的问题应用到生活中与上一个的题目一样只要熟练链表的操作就可以比较容易实现。关键在于每一个猴子的输出。找下一个以上一次输出链表的序号来实现的。最后输出的猴子就是大王

这是自己写的课程设计,嘿嘿。

东华理工大学 课程设计评分表

学生姓名:洪军班级:1421807学号:201420180706 课程设计题目:学生成绩管理系统

本文来源:https://www.bwwdw.com/article/mmf1.html

Top