数据结构课设——基于C开发的学生成绩管理系统(具有索引文件功能实现)

前言

大家好,我是IT桐人,本次给大家带来的分享是数据结构课设——基于C开发的学生成绩管理系统(具有索引文件功能实现)。并还具备了大大小小十几个功能,代码有千行之多,创作不易,请点赞收藏!!!

基本功能介绍

函数主体

我们首先定义了3个结构体,一个是学生主结构体(里面的变量如果有需要可以自行修改)、一个索引文件的结构体(重点)、一个链表的结构体。

#include<stdio.h>
#include<conio.h>		//_getch()
#include<stdlib.h>		//system()
#include<string.h>		//strlen()

//定义一个学生
typedef struct tagStudent {
	int  RecordNo;   //记录号
	char Name[20];	//姓名
	char Sex[4];	//性别
	int  Age;		//年龄
	int  StuNo;		//学号
	int  Score1;	//成绩1
	int  Score2;	//成绩2
	int  Score3;	//成绩3
	double avg;     //平均分
	char Professional[10];   //专业
	int pm;         //排名
}Student;

//定义索引文件结构体
typedef struct tagIndex
{
	int StuNo;            //学号    
	int RecordNo;         //记录号
	char Name[20];	     //姓名
	char Professional[10];   //专业
} Index;


//链表
//节点
typedef struct tagNode
{
	Student stu;			//学生信息
	struct tagNode* pNext;	//指向下一个节点
}Node;

//创建头节点
Node* g_pHead = NULL;		//指向头节点

基本功能

1.录入学生信息
2.打印学生信息
3.保存学生信息
4.读取学生信息
5.统计所有学生人数
6.修改学生信息
7.删除学生信息
8.查找每科的第一名
9.创建存储学生学号、姓名、专业和记录号的索引文件
10.输出索引文件
11.按学号升序进行学生信息排序
12.对学生所有科目平均分进行排名
13.通过学号查找到索引文件中对应的记录号并获取到该记录号,然后打开学生信息文件,查找到该记录号对应的学生信息并输出
14.通过专业查找到索引文件中该专业的所有记录号并获取这些记录号,并将使用这些记录号在学生信息文件中查找到的学生信息输出到屏幕
15.通过姓名查找到索引文件中对应的记录号并获取到该记录号,然后打开学生信息文件,查找到该记录号对应的学生信息并输出

1.录入学生信息

//1.录入学生信息
void InputStudent() {
	//创建一个人,在堆中分配内存
	Node* pNewNode = (Node*)malloc(sizeof(Node));
	//指针下一个指向空
	pNewNode->pNext = NULL;

	//查找链表的尾结点
	Node* p = g_pHead;
	int RO = 1;
	while (g_pHead != NULL && p->pNext != NULL)
	{
		RO++;
		p = p->pNext;
	}
	//把节点插到链表的尾节点
	if (g_pHead == NULL) {
		g_pHead = pNewNode;
		pNewNode->stu.RecordNo = 1;
	}
	else {
		p->pNext = pNewNode;
		pNewNode->stu.RecordNo = RO + 1;
	}

	//录入学生信息
	printf("请输入学生姓名:\n");
	scanf("%s", pNewNode->stu.Name, sizeof(pNewNode->stu.Name));
	printf("请输入性别:\n");
	scanf("%s", pNewNode->stu.Sex, sizeof(pNewNode->stu.Sex));
	printf("请输入学生年龄:\n");
	scanf("%d", &pNewNode->stu.Age);
	printf("请输入学号:\n");
	scanf("%d", &pNewNode->stu.StuNo);
	printf("请输入专业:\n");
	scanf("%s", pNewNode->stu.Professional, sizeof(pNewNode->stu.Professional));
	printf("请输入c成绩:\n");
	scanf("%d", &pNewNode->stu.Score1);
	printf("请输入c++成绩:\n");
	scanf("%d", &pNewNode->stu.Score2);
	printf("请输入java成绩:\n");
	scanf("%d", &pNewNode->stu.Score3);
	pNewNode->stu.avg = (pNewNode->stu.Score1 + pNewNode->stu.Score2 + pNewNode->stu.Score3) / 3;
	printf("学生信息录入成功。\n\n");
	system("pause");
	system("cls");
}

2.打印学生信息

//2.打印学生信息
void PrintStudent() {
	system("cls");
	//遍历链表
	Node* p = g_pHead;
	if (p == NULL) {
		printf("系统中暂无学生信息,请录入后再来打印查看。\n\n");
	}
	else {
		printf("                                    学生成绩管理系统                                       \n");
		printf("---------------------------------------------------------------------------------------------\n");
		printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n");
		printf("\n");
		while (p != NULL)
		{
			printf("    %3d     %4d      %5s     %3s     %3d     %6s     %3d     %3d     %3d     %6.2f   \n",
				p->stu.RecordNo,
				p->stu.StuNo,
				p->stu.Name,
				p->stu.Sex,
				p->stu.Age,
				p->stu.Professional,
				p->stu.Score1,
				p->stu.Score2,
				p->stu.Score3,
				p->stu.avg
			);
			//下一个节点
			p = p->pNext;
			printf("\n");
		}
	}
	system("pause");
	system("cls");
}

3.保存学生信息

//3.保存学生信息
void SaveStudent() {
	//打开文件
	FILE* pFile;
	pFile = fopen(".\\stuinfo.txt", "w");
	if (pFile == NULL) {
		printf("打开文件失败。\n");
		return;
	}
	//写入数据
	Node* p = g_pHead;
	while (p != NULL)
	{
		//fwrite(&p->stu, sizeof(Node), 1, pFile);
		fprintf(pFile, "    %3d     %4d      %5s     %3s     %3d     %6s     %3d     %3d     %3d     %6.2f   \n",
			p->stu.RecordNo,
			p->stu.StuNo,
			p->stu.Name,
			p->stu.Sex,
			p->stu.Age,
			p->stu.Professional,
			p->stu.Score1,
			p->stu.Score2,
			p->stu.Score3,
			p->stu.avg);
		p = p->pNext;
	}
	//关闭文件
	fclose(pFile);
	printf("数据保存成功。\n");
	system("pause");
	system("cls");
}

4.读取学生信息

//4.读取学生信息
void ReadStudent() {
	system("cls");

	//打开文件
	FILE* pFile;
	pFile = fopen(".\\stuinfo.txt", "r");

	if (pFile == NULL) {
		printf("打开文件失败。\n");
		return;
	}

	//创建一个人,在堆中分配内存
	Node* p = (Node*)malloc(sizeof(Node));
	p->pNext = NULL;
	//重新建立链表
	g_pHead = p;

	//逐个单词读入文本内容
	char str[200];
	int i = 0;
	while (fscanf(pFile, "%s", str) != EOF) {  //读文件 
		//单词不是*或者空时,进行赋值
		if (strcmp(str, "*") && str != NULL) {
			switch (i)
			{
			case 0:
				p->stu.RecordNo = atoi(str);
				break;
			case 1:
				p->stu.StuNo = atoi(str);
				break;
			case 2:
				strcpy(p->stu.Name, str);
				break;
			case 3:
				strcpy(p->stu.Sex, str);
				break;
			case 4:
				p->stu.Age = atoi(str);
				break;
			case 5:
				strcpy(p->stu.Professional, str);
				break;
			case 6:
				p->stu.Score1 = atoi(str);
				break;
			case 7:
				p->stu.Score2 = atoi(str);
				break;
			case 8:
				p->stu.Score3 = atoi(str);
				break;
			case 9:
				p->stu.avg = atoi(str);
				break;

			default:
				Node* pNewNode = (Node*)malloc(sizeof(Node));
				pNewNode->pNext = NULL;
				p->pNext = pNewNode;
				p = pNewNode;
				p->stu.RecordNo = atoi(str);
				p->stu.StuNo = atoi(str);
				i = 0;
				break;
			}
			i++;
		}
	}
	//打印读取结果
	PrintStudent();
}

5.统计所有学生人数

//5.统计所有学生人数
void CountStudent() {
	int countStu = 0;

	//遍历链表
	Node* p = g_pHead;
	while (p != NULL)
	{
		countStu++;
		p = p->pNext;
	}
	printf("学生总人数:%d\n\n", countStu);
	system("pause");
	system("cls");
}

6.修改学生信息

//6.修改学生信息
void ChangeStudent() {
	//以学号为查找示例,其他信息查找流程基本相似
	int stuNum;
	int i = 0;
	printf("请输入欲修改学生的学号:");
	scanf("%d", &stuNum);
	//遍历链表查找,查找到后进行信息显示
	Node* p = g_pHead;
	//对表头进行展示一次
	bool isShowHead = false;
	//记录是否有找到该学号的学生信息
	bool isFindStu = false;
	while (p != NULL)
	{
		if (stuNum == p->stu.StuNo) {
			if (!isShowHead) {
				printf("                                         学生成绩管理系统                               \n");
				printf("---------------------------------------------------------------------------------------------\n");
				printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n");
				isShowHead = true;
			}
			printf("    %3d     %4d      %5s     %3s     %3d     %6s     %3d     %3d     %3d     %6.2f   \n",
				p->stu.RecordNo,
				p->stu.StuNo,
				p->stu.Name,
				p->stu.Sex,
				p->stu.Age,
				p->stu.Professional,
				p->stu.Score1,
				p->stu.Score2,
				p->stu.Score3,
				p->stu.avg
			);
			//修改学生信息
			printf("请输入学生姓名:\n");
			scanf("%s", p->stu.Name, sizeof(p->stu.Name));
			printf("请输入性别:\n");
			scanf("%s", p->stu.Sex, sizeof(p->stu.Sex));
			printf("请输入学生年龄:\n");
			scanf("%d", &p->stu.Age);
			printf("请输入学号:\n");
			scanf("%d", &p->stu.StuNo);
			printf("请输入专业:\n");
			scanf("%s", p->stu.Professional, sizeof(p->stu.Professional));
			printf("请输入c成绩:\n");
			scanf("%d", &p->stu.Score1);
			printf("请输入c++成绩:\n");
			scanf("%d", &p->stu.Score2);
			printf("请输入java成绩:\n");
			scanf("%d", &p->stu.Score3);
			p->stu.avg = (p->stu.Score1 + p->stu.Score2 + p->stu.Score3) / 3;
			isFindStu = true;
			printf("---------------------------------------------------------------------------------------------\n");
			printf("学生信息修改成功,请注意及时保存。\n\n");
		}
		p = p->pNext;
	}

	if (!isFindStu) {
		printf("学号输入有误,系统中暂无该学生信息,无法进行修改。\n\n");
	}

	system("pause");
	system("cls");
}

7.删除学生信息

//7.删除学生信息
void DeleteStudent() {
	system("cls");
	int i = 0;
	//以学号为查找示例,其他信息查找流程基本相似
	int stuNum;
	printf("请输入删除学生的学号:");
	scanf("%d", &stuNum);
	//遍历链表查找,查找到后进行信息显示
	Node* p = g_pHead;
	//记录前一个节点,删除时方便操作
	Node* beforeNode = g_pHead;

	//对表头进行展示一次
	bool isShowHead = false;
	//记录是否有找到该学号的学生信息
	bool isFindStu = false;
	while (p != NULL)
	{
		if (stuNum == p->stu.StuNo) {
			if (!isShowHead) {
				printf("                                         学生成绩管理系统                               \n");
				printf("---------------------------------------------------------------------------------------------\n");
				printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n");
				isShowHead = true;
			}
			printf("\n");
			printf("    %3d     %4d      %5s     %3s     %3d     %6s     %3d     %3d     %3d     %6.2f   \n",
				p->stu.RecordNo,
				p->stu.StuNo,
				p->stu.Name,
				p->stu.Sex,
				p->stu.Age,
				p->stu.Professional,
				p->stu.Score1,
				p->stu.Score2,
				p->stu.Score3,
				p->stu.avg
			);
			isFindStu = true;

			//删除节点为头节点
			if (p == g_pHead) {
				g_pHead = p->pNext;
			}
			//删除节点为尾节点
			else if (p->pNext == NULL) {
				p = beforeNode;
				p->pNext = NULL;
			}
			//删除节点为中间节点
			else {
				beforeNode->pNext = p->pNext;
			}
			printf("\n");
			printf("删除成功,请记得保存。\n\n");
		}
		beforeNode = p;
		p = p->pNext;
	}

	if (!isFindStu) {
		printf("学号输入有误,系统中暂无该学生信息,无法进行删除操作。\n\n");
	}

	system("pause");
	system("cls");
}

8.查找每科的第一名

//8.查找每科的第一名
void FindFrist() {
	system("cls");
	int Sco1 = 0;
	int Sco2 = 0;
	int Sco3 = 0;
	char Na1[20];
	char Na2[20];
	char Na3[20];
	Node* p = g_pHead;
	while (p != NULL)
	{
		if (Sco1 < p->stu.Score1)    //通过while配合上if循环一次比较链表中的成绩
		{
			Sco1 = p->stu.Score1;       //将最高分赋值给Sco1
			strcpy(Na1, p->stu.Name);   //通过strcpy将最高分对应的学生姓名赋值给Na1
		}
		if (Sco2 < p->stu.Score2)
		{
			Sco2 = p->stu.Score2;        //将最高分赋值给Sco3
			strcpy(Na2, p->stu.Name);    //通过strcpy将最高分对应的学生姓名赋值给Na3
		}
		if (Sco3 < p->stu.Score3)
		{
			Sco3 = p->stu.Score3;        //将最高分赋值给Sco3
			strcpy(Na3, p->stu.Name);    //通过strcpy将最高分对应的学生姓名赋值给Na3
		}
		p = p->pNext;
	}
	//输出每科最高分的学生姓名和成绩
	printf("学科c的第一名是%s同学,成绩是%d分\n", Na1, Sco1);
	printf("学科c++的第一名是%s同学,成绩是%d分\n", Na2, Sco2);
	printf("学科java的第一名是%s同学,成绩是%d分\n", Na3, Sco3);
	system("pause");
	system("cls");
}

9.创建存储学生学号、姓名、专业和记录号的索引文件

重点内容!!! 通过创建索引文件并将索引结构体中的变量导入到文件中,在后面能过通过索引的记录进行数据查阅(有其他索引需求可自行修改结构体)

//9.创建存储学生学号、姓名、专业和记录号的索引文件
void CreateIndexFile()
{
	system("cls");
	//创建索引文件
	int RecordNo = 1;
	FILE* fp = fopen("index1.txt", "w");
	if (fp == NULL)
	{
		printf("创建索引文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	//遍历链表,将记录号、学号、姓名和专业写入索引文件
	Node* p = g_pHead;
	while (p != NULL)
	{
		p->stu.RecordNo = RecordNo;
		fprintf(fp, "%3d\t%3d\t%2s\t%2s\n", p->stu.RecordNo, p->stu.StuNo, p->stu.Name, p->stu.Professional);
		p = p->pNext;
		RecordNo++;
	}
	fclose(fp);
	printf("索引文件创建成功。\n\n");
	system("pause");
	system("cls");
}

10.输出索引文件

//10.输出索引文件   
void OutputIndexFile()
{
	system("cls");
	//打开索引文件
	FILE* fp = fopen("index1.txt", "r");
	if (fp == NULL)
	{
		printf("打开索引文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	//读取索引文件
	char buf[1024];
	printf("      学生成绩管理系统       \n");
	printf("-------------------------------\n");
	printf("记录号   学号   姓名    专业\n\n");
	while (fgets(buf, sizeof(buf), fp) != NULL)
	{
		printf("%s", buf);
		printf("\n");
	}
	fclose(fp);
	printf("索引文件输出成功。\n\n");
	system("pause");
	system("cls");
}

11.按学号升序进行学生信息排序

//11.按学号升序进行学生信息排序
void SortByStuNo()
{
	system("cls");

	//创建链表
	Node* p = g_pHead;
	Node* q;
	p->stu.pm = 1;
	p = p->pNext;
	//使用while循环遍历所有节点
	while (p != NULL)
	{
		q = g_pHead;
		p->stu.pm = 1;
		//将当前节点与其之前的所有节点依次进行学号的比较
		while (q != p)
		{
			//若当前节点学号更低
			if (p->stu.StuNo < q->stu.StuNo)
			{
				//若当前节点排名大于被比较节点则使其等于被比较节点的排名
				if (p->stu.pm >= q->stu.pm)
				{
					p->stu.pm = q->stu.pm;
				}
				q->stu.pm = q->stu.pm + 1;//将被比较节点的排名后移一位
			}
			//若被比较节点学号更高
			if (p->stu.StuNo > q->stu.StuNo)
			{
				//当前节点排名小于等于被比较节点时将其排名放在被比较节点后一位
				if (p->stu.pm <= q->stu.pm)
				{
					p->stu.pm = q->stu.pm + 1;
				}
			}
			q = q->pNext;
		}
		p = p->pNext;
	}
	int x = 1;
	//输出排序后的信息
	printf("                                         学生成绩管理系统                               \n");
	printf("---------------------------------------------------------------------------------------------\n");
	printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n");
	printf("\n");
	p = g_pHead;
	while (p != NULL)
	{
		q = g_pHead;
		while (q != NULL)
		{
			if (q->stu.pm == x)    //输出对应该学号的排序的学生信息
				printf("    %3d     %4d      %5s     %3s     %3d     %6s     %3d     %3d     %3d     %6.2f   \n\n",
					q->stu.RecordNo,
					q->stu.StuNo,
					q->stu.Name,
					q->stu.Sex,
					q->stu.Age,
					q->stu.Professional,
					q->stu.Score1,
					q->stu.Score2,
					q->stu.Score3,
					q->stu.avg
				);
			q = q->pNext;
		}
		x++;
		p = p->pNext;
	}
	system("pause"); //暂停
	system("cls");
}

12.对学生所有科目平均分进行排名

//12.对学生所有科目平均分进行排名
void SortAvgScore() {
	system("cls");
	Node* p = g_pHead;
	Node* q;
	p->stu.pm = 1;
	p = p->pNext;
	//使用while循环遍历所有节点
	while (p != NULL)
	{
		q = g_pHead;
		p->stu.pm = 1;
		//将当前节点与其之前的所有节点依次进行平均分的比较
		while (q != p)
		{
			//若当前节点平均分更低
			if (p->stu.avg > q->stu.avg)
			{
				//若当前节点排名大于被比较节点则使其等于被比较节点的排名
				if (p->stu.pm >= q->stu.pm)
				{
					p->stu.pm = q->stu.pm;
				}
				q->stu.pm = q->stu.pm + 1;//将被比较节点的排名后移一位
			}
			//平均分相等时则将被比较节点的排名赋给当前节点
			if (p->stu.avg == q->stu.avg)
			{
				p->stu.pm = q->stu.pm;
			}
			//若被比较节点平均分更高
			if (p->stu.avg < q->stu.avg)
			{
				//当前节点排名小于等于被比较节点时将其排名放在被比较节点后一位
				if (p->stu.pm <= q->stu.pm)
				{
					p->stu.pm = q->stu.pm + 1;
				}
			}
			q = q->pNext;
		}
		p = p->pNext;
	}
	int i = 1;
	printf("排名   姓名    平均分\n");
	p = g_pHead;
	//进行一次循环次数为学生人数的循环
	while (p != NULL)
	{
		q = g_pHead;
		//依次变量所有节点
		while (q != NULL)
		{
			if (q->stu.pm == i) //输出学生对应排名的学生姓名和平均成绩
				printf("%3d    %4s   %7.2f  \n\n", q->stu.pm, q->stu.Name, q->stu.avg);
			q = q->pNext;
		}
		i++;
		p = p->pNext;
	}
	system("pause");  //暂停
	system("cls");
}

13.通过学号查找到索引文件中对应的记录号并获取到该记录号,然后打开学生信息文件,查找到该记录号对应的学生信息并输出

//13.通过学号查找到索引文件中对应的记录号并获取到该记录号,然后打开学生信息文件,查找到该记录号对应的学生信息并输出
void FindStudent1()
{
	system("cls");
	//输入学号
	int StuNo = 0;
	printf("请输入学号:");
	scanf("%d", &StuNo);
	//打开索引文件
	FILE* fp = fopen("index1.txt", "r");
	if (fp == NULL)
	{
		printf("打开索引文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	//读取索引文件
	char buf[1024];
	while (fgets(buf, sizeof(buf), fp) != NULL)
	{
		//获取记录号
		int RecordNo = 0;
		sscanf(buf, "%d", &RecordNo);
		//获取学号
		int StuNo1 = 0;
		sscanf(buf, "%*d\t%d", &StuNo1);
		//判断学号是否匹配
		if (StuNo1 == StuNo)
		{
			//打开学生信息文件
			FILE* fp1 = fopen(".\\stuinfo.txt", "r");
			if (fp1 == NULL)
			{
				printf("打开学生信息文件失败,请检查文件名是否正确。\n\n");
				system("pause");
				system("cls");
				return;
			}
			//读取学生信息文件
			char buf1[1024];
			printf("                                         学生成绩管理系统                               \n");
			printf("---------------------------------------------------------------------------------------------\n");
			printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n\n");
			while (fgets(buf1, sizeof(buf1), fp1) != NULL)
			{
				//获取记录号
				int RecordNo1 = 0;
				sscanf(buf1, "%d", &RecordNo1);
				//判断记录号是否匹配
				if (RecordNo1 == RecordNo)
				{
					printf("%s\n", buf1);
				}
			}
			fclose(fp1);
			printf("查找成功。\n\n");
			system("pause");
			system("cls");
			return;
		}
	}
	fclose(fp);
	printf("查找失败。\n\n");
	system("pause");
	system("cls");
}

14.通过专业查找到索引文件中该专业的所有记录号并获取这些记录号,并将使用这些记录号在学生信息文件中查找到的学生信息输出到屏幕

//14.通过专业查找到索引文件中该专业的所有记录号并获取这些记录号,并将使用这些记录号在学生信息文件中查找到的学生信息输出到屏幕
void FindByProfessional() {

	system("cls");
	char Professional[20];
	printf("请输入要查找的专业:");
	scanf("%s", Professional);
	//打开索引文件
	FILE* fp = fopen("index1.txt", "r");
	if (fp == NULL)
	{
		printf("打开索引文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	char buf[1024];
	int RecordNo[100];
	int i = 0;
	//获取索引文件中要寻找专业的学生对应的记录号
	while (fgets(buf, sizeof(buf), fp) != NULL)
	{
		if (strstr(buf, Professional) != NULL)
		{
			RecordNo[i] = atoi(buf);
			i++;
		}
	}
	fclose(fp);
	//打开学生信息文件
	FILE* fp1 = fopen("stuinfo.txt", "r");
	if (fp1 == NULL)
	{
		printf("打开学生信息文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	char buf1[1024];
	int j = 0;
	printf("                                         学生成绩管理系统                               \n");
	printf("---------------------------------------------------------------------------------------------\n");
	printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n\n");
	//将先前在索引文件中获取到的记录号在学生信息文件中与其中的记录号进行对比,并输出这些记录号的所有学生信息
	while (fgets(buf1, sizeof(buf1), fp1) != NULL)
	{
		if (RecordNo[j] == atoi(buf1))
		{
			printf("%s\n", buf1);
			j++;
		}
	}
	fclose(fp1);
	printf("\n\n");
	system("pause");
	system("cls");
}

15.通过姓名查找到索引文件中对应的记录号并获取到该记录号,然后打开学生信息文件,查找到该记录号对应的学生信息并输出

//15.通过姓名查找到索引文件中对应的记录号并获取到该记录号,然后打开学生信息文件,查找到该记录号对应的学生信息并输出
void FindByName()
{
	system("cls");
	char Name[20];
	printf("请输入要查找的姓名:");
	scanf("%s", Name);
	//打开索引文件
	FILE* fp = fopen("index1.txt", "r");
	if (fp == NULL)
	{
		printf("打开索引文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	char buf[1024];
	int RecordNo[100];
	int i = 0;
	//获取索引文件中要寻找姓名的学生对应的记录号
	while (fgets(buf, sizeof(buf), fp) != NULL)
	{
		if (strstr(buf, Name) != NULL)
		{
			RecordNo[i] = atoi(buf);
			i++;
		}
	}
	fclose(fp);
	//打开学生信息文件
	FILE* fp1 = fopen("stuinfo.txt", "r");
	if (fp1 == NULL)
	{
		printf("打开学生信息文件失败,请检查文件名是否正确。\n\n");
		system("pause");
		system("cls");
		return;
	}
	char buf1[1024];
	int j = 0;
	printf("                                         学生成绩管理系统                               \n");
	printf("---------------------------------------------------------------------------------------------\n");
	printf("*  记录号  *  学号  *  姓名  *  性别  *  年龄  *  专业  *   c   *  c++  *  java  *  平均分  *\n\n");
	//将先前在索引文件中获取到的记录号在学生信息文件中与其中的记录号进行对比,并输出这些记录号的所有学生信息
	while (fgets(buf1, sizeof(buf1), fp1) != NULL)
	{
		if (RecordNo[j] == atoi(buf1))
		{
			printf("%s", buf1);
			j++;
		}
	}
	fclose(fp1);
	printf("\n\n");
	system("pause");
	system("cls");
}

小结

以上为本次桐人给大家分享的功能丰富的系统啦,如有不足,请多多指点,本作品创造不易,请多多点赞收藏,如果有需要完整源码,请访问一下链接

源码链接

本人学习平台链接

或者直接私我QQ获取 :1615703120

  • 18
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的桐谷和人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值