数据结构课程设计---学生成绩管理系统

要求 

1.使用单链表实现

2.建立学生信息链表并保存到文件中

3.按照总成绩进行排序

4.打印需要补考的学生的信息

5.合并两个成绩单到一个新的成绩单中

6.查找学生成绩(按照学号)

7.打印学生成绩单

C语言代码 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
struct student1//学生信息结构体
{
	char name[10];//姓名
	int  num;//学号
	int  grade[4];//语文 数学 英语
};
struct student2//单链表节点定义
{
	struct student1 data;//单链表数据域,用于存储学生信息。
	struct student2 *next;//指针域
};
/* struct student3
{
char name[10];//姓名
int  num;//学号
int  grade[4];//语文 数学 英语
};
struct student4//单链表节点定义
{
struct student3 data1;//单链表数据域,用于存储学生信息。
struct student3 data2;//指针域
};*/
struct student2 *creat(struct student2 *head)//建立单链表,输入学生信息
{
	struct student2 *p1, *p2;
	int a = 0, b = 1, c;
	char str1[15] = { "studenta.txt" };
	char str2[15] = { "studentb.txt" };
	char ch = ' ';
	FILE *fp;
	p1 = p2 = (struct student2*)malloc(sizeof(struct student2));//申请空间
	while (a <= 0)
	{
		printf("请输入您要输入的学生人数:");
		scanf("%d", &a);
		if (a <= 0)
			printf("输入有误,请重新输入!\n");
	}
	printf("1.studenta.txt文件\n2.studentb.txt\n");
	printf("请选择您要保存的文件:");
	scanf("%d", &c);
	{
		if (c == 1)
			fp = fopen(str1, "w+");
		else if (c == 2)
			fp = fopen(str2, "w+");
	}
	printf("请输入第%d学生的姓名:", b);
	scanf("%s", &(p1->data.name));
	fputs((p1->data.name), fp);//将字符串读入文件
	fputc(ch, fp);//向文件写入一个空格字符
	printf("请输入第%d个学生的学号:", b);
	scanf("%d", &(p1->data.num));
	fprintf(fp, "%d", (p1->data.num));
	fputc(ch, fp);
	printf("请输入第%d学生的语文成绩:", b);
	scanf("%d", &(p1->data.grade[0]));
	fprintf(fp, "%d", (p1->data.grade[0]));
	fputc(ch, fp);
	printf("请输入第%d学生的数学成绩:", b);
	scanf("%d", &(p1->data.grade[1]));
	fprintf(fp, "%d", (p1->data.grade[1]));
	fputc(ch, fp);
	printf("请输入第%d学生的英语成绩:", b);
	scanf("%d", &(p1->data.grade[2]));
	fprintf(fp, "%d", (p1->data.grade[2]));
	fputc(ch, fp);
	(p1->data.grade[3]) = ((p1->data.grade[0]) + (p1->data.grade[1]) + (p1->data.grade[2]));
	fprintf(fp, "%d", (p1->data.grade[3]));
	fprintf(fp, "\n");
	printf("%s的总成绩为:%d\n", (p1->data.name), (p1->data.grade[3]));
	b++;
	p1->next = NULL;
	while (b <= (a + 1))
	{
		if (head == NULL)
			head = p1;/*空表,接入表头*/
		else
			p2->next = p1;/*非空表,接到表尾*/
		p2 = p1;
		if (b != a + 1)
		{
			p1 = (struct student2*)malloc(sizeof(struct student2));
			printf("请输入第%d学生的姓名:", b);
			scanf("%s", &(p1->data.name));
			fputs((p1->data.name), fp);//将字符串读入文件
			fputc(ch, fp);//向文件写入一个空格
			printf("请输入第%d个学生的学号:", b);
			scanf("%d", &(p1->data.num));
			fprintf(fp, "%d", (p1->data.num));
			fputc(ch, fp);
			printf("请输入第%d学生的语文成绩:", b);
			scanf("%d", &(p1->data.grade[0]));
			fprintf(fp, "%d", (p1->data.grade[0]));
			fputc(ch, fp);
			printf("请输入第%d学生的数学成绩:", b);
			scanf("%d", &(p1->data.grade[1]));
			fprintf(fp, "%d", (p1->data.grade[1]));
			fputc(ch, fp);
			printf("请输入第%d学生的英语成绩:", b);
			scanf("%d", &(p1->data.grade[2]));
			fprintf(fp, "%d", (p1->data.grade[2]));
			fputc(ch, fp);
			(p1->data.grade[3]) = ((p1->data.grade[0]) + (p1->data.grade[1]) + (p1->data.grade[2]));
			fprintf(fp, "%d", (p1->data.grade[3]));
			fprintf(fp, "\n");
			printf("%s的总成绩为:%d\n", (p1->data.name), (p1->data.grade[3]));
			p1->next = NULL;
			b++;
		}
		else break;
	}
	fclose(fp);
	return head;
}

void printLinkList(struct student2 *head)//输出学生信息
{
	struct student2 *temp;
	temp = head;//取得链表的头指针
	printf("姓名      学号  语文 数学 英语 总分\n");
	while (temp != NULL)//只要是非空表
	{
		printf("%s          %d       %d          %d       %d        %d      \n", (temp->data.name), (temp->data.num), (temp->data.grade[0]), (temp->data.grade[1]), (temp->data.grade[2]), (temp->data.grade[3]));//输出链表节点的值
		temp = temp->next;///跟踪链表增长
	}
}

void find(struct student2 *head)
{
	int b;
	struct student2 *p;
	printf("请输入您要查找的学生的学号:");
	scanf("%d", &b);
	p = head;
	while (p != NULL)
	{
		if (b == p->data.num)
		{
			printf("%s           %d       %d          %d       %d        %d      \n", (p->data.name), (p->data.num), (p->data.grade[0]), (p->data.grade[1]), (p->data.grade[2]), (p->data.grade[3]));//输出链表节点的值
			break;
		}
		else
			p = p->next;
	}
}


void display(struct student2 *head)
{
	struct student2 *temp;
	FILE *fp;
	char ch = ' ';
	fp = fopen("student4.txt", "w+");
	temp = head;//取得链表的头指针
	printf("姓名      学号  语文 数学 英语 总分\n");
	while (temp != NULL)//只要是非空表
	{
		if (((temp->data.grade[0])<60) || ((temp->data.grade[1])<60) || ((temp->data.grade[2])<60))
		{
			printf("%s           %d       %d          %d       %d        %d      \n", (temp->data.name), (temp->data.num), (temp->data.grade[0]), (temp->data.grade[1]), (temp->data.grade[2]), (temp->data.grade[3]));//输出链表节点的值
			fputs((temp->data.name), fp);//将字符串读入文件
			fputc(ch, fp);//向文件写入一个空格

			fprintf(fp, "%d", (temp->data.num));
			fputc(ch, fp);
			fprintf(fp, "%d", (temp->data.grade[0]));
			fputc(ch, fp);
			fprintf(fp, "%d", (temp->data.grade[1]));
			fputc(ch, fp);
			fprintf(fp, "%d", (temp->data.grade[2]));
			fputc(ch, fp);
			fprintf(fp, "%d", (temp->data.grade[3]));
			fputc(ch, fp);

		}
		temp = temp->next;
	}
	fclose(fp);
}

void merge(struct student2 *head)
{
	char a, b;
	FILE *fpA = fopen("studenta.txt ", "r "); //A文件
	FILE *fpB = fopen("studentb.txt ", "r "); //B文件,两个作为输入文件,内容有序
	FILE *fpout = fopen("studnetc.txt ", "w "); //输出文件,三个文件都在当前目录下
	a = fgetc(fpA);
	b = fgetc(fpB);
	while (a != EOF && b != EOF) //循环读取并根据比较结果写文件,之后读取新的数据
	{
		if (a <b) //假设是升序,如果是降序使用 > 即可
		{
			fputc(a, fpout);
			a = fgetc(fpA);
		}
		else
		{
			fputc(b, fpout);
			b = fgetc(fpB);
		}
	}
	while (a != EOF) //继续读取没有操作的数据
	{
		fputc(a, fpout);
		a = fgetc(fpA);
	}
	while (b != EOF)
	{
		fputc(b, fpout);
		b = fgetc(fpB);
	}
	fclose(fpA);
	fclose(fpB);
	fclose(fpout);
	printf("合并成功,请在studentc文件中查看!\n");
}
void sort(struct student2 *head)
{
	struct student2 *newNode = (struct student2*)malloc(sizeof(struct student2));
	newNode->next = NULL;
	while (head)
	{
		struct student2 *current = head;
		struct student2 *pre = head;
		struct student2 *preMin = head;
		struct student2 *min = head;
		while (current)
		{
			if (current->data.grade[3] < min->data.grade[3])
			{
				preMin = pre;
				min = current;
			}
			pre = current;
			current = current->next;
		}
		if (min == head)
		{
			head = head->next;
			min->next = newNode->next;
			newNode->next = min;
		}
		else
		{
			preMin->next = min->next;
			min->next = newNode->next;
			newNode->next = min;
		}
	}
	head = newNode->next;
	free(newNode);
	newNode = head;
	while (newNode)
	{
		printf("%s %d %d %d %d %d\n",newNode->data.name,newNode->data.num,newNode->data.grade[0],newNode->data.grade[1],newNode->data.grade[2],newNode->data.grade[3]);
		newNode = newNode->next;
	}
	
}

void main()
{
	int i = 0;
	struct student2 *head = NULL;
	struct student2 *creat();
	void printLinkList();
	printf(" -------------------------------------------------\n");
	printf("|   ***欢迎使用西安工程大学学生成绩管理系统***    |\n");
	printf("|                                                 |\n");
	printf("|       1.建立学生成绩单                          |\n");
	printf("|       2.显示学生成绩单                          |\n");
	printf("|       3.查找学生成绩                            |\n");
	printf("|       4.按总成绩进行排序并显示                  |\n");
	printf("|       5.显示需要补考的学生信息并存入新文件4     |\n");
	printf("|       6.合并学生成绩单1和2存入新的成绩单3中     |\n");
	printf("|       7.退出系统                                |\n");
	printf("|                                                 |\n");
	printf(" -------------------------------------------------\n");
	while (i != 6)
	{
		printf("请选择您需要的操作:");
		scanf("%d", &i);
		if (i <= 0 || i>6)
			printf("输入有误,请重新输入!\n");
		else if (i == 1)
		{
			head = NULL;
			head = creat(head);
		}
		else if (i == 2)
			printLinkList(head);
		else if (i == 3)
			find(head);
		else if (i == 4)
			sort(head);
		else if (i == 5)
			display(head);
		else if (i == 6)
			merge(head);
		else
			printf("退出系统成功!!!\n");
	}
}

猜你喜欢

转载自blog.csdn.net/qq_47406941/article/details/111017327
今日推荐