学生成绩管理系统——课程设计

学生成绩管理系统

这是我大一的课程设计作业,供大家参考。

该程序利用Window文件和getch()函数通过“pgup”,“pgdn”键选择功能菜单,其中具体的函数功能我也不是很清楚,借鉴了一些大佬的对这部分的运用代码。
在这里插入图片描述

还有如图其他的功能,详细代码如下,有详细注解。

#include <iostream>//输入输出流
#include <string.h>
#include <stdlib.h>
#include <conio.h>//屏幕操作函数
#include <windows.h>//
#include <mem.h>//内存操作函数
#include <ctype.h>//字符操作函数
#include <unistd.h>
#define   NR(x)   (sizeof(x)/sizeof(x[0]+0))
#define  TITLE  "       学生成绩管理系统    "
#define  AUTHOR "         作者:SuperOnly2222       "
#define  DATE   "       日期:2020年11月8日   "
#define  SIZE   100
#define N 3
typedef int Status;
using namespace std;
typedef struct s1
{
    char num[13];
    char name[15];
    int score[N];
    int sum;//总分
    float average;
    int order;//名次
    struct s1 *next;
}Student;
enum 定义枚举Keyboard的键值数据
{
	UP = 72,
	DOWN = 80 ,
	LEFT = 75 ,
	RIGHT = 77 ,
	ENTER = 13 ,
	ESC = 27 ,
};
char *menu[]={
        "***************MENU*************",
        "||1.         输入记录         ||",
        "||2.         删除记录         ||",
        "||3.       显示所有记录       ||",
        "||4.       按姓名查找记录     ||",
        "||5.         保存文件         ||",
        "||6.        读入文件记录      ||",
        "||7.      计算总分和平均分    ||",
        "||8.         插入记录         ||",
        "||9.         复制文件         ||",
        "||10.          排序           ||",
        "||11.          索引           ||",
        "||12.        分类合计         ||",
        "||13.          退出           ||"
		};
CONSOLE_CURSOR_INFO cci;
 //定义结构体
COORD pos = {0,0};
//定义默认的坐标位置  	
Student *Init(); 
//初始化  
Student *Create();
//创建链表 
Student *Delete(Student *h);
//删除 
void Print(Student *h);
//输出 
void Search(Student *h);
//查找 
void Save(Student *h);
//保存文件 
Student *Load();
//读文件 
void Computer(Student *h);
//计算总分和平均分 
Student *Insert(Student *h);
//插入 
void Copy();
//拷贝文件 
Student *Sort(Student *h);
//排序 
Student *Index (Student *h);
//索引 
void Total (Student *h);
//分类合计 
int showmenu(HANDLE hOut ,char **menu , int size , int index);
//菜单界面 
int  get_userinput(int *index , int size);
main()
{
    int i;
    Student *head;
    head=Init();
    system("cls");//清屏
    int ret ;
    int index=0 ;
    HANDLE hOut;
    SetConsoleTitleA(TITLE);
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取当前的句柄,设置为标准输出句柄 
    GetConsoleCursorInfo(hOut, &cci); //获取光标信息
    cci.dwSize = 1; //设置光标大小   
    cci.bVisible =  0; 	//设置光标不可见 FALSE   
    SetConsoleCursorInfo(hOut, &cci);//设置(应用)光标信息
    for(;;)
    {
    	showmenu(hOut , menu , NR(menu) , index);
		ret = get_userinput(&index , NR(menu));
		if(ret == ESC)
			break ;
		if(ret == ENTER)
		{
			switch(index)
			{
                case 1:head=Create();break;
                case 2:head=Delete(head);break;
                case 3:Print(head);break;
                case 4:Search(head);break;
                case 5:Save(head);break;
                case 6:head=Load();break;
                case 7:Computer(head);break;
                case 8:head=Insert(head);break;
                case 9:Copy();break;
                case 10:head=Sort(head);break;
                case 11:head=Index(head);break;
                case 12:Total(head);break;
                case 13:exit(0);//程序结束
			}
		}
	}
}
int showmenu(HANDLE hOut ,char **menu , int size , int index)
{
	int i ; 
	system("cls");	
	SetConsoleTextAttribute(hOut, 0x9); //设置显示的文本的颜色 
	pos.X = 40;
	pos.Y = 0 ;//初始化控制台显示的X,Y轴的坐标 
	SetConsoleCursorPosition(hOut,pos);///两个参数分别是指定哪个窗体,具体位置 
	printf("%s",TITLE);//调用printf在控制台对应的位置上输出 
	pos.X = 42;
	pos.Y = 1 ;
	SetConsoleCursorPosition(hOut,pos);    
	printf("%s",AUTHOR);
	pos.X = 40;
	pos.Y = 2 ;
	SetConsoleCursorPosition(hOut,pos);    
	printf("%s",DATE);
	for(i = 0 ; i < size ; i++)
	{
		if(i == index)	//如果i==index表示在当前选项的位置,默认初始化显示是第一项,显示为红色,当按下上下按键选择的时候,光标会移动,也就看到了列表选择的现象 
		{
			SetConsoleTextAttribute(hOut, FOREGROUND_BLUE ); //选择项变红色 
			pos.X = 40;
    		pos.Y = 5+i;
    		SetConsoleCursorPosition(hOut,pos);//设置光标坐标 
    		printf("%s",menu[i]);
		}
		else//否则显示为白色 
		{
			SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); //白色 
			pos.X = 40;
    		pos.Y = 5+i;
    		SetConsoleCursorPosition(hOut,pos);    //设置光标坐标
    		printf("%s",menu[i]);
		}
	}
	fflush(stdout);
	//清空输出缓冲区,并把缓冲区内容输出:对标准输出流的清理,但是它并不是把数据丢掉,而是及时地打印数据到屏幕上。标准输出是以行为单位进行的,也即碰到\n才打印数据到屏幕。
}
//获取用户输入的接口 
int  get_userinput(int *index , int size)
{
	int ch ;
	ch = getch();//获取指令,等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。 
	switch(ch)
	{
		case UP : if(*index > 0)  *index -= 1 ;  break; //如果选择上,那么光标向上移动 ,*index的值减一 
		case DOWN:if(*index < size -1)  *index += 1 ;  break;//如果选择下,那么光标向下移动 ,*index的值加一 
		case LEFT: return 0; //无回应 
		case RIGHT:return 0;
		case ENTER: return ENTER ;//回车 
		case ESC: return ESC ;//ESC
	}
	return 0 ;
}

//初始化链表
Student *Init()
{
    return NULL;
	//初始化单链表为空
}
//输入长度校验函数
int inputs(char *prompt,char *s,int count)
{
	char p[100]; 
    do{
        printf(prompt);//显示提示信息
        scanf("%s",p);//输入字符串
        if(strlen(p)>count)
        printf("\n Too Long! \n");//长度长度校验
    }while(strlen(p)>count);
    strcpy(s,p);//将输入的字符串拷贝到字符串s中 
}
//创建链表
Student *Create()
{
	system("cls");
	system("color f1");
    int i;
	int s; 
	float ave;
    Student *h=NULL;
    Student *stu;//指向结构体的指针
    for(;;)//无限循环
    {
        stu=(Student*)malloc(sizeof(Student));//申请储存空间
        if(!stu)//如果stu指针为空
        {
            printf("ERROR");//输出内存溢出
            return NULL;
        }
        inputs("enter num:",stu->num,12);//输入学号并校验
        if(stu->num[0]=='@') break;//学号首字符为@结束输入
        inputs("enter name:",stu->name,15);//输入名字并校验
        printf("Please input %d scores:\n",N);//输入N门课的成绩
        s=0;//令学生总分初值为零
        for (i=0;i<N;i++)
        {
            do{
                printf("score%d:",i+1);//提示输入第几门课程
                scanf("%d",&stu->score[i]);//输入成绩
                if(stu->score[i]>100||stu->score[i]<0)
                printf ("ERROR! Please repeat input!\n ");
            }while (stu->score[i]>100||stu->score[i]<0);
            s=s+stu->score[i];//累加求总分
        }
        stu->sum=s;//将总分保存
        ave=s/N;
        stu->average=ave;
        stu->order=0;//末排序前此值为0
        stu->next=h;//将头节点作为新输入结点的后继结点
        h=stu;//新输入结点为新的头结点
    }
    return (h);//返回头指针
}
//显示记录 
void Print(Student *h)
{
    int i=0;//统计记录条数
    Student *p;//移动指针
    system("cls");//清屏
    system("color f1");
    p=h;
    printf("\n\n\n*******************************STUDENT**********************************\n");
    printf("|rec|     num    |      name     | sc1| sc2| sc3|   sum  |aveage |order|\n");
    printf("|---|------------|---------------|----|----|----|--------|-------|-----|\n");
    while (p!=NULL)
    {
        i++;
        printf("|%3d|%-12s|%-15s|%4d|%4d|%4d| %4.2d   | %4.2f | %3d |\n",i,p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
        p=p->next;
    }
    printf("**************************************END*******************************\n");
    system("pause");
}

//删除记录
Student *Delete(Student *h)
{

    Student *p,*q;//*p为查找到要删除的结点指针,*q为*p的前趋指针
    char s[12];//存放学号
    system("cls");
    system("color f1");
    printf ("Please deleted num:\n");//显示提示信息
    scanf("%s",s);//输入要删除记录的学号
    q=p=h;//给q和p赋初值头指针
   
    while((strcmp(p->num,s)!=0)&&(p!=NULL))//当记录的学号不是要查找的或指针不为空时
    {
        q=p;//将p指针值赋给q作为p的前趋指针
        p=p->next;//查找下一条记录
    }
    if (p==NULL)//p为空,记录中们没有该学号
    printf("\nList no %s student\n",s);
    else//p不为空,输出找到的记录信息
    {
        printf("\n\n\n******************************STUDENT*******************************\n");
        printf("|     num    |      name     | sc1| sc2| sc3|   sum  |aveage |order|\n");
        printf("|------------|---------------|----|----|----|--------|-------|-----|\n");
        printf("|%-12s|%-15s|%4d|%4d|%4d| %4.2f   | %4.2d | %3d |\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
        printf("*******************************END**********************************\n");
        getch();//按任意键后,开始删除
        if(p==h)//此时被删结点是头结点
        h=p->next;//修改头指针使其指向被删记录的下一条记录
        else
        q->next=p->next;//执行删除操作,使q的后继结点指向p的后继结点
        free(p);//释放p所指结点的空间
        printf("\n Have deleted num %s student\n",s);
        printf("Dont't forget save!!!");//保存文件
    }
    return (h);//返回头指针
    system("pause");
}

//查找记录
void Search(Student *h)
{
    Student *p;//移动指针
    char s[15];//存放名字的字符数组
    system("cls");
    system("color f1");
    printf("Please enter name for search:\n");
    scanf ("%s",s);
    p=h;//将头指针赋给p
    while (strcmp(p->name,s)&&p!=NULL)//当记录的名字不是要找的或指针不为空时
    p=p->next;//移动指针,指向下一指针
    if(p==NULL)//如果指针为空
    printf ("\nList no %s student \n",s);
    else
    {
        printf("********************************STUDENT*****************************************\n");
        printf("|num          |        name       |score1|score2|score3|  sum  | average |order|\n");
        printf("|-------------|-------------------|------|------|------|-------|---------|-----|\n");
        printf("|%-12s|%-15s|%4d|%4d|%4d| %4.2d   | %4.2f | %3d |\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
        printf("**************************************END***************************************\n");
    }
    system("pause");
}
//插入记录
Student *Insert(Student *h)
{
	system("cls");
	system("color f1");
    Student *p,*q,*stu;//*p指向插入位置,*q是*p的前,stu是新插入记录
    char s[12];//保存插入点位置的学号
    int s1,i;
    printf("Please enter the location before the num:\n");
    scanf ("%s",s);//输入插入点学号
    printf("\nPlease input new record\n");
    stu=(Student*)malloc(sizeof(Student));//申请空间
    if(!stu)
    {
        printf("\nout of memory");//如果没有申请到,则内存溢出
        return NULL;//返回空指针
    }
    inputs("enter num:",stu->num,12);
    inputs("enter name:",stu->name,15);
    printf("Please input %d score \n",N);//提示输入分数
    s1=0;//保存新记录的总分,初值为0
    for(i=0;i<N;i++)
    {
         do{
                printf("score%d:",i+1);//提示输入第几门课程
                scanf("%d",&stu->score[i]);//输入成绩
                if(stu->score[i]>100||stu->score[i]<0)
                printf ("ERROR! Please repeat input\n ");
            }while (stu->score[i]>100||stu->score[i]<0);
            s1+=stu->score[i];//累加求总分
    }
            stu->sum=s1;//将总分保存
            stu->average=(float)s1/N;//是平均分保留小数位
            stu->order=0;//末排序前此值为0
            stu->next=NULL;//将后继结点设为空
            p=h;//将指针赋值给p
            q=h;//将指针赋值给q
            while (p->num==s&&p!=NULL)//查找插入位置
            {
                q=p;//保存指针p,使q作为下一个p的前趋
                p=p->next;//指针p后移
            }
            if(p==NULL)//如果p为空,说明没有找到指定结点
            {
                if(p==h)//同时p==h说明链表为空
                h=stu;//新记录为头指针
                else
                q->next=stu;//p为空,但p不等于h,将新结点插在表尾
            }
            else
            {
                if(p==h)
                {
                    stu->next=p;//如果p==h,则新结点插入在第一个结点之前
                    h=stu;//新结点为新的头结点
                }
                else
                {
                    stu->next=p;//p不是头结点,则在中间摸个位置,新节点的后继结点为p
                    q->next=stu;//新结点的前趋结点为q
                }
            }
            printf("\n ----Have insert %s student----\n",stu->name);
            printf("---Don't forget save!!!---");
            return (h);
            system("pause");
}
//排序 
Student *Sort(Student *h)
{
	system("cls"); 
	system("color f1");
    int i=0;//保存名次
    Student *p,*q,*t,*h1;// 定义临时指针
    h1=h->next;//将原表头指针所指的下一个结点作为头指针
    h->next=NULL;//第一个结点为新表的头结点
    while (h1!=NULL)
    {
        t=h1;//去原表的头结点
        h1=h1->next;//原表头结点指针后移 
        p=h;//设定移动指针怕p,从头指针开始 
        q=h;//再设定移动指针q作为p的前驱,初值为头指针 
        while ((t->sum<p->sum)&&(p!=NULL))//进行总分比较 
        {
            q=p;//待排序点值小,则新表指针后移 
            p=p->next;
        }
        if(p==q)///待排序点小,排在首位  
        {
            t->next=p;//待排序点的后记为p 
            h=t;//新头结点为待排序点 
        }
        else
        //待排序点插在中间某个位置q和p之间
	    //p为空则是尾部 
        {
            t->next=p;//t的后继是p 
            q->next=t;// 
        }
    }
    p=h;
    while (p!=NULL)
    {
        i++;//结点序号 
        p->order=i;//将名次赋值 
        p=p->next;
    }
    printf("Sort success!!!\n");
    Print(h);
    return h;
    system("pause");
}
//计算总分和平均分
void Computer(Student *h)
{
	float ave;
	system("color f1");
    Student *p;
    int i=0;//保存记录条数,初值为0 
    long s=0;//总分初值为0 
    float average=0;//平均分初值为零 
    p=h;//从头指针开始 
    while (p!=NULL)
    {
        s+=p->sum;
        i++;
        p=p->next;
    }
    ave=s/i;
    average=ave;
    printf("\n--All student sum score is :%ld average is %5.2f\n",s,average);
    system("pause");
}
//索引
Student *Index(Student *h)
{
	system("color f1");
    Student *p,*q,*t,*h1;
    h1=h->next;//将原表头指针所指的下一个结点作为头指针 
    h->next=NULL;//第一个结点为新表的头结点 
    while (h1!=NULL)
    {
        t=h1;//去原表的头结点
        h1=h1->next;
        p=h;
        q=h;
        while (strcmp(t->num,p->num)>0&&p!=NULL)//学号比较 
        {
            q=p;
			//待排序的值小,往后插 
            p=p->next;
            //新表指针后移 
        }
        if(p==q)//待排序点小,排在首位 
        {
            t->next=p;// 待排序后继为p 
            h=t;//新头结点为待排序点 
        }
        else
        //待排序点插在中间某个位置q和p之间
	    //p为空则是尾部 
        {
            t->next=p;
            q->next=t;
        }
    }
    printf("Index success!!!\n");
    Print(h);
    return h;
    system("pause");
}
//分类合计
void Total(Student *h)
{
	system("color f1");
    Student *p,*q;//临时变量 
    char snum[11],qnum[11],*ptr;//保存班级号 
    float s1,ave;
    int i;//班级人数 
    system("cls");
    printf("\n\n***************Tatal************\n");
    printf("---class---------sum------------average----\n");
    p=h;
    while (p!=NULL)
    {
        memcpy(snum,p->num,10);//从学号中拷贝10个字节到班级号中
        snum[10]='\0';//字符串结束标志 
        q=p->next;//指针指向待比较的记录 
        s1=p->sum;//当前班级的总分初值为该班级第一条记录的总分 
        ave=p->average;//当前班级的平均分初值为该班级第一条记录的平均分  
        i=1;
        while (q!=NULL)//内循环 
        {
            memcpy(qnum,q->num,10);//从学号中拷贝10个字节到班级号中 
            qnum[10]='\0';//字符串结束符号 
            if(snum[9]==qnum[9])//比较班级号 
            {
                s1+=q->sum;//累加总分 
                ave+=q->average;
                i++;//累加班级人数 
                q=q->next;//下一条记录  
            }
            else
            break;//不是一个班级的结束本次内循环 
        }
        printf("%s    %12.2f         %5.2f\n",snum,s1,ave/i);
        if(q==NULL){
        	break;//如果 当前指针为空,外循环结束,程序结束 
		}
        else{
        	p=q;//当前记录作为新班级的第一条记录开始新的比较 
		}
    }
    printf("----------------------------------------------");
    system("pause");
}
//保存数据到文件
void Save(Student *h)
{
	system("color f1");
    FILE *fp;
    Student *p;
    fp=fopen("c:\\f1\\student1.txt","wb");
    if(fp==NULL)//为输出打开一个二进制文件,如果没有则建立 
    {
        printf ("Can't open file\n");
        system("pause"); 
        return ;
    }
    printf("\nSaving file......\n");
    p=h;//移动指针从头指针开始 
    while (p!=NULL)
    {
        fwrite(p,sizeof(Student),1,fp);//写入一条数据 
        p=p->next;//指针后移 
    }
    fclose(fp);//关闭文件 
    printf("------Save Success!!!------\n");
    system("pause");
}
//从文件中读数据
Student *Load()
{
	system("color f1");
    Student *p,*q,*h=NULL;
    FILE *fp;//定义指向文件的指针 
    fp=fopen("c:\\f1\\student1.txt","rb");
    if(fp==NULL)//打开一个二进制文件,为读方式 
    {
        printf("Can't open file\n");
        system("pause");
    }
    else
	{
    printf("\n ------Loading file!!!-------\n");
    p=(Student*)malloc(sizeof(Student));//申请空间 
    if(!p)
    {
        printf("Out of memory!\n");
        return h;//返回空头指针 
    }
    h=p;//如果申请到空间,将其作为头指针 
     while(!feof(fp))//循环读数据,直到文件尾结束 
    {
        if(fread(p,sizeof(Student),1,fp)!=1)
        printf("File write error\n");
        break;//如果没有读到数据 ,则跳出循环 
        p->next=(Student*)malloc(sizeof(Student));//为下一个结点申请空间 
        if(!p->next)
        {
            printf("Out of memory!\n");
            return h;
        }
        q=p;//保存当前指针,作为下一结点前驱 
        p=p->next;//指针后移,新读入的数据连到当前表尾 
    }
    q->next=NULL;//最后一个结点的后继指针为空 
    fclose(fp);
    printf("---You have read data from file successfully!!!---\n");
    system("pause");
    }
    return h;
    system("pause"); 
}
//文件拷贝
void Copy()
{
	system("color f1");
    char outfile[10],infile[10];
    FILE *sfp,*tfp;//源文件指针和目标文件指针
    Student *p=NULL;
    system("cls");
    sfp=fopen("c:\\f1\\student1.txt","rb");//二进制读方式打开源文件 
    if(sfp==NULL)
    {
        printf("Can't open file\n");
        return ;
    }
    tfp=fopen("c:\\f1\\student2.txt","wb");
    if(tfp==NULL)
    {
        printf("Can't open file\n");
        return ;
    }
    while (!feof(sfp))//读文件到文件尾 
    {
        if(1!=fread(p,sizeof(Student),1,sfp))
        break;//块读 
        fwrite(p,sizeof(Student),1,tfp);//快写 
    }
    fclose(sfp);
    fclose(tfp);
    printf("You have copy file successfully!!!\n");
    system("pause");
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
摘 要 高校学生成绩管理工作是高等教育中的一个极为重要的环节,是院校学生管理的基础。面对种类繁多的数据和报表,手工处理方式已经很难跟上现代化管理的步伐,传统的文件管理方式进行成绩管理,效率很低,耗时费力,容易出错,安全性也存在问题。特别是在查询上,由于文件过多,带来很多不便。随着计算机及通讯技术的飞速发展,高等教育对教务管理工作提出了更高的要求。尽快改变传统的管理模式,运用现代化手段进行科学管理。 本设计研究的是基于J2EE的高校成绩管理系统的设计与实现。本系统是基于J2EE开发的成绩管理系统,弥补了人工管理的不足,提高了一定的效率。主要功能包括教师对学生成绩的记录,生成总评成绩,成绩单的提交。学生查询相关的成绩信息。管理员对学生、教师,课程、班级进行综合管理。该系统为教务处人员提供了强大的成绩管理功能,为教师提供了对平时成绩和期末成绩方便的管理,为学生提供了一个方便快捷的查询功能。本设计的开发工具使用MyEclipse,数据库使用的MySQL,框架是struts整合hibernate。 关键词:J2EE; 成绩管理; MySQL; MyEclipse Abstract College student grade management is a very important aspect of higher education,is the foundation of college students management. Faced with a wide variety of data and statements, the manual processing methods have been difficult to keep up with the pace of modern management, the traditional document management about grade management, is inefficient, time-consuming effort, error-prone, and also existing security issues. Because too many documents, it brings a lot of inconvenience in the query. With the computer and the rapid development of communication technology, higher education must meet a higher demand. We should change the traditional mode of management and use modern means of scientific management as soon as possible. The design based on J2EE technology mainly research about Implementation of grade management system of universities. The system is based on J2EE platform, cover the deficiencies of manual management, and improve the efficiency of management. Main features including: teachers record the grade of students in the term examines, generate the report card to examine. Students can query their information at any time with this system. Administrator can manage the students, teachers, curriculum, classes together. The system for the Registry staff with a powerful performance management capabilities, provide teachers with the usual results and final results for the management, provide students with a convenient and efficient enquiry function. The development tools is MyEclipse, database is MySQL, integrated framework is struts and hibernate. Key words: J2EE; Grade Management; MySql; MyEclipse 目 录 Abstract II 1 绪论 1 1.1高校学生成绩管理系统实施的背景分析 1 1.2选题的目的及意义 1 2 J2EE平台及其支撑技术 3 2.1 J2EE平台 3 2.1.1 J2EE简介 3 2.1.2 JSP技术 5 2.1.3 Servlet技术 7 2.1.4 EJB技术 8 2.1.5 J2EE发展趋势 9 2.2 MVC模式介绍 10 2.3 Struts框架介绍 14 2.4 Hibernate框架介绍 16 3 基于J2EE技术平台的学生成绩管理分析 18 3.1系统可行性分析. 18 3.1.1技术可行性 18 3.1.2经济可行性 18 3.1.3运行可行性 18 3.2系统需求分析 18 3.3系统整体说明 19 3.4系统模块的功能概述 19 4 系统总体设计 20 4.1.系统结构图 20 4.1.1包组织结构图 20 4.3数据流程图设计 21 4.4.1 E-R图 22 4.3主要功能模块的设计 22 4.2.1用户登录模块设计 22 4.2.2管理员管理模块设计 23 4.2.3教师成绩录入和修改模块设计 23 4.2.4学生管理模块设计 23 5 基于J2EE技术平台的系统详细设计 24 5.1数据库详细设计 24 5.1.1 数据库需求分析 24 5.1.2 数据库概念结构设计 25 5.1.3 数据库逻辑结构设计 26 5.1.4 数据库结构的实现 28 5.1.5数据库模型 30 6 系统编码与测试 31 6.1系统编码说明 31 6.1.1系统配置文件 31 6.1.2系统运行效果图示. 35 6.1.3系统主要功能模块详细实现 40 6.1.3.1管理员管理模块详细介绍 40 6.1.3.2管理员管理模块代码说明 40 6.2 系统开发环境的搭建 47 6.2.1软件环境的配置 47 6.2.2硬件环境的配置 47 6.3系统性能测试 47 6.3.1安全性测试 47 6.3.2稳定性测试 47 7 总结与展望 48 7.1总结 48 7.2展望 48 参考文献: 49 致谢 49
一、课程设计题目 ① 基本要求题目:矩阵乘法。 ② 综合训练:学生成绩管理系统 二、设计要求 矩阵乘法:编写一个函数实现矩阵A(2行3列)与矩阵B 相乘(3行2列),乘积放在C数组中。在主函数中输入相乘的两数组,并输出结果。 学生成绩管理:(结构体数组、函数、指针、算法、流程结构及文件等的综合应用) 程序说明:有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统,使之能提供以下功能: (1)主菜单 (2)各菜单项功能 ① 成绩录入:输入学生的学号、姓名及三门课的成绩; ② 成绩查询:(至少一种查询方式)。  按学号查询学生记录。  查询不及格学生的记录。 ③成绩统计:  计算学生的平均分;  根据学生的平均分高低,对学生的数据进行排序后输出;  对学生单科成绩排序,输出学生姓名与该科成绩; ④退出系统:退出整个系统(即主菜单)。 (3)结构体数组: #define N 30struct student {int num; /* 定义学号*/ char name[20]; /* 定义姓名*/ float score[3]; /* 定义存贮三门课成绩的数组*/ float average; /* 定义平均成绩*/ };struct student stu[N];  /* 定义结构体数组,存贮多个学生的记录*/ 三、数据结构设计描述 系统功能描述 1能够输入学生的学号、姓名、三科成绩并且计算出平均成绩。 2能够以表格的形式输出学生记录 3能够按照学生三科的平均成绩进行排序 4能够按照学生的单科成绩进行排序 5能够按照学号查询学生记录 6往表中插入学生记录 7从表中删除学生记录 8存储记录到文件中 9从文件中读取记录 10退出 数据字典 1数据流条目 数据流名称:全部记录 别名:无 简述:最新更新后所有关于学生成绩的记录 来源:数据库 去向:加工“记录筛选” 数据流量:不限 组成:学号+姓名+SC1+SC2+SC3+平均成绩 数据存储条 数据存储名称:学生成绩记录 别名:无 简述:存放学生所有可供查询的信息 组成:学号+姓名+SC1+SC2+SC3+平均成绩 组织方式:索引文件,以学学号为关键字 查询要求:要求能立即查询 2数据项条目 数据项名称:学号 别名:无 简述:所有学校学生的学号 类型:字符串 3加工条目 加工名:更改的记录 激发条件:学生成绩记录被改动 优先级:普通 输入:新记录 输出:更新数据、数据未改动 加工逻辑:根据现有学生成绩记录 if 新记录旧记录 then 更新数据 else 数据未改动 endif 设计测试流程 1、进入界面 2、输入选项0,回车; 按提示输入数据 3、回到主菜单; 输入选项8,回车; 输入文件名:data,回车; 出现成功提示,则读入文件操作成功。 4、回到主菜单,输入1,回车 每10个暂停显示数据 5、回到主菜单,输入2,回车 出现排序成功信息。 6、回到主菜单,输入3,回车 出现排序成功信息。 7、回到主菜单,输入5,回车 按提示插入一组数据 8、回到主菜单,输入6,回车 按提示输入姓名,删除数据 出现删除成功的信息 9、回到主菜单,输入4,回车 输入学号进行查询 10、回到主菜单,输入1,回车 出现统计信息 11、回到主菜单,输入7,回车 输入result,回车 出现成功写入文件的信息 12、回到主菜单,输入9,回车退出系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰非一日之寒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值