软件开发流程图示例关于班级管理(班级管理业务流程图)

软件开发 4374
今天给各位分享软件开发流程图示例关于班级管理的知识,其中也会对班级管理业务流程图进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!关于班级管理的流程图 (1)任命班长(2)授予班长挑选副班长以及其他班委员的权力,(3)授予班委任命、管理小组长的权力(4)授予小组长管理组员的权力结束!软件开发流程 一个软件从开始到最后一共需要以下几个流程:

今天给各位分享软件开发流程图示例关于班级管理的知识,其中也会对班级管理业务流程图进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

关于班级管理的流程图

(1)任命班长

(2)授予班长挑选副班长以及其他班委员的权力,

(3)授予班委任命、管理小组长的权力

(4)授予小组长管理组员的权力

结束!

软件开发流程

一个软件从开始到最后一共需要以下几个流程:

1、计划

2、分析

3、设计

4、编码

5、测试

6、维护

1、计划

对所要解决的问题进行总体定义,包括了解用户的要求及现实环境,从技术、经济和社会因素等3个方面研究并论证本软件项目的可行性,编写可行性研究报告,探讨解决问题的方案,并对可供使用的资源(如计算机硬件、系统软件、人力等)成本,可取得的效益和开发进度作出估计,制订完成开发任务的实施计划。

2、分析

软件需求分析就是对开发什么样的软件的一个系统的分析与设想。它是一个对用户的需求进行去粗取精、去伪存真、正确理解,然后把它用软件工程开发语言(形式功能规约,即需求规格说明书)表达出来的过程。本阶段的基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到用户的认可。需求分析的主要方法有结构化分析方法、数据流程图和数据字典等方法。本阶段的工作是根据需求说明书的要求,设计建立相应的软件系统的体系结构,并将整个系统分解成若干个子系统或模块,定义子系统或模块间的接口关系,对各子系统进行具体设计定义,编写软件概要设计和详细设计说明书,数据库或数据结构设计说明书,组装测试计划。在任何软件或系统开发的初始阶段必须先完全掌握用户需求,以期能将紧随的系统开发过程中哪些功能应该落实、采取何种规格以及设定哪些限制优先加以定位。系统工程师最终将据此完成设计方案,在此基础上对随后的程序开发、系统功能和性能的描述及限制作出定义。

3、设计

软件设计可以分为概要设计和详细设计两个阶段。实际上软件设计的主要任务就是将软件分解成模块是指能实现某个功能的数据和程序说明、可执行程序的程序单元。可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可更换的功能单元。模块,然后进行模块设计。概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。

4、编码

软件编码是指把软件设计转换成计算机可以接受的程序,即写成以某一程序设计语言表示的“源程序清单”。充分了解软件开发语言、工具的特性和编程风格,有助于开发工具的选择以及保证软件产品的开发质量。

当前软件开发中除在专用场合,已经很少使用二十世纪80年代的高级语言了,取而代之的是面向对象的开发语言。而且面向对象的开发语言和开发环境大都合为一体,大大提高了开发的速度。

5、测试

软件测试的目的是以较小的代价发现尽可能多的错误。要实现这个目标的关键在于设计一套出色的测试用例(测试数据与功能和预期的输出结果组成了测试用例)。如何才能设计出一套出色的测试用例,关键在于理解测试方法。不同的测试方法有不同的测试用例设计方法。两种常用的测试方法是白盒法测试对象是源程序,依据的是程序内部的的逻辑结构来发现软件的编程错误、结构错误和数据错误。结构错误包括逻辑、数据流、初始化等错误。用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果。白盒法和黑盒法依据的是软件的功能或软件行为描述,发现软件的接口、功能和结构错误。其中接口错误包括内部/外部接口、资源管理、集成化以及系统错误。黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。

6、维护

维护是指在已完成对软件的研制(分析、设计、编码和测试)工作并交付使用以后,对软件产品所进行的一些软件工程的活动。即根据软件运行的情况,对软件进行适当修改,以适应新的要求,以及纠正运行中发现的错误。编写软件问题报告、软件修改报告。

一个中等规模的软件,如果研制阶段需要一年至二年的时间,在它投入使用以后,其运行或工作时间可能持续五年至十年。那么它的维护阶段也是运行的这五年至十年期间。在这段时间,人们几乎需要着手解决研制阶段所遇到的各种问题,同时还要解决某些维护工作本身特有的问题。做好软件维护工作,不仅能排除障碍,使软件能正常工作,而且还可以使它扩展功能,提高性能,为用户带来明显的经济效益。然而遗憾的是,对软件维护工作的重视往往远不如对软件研制工作的重视。而事实上,和软件研制工作相比,软件维护的工作量和成本都要大得多。

在实际开发过程中,软件开发并不是从第一步进行到最后一步,而是在任何阶段,在进入下一阶段前一般都有一步或几步的回溯。在测试过程中的问题可能要求修改设计,用户可能会提出一些需要来修改需求说明书等。

求一个完整的软件项目开发流程???

第一个步骤是市场调研,技术和市场要结合才能体现最大价值。

第二个步骤是需求分析,这个阶段需要出三样东西,用户视图,数据词典和用户操作手册。用户视图是该软件用户(包括终端用户和管理用户)所能看到的页面样式,这里面包含了很多操作方面的流程和条件。数据词典是指明数据逻辑关系并加以整理的东东,完成了数据词典,数据库的设计就完成了一半多。用户操作手册是指明了操作流程的说明书。请注意,用户操作流程和用户视图是由需求决定的,因此应该在软件设计之前完成,完成这些,就为程序研发提供了约束和准绳,很遗憾太多公司都不是这样做的,因果颠倒,顺序不分,开发工作和实际需求往往因此产生隔阂脱节的现象。需求分析,除了以上工作,笔者以为作为项目设计者应当完整的做出项目的性能需求说明书,因为往往性能需求只有懂技术的人才可能理解,这就需要技术专家和需求方(客户或公司市场部门)能够有真正的沟通和了解。

第三个步骤是概要设计,将系统功能模块初步划分,并给出合理的研发流程和资源要求。作为快速原型设计方法,完成概要设计就可以进入编码阶段了,通常采用这种方法是因为涉及的研发任务属于新领域,技术主管人员一上来无法给出明确的详细设计说明书,但是并不是说详细设计说明书不重要,事实上快速原型法在完成原型代码后,根据评测结果和经验教训的总结,还要重新进行详细设计的步骤。

第四个步骤是详细设计,这是考验技术专家设计思维的重要关卡,详细设计说明书应当把具体的模块以最‘干净’的方式(黑箱结构)提供给编码者,使得系统整体模块化达到最大;一份好的详细设计说明书,可以使编码的复杂性减低到最低,实际上,严格的讲详细设计说明书应当把每个函数的每个参数的定义都精精细细的提供出来,从需求分析到概要设计到完成详细设计说明书,一个软件项目就应当说完成了一半了。换言之,一个大型软件系统在完成了一半的时候,其实还没有开始一行代码工作。那些把作软件的程序员简单理解为写代码的,就从根子上犯了错误了。

第五个步骤是编码,在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/2,通常在1/3的时间,所谓磨刀不误砍柴功,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待,这种问题在很多研发过程中都出现过。编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug永远存在,你必须永远面对这个问题,大名鼎鼎的微软,可曾有连续三个月不发补丁的时候吗?从来没有!

第六个步骤是测试测试有很多种:按照测试执行方,可以分为内部测试和外部测试;按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。以上都很好理解,不再解释。总之,测试同样是项目研发中一个相当重要的步骤,对于一个大型软件,3个月到1年的外部测试都是正常的,因为永远都会又不可预料的问题存在。完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少不了升级,修补等等工作,只要不是想通过一锤子买卖骗钱,就要不停的跟踪软件的运营状况并持续修补升级,直到这个软件被彻底淘汰为止。

C语言程序设计:班级电话本管理程序

/* 电话簿程序 */

/******头文件(.h)***********/

#include "stdio.h" /*I/O函数*/

#include "stdlib.h" /*标准库函数*/

#include "string.h"/*字符串函数*/

#include "ctype.h" /*字符操作函数*/

#define M 50 /*定义常数表示记录数*/

struct unit/*定义数据结构*/

{

char name[20]; /*姓名*/

char units[30]; /*单位*/

char tele[10]; /*电话*/

};

typedef struct unit ADDRESS;

/******以下是函数原型*******/

int enter(ADDRESS t[]); /*输入记录*/

void list(ADDRESS t[],int n); /*显示记录*/

void search(ADDRESS t[],int n); /*按姓名查找显示记录*/

int delete(ADDRESS t[],int n); /*删除记录*/

int add(ADDRESS t[],int n); /*插入记录*/

void save(ADDRESS t[],int n); /*记录保存为文件*/

int load(ADDRESS t[]); /*从文件中读记录*/

void display(ADDRESS t[]); /*按序号查找显示记录*/

void sort(ADDRESS t[],int n); /*按姓名排序*/

void qseek(ADDRESS t[],int n); /*快速查找记录*/

void copy(); /*文件复制*/

void print(ADDRESS temp); /*显示单条记录*/

int find(ADDRESS t[],int n,char *s) ; /*查找函数*/

int menu_select(); /*主菜单函数*/

/******主函数开始*******/

main()

{

int i;

ADDRESS adr[M]; /*定义结构体数组*/

int length; /*保存记录长度*/

clrscr(); /*清屏*/

for(;;)/*无限循环*/

{

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

{

case 0:length=enter(adr);break;/*输入记录*/

case 1:list(adr,length);break; /*显示全部记录*/

case 2:search(adr,length);break; /*查找记录*/

case 3:length=delete(adr,length);break; /*删除记录*/

case 4:length=add(adr,length); break; /*插入记录*/

case 5:save(adr,length);break; /*保存文件*/

case 6:length=load(adr); break; /*读文件*/

case 7:display(adr);break; /*按序号显示记录*/

case 8:sort(adr,length);break; /*按姓名排序*/

case 9:qseek(adr,length);break; /*快速查找记录*/

case 10:copy();break; /*复制文件*/

case 11:exit(0); /*如返回值为11则程序结束*/

}

}

}

/*菜单函数,函数返回值为整数,代表所选的菜单项*/

menu_select()

{

char s[80];

int c;

gotoxy(1,25);/*将光标定为在第25行,第1列*/

printf("press any key enter menu......\n");/*提示压任意键继续*/

getch(); /*读入任意字符*/

clrscr(); /*清屏*/

gotoxy(1,1);

printf("********************MENU*********************\n\n");

printf(" 0. Enter record\n");

printf(" 1. List the file\n");

printf(" 2. Search record on name\n");

printf(" 3. Delete a record\n");

printf(" 4. add record \n");

printf(" 5. Save the file\n");

printf(" 6. Load the file\n");

printf(" 7. display record on order\n");

printf(" 8. sort to make new file\n");

printf(" 9. Quick seek record\n");

printf(" 10. copy the file to new file\n");

printf(" 11. Quit\n");

printf("***********************************************\n");

do{

printf("\n Enter you choice(0~11):"); /*提示输入选项*/

scanf("%s",s); /*输入选择项*/

c=atoi(s); /*将输入的字符串转化为整型数*/

}while(c0||c11); /*选择项不在0~11之间重输*/

return c; /*返回选择项,主程序根据该数调用相应的函数*/

}

/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/

int enter(ADDRESS t[])

{

int i,n;

char *s;

clrscr(); /*清屏*/

printf("\nplease input num \n"); /*提示信息*/

scanf("%d",n); /*输入记录数*/

printf("please input record \n"); /*提示输入记录*/

printf("name unit telephone\n");

printf("------------------------------------------------\n");

for(i=0;in;i++)

{

scanf("%s%s%s",t[i].name,t[i].units,t[i].tele); /*输入记录*/

printf("----------------------------------------------\n");

}

return n; /*返回记录条数*/

}

/*显示记录,参数为记录数组和记录条数*/

void list(ADDRESS t[],int n)

{

int i;

clrscr();

printf("\n\n*******************ADDRESS******************\n");

printf("name unit telephone\n");

printf("------------------------------------------------\n");

for(i=0;in;i++)

printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);

if((i+1)%10==0) /*判断输出是否达到10条记录*/

{

printf("Press any key continue...\n"); /*提示信息*/

getch(); /*压任意键继续*/

}

printf("************************end*******************\n");

}

/*查找记录*/

void search(ADDRESS t[],int n)

{

char s[20]; /*保存待查找姓名字符串*/

int i; /*保存查找到结点的序号*/

clrscr(); /*清屏*/

printf("please search name\n");

scanf("%s",s); /*输入待查找姓名*/

i=find(t,n,s); /*调用find函数,得到一个整数*/

if(in-1) /*如果整数i值大于n-1,说明没找到*/

printf("not found\n");

else

print(t[i]); /*找到,调用显示函数显示记录*/

}

/*显示指定的一条记录*/

void print(ADDRESS temp)

{

clrscr();

printf("\n\n********************************************\n");

printf("name unit telephone\n");

printf("------------------------------------------------\n");

printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);

printf("**********************end***********************\n");

}

/*查找函数,参数为记录数组和记录条数以及姓名s */

int find(ADDRESS t[],int n,char *s)

{

int i;

for(i=0;in;i++)/*从第一条记录开始,直到最后一条*/

{

if(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/

return i; /*相等,则返回该记录的下标号,程序提前结结束*/

}

return i; /*返回i值*/

}

/*删除函数,参数为记录数组和记录条数*/

int delete(ADDRESS t[],int n)

{

char s[20]; /*要删除记录的姓名*/

int ch=0;

int i,j;

printf("please deleted name\n"); /*提示信息*/

scanf("%s",s);/*输入姓名*/

i=find(t,n,s); /*调用find函数*/

if(in-1) /*如果in-1超过了数组的长度*/

printf("no found not deleted\n"); /*显示没找到要删除的记录*/

else

{

print(t[i]); /*调用输出函数显示该条记录信息*/

printf("Are you sure delete it(1/0)\n"); /*确认是否要删除*/

scanf("%d",ch); /*输入一个整数0或1*/

if(ch==1) /*如果确认删除整数为1*/

{

for(j=i+1;jn;j++) /*删除该记录,实际后续记录前移*/

{

strcpy(t[j-1].name,t[j].name); /*将后一条记录的姓名拷贝到前一条*/

strcpy(t[j-1].units,t[j].units); /*将后一条记录的单位拷贝到前一条*/

strcpy(t[j-1].tele,t[j].tele); /*将后一条记录的电话拷贝到前一条*/

}

n--; /*记录数减1*/

}

}

return n; /*返回记录数*/

}

/*插入记录函数,参数为结构体数组和记录数*/

int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/

{

ADDRESS temp; /*新插入记录信息*/

int i,j;

char s[20]; /*确定插入在哪个记录之前*/

printf("please input record\n");

printf("************************************************\n");

printf("name unit telephone\n");

printf("--------------------------------------------------\n");

scanf("%s%s%s",temp.name,temp.units,temp.tele); /*输入插入信息*/

printf("------------------------------------------------\n");

printf("please input locate name \n");

scanf("%s",s); /*输入插入位置的姓名*/

i=find(t,n,s); /*调用find,确定插入位置*/

for(j=n-1;j=i;j--) /*从最后一个结点开始向后移动一条*/

{

strcpy(t[j+1].name,t[j].name); /*当前记录的姓名拷贝到后一条*/

strcpy(t[j+1].units,t[j].units); /*当前记录的单位拷贝到后一条*/

strcpy(t[j+1].tele,t[j].tele); /*当前记录的电话拷贝到后一条*/

}

strcpy(t[i].name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/

strcpy(t[i].units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/

strcpy(t[i].tele,temp.tele); /*将新插入记录的电话拷贝到第i个位置*/

n++; /*记录数加1*/

return n; /*返回记录数*/

}

/*保存函数,参数为结构体数组和记录数*/

void save(ADDRESS t[],int n)

{

int i;

FILE *fp; /*指向文件的指针*/

if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/

{

printf("can not open file\n");/*没打开*/

exit(1); /*退出*/

}

printf("\nSaving file\n"); /*输出提示信息*/

fprintf(fp,"%d",n); /*将记录数写入文件*/

fprintf(fp,"\r\n"); /*将换行符号写入文件*/

for(i=0;in;i++)

{

fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);/*格式写入记录*/

fprintf(fp,"\r\n"); /*将换行符号写入文件*/

}

fclose(fp);/*关闭文件*/

printf("****save success***\n"); /*显示保存成功*/

}

/*读入函数,参数为结构体数组*/

int load(ADDRESS t[])

{

int i,n;

FILE *fp; /*指向文件的指针*/

if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/

{

printf("can not open file\n"); /*不能打开*/

exit(1); /*退出*/

}

fscanf(fp,"%d",n); /*读入记录数*/

for(i=0;in;i++)

fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele); /*按格式读入记录*/

fclose(fp); /*关闭文件*/

printf("You have success read data from file!!!\n"); /*显示保存成功*/

return n; /*返回记录数*/

}

/*按序号显示记录函数*/

void display(ADDRESS t[])

{

int id,n;

FILE *fp; /*指向文件的指针*/

if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/

{

printf("can not open file\n"); /*不能打开文件*/

exit(1); /*退出*/

}

printf("Enter order number...\n"); /*显示信息*/

scanf("%d",id); /*输入序号*/

fscanf(fp,"%d",n); /*从文件读入记录数*/

if(id=0idn) /*判断序号是否在记录范围内*/

{

fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/

print(t[id]); /*调用输出函数显示该记录*/

printf("\r\n");

}

else

printf("no %d number record!!!\n ",id); /*如果序号不合理显示信息*/

fclose(fp); /*关闭文件*/

}

/*排序函数,参数为结构体数组和记录数*/

void sort(ADDRESS t[],int n)

{

int i,j,flag;

ADDRESS temp; /*临时变量做交换数据用*/

for(i=0;in;i++)

{

flag=0; /*设标志判断是否发生过交换*/

for(j=0;jn-1;j++)

if((strcmp(t[j].name,t[j+1].name))0) /*比较大小*/

{

flag=1;

strcpy(temp.name,t[j].name); /*交换记录*/

strcpy(temp.units,t[j].units);

strcpy(temp.tele,t[j].tele);

strcpy(t[j].name,t[j+1].name);

strcpy(t[j].units,t[j+1].units);

strcpy(t[j].tele,t[j+1].tele);

strcpy(t[j+1].name,temp.name);

strcpy(t[j+1].units,temp.units);

strcpy(t[j+1].tele,temp.tele);

}

if(flag==0)break; /*如果标志为0,说明没有发生过交换循环结束*/

}

printf("sort sucess!!!\n"); /*显示排序成功*/

}

/*快速查找,参数为结构体数组和记录数*/

void qseek(ADDRESS t[],int n)

{

char s[20];

int l,r,m;

printf("\nPlease sort before qseek!\n"); /*提示确认在查找之前,记录是否已排序*/

printf("please enter name for qseek\n"); /*提示输入*/

scanf("%s",s); /*输入待查找的姓名*/

l=0;r=n-1; /*设置左边界与右边界的初值*/

while(l=r) /*当左边界=右边界时*/

{

m=(l+r)/2; /*计算中间位置*/

if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/

{

print(t[m]); /*如果相等,则调用print函数显示记录信息*/

return ; /*返回*/

}

if(strcmp(t[m].name,s)0) /*如果中间结点小*/

l=m+1; /*修改左边界*/

else

r=m-1; /*否则,中间结点大,修改右边界*/

}

if(lr) /*如果左边界大于右边界时*/

printf("not found\n"); /*显示没找到*/

}

/*复制文件*/

void copy()

{

char outfile[20]; /*目标文件名*/

int i,n;

ADDRESS temp[M]; /*定义临时变量*/

FILE *sfp,*tfp; /*定义指向文件的指针*/

clrscr();/*清屏*/

if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/

{

printf("can not open file\n"); /*显示不能打开文件信息*/

exit(1); /*退出*/

}

printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/

scanf("%s",outfile); /*输入目标文件名*/

if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/

{

printf("can not open file\n"); /*显示不能打开文件信息*/

exit(1); /*退出*/

}

fscanf(sfp,"%d",n); /*读出文件记录数*/

fprintf(tfp,"%d",n);/*写入目标文件数*/

fprintf(tfp,"\r\n"); /*写入换行符*/

for(i=0;in;i++)

{

fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].units,

temp[i].tele); /*读入记录*/

fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,

temp[i].units,temp[i].tele); /*写入记录*/

fprintf(tfp,"\r\n"); /*写入换行符*/

}

fclose(sfp); /*关闭源文件*/

fclose(tfp); /*关闭目标文件*/

printf("you have success copy file!!!\n"); /*显示复制成功*/

}

C语言程序设计 班级学生成绩管理系统

设计课题一:班级成绩管理系统

一、 问题描述:

对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。

二、功能要求:

1、本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。

2、本系统显示这样的菜单:

请选择系统功能项:

a、 成绩录入

b、 成绩显示

c、 成绩保存

d、 成绩排序

e、 成绩修改(要求先输入密码)

f、 成绩统计

(1) 显示每门课程成绩最高的学生的基本信息

(2) 显示每门课程的平均成绩

(3) 显示超过某门课程平均成绩的学生人数

g、 退出系统

3、执行一个具体的功能之后,程序将重新显示菜单。

4、将学生成绩保存到文件中。

三、算法提示:

1、数据结构:结构体类型数组。

2、数据库结构:下表构成该系统的基本数据库。

姓名 学号 课程名称1 课程名称2 ●●●●●●

char Char float float

四、测试数据:

学生人数N=10

课程门数M=4

课程名:数学、语文、英语、政治

五、其它

对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。

问题补充:

今天谁能给我答案啊!!!!!!!急急!!!!!!!

提问者: 342123465 - 一级

最佳答案

C语言课程设计报告—班级成绩管理系统

需要分析:

学生成绩管理系统有13种功能。把这13个功能做成13个子函数。在主函当数中设计一个菜单对这13个子数进行管理。来实现对整个系统的操作。

根据课题的要求。每一个学生的包括姓名(char)、学号(char)、M门课程的成绩(float).再加上系统功能上的要求每一学生的信息还要总分和名次等。所以自然的想到要用结构体来定义每一个学生的信息结构。然后用链表把它们组成一个有序的整体。用对链表的操作来实现对所有学生信息的统一管理(成绩显示、成绩排序、成绩修改等)。最后为了以后按照处理后的顺序保存到文件中。

. 各函数的功能:

概要设计:

程序的模块组成:

主 函 数: int main()

新建函数:STUDENT *init()

输入函数 :STUDENT *create()

显示函数: void print(STUDENT *head)

删除函数: STUDENT *delete(STUDENT *head)

按名字寻找函数: void lookup(STUDENT *head)

保存函数: void save(STUDENT *head)

按总分排序函数: STUDENT *sort(STUDENT *head)

计算总分和均分函数: void computer(STUDENT *h)

修改函数: STUDENT *Modify(STUDENT *head,STUDENT *new)

按学号排序函数: STUDENT *index(STUDENT *h)

菜单函数:int menu_select()

各个函数的主要功能:

输入函数: 随时输入数据。

菜单函数:显示系统主菜单。

显示函数: 显示所有学生的信息。

寻找函数: 方便学生查找自己的成绩。

删除函数: 删除某学生的信息。

排序函数: 按总成绩排序。

按学号排序函数: 按学号排序。

插入函数: 可以插入新的信息。

保存函数: 保存好学生成绩,以免丢失。

统计函数:

l 显示每门课程成绩最高的学生的基本信息。

l 显示每门课程的平均成绩。

l 显示超过某门课程平均成绩的学生人数。

课题的功能模块的划分:

开始

菜单界面

功能选择

初始化函数

输入学生信息

删除学生信息

显示学生信息

查找学生信息

按成绩排序

保存到文件

从文件读数据

插入学生成绩

分类合计

退出系统

结束

详细设计: 整个系统除了主函数外,另外还有14个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:

主函数 main()

利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。

菜单选择函数 int menu_select()

这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,返回菜单。

代码设计: 初始化函数 STUDENT *init()

这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head的值为NULL和一个清屏语句。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!

输入记录函数 STUDENT *create() 这是一个无参函数,用来执行学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个链表头的指针指向一下个学生的信息插在表头。

N-S流程图如下:

head=NULL无条件循环

指针p指向新开辟的单元

指针p是否为空

是 否

输入学号p-num

输出 p-num是否为@

内存 是 否

溢出 输入姓名p-name

停止 for(i=0;i3;i++)

输入 输入成绩

返回 p-sum=s;

菜单 p-average=(float)s/3;

显示记录函数 void print(STUDENT *head)

这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。

算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。

N-S流程图如下:

p=head,使指向第一个结点

输出p所指向的结点

p指向一下个结点

当p指的不是表尾

程序调试:

由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。在用的时候难免出现这样那样的错误。如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个问题的办法是调整。最后还是老师帮我帮我们找到了问题的所在——for 循环的次超过了链表中结点的数量。再就是自定义函数时由于课本的概念不清楚,多写了空格键,以至函数调用不出来。又如:在设计修改学生信息时的密密码时。当用户发现输入密码错误按了退格键后,因为“*”并没有消去。导致用户再次按退格键,又出现前面的情况。最终导致输入密码错误。所以用了两次退格键:

在对链表操作时,要特别链表指针的移动(p=p-next)和链表尾的判断 (p= =NULL)。没有指针的移动,就很容易出现死循环。而在运行过程中不能控制。所以你就会认为是死机。如果没有链表尾的判断。就会在运行过程出现想不到的错误。如:在显示链表信息时,后面就会出现乱码。

一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用你设计的这个系统。在设计的调试过程中也无法顺利的完成调试工作。有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。

予我耐心解答的老师和同学,是他们为我小程序的成功起到了关键性的作用,那么多个日夜,如此多的困难,同学们勤恳塌实,从开始到结束,没有显出一点倦意,始终热情高涨,我感谢这种氛围,感谢学校提供的良好条件。

回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,在整整半个学期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。

本次课程设计结束了,对于我的影响很大。我通过这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也使我知道自己哪些方面做得还不够。

但我出总结出了一点点的经验如下:

1、要对系统的功能和要求做出详细的分析,并合理分解任务。

2、把分解出来的子任务,做给一个相对独立的模块。

3、在设计一个模块之前,要简单构想一下总界面的显视情况。

4、针对构想出来的界面进行程序的编写。

最后,感谢老师您对我的指导和从百忙中抽空看我的设计,谢谢!

附件:

源程序:

#include "stdio.h" /*I/O函数*/

#include "stdlib.h" /*其它说明*/

#include "string.h" /*字符串函数*/

#include "conio.h" /*屏幕操作函数*/

#include "mem.h" /*内存操作函数*/

#include "ctype.h" /*字符操作函数*/

#include "alloc.h" /*动态地址分配函数*/

#include "dos.h"

#define N 4 /*定义常数*/

typedef struct z1 /*定义数据结构*/

{

char no[12];

char name[20];

int score[N];

float sum;

float average;

int order;

struct z1 *next;

}STUDENT;

/*以下是函数原型*/

STUDENT *init(); /*初始化函数*/

STUDENT *create(); /*创建链表*/

STUDENT *delete(STUDENT *h); /*删除记录*/

void print(STUDENT *h); /* 显示所有记录*/

void lookup(STUDENT *h); /*查找*/

void save(STUDENT *h); /*保存*/

STUDENT *load(); /*读入记录*/

void computer(STUDENT *h); /*计算总分和均分*/

STUDENT *Modify(STUDENT *h); /*修改记录*/

void append(); /*追加记录*/

STUDENT *sort(STUDENT *h); /*按总分排序*/

STUDENT *index(STUDENT *h); /*按学号排序*/

int menu_select(); /*菜单函数*/

/******主函数开始*******/

main()

{

int i;

STUDENT *head; /*链表定义头指针*/

printf("\n\n\n\n\n\n\n\n\n");

printf(" * * ******* * ***** ***** * * ******* \n");

printf(" * * * * * * * ** * * * \n");

printf(" * * * * ******* * * * * * *** * ******* \n" );

printf(" * * * * * * * * * * * * * \n");

printf(" * * ******* ******* ***** * *** * * * ******* \n");

printf("\n");

printf("\n");

printf("\n");

sleep(2);

head=init(); /*初始化链表*/

clrscr(); /*清屏*/

for(;;) /*无限循环*/

{

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

{ /*值不同,执行的函数不同,break 不能省略*/

case 0:head=init();break; /*执行初始化*/

case 1:head=create();break; /*创建链表*/

case 2:print(head);break; /*显示全部记录*/

case 3:head=delete(head);break; /*删除记录*/

case 4:lookup(head);break; /*按名字查找记录*/

case 5:save(head);break; /*保存文件*/

case 6:head=load(); break; /*读文件*/

case 7:computer(head);break; /*计算总分和均分*/

case 8:head=Modify(head); break; /*修改记录,一般会插在表尾*/

case 9:head=sort(head);break; /*按部分排序*/

case 10:append();break; /*追加记录*/

case 11:head=index(head);break; /*按学号排序*/

case 12: exit(0); /*如菜单返回值为12程序结束*/

}

}

}

/*菜单函数,返回值为整数*/

menu_select()

{

char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/

" 00. init list", /*初始化*/

" 01. Enter list", /*输入记录*/

" 02. print list ", /*显示单链表中所有记录*/

" 03. Delete a record from list", /*从表中删除记录*/

" 04. Search record on name", /*按照姓名查找记录*/

" 05. Save the file", /*将单链表中记录保存到文件中*/

" 06. Load the file", /*从文件中读入记录*/

" 07. compute the score", /*计算所有学生的总分和均分*/

" 08. Modify an information ", /*修改某学号的信息*/

" 09. sort to make new file", /*排序*/

" 10. append record to file", /*追加记录到文件中*/

" 11. index on nomber", /*按学号排序*/

" 12. Quit"}; /*退出*/

char s[3]; /*以字符形式保存选择号*/

int c,i; /*定义整形变量*/

gotoxy(1,1); /*移动光标*/

textcolor(YELLOW); /*设置文本显示颜色为黄色*/

textbackground(BLUE); /*设置背景颜色为蓝色*/

gotoxy(10,2); /*移动光标*/

putch(0xc9); /*输出左上角边框┏*/

for(i=1;i44;i++)

putch(0xcd); /*输出上边框水平线*/

putch(0xbb); /*输出右上角边框 ┓*/

for(i=3;i20;i++)

{

gotoxy(10,i);putch(0xba); /*输出左垂直线*/

gotoxy(54,i);putch(0xba); /*输出右垂直线*/

}

gotoxy(10,20);putch(0xc8); /*输出左上角边框┗*/

for(i=1;i44;i++)

putch(0xcd); /*输出下边框水平线*/

putch(0xbc); /*输出右下角边框┛*/

window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/

clrscr(); /*清屏*/

for(i=0;i16;i++) /*输出主菜单数组*/

{

gotoxy(10,i+1);

cprintf("%s",menu[i]);

}

textbackground(BLACK); /*设置背景颜色为黑色*/

window(1,1,80,25); /*恢复原窗口大小*/

gotoxy(10,21); /*移动光标*/

do{printf("\n make by wenwei");

printf("\n Enter you choice(0~13):"); /*在菜单窗口外显示提示信息*/

scanf("%s",s); /*输入选择项*/

c=atoi(s); /*将输入的字符串转化为整形数*/

}while(c0||c14); /*选择项不在0~14之间重输*/

return c; /*返回选择项,主程序根据该数调用相应的函数*/

}

STUDENT *init()

{ clrscr();

return NULL;

}

/*创建链表*/

STUDENT *create()

{

int i; int s;

STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/

clrscr();

for(;;)

{

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/

if(!info) /*如果指针info为空*/

{

printf("\nout of memory"); /*输出内存溢出*/

return NULL; /*返回空指针*/

}

inputs("enter no:",info-no,11); /*输入学号并校验*/

if(info-no[0]=='@') { clrscr();break; } /*如果学号首字符为@则结束输入,清屏后返回*/

inputs("enter name:",info-name,15); /*输入姓名,并进行校验*/

printf("please input %d score \n",N); /*提示开始输入成绩*/

s=0; /*计算每个学生的总分,初值为0*/

for(i=0;iN;i++) /*N门课程循环N次*/

{

do{

printf("score%d:",i+1); /*提示输入第几门课程*/

scanf("%d",info-score[i]); /*输入成绩*/

if(info-score[i]100||info-score[i]0) /*确保成绩在0~100之间*/

printf("bad data,repeat input\n"); /*出错提示信息*/

}while(info-score[i]100||info-score[i]0);

s=s+info-score[i]; /*累加各门课程成绩*/

}

info-sum=s; /*将总分保存*/

info-average=(float)s/N; /*求出平均值*/

info-order=0; /*未排序前此值为0*/

info-next=h; /*将头结点做为新输入结点的后继结点*/

h=info; /*新输入结点为新的头结点*/

clrscr();

}

return(h); /*返回头指针*/

}

/*输入字符串,并进行长度验证*/

inputs(char *prompt, char *s, int count)

{

char p[255];

do{

printf(prompt); /*显示提示信息*/

scanf("%s",p); /*输入字符串*/

if(strlen(p)count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/

}while(strlen(p)count);

strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/

}

/*输出链表中结点信息*/

void print(STUDENT *h)

{

int i=0; /* 统计记录条数*/

STUDENT *p; /*移动指针*/

clrscr(); /*清屏*/

p=h; /*初值为头指针*/

printf("\n\n\n*********************************STUDENT************************************\n");

printf("|rec|nO | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");

printf("|---|----------|---------------|----|----|----|----|--------|--------|-----|\n");

while(p!=NULL) /*只要p不是尾结点,就输出记录*/

{

i++;

printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d |\n", i, p-no,p-name,p-score[0],p-score[1],p-score[2],p-score[3],p-sum,p-average,p-order);

p=p-next;

}

printf("***********************************end**************************************\n");

getch(); /*输入任一键返回主菜单*/

clrscr(); /*清屏*/

}

/*删除记录*/

STUDENT *delete(STUDENT *h)

{

STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/

char s[12]; /*存放学号*/

char *pass="wenwei28";

char a[20],b=NULL;

int i=0;

clrscr();

printf("Input your password:");

while((i20)(b!='\r'))

{ b=getch(); /*无回显输入*/

if(b==8)

{ if(i0)

{a[--i]=NULL;

putchar(8); /*退格键*/

putchar(' '); /*以空格代替*/

putchar(8);

}

else putchar(7); /*没有任何字符的退格,响铃警告*/

}

else if(b!='\r')

{ a[i++]=b; /*只要不是退格和回车就接受*/

putchar('*');

}

else

{a[i]=NULL; break; /*密码输入完了,记得加个NULL到后面*/

}

}

if(strcmp(a,pass)!=0)

{clrscr();

printf("Password is mistake Tow seconds to return!");

sleep(2);clrscr();return h;

}

else {printf("Password is OK! Welcome to come!"); sleep(3);

}

clrscr(); /*清屏*/

printf("please deleted no\n"); /*显示提示信息*/

scanf("%s",s); /*输入要删除记录的学号*/

q=p=h; /*给q和p赋初值头指针*/

while(strcmp(p-no,s)p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/

{

q=p; /*将p指针值赋给q作为p的前驱指针*/

p=p-next; /*将p指针指向下一条记录*/

}

if(p==NULL) /*如果p为空,说明链表中没有该结点*/

{ printf("\nlist no %s student\n",s);sleep(2);clrscr();return h;}

else /*p不为空,显示找到的记录信息*/

{

printf("*********************************have found********************************\n");

printf("|no | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");

printf("|------------|---------------|----|----|----|----|--------|--------|-----|\n");

printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6-5.2f | %3d |\n", p-no,

p-name,p-score[0],p-score[1],p-score[ q=p; /*保存当前结点的指针,作为下一结点的前驱*/

p=p-next; /*指针后移,新读入数据链到当前表尾*/

}

q-next=NULL; /*最后一个结点的后继指针为空*/

fclose(fp); /*关闭文件*/

printf("---You have success read data from file!!!---\n");

getch(); /*按任意键返回主菜单*/

clrscr();

return h; /*返回头指针*/

}

/*成绩统计*/

void computer(STUDENT *h)

{

STUDENT *p,*t,*q; /*定义移动指针*/

float saverage[N]={0}; /*均分初值为0*/

int i;

clrscr();

for (i=0;iN;i++)

{ int n=0,j=0; /*保存记录条数初值为0*/

long s=0; /*总分初值为0*/

p=h; /*从头指针开始*/

while(p!=NULL) /*当p不为空时处理*/

{

s+=p-score[i]; /*累加总分*/

j++; /*统计记录条数*/

p=p-next; /*指针后移*/

h; /*返回头指针

}

软件开发流程图示例关于班级管理的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于班级管理业务流程图、软件开发流程图示例关于班级管理的信息别忘了在本站进行查找喔。

扫码二维码