资源描述
课程设计汇报
课程设计题目: 1:学生成绩管理系统
2:joseph环
3:猴子选大王
姓 名 洪军
学 号 0706
班 级 1421807
指导老师 邹国华
12月 17日
1:学生成绩管理系统
1, 问题分析;
定义一个学生管理系统实现对学生基础数据管理,
录入:输入每位学生信息;
输出:输出每位学生信息;
查询:能够按3学号和4姓名查询某个学生信息;
修改:能够修改学生(按1学号修改,按2成绩修改)信息;
插入:能够插入一个学生信息;
删除:能够删除(按1学号删除,按2成绩删除)满足条件学生信息;
排序:能够按学生总成绩排序。
2 结构分析
首先分析结果我采取是单链表存放结构经过此系统能够实现以下功效:
定义一个学生类型student(学号,姓名,四门课程成绩),学生链表student,含有学生数组和学生数。
3 实现步骤分析
定义数据类型typedef struct student
ò
初始化结构体并输入学生数据inputstu(stu &s,int n)
ò
重载运算符便于输入输出学生成绩
ò
输出函数输出全部学生信息output(stu s)
ò
查找学生 3按学号查找getstu1(stu s,char i[]) 4按姓名查找getstu2(stu s,char c[])
ò
插入学生insetstu(stu &s,int i,char nu[],char na[],char se[],int sc[])
ò
1按学号删除学生deletestu1(stu &s),2按姓名删除学生deletestu2(stu &s)
ò
1按学号修改学生信息update1(stu &s) 2按姓名修改学生信息update2(stu &s)
ò
对总成绩排序sort(stu &s,struct shu shuzu[])
ò
CPP文件实现全部功效
4 算法实现
头文件status.h
typedef int status;
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define N 10
typedef struct student{ //学生结构体(链表)
char num[9];
char name[15];
char sex[2];
int score[4];
student *next;
}student,*stu;
struct shu{ //辅助结构体数组存放学生总成绩和学号便于排序
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;
s=(stu)malloc(sizeof(student)); //申请头节点
r=s;
for(i=0;i<n;i++)
{
p=(student *)malloc(sizeof(student)); //申请链表空间
cin>>p;
r->next=p;
r=p;
}
r->next=NULL; //最终节点指像空
}
status output(stu s) //输出函数
{
student *r;
r=s;
r=r->next;
while(r) //判定结点存在
{
cout<<r; //输出结点
r=r->next;
}
return 0;
}
status getstu1(stu s,char i[])//按学号查找
{
student *p=s;
while(strcmp(p->num,i)!=0) //结点名字相比较
{
p=p->next;
}
if(p) //判定结点存在而且输出
{
cout<<p;
return TURE;
}
else
return ERROR;
}
status getstu2(stu s,char c[])//按名字查找
{
student *p=s->next;
while(strcmp(p->name,c)!=0)
{
p=p->next;
}
if(p) //判定结点存在而且输出
{ cout<<p;return 0;}
else
return ERROR;
}
status insetstu(stu &s,int i,char nu[],char na[],char se[],int sc[]) //插入学生
{
student *p=s,*q;
int j=0,m;
while(j<i-1&&p->next) //找到学生位置
{
p=p->next;
j++;
}
if(j==i-1)
{
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;
}
}
else
return ERROR;
}
status deletestu1(stu &s) //按学号删除学生
{
char i[10];
cout<<"请输入你要删除学生学号"<<endl;
cin>>i;
student *p=s,*r;
while(strcmp(p->next->num,i)!=0) //找到修改学生
{
p=p->next;
}
if(p) //存在就删除不存在就返回错误
{
r=p->next;
p->next=r->next;
free(r);
return 0;
}
else
return ERROR;
}
status deletestu2(stu &s) //按姓名删除学生
{
char i[10];
cout<<"请输入你要删除学生姓名"<<endl;
cin>>i;
student *p=s,*r;
while(strcmp(p->next->name,i)!=0) //找到修改学生
{
p=p->next;
}
if(p)
{
r=p->next;
p->next=r->next;
free(r);
return 0;
}
else
return ERROR;
}
status update1(stu &s) //按学号修改学生信息
{
char i[10];
cout<<"请输入你要修改学生学号"<<endl;
cin>>i;
student *p=s;
while(strcmp(p->num,i)!=0) //找到修改学生
{
p=p->next;
}
if(p)
{
cin>>p;
return 0;
}
else
return ERROR;
}
status update2(stu &s) //按姓名修改学生信息
{
char i[10];
cout<<"请输入你要修改学生姓名"<<endl;
cin>>i;
student *p=s;
while(strcmp(p->name,i)!=0) //找到修改学生
{
p=p->next;
}
if(p)
{
cin>>p;
return 0;
}
else
return ERROR;
}
void sort(stu &s,struct shu shuzu[]) //对总成绩排序
{
int n=0,i,j,k;
student *p=s->next;
while(p){ //获取多少个人数
n++;
p=p->next;
};
p=s->next;
for(i=1;i<=n;i++) //对结构体进行赋值
{ shuzu[i].allscore=0;
for(j=0;j<4;j++)shuzu[i].allscore=shuzu[i].allscore+p->score[j];
strcpy(shuzu[i].num,p->num);
p=p->next;
}
for(i=1;i<n;i++){ //对结构体进行排序
k=i;
for(j=i+1;j<=n;j++)
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);
shuzu[i].allscore=shuzu[k].allscore;
strcpy(shuzu[i].num,shuzu[k].num);
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) //输出函数重载
{
os<<"学号:"<<s->num<<" 姓名:"<<s->name<<" 性别:"<<s->sex<<"科目1 "<<s->score[0]<<"科目2 "<<s->score[1]<<"科目3 "<<s->score[2]<<"科目4 "<<s->score[3]<<endl;
return os;
}
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;
}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;
struct shu shuzu[10];
int i,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;
case 6:cout<<"1:按学号删除学生信息;2:按姓名删除学生信息"<<endl;cin>>j;
switch(j){
case 1:deletestu1(s);break;
case 2:deletestu2(s);break;
};break;
case 7:cout<<"1:按学号修改学生信息;2:按姓名修改学生信息"<<endl;cin>>j;
switch(j){
case 1:update1(s);break;
case 2:update2(s);break;
};break;
case 8:sort(s,shuzu);break;
default:return 0;
}
}
调试结果
5 课程小结
我采取是链表来存放学生信息,最大难点就是总成绩排序,其它功效实现还是比较简单,总成绩排序我用啦一个辅助结构体 struct shu 来存放每个学生学号char num来统计学生和便于排序时候查找,还有总成绩float allscore,且用结构体数组来存放首先对每个学生学号及总成绩赋值给结构体数组shuzu[],然后对结构体数组进行从大到小排序(选择排序)然后对结构体一一查找对应信息。假如用次序表来存放能够避免这方面麻烦。最终对一个管理系统含有很好结构,即对链表一系列操作熟悉及利用
同时也对数据结构这方面认识深刻,数据存放关键性。数据结构在程序设计关键性。
2:joseph环
1 任务分析
编号是1,2,……,nn个人根据顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值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
typedef int status;
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct node{ //结构体存放密码
int mima;
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++)
{
p=(nodelist*)malloc(sizeof(nodelist)); //创建人
if(i==0)
{
q=p;
cin>>p->mima; //输入密码
r->next=p;
r=p;
}
else
{
cin>>p->mima; //输入密码
r->next=p; //开始下一个
r=p;
}
}
r->next=q;
}
void joseph(nodeli &s,int m,int n) //joseph函数
{
nodelist *p=s,*q;
int i;
while(n!=0)
{
i=1;
while(i<m)
{
i++;p=p->next;
}
if(i=m) // 找到目标
{
q=p->next;
p->next=q->next;
cout<<q->mima<<" ";//输出密码
m=q->mima; //把密码在复制给M找下一个
p=p->next;
free(q);
n--;
}
}
cout<<"\n";
}
Cpp文件
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
#include"status.h"
void main()
{
nodeli s; //定义个链表
int n,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,n m,n 为整数,n<m
输出形式:汉字提醒根据m个猴子,数n 个数方法,输出为大王猴子是几号 ,建立一个函数来实现此功效
2结构分析
采取链表来存放每个猴子序号每一次出列将序号为下一次报道M。并输出这个猴子。直到全部些人输出最终猴子为大王下次
3算法实现
Cpp文件
#include<stdio.h>
#include<stdlib.h>
typedef struct houzinode{
int num; //猴子编号
struct houzinode *next;
}houzinode,*houzilist; //猴子类型
void houzidawan(houzilist &s,int n,int m) //求解猴子选大王问题最终输出为大王
{
int i,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()
{
int n,m;
houzilist s;
printf("* * * * * *猴子选大王* * * * * *\n");
printf("输入N,M:");
scanf("%d %d",&n,&m);
printf("出列人员次序为:\n");
houzidawan(s,n,m);//调用函数
return 0;
}
调试结果
}4课程小结
这是一个经典约瑟夫环问题应用到生活中和上一个题目一样只要熟练链表操作就能够比较轻易实现。关键在于每一个猴子输出。找下一个以上一次输出链表序号来实现。最终输出猴子就是大王
东华理工大学
课程设计评分表
学生姓名: 洪军 班级:1421807 学号:0706
课程设计题目:学生成绩管理系统
项目内容
满分
实 评
选
题
能结合所学课程知识、有一定能力训练。符合选题要求
(5人一题)
10
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文件及利用文件资料能力
10
理论依据充足,数据正确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能表现发明性思维,或有独特见解
10
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
10
说明书综述简练完整,概念清楚、立论正确、技术用语正确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清楚
10
设计说明书栏目齐全、合理,符号统一、编号齐全。 格式、绘图、表格、插图等规范正确,符合国家标准
10
有一定篇幅,字符数不少于5000
10
总 分
100
指导老师评语:
指导老师署名:
年 月 日
展开阅读全文