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

一个很简单的学生信息管理系统

列表内容

  • 系统以菜单方式工作
  • 录入学生信息
  • 打印学生信息
  • 保存学生信息
  • 读取学生信息
  • 统计所有学生人数
  • 修改学生信息
  • 删除学生信息
  • 退出系统
  • 用链表的方式实现

头文件

#include 
#include 
#include 
#include 
#include 
//定义一个学生
typedef struct _Student{
	char name[20];//姓名
	int age;	  //年龄
	int score;    //成绩
	int stuNum;  //学号
}Student;
typedef struct _Node{
	Student stu;
	struct _Node* pNext; //指向下一个链表的指针
}Node;
//定义一个头结点
Node *g_pHead = NULL;
Node *pNewNode = NULL;
using namespace std;
//欢迎
void Welcome();
void InputStudent();
//打印学生信息
void PrintStudent();
//保存学生信息
void SaveStudent();
//读取学生信息
void ReadStudent();
//统计所有学生人数
int CountStudent();
//查找学生
Node* FindStudent();
//修改学生信息
void ModifyStudent();
//删除学生信息
void DeleteStudent();

CPP

#include "StudentMangerSystem.h"

int main()
{
	while (1){
		Welcome();
		//getchar();//从键盘接受一个字符
		char ch = getch();//可以不用回车 为什么用char呢 getch读取的就是字符
		switch (ch)
		{
		case '1':
			InputStudent();
			break;//录入学生信息
		case '2':
			PrintStudent();
			break;//打印学生信息
		case '3':
			SaveStudent();
			break;//保存学生信息
		case '4':
			ReadStudent();
			break;//读取学生信息
		case '5':
			printf("学生总人数为:%d\n",CountStudent());
			system("pause");
			system("cls"); // 清屏
			break;//统计所有学生人数
		case '6':  // 方括号代表复合语句,假如直接使用;会造成后面无法使用
		{		Node* p = FindStudent();
		if (p != NULL)
		{
			printf("学号:%d\t姓名:%s\t年龄:%d\t成绩:%d\t", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.score);
		}
		system("pause");
		system("cls"); // 清屏
		}
			break;//查找学生信息
		case '7':
			ModifyStudent();
			break;//修改学生信息
		case '8':
			DeleteStudent();
			break;//删除学生信息
		case '0':
			printf("Bye Bye!!!\n");
			return 0;
			break;//退出系统
		default:
		{printf("您的输入有误,请重新输入\n");
		system("pause");
		system("cls"); }// 清屏
			break;
		}
	}
	return 0;
}
void Welcome(){
	printf("*********************************************************\n");
	printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
	printf("*********************************************************\n");
	printf("*\t\t\t请选择功能列表\t\t\t\n");
	printf("*********************************************************\n");
	printf("*\t\t\t1.录入学生信息\t\t\t*\n");
	printf("*\t\t\t2.打印学生信息\t\t\t*\n");
	printf("*\t\t\t3.保存学生信息\t\t\t*\n");
	printf("*\t\t\t4.读取学生信息\t\t\t*\n");
	printf("*\t\t\t5.统计所有学生人数\t\t*\n");
	printf("*\t\t\t6.查找学生信息\t\t\t*\n");
	printf("*\t\t\t7.修改学生信息\t\t\t*\n");
	printf("*\t\t\t8.删除学生信息\t\t\t*\n");
	printf("*\t\t\t9.退出系统\t\t\t*\n");
	printf("*********************************************************\n");
}
//录入学生信息
void InputStudent(){
	//创建一个新节点
	Node* pNewNode = (Node*)malloc(sizeof(Node));
	pNewNode->pNext = NULL;
	//头插法 
	if (g_pHead == NULL)
	{
		g_pHead = pNewNode;
	}
	else
	{
		pNewNode->pNext = g_pHead;
		g_pHead = pNewNode;
	}
	printf("请输入学生姓名:\n");
	scanf("%s", pNewNode->stu.name);//从键盘格式化接受一个字符串
	printf("请输入学生的年龄:\n");
	scanf("%d", &pNewNode->stu.age);//&:取地址运算符
	printf("请输入学生的学号:\n");
	scanf("%d", &pNewNode->stu.stuNum);
	printf("请输入学生的成绩:\n");
	scanf("%d", &pNewNode->stu.score);
	printf("学生信息录入成功:\n");
	system("pause");
	system("cls"); // 清屏
}
void PrintStudent(){
	system("cls"); // 清屏
	printf("*********************************************************\n");
	printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
	printf("*********************************************************\n");
	printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩\t*\n");
	printf("*********************************************************\n");
	//遍历链表
	Node* p = g_pHead;
	while (p != NULL)
	{
		printf("*\t%d\t*\t%s\t*\t%d\t*\t%d\t*\n", p->stu.stuNum,
			p->stu.name,
			p->stu.age,
			p->stu.score
			);
		p = p->pNext;
		printf("*********************************************************\n");
	}

	system("pause");
	system("cls"); // 清屏
}

void SaveStudent(){
	//打开文件
	FILE* fp = fopen("D:\\stuinfo.dat","w"); //假如使用系统盘,可能会出现写入失败的情况
	if (fp == NULL)
	{
		printf("打开文件失败.\n");
		return;
	}
	Node* p = g_pHead;
	//遍历链表
	while (p != NULL)
	{
		fwrite(&p->stu, 1, sizeof(Student), fp);//写入学生信息
		p = p->pNext;
	}
	//关闭文件
	fclose(fp);
	printf("数据保存成功.\n");
	system("pause");
	system("cls"); // 清屏
}

void ReadStudent(){
	//打开文件
	FILE *fp = fopen("D:\\stuinfo.dat", "r");//w就是写,r就是读
	if (fp == NULL)
	{
		printf("打开文件失败.\n");
		return;
	}
	//读文件
	Student stu; //声明stu
	while (fread(&stu, 1, sizeof(Student), fp)) //fread会返回实际读取的字节 size_t fread( void *buffer, size_t size, size_t count, FILE *stream );//C99前
	{
		Node* pNewNode = (Node*)malloc(sizeof(Node));
		memcpy(pNewNode, &stu, sizeof(Student));//memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
		pNewNode->pNext = NULL;
		if (g_pHead == NULL)
		{
			g_pHead = pNewNode;
		}
		else
		{
			pNewNode->pNext = g_pHead;
			g_pHead = pNewNode;
		}
	}

	//关闭文件
	fclose(fp);
	printf("加载数据成功.\n");
	system("pause");
	system("cls"); // 清屏
}

//统计所有学生人数
int CountStudent(){
	int nCount = 0;
	Node* p = g_pHead;
	while ( p != NULL)
	{
		nCount++;
		p = p->pNext;
	}
	return nCount++;
	
}
Node* FindStudent(){
	int nStuNum;
	char szName[20];
	printf("请输入要查找学生的学号:\n");
	scanf("%d", &nStuNum);
	printf("请输入要查找学生的姓名:\n");
	scanf("%d", &szName);
	Node* p = g_pHead;
	while (p != NULL)
	{
		if (p->stu.stuNum == nStuNum || strcmp(p ->stu.name, szName ))
		{
			return p;
		}
		p = p->pNext;
	}
	return NULL;
}
void ModifyStudent(){
	int nStuNum;
	printf("请输入需要修改的学生信息的学号:\n");
	scanf("%d", &nStuNum);
	Node* p = g_pHead;
	while (p != NULL)
	{
		if (p->stu.stuNum == nStuNum )
		{
			printf("请输入要修改的学生姓名 年龄 成绩:\n");
			scanf("%s %d %d", p->stu.name, &p->stu.age, &p->stu.score);
			printf("修改成功.\n");
			break;
		}
		p = p->pNext;
	}
	if (p == NULL)
	{
		printf("没有找到该学生信息");
	}
	system("pause");
	system("cls"); // 清屏
}

void DeleteStudent(){
	int nStuNum;
	printf("请输入要删除的学生的学号:\n");
	scanf("%d", &nStuNum);
	Node* p1;
	//判断是不是头结点
	if (g_pHead->stu.stuNum == nStuNum)
	{
		p1 = g_pHead;
		g_pHead = g_pHead->pNext;
		free(g_pHead);
		return;
	}
	//不是头结点
	Node* p = g_pHead;
	Node* p2;
	while (p2->pNext !=NULL)
	{
		if (p2->pNext->stu.stuNum == nStuNum)
		{
			p2 = p->pNext;
			p->pNext = p->pNext->pNext;
			free(p2);
			system("pause");
			system("cls"); // 清屏
			return;
		}
		p = p->pNext;
		if (p ->pNext == NULL)
		{
			break;
		}
	}
	if (p->pNext == NULL)
	{
		printf("没有找到该学员\n");
	}

	system("pause");
	system("cls"); // 清屏
}

你可能感兴趣的:(项目)