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

2023-11-08

拥有基本的学生信息系统的功能, 功能点如下所示:
1.添加学生信息
2.修改学生信息
3.删除学生信息
4.查看学生信息
5.搜索学生信息
6.查看系统学生总人数
7.学生信息排序
8.保存学生信息(保存在D:/students.txt)
9.导入学生信息(导入D:/students.txt文件中的信息)

主界面

在这里插入图片描述

1.添加学生信息

在这里插入图片描述
在这里插入图片描述

2.修改学生信息
3.删除学生信息

4.查看学生信息

在这里插入图片描述

5.搜索学生信息
在这里插入图片描述

6.查看系统学生总人数
在这里插入图片描述

7.学生信息排序

8.保存学生信息(保存在D:/students.txt)
在这里插入图片描述

9.导入学生信息(导入D:/students.txt文件中的信息)

学生信息管理系统代码


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

struct Student {
	int id; //学号 
	char name[20]; //名字 
	int sex; //性别 0为女,1为男 
	char specialized[25]; //学生的专业 
	char date[25]; //出生日期 
	char address[255]; //学生住址 
	float score; //学生分数 
	//Stu -> Stu -> Stu -> Stu -> NULL 
	struct Student *next; //链表的构成,指向下一个结构体
	/*struct student *next 是
	申请了一个 struct student
	这结构体类型的指针
	*/
};

//学生管理系统中的总人数数量  
int total_count = 0;

//重定义 struct Student 为 Stu(起别名) ,后续可以直接使用Stu代替 struct Student 
typedef struct Student Stu;


//主菜单 
void mainMenu()
{
	printf("	 0.退出\n");
	printf("         1.新增学生信息\n");
	printf("	 2.修改学生信息\n");
	printf("         3.删除学生信息\n");
	printf("	 4.查看学生信息\n");
	printf("	 5.学生信息搜索\n");
	printf("	 6.学生人数统计\n");
	printf("	 7.按英语成绩排序\n");
	printf("         8.学生信息保存\n");
	printf("	 9.导入学生信息\n");
	printf("	 ******请选择:");
}

 //退出程序 
void exitProgram()
{
	system("cls");
	system ("color 04");
	int i, j, k, l, m;
	char c=3; //ASCII码里面 3 就是一个字符小爱心
	for (i=1; i<=5; i++) printf("\n"); //开头空出5行
	for (i=1; i<=3; i++) 
	{ //前3行中间有空隙分开来写
		for (j=1; j<=32-2*i; j++) printf(" "); //左边的空格,每下一行左边的空格比上一行少2个 //8*n-2*i
		for (k=1; k<=4*i+1; k++) printf("%c", c);//输出左半部分字符小爱心
		for (l=1; l<=13-4*i; l++) printf(" "); //中间的空格,每下一行的空格比上一行少4个
		for (m=1; m<=4*i+1; m++) printf("%c", c);//输出右半部分字符小爱心
		printf("\n"); //每一行输出完毕换行
	}
	for (i=1; i<=3; i++) 
	{ //下3行中间没有空格
		for (j=1; j<=24+1; j++)  printf(" "); //左边的空格 //8*(n-1)+1
		for (k=1; k<=27; k++) 
		if (k==8)
		printf("谢");
		else if (k==10)
		printf("谢");
		else if (k==12)
		printf("使");
		else if (k==14)
		printf("用");
		else
		printf("%c", c);//输出字符小爱心
		printf("\n"); //每一行输出完毕换行
	}
	for (i=7; i>=1; i--)
	{ //下7行
		for (j=1; j<=40-2*i; j++) printf(" "); //左边的空格,每下一行左边的空格比上一行少2个//8*(n+1)-2*i
		for (k=1; k<=4*i-1; k++) printf("%c", c);//每下一行的字符小爱心比上一行少4个(这个循环是i--)
		printf("\n"); //每一行输出完毕换行
	}
	for (i=1; i<=39; i++)printf(" "); //最后一行左边的空格
	printf("%c\n", c); //最后一个字符小爱心
	for (i=1; i<=5; i++)printf("\n"); //最后空出5行
}


//添加学生 
void addStudent(Stu *head) 
{
	//清空屏幕 
	system("cls");
	//找到最后一个节点,然后才能添加
	//最后一个节点的 next 为 NULL 
	//Stu->Stu->Stu->NULL 
	while(head != NULL && head->next!=NULL)//遍历,很重要,是结点,连接着接下来输入的数据与上一个数据。
	{
		head = head->next;//head->next==NULL;找到存放指针为空的结构体,找到尾结点。 
	}
	printf("请输入学生个数: ");
	int num;
	scanf("%d",&num);
	
	int i=1;
	for(; i<= num; i++){
		printf("请输入第%d个学生信息\n",i);
		Stu *stu;//开辟一个单独结构体,字母任意。 
		stu=(Stu *)malloc(sizeof(Stu));//开辟内存
		/*
		malloc函数只是开辟一块区域/
		//calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。 
		用变量表示长度,想对数组的大小作动态说明,这是错误的。
		但是在实际的编程中,往往会发生这种情况,
		即所需的内存空间取决于实际输入的数据,而无法预先确定。
		对于这种问题,用数组的办法很难解决。为了解决上述问题,
		C语言提供了一些内存管理函数,
		这些内存管理函数可以按需要动态地分配内存空间,
		也可把不再使用的空间回收待用,
		为有效地利用内存资源提供了手段。
		*/ 
		printf("学号:");
		scanf("%d",&stu->id);
		printf("学生姓名: ");
		scanf("%s",stu->name);
		printf("性别:");
		scanf("%d",&stu->sex);
		printf("专业:");
		scanf("%s",stu->specialized);
		printf("出生日期:");
		scanf("%s",stu->date);
		printf("家庭住址:");
		scanf("%s",stu->address);
		printf("总成绩:");
		scanf("%f",&stu->score);
		stu->next=NULL;//结构体的存地址的地方初始化 //结构体初始化。。 
		head->next=stu;//连接链表 
		//head指向最后一个节点,刚刚给stu添加到节点后面了,所以限制stu就是最后一个节点
		//我们让head指向stu,此时head依旧指向最后一个节点上了 
		head=stu;
		system("cls");
	}
	
	total_count += num; //+= --> total_count = total_count + num; 
	
	printf("信息录入成功!!!\n");
	system("pause");
	system("cls");
	/*
	system("pause")作用: 
	让操作系统来暂停该程序进程的执行,
	同时程序运行到此语句处时,
	会在程序的窗口上显示“Press any key to continue . . .”
	 也就是 “按任意键继续...”,
	 即等待用户按下任意一个按键使该程序从暂停状态
	返回到执行状态继续从刚才暂停的地方开始执行。
	*/ 
	/*system("cls")就是执行命令“清屏”的意思。*/ 
}
//打印所有学生信息 
void printAllStudents(Stu *q) 
{
	system("cls");
	while(q->next!=NULL)
	{
		q=q->next;/// 数据从第二个开始存,应该从第二个进行查找。 
		printf("学号:%d\n",q->id);
		printf("姓名:%s\n",q->name);
		printf("性别:%s\n",q->sex == 0 ? "女" : "男");
		printf("专业:%s\n",q->specialized);
		printf("出生日期:%s\n",q->date);
		printf("家庭地址:%s\n",q->address);
		printf("总成绩:%.2f\n",q->score);
		printf("\n");
	}
	system("pause");
	system("cls");
	return;
}

//删除学生信息 
void deleteStudent(Stu *head) 
{
	system("cls");
	Stu *prev = head; //用于删除节点,记录上一个节点 
	head = head->next;//存数据从第二个开始存,应该从第二个进行查找。
	printf("请输入删除的人的姓名:");
	char name[20];
	scanf("%s",name);
	//用于判断是否找到输入名字的学生 
	int num = 0;
	
	
	//一直找到head为NULL,匹配了就删除退出循环 
	while(head != NULL)
	{
		//存数据从第二个开始存,应该从第二个进行查找。  
		if(strcmp(head->name,name)==0){
			num = 1;
			//匹配到name相同的节点 
			//删除head节点 
			//删除前: prev->head->xxx->xxx->NULL;
			//删除后: prev->xxx->xxx->NULL;
			//将指向删除的地址和后一个地址连接,跳过删除对象。 
			prev->next=head->next;
			
			free(head); //清空内存 
			head = NULL; //置为空,防止后续被调用 
			/*
			 清空数据,结构体空间还在。
			  free后只是做了个标记,告诉系统这块内存不用了,
			  一旦调用后, 那个地址是不被保护的,
			  也就是说其他的变量随时可能占用那个地址。*/ 
			break;
		 }
		prev = prev->next;
		head = head->next;
	}
	if(num != 1)
	{
		printf("删除失败\n");
	}
	else 
	{
		printf("删除成功\n");
		total_count -= 1;
	}
}

//搜索学生信息 
void searchStudent(Stu *q)
{
	system("cls");
	printf("请输入查找人姓名:");
	char name[20];
	scanf("%s",name);
	int num = 0;
	//第二个开始存储的学生信息,从第二个节点开始查找 
	q=q->next;
	while(q!=NULL){
		if(strcmp(q->name,name)==0){
			num = 1;
			system("cls");//清空屏幕 
			printf("\n\n查找完成\n\n");
			printf("学号:%d\n",q->id);
			printf("姓名:%s\n",q->name);
			printf("性别:%s\n",q->sex == 0 ? "女" : "男");
			printf("专业:%s\n",q->specialized);
			printf("出生日期:%s\n",q->date);
			printf("家庭地址:%s\n",q->address);
			printf("总成绩:%.2f\n",q->score);
		}
		q=q->next;
	}
	if(num == 0)
	{
		printf("\n\n查无此人\n\n");
	}
	system("pause");
	system("cls");
}

//交换两个节点的信息 
void swapStudent(Stu *prev,Stu *head)
{
	int t1;
	t1=prev->id;
	prev->id=head->id;
	head->id=t1;
	
	char t2[20];
	strcpy(t2,prev->name);
	strcpy(prev->name,head->name);
	strcpy(head->name,t2);
	
	int t3;
	t3 = prev->sex;
	prev->sex = head->sex;
	head->sex = t3;
	
	char t4[20];
	strcpy(t4,prev->specialized);
	strcpy(prev->specialized,head->specialized);
	strcpy(head->specialized,t4);
	
	char t5[20];
	strcpy(t5,prev->date);
	strcpy(prev->date,head->date);
	strcpy(head->date,t5);
	
	char t6[20];
	strcpy(t6,prev->address);
	strcpy(prev->address,head->address);
	strcpy(head->address,t6);
	
	float t7;
	t7=prev->score;
	prev->score = head->score;
	head->score=t7;
}

//学生排序,按照分数从大到小排序 
void sortStudents(Stu *head)
{
	//系统中人数小于2就无需排序 
	if(total_count<2)
	{
		printf("\n\n数据过少,不进行排序!\n\n");
		system("pause");
		system("cls");
		return;
	}
	
	system("cls");
	printf("请输入成绩排序规则:\n");
	printf("输入0按照成绩从小到大排序\n");
	printf("输入1按照成绩从大到小排序\n");
	int op;
	scanf("%d",&op);
	
	head = head->next;//head指向的是链表的第三个节点,第二个有效节点 
	
	
	Stu *pFirst = NULL, *pSecond = NULL, *pEnd = NULL; 
	pFirst = head;
	pSecond = head;
	
	while(pFirst != pEnd)
	{
		while(pFirst->next != pEnd)
		{
			if(op == 0)
			{
				//从小到大排序 
				if(pFirst->score > pFirst->next->score)
				{
					//交换两个节点的信息 
					swapStudent(pFirst,pFirst->next);
				}
			}
			else
			{
				//从大到小排序
				if(pFirst->score < pFirst->next->score)
				{
					//交换两个节点的信息 
					swapStudent(pFirst,pFirst->next);
				}
			}
			pFirst = pFirst->next;
		}
		//此时pFirst是链表中的最后一个节点了 
		pEnd = pFirst;
		pFirst = head;
	}
	printf("\n\n排序成功!!!\n\n");
	system("pause");
	system("cls");
}

//修改学生信息 
void updateStudent(Stu *head)
{
	system("cls");
	//从第二个节点开始查找 
	Stu *q=head->next;
	printf("请输入修改人姓名:");
	char name[20];
	scanf("%s",name);
	while(q != NULL){
		if(strcmp(q->name,name)==0)
		{
			printf("\n\n存在该学生信息!\n\n");
			
			printf("请输入要修改的学生学号:");
			scanf("%d",&q->id);
			printf("请输入要修改的学生姓名:");
			scanf("%s",q->name);
			printf("请输入要修改的学生性别:");
			scanf("%d",&q->sex); 
			printf("请输入要修改的学生专业:");
			scanf("%s",q->specialized);
			printf("请输入要修改的学生出生日期:"); 
			scanf("%s",q->date);
			printf("请输入要修改的学生家庭地址:");
			scanf("%s",q->address); 
			printf("请输入要修改的学生的总成绩:");
			scanf("%f",&q->score);
			printf("\n\n修改成功!!!\n\n");
			break;
		}
		q=q->next;
	}
	if(q==NULL)
	{
		printf("\n\n不存在该学生信息\n\n\n");
	}
}

//保存所有学生信息 
void saveStudents(Stu *q)
{
	system("cls");
	FILE * fp = fopen("D:\\students.txt", "a");
	if(fp == NULL)
	{
		printf("打开文件失败!!!\n\n");
		return;
	}
	while(q->next!=NULL)
	{
		q=q->next;
		fprintf(fp, "%d %s %d %s %s %s %f\n",q->id,q->name,q->sex,q->specialized,q->date,q->address,q->score);
		/*fprintf函数作用:传送格式化输出到一个文件中
		*/
	}
	fclose(fp);
	printf("\n\n文件保存成功!!!\n\n\n");
}

//导入学生信息到链表的最后 
void importStudents(Stu *head)
{
	system("cls");
	
	FILE *fp=fopen("D:\\students.txt","r"); 
	if(fp==NULL)
	{
		printf("打开文件失败\n");
		return;
	}
	
    while(head->next!=NULL)
    {
    	head = head->next;
	}
	
	int num = 0;
    char buf[1024];
 
    while (fgets(buf, sizeof(buf), fp) != NULL)
    {
		Stu *q=(Stu*)malloc(sizeof(Stu));
		q->next=NULL;
		printf("%s", buf);
        //格式化输入 
		sscanf(buf, "%d %s %d %s %s %s %f\n",&q->id,q->name,&q->sex,q->specialized,q->date,q->address,&q->score);
		
		head->next=q;
		head = q;
		num++;
    }
	 
	fclose(fp); 
	
	if(num != 1)
	{
		total_count += num;
		printf("导入成功\n");
	}
	else
	{
		printf("无数据"); 
	}
}
				
int main()
{
	//开辟一个空的头节点 
	Stu *head;
	head=(Stu *)malloc(sizeof(Stu));
	head->next=NULL;
	system("cls"); //清空控制台 
	system("color 06"); //控制台设置颜色 
	
	//进来之后死循环,展示菜单,等待用户输入 
	while(1)
	{
		mainMenu();
		int op;
		scanf("%d",&op);
		switch(op)
		{
			case 0:
			{
				//退出程序 
				exitProgram();
				printf("\n\n\n    	 谢谢使用【手动微笑】\n\n");
				return 0;				
			}
			case 1:
			{
				//添加学生信息 
				addStudent(head);
				break;
			}
			case 2:
			{
				//修改学生信息 
				updateStudent(head);
				system("pause");
				system("cls");
				break;
			}
			case 3:
			{
				//删除学生信息 
				deleteStudent(head);
				system("pause");
				system("cls");
				break;
				
			}
			case 4:
			{
				//打印所有学生信息 
				printAllStudents(head);
				break;	
			}
			case 5:
			{
				//搜索学生信息 
				searchStudent(head);
				break;	
			}
			case 6:
			{
				printf("\n\n总人数为:%d\n\n\n",total_count);
				system("pause");
				system("cls");
				break;	
			}
			case 7:
			{
				//学生排序,按照分数从大到小排序 
				sortStudents(head);
				break;	
			}
			case 8:
			{
				//保存所有学生信息 
				saveStudents(head);
				system("pause");
				system("cls");
				break;	
			}
			case 9:
			{
				//导入学生信息到链表的最后 
				importStudents(head);
				system("pause");
				system("cls");
				break;
			}
			default:
			{
				printf("\n\n您的输入有误!!!请重新输入\n");
				system("pause");
				system("cls");
				break;	
			}
		}
	}
} 




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新版-C语言学生信息管理系统 的相关文章

  • BUUCTF-Secret File

    Secret 意为秘密 可知我们需要在网页中寻找到隐藏的flag文件 启动环境打开靶机 直接查看源码 发现一个文件 打开后点击 secret 但是会直接跳转到 end php 并且提示查阅结束 说明页面跳转过快 需要手动抓放包来查看 经过拦
  • 微信 Android 模块化架构重构实践(上)

    转自 https cloud tencent com developer article 1005631 作者 carlguo 微信Android架构历史 微信Android诞生之初 用的是常见的分层结构设计 这种架构简单 清晰并一直沿袭至
  • 解决mysql链接时报错Authentication plugin ‘caching_sha2_password‘ cannot be loaded的问题

    1 打开命令提示符 2 输入 cd C Program Files MySQL MySQL Server 8 0 bin 3 进入到C Program Files MySQL MySQL Server 8 0 bin gt 目录之后 键入
  • NLP学习(二)中文分词技术

    运行平台 Windows Python版本 Python3 x IDE PyCharm 一 前言 这篇内容主要是讲解的中文分词 词是一个完整语义的最小单位 分词技术是词性标注 命名实体识别 关键词提取等技术的基础 本篇博文会主要介绍基于规则

随机推荐

  • Windows中账户没有登录的情况下程序开机自启动

    windows打开任务计划程序 开始菜单 所有程序 管理工具 任务计划程序 打开后点击右边创建任务 在常规界面填写启动名称描述等信息 安全选项勾选不管用户是否登录都要运行 我这里为了保险起见还勾选了使用最高权限 在触发器界面选择新建 开始任
  • c++运算符

    运算符 作用 用于执行代码的运算 1 算术运算符 下表显示了 C 支持的算术运算符 假设变量 A 的值为 10 变量 B 的值为 20 则 运算符 描述 实例 把两个操作数相加 A B 将得到 30 从第一个操作数中减去第二个操作数 A B
  • 程序员学数据库那些事儿

    最近有人问 是问 不是请教 我数据库怎么学 要学哪些 以下我谈一些个人想法 其实我的数据库知识不是很扎实 真心的 当年我学这个东西时某个大神告诉我 学会sql server 走遍天下都不怕 事实上 这几年如果只会sqlserver根本到哪都
  • C++ 构造函数和析构函数是否可以继承?

    先看一个例子 cpp view plain copy include
  • 架构师需要了解的Paxos原理、历程及实战

    架构师需要了解的Paxos原理 历程及实战 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联网金融的意义不言而喻 而这些业务在使用数据库时 无论 MySQL 还是 Oracle 都会面临一个艰难的取舍 就是如何处理主备库之间的
  • linux下部署redis

    基础知识 1 Redis的数据类型 字符串 列表 lists 集合 sets 有序集合 sorts sets 哈希表 hashs 2 Redis和memcache相比的独特之处 1 redis可以用来做存储 storge 而memcache
  • Java必懂之命名规范

    定义规范的目的是为了使项目的代码样式统一 使程序有良好的可读性 在此我从网上查找了一篇写得比较好的文章 来让大家学习 顺便自己复习一下 有时候自己写的类名不符合规范 Eclipse会出现黄色叹号 就是表示你的命名不规范 然而 规范不是规定
  • 微信小程序image图片自适应宽度比例显示的方法

    我们都知道微信小程序的组件image是用来显示图片的 它有一下几个属性 1 src 图片资源地址2 mode 图片裁剪 缩放的模式3 binderror 当错误发生时 发布到 AppService 的事件名 事件对象event detail
  • SpringMVC的架构有什么优势?——控制器(一)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • 合宙Air103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方社区库接口RC522模块库调用及示例进行复现及分析 了解RDIF及非接触式IC卡的原理及操作方法 实现功能 利用已知的A
  • 单片机拟真电路图软件_电路仿真软件有哪些?6款常用的电路仿真软件推荐

    一些网友需要下载电路仿真软件这一类软件 但是 网络上寻找电路仿真软件却比较麻烦 那么 电路仿真软件有哪些 小编今天就给大家整理了6款常用的电路仿真软件推荐给大家 需要下载电路仿真软件的网友可以挑选一下 Machining 6款常用的电路仿真
  • Vue 监听localStorage

    1 在utils目录下建tool js文件 文件代码如下 重写setItem事件 当使用setItem的时候 触发 window dispatchEvent派发事件 function dispatchEventStroage const s
  • python turtle画海绵宝宝,python还能这么玩?帅呆了

    漫威还是DC 超人或者蝙蝠侠 火影忍者亦或死神 当然 所有这些讲的都是漫画 当我们还是孩子的时候 总是迷恋漫画书 当翻到我们的英雄们开始行动时会激动不已 大家总是争论谁是最厉害的超级英雄 认真地讨论他们的家族历史 或者梦想自己拯救高谭市 我
  • 容器编排学习(二)镜像制作和私有仓库介绍

    一 Dockerfile 1 概述 commit的局限 很容易制作简单的镜像 但碰到复杂的情况就十分不方便例如碰到下面的情况 需要设置默认的启动命令 需要设置环境变量 需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方
  • 悲剧的山寨采用的新芯片资料汇总(更新Rk3066)

    芯片名称 基友公司 上市前宣传主频 量产机最高主频 最高主频 GPU 备注 Rk3066 原道 酷比魔方 1 4GHz 2 1 6GHz 2 1 6GHz 2 Mali 400MP4 266MHz 旧固件 Mali 400MP4 399MH
  • 【Web Crawler】Scrapy vs BeautifulSoup:哪个是您业务的最佳选择?

    Beautiful Soup 可以帮助从目标网页中提取特定元素 而 Scrapy 可以管理异步数据检索 从而提高效率 不确定哪个选项最适合您的业务需求 本指南可以提供帮助 什么是Beautiful Soup Beautiful Soup 是
  • 数据挖掘——决策树和K近邻

    决策树和K近邻 一 线性回归 房价预测 第1关 线性回归算法思想 一 相关知识 1 gt 简单线性回归 2 gt 多元线性回归 二 编程要求 三 参考答案 第2关 动手实现线性回归 一 相关知识 1 gt 数据集介绍 2 gt 线性回归算法
  • android蓝牙支持双向,【玩机攻略】了解蓝牙LDAC,玩转双向蓝牙LDAC

    原标题 玩机攻略 了解蓝牙LDAC 玩转双向蓝牙LDAC LDAC是由SONY开发的一项蓝牙音频编码技术 它的最高传输速率可达990kbps 相当于普通蓝牙的3倍 文件采样率最高可支持96 khz 而即使是aptX HD 其最高所能支持的文
  • Windows 在CMD 终端中使用SS代理

    打开CMD后先分别输入下面两条命令 set http proxy 127 0 0 1 1080 set https proxy 127 0 0 1 1080 其中的本地IP 地址和端口号如果你没有改过的话应该是没问题的 改过的话就填改过的
  • 新版-C语言学生信息管理系统

    拥有基本的学生信息系统的功能 功能点如下所示 1 添加学生信息 2 修改学生信息 3 删除学生信息 4 查看学生信息 5 搜索学生信息 6 查看系统学生总人数 7 学生信息排序 8 保存学生信息 保存在D students txt 9 导入