C语言---------学生信息管理系统

包含知识:结构体,动态内存分配,链表的增删改查,文件的读写操作等等

包含的功能有:

创建班级,录入学生信息,显示学生信息,查询学生信息,添加学生信息,修改学生信息,删除学生信息,学生信息排序,保存学生信息,载入学生信息。

头文件和结构体

#include <stdio.h>
#include <conio.h> // getch()
#include <stdlib.h>

typedef struct _stu
{
    int num;//学号
    char name[15];//姓名
    int score[3];//C语言,高数,英语成绩
    double sum;//总分
    double ave;//平均分
    int order;//排名
}STU;

typedef struct node
{
    STU data;
    struct node* next;
}NODE;

主函数

int main(void)
{
	Menu();
	int flag;
	NODE* head;//创建头指针
	printf("%d", 请选择:);
	scanf("%d", &flag);
	printf("\n");
	while(1)//并非死循环,输入的flag为0时会跳出
	{
		switch(flag)
		{
			case 1://创建班级
			{
			    printf("请输入需要创建的班级人数:");
			    scanf("%d",&count);
			    printf("创建成功!班级人数为%d人\n请录入学生信息!!\n",count);
			    break;
			}
			case 2://录入信息
			{
			    head=create(count);
			    printf("录入成功!\n");
			    break;
			}
			case 3://显示信息
			{
			    show(head);
			    printf("显示成功!\n");
			    break;
			}
			case 4://查找信息
			{
			    printf("请输入学生的学号:");
			    scanf("%d",&n);
			    search(head,n);
			    break;
			}
			case 5://信息排序
			{
			    sort(head);
			    printf("排序成功!\n");
			    break;
			}
			case 6://删除学生
			{
				head=dele(head);break;
			}
			case 7://添加学生
			{
				add(head);
				break;
			}
			case 8://修改信息
			{
			    printf("请输入要修改的学生的学号:");
			    scanf("%d",&n);
			    change(head,n);
			    break;
			}
			case 9://保存信息
			{
				save(head);
				break;
			}	
			case 10://载入信息
			{
				head=load(head);
				break;
			}
			case 0://退出系统
			{
				exit(0);
			}
		}
		printf("按任意健继续");//1
	    getch();// 2 输入字符不显示。 可将1和2换为 system("pause");
	    system("cls");//清除屏幕
	    Menu();
	    printf("请选择:");
	    scanf("%d",&flag);	
	}
	return 0;
}

菜单

void Menu()
{
    printf("***************************************************\n");
    printf("---------------------------------------------------\n");
    printf("**********************菜单*************************\n");
    printf("---------------------------------------------------\n");
    printf("*   1. 创建班级             2. 学生信息录入       *\n");
    printf("*   3. 学生信息显示         4. 学生信息查询       *\n");
    printf("*   5. 学生信息排序         6. 学生信息删除       *\n");
    printf("*   7. 学生信息新增         8. 学生信息修改       *\n");
    printf("*   9. 学生信息保存         10.学生信息载入       *\n");
    printf("*   0. 退出系统                                   *\n");
    printf("---------------------------------------------------\n");
    printf("***************************************************\n");
}

录入信息

NODE* create(int n)
{
	NODE* head, *p, *q;
	for(int i = 0; i < n; ++i)
	{
		p = (NODE*)malloc(sizeof(NODE));
		printf("请输入第%d个学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):\n", i+1);
		scanf("%d%s%d%d%d",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
        p->data.sum = p->data.score[0]+p->data.score[1]+p->data.score[2];
        p->data.ave = p->data.sum/3;
        p->data.order = 0;
        p->next = NULL;
        if(i == 0)
        {
        	head = p;
        	q = p;
        }
        else
        {
        	q->next = p;
        	q = p;
        }
	}
	return head;
}

学生信息显示

void show(NODE* head)
{
	NODE* p = head;
	printf("|排名  |学号  |姓名  |C语言 |高数  |英语  |总分  |平均分|\n");
    while(p != NULL)
    {
        printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
        p=p->next;
    }
}

学生信息查询

void search(NODE* head, int n)
{
	NODE* p = head;
	while(p != NULL)
	{
		if(p->data.num == n)
        {
            printf("|排名  |学号  |姓名  |C语言 |高数  |英语  |总分  |平均分|\n");
            printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
            break;
        }
        else
            p=p->next;
	}
	if(p == NULL)
		printf("没有找到此学号!!!");
}

学生信息排序

void sort(NODE* head)
{
	STU t;
	int flag, i = 1;
	NODE* p, *q;
	p = head;
	q = p->next;
	printf("0.总分排序\n");
	printf("1.C语言成绩排序\n");
	printf("2.高数成绩排序\n");
	printf("3.英语成绩排序\n");	
	printf("请输入:");
	scanf("%d", &flag);
	if(flag)
	{
		while(q != NULL)
		{
			while(q != NULL)
			{
				if(p->data.score[flag-1] < q->data.score[flag-1])
				{
					t = p->data;
					p->data = q->data;
					q->data = t;
				}
				else
				{
					q = q->next;
				}
			}
			p = p->next;
			q = p->next;
		}
	}
	else
	{
		while(q != NULL)
		{
			while(q != NULL)
			{
				if(p->data.sum < q->data.sum)
				{
					t = p->data;
					p->data = q->data;
					q->data = t;
				}
				else
				{
					q = q->next;
				}
			}
			p = p->next;
			q = p->next;
		}
	}
	p = head;
	while(p != NULL)
	{
		p->data.order = i;//排序完成后分别赋予名次
		++i;
		p = p->next;
	}
}

删除学生信息

NODE* dele(NODE* head)
{
	NODE* phead = head;
	NODE* h = head;
	NODE* p = head->next;
	int flag;
	if(count == 0)
	{
		printf("请先创建班级!!!");
		return h;
	}
	printf("请输入所要删除学生的学号:");
	scanf("%d", &flag);
	if(flag == h->data.num)
	{
		printf("删除成功!!!");
		--count;
		return p;
	}
	while(p != NULL)
	{
		if(flag == p->data.num)
		{
			h->next = p->next;
			printf("删除成功!!!");
			--count;
			return phead;
		}
		else
		{
			h = p;
			p = p->next;
		}
	}
	printf("没有找到该学号!!!");
	return phead;
}

添加学生信息

void add(NODE* head)
{
	NODE* p = head;
	NODE* q;
	while(p != NULL)
	{
		if(p->next == NULL)
		{
			q = (NODE*)malloc(sizeof(NODE));
			printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
			scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
			q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
	        q->data.ave = q->data.sum/3;
	        q->data.order = 0;
	        p->next = q;
			q->next = NULL; 
	        count++;
	        printf("添加成功!!!\n");
	        break;
		}
		p = p->next;
	}
}

修改信息

void change(NODE* head, int n)
{
	NODE* q = head;
	while(q != NULL)
	{
		if(q->data.num == n)
		{
			printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
			scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
			q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
	        q->data.ave = q->data.sum/3;
	        q->data.order = 0;
	        printf("修改成功!\n");
	        break;
		}
		q = q->next;
	}
	if(q == NULL)
		printf("没有找到该学号!!!");
}

保存信息

void save(NODE* head)
{
	NODE* p = head;
	FILE* fp;
	fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","w");//打开文件,'w'表示写入文件
	if(fp==NULL)
    {
        printf("无法打开文件!");
        exit(0);
    }
    else
    {
        fprintf(fp,"学生人数:%d\n",count); 
        while(p != NULL)
        {
            fprintf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave,p->data.order);
            p=p->next;
        }
    }
    fclose(fp);//关闭文件
    printf("保存成功!!!\n");
}

载入信息(切记fscanf函数的输入格式要与上边fprintf函数的格式相同)

NODE* load(NODE* head)
{
	NODE* p;
	NODE* q;
	FILE* fp;
	fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","r");//打开文件,'r'表示读取文件
    if(fp==NULL)
    {
        printf("无法打开文件!");
        exit(0);
    }
    else
    {
    	fscanf(fp,"学生人数:%d\n",&count);//读取学生人数
    	for(int i = 1; i <= count; ++i)
    	{
    		p = (NODE*)malloc(sizeof(NODE));
    		fscanf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2],&p->data.sum,&p->data.ave,&p->data.order);
            printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0lf|%-6.2lf|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
            p->next=NULL;
            if(i == 1)
            {
            	head = p;
            	q = p;
            }
            else
            {
            	q->next = p;
            	q = p;
            }
    	}
    	printf("读取成功!!!");
    }
    fclose(fp);
    return head;
}

总代码

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

typedef struct _stu
{
    int num;//学号
    char name[15];//姓名
    int score[3];//C语言,高数,英语成绩
    double sum;//总分
    double ave;//平均分
    int order;//排名
}STU;

typedef struct node
{
    STU data;
    struct node* next;
}NODE;

int count = 0;//统计学生人数
int n;

//函数声明
void Menu();
NODE* create(int n);
void show(NODE* head);
void search(NODE* head, int n);
void sort(NODE* head);
NODE* dele(NODE* head);
void add(NODE* head);
void change(NODE* head, int n);
void save(NODE* head);
NODE* load(NODE* head);

int main(void)
{
	Menu();
	int flag;
	NODE* head;//创建头指针
	printf(" 请选择:");
	scanf("%d", &flag);
	printf("\n");
	while(1)
	{
		switch(flag)
		{
			case 1:
			{
			    printf("请输入需要创建的班级人数:");
			    scanf("%d",&count);
			    printf("创建成功!班级人数为%d人\n请录入学生信息!!\n",count);
			    break;
			}
			case 2:
			{
			    head=create(count);
			    printf("录入成功!\n");
			    break;
			}
			case 3:
			{
			    show(head);
			    printf("显示成功!\n");
			    break;
			}
			case 4:
			{
			    printf("请输入学生的学号:");
			    scanf("%d",&n);
			    search(head,n);
			    break;
			}
			case 5:
			{
			    sort(head);
			    printf("排序成功!\n");
			    break;
			}
			case 6:
			{
				head=dele(head);break;
			}
			case 7:
			{
				add(head);
				break;
			}
			case 8:
			{
			    printf("请输入要修改的学生的学号:");
			    scanf("%d",&n);
			    change(head,n);
			    break;
			}
			case 9:
			{
				save(head);
				break;
			}	
			case 10:
			{
				head=load(head);
				break;
			}
			case 0:
			{
				exit(0);//退出系统
			}
		}
		printf("按任意健继续");
	    getch();//输入字符不显示
	    system("cls");//清除屏幕
	    Menu();
	    printf("请选择:");
	    scanf("%d",&flag);	
	}
	return 0;
}

// 菜单排版可自由发挥
void Menu()//菜单
{
    printf("**************************************************\n");
    printf("--------------------------------------------------\n");
    printf("**********************菜单************************\n");
    printf("--------------------------------------------------\n");
    printf("*   1. 创建班级             2. 学生信息录入        *\n");
    printf("*   3. 学生信息显示         4. 学生信息查询        *\n");
    printf("*   5. 学生信息排序         6. 学生信息删除        *\n");
    printf("*   7. 学生信息新增         8. 学生信息修改        *\n");
    printf("*   9. 学生信息保存         10.学生信息载入        *\n");
    printf("*   0. 退出系统                                   *\n");
    printf("---------------------------------------------------\n");
    printf("***************************************************\n");
}

NODE* create(int n)//录入班级学生信息
{
	NODE* head, *p, *q;
	for(int i = 0; i < n; ++i)
	{
		p = (NODE*)malloc(sizeof(NODE));
		printf("请输入第%d个学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):\n", i+1);
		scanf("%d%s%d%d%d",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
        p->data.sum = p->data.score[0]+p->data.score[1]+p->data.score[2];
        p->data.ave = p->data.sum/3;
        p->data.order = 0;
        p->next = NULL;
        if(i == 0)
        {
        	head = p;
        	q = p;
        }
        else
        {
        	q->next = p;
        	q = p;
        }
	}
	return head;
}

void show(NODE* head)//显示所有学生信息
{
	NODE* p = head;
	printf("|排名  |学号  |姓名  |C语言 |高数  |英语  |总分  |平均分|\n");
    while(p != NULL)
    {
        printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
        p=p->next;
    }
}

void search(NODE* head, int n)//查询某个学生信息
{
	NODE* p = head;
	while(p != NULL)
	{
		if(p->data.num == n)
        {
            printf("|排名  |学号  |姓名  |C语言 |高数  |英语  |总分  |平均分|\n");
            printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
            break;
        }
        else
            p=p->next;
	}
	if(p == NULL)
		printf("没有找到此学号!!!");
}

void sort(NODE* head)//学生信息排序
{
	STU t;
	int flag, i = 1;
	NODE* p, *q;
	p = head;
	q = p->next;
	printf("0.总分排序\n");
	printf("1.C语言成绩排序\n");
	printf("2.高数成绩排序\n");
	printf("3.英语成绩排序\n");	
	printf("请输入:");
	scanf("%d", &flag);
	if(flag)
	{
		while(q != NULL)
		{
			while(q != NULL)
			{
				if(p->data.score[flag-1] < q->data.score[flag-1])
				{
					t = p->data;
					p->data = q->data;
					q->data = t;
				}
				else
				{
					q = q->next;
				}
			}
			p = p->next;
			q = p->next;
		}
	}
	else
	{
		while(q != NULL)
		{
			while(q != NULL)
			{
				if(p->data.sum < q->data.sum)
				{
					t = p->data;
					p->data = q->data;
					q->data = t;
				}
				else
				{
					q = q->next;
				}
			}
			p = p->next;
			q = p->next;
		}
	}
	p = head;
	while(p != NULL)
	{
		p->data.order = i;
		++i;
		p = p->next;
	}
}

NODE* dele(NODE* head)//删除某个学生信息
{
	NODE* phead = head;
	NODE* h = head;
	NODE* p = head->next;
	int flag;
	if(count == 0)
	{
		printf("请先创建班级!!!");
		return h;
	}
	printf("请输入所要删除学生的学号:");
	scanf("%d", &flag);
	if(flag == h->data.num)
	{
		printf("删除成功!!!");
		--count;
		return p;
	}
	while(p != NULL)
	{
		if(flag == p->data.num)
		{
			h->next = p->next;
			printf("删除成功!!!");
			--count;
			return phead;
		}
		else
		{
			h = p;
			p = p->next;
		}
	}
	printf("没有找到该学号!!!");
	return phead;
}

void add(NODE* head)//添加学生
{
	NODE* p = head;
	NODE* q;
	while(p != NULL)
	{
		if(p->next == NULL)
		{
			q = (NODE*)malloc(sizeof(NODE));
			printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
			scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
			q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
	        q->data.ave = q->data.sum/3;
	        q->data.order = 0;
	        p->next = q;
			q->next = NULL; 
	        count++;
	        printf("添加成功!!!\n");
	        break;
		}
		p = p->next;
	}
}

void change(NODE* head, int n)//修改学生信息
{
	NODE* q = head;
	while(q != NULL)
	{
		if(q->data.num == n)
		{
			printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
			scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
			q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
	        q->data.ave = q->data.sum/3;
	        q->data.order = 0;
	        printf("修改成功!\n");
	        break;
		}
		q = q->next;
	}
	if(q == NULL)
		printf("没有找到该学号!!!");
}

void save(NODE* head)//保存所有学生信息
{
	NODE* p = head;
	FILE* fp;
	fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","w");//打开文件,'w'表示写入文件
	if(fp==NULL)
    {
        printf("无法打开文件!");
        exit(0);
    }
    else
    {
        fprintf(fp,"学生人数:%d\n",count); 
        while(p != NULL)
        {
            fprintf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave,p->data.order);
            p=p->next;
        }
    }
    fclose(fp);//关闭文件
    printf("保存成功!!!\n");
}

NODE* load(NODE* head)//载入所有学生信息
{
	NODE* p;
	NODE* q;
	FILE* fp;
	fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","r");//打开文件,'r'表示读取文件
    if(fp==NULL)
    {
        printf("无法打开文件!");
        exit(0);
    }
    else
    {
    	fscanf(fp,"学生人数:%d\n",&count);//读取学生人数
    	printf("|排名  |学号  |姓名  |C语言 |高数  |英语  |总分  |平均分|\n");
    	for(int i = 1; i <= count; ++i)
    	{
    		p = (NODE*)malloc(sizeof(NODE));
    		fscanf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2],&p->data.sum,&p->data.ave,&p->data.order);
            printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0lf|%-6.2lf|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
            p->next=NULL;
            if(i == 1)
            {
            	head = p;
            	q = p;
            }
            else
            {
            	q->next = p;
            	q = p;
            }
    	}
    	printf("读取成功!!!");
    }
    fclose(fp);
    return head;
}
  • 18
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言-学生信息管理系统是一个基于链表数据结构的学生信息管理系统。链表是一种数据结构,可以存储和管理一系列具有相同类型的数据。在学生信息管理系统中,链表被用来存储和操作学生的基本信息。 该系统主要有以下功能: 1. 添加学生信息:可以添加学生的姓名、学号、性别、年龄等信息,并将该学生的信息节点插入到链表中。 2. 删除学生信息:根据学号或其他关键词查找到对应的学生信息节点,并从链表中删除该节点。 3. 修改学生信息:根据学号或其他关键词查找到对应的学生信息节点,并根据需求修改学生的信息。 4. 查询学生信息:可以根据学号或其他关键词查找到对应的学生信息节点,并显示该学生的详细信息。 5. 遍历学生信息:可以遍历整个链表,显示所有学生的基本信息。 链表的优势在于插入和删除节点的操作比较高效,因为只需要改变节点的指针指向即可,不需要移动其他节点。而数组在插入和删除操作时需要移动其他元素,效率较低。 在实现学生信息管理系统时,可以使用指针来操作链表,通过指针的指向找到链表的某个节点,并进行相应的操作。同时,需要注意对内存的管理,确保动态分配和释放内存的正确性,避免内存泄漏和访问错误。 总之,C语言-学生信息管理系统是一个基于链表数据结构的系统,可以实现学生信息的增删改查等功能。通过灵活运用链表的特点,可以高效地管理学生的基本信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值