控制台小程序——学生信息管理系统

学生信息管理系统

功能模块

1、界面
2、数据结构设计
3、交互

界面

 ----------------------------------------------
 1、录入信息
 2、删除信息
 3、修改信息
 4、查找信息
 5、浏览信息
 0、退出信息
 ----------------------------------------------

数据结构设计

 自定义学生信息结构体,所有的操作用链表实现。
 姓名,性别,年龄,科目:数据结构、操作系统、计算机组成原理、计算机网络,总分

用户交互

 根据菜单选择相应的服务
 用switch()实现,用keyDown()封装
 system("pause") 等待用户输入
 system("cls") 清屏

功能模块

 void menu();
 void inputJudgeYorN(char &key);//用于判断每次是否正确输入y/n ,这里用引用,保证输入有效
 void headInsertList(Stu *node);//头插法将node添加到链表
 void writeDate(Stu *node);//将当前结点信息写入磁盘
 void loadeDatre();//将文件信息加载到内存
 void keyDown(int n);//按下按键,提供对应的服务
 void insertInfo();//添加某位学生的信息到系统
 void deleteInfo();//删除某位学生的信息
 void reverseInfo();//修改某位学生的信息
 void findInfo();//查找某位学生的信息
 void sortDate();//将所有学生按照总分排序,采用冒泡的思想
 void browseInfo();//将所有学生按照总分排名后输出
 void quitProcess();//每次退出程序时,将所有的信息写入到文件,替换原来的文件

注意事项

 关于文件操作的格式化读入读出
 fwrite(p,sizeof(Stu),1,fp);//二进制文件操作,适用于一次写入一组数据
 fread(p,sizeof(Stu),1,fp);//二进制文件操作,适用于一次读出一组数据
 fprintf(fp, "%d, %s, %c", num, name, gender); //将数据格式化输出到文件info.txt中
 fscanf(fp, "%d, %s, %c", &num, name, &gender); //从文件info.txt中格式化读取数据
 feof(fp);//文件结束返回确认,即:非0
 remove(“路径”);//删除指定位置的文件
 为了永久保存信息,每次程序运行开始,就将文件中的信息加载到Head所指的链表中,退出程序的同时,删除文件,并重新写文件,以此实现数据的更新保存。
Code
#include 
#include 
#include 
#include 
using namespace std;
typedef struct {
	float ds, os, composition, net, sumScore;//分别对应数据结构、操作系统、组成原理、网络、总分
}Score;
typedef struct Stu {
	char name[10];
	char sex[2];
	int age;
	Score score;
	Stu* next;
}Stu;
Stu* Head= new Stu();
void menu();
void inputJudgeYorN(char& key);//用于判断每次是否正确输入y/n ,这里用引用,保证输入有效
void headInsertList(Stu*& node);//头插法将node添加到链表
void loadeDate();//将文件信息加载到内存
void writeDate(Stu* node);//将当前结点信息写入磁盘
void sortDate(bool flag);//将所有学生按照总分排序,采用冒泡的思想
void keyDown(int n);
void insertInfo();
void deleteInfo();
void reverseInfo();
void findInfo();
void browseInfo();
void quitProcess();//每次退出程序时,将所有的信息写入到文件,替换原来的文件
int main(int argc, char** argv) {
	int key;
	Head->next = nullptr;
	loadeDate();//每次启动程序 将外存的数据加载到内存
	while (1)
	{
		menu();
		if (scanf("%d", &key) == 1)	keyDown(key);
		else {
			do {
				printf("输入有误,请重新输入!\n");
				menu();
				system("pause");

			} while (scanf("%d", &key) != 1);
			keyDown(key);
		}
	}
	return 0;
}
void menu()
{
	printf("***************【学生信息管理系统】***************\n\n");
	printf("\t\t1、录入信息\n");
	printf("\t\t2、删除信息\n");
	printf("\t\t3、修改信息\n");
	printf("\t\t4、查找信息\n");
	printf("\t\t5、浏览信息\n");//浏览信息按照总分排名输出
	printf("\t\t0、退出系统\n");
	printf("\n***************************************************\n\n");
	printf("【提示】请输入您需要的服务对应的数字:\n");
}
void keyDown(int n)
{
	getchar();//消除缓冲区多余的回车符
	switch (n) {
	case 0:	quitProcess();
	case 1:	insertInfo();	break;
	case 2:	deleteInfo();	break;
	case 3:	reverseInfo();	break;
	case 4:	findInfo();		break;
	case 5: browseInfo();	break;
	default: printf("输入有误!按下回车,请重新输入\n");	getchar();	getchar();	system("cls");
	}
}
void insertInfo()
{
	printf("---------------【添加】---------------\n\n");
	while (1)
	{
		Stu* node = (Stu*)malloc(sizeof(Stu));
		printf("请输入姓名:\n");
		scanf("%s",node->name);
		getchar();
		printf("请输入性别:\n");
		scanf("%s", node->sex); 
		getchar();
		printf("请输入年龄:\n");
		scanf("%d", &node->age);
		printf("请输入联系方式:\n");
		printf("请输入数据结构、操作系统、组成原理、计算机网络对应得成绩(用空格隔开):\n");
		scanf("%f %f %f %f", &node->score.ds, &node->score.os, &node->score.composition, &node->score.net);
		getchar();//吸收掉多余得回车字符
		node->score.sumScore = node->score.ds + node->score.os + node->score.composition + node->score.net;
		headInsertList(node);
		printf("当前信息添加成功!\n");
		printf("是否继续添加?【y/n】\n");
		char keyTemp;
		inputJudgeYorN(keyTemp);
		if (keyTemp == 'n' || keyTemp == 'N')	break;
	}
	printf("当前服务结束!\n");
	system("pause");
	system("cls");
}
void deleteInfo()
{
	printf("---------------【删除】---------------\n\n");
	printf("请输入要删除的学生的姓名\n");
	char nameTemp[20];
	scanf("%s", nameTemp); getchar();
	Stu* p = Head;
	while (p->next)
	{
		if (strcmp(p->next->name, nameTemp) == 0)//相同返回0
		{
			Stu* temp = p->next;
			p->next = temp->next;
			free(temp);
			break;
		}
		p = p->next;
	}
	if (p->next == nullptr)	printf("没有这位同学的信息\n");
	printf("当前服务结束!\n");
	system("pause");
	system("cls");
}
void reverseInfo()
{
	printf("---------------【修改】---------------\n\n");
	printf("请输入要修改学生的姓名\n");
	Stu* pTemp = (Stu*)malloc(sizeof(Stu));
	pTemp->next = nullptr;
	scanf("%s", pTemp->name); getchar();
	Stu* p2 = Head->next, *p1 = Head;
	while (p2)
	{
		if (strcmp(p2->name, pTemp->name) == 0)//相同返回0
		{
			pTemp->next = p2->next;
			printf("请重新输入该学生的信息:\n年龄:");
			scanf("%d", &pTemp->age); getchar();
			printf("\n性别:");
			scanf("%s", pTemp->sex); getchar();
			printf("\n数据结构、操作系统、组成原理、网络各科的成绩【成绩之间用空格隔开】:\n");
			scanf("%f %f %f %f", &pTemp->score.ds, &pTemp->score.os, &pTemp->score.composition, &pTemp->score.net); getchar();
			pTemp->score.sumScore = pTemp->score.ds + pTemp->score.os + pTemp->score.composition + pTemp->score.net;
			*p2 = *pTemp;//直接赋值,替换信息
			p1->next = p2;
			break;
		}
		p1 = p2;
		p2 = p2->next;
	}
	if (p2 == nullptr)	printf("没有这位同学的信息\n");
	else printf("修改成功!\n");
	free(pTemp);
	printf("当前服务结束!\n");
	system("pause");
	system("cls");
}
void findInfo()//在文件中查找
{
	printf("---------------【查找】---------------\n\n");
	char nameTemp[20];
	printf("请输入要查找学生的姓名:");
	scanf("%s",nameTemp);
	getchar();
	Stu *p=Head->next;
	while(p)
	{
		if(strcmp(p->name,nameTemp)==0)//两串相同返回0
		{
			printf("姓名\t性别\t年龄\t数据结构\t操作系统\t组成原理\t网络\t总分\n");
			printf("%s\t%s\t%d\t%-8.2f\t%-8.2f\t%-8.2f\t%-6.2f\t%-6.2f\n",p->name,p->sex,p->age,p->score.ds,p->score.os,p->score.composition,p->score.net,p->score.sumScore);
			break;
		}
		p=p->next;
	}
	if(p==NULL){//查找失败
		printf("对不起!没有这位同学!或者这位同学的信息还未被保存在系统!\n");
	}
	printf("当前服务结束!");
	system("pause");
	system("cls");
}
void browseInfo()//将所以信息按照总分排序后输出
{
	printf("---------------【浏览】---------------\n\n");
	bool flag = true;//标记修改为,若遍历链表结束没有任何修改,排序结束;
	sortDate(flag);
	Stu* p = Head->next;
	printf("姓名\t性别\t年龄\t数据结构\t操作系统\t组成原理\t网络\t总分\n");
	while (p)
	{
		printf("%s\t%s\t%d\t%-8.2f\t%-8.2f\t%-8.2f\t%-6.2f\t%-6.2f\n", p->name, p->sex, p->age, p->score.ds, p->score.os, p->score.composition, p->score.net, p->score.sumScore);
		p = p -> next;
	}
	printf("全部信息已经列出完毕!\n");
	system("pause");
	system("cls");
}
void headInsertList(Stu*& node)//头插法添加信息到链表
{
	node->next = Head->next;
	Head->next = node;
}
void inputJudgeYorN(char& key)//用于判断每次是否正确输入y/n ,这里用引用,保证输入有效
{
	//此处,灵机一动,用递归省事
	if (scanf("%c", &key) != 1) {
		printf("输入有误!请重新输入!\n");
		inputJudgeYorN(key);
	}//保证key已经输入
	if (key != 'Y' && key != 'N' && key != 'y' && key != 'n') {
		printf("输入有误,请重新输入!\n");
		inputJudgeYorN(key);
	}//保证输入字符的合法性
	getchar();
}
void writeDate(Stu* node)//将当前结点信息写入磁盘
{
	FILE* fp = fopen("C:\\Users\\zhang\\Documents\\workspace\\visual_stdio\\stuInfosystem\\stuInfosystem\\studentsDate.txt", "a+");//a->追加
	Stu* p = Head->next;
	while (p)
	{
		if (fwrite(p, sizeof(Stu), 1, fp) == 1)//每次写入一条信息到文件中
		{
			p = p->next;
		}
		else {
			printf("保存出现了点小故障,正在重试!\n");
			writeDate(p);
		}
	}
	fclose(fp);
	printf("保存成功!\n");
}
void quitProcess()//每次退出程序时,将所有的信息写入到文件,替换原来的文件
{
	//先移除文件
	remove("C:\\Users\\zhang\\Documents\\workspace\\visual_stdio\\stuInfosystem\\stuInfosystem\\studentsDate.txt");
	writeDate(Head->next);
	printf("本次所有操作已经保存在系统中!\n欢迎下次使用!\n再见!\n");
	system("pause");
	exit(0);
}
void loadeDate()//将文件信息加载到内存
{
	FILE* fp = fopen("C:\\Users\\zhang\\Documents\\workspace\\visual_stdio\\stuInfosystem\\stuInfosystem\\studentsDate.txt", "a+");
	while (!feof(fp))
	{
		Stu* nodeTemp = (Stu*)malloc(sizeof(Stu));
		fread(nodeTemp, sizeof(Stu), 1, fp);
		headInsertList(nodeTemp);
	}
	fclose(fp);
}
void sortDate(bool flag)//将所有学生按照总分排序,采用冒泡的思想
{
	Stu* p = Head;
	Stu* p1 = Head->next;
	while (p1)
	{
		if (p1->next == nullptr)	break;//只有一个元素时候,不用排序
		else {
			Stu* p2 = p1->next;
			if (p1->score.sumScore < p2->score.sumScore)//高分到低分
			{
				//修改指针指向就ok
				p->next = p1->next;
				p1->next = p2->next;
				p2->next = p1;
				flag = false;
			}
		}
		p = p->next;
		p1 = p->next;
	}
	if (!flag)
	{
		flag = true;
		sortDate(flag);
	}
}

你可能感兴趣的:(C/C++小项目,c++)