C++ 课 程 设 计 实 验 报 告
学号 姓名
院系专业 能源与环境工程 热能与动力工程
一、 课题名称
《教学事务管理系统》
二、 问题陈述
使用面向对象设计的系统分析和设计,设计出适当的数据结构,编写一个信息管理程序,程序的功能是管理学生基本信息,要求具有添加,删除,查询,排序的功能,并具有一定的查询功能。
三、 设计目标和设计任务
新学期开学时新学生需要注册,登记注册信息。注册信息包括每个已注册学生的班级代号、学号、姓名、注册的学期等。
每个学期开始,学生可以选课,登记选课信息。选课信息包括已注册的每个学生所选的课程,选课仅限该生注册的学期。
每个学期考试完毕,需要成绩登记。每个学生所选课程的考核成绩,以及此成绩的类型。
所输入学生的信息如果有误,可以修改。对于退学、转学的学生,删除有关资料,对转入的学生,可以增加其各项信息。
学生信息包括:学号、班级、院系、姓名、性别、联系电话、家庭住址等。 课程信息包括:课程代号、课程名、开课学期、学分、课时。
成绩信息包括:姓名、学号、班级、课程代号、成绩、类别(初修、补考、重修)。 可提供的查询功能:
根据某些信息(班级、性别、专业)查询学生名单;
某门课程的选修者名单(含学号、成绩、成绩类型);
某个学生某个课程某学期的成绩单;
某个班级某个课程各个学生的成绩单;
某个课程选修者中不及格学生的名单;
某个课程的各项信息(课程代号、学分、课时、开课学期);
四、 解题算法思想
程序包括11个对话框,主对话框上四个按钮,分别调用“注册信息”、“选课信息”、“成绩录入”及“信息管理和查询”四个子对话框。
其中,在“注册信息”对话框内可以选择学生的注册学期,点击“确定”按钮后,弹出“学生信息”对话框,此对话框与后面将会提到的“信息管理与查询”对话框的子对话框之一,“学生信息”相同,二者可相互共享。在该对话框中点击“增加”按钮,将调用“成员对话框”,用以实现学生的注册。信息填写完整后点击“确定”,并可依次返回至主对话框。
接着,点击“选课信息登记”,弹出选课信息对话框,在相应输入框或下拉菜单中输入信息后,点击所要选的课程(可多选),然后点“确定”,程序可以自行判断信息输入是否合理(选课学生是否已经注册或是否已选择同样的课程),如果有误,则通过消息框提示,并可以再次输入信息;如果信息合理,则提示选课成功。
点击“返回”回到主对话框,可通过“学生成绩录入”按钮调用“成绩录入”对话框,在此对话框中,可在输入框或下拉菜单中填写相关信息,程序同样可以自行判断信息输入的合理性(输入的学生是否已注册或是否已选择相应课程),如果输入有误,则弹出消息框提示,可以再次输入信息;如果信息合理,则成绩录入成功,新的成绩信息会在下方的List Control控件中显示。也可以直接点击下方List中的原有信息,程序会自动将该信息中的学生学号及相应课程代码填写入上方控件,方便成绩的录入。所有成绩录入完成后,点击“完成并保存”按钮,保存已录入的信息,同时自动返回至主对话框。
如需要查询相应信息,可点击“信息管理与查询入口”,调用“信息管理与查询”对话框。在这个对话框中,包含三个主要功能按钮,“学生信息”,“课程信息”和“成绩信息”,分别用以提供相应的查询功能。
点击“学生信息”,进入“学生信息”对话框。在这里可以实现学生信息的查询及管理功能。在上方控件中填写或选择相应信息后,便可以在下方的List Control控件中查看到所要的学生信息,同时选中相应条目后,可以通过右方的“删除”、“增
加”和“修改”按钮,实现数据的管理。而通过下方“载入”和“保存”按钮,可以载入及保存现有数据,当然也可以载入进之前保存的文件,从而实现相同学生,不同学期的信息查询。
返回至“信息管理与查询”对话框后,点击“课程信息”按钮,在弹出的“课程信息”对话框中,可以查看所有的课程的基本信息,并可以通过“增加课程”按钮,调用“增加课程”对话框,填写新课程信息,从而增加新的课程;在“课程信息”中的控件中选择某门课程后,也可以通过“查看课程”按钮调用“查看课程”对话框,查看到选修该课程的学生名单,包括学号,成绩等信息,勾选上方控件后可以查看不及格学生的名单。
依次返回至“信息管理与查询对话框”,点击“成绩信息”后,进入“成绩信息”对话框。在这个对话框中可以在下方的List Control看到所有学生的成绩单,通过上方的Edit控件输入各个相应的筛选条件,便可以在下方看到所有符合条件的学生的成绩单。
依次返回至主对话框,点击“◎”退出程序。
五、 数据结构描述
程序数据通过两个节点类、两个链表类来存储。
分别如下:
{
public:
CString m_CourseNum;//存储课程代码 CString m_CourseName;//存储课程名 CString m_CourseTerm;//存放课程开课学期 CString m_CoursePoint;//存放课程学分 CString m_CourseTime;//存放课程课时数 int m_CourseScore;//存放学生课程成绩 CString m_CourseType;//存放学生成绩类型 Course *next; Course()//默认构造函数 class Course
{ } Course(CString CourseNum,CString CourseName,CString CourseTerm,CString m_CourseNum=""; m_CourseName=""; m_CourseTerm=""; m_CoursePoint=""; m_CourseTime=""; m_CourseScore=0; m_CourseType=""; next=NULL; CoursePoint,CString CourseTime);
};
class CourseList
{
public:
Course * head; CourseList(); void DeleteNode(Course *p);//用来删除存放指定课程的链表 void SaveToFile(const char *name);//将课程信息保存至文件 void LoadFromFile(const char *name);//从文件中导入课程信息 void ReleaseList();//释放链表 void AddNode(CString CourseNum,CString CourseName,CString
CourseTerm,CString CoursePoint,CString CourseTime);//向链表中添加节点
};
class CStudent Course* FindNode(CString CourseNum);//根据课程代码查找节点
{
public:
CString m_StudentNo;//存放学号 CString m_Class;//存放班级 CString m_Name;//存放学生姓名 CString m_Sex;//存放学生性别 CString m_Dept;//存放专业 CString m_PhoneNo;//存放学生电话号码 CString m_Address;//存放学生家庭住址 CString m_Term;//存放学生注册学期 CStudent *next; Course m_Course[20];//用来存放学生选的各项课程 int s;//存放学生所选课程的数量 CStudent(); CStudent(CString CourseNum,CString StudentNum,int Score,CString ScoreType);
CStudent(CString StudentNo,CString Class,CString Name,CString Sex,CString Dept,CString PhoneNo,CString Address);
};
class CStudentList
{
public:
CStudent * head;//头指针 int n;//节点数量 CStudentList(); void DeleteNode(CStudent *p);//从链表中删除指定节点 void SaveToFile(const char *name);//将链表内容存入文件 void LoadFromFile(const char *name);//从文件载入链表内容 void ReleaseList();//释放链表
void AddNode(CString StudentNo,CString Class,CString Name,CString Sex,CString Dept,CString PhoneNo,CString Address);//向学生链表中添加节点 void AddScoreNode(CString CourseNum,CString StudentNum,int Score,CString ScoreType);//向链表中加入成绩信息
void AddCourseNode(CString StudentNo,CString CourseName, CString
CourseNum,CString CourseTerm CString CoursePoint, CString CourseTime);//向链表中加入对应课程信息
};
另外,定义了全局变量:
CStudentList m_List;//用来保存学生的各项数据
CString Term;//用来存放学生的注册学期,用来将注册的学期信息加入链表(开始时,AddNode函数中忘记加入m_Term变量了)
CString Num;//为了在查看课程信息时,对话框里的内容能够方便的传入子对话框中 CStudent* FindNode(CString StuNo);//根据学号查找节点
六、 测试数据
以下为程序初步运行后保存至文件中的内容:
2009-2010?03009527?030091?许亚军?男 能源与环境学院
151xxxxxxxx?M9? ?110?100?首修?高等数学?5.0 2009-2010?48课时?111?100?首修
2009-2010?48课时?大学物理?3.0 2009-2010?48课时?112?100?首修?C++?2.0
?111?100?首修?大学物理?3.0
?男 2009-2010?48课时 2009-2010?03009533?030091?周帆
能源与环境学院?110?M9? ?111?100?首修?大学物理?3.0 2009-2010?48课时?112?99?首修?C++?2.0 2009-2010?48课时 2009-2010?03009520?030091?雒志强?男
2009-2010?48课时能源与环境学院?10086?M9? ?112?100?首修?C++?2.0
2009-2010?03009528?030091?杨宗冰?男
能源与环境学院?119?M9? ?112?100?首修?C++?2.0 2009-2010?48课时
2009-2010?03000000?010091?XX?女?建筑学院?XXX?XXX? ?110?55?补考?高等数学
?5.0 2009-2010?48课时?111?0?重修?大学物理?3.0 2009-2010?48课时?112?100?首修
2009-2010?48课时 ?C++?2.0
七、 运行情况分析
输入数据测试后,生成包含以上内容的文件。整个过程顺利,程序可以正确运行,未出现重大错误,各项功能也都可以实现。可将生成的文件另外保存,从而录入新的数据(如其他学期的学生信息),而在查询时,可以根据需要查询的不同学期的信息来载入不同的文件。
八、 设计小结
在程序设计过程中遇到了不少问题,很多都是因为之前的想法没有完全照顾到全局,使得后来要大幅度的修改代码,或者用较为复杂的代码来弥补。所以,较大的程序设计,最重要的就是一定要有大局观,在设计初期就要将自己的目标、思路理清,最好做下记录,而且做每一步的同时也必须想到后面的很多步,否则到后来很可能会因为之前的缺陷而做不下去,或者不得不放弃某些功能。另外,对于程序编写本身,我发现需要注意的部分是文件的保存及载入,这部分的每一个代码都需要仔细斟酌,否则很可能出现在编译时没问题,而运行时出错的状况。而一旦出现这种情况,就必须通过恰当的方法寻找出问题所在,如注释某些最近写的代码、利用消息框弹出某些变量的值,从而判断其与设想是否相符等方法,而不能盲目的查看所有代码,慢慢找或者索性手足无措了。
九、 心得体会
这是我第一次尝试做比较大的程序,所以从中学到的还是很多的。首先,我发现我对程序设计还是很感兴趣的,很喜欢去钻研;其次,在设计及编程的过程中,通过发现问题、解决问题,我自己总结出来了不少方法,也发现了编写时所必须注意和避免的错误,可以让以后少走弯路。这些都是对于程序设计本身,此中的心得当然有很多,我也无法一一列举出来,而最重要的是我从其中学到了一些程序设计之外的东西。我深切的体会到了全局思想的重要性,无论干什么,基本上都得有这种思想,每走一步都必须想到以后的路,必须想到这一步是为什么而走的,为什么目标而服务的。只有这样,才能慢慢的稳健的走向自己的目标,不会在某一点上突然发现自己走不下去了,发现之前的某一步将自己带上的崎岖的路,而不得不往回走去弥补之前的过错或者干脆拐上另一条不明方向的道路。另外,前进的过程中,当遇到问题时,必须通
过恰当的方法去发现起源,然后解决,而不要盲目的去寻找或者毫无对策了,必要的时候也得求助他人。而在一步步解决问题的过程中,也必须学会自己总结,以避免以后再次遇上相同错误时再走弯路。
总之,这次的课程设计给了我很大帮助,如果有机会,我便会选择向这方面去深入发展。
参考资料
1、《C++课程设计》
2、《C++程序设计》
提交日期
2010-9-16 星期四
朱金付 何铁军 朱萍 郑雪清 徐冬梅 编著 朱金付 主编
一、实践的目的和要求
加深对《C语言》课程所学知识的理解,进一步巩固C语言语法规则。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。
二、实践内容
在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。
三、实践任务
1.欢迎画面
2.学生成绩管理系统(自己设计界面)
3.异或加密与解密
(1)文件加密
(2)文件解密
说明:将某一已知文件的内容以字符形式读出,与密钥(用户从键盘输入)的对应字符进行异或操作即可,解密同样如此。
如:设原文为ab1234,密钥为56,则有
ab1234
565656
按二进制进行异或操作即可得到密文(乱码)。
4.移位加密与解密
(1)文件加密
(2)文件解密
说明:将某一已知文件的内容(限于英文字母)以字符形式读出,根据密钥k(用户从键盘输入)将对应字符进行移位操作即可,解密时移动方向相反。
如:设原文为abcdef,密钥为5,则有
abcdef 每个字母按字母表向后移动位(注:z后接a)
fghijkl 可得到密文(乱码)。
5.辅助运算
(1)整数N模m的乘法逆t
要求:输入整数N和m,求出t,若t不存在,给出信息。
提示:这三个数满足:N*t%m=1,使用穷举法。
例如:当N为11,m为26时,由于(11×19)%26=1,所以11模26的乘法逆为19。
(2)统计字母个数
要求:输入一段英文字母,统计各个字母的个数,并按个数从大到小排序输出。
提示:字母大小写等价。输出格式为:字母:个数。
(3)OTP加密
要求:输入同等长度的原文x和密钥k(英文字母),根据公式 c=(x+k) %26 得到密文,并输出。
提示:将26个字母按0~25编号,将原文字母和对应位置的密钥字母的编号按上述公式进行计算后得到一个新的字母。
四、设计流程图
流程图另附!
五、相关程序 1 欢迎画面
#include<stdlib.h> #include<graphics.h> struct Snow {
int x;
int y;
int speed; }snow[100]; int snownum=0; int size;
int change=10; void *save1,*save2; void Copy();
void DrawSnow();
void Pr();
void main(void)
{int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\turboc2"); Copy();
DrawSnow();
getch();
closegraph();
}
void Copy()
{
setcolor(0);
setfillstyle(SOLID_FILL,15); fillellipse(200,200,4,4);
size=imagesize(196,196,204,204);
save1=malloc(size);
save2=malloc(size);
getimage(196,196,204,204,save1);
getimage(96,96,104,104,save2);
}
void Pr()
{
int s[15]={0,100,150,200,150,200,250,150,250,300,250,150,100,250,350}; setcolor(change/10);
settextstyle(0,0,4);
outtextxy(150,200,"Welcome!!!");
sound(s[change/10]);
}void DrawSnow()
{int i;
int sx[62];
randomize();
for(i=0;i<62;i++)
sx[i]=(i+2)*10;
cleardevice();
while(!kbhit())
{
Pr();
if(snownum!=100)
{
snow[snownum].speed=2+random(5); i=random(62);
snow[snownum].x=sx[i];
snow[snownum].y=10-random(100); }
for(i=0;i<snownum;i++)
putimage(snow[i].x,snow[i].y,save2,COPY_PUT); Pr();
if(snownum!=100)
snownum++;
/*delay(300);*/
setfillstyle(SOLID_FILL,15);
for(i=0;i<snownum;i++)
{
snow[i].y+=snow[i].speed;
putimage(snow[i].x,snow[i].y,save1,COPY_PUT); if(snow[i].y>500)
snow[i].y=10-random(200);
}
change++;
if(change==140)
change=10;
}
nosound();
}
2学生成绩管理系统(自己设计界面) #define N 1
struct student
{char num[10];
char name[10];
int score[4];
float ave;
}stu[N];
main()
{int i,j,max,maxi,sum;
float average;
for(i=0;i<N;i++)
{printf("Please input scores of student %d :\n",i+1); printf("NO.:");
scanf("%s",stu[i].num);
printf("name:");
scanf("%s",stu[i].name);
for(j=0;j<3;j++)
{printf("score %d :",j+1);
scanf("%d",&stu[i].score[j]);
}
}
average=0;
max=0;
maxi=0;
for(i=0;i<N;i++)
{sum=0;
for(j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].ave=sum/3.0;
average+=stu[i].ave;
if(sum>max)
{max=sum;
maxi=i;
}
}
average/=N;
printf(" NO. name score1 score2 score3 average\n"); for(i=0;i<N;i++)
{printf("%5s",stu[i].num);
printf("%10s",stu[i].name);
for(j=0;j<3;j++)
printf("%9d",stu[i].score[j]);
printf("%8.2f\n",stu[i].ave);
}
printf("average=%6.2f\n",average);
printf("The highest score is : %s,score total :%d\n",stu[maxi].name,max); getch();
}
3.异或加密与解密
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
void jiami(char *in,char *pwd,char *out); void main(int argc,char *argv[]) {
char in[30];
char out[30];
char pwd[8];
if(argc!=4)
{
printf("\Input file name:\n"); gets(in);
printf("Please enter password:\n"); gets(pwd);
printf("Output file name:\n");
gets(out);
jiami(in,pwd,out);
}
else
{
strcpy(in,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out,argv[3]);
jiami(in,pwd,out);
}
}
void jiami(char *in,char *pwd,char *out_file) {
FILE *fp1,*fp2;
register char ch;
int j=0;
int k=0;
fp1=fopen(in,"rb");
if(fp1==NULL)
{
printf("Cannot open in-file!\n");
exit(1);
}
fp2=fopen(out_file,"wb");
if(fp2==NULL)
{
printf("Cannot open or create output-file!\n"); exit(1);
}
while(pwd[++k]);
ch=fgetc(fp1);
while(!feof(fp1))
{
fputc(ch^pwd[j>=k?j=0:j++],fp2); ch=fgetc(fp1);
}
fclose(fp1);
fclose(fp2);
}
4.移位加密与解密
#include"stdio.h"
main()
{
int choice=0,k;
FILE *fp1,*fp2;
char c,filename1[30],filename2[30];
printf("Please input two deferent filename:"); scanf("%s%s",filename1,filename2);
printf("Please input the password :\n");
scanf("%d",&k);
if((fp1=fopen(filename1,"r"))==NULL)
printf("\nERROR!CAN NOT OPEN THE FILE\n"); else{
fp2=fopen(filename2,"w");
printf("\nChoose:(1-jiami 2-jiemi)");
scanf("%d", &choice);
switch(choice){
case 1:
do{
c=getc(fp1);
if(((c>='a')&&(c<='z'-k))||((c>='A')&&(c<='Z'-k))) putc(c+k,fp2);
else if(((c>'z'-k)&&(c<='z'))||((c>'Z'-k)&&(c<='Z'))) putc(c-(26-k),fp2);
else
putc(c,fp2);
}while(c!=EOF);
break;
case 2:
do{
c=getc(fp1);
if(((c>='a'+k)&&(c<='z'))||((c>='A'+k)&&(c<='Z'))) putc(c-k,fp2);
else if(((c>='a')&&(c<'a'+k))||((c>='A')&&(c<'A'+k)))
putc(c+(26-k),fp2);
else
putc(c,fp2);
}while(c!=EOF);
break;
default:
printf("\nYou have choose a wrong number!Please choose again!"); }
}
fclose(fp1);
fclose(fp2);
}
5.辅助运算
(1)整数N模m的乘法逆t
main()
{
unsigned n,m,t=1;
int c;
printf("Please enter the number:\n"); scanf("%d,%d",&n,&m); while(t<65535)
{
c=n*t%m;
if(c==1||c==0)
break;
t++;
}
if(t==65535||c==0)
printf("Nicheng number is not exited!\n"); if(c==1)
printf("T is : %d\n",t);
getch();
}
(2)统计字母个数
#include "string.h"
main()
{
int i,j,t;
char a[80],b[26];
int c[26];
char e;
printf("Please enter the letters:\n"); gets(a);
for(i=0;i<26;i++)
b[i]='A'+i;
for(i=0;i<26;i++)
c[i]=0;
for(j=0;j<80;j++)
{for(i=0;i<26;i++)
{
if(a[j]==b[i]||a[j]==b[i]+32) c[i]++;
}
if(a[j]=='\0')
break;
}
for(j=0;j<=25;j++)
{for(i=0;i<=25;i++)
{if(c[i]>c[i+1])
{
t=c[i];c[i]=c[i+1];c[i+1]=t;
e=b[i];b[i]=b[i+1];b[i+1]=e;
}
}
}
for(i=25;i>=0;i--)
{if(c[i]!=0)
printf("The %c letter number is %d \n",b[i],c[i]); }
getch();
}
(3)OTP加密
#include "stdio.h"
main()
{char a[80],b[80],c[80]; int i;
printf("Please enter the x :\n"); gets(a);
printf("Please enter the k :\n"); gets(b);
for(i=0;i<80;i++)
c[i]=(a[i]+b[i])%26; printf("The result is :\n"); for(i=0;i<80&&c[i]!='\0';i++)
printf("%c",c[i]);
getch();
}
六 心得体会
通过此次C语言程序设计实践,本人实在是获益不浅!C语言是上个学期开的课程,所以这个学期并没怎么看过,当要开始设计的时候,还真不知从哪下手!结果,第一次的上机,我只坐了一个下午,什么也没干!回去以后,我想,这样不行,这样下去还得了!我就重新学了一遍我们上个学期的教材,发觉自已有许多都遗忘了!特别是有文件的操作,几乎是一遍空白!温习过后,开始做题!那个欢迎动画是在”C语言之家”找到的,自已改了一下,但并没做多大的改动!之后做出来的第一个程序是”统计字母个数”,因为上个学做过类似的!接着是”乘法逆”,这个我觉得比较简单!再接着
是”OTP”加密!而那个学生成绩管理系统是参考了上机手册后做出来的!最后,花了最多时间的是”异或加密与解密”和”移位加解密”,几乎花了我百分之九十的时间,而且还是在一些在其他大学读计科专业的同学的帮助下和在上网查看了大量的资料之后才做出来!最后,想说两句,这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验!
七 参考文献
<<C/C++程序设计教程>> <<C程序设计>>
<<C程序设计题解与上机指导>>
目录摘要2一系统分析3二系统设计3三具体模块划分431登录模块432退出模块533母版模块534学生管理模块635教师管理模块83…
课程设计报告课程设计题目教务管理系统学生姓名王丙焱专业计算机科学与技术学号20xx30050202班级1130502指导教师李丽华…
XX大学XXXX学院课程设计课题题目学部专业班级X班学号姓名指导老师20xx年6月23日成绩一系统功能分析与设计1需求分析制作教务…
教务管理系统设计报告一引言教务管理是高校中一项极其繁重的任务教务工作人员每天都需要接触和处理大量的数据和事务这些信息的准确性和完整…
软件数据库设计一引言1编写目的编写本数据库的目的在于有利于后期的维护其主要读者为后期的系统维护人员以便于他们在维护时方便地掌握原数…
河海大学计算机及信息工程学院常州MFC课程设计报告题目聊天室程序设计学号20xx2325专业计算机科学与技术授课班号243002学…
计算机程序设计VC课程设计指导书江苏科技大学南徐学院20xx年2月一课程设计教学目的和任务计算机程序设计VC课程设计是实践性教学环…
VC程序设计课程设计报告书题目绘图软件设计班级学号姓名指导教师周期成绩一课程设计的目的与要求一课程设计目的与任务目的根据自身对vi…
通信与信息工程学院20xx20xx学年第2学期课程设计实验报告模块名称VC软件设计专业电子信息工程学生班级B090110学生学号学…
VC课程设计报告一设计时间20xx年12月27日12月31日二设计地点三设计目的VC程序设计是计算机科学与技术专业的必修专业基础课…
VC课程设计题目一计算器学院XXXXXXX班级XXXXXXX学号XXXXXXX姓名XXXXXXX设计时间XXXXXXX目录1需求分…