学生成绩管理系统
编辑时间:2017-03-23 作者:金满斗 浏览量:1804 来源:原创

以前帮一个大学生做的毕业考试,当时他是数据结构的考试吧。当时写的很匆忙,其实应该很多可以优化的,先上截图再上代码吧。


因为这个学生还比较爽快,因此注释还是给他写的很详细的。


代码部分

/*学生管理系统*/ 
#include <stdio.h>
#include <malloc.h>   /*内存操作*/


/*先定义课程表*/ 
static char g_syllabus[4][100] = {"语文", "数学", "英语", "计算机"};

/*定义学生信息*/ 
typedef struct Student
{
	int id;							/* 学号 唯一  */ 
	char name[30];		            /* 姓名 */
	float score[4];		            /* 每个课程的分数 */
}Student;                          /* Student等价于struct Student*/


/*   定义线线性表单链表存储结构  */ 
typedef struct Node
{
	Student data;		             /* 数据域 ,学生信息   */
	struct Node* pNext;		        /*  下一个结点  */
}Node ,*pNode  ;                    /* Node 等价于 struct Node,*pNode 等价于 struct Node*  */

/* 定义链表 */
typedef struct List
{
	Node* head;			/*头结点*/
	int length;			/*链表长度*/
}List,*pList;



/* 初始化链表 */ 
pList init_list()
{
	pList  my_list = (pList)malloc(sizeof(List));
	if(!my_list)return 0;
	my_list->head = (Node*)malloc(sizeof(Node));
	my_list->head->pNext = my_list->head;
	my_list->length = 0;
	return  my_list;
}


/*创建一个节点*/
Node * NewNode(pList  my_list)
{
	Node * pNewNode = ( Node * )malloc( sizeof(Node) );
	if( ! pNewNode )	return 0;
	pNewNode ->pNext = my_list -> head;
	return pNewNode;
}
	

/* 根据学号查找结点 ,返回学生的结点指针 ,参数一个为链表,一个为要找的id*/
Node* search(pList  my_list , int id)
{
	Node* p = my_list->head->pNext;
	while(my_list->head != p && p->data.id != id)
	{
		p = p->pNext;
	}

	return p;
}


/* 插入学生结点到链表中 */ 
void insert(pList  my_list,Node* pNode)
{
	pNode->pNext = my_list->head->pNext;
	my_list->head->pNext = pNode;
	++ my_list->length;
}





/*增加学生*/ 
void addStudentMenu(pList  my_list ){
	int i = 0;
	Node* pFind;
	Node* pNode = NewNode(my_list);
	/// 判断学号存在标志
	int isExistFlag = 0;
	do
	{
		isExistFlag = 0;
		printf("请输入学生的信息:\n");
		printf("学号:");
		scanf("%d", &(pNode ->data.id));
		if (0 == pNode ->data.id)
		{
			return;
		}
		pFind = search(my_list,pNode->data.id);
		if (pFind != my_list->head)
		{
			isExistFlag = 1;
			printf("此学号已经存在,请重新输入。返回请输入0。\n");
		}
	}while(1 == isExistFlag);
	
	printf("姓名:");
	scanf("%s", pNode->data.name);
	for (i = 0; i < 4; ++ i)
	{
		printf("%s分数:", g_syllabus[i]);
		scanf("%f", &(pNode->data.score[i]));
	}
	insert(my_list,pNode);
	printf("插入学生信息成功。\n");
}

/* 查看所有学生 */
void selectAllStudentMenu(pList  my_list)
{
	Node* p;
	int i = 0;
	if (0 == my_list->length)
	{
		printf("没有学生信息,请增加学生信息以后再查看。\n");
		return;
	}
	printf("学号  姓名  ");
	for (i = 0; i < 4; ++ i)
	{
		printf("%s  ", g_syllabus[i]);
	}
	printf("\n");
	p = my_list->head->pNext;
	while(my_list->head != p)
	{
		printf("%d  %6s  ", p->data.id, p->data.name);
		for (i = 0; i < 4; ++ i)
		{
			printf("%4.2f  ", p->data.score[i]);
		}
		printf("\n");
		p = p->pNext;
	}
}




/*主菜单,参数为链表*/
void mainMenu(pList  my_list);
void exitMenu(void);  /*退出*/




int main(void)
{
	pList my_list = NULL;
	my_list = init_list();   /*初始化*/
	if(0 == my_list){
		printf("分配内存失败,程序终止!\n");
		exit(-1); 
	};
	mainMenu(my_list); 
	return 0;
}


void mainMenu(pList  my_list)
{
	int a = -1;   /*先设置个操作判断变量,因为0为退出,所以初始化赋值为-1*/
	while(0 != a)
	{
		printf("\n*************************************学生成绩统计软件************************\n");
		printf("1.增加学生 2.查看学生的总分及平均分 3.查看学生成绩分布图 4.导出学生成绩单 0.退出\n" );
	//	printf(");
		printf("请输入你需要的操作数(0-4):");
		scanf("%d", &a);
		getchar(); 
		printf("*******************************************************************************\n");
		switch (a)
		{
		case 0:
			exitMenu();   /*退出*/ 
			break;
		case 1:
			addStudentMenu(my_list);   /*增加学生*/ 
			break;
		case 2:
			selectAllStudentMenu(my_list);
			break;
		case 3:
			//deleteStudentMenu();
			break;
		default:
			printf("\n格式不对,请输入上面目录前面的数字。\n");
			a = 7;
			break;
		}
	}
}

/*退出*/ 
void exitMenu(void)
{
	printf("谢谢你的使用。\n");
}




来说两句吧