资源描述
大 连 科 技 学 院
面向对象程序设计(A)课程设计
题 目 学生考勤管理系统报告
学生姓名 xxx 专业班级 软件工程12-1
指导教师 李孝贵 职 称 讲师
所在单位 信息科学系软件工程教研室
教学部主任 王立娟
完毕日期 2023年7月6日
课程设计报告单
学号
Xxx
姓名
Xxx
专业班级
软件工程12-1
考 核 项 目
评分
备注
1
平时工作态度及遵守纪律情况
(10分)
2
掌握基本理论、关键知识、基本技能的限度和阅读参考资料的水平
(10分)
3
独立工作能力、综合运用所学知识分析和解决问题能力及实际工作能力提高的限度
(20分)
4
完毕课程设计说明书及软件的情况与水平(小组分工情况、规范性、整洁清楚、叙述完整性、思绪清楚限度、工作量及实际运营情况和创新性)
(60分)
总评成绩
综 合 评 定:
(优、良、中、及格、不及格)
指导教师签字:
年 月 日
《面向对象程序设计(A)课程设计》任务书
一、课程设计任务及规定:
任务:针对小型信息管理系统或若干综合性设计题目,选择一种软件开发模型,完毕从需求分析、系统设计、系统实现,软件测试的全过程。
规定:
(1) 根据软件系统开发的一般原则,完毕相应系统的功能设计,完毕重要功能模块的程序实现并进行测试训练,给出代码运营结果和相应的设计文档。可以分组进行,但所有学生必须经历整个系统的开发全过程,以便加深对系统开发全过程的结识。
(2)提交课程设计报告。
(3)指标: 规定完毕课程设计报告3000字以上(约二十页);完毕所设计的题目,设计题目的语句行数的和在200行语句以上。
二、工作量
2周(10个工作日)时间
三、计划安排
第1个工作日:查找相关资料、书籍,阅读示例文档,选择题目。
第2个工作日-第4个工作日:设计程序结构、模块图。
第5个工作日-第9个工作日:完毕程序的编码,并且自己调试、测试。穿插进行课程设计报告的撰写。
第10个工作日:上交课程设计报告,由教师检查软件测试效果、检查课程设计报告,给出学生成绩。
指导教师签字:
年 月 日
目录
大 连 科 技 学 院 1
题目: 1
1.需求分析 1
2.概要设计 1
3.具体设计 2
4.编码 9
5.调试分析 11
6.测试结果及运营效果 11
7.系统开发所用到的技术 13
参考文献 15
附录 所有代码 16
题目:
c++课程设计学生考勤管理系统报告
1.需求分析
1.录入学生的缺课记录;
2.修改某个学生的缺课记录;
3.查询某个学生的缺课情况;
4.记录某段时间内,某门课旷课学生姓名及旷课次数,按旷课次数由多到少排序;
5.记录某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;
6.系统以菜单方式工作。
1.3课题意义
程序实践是本科生重要教学环节之一。通过程序实践,强化学生的计算机应用技能,使学生验证、巩固和充实所学的理论知识, 加深对相关内容的理解,拓宽知识面,培养学生的创新精神和实践能力
学生考勤管理程序可以大大减缓学生考勤人员的工作量, 方便了平时上课学生的出勤率的管理。
2.概要设计
根据分析整个系统重要划分为7个功能模块,分别执行规定中的功能。数据管理中可以对学生的基本信息、课程的基本信息、学生缺课的查询、添加、删除和修改。查询管理通过根据学生姓名,课程姓名 时间段儿等信息,查询单个学生的缺课记录,单科课的旷课记录,单个学生的旷课记录。功能模块图如图1所示:
图2-1功能模块图
这个程序是过程性语言设计的。运用多种条件语句,主体采用的是链表指针。系统的设计采用了数组语句、选择语句和循环语句,在需要解决大量同类数据时,这样就使程序书写更加简洁。程序使用了布尔函数。选择语句多采用if多分支选择结构与switch语句。一方面计算switch表达式,然后在caes子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。循环语句采用了for语句等、do-while语句,for语句用于已知循环次数的循环结构,括号中的三个量分别用来表达循环变量初值、循环终值和循环增量。do-while语句先循环后判断, Break语句在switch语句中,保证多分支情况的对的执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的。
3.具体设计
数据结构设计
struct xueke
{char xueke_name[50];
int people_num;
};
这是定义了一个xueke结构体,用来存放一个学科名及其相应的旷课人数;
struct student
{ char name[50];
long time;
int lesson_time;
char lesson_name[50];
int chidao_num;
int zaotui_num;
int qingjia_num;
int kuangke_num;
struct student *next;
};这是定义了一个student的结构体,用来存放一个学生的考勤记录,
其中有,字符数组name[50],lesson_name[50],分别存放学生名字,
缺课课程名字;int型变量lesson_time,chidao_num,zaotui_num,qingjia_num, kuangke_num,分别来存放,缺课节次,迟到次数,早退次数,请假次数,旷课次数 long型变量time,记录时间。
主模块设计
建立学生缺课记录子模块
要建立的学生人数,学生基本信息(涉及缺课时间、学生姓名、课程名称、节次、迟到次数、早退次数、请假次数、旷课次数)可用creat()函数如图1.
图3-1建立学生缺课记录子模块
修改学生缺课记录子模块,根据要修改的学生姓名以及科目名称找到相应的信息,再选择要修改的项目进行单项修改, 如图2:
图3-2修改学生缺课记录子模块
修改学生缺课记录子模块,根据人名可以查出该学生的所有缺课记录,如图3:
图3-3修改学生缺课记录子模块
查看单科旷课记录子模块,根据学科名称和时间范围查出所有在该范围内旷课的学生以及次数 :如图4
图3-4查看单科旷课记录子模块
查看学生旷课记录子模块,根据要查询的学科名称及时间段查出在改时间段内该门课上旷课的人数, 如图5
图3-5查看学生旷课记录子模块
载入学生旷课记录子模块,可以载入实现储存在当前文献夹中txt文献中所储存的数据, 如图6
图3-6载入学生旷课记录子模块
储存学生旷课记录子模快,进入系统界面,顺序的完毕各项操作,进行数据的输入,信息的保存调用相应的函数打开相应的地址,查询各项信息。如图7
图3-7储存学生旷课记录子模快
4.编码
void main()
{
struct student *head;
int a,b,c;
zhuye: cout<<"$$$$$$$$$$$$$$$$$$$$$$ 欢迎使用学生考勤管理系统 V1.0.0 $$$$$$$$$$$$$$$$$$\n";
cout<<" 1_进入管理\n\n\n";
cout<<" 2_查看系统相关信息\n\n\n";
cout<<"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n\n\n\n\n";
cin>>a;
if(a==1)
{
do
{ cout<<"********************************************************************************\n";
cout<<" 1_建立学生缺课记录\n";
cout<<" 2_修改学生缺课记录\n";
cout<<" 3_查询学生缺课记录\n";
cout<<" 4_查看单科旷课记录\n";
cout<<" 5_查看学生旷课记录\n";
cout<<" 6_载入学生旷课记录\n";
cout<<" 7_储存学生旷课记录\n";
cout<<" 8_退出考勤管理程序\n";
cout<<"********************************************************************************\n";
cin>>b;
switch(b)
{
case 1:
head=creat();
print(head);
break;
case 2:
head=xiugai(head);
print(head);
break;
case 3:
chaxun(head);
break;
case 4:
head=tongji_lesson(head);
break;
case 5:
head=tongji_student(head);
break;
case 6:
head=zairu();print(head);
break;
case 7:
chucun(head);
break;}
}while(b!=8);
}
else
{cout<<"******************************欢迎使用本系统 **************************************\n";
cout<<"******************************返回主页请按1*************************************\n";
cin>>c;
5.调试分析
在调试过程中出现了许多错误,并通过一系列分析之后 ,终于把错误改正。程序错误重要出现在逻辑上。编译无语法错误,而在运营时出现异常,使程序不能运营下去,这是常见且难以解决的错误,需要不断地实践且总结经验。在该整个程序中,重要出现的错误重要出现在指针方面。特别是对链表中的结点的一系列删除操作中,若链表为定义头结点,则需分删除链表第一个结点而不是第一个结点这两种情况进行编程。此外,对于数据成员的输入,需要按一定的规定来输入,虽然有一些输入提醒信息,但由于输入操作符的限制,还是因输入错误导致而导致程运营出现不合理的结果。
6.测试结果及运营效果
运营
开始菜单
图6-1 开始菜单
主菜单
图6-2 主菜单
建立学生缺课记录
图6-3建立学生缺课记录
储存学生旷课记录
图6-4储存学生旷课记录
7.系统开发所用到的技术
Visual C++ 6.0
应用语言C++
注释:C++是在C语言引入了面向机制而形成的一种程序设计语言,程序结构灵活,代码简洁清楚,可移植性强,支持数据抽象,面向对象程序设计和泛型程序设计。所以它是一种应用广泛的系统语言。
参考文献
[1] 张红梅,于明,程序设计实验教程,中国铁道出版社,2023
[2] 徐武,周启涛,葛卉娟,Visual C++与Oracle数据库编程案例,电子工业出版社,2023
[3] 网冠科技,Visual C++ 6.0时尚编程百例,机械工业出版社,2023
[4] 求是科技,Visual C++ 6.0程序设计与开发技术大全,人民邮电出版社,2023
[5] 广正工作室 《C++ Builder实用教程》[M]. 机械工业出版社 1998年
[6] Matt Tells 《高级编程指南——C++ Builder》[M]. 中国水利水电出版社 1998年
附录 所有代码
#include<cstdio> //cstdio是将stdio.h的内容用C++头文献的形式表达出来
#include<iostream>
#include<malloc.h> //malloc的全称是memory allocation,中文叫动态内存分派,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分派内存。
#include<cstring> //当调用库函数,客户程序提供的是string类型参数,而库函数内部实现用的是c-串,因此需要将string对象,转化为char*对象,而c_str()提供了这样一种方法,它返回一个客户程序可读不可改的指向字符数组的指针。
#include<iomanip> //I/O流控制头文献
#define NULL 0
#define guding 10
#define LEN sizeof(struct student)
using namespace std;
int student_num;
FILE *fp1;
struct xueke
{char xueke_name[50];
int people_num;
};
struct student
{ char name[50];
long time;
int lesson_time;
char lesson_name[50];
int chidao_num;
int zaotui_num;
int qingjia_num;
int kuangke_num;
struct student *next;
};
void chaxun(struct student *head)
{ int i;
char chaxun_name[50];
cout<<"请输入要查询的人名:";
cin>>chaxun_name;
struct student *p;
if(head==NULL)
cout<<"联系人为空";
p=head;
for(i=0;i<student_num;i++)
{if(strcmp(chaxun_name,p->name)==0)
{cout<<"缺课时间:"<<p->time<<" 学生姓名:"<<p->name<<" 课程名称:"<<p->lesson_name<<" 节次:"<<p->lesson_time<<endl
<<"迟到次数:"<<p->chidao_num<<" 早退次数:"<<p->zaotui_num<<" 请假次数:"<<p->qingjia_num<<" 旷课次数:"<<p->kuangke_num<<endl;
}
p=p->next; }
}
struct student *xiugai(struct student *head)
{char xiugai_name[50];
char xiugai_xueke_name[50];
int k;
cout<<"请输入要修改的学生姓名与学科名称【格式:学生姓名(空格)学科名称】:";
cin>>xiugai_name>>xiugai_xueke_name;
struct student *p1,*p2;
p2=(struct student *)malloc(LEN);
p1=head;
if(head==NULL)
{cout<<"没有学生信息\n";
return head; }
while((strcmp(xiugai_name,p1->name)!=0||strcmp(xiugai_xueke_name,p1->lesson_name)!=0)&&(p1->next!=NULL))
p1=p1->next;
if(strcmp(xiugai_name,p1->name)==0&&strcmp(xiugai_xueke_name,p1->lesson_name)==0)
{ cout<<"==================================== 修改信息 =================================\n";
cout<<" 1-修改缺课时间 \n";
cout<<" 2-修改学生姓名 \n";
cout<<" 3-修改课程名称 \n";
cout<<" 4-修改第几节缺课 \n";
cout<<" 5-修改迟到次数 \n";
cout<<" 6-修改早退次数 \n";
cout<<" 7-修改请假次数 \n";
cout<<" 8-修改旷课次数 \n\n";
cout<<"================================================================================\n";
cin>>k;
switch(k)
{case 1:
cout<<"请输入新的缺课时间:";
cin>>p1->time;
break;
case 2:
cout<<"请输入新的学生姓名:";
cin>>p1->name;
break;
case 3:
cout<<"请输入新的课程名称:";
cin>>p1->lesson_name;
break;
case 4:
cout<<"请输入新的缺课节次:";
cin>>p1->lesson_time;
break;
case 5:
cout<<"请输入新的迟到次数:";
cin>>p1->chidao_num;
break;
case 6:
cout<<"请输入新的早退次数:";
cin>>p1->zaotui_num;
break;
case 7:
cout<<"请输入新的请假次数:";
cin>>p1->qingjia_num;
break;
case 8:
cout<<"请输入新的旷课次数:";
cin>>p1->kuangke_num;
break; }
}
return head;
}
struct student *creat()
{
int i,b;
struct student *head,*p1,*p2;
cout<<"请输入要建立资料的学生人数:";
cin>>b;
head=p2=NULL;
p1=(struct student *)malloc(LEN);
cout<<"【输入格式:缺课时间(空格)学生姓名(空格)课程名称(空格)第几节(空格)迟到次数(空格)早退次数(空格)请假次数(空格)旷课次数】\n";
cout<<"请输入第1名学生信息:";
cin>>p1->time>>p1->name>>p1->lesson_name>>p1->lesson_time>>p1->chidao_num>>p1->zaotui_num>>p1->qingjia_num>>p1->kuangke_num;
head=p1;
p2=p1;
student_num+=1;
for(i=1;i<b;i++)
{
p1=(struct student*)malloc(LEN);
cout<<"请输入第"<<i+1<<"名学生信息:";
cin>>p1->time>>p1->name>>p1->lesson_name>>p1->lesson_time>>p1->chidao_num>>p1->zaotui_num>>p1->qingjia_num>>p1->kuangke_num;
p2->next=p1;
p2=p1;
student_num+=1;
}
p2->next=NULL;
return head;
}
void print(struct student *head)
{struct student *p;
p=head;
if(p==NULL)
cout<<"没有学生信息\n";
while(p!=NULL)
{ cout<<"缺课时间:"<<p->time<<" 学生姓名:"<<setw(10)<<p->name<<" 课程名称:"<<p->lesson_name<<" 节次:"<<p->lesson_time<<endl
<<"迟到次数:"<<p->chidao_num<<" 早退次数:"<<p->zaotui_num<<" 请假次数:"<<p->qingjia_num<<" 旷课次数:"<<p->kuangke_num<<endl;
p=p->next;}
}
struct student *tongji_lesson(struct student *head)
{ struct student *p1,*p2,*p3;
char lesson[50];
long look_time1,look_time2;
int xunhuan_num=0;
p3=(struct student *)malloc(LEN);
if(head==NULL)
{cout<<"没有学生信息";
return(head); }
p1=head;
p2=p1->next;
while(xunhuan_num<student_num)
{while(p2!=NULL)
{
if(p2->kuangke_num>p1->kuangke_num)
{
p3->chidao_num=p2->chidao_num;
p3->kuangke_num=p2->kuangke_num;
p3->qingjia_num=p2->qingjia_num;
p3->zaotui_num=p2->zaotui_num;
p3->lesson_time=p2->lesson_time;
p3->time=p2->time;
strcpy(p3->lesson_name,p2->lesson_name);
strcpy(p3->name,p2->name);
p2->chidao_num=p1->chidao_num;
p2->kuangke_num=p1->kuangke_num;
p2->qingjia_num=p1->qingjia_num;
p2->zaotui_num=p1->zaotui_num;
p2->lesson_time=p1->lesson_time;
p2->time=p1->time;
strcpy(p2->lesson_name,p1->lesson_name);
strcpy(p2->name,p1->name);
p1->chidao_num=p3->chidao_num;
p1->kuangke_num=p3->kuangke_num;
p1->qingjia_num=p3->qingjia_num;
p1->zaotui_num=p3->zaotui_num;
p1->lesson_time=p3->lesson_time;
p1->time=p3->time;
strcpy(p1->lesson_name,p3->lesson_name);
strcpy(p1->name,p3->name);
}
p1=p2;
p2=p2->next;
}
p1=head;
p2=p1->next;
xunhuan_num++;
}
cout<<"请输入要查看的学科名称:";
cin>>lesson;
cout<<"请输入要查看的时间范围【输入格式:时间(空格)时间】";
cin>>look_time1>>look_time2;
p1=head;
while(p1!=NULL)
{if(strcmp(lesson,p1->lesson_name)==0&&look_time1<=p1->time&&p1->time<=look_time2)
cout<<"学生姓名:"<<p1->name<<" 旷课次数:"<<p1->kuangke_num<<endl;
p1=p1->next; }
return head;
}
struct student *tongji_student(struct student *head)
{ struct xueke a[10];
int n,i,j,zhongjian;
struct student *p1;
char zhongjian_name[50];
long look_time1,look_time2;
if(head==NULL)
{cout<<"没有学生信息\n";
return head;
}
cout<<"请输入一共的学科数:";
cin>>n;
for(i=0;i<n;i++)
{cout<<"请输入第"<<i+1<<"个学科名称:";
cin>>a[i].xueke_name;
a[i].people_num=0;
}
cout<<"请输入要查看的时间范围由小到大【输入格式:时间(空格)时间】";
cin>>look_time1>>look_time2;
p1=head;
for(i=0;i<n;i++)
{while(p1!=NULL&&look_time1<=p1->time&&p1->time<=look_time2)
{if(a[i].xueke_name==p1->lesson_name)
a[i].people_num+=p1->kuangke_num;
p1=p1->next;}
p1=head;
}
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
{if(a[i].people_num<a[i+1].people_num)
{ zhongjian=a[i+1].people_num;
a[i+1].people_num=a[i].people_num;
a[i].people_num=zhongjian;
strcpy(zhongjian_name,a[i+1].xueke_name);
strcpy(a[i+1].xueke_name,a[i].xueke_name);
strcpy(a[i].xueke_name,zhongjian_name);}
else if(a[i].people_num==a[i+1].people_num&&strcmp(a[i].xueke_name,a[i+1].xueke_name)>0)
{ zhongjian=a[i+1].people_num;
a[i+1].people_num=a[i].people_num;
a[i].people_num=zhongjian;
strcpy(zhongjian_name,a[i+1].xueke_name);
strcpy(a[i+1].xueke_name,a[i].xueke_name);
strcpy(a[i].xueke_name,zhongjian_name);}
}
for(i=0;i<n;i++)
{cout<<"学科名称:"<<a[i].xueke_name<<" 旷课次数:"<<a[i].people_num<<endl;
return head;}
return head;
}
struct student *zairu()
{struct student *p1=NULL,*p2=NULL,*head=NULL;
struct student student_ziliao[100];
int i=0,n=0;
if((fp1=fopen("xueshengziliao.txt","rb+"))==NULL)
{ printf("cannot open file\n");
return(head); }
while(!feof(fp1))
{if(fread(&student_ziliao[i],LEN,1,fp1)!=1)
{if(feof(fp1))
{fclose(fp1);
break; }
printf("file read error\n");}
i++;
}
n=i;
student_num=n;
p1=p2=(struct student *)malloc(LEN);
head=p1;
for(i=0;i<n;i++)
{p1->chidao_num=student_ziliao[i].chidao_num;
p1->kuangke_num=student_ziliao[i].kuangke_num;
strcpy(p1->lesson_name,student_ziliao[i].lesson_name);
p1->lesson_time=student_ziliao[i].lesson_time;
strcpy(p1->name,student_ziliao[i].name);
p1->qingjia_num=student_ziliao[i].qingjia_num;
p1->time=student_ziliao[i].time;
p1->zaotui_num=student_ziliao[i].zaotui_num;
p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN); }
p2->next=NULL;
return(head);
}
void chucun(struct student *head)
{ struct student *p1;
p1=head;
fp1=fopen("xueshengziliao.txt","wb+");
while(p1!=NULL)
{fwrite(p1,LEN,1,fp1);
p1=p1->next; }
fclose(fp1);
cout<<" 储存成功\n";
}
void main()
{
struct student *head;
int a,b,c;
zhuye: cout<<"$$$$$$$$$$$$$$$$$$$$$$ 欢迎使用学生考勤管理系统 V1.0.0 $$$$$$$$$$$$$$$$$$\n";
cout<<" 1_进入管理\n\n\n";
展开阅读全文