C语言学生成绩管理系统

学习完C语言基础知识点,现在来用单链表、函数、指针的相关知识写一个简单版学生成绩管理系统,主要实现增删改查的基本功能。

主界面:(自己设计)
void main()
{
	system("cls");
	printf("\n\n");
	printf("\t\t\t===========================================\n");
	printf("\t\t\t|                                         |\n");
	printf("\t\t\t|          欢迎来到学生成绩管理系统         |\n");
	printf("\t\t\t|                                         |\n");
	printf("\t\t\t|=========================================|\n");
	printf("\t\t\t|            请选择要操作的命令             |\n");
	printf("\t\t\t|-----------------------------------------|\n");
	printf("\t\t\t|                                         |\n");
	printf("\t\t\t|              1.录入学生信息              |\n");
	printf("\t\t\t|              2.显示学生信息              |\n");
	printf("\t\t\t|              3.增加学生信息              |\n");
	printf("\t\t\t|              4.删除学生信息              |\n");
	printf("\t\t\t|              5.修改学生信息              |\n");
	printf("\t\t\t|              6.查找学生信息              |\n");
	printf("\t\t\t|              7.按总分排序                |\n");
	printf("\t\t\t|                                         |\n");
	printf("\t\t\t===========================================\n");
    int Item;//保存操作命令
	pnode phead=NULL;//定义一个指针
	while(1)
	{
		printf("请选择操作命令:");
		scanf("%d",&Item);
		system("cls");//清屏
		switch(Item)
		{
			case 1://录入学生信息
			{
				phead=Input();
			}
			break;
			case 2://显示学生信息
			{
    			Show(phead);
			}
			break;
			case 3://增加学生信息
			{
    			Add(phead);
			}
			break;
			case 4://删除学生信息
			{
    			Delete(phead);
			}
			break;
			case 5://修改学生信息
			{
    			Change(phead);
			}
			break;
			case 6://查找学生信息
			{
    			Search(phead);
			}
			break;
			case 7://总分排序
			{
    			Sort(phead);
    			Show(phead);
			}
			break;
			default:
			break;
		}
	}
	system("pause");
}

在这里插入图片描述

1.定义一个学生结构和一个结点结构,用于存储信息。

学生结构:
//学生结构 
struct Student
{
	char Name[10];
	int Num;
	float Computer;
	float Math;
	float English;
	float Total;
	float Ave;
};

结点结构:
//结点 
typedef struct Node
{
	struct Student st;//数据域
	struct node *pnext;//指针域
}node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext 

2.定义一些函数来处理学生信息。

函数模块:
//函数
pnode Input();//录入学生信息
void Show(pnode phead);//显示学生信息
void Add(pnode phead);//增加学生信息
void Delete(pnode phead);//删除学生信息
void Change(pnode phead);//修改学生信息
void Search(pnode phead);//查找学生信息
void Sort(pnode phead);//总分排序 
1)录入学生信息pnode Input()
//录入学生信息
pnode Input()
{
	int num;//学生的人数
	node stu;//学生结构
	pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存
	//判断内存是否为空
	if(NULL==phead)
	{
		printf("内存分配失败,程序终止!\n");
		exit(-1);
	}
	pnode ptail=phead;//定义一个指向头结点的指针
	ptail->pnext=NULL;//清空指针域
	printf("请输入学生的人数:");
	scanf("%d",&num);
	int i;
	for(i=0;i<num;i++)
	{
		printf("请输入第%d个学生的姓名:",i+1);
		scanf("%s",stu.st.Name);
		printf("请输入第%d个学生的学号:",i+1);
		scanf("%d",&stu.st.Num);
		printf("请输入第%d个学生的计算机成绩:",i+1);
		scanf("%f",&stu.st.Computer);
		printf("请输入第%d个学生的高数成绩:",i+1);
		scanf("%f",&stu.st.Math);
		printf("请输入第%d个学生的大英成绩:",i+1);
		scanf("%f",&stu.st.English);
		 //计算总分
		stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;
		//计算平均分
		stu.st.Ave=stu.st.Total/3.0f;
		//为新节点分配内存
		pnode pnew=(pnode)malloc(sizeof(node));
		//判断内存是否为空
		if(NULL==pnew)
		{
			printf("内存分配失败,程序终止!\n");
			exit(-1);
		}
		pnew->st=stu.st;//初始化结点的数据域
		ptail->pnext=pnew;//将新结点挂到老结点后
		pnew->pnext=NULL;//清空新结点的指针域
		ptail=pnew;//将ptail移到新结点上
	}
	return phead;
}

在这里插入图片描述

2)显示学生信息void Show(pnode phead)
//显示学生信息
void Show(pnode phead)
{
	//定义一个指针用于遍历学生信息
	pnode p=phead->pnext;
	printf("姓名  学号 计算机 高数  大英 总分 平均分\n");
	while(NULL!=p)
	{
		printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
		p=p->pnext;
	}
}

在这里插入图片描述

3)增加学生信息void Add(pnode phead)
//增加学生信息
void Add(pnode phead)
{
	pnode p=phead;
	int i=0;
	struct Student stu;//学生结构体 
	int loc;//插入结点的位置
	printf("请输入插入学生的位置:");
	scanf("%d",&loc);
	while(NULL!=p&&i<loc-1)
	{
		p=p->pnext;
		i++;
	}
	if(NULL==p||i>loc)
	{
		printf("插入结点的位置不存在!\n");
		return;
	}
	printf("你将在第%d个学生后面插入一个学生\n",loc-1);
	printf("请输入第%d个学生的姓名:",loc);
	scanf("%s",stu.Name);
	printf("请输入第%d个学生的学号:",loc);
	scanf("%d",&stu.Num);
	printf("请输入第%d个学生的计算机成绩:",loc);
	scanf("%f",&stu.Computer);
	printf("请输入第%d个学生的高数成绩:",loc);
	scanf("%f",&stu.Math);
	printf("请输入第%d个学生的大英成绩:",loc);
	scanf("%f",&stu.English);
	stu.Total=stu.Computer+stu.Math+stu.English;//计算总分
	stu.Ave=stu.Total/3.0f;//计算平均分
	pnode pnew=(pnode)malloc(sizeof(node));
	if(NULL==pnew)
	{
		printf("动态内存分配失败,程序终止!\n");
		exit(-1);
	}
	pnew->st=stu;
	pnode q=p->pnext;
	p->pnext=pnew;
	pnew->pnext=q;
}

在这里插入图片描述
请添加图片描述

4)删除学生信息void Delete(pnode phead)
//删除学生信息
void Delete(pnode pHead)
{
	pnode p = pHead;
	int i = 0;
	int loc;
	printf("请输入你需要删除的学生的编号:");
	scanf("%d",&loc);
	while(NULL!=p->pnext&&i<loc-1)
	{
		p=p->pnext;
		i++;
	}
	if(NULL==p->pnext||i>loc-1)
	{
		printf("没找到需要删除的学生的编号!\n");
		return;
	}
	pnode q=p->pnext;
	p->pnext=q->pnext;
	free(q);
	q==NULL;
	printf("你已经成功删除了第%d个学生的信息!\n",loc);
}

请添加图片描述

请添加图片描述

5)修改学生信息void Change(pnode phead)
//修改学生信息
void Change(pnode phead)
{
	char Name[10];
	printf("请输入你需要修改的学生的姓名:");
	scanf("%s",&Name);
	pnode p=phead->pnext;//定义一个指针用于遍历学生信息
	while(NULL!=p)
	{
		if(0==strcmp(Name,p->st.Name))
		{
			printf("姓名  学号 计算机 高数  大英 总分 平均分\n");
			printf("修改前的学生信息!\n");
			printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
			system("pause");
			system("cls");//清屏
			printf("请输入新的学生姓名:");
			scanf("%s",p->st.Name);
			printf("请输入新的学生学号:");
			scanf("%d",&p->st.Num);
			printf("请输入新的学生的计算机成绩:");
			scanf("%f",&p->st.Computer);
			printf("请输入新的学生的高数成绩:");
			scanf("%f",&p->st.Math);
			printf("请输入新的学生的大英成绩:");
			scanf("%f",&p->st.English);
			p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分
			p->st.Ave=p->st.Total/3.0f;//计算平均分
 			break;
		}
		p=p->pnext;
	}
}

请添加图片描述
请添加图片描述
请添加图片描述

6)查找学生信息void Search(pnode phead)
//查找学生信息
void Search(pnode pHead)
{
	char Name[10];
	printf("请输入你需要查找的学生的姓名:");
	scanf("%s",Name);
	pnode p=pHead->pnext;
	printf("姓名  学号 计算机 高数  大英 总分 平均分\n"); 
	while(NULL!=p)
	{
		if(0==strcmp(Name,p->st.Name))
		{
			printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
		}
 		p=p->pnext;
	}
}

请添加图片描述

7)按总分排序void Sort(pnode phead)
//总分排序
void Sort(pnode phead)
{
	pnode p, q;//定义两个指针
	node temp;
	for(p=phead->pnext;NULL!=p;p=p->pnext)
	{
		for(q=p->pnext;NULL!=q;q=q->pnext)
  		{
			if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时
   			{
				temp.st=p->st;//交换学生的位置
				p->st=q->st;
				q->st=temp.st;
			}
		}
	}
}

请添加图片描述

完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//学生结构体 
struct Student
{
	char Name[10];
	int Num;
	float Computer;
	float Math;
	float English;
	float Total;
	float Ave;
};
//结点 
typedef struct Node
{
	struct Student st;//数据域
	struct node *pnext;//指针域
}node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext 

//函数
pnode Input();//录入学生信息
void Show(pnode phead);//显示学生信息
void Add(pnode phead);//增加学生信息
void Delete(pnode phead);//删除学生信息
void Change(pnode phead);//修改学生信息
void Search(pnode phead);//查找学生信息
void Sort(pnode phead);//总分排序 
 
void main()
{
	system("cls");
	printf("\n\n");
	printf("\t\t\t============================================\n");
	printf("\t\t\t|                                          |\n");
	printf("\t\t\t|          欢迎来到学生成绩管理系统        |\n");
	printf("\t\t\t|                                          |\n");
	printf("\t\t\t|==========================================|\n");
	printf("\t\t\t|            请选择要操作的命令            |\n");
	printf("\t\t\t|------------------------------------------|\n");
	printf("\t\t\t|                                          |\n");
	printf("\t\t\t|              1.录入学生信息              |\n");
	printf("\t\t\t|              2.显示学生信息              |\n");
	printf("\t\t\t|              3.增加学生信息              |\n");
	printf("\t\t\t|              4.删除学生信息              |\n");
	printf("\t\t\t|              5.修改学生信息              |\n");
	printf("\t\t\t|              6.查找学生信息              |\n");
	printf("\t\t\t|              7.按总分排序                |\n");
	printf("\t\t\t|                                          |\n");
	printf("\t\t\t============================================\n");
    int Item;//保存操作命令
	pnode phead=NULL;//定义一个指针
	while(1)
	{
		printf("请选择操作命令:");
		scanf("%d",&Item);
		system("cls");//清屏
		switch(Item)
		{
			case 1://录入学生信息
			{
				phead=Input();
			}
			break;
			case 2://显示学生信息
			{
    			Show(phead);
			}
			break;
			case 3://增加学生信息
			{
    			Add(phead);
			}
			break;
			case 4://删除学生信息
			{
    			Delete(phead);
			}
			break;
			case 5://修改学生信息
			{
    			Change(phead);
			}
			break;
			case 6://查找学生信息
			{
    			Search(phead);
			}
			break;
			case 7://总分排序
			{
    			Sort(phead);
    			Show(phead);
			}
			break;
			default:
			break;
		}
	}
	system("pause");
}
//录入学生信息
pnode Input()
{
	int num;//学生的人数
	node stu;//学生结构
	pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存
	//判断内存是否为空
	if(NULL==phead)
	{
		printf("内存分配失败,程序终止!\n");
		exit(-1);
	}
	pnode ptail=phead;//定义一个指向头结点的指针
	ptail->pnext=NULL;//清空指针域
	printf("请输入学生的人数:");
	scanf("%d",&num);
	int i;
	for(i=0;i<num;i++)
	{
		printf("请输入第%d个学生的姓名:",i+1);
		scanf("%s",stu.st.Name);
		printf("请输入第%d个学生的学号:",i+1);
		scanf("%d",&stu.st.Num);
		printf("请输入第%d个学生的计算机成绩:",i+1);
		scanf("%f",&stu.st.Computer);
		printf("请输入第%d个学生的高数成绩:",i+1);
		scanf("%f",&stu.st.Math);
		printf("请输入第%d个学生的大英成绩:",i+1);
		scanf("%f",&stu.st.English);
		stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;//计算总分
		stu.st.Ave=stu.st.Total/3.0f;//计算平均分
		pnode pnew=(pnode)malloc(sizeof(node));//为新节点分配内存
		//判断内存是否为空
		if(NULL==pnew)
		{
			printf("内存分配失败,程序终止!\n");
			exit(-1);
		}
		pnew->st=stu.st;//初始化结点的数据域
		ptail->pnext=pnew;//将新结点挂到老结点后
		pnew->pnext=NULL;//清空新结点的指针域
		ptail=pnew;//将ptail移到新结点上
	}
	return phead;
}
//显示学生信息
void Show(pnode phead)
{
	//定义一个指针用于遍历学生信息
	pnode p=phead->pnext;
	printf("姓名  学号 计算机 高数  大英 总分 平均分\n");
	while(NULL!=p)
	{
		printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
		p=p->pnext;
	}
}
//增加学生信息
void Add(pnode phead)
{
	pnode p=phead;
	int i=0;
	struct Student stu;//学生结构体 
	int loc;//插入结点的位置
	printf("请输入插入学生的位置:");
	scanf("%d",&loc);
	while(NULL!=p&&i<loc-1)
	{
		p=p->pnext;
		i++;
	}
	if(NULL==p||i>loc)
	{
		printf("插入结点的位置不存在!\n");
		return;
	}
	printf("你将在第%d个学生后面插入一个学生\n",loc-1);
	printf("请输入第%d个学生的姓名:",loc);
	scanf("%s",stu.Name);
	printf("请输入第%d个学生的学号:",loc);
	scanf("%d",&stu.Num);
	printf("请输入第%d个学生的计算机成绩:",loc);
	scanf("%f",&stu.Computer);
	printf("请输入第%d个学生的高数成绩:",loc);
	scanf("%f",&stu.Math);
	printf("请输入第%d个学生的大英成绩:",loc);
	scanf("%f",&stu.English);
	stu.Total=stu.Computer+stu.Math+stu.English;//计算总分
	stu.Ave=stu.Total/3.0f;//计算平均分
	pnode pnew=(pnode)malloc(sizeof(node));
	if(NULL==pnew)
	{
		printf("动态内存分配失败,程序终止!\n");
		exit(-1);
	}
	pnew->st=stu;
	pnode q=p->pnext;
	p->pnext=pnew;
	pnew->pnext=q;
}
//删除学生信息
void Delete(pnode pHead)
{
	pnode p = pHead;
	int i = 0;
	int loc;
	printf("请输入你需要删除的学生的编号:");
	scanf("%d",&loc);
	while(NULL!=p->pnext&&i<loc-1)
	{
		p=p->pnext;
		i++;
	}
	if(NULL==p->pnext||i>loc-1)
	{
		printf("没找到需要删除的学生的编号!\n");
		return;
	}
	pnode q=p->pnext;
	p->pnext=q->pnext;
	free(q);
	q==NULL;
	printf("你已经成功删除了第%d个学生的信息!\n",loc);
}
//修改学生信息
void Change(pnode phead)
{
	char Name[10];
	printf("请输入你需要修改的学生的姓名:");
	scanf("%s",&Name);
	pnode p=phead->pnext;//定义一个指针用于遍历学生信息
	while(NULL!=p)
	{
		if(0==strcmp(Name,p->st.Name))
		{
			printf("姓名  学号 计算机 高数  大英 总分 平均分\n");
			printf("修改前的学生信息!\n");
			printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
			system("pause");
			system("cls");//清屏
			printf("请输入新的学生姓名:");
			scanf("%s",p->st.Name);
			printf("请输入新的学生学号:");
			scanf("%d",&p->st.Num);
			printf("请输入新的学生的计算机成绩:");
			scanf("%f",&p->st.Computer);
			printf("请输入新的学生的高数成绩:");
			scanf("%f",&p->st.Math);
			printf("请输入新的学生的大英成绩:");
			scanf("%f",&p->st.English);
			p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分
			p->st.Ave=p->st.Total/3.0f;//计算平均分
 			break;
		}
		p=p->pnext;
	}
}
//查找学生信息
void Search(pnode pHead)
{
	char Name[10];
	printf("请输入你需要查找的学生的姓名:");
	scanf("%s",Name);
	pnode p=pHead->pnext;
	printf("姓名  学号 计算机 高数  大英 总分 平均分\n"); 
	while(NULL!=p)
	{
		if(0==strcmp(Name,p->st.Name))
		{
			printf("%s    %d    %g    %g    %g   %g    %g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
		}
 		p=p->pnext;
	}
}
//总分排序
void Sort(pnode phead)
{
	pnode p, q;//定义两个指针
	node temp;
	for(p=phead->pnext;NULL!=p;p=p->pnext)
	{
		for(q=p->pnext;NULL!=q;q=q->pnext)
  		{
			if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时
   			{
				temp.st=p->st;//交换学生的位置
				p->st=q->st;
				q->st=temp.st;
			}
		}
	}
}
仅用于本人学习记录,路过的小伙伴有任何问题欢迎评论!
  • 145
    点赞
  • 1320
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: 好的,学生成绩管理系统可以使用C语言来实现。以下是一个简单的实现,包括添加学生信息、查找学生信息、修改学生信息和删除学生信息等功能。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct student { char name[50]; int id; int score; }; int main() { struct student s[100]; int choice, i, n = 0, id, found = 0; do { printf("\n\n---学生成绩管理系统---\n"); printf("1. 添加学生信息\n"); printf("2. 查找学生信息\n"); printf("3. 修改学生信息\n"); printf("4. 删除学生信息\n"); printf("5. 显示所有学生信息\n"); printf("0. 退出\n"); printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: printf("请输入学生姓名:"); scanf("%s", s[n].name); printf("请输入学生学号:"); scanf("%d", &s[n].id); printf("请输入学生成绩:"); scanf("%d", &s[n].score); n++; printf("学生信息添加成功!\n"); break; case 2: printf("请输入要查找的学生学号:"); scanf("%d", &id); found = 0; for (i = 0; i < n; i++) { if (s[i].id == id) { printf("学生姓名:%s\n", s[i].name); printf("学生学号:%d\n", s[i].id); printf("学生成绩:%d\n", s[i].score); found = 1; break; } } if (!found) { printf("没有找到该学生信息!\n"); } break; case 3: printf("请输入要修改的学生学号:"); scanf("%d", &id); found = 0; for (i = 0; i < n; i++) { if (s[i].id == id) { printf("请输入学生姓名:"); scanf("%s", s[i].name); printf("请输入学生成绩:"); scanf("%d", &s[i].score); found = 1; printf("学生信息修改成功!\n"); break; } } if (!found) { printf("没有找到该学生信息!\n"); } break; case 4: printf("请输入要删除的学生学号:"); scanf("%d", &id); found = 0; for (i = 0; i < n; i++) { if (s[i].id == id) { for (int j = i; j < n - 1; j++) { s[j] = s[j + 1]; } n--; found = 1; printf("学生信息删除成功!\n"); break; } } if (!found) { printf("没有找到该学生信息!\n"); } break; case 5: printf("所有学生信息如下:\n"); for (i = 0; i < n; i++) { printf("学生姓名:%s\n", s[i].name); printf("学生学号:%d\n", s[i].id); printf("学生成绩:%d\n", s[i].score); } break; case 0: printf("感谢使用学生成绩管理系统!\n"); break; default: printf("输入错误,请重新输入!\n"); break; } } while (choice != 0); return 0; } ``` 以上代码仅为一个简单的示例,实际开发中还需要考虑一些细节问题,比如数据的存储和读取、输入的合法性判断等。同时,也可以根据实际需求来进行功能扩展和优化。 ### 回答2: 学生成绩管理系统是一个基于C语言开发的应用程序,主要用于学校或教育机构对学生成绩进行管理和分析。 该系统的主要功能包括学生信息录入、成绩录入、成绩查询、成绩分析和报告输出等。通过学生信息录入功能,管理员或教师可以将学生的基本信息录入系统,包括学号、姓名、性别、年级等。成绩录入功能则允许管理员或教师录入学生的各门课程的成绩信息,包括考试成绩、平时成绩等。 学生成绩查询功能可以根据学生的学号或姓名快速查询其对应的成绩信息。而成绩分析功能可以进行单个学生或整个班级的成绩分析,包括各科目成绩的平均分、最高分、最低分等统计数据,以及对学生的成绩进行排名等。管理员或教师可以根据这些分析结果了解学生的学习情况,并进行针对性的辅导。 另外,学生成绩管理系统还可以生成成绩报告或成绩单,以便管理员或教师将学生的成绩情况及时告知给学生或家长。报告输出功能可以根据需要进行灵活的设置,可以生成简单的成绩单,也可以生成详细的成绩报告。 总的来说,学生成绩管理系统利用C语言的编程优势,结合数据库技术,能够高效、准确地管理学生的成绩信息,并提供各种查询、分析和报告功能,帮助学校和教育机构更好地进行学生成绩管理工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值