第一篇:学生成绩管理系统C++程序设计
项目设计题目(学生成绩管理系统)
学号:
姓名:
自评成绩:
成绩:
1.选题意义、依据
学生成绩系统的设计从学生的应用中而来,学生了解该系统的组成和运行过程,它贴近学生的生活能使学生更加方便的使用各个语句、函数、结构体等。
依据学生期末成绩表的格式。
2.系统功能设计与分析(功能模块说明)
系统主要用于从一个文件夹读入学生信息(101 张三
78 87 102 李斯
103 王红
79 87 104 赵子龙 72 75 76
李洪磊 88 98 89),包括学生学号、姓名、成绩(数学、英语、数据库),程序中引用了八个函数 void Cscore(int);void Rank(int ave);void Listnumber(int i);
void Listscore(int i);void Lookup(int);void Alter(int);void Dele(int &i);void Insert(int &i);系统主要实现的功能有:查询、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)。
Cscore 函数主要是对学生进行排名。具有相同总分的学生具有相同的名次,例如:第三名和第四名具有相同的总分则在表中不会出现第四名,将出现两个第三名紧接着出现第五名学生的情况。
Rank 函数主要用于按平均分对学生进行备注。把学生分为四个等级:>90分为excellent,80—90分为medium,60—80分为qualified,<60分为disqualified。Listnumber 函数主要用于把学生的信息(学号 姓名 数学 英语 数据库 总分平均分 名次 备注)以学号排名的顺序用表的形式输出,方便学生查看。Listnumber 函数中还调用了Cscore 和Rank 函数。
Listscore 函数是把学生的信息以总成绩排名的形式输出。
Lookup 函数主要运用学号或姓名形式查询单个学生信息,如果存在则输出该学生信息(学号 姓名 数学 英语 数据库 总分平均分 名次 备注),否则输出“Input message is error.”。
Alter 函数是修改指定学号的学生信息。主要用于修改指定学号学生的各科成绩并输出修改后的学生信息(学号 姓名 数学 英语 数据库 总分平均分 名次 备注)。
Delete 函数用于删除指定学生的信息。可用两种方式删除:以学号形式删除学生信息,以姓名形式删除学生信息。若要删除了学生不存在则输出“message error.”。
Insert 函数用来插入学生的信息,一次调用Insert 函数可以添加多个学生的信息。Insert 函数中还调用了Cscore 和Rank 函数。
3.涉及的主要知识点说明
(1)系统主要运用了函数的声明、定义、调用(值调用和地址调用)。
(2)对文件的读入操作。
(3)在平均分的求取上采用四舍五入的方式,运用了类型转换。(4)多次运用if和for嵌套,在for嵌套中又运用了break语句。(5)运用了switch。
(6)对字符数组的比较中运用了strcmp,还运用toupper把小写字母转换成大写。
(7)对学生信息进行的插入和有序删除操作。(8)运用iomanip对输出进行美观。
4.创新性说明(怎么解决)
创新性:系统可以对具有相同总分学生的学生输出相同的名次。若存在三个相同的分数都为第二名,则在输出时出现三个第二名不会出现第三、四名,紧接着出现第五名。
解决方法:(1)用一个数组记录具有相同分数的人数,数组下标和学生信息所具有的下标相同;(2)删除相同的总分只保留其中一个分数;(3)对删除相同总分的分数按从高到底进行排序;(4)对各个学生的总分进行排名。
5.源代码
//****************************************************************** //Student achievement program //This program has eight functions of students grade,including list //score ranking,lookup,alter,delete,insert and rank.From the file read in //student achievement.Scores of people have the same same place.//****************************************************************** #include
void Cscore(int);void Rank(int ave);void Listnumber(int i);void Listscore(int i);void Lookup(int);void Alter(int);void Dele(int &i);void Insert(int &i);
using namespace std;const int MAX=100;
struct student
//定义学生信息结构体 { int num;char name[8];int math;int english;int database;int sum;int average;int score;}stu[MAX];
int main()
//主函数 {
int i,k;char ch;string filename;ifstream infile;
cout<<“Please input the filenames: ”;cin>>filename;infile.open(filename.c_str());if(!infile){
cout<<“Can't open the input file.”< return 1;} for(i=0;i infile>>stu[i].num>>stu[i].name>>stu[i].math>>stu[i].english>>stu[i].database; stu[i].sum=stu[i].math+stu[i].english+stu[i].database; stu[i].average=int(float(stu[i].sum)/3+0.5);} i=i-1;cout< 学生成绩管理系统 ”< cout<<“Y or N 进入菜单栏 ”< <<“ 菜单:”< <<“ 1)查 询”< <<“ 2)修 改”< <<“ 3)删 除”< <<“ 4)插 入”< <<“ 5)成绩单(以学号排名)”< 6)成绩单(以名次排名)”< cout<<“***请选择 1--4 中任何一个:”< cin>>k; cout< switch(k){ case 1:Lookup(i);break; case 2:Alter(i);break; case 3:Dele(i);break; case 4:Insert(i);break; case 5:Listnumber(i);break; case 6:Listscore(i);break; default :cout<<“error input!”< cout< cin>>ch; ch=toupper(ch);} cout<<“Thank you for using!”< <<“Bye bye!”< void Cscore(int i) //对学生分数进行排名 { int h[MAX],b[MAX],score[MAX+1],n,k,j;int sum0[MAX],s;n=i;for(j=0;j sum0[j]=stu[j].sum;} for(j=0;j h[j]=0;for(k=0;k h[j]++; //具有同一分数的人数 } } //end for } //end for for(j=0;j //删除多个同一分数只保留其中一个分数 { for(k=j+1;k if(sum0[j]==sum0[k]) { sum0[k]=sum0[i-1]; i--; k--; } } } //end for for(j=0;j //按从高到底的顺序对总分进行排名 { for(k=j+1;k if(sum0[j] { s=sum0[j]; sum0[j]=sum0[k]; sum0[k]=s; } //end if } //end for } //end for b[0]=0;score[0]=1;for(j=0;j //对学生成绩进行排名 { for(k=0;k if(sum0[j]==stu[k].sum) { score[j+1]=score[j]+b[j]; stu[k].score=score[j+1]; b[j+1]=h[k]; } //end if } //end for } //end for } void Rank(int ave) //对学生等级输出 { if(ave>=90) { cout<<“excellent”; } else if(ave>=80) { cout<<“medium”; } else if(ave>=60) { cout<<“qualified”; } else { cout<<“disqualified”; } cout< void Listnumber(int i){ int j;Cscore(i);cout<<“学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 ”< cout< < cout< cout< cout< Rank(stu[j].average);} } void Listscore(int i){ int j,k;Cscore(i);cout<<“学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 ”< for(k=0;k { if(stu[k].score==j) { cout< < cout< cout< cout< Rank(stu[k].average); } } } } void Lookup(int i) //运用学号或姓名形式查询单个学生信息 { int j,k,n,numb;char name1[8]; cout<<“Please select you check score ways.”< //以学号形式查询学生信息 { cout<<“Please input student number: ”; cin>>numb; for(j=0;j { if(numb==stu[j].num) { k=j; break; } } } else //以姓名形式查询学生信息 { cout<<“Please input student name: ”; cin>>name1; for(j=0;j if(strcmp(stu[j].name,name1)==0) { k=j; break; } } if(k==MAX){ cout<<“Input message is error.”< //如果学生存在则输出学生信息 { Cscore(i); cout<<“学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 ”< cout< < cout< cout< cout< Rank(stu[j].average);} } void Alter(int i)//修改指定学号的学生信息 { int numb,j; cout<<“alter begin...”< cout<<“Please input number:”; cin>>numb;for(j=0;j if(numb==stu[j].num) { cout<<“find out:”< cout<<“学号:”< cout<<“Please input new result: 数学 英语 数据库 ”< cin>>stu[j].math>>stu[j].english>>stu[j].database; stu[j].sum=stu[j].math+stu[j].english+stu[j].database; stu[j].average=int(float(stu[j].sum)/3.0+0.5); Cscore(i); //输出修改后该学号学生的信息 cout<<“学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 ”< cout< < cout< cout< cout< Rank(stu[j].average); break; } } } void Dele(int &i) //删除指定学生的信息 { int numb,j,k;char name0[8];cout<<“delete begin...”< cout<<“ [1]以学号形式删除学生信息”< [0]以姓名形式删除学生信息”< //以学号形式删除学生的信息 { cout<<“Please input delete number:”; cin>>numb; for(j=0;j { if(numb==stu[j].num) break; } } else //以姓名形式删除学生的信息 { cout<<“Please input delete name:”; cin>>name0; for(j=0;j { if(strcmp(name0,stu[j].name)==0) break; } } void Insert(int &i) //插入学生的信息 { int j,n;cout<<“insert begin...”< cin>>stu[j].num>>stu[j].name>>stu[j].math>>stu[j].english>>stu[j].database; stu[j].sum=stu[j].math+stu[j].english+stu[j].database; stu[j].average=int(float(stu[j].sum)/3.0+0.5);} Cscore(i);cout<<“学号 姓名 数学 英语 数据库 总分 平均分 名次 备注 ”< cout< < cout< cout< stu[j].num=stu[j+1].num; strcpy(stu[j].name,stu[j+1].name); stu[j].math=stu[j+1].math; stu[j].english=stu[j+1].english; stu[j].database=stu[j+1].database; stu[j].sum=stu[j+1].sum; stu[j].average=stu[j+1].average;} i=i-1;Cscore(i);} else cout<<“message error.”< cout< 运行结果: 分析: 系统基本上能实现对成绩的查询、、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)等功能,并且可以插入多个学生的信息。但在插入学生后未不能成绩单以学号排名的形式输出。为了改进程序对Insert 函数进行了一下修改。 Insert 函数代码如下: void Insert(int &i) //插入学生的信息 { int j,k,n,m,first,last,mid;int num0,math0,english0,database0;char name0[8];cout<<“insert begin...”< if(stu[j].num { last=mid-1; } else if(stu[j].num>stu[mid].num) { first=mid+1; } else { break; } mid=(first+last)/2;} if(first>last){ num0=stu[j].num; strcpy(name0,stu[j].name); math0=stu[j].math; english0=stu[j].english; database0=stu[j].database; for(k=i-1;k>first;k--) //进行有序插入 { stu[k].num=stu[k-1].num; strcpy(stu[k].name,stu[k-1].name); stu[k].math=stu[k-1].math; } stu[k].english=stu[k-1].english; stu[k].database=stu[k-1].database; stu[k].sum=stu[k-1].sum; stu[k].average=stu[k-1].average; } stu[first].num=num0; strcpy(stu[first].name,name0); stu[first].math=math0; stu[first].english=english0; stu[first].database=database0; stu[first].sum=stu[first].math+stu[first].english+stu[first].database; stu[first].average=int(float(stu[first].sum)/3.0+0.5);} else { cout<<“message error.”< last=i-1; mid=(first+last)/2;} Cscore(i); 修改后程序经运行后结果如下: 结果发现修改后的程序运用了二分查找法、多重嵌套等,能较好的实现对学生的信息以学号为序进行了多个数据的有序插入。 XXXXXXXXXXXC/C++程序设计实训 电话簿管理系统 学生姓名 ×××× 学 号 ×××× 所在学院 ×××× 专业名称 ×××× 班 级 ×××× 指导教师 XXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX 目 录 1.前言··················································································································· 3 2.设计目的··········································································································· 3 3.功能描述··········································································································· 3 4.总体设计··········································································································· 4 1、功能模块设计···························································································· 4 2、数据结构设计···························································································· 6 3、函数功能描述···························································································· 7 5.程序实现··········································································································· 7 1、源程序(略)···························································································· 7 2、运行结果···································································································· 7 6.小结··················································································································· 9 1.前言 随着科技的进步和信息产业的飞速发展,电话簿成为了现代生活中一个重要的工具。本电话簿管理系统利用计算机对通讯录进行统一管理,包括添加、修改、查询记录等功能,实现通讯录管理工作的系统化、规范化和自动化,为人们的工作和生活提供便利。本程序是利用结构数组实现此电话簿管理系统。 2.设计目的 本程序旨在训练基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和结构数组的各种基本操作。本程序中涉及结构体、数组、文件等方面的知识。通过本程序的训练,能对C语言的文件操作有一个更深刻的了解,掌握利用数组存储结构实现电话簿管理的原理,为进一步开发出高质量的信息管理系统打下坚实的基础。 3.功能描述 如图1所示,电话簿管理系统主要利用数组来实现,其数组元素是结构体类型,整个系统由如下几大功能模块组成。 电话簿管理系统输入记录模块查询记录模块更新记录模块输出记录模块从文件读入从键盘读入按姓名查询按电话查询修改记录删除记录插入记录排序记录输出至文件输出至屏幕(1)输入记录模块。输入记录模块主要完成将数据存入数组中的工作。在此电话簿管理系统中,记录可以从以文本形式存储的数据文件中读入,也可从键盘逐个输入记录。记录由与联系人有关的基本信息字段构成。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到结构体类型的数组元素中。 (2)查询记录模块。查询记录模块主要完成在数组中查找满足相关条件的记录。在此电话簿管理系统中,用户可以按照联系人姓名或联系人电话号码在数组中进行查找。若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1的值,并打印出未找到该记录的提示信息。 (3)更新记录模块。更新记录模块主要完成对记录的维护。在此电话簿管理系统中,它实现对记录的修改、删除、插入和排序操作。一般而言,系统进行了这些操作之后,需要将修改的数据存入源数据文件。 (4)输出记录模块。输出记录模块主要完成两个任务。第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。第二,它实现将数组中存储的记 图1 电话簿管理系统功能模块 录信息以表格的形式在屏幕上打印显示出来。 4.总体设计 1、功能模块设计 (1)主控main()函数执行流程 电话簿管理系统执行主流程如图2所示。它先以可读写的方式打开文本类型的数据文件,此文件默认为“c:telephon”,若该文件不存在,则新建此数据文件。当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。值得一提的是,文本类型文件与二进制类型文件不同,它可以使用Windows自带的记事本打开并查看到存储的文件内容。 开始以可读写的方式打开一个数据文件将此文件的内容读出,并存入一个新的结构体类型的数组中调用emnu()菜单函数进入while(1)主循环输入0~8中的一个数值,选择相应操作输入是否为0?是否判断键值,调用相应函数,完成相应功能是否已对修改进行了存盘?否调用Save()函数,进行写数据文件操作是结束 图2 主控函数执行流程图 在判断键值时,有效的输入为0-8之间的任意数值,其他输入都被视为错误按键。若输入为0(即变量select=0),则会继续判断是否在对记录进行了更新操作之后进行了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户是否需要进行数据存盘操作,用户输入 Y或y,系统会进行存盘操作。最后,系统执行退出电话簿管理系统的操作。 若选择1,则调用Add()函数,执行增加记录操作;若选择2,则调用Disp()函数,执行将记录以表格形式打印输出至屏幕的操作;若选择3,则调用Del()函数,执行删除记录操作;若选择4,则调用Qur()函数,执行查询记录操作:若选择5,则调用Modify()函数,执行修改记录操作;若选择6,则调用lnsert()函数,执行插入记录操作;若选择7,则调用SelectSort()函数,执行按升序排序记录的操作;若选择8,则调用Save()函数,执行将记录存入磁盘中的数据文件的操作:若输入为0-8之外的值,则调用Wrong()函数,给出按键错误的提示。 (2)输入记录模块 输入记录模块主要实现将数据存入数组中。当从数据文件中读出记录时,它调用fread(&tele[count],sizeof(TELEBOOK), l,fp)文件读取函数,执行一次从文件中读取一条电话簿记录信息存入某个数组元素中的操作,并且这个操作在main()中调用执行,即在电话簿管理系统进入显示菜单界面时,该操作己经执行了。若该文件中没有数据,则系统会提示数组为空,没有任何记录可操作,此时,用户应选择1,调用Add()函数,进行记录的输入,即完成在数组中添加元素的操作。 (3)查询记录模块 查询记录模块主要实现在数组中按联系人姓名或电话查找满足条件的记录。在查询函数Qur()中,为了遵循模块化编程的原则,对在数组中进行的记录定位操作设计成了一个单独的函数int Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]),参数findmess[]保存要查找的具体内容,nameorphonenum[]保存要查找的字段(值为字特串类型的name或phonenum),若找到该记录,则返回指向该记录的数组元素的下标;否则,返回一个-1的值。 (4)更新记录模块 更新记录模块主要实现了对记录的修改、删除、插入和排序操作。因为记录是以数组的结构形式存储的,所以这些操作都在数组中完成。下面分别介绍这4个功能模块。 1)修改记录 修改记录操作需要对数组中目标元素的数据域中的值进行修改,它分两步完成。第一步,输入要修改的联系人姓名,输入后调用定位函数Locate()在数组中逐个对联系人姓名字段的值进行比较,直到找到该联系人姓名的记录;第二步,若找到该记录,修改除记录编号之外的各字段的值,并将存盘标记变saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。 2)删除记录 删除记录操作完成删除指定联系人姓名或电话号码的记录,它也分两步完成。第一步,输入要修改的联系人姓名或电话号码,输入后调用定位函数Locate()在数组中逐个对联系人姓名或电话号码字段的值进行比较,直到找到该联系人姓名或电话号码的记录,返回指向该记录的数组元素下标;第二步,若找到该记录,则从该记录所在元素的后续元素起,依次向前移一个元素位置,有值的数组元素个数减1,其具体过程如图3所示,在删除了数组元素A2后,数组元素A3和A4向前移动了一个位置 A0删除A2前A0删除A2后A1A1A2A3A3A4A4 图3 数组中删除记录示意图 3)插入记录 插入记录操作完成在指定记录编号的随后位置插入新的记录。首先,它要求用户输入某个记录编号,新的记录将插入在该记录之后、然后,提示用户输入一条新的记录的信息,这些信息保存在新结构体类型的数组元素的各字段中;最后,将该元素插入在已经确认位置的记录编号之后。它的具体插入执行过程如图4所示,新元素B1准备插入至已有5个元素的数组中,插入位置为元素A2之后。这具体过程为:先调用Locate()函数找到A2在数组中的下标,从A4开始,往后移动,至A2停止移动,然后在原A3的位置插入元素B1。 插入B1A0插入B1前A0插入B1后A1A2B1A3A4A1A2A3A4 图4 数组中插入记录示意图 4)排序记录 选择排序法也属于内部排序法中的一种,它是运用字段值比较后,从欲排序的数组元素中,按指定规则选出其字段值最小的元素,并依原则交换数组元素位置后,更新欲排序的数组元素,以达到排序的目的。这里我们采用这种排序法来实现按照记录编号或联系人姓名字段的值从低到高对记录进行升序排序。对按照记录编号排序方式而言,我们将按其数值大小来排序;对按照联系人姓名排序方式而言,我们将按其姓名字符ASCII码的大小来排序。 选择排序的方法为:从欲排序的n个数组元素中,以线性查找的方式找出最小的元素和第一个元素交换,再从剩下的(n-1)个数组元素中,找出最小的元素和第二个元素交换,以此类推,直到所有元素均已排序完成。 将相邻的两个数组元素的电话簿字段的值进行比较,若左边的值小于右边的值,则将此两个元素的值进行交换;若左边的值大于等于右边的值,则此两个值的位置不变。右边的值继续和下一个值做比较,重复此动作,直到比较到最后一个值,最终实现了升序排序。选择排序法是最简单的排序法,但选择排序法所需的排序时间比其他排序法长。 (5)输出记录模块 当把记录输出至文件时,调用fwrite(&temp[i],sizeof(TELEBOOK),L,fp)函数,将数组元素temp[i ]中各字段的值,写入文件指针fp所指的文件:当把记录输出至屏幕时,调用void Disp()函数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。 2、数据结构设计 本程序定义了结构体telebook,用于存放联系人的基本信息。这里仅有3 个与联系人有关的字段,读者可以按照需要扩展相关字段。 typedef struct telebook { char num[4];char name[10];char phonenum[15];char address[20];}TELEBOOK;其各字段的值的含义如下: num[4]:保存记录编号。 name[10]:保存联系人姓名。 phonenum[15]:保存联系人的电话号码。 address[20]:保存联系人地址。 3、函数功能描述 1)printheader()函数原型:void printheader()printheader()函数用于在表格形式显示记录时,打印输出表头信息。2)printdata()函数原型:void printdata(TELEBOOK pp)printdatan()数用于以表格显示的方式,打印输出单个数组元素pp中的记录信息。3)Disp()函数原型:void Disp(TELEBOOK temp[],int n)Disp()函数用于显示temp数组中存储的n条记录,内容为telebook结构中定义的内容。其余函数功能描述省略,请同学们在自己写的时候写完整。 5.程序实现 1、源程序(略) 2、运行结果 (1)主界面 图5 主界面 当用户刚进入电话簿管理系统时,其主界面如图5所示。此时,系统己经将“c:telephon”文件打开,若文件不为空,则将数据从文件中逐条记录读出,并写入数组中。用户可选择0-8之间的数值,调用相应功能进行操作。当输入为0时,退出此管理系统。 (2)输入记录 当用户输入1并按Enter键后,即可进入数据输入界面。其输入记录过程如图6所示,这里输入了3条记录。当用户输入为0的记录编号时,它会结束输入过程,返回到主菜单界面。 (3)显示记录 当用户执行了输入记录或已经从数据文件中读取了记录之后,即可输入2并按Enter键,查看当前数组中的记录情况,如图7所示,此时表中有3条记录。 图6 输入记录 图7 显示记录 (4)删除记录 当用户输入3并按Enter键后,即可进入记录删除界面。其删除记录过程如图8所示,这里按联系人姓名删除了一条姓名为A1的记录。 图8 删除记录 (5)查找记录 当用户输入4并按Enter键后,即可进入记录查找界面。其查找记录过程如图9所示,8 用户可按姓名或电话号码进行记录查找。 图9 查找记录 (6)修改记录 当用户输入5并按Enter键后,即可进入记录修改界面。其修改记录过程如图10所示,这里修改了姓名为a2的联系电话和地址字段。 图11 修改记录 (7)插入记录 当用户输入6并按Enter键后,即可进入记录插入界面。其插入过程如图11所示,这里在记录编号为3的记录后插入了一条记录编号为5的记录。 (8)排序记录 当用户输入7并按Enter键后,即可进入记录排序界面。用户可以选择按照记录编号或联系人姓名进行排序,图12为按记录编号进行记录升序排序的结果。 (9)保存记录 当用户输入8并按Enter键后,即可进入记录保存界面。其保存结果提示信息如图13所示,这里有3条记录已经存储至磁盘数据文件c:telephon中。 6.小结 本文介绍了电话簿管理系统的设计思路及其编程实现,重点介绍了功能模块的设计原理和利用数组存储结构实现电话簿管理的过程。通过本程序的开发使我熟悉C语言下的文件和数组操作,了解管理信息系统(MIS)的开发原理,并注意利用选择排序法来实现数组元素 排序的特点。 利用本电话簿管理系统可以对通讯录进行日常维护和管理。 五、解决方案 C++程序设计实践教学环节任务书 1.分析程序的功能要求,划分程序功能模块。 2.画出系统流程图。 一、题目: 学生成绩管理分析系统 3.代码的编写。定义类和各个功能函数。 4.程序的功能调试。 二、目的与要求 5.完成系统总结报告以及使用说明书。 1.目的: 六、进度安排 1)巩固C++基础知识;此次课程设计时间为一周或两周,分四个阶段完成: 2)能够运用面向对象方法进行类的设计; 1.分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要 3)锻炼学生编程能力,解决实际问题的能力。求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。2.编码调试阶段:根据设计分析方案设计类并编写代码,然后调试该代码,实 2.要求现课题要求的功能。3.总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、基本要求: 总体设计、详细设计、编码、测试的步骤和内容。 1)按照软件开发流程进行开发 4.考核阶段。 2)类的设计合理;包括类的继承多态等; 3)模块划分清晰合理; 七、撰写课程设计报告或课程设计总结 4)实用性好。课程设计报告要求: 创新要求: 在基本要求达到后,可进行创新设计,比如系统用户功能控制,对管理员级和一总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步般级别的用户系统功能操作不同。骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。 三、信息描述 八、参考资料1.《C++程序设计》.郑莉.清华大学出版社 有关该系统基本信息的描述,如:学号、姓名、系别、班级和所选科目及各科成绩2.《C++编程思想》.Bruce Eckel [刘宗田].机械工业出版社等。3.《C++ Primer》中文版.Lippman[潘爱民].中国电力出版社出版4.《Effective C++中文版》Scott Meyers[侯捷].华中科技大学出版社 四、功能描述 1.学生基本信息及成绩所选科目成绩的录入修改和删除。 2.基本信息的查询(分系、班级;分科目)。 3.对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率); 4.对所开课程的成绩分析(求其平均成绩,最高分和最低分); 5.对学生考试成绩进行排名(单科按系别或班级进行排名,对每一个班级,同一 学期学生总体成绩进行排名,并显示各科成绩信息) 学生实验报告 实验课名称: C++程序设计 实验项目名称:综合大作业——学生成绩管理系统 专业名称: 班 学级:号: 学生姓名: 同组成员: 教师姓名: 日 题目:学生成绩管理系统一、实验目的: (1)对C++语法、基础知识和编程技巧进行综合运用,编写具有一定综合应用价值的稍大一些的程序。培养学生分析和解决实际问题的能力。 (2)熟悉掌握C++的语法和面向对象程序设计方法。进一步理解和运用结构化和面向对象程设计想结合的思想和方法 (3)培养学生的逻辑思维能力,编程能力和程序调试能力以及工程项目分析和管理能力。 (4)学会利用流程图或N-S图表示算法; (5)掌握书写程设计开发文档的能力(书写课程设计报告); 二、设计任务与要求: (1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计。 (2)在系统的设计中,能够运用面向对象的机制(继承、派生)来实现系统功能,并且要建立清晰的类层次关系。 (3)主函数中提供菜单选项,并给出足够的选择信息以及提示信息。界面友好(良好的人机交互),加必要的注释; (4)程序具有一定的健壮性,不会因为用户的输入错误引起程序运行错误而中断执行。 三、系统需求分析: (1)需求分析 建立成绩管理系统,包含了学生的全部信息,包括学号,姓名,出生日期,年龄(通过计算得出),各科成绩等。然后对其相关操作。 (2)系统功能分析 信息录入、信息显示、信息查询、信息删除、信息修改、信息保存。 (3)系统功能模块 a、主程序模块 本程序各个模块功能均用函数实现,主程序主要用来实现数据的初始化,定义变量,调用函数等,实现对程序的整体控制。 b、登录密码模块 本模块用于管理登录,只保存了两个管理员,并且输入错误,会提示错误原因,管理员不存在或者密码错误,同时有输入上限,三次输入错误即退出系统。 c、信息录入模块 录入学生成绩信息(包括学生学号、姓名、出生日期、年龄、各门课程的成绩等),将信息记录到当前*End中,然后End指向新的内存。 d、信息显示模块 显示录入的所有信息,使用for循环,起始条件Head->Next,终止于End。 e、信息查询模块 输入学号或名字,查询学生各门课程的成绩及总成绩,输入姓名查询,将查询到指针保存到指针数组中,同时使用i记录保存指针的数目,然后将End赋给指针数组作为结束条件;输入学号查询,成功则返回上一个指针,不成功就返回空。 f、信息删除模块 两种方式,通过姓名,调用FindItem(char * name,student *a[])并返回i,i=0不存在,i=1直接删除,i>1显示所有相同姓名的信息供用户选择删除,通过学号(唯一性)直接删除该学生的成绩信息; g、信息修改模块 同删除模块类似,首先查询,出现重名选择修改。 h、信息排序模块 根据总成绩高低排序,交换两个数据域完成排序,用for循环完成所有的信息排序。h、信息保存模块 退出时,将学生的学号、姓名及各门课程的成绩等信息保存于外部存储器的sort.txt文件中。 (4)模块功能框架图 四、系统设计与实现 1、基类class Student用来封装学生的所有信息,以及基本操作即读写数据。 2、派生类class Studentmessage继承了Student的所有功能,同时增加了增加信息,显示,修改等功能,实现对信息的所有操作。 3、main()用来实现对程序的整体控制;code()用于保护信息安全性,限制登录。 4、定义文件输入流对象in和输出流对象out,实现对外部文件的操作,使得数据得 以保存。 5、Student * Next用于实现链表的操作,保存下一个对象的地址。 五、调试过程:测试数据及结果 1、新建 2、查找 3、修改 4、删除 六、系统有待改进的地方 七、设计心得与体会 八、参考资料 八、系统有待改进的地方 九、设计心得与体会 此次c++课程设计,在指导教师的精心教导下,我们学会了如何用C++编写一个简单的应用程序。首先要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。程序实现上,设计了简单的查询界面,将各个功能集中出来按照程序编写原则,便于查询。 根据C++课程所学的概念、理论和方法,按照C++程序设计的基本步骤,设计出一个适当规模的程序;进一步加深对C++语言的理解和掌握。理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高编程能力。 十、参考资料 《C++primer》(美)普拉塔(Prata,S.)著 人民邮电出版社 《数据结构》严蔚敏 著清华大学出版社 《C程序设计》综合性实验 实验报告 题目: 学生成绩管理 姓名: 班级: 学号: 指导教师: 完成时间: 一、实验题目 学生成绩管理 二、实验目的 1.掌握一维数组、二维数组的使用方法。2.掌握结构体数组的定义和使用。 3.综合应用数据文件的读写语句保存结构体数组中的数据。 三、实验要求 有4个学生,每个学生有3门课的成绩,从键盘上输入以上数据,计算每个学生的平均分,并把这些信息(包括学号、姓名、班级、3门课的成绩及平均分)保存到一个文件(score.txt)中,并显示在屏幕上。 具体要求: 定义结构体类型(student_type),其中包括学号(num[11])、姓名(name[8])、班级(class[20])、3门课成绩(score[3])和平均成绩(ave)。利用该结构体类型定义数组stud[4]。 在主函数中输入学生学号、姓名、班级、3门课的成绩,并计算出平均成绩,然后调用save()函数将学生数据保存在score.txt文件中,调用display()函数读取score.txt文件,并将其中的内容显示在屏幕上。 定义保存文件函数save()和显示文件函数display()。 四、程序流程图 五、程序代码 #include int insert();//录入学生成绩信息函数 int query();//查询学生成绩信息函数 int list();//列出学生成绩信息函数定义 void save();//把数据写入到文件 void display();//从文件读入学生记录 typedef struct { char num[20]; char name[8]; char class[20];int score[3];int ave;}studs; studs * stud =NULL;int current = 0;int total = 0; int main(){ while(1)//显示程序基本信息 { char choice;//定义一个字符类型的变量用来接收用户的菜单选择 printf(“n”);printf(“*******************************************************************************n”);n“);n”);printf(“ 0---退出系统 1---printf(” printf(“ 学生成绩管理系统 录入学生成绩信息 n”);printf(“ 2---查询学生成绩信息 3---列出所有学生成绩信息 n”);printf(“ 4---保存学生成绩信息 5---加载学生成绩信息 n”);printf(“*******************************************************************************n”); printf(“n”); printf(“请选择:”); choice=getch(); getchar();//过滤掉enter键 printf(“nn”); switch(choice) { case'1':system(“cls”); insert();/*此处调用添加录入学生成绩信息处理代码的函数*/ break; case'2':system(“cls”); query();/*此处调用添加查询学生成绩信息处理代码的函数*/ 处理代码的函数*/ 息处理代码的函数*/ 信息处理代码的函数*/ } } return 0; break;case'3':system(“cls”); list();/*此处调用添加列出学生成绩信息 break;case'4':system(“cls”); save();/*此处调用添加保存学生成绩信 break; case'5':system(“cls”); display();/*此处调用添加加载学生成绩 break; case'0': if(stud!=NULL) { free(stud); } return 0; default: printf(“非法选择,请重新选择n”); getch();//程序返回 } /*各个函数的实现*/ int insert()//录入学生成绩信息函数定义 { int i;int total=4; if(stud==NULL) stud=(studs *)malloc(total *sizeof(studs)); if(stud==NULL) return 1; if(current>=total) { printf(“对不起,由于人数已满,不能再添加新学生成绩信息n”); return 1; } for(i=0;i { int a,b,c;printf(“请输入学号:”); scanf(“%s”,&stud[current].num); printf(“请输入姓名:”); scanf(“%s”,&stud[current].name); printf(“请输入班级:”); scanf(“%s”,&stud[current].class);printf(“请输入语文成绩:”); scanf(“%d”,&stud[current].score[1]); printf(“请输入数学成绩:”); scanf(“%d”,&stud[current].score[2]); printf(“请输入英语成绩:”); scanf(“%d”,&stud[current].score[3]); a=stud[current].score[1];b=stud[current].score[2];c=stud[current].score[3];stud[current].ave=(a+b+c)/3;printf(“n”); current++; } } int query()//查询学生成绩信息函数定义 { char k;printf(“***********************************n”);printf(“* 0---放弃查询 *n”);printf(“* 1---按学号查询 *n”);printf(“* 2---按姓名查询 *n”);printf(“***********************************n”);printf(“n”); printf(“请选择:”); k=getch(); getchar();//过滤掉enter键 printf(“nn”); switch(k){ case '0': break;case '1': { char num[20]; int i; printf(“请输入要查询的学生学号:”);scanf(“%s”,&num); for(i=0;i<4;i++){ if(strcmp(stud[i].num,num)==0){ printf(“学生成绩如下n”); printf(“学号:%sn”,stud[i].num); printf(“姓名:%sn”,stud[i].name); printf(“班级:%sn”,stud[i].class); printf(“语文成绩:%dn”,stud[i].score[1]); printf(“数学成绩:%dn”,stud[i].score[2]);printf(“英语成绩:%dn”,stud[i].score[3]); printf(“平均成绩:%dn”,stud[i].ave); return 0;} } printf(“此信息不存在!nn”); return 1; break;} case '2': { char name[8]; int i; printf(“请输入要查询的学生姓名:”);scanf(“%s”,&name); for(i=0;i<4;i++){ if(strcmp(stud[i].name,name)==0){ printf(“学生成绩如下n”); printf(“学号:%sn”,stud[i].num); printf(“姓名:%sn”,stud[i].name); printf(“班级:%sn”,stud[i].class); printf(“语文成绩:%dn”,stud[i].score[1]); printf(“数学成绩:%dn”,stud[i].score[2]);printf(“英语成绩:%dn”,stud[i].score[3]); printf(“平均成绩:%dn”,stud[i].ave); return 0;} } printf(“此信息不存在!nn”); return 1; break;} default: printf(“非法选择,请重新选择n”);} int list()//列出学生成绩信息函数定义 { } int i; printf(“学生成绩列表n”);printf(“***********************************n”); for(i=0;i<4;i++) { printf(“学号:%sn”,stud[i].num); printf(“姓名:%sn”,stud[i].name); printf(“班级:%sn”,stud[i].class); printf(“语文成绩:%dn”,stud[i].score[1]); printf(“数学成绩:%dn”,stud[i].score[2]);printf(“英语成绩:%dn”,stud[i].score[3]); printf(“平均成绩:%dn”,stud[i].ave); printf(“***********************************n”); } return 0;} //把数据写入到文件 void save(){ for(i=0;i } printf(“文件 score.txt 打开失败”);exit(0);fprintf(fb,“%20s%8s%20s%4d%4d%4d%4dn”,stud[i].num,stud[i].name,stud[i].class,stud[i].score[1],stud[i].score[2],stud[i].score[3],stud[i].ave); } //从文件读入学生记录 void display(){ if(stud==NULL)int i;int total=4;FILE *fp; fclose(fb); printf(“文件成功保存到 score.txt 中!n”);getchar(); stud=(studs *)malloc(total *sizeof(studs)); fscanf(fp,“%20s%8s%20s%4d%4d%4d%4dn”,&stud[i].num,&stud[i].name,&stif((fp=fopen(“score.txt”,“r”))==NULL){ } for(i=0;i<4;i++){ printf(“文件 score.txt 打开失败”);exit(0);ud[i].class,&stud[i].score[1],&stud[i].score[2],&stud[i].score[3],&stud[i].ave); printf(“学号:%sn”,stud[i].num); printf(“姓名:%sn”,stud[i].name); printf(“班级:%sn”,stud[i].class); printf(“语文成绩:%dn”,stud[i].score[1]); printf(“数学成绩:%dn”,stud[i].score[2]);printf(“英语成绩:%dn”,stud[i].score[3]); printf(“平均成绩:%dn”,stud[i].ave); printf(“***********************************n”); } } fclose(fp);getchar(); 六、实验结果 七、实验体会 (写出完成此次综合性实验的心得体会,字数在200字以上。)第二篇:C++程序设计—电话簿管理系统
第三篇:C++课程设计学生成绩管理分析系统
第四篇:c++大作业 学生成绩管理系统 学生实验报告 样本[最终版]
第五篇:C程序设计-学生成绩管理