学生管理系统的设计与实现(c语言版本数据结构)

数据结构的课堂设计 专栏收录该内容
2 篇文章 16 订阅

学生管理系统的设计与实现

文章目录

1、需求分析

1.1 实验目的:

1.掌握重要的排序算法――直接插入排序和快速排序;

2.掌握折半查找算法。

3.综合运用所学数据结构知识,提高解决实际问题的能力。。

1.2 实验内容:

设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的的顺序表

可以不考虑重名的情况,系统至少包含以下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 给定一个学生信息,插入到表中指定的位置;

(4) 删除指定位置的学生记录;

(5) 统计表中学生个数;

(6) 利用直接插入排序或者折半插入排序按照姓名进行排序;

(7) 利用快速排序按照学号进行排序;

(8) 根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩;

(9) 根据学号进行折半查找,要求使用非递归算法实现,成功返回此学生的姓名和成绩。

1.3实验要求:

(1)程序要添加适当的注释,程序的书写要采用缩进格式

(2程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。

(3)程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4)根据实验报告模板详细书写实验报告

1.4概要设计:

(1)输入的形式和输入值的范围:输入对应的数字会选择不同的结果和不同的成绩;

(2)输出的形式:以对应的数字输出;

(3)程序所能达到的功能:所有的功能都实现了;

(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

2、概要设计

2.1所用数据结构的定义及其相关说明(相关结构体或类的定义及其含义)

#define ERROR 0     //用于返回错误
#define OK 1        //用于返回正确
#define SIZE 100    //定义stduent的大小
typedef int Status;  

在这里插入图片描述

1void menu()//选择菜单函数 2)Status InitList_Sq(SqList &L,int n)//新建学生数据3)Status Display_Sq(SqList L)//显示学生所有数据4)Status Insert_Sq(SqList &L,int n)//在顺序表L中第i个位置插入新的元素e5)Status Delete_Sq(SqList &L,int n)//在顺序表L中删除第i个元素6)Status GetLen_Sq(SqList &L)    //统计学生总数7void InsertSort(SqList &L)//姓名排序操作函数8void InsertSort(ElemType a[])//此处为直接插入排序。对姓名排序9int Search_Bin(SqList &L,char *s,int low,int high)//此处为折半插入排序。对姓名排序10int Partition(SqList &L,int low,int high)//利用快速排序按照学号进行排序11void QSort(SqList &L,int low,int high)12int Search_Bin(ElemType a[],char *key,int low,int high)//折半查找,递归方法13int Non_Search_Bin(ElemType a[],int key)//14int main()//主函数

2.2、各子程序调用关系

在这里插入图片描述

2.3、各程序模块之间的层次(调用)关系

在这里插入图片描述

3、详细设计,实现方法、实验结果及结论分析等:

自定义函数的名称及其功能说明

3.1 、memu (菜单选项)

void memu(void)
{
	printf("\t\t||************ 欢迎使用学生信息管理系统!****************||\n");
	printf("\t\t||**name:yuan number:xxxxxx    电信xxxx   *******     ||\n");
	printf("\t\t||   *********************************                ||\n");
    printf("\t\t||   *           功能菜单          *                   ||\n");
    printf("\t\t||   *********************************                ||\n");
	printf("\t\t||   1.输入学生信息                                     ||\n");
	printf("\t\t||   2.逐个显示学生的相关信息                            ||\n");
	printf("\t\t||   3.插入学生信息到指定位置                            ||\n");
	printf("\t\t||   4.删除指定位置的学生记录                            ||\n");
    printf("\t\t||   5.统计表中学生人数                                 ||\n");
	printf("\t\t||   6.利用直接插入排序按姓名进行排序                     ||\n");
	printf("\t\t||   7.利用折半插入排序按姓名进行排序                     ||\n");
	printf("\t\t||   8.利用快速排序按学号进行排序                         ||\n");
	printf("\t\t||   9.根据姓名进行折半查找,成功返回此学生的学号和成绩      ||\n");
	printf("\t\t||  10.根据学号进行折半查找,成功返回此学生的姓名和成绩      ||\n");
	printf("\t\t||  11.退出系统\n");
	printf("\t\t>>>请选择您需要的服务(1--11):");
}

3.2、 输入学生信息

Status InitList_Sq(SqList &L,int n)
{
	int i;
    L.elem=new Student[SIZE];
	L.length=1;		       //留下L.elem[0]作为哨兵
    //输入学生信息
	printf("\t\t请按顺序输入学生学号,姓名,成绩,不同项之间用Tab隔开:\n");
    printf("\t\t学号	姓名    成绩	\n");
    for(i=1;i<=n;i++)  	//输入学生信息
    {
		L.length++;     //表的长度加一
        printf("\t\t");
        scanf("%s %s %f", L.elem[i].no, L.elem[i].name,&L.elem[i].score);
		printf("\n");
    }
    printf("\t\t提示:成绩存入完毕!\n\n");
    printf("\t\t\t------请继续--------\n");
	return OK;
}

3.3、打印学生信息

Status Display_Sq(SqList L)
{	
	printf("\t\t位置\t学号\t姓名\t成绩\n");
	for(int j= 1; j<L.length; j++)
    {
        printf("\t\t%d\t%s\t%s\t %.2f\t\t\n\n",j, L.elem[j].no, L.elem[j].name, L.elem[j].score);
	}
	return OK;
}

3.4 插入学生信息到表

Status Insert_Sq(SqList &L,int n)
{	
	if(L.length==SIZE)			//考虑表中空间已满的情况
	{
		printf("\t\t操作失败,系统空间已满\n");
		return ERROR;
	}
	if(n<1||n>L.length)
	{			
		printf("\t\t操作失败,您要插入的位置不存在!\n");
		return ERROR;
	}
	for(int i=L.length-1;i>=n;i--)
		L.elem[i+1]=L.elem[i];		//依次将各学生的信息赋给其下一个位置
	printf("\t\t>>>输入要插入的学生信息:\n");
	printf("\t\t>>>学号:");
	scanf("%s",L.elem[n].no);
	printf("\n");
	printf("\t\t>>>姓名");
	scanf("%s",L.elem[n].name);
	printf("\n");
	printf("\t\t>>>成绩:");
	scanf("%f",&L.elem[n].score);
	printf("\n");
	L.length++;			//表长增加1
	printf("\t\t插入学生信息成功!\n");
	return OK;
}

3.5、删除学生信息

Status Delete_Sq(SqList &L,int n)
{
	if(n<1||n>L.length){
		printf("\t\t操作失败,您要删除的位置不存在!\n");
		return ERROR;
	}
	for(int i=n;i<=L.length-1;i++)
		L.elem[i]=L.elem[i+1];			//依次将各学生的信息赋给其上一个位置
	L.length--;							//表长减少1
	printf("\t\t删除学生信息成功!\n");
	return OK;
}

3.6 、统计学生总数

Status GetLen_Sq(SqList &L)
{
 
	printf("\t\t-----学生个数=-----\n");
    printf("%d",L.length-1);
	return OK;
}

3.7、按姓名直接插入排序

void InsertSort(SqList &L)
{
	int i,j;
    for(i=2;i<L.length;++i)
     if(strcmp(L.elem[i].name,L.elem[i-1].name)==-1)
       {
		 L.elem[0]=L.elem[i]; // 复制为哨兵
         L.elem[i]=L.elem[i-1];
         for(j=i-2;strcmp(L.elem[0].name,L.elem[j].name)==-1;--j)
	            L.elem[j+1]=L.elem[j]; // 记录后移 
         L.elem[j+1]=L.elem[0]; //插入到正确位置
       }
 }

3.8 、按姓名折半插入排序

Status BInsertSort (SqList &L)
{ 
	int low,high,m;		
	for(int i=2;i<L.length;++i){  
		L.elem[0]=L.elem[i];	// 复制为哨兵
		low=1;
		high=i-1;
		while(low<=high){	//利用折半方法找到插入位置	
			m=(low+high)/2; 
            if(strcmp(L.elem[0].name,L.elem[m].name)<0)
				high=m-1;
            else
				low=m+1; 
           }
		for(int j=i-1;j>=high+1;--j)	//纪录后移
			L.elem[j+1]=L.elem[j];
			L.elem[high+1]=L.elem[0];
    }
	return OK;
}

3.9、按学号快速排序

int pivotloc;
char pivotkey[10];
int Partition(SqList &L,int low,int high)
{
	L.elem[0]=L.elem[low];
	strcpy(pivotkey,L.elem[low].no);
	while(low<high)
	{
		while(low<high&&strcmp(L.elem[high].no,pivotkey)>=0)
	   //若有比哨兵小的high,则将其赋给low,否则high前移
			--high;
		L.elem[low]=L.elem[high];
		while(low<high&&strcmp(L.elem[low].no,pivotkey)<=0)	
		//若有比哨兵大的low,则将其赋给high,否则low后移
			++low;
		L.elem[high]=L.elem[low];
	}
    L.elem[low]=L.elem[0]; 
    return low;
}

3.10、 递归调用对左子表排序

 void QSort(SqList &L,int low,int high)
{
	  if(low<high)
	  {
		 pivotloc=Partition(L,low,high);		
         QSort(L,low,pivotloc-1);	//递归调用对左子表排序
         QSort(L,pivotloc+1,high);	//递归调用对右子表排序
       }
}

3.11、按姓名折半查找(递归)

int Search_Bin(SqList &L,char *s,int low,int high)
{
	int m;
	if(low<=high)
	{
		m=(low+high)/2;
		if(strcmp(s,L.elem[m].name)==0)
			return m;
		else if(strcmp(s,L.elem[m].name)<0)
			return Search_Bin(L,s,low,m-1);		//对左子表折半查找
		else
			return Search_Bin(L,s,m+1,high);	//对右子表折半查找
	}
	return -1;
}

3.12、按学号进行折半查找(非递归)

int Search_Bin1(SqList &L,char *s)
{
	int m,low=1,high=L.length-1;
	while(low<=high)
	{
		m=(low+high)/2;
		if(strcmp(s,L.elem[m].no)==0)
			return m;
		else if(strcmp(s,L.elem[m].no)<0)
			high=m-1;
		else
			low=m+1;
	}
	return -1;
}

3.13、main()

int main(void)
{
	int no;
	int n;
	char names[20],nos[10];
	SqList L;
	L.length=1;
	while(1)
	{

		memu();
		scanf("%d",&no);
		printf("\n");
		switch(no)
		{
            //输入学生信息
			case 1:  
				printf("\t\t>>>请输入学生个数:");
				scanf("%d",&n);
				InitList_Sq(L,n);
				break;
            //逐个显示学生的相关信息
			case 2:
				if(L.length==1)
				{								//判断表是否为空
					printf("\t\t学生表为空,无可显示的学生信息!\n");
					break;
				}
				printf("\t\t>>>输出学生信息:\n");
				Display_Sq(L);									//调用函数
				break;
			//插入学生信息到指定位置
			case 3:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无可供插入的位置!\n");
					break;
				}
				printf("\t\t>>>请输入插入位置:");
				scanf("%d",&n);
				Insert_Sq(L,n);
				Display_Sq(L);
				break;
		    //删除指定位置的学生记录
			case 4:
				if(L.length==1){
					printf("\t\t学生表为空,无可供删除的学生信息!\n");
					break;
				}
				printf("\t\t>>>请输入删除位置:\n");
				scanf("%d",&n);
				Delete_Sq(L,n);
				Display_Sq(L);
				break;
			//统计表中学生人数
			case 5:
				if(L.length==1)
				{
					printf("\t\t现表中的学生总数为 0 人\n");
					break;
				}
				printf("\t\t现表中的学生总数为:");
				GetLen_Sq(L);
				break;
            //利用直接插入排序按姓名进行排序
			case 6:
				if(L.length==1)
				{
				    printf("\t\t学生表为空,无排序结果!\n");
					break;
				}
				InsertSort(L);
				printf("\t\t按姓名进行直接插入法排序的结果为:\n");
				Display_Sq(L);
				break;
            //利用折半插入排序按姓名进行排序
            case 7:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无排序结果!\n");
					break;
				}
				BInsertSort(L);
				printf("\t\t按姓名折半插入排序的结果为:\n");
				Display_Sq(L);
				break;
			//利用快速排序按学号进行排序
			case 8:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无排序结果!\n");
					break;
				}
				QSort(L,1,L.length-1);
				printf("\t\t按学号进行快速排序的结果为:\n");
				Display_Sq(L);
				break;
			//根据姓名进行折半查找,成功返回此学生的学号和成绩
			case 9:
				if(L.length==1)
				{

					printf("\t\t学生表为空,无可供查找的学生信息!\n");
					break;
				}
				InsertSort(L);	//先进行姓名的直接插入排序
				printf("\t\t>>>请输入查找学生的姓名:");
				scanf("%s",names);
				int n1,low,high;
				low=1;
				high=L.length-1;
				n1=Search_Bin(L,names,low,high);	//调用折半查找
				if(n1==-1){
					printf("\t\t未找到该姓名的学生!\n");
					break;
				}
				printf("\t\t学号:%s\n",L.elem[n1].no);
				printf("\t\t成绩:%f\n",L.elem[n1].score);
				break;
			//根据学号进行折半查找,成功返回此学生的姓名和成绩
			case 10:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无可供查找的学生信息!\n");
					break;
				}
				QSort(L,1,L.length-1);		//先进行学号的快速排序 
				printf("t\t>>>请输入查找学生的学号:\n");
				scanf("%s",nos);
				int n2;
				n2=Search_Bin1(L,nos);		//调用折半查找
				if(n2==-1)
				{
					printf("\t\t未找到该学号的学生!\n");
					break;
				}
				printf("\t\t姓名:%s\n",L.elem[n2].name);
				printf("\t\t成绩:%f\n",L.elem[n2].score);
				break;
		    //退出系统
			case 11:
				return 0}
	
		printf("\n");
	}	
}

3.14、主要功能算法的时间复杂度

Cout函数的时间复杂度为:O(n2)

CreatHuffmanTree函数的时间复杂度为:O(n)

CreatHuffmanCode函数的时间复杂度为:O(n)

Code函数的时间复杂度为:O(n)

4、测试分析

4.1、解决问题方法以及对设计与实现的回顾讨论和分析:

在进入某个功能模块时,或者某个功能的某个步骤时,可以允许出现输入错误。因此,要实现进入某个步骤时实现撤销操作。

4.2、经验和体会

由于第一次写这么复杂的程序,开始有点无从下手,在选择合适的数据结构的时候不知道怎么去选,只能一个一个的去试,最后从结合了C语言的结构体和程序需要用到的算法中慢慢摸索到了合适的数据结构,写程序时会出现好多小的语法问题或者逻辑问题,一点点逻辑问题就会让人抓狂。但最后还是静下心来梳理情绪,慢慢的找到了问题。开始的时候没有好好理解折半插入排序。便把第0个位置也存了信息。导致哨兵没地方放。然后又全部修改了。也许哨兵不一定要放在第0个位置。但开始遇到的这个问题时,脑子里就只有一个想法,就是全部把信息修改一遍,虽然这看起来不是一个好办法,但易于修改。

4.3、算法的时空分析

T(n)=O(n2)

4.4、测试和功能展示

4.4.1、学生管理系统的建立

4.4.2、显示学生信息

4.4.3、插入学生信息

在这里插入图片描述

4.4.4、删除学生信息

在这里插入图片描述

4.4.5、统计表中学生人数

在这里插入图片描述

4.4.6、利用直接插入排序按姓名进行排序

4.4.7、利用折半插入排序按姓名进行排序

4.4.8、利用快速排序按学号进行排序

4.4.9、根据姓名进行折半查找,成功返回此学生的学号和成绩

4.4.10、根据学号进行折半查找,成功返回此学生的姓名和成绩

5、源程序清单(源程序清单是带详细注释的源程序)

#include <stdio.h>  //头文件
#include <string.h>
#define ERROR 0     //用于返回错误
#define OK 1        //用于返回正确
#define SIZE 100    //定义stduent的大小
typedef int Status;   
//student 的结构体
typedef struct
{
    char no[8];   //学号
    char name[20]; //姓名
    float score;     //成绩
}Student;
//SqList表的结构体
typedef struct
{
    Student *elem;	//定义指向Student的指针
    int length;//当前长度
    int listsize;
}SqList;

//输入学生信息
Status InitList_Sq(SqList &L,int n)
{
	int i;
    L.elem=new Student[SIZE];
	L.length=1;		       //留下L.elem[0]作为哨兵
    //输入学生信息
	printf("\t\t请按顺序输入学生学号,姓名,成绩,不同项之间用Tab隔开:\n");
    printf("\t\t学号	姓名    成绩	\n");
    for(i=1;i<=n;i++)  	//输入学生信息
    {
		L.length++;     //表的长度加一
        printf("\t\t");
        scanf("%s %s %f", L.elem[i].no, L.elem[i].name,&L.elem[i].score);
		printf("\n");
    }
    printf("\t\t提示:成绩存入完毕!\n\n");
    printf("\t\t\t------请继续--------\n");
	return OK;
}
//打印学生信息
Status Display_Sq(SqList L)
{	
	printf("\t\t位置\t学号\t姓名\t成绩\n");
	for(int j= 1; j<L.length; j++)
    {
        printf("\t\t%d\t%s\t%s\t %.2f\t\t\n\n",j, L.elem[j].no, L.elem[j].name, L.elem[j].score);
	}
	return OK;
}
//插入学生信息到表
Status Insert_Sq(SqList &L,int n)
{	
	if(L.length==SIZE)			//考虑表中空间已满的情况
	{
		printf("\t\t操作失败,系统空间已满\n");
		return ERROR;
	}
	if(n<1||n>L.length)
	{			
		printf("\t\t操作失败,您要插入的位置不存在!\n");
		return ERROR;
	}
	for(int i=L.length-1;i>=n;i--)
		L.elem[i+1]=L.elem[i];		//依次将各学生的信息赋给其下一个位置
	printf("\t\t>>>输入要插入的学生信息:\n");
	printf("\t\t>>>学号:");
	scanf("%s",L.elem[n].no);
	printf("\n");
	printf("\t\t>>>姓名");
	scanf("%s",L.elem[n].name);
	printf("\n");
	printf("\t\t>>>成绩:");
	scanf("%f",&L.elem[n].score);
	printf("\n");
	L.length++;			//表长增加1
	printf("\t\t插入学生信息成功!\n");
	return OK;
}
//删除学生信息
Status Delete_Sq(SqList &L,int n)
{
	if(n<1||n>L.length){
		printf("\t\t操作失败,您要删除的位置不存在!\n");
		return ERROR;
	}
	for(int i=n;i<=L.length-1;i++)
		L.elem[i]=L.elem[i+1];			//依次将各学生的信息赋给其上一个位置
	L.length--;							//表长减少1
	printf("\t\t删除学生信息成功!\n");
	return OK;
}
//统计学生总数
Status GetLen_Sq(SqList &L)
{
 
	printf("\t\t-----学生个数=-----\n");
    printf("%d",L.length-1);
	return OK;
}
//按姓名直接插入排序
void InsertSort(SqList &L)
{
	int i,j;
    for(i=2;i<L.length;++i)
     if(strcmp(L.elem[i].name,L.elem[i-1].name)==-1)
       {
		 L.elem[0]=L.elem[i]; // 复制为哨兵
         L.elem[i]=L.elem[i-1];
         for(j=i-2;strcmp(L.elem[0].name,L.elem[j].name)==-1;--j)
	            L.elem[j+1]=L.elem[j]; // 记录后移 
         L.elem[j+1]=L.elem[0]; //插入到正确位置
       }
 }

//按姓名折半插入排序
//按姓名折半插入排序
//设这两个字符串为str1,str2,

//若str1==str2,则返回零;

//若str1<str2,则返回负数;

//若str1>str2,则返回正数。

//matlab中函数,strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false

//当s1<s2时,返回为负数;

//当s1==s2时,返回值= 0;

//当s1>s2时,返回正数。

//即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:

Status BInsertSort (SqList &L)
{ 
	int low,high,m;		
	for(int i=2;i<L.length;++i){  
		L.elem[0]=L.elem[i];	// 复制为哨兵
		low=1;
		high=i-1;
		while(low<=high){	//利用折半方法找到插入位置	
			m=(low+high)/2; 
            if(strcmp(L.elem[0].name,L.elem[m].name)<0)
				high=m-1;
            else
				low=m+1; 
           }
		for(int j=i-1;j>=high+1;--j)	//纪录后移
			L.elem[j+1]=L.elem[j];
			L.elem[high+1]=L.elem[0];
    }
	return OK;
}
//按学号快速排序
int pivotloc;
char pivotkey[10];
int Partition(SqList &L,int low,int high)
{
	L.elem[0]=L.elem[low];
	strcpy(pivotkey,L.elem[low].no);
	while(low<high)
	{
		while(low<high&&strcmp(L.elem[high].no,pivotkey)>=0)
	   //若有比哨兵小的high,则将其赋给low,否则high前移
			--high;
		L.elem[low]=L.elem[high];
		while(low<high&&strcmp(L.elem[low].no,pivotkey)<=0)	
		//若有比哨兵大的low,则将其赋给high,否则low后移
			++low;
		L.elem[high]=L.elem[low];
	}
    L.elem[low]=L.elem[0]; 
    return low;
}
void QSort(SqList &L,int low,int high)
{
	if(low<high)
	{
		pivotloc=Partition(L,low,high);		
        QSort(L,low,pivotloc-1);	//递归调用对左子表排序
        QSort(L,pivotloc+1,high);	//递归调用对右子表排序
    }
}
//按姓名折半查找(递归)
int Search_Bin(SqList &L,char *s,int low,int high)
{
	int m;
	if(low<=high)
	{
		m=(low+high)/2;
		if(strcmp(s,L.elem[m].name)==0)
			return m;
		else if(strcmp(s,L.elem[m].name)<0)
			return Search_Bin(L,s,low,m-1);		//对左子表折半查找
		else
			return Search_Bin(L,s,m+1,high);	//对右子表折半查找
	}
	return -1;
}
//按学号进行折半查找(非递归)
int Search_Bin1(SqList &L,char *s)
{
	int m,low=1,high=L.length-1;
	while(low<=high)
	{
		m=(low+high)/2;
		if(strcmp(s,L.elem[m].no)==0)
			return m;
		else if(strcmp(s,L.elem[m].no)<0)
			high=m-1;
		else
			low=m+1;
	}
	return -1;
}
//菜单选项
void memu(void)
{
	printf("\t\t||************ 欢迎使用学生信息管理系统!****************||\n");
	printf("\t\t||**name:伍思源 number:182034490136    电信18-1   *******||\n");
	printf("\t\t||   *********************************                   ||\n");
    printf("\t\t||   *           功能菜单          *                     ||\n");
    printf("\t\t||   *********************************                   ||\n");
	printf("\t\t||   1.输入学生信息                                      ||\n");
	printf("\t\t||   2.逐个显示学生的相关信息                            ||\n");
	printf("\t\t||   3.插入学生信息到指定位置                            ||\n");
	printf("\t\t||   4.删除指定位置的学生记录                            ||\n");
    printf("\t\t||   5.统计表中学生人数                                  ||\n");
	printf("\t\t||   6.利用直接插入排序按姓名进行排序                    ||\n");
	printf("\t\t||   7.利用折半插入排序按姓名进行排序                    ||\n");
	printf("\t\t||   8.利用快速排序按学号进行排序                        ||\n");
	printf("\t\t||   9.根据姓名进行折半查找,成功返回此学生的学号和成绩  ||\n");
	printf("\t\t||  10.根据学号进行折半查找,成功返回此学生的姓名和成绩  ||\n");
	printf("\t\t||  11.退出系统\n");
	printf("\t\t>>>请选择您需要的服务(1--11):");
}
int main(void)
{
	int no;
	int n;
	char names[20],nos[10];
	SqList L;
	L.length=1;
	while(1)
	{
		memu();
		scanf("%d",&no);
		printf("\n");
		switch(no)
		{

            //输入学生信息
			case 1:  
				printf("\t\t>>>请输入学生个数:");
				scanf("%d",&n);
				InitList_Sq(L,n);
				break;
            //逐个显示学生的相关信息
			case 2:
				if(L.length==1)
				{								//判断表是否为空
					printf("\t\t学生表为空,无可显示的学生信息!\n");
					break;
				}
				printf("\t\t>>>输出学生信息:\n");
				Display_Sq(L);									//调用函数
				break;
			//插入学生信息到指定位置
			case 3:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无可供插入的位置!\n");
					break;
				}
				printf("\t\t>>>请输入插入位置:");
				scanf("%d",&n);
				Insert_Sq(L,n);
				Display_Sq(L);
				break;
		    //删除指定位置的学生记录
			case 4:
				if(L.length==1){
					printf("\t\t学生表为空,无可供删除的学生信息!\n");
					break;
				}
				printf("\t\t>>>请输入删除位置:\n");
				scanf("%d",&n);
				Delete_Sq(L,n);
				Display_Sq(L);
				break;
			//统计表中学生人数
			case 5:
				if(L.length==1)
				{
					printf("\t\t现表中的学生总数为 0 人\n");
					break;
				}
				printf("\t\t现表中的学生总数为:");
				GetLen_Sq(L);
				break;
            //利用直接插入排序按姓名进行排序
			case 6:
				if(L.length==1)
				{
				    printf("\t\t学生表为空,无排序结果!\n");
					break;
				}
				InsertSort(L);
				printf("\t\t按姓名进行直接插入法排序的结果为:\n");
				Display_Sq(L);
				break;
            //利用折半插入排序按姓名进行排序
            case 7:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无排序结果!\n");
					break;
				}
				BInsertSort(L);
				printf("\t\t按姓名折半插入排序的结果为:\n");
				Display_Sq(L);
				break;
			//利用快速排序按学号进行排序
			case 8:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无排序结果!\n");
					break;
				}
				QSort(L,1,L.length-1);
				printf("\t\t按学号进行快速排序的结果为:\n");
				Display_Sq(L);
				break;
			//根据姓名进行折半查找,成功返回此学生的学号和成绩
			case 9:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无可供查找的学生信息!\n");
					break;
				}
				InsertSort(L);	//先进行姓名的直接插入排序
				printf("\t\t>>>请输入查找学生的姓名:");
				scanf("%s",names);
				int n1,low,high;
				low=1;
				high=L.length-1;
				n1=Search_Bin(L,names,low,high);	//调用折半查找
				if(n1==-1){
					printf("\t\t未找到该姓名的学生!\n");
					break;
				}
				printf("\t\t学号:%s\n",L.elem[n1].no);
				printf("\t\t成绩:%f\n",L.elem[n1].score);
				break;
			//根据学号进行折半查找,成功返回此学生的姓名和成绩
			case 10:
				if(L.length==1)
				{
					printf("\t\t学生表为空,无可供查找的学生信息!\n");
					break;
				}
				QSort(L,1,L.length-1);		//先进行学号的快速排序 
				printf("t\t>>>请输入查找学生的学号:\n");
				scanf("%s",nos);
				int n2;
				n2=Search_Bin1(L,nos);		//调用折半查找
				if(n2==-1)
				{
					printf("\t\t未找到该学号的学生!\n");
					break;
				}
				printf("\t\t姓名:%s\n",L.elem[n2].name);
				printf("\t\t成绩:%f\n",L.elem[n2].score);
				break;
		    //退出系统
			case 11:
				return 0;
		}
		printf("\n");
	}	
}

6、用户使用手册

用户执行代码后,主菜单会显示10个功能,分别为:

  1. 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 给定一个学生信息,插入到表中指定的位置;

(4) 删除指定位置的学生记录;

(5) 统计表中学生个数;

(6) 利用直接插入排序或者折半插入排序按照姓名进行排序;

(7) 利用快速排序按照学号进行排序;

(8) 根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩;

(9) 根据学号进行折半查找,要求使用非递归算法实现,成功返回此学生的姓名和成绩。

首先,用户根据提示选择功能(1): 输入学生信息。再根据提示分别输入学生的学号、姓名、成绩。

接着,用户可以根据自己的需求选择功能。若选择功能(2): 显示学生相关信息,则会显示学生相关信息。

若选择功能(3):插入学生到指定的位置,则根据提示输入插入学生的学号、姓名和成绩。

若选择功能(4): 删除指定位置的学生记录,则根据提示删除用户需要删除的记录。

若选择功能(5): 统计表中学生个数,则会显示出学生的个数。

若选择功能(6):按姓名进行折半插入排序,则根据提示输入学生姓名,则可以显示折半插入后的顺序。

若选择功能(7):按照学号进行快速排序,则输入学生的学号,则可显示快速排序后的顺序。

若选择功能(8):根据姓名进行折半查找,要求使用递归算法实现,则根据提示输入学生的姓名,就可以显示出结果。

若选择功能(9):根据学号进行折半查找,用非递归算法实现,则根据提示输入学生的学号,就可以显示出结果。

  • 29
    点赞
  • 5
    评论
  • 81
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

本次实验设计了一个学生管理系统学生管理系统对数据存储可以是顺序结构也可以是链式结构。由于顺序结构存储时用是一段连续存储空间不适合存储大量信息量因此本人使用单链表数据结构来对学生信息进行管理。本次课程设计学生信息分为了四大项分别是学生学号、姓名、年龄、成绩这四项一起作为链表节点数据部分。本次数据结构课程设计摒弃了传统面向过程程序设计思想如C程序设计引进了当今比较流行程序设计理念:面向对象如C++程序设计。这使得程序各个功能更加模块化系统化用类把成员变量和成员方法封装起来使开发变得更有效率结构更加清晰。 关键词: 学生信息管理链式存储结构面向对象程序设计 Student Information Management System LIling Oriental Institute of Science and Technology College,Class3 Abstract: The experimental design of a student management system. Student management system for data storage may be the order of the structure, it could be a chain structure. As the structure of the store when the order is for a period of storage space, not suitable for storing large amount of information, so I use a single list of the data structure to the students of information management. The curriculum design, student information has been divided into four categories, namely, students, name, age, the results of these four nodes together as a list of some of the data. The data structure of the curriculum design to abandon the traditional process-oriented programming ideas (such as the C programming), today introduced a more popular programming ideas: object-oriented (such as C + + programming). This program features all the more modular, systematic, with the members of the class of members of the variables and methods of packaging, so that the development of more efficient, more clear structure. Key words: student information management, chain store structure, object-oriented programming 导入语:学生信息管理分为了九大项:链表创建、输出、插入、删除、查询、显示学生总数、按照成绩排序、显示不及格人数、退出系统。 一、需求分析 学生信息管理系统是现实生活中比较常见系统它主要负责对学生信息管理。 学生管理系统所要解决问题是: 1建立一个学生管理链表 2数据插入 3数据删除 4信息显示 5信息查找 6学生总数显示 7根据学生成绩进行排序 8统计不及格人数并显示出来
相关推荐
目 录 引 言 1 第1章 绪 论 2 1.1 选题背景意义 2 1.2 国内外研究概况 2 1.3 本文研究主要问题 3 第2章 相关技术介绍 4 2.1 ASP.NET简介 4 2.1.1 什么是ASP.NET 4 2.1.2 ASP.NET技术优势 4 2.2 其他技术介绍 5 2.2.1 .NET Framework 5 2.2.2 C#语言 6 2.2.3 ASP.NET AJAX 6 2.3 ADO.NET介绍 7 第3章 软件可行性研究及其需求分析 8 3.1 可行性研究 8 3.1.1 技术可行性 8 3.1.2 经济可行性 8 3.1.3 操作可行性 9 3.2 需求分析 9 3.2.1 系统需求分析 9 3.2.2 功能需求分析 9 3.2.3 性能需求分析 10 第4章 系统分析 11 4.1 系统结构分析 11 4.2 业务流程分析 11 4.3 数据流程分析 12 4.3.1 数据流程图 12 4.3.2 数据字典 13 第5章 系统设计 17 5.1 总体设计 17 5.1.1 系统思想处理流程 17 5.1.2 系统功能模块图 17 5.1.3 模块设计 17 5.1.4 系统模块数据流程分析 19 5.1.5 系统平台设计 22 5.2 详细设计 23 5.2.1 代码设计 23 5.2.2 数据库设计 25 5.2.3 用户界面设计 29 5.2.4 处理流程设计 38 第6章 系统实现测试 40 6.1 系统实现 40 6.1.1 创建工程 40 6.1.2 创建数据访问层 40 6.1.3 用户登录模块 42 6.1.4 学生管理模块 43 6.1.5 教师管理模块 47 6.2 系统测试 50 6.2.1 系统测试策略说明 50 6.2.2 测试报告 50 第7章 系统维护和改进 52 7.1 系统维护 52 7.2 系统改进和提高 52 结论展望 53 致 谢 54 参考文献 55 附录A 外文文献及其中文翻译 56 附录B 主要参考文献题录及摘要 69 附录C 主要源程序 71 附录D 使用说明书 90
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值