C语言:程序设计综合训练

综合实验二:学生成绩管理系统

1、要求

(一)程序运行时,首先显示主菜单如下:

  1. 新建数据
  2. 添加数据
  3. 删除数据
  4. 排序
  5. 查询
  6. 退出

屏幕提示:请输入序号选择相应操作。
要求当用户输入任一序号后,程序都能进行相应操作。

(二)在主菜单中选择序号4,弹出子菜单选择排序方式,子菜单如下:

  1. 数学成绩排序
  2. 程序设计成绩排序
  3. 总分排序。
  4. 返回主菜单

请按序号选择相应操作。
选择子菜单的序号后,程序能正确运行并在屏幕上显示按要求排序后的相关信息。
(三)在主菜单中选择序号5,弹出子菜单选择查询方式,子菜单如下:

  1. 学号查询
  2. 姓名查询
  3. 数学成绩查询
  4. 程序设计成绩查询
  5. 总分查询
  6. 返回主菜单

请按序号选择相应操作。

在子菜单中选择序号后,程序按以下方式工作:

1)学号查询:输入学号后,若该学号存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:查询到满足条件的结果后,查询即可结束)
2)姓名查询:输入姓名后,若该姓名存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:使用字符串比较函数进行比较)
3)按科目查询:输入指定分数,程序运行后显示该科目中考试成绩大于等于指定分数的同学的学号、姓名以及该科成绩并统计满足条件的人数;
4)总分查询:输入指定分数,程序运行后显示总分成绩大于等于指定分数的同学的学号、姓名以及各科成绩并统计满足条件的人数。

2、代码

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
   
	long int ID;// 学号
	char Name[50];// 姓名
	int Math;// 数学成绩
	int C;// 程序设计成绩
	int Score;// 总分

	struct Node* next;// 指针域
}node;

node list;// 链表

// 读取文件
int Read_FILE(node* L);

// 保存文件
int  Save_FILE(node* L);

// 主菜单界面
void welcome();

// 新建学生信息
void Build(node* L);

// 增加学生信息
void Add(node* L, node e);// 功能
void Add_Printf();// 界面

// 删除学生信息
void Delete_Printf(node* L);// 界面
void Delete(node* s);// 功能

// 排序学生信息
void Sort(node* L);
void Print(node* L);// 输出学生信息
void Print_Printf();// 界面
bool cmp_big_Math(node e1, node e2);// 数学成绩从大到小
bool cmp_small_Math(node e1, node e2);// 数学成绩从小到大
bool cmp_big_C(node e1, node e2);// 程序设计成绩从大到小
bool cmp_small_C(node e1, node e2);// 程序设计成绩从小到大
bool cmp_big_Score(node e1, node e2);// 成绩从大到小
bool cmp_small_Score(node e1, node e2);// 成绩从小到大

// 查询学生信息
void Search_Printf(node* L);// 界面
node* Search_id(int id, node* L);// 按学号进行查找
node* Search_name(char name[], node* L);// 按姓名进行查找
void Search_math(int math, node* L);// 按数学成绩进行查找
void Search_c(int c, node* L);// 按程序设计成绩进行查找
void Search_score(int score, node* L);// 按总分进行查找

// 退出管理系统
void goodbye();

int main()
{
   
	int choice = 0;
	Read_FILE(&list);
	while (true)
	{
   
		welcome();
		scanf("%d", &choice);
		switch (choice)
		{
   
		case 1:// 新建学生信息
			Build(&list);
			break;
		case 2:// 增加学生信息
			Add_Printf();
			break;
		case 3:// 删除学生信息
			Delete_Printf(&list);
			break;
		case 4:// 排序学生信息
			Sort(&list);
			break;
		case 5:// 查询学生信息
			Search_Printf(&list);
			break;
		case 6:// 退出管理系统
			goodbye();
			break;
		}
		printf("是否需要继续操作?(Yes:1 / No:0):");
		scanf("%d", &choice);
		if (choice == 0)
		{
   
			break;
		}
	}
	return 0;
}

void welcome()
{
   
	system("cls");
	printf("****************************************************************\n");
	printf("***********             学生成绩管理系统             ***********\n");
	printf("***********          1 ---- 新建学生信息             ***********\n");
	printf("***********          2 ---- 增加学生信息             ***********\n");
	printf("***********          3 ---- 删除学生信息             ***********\n");
	printf("***********          4 ---- 排序学生信息             ***********\n");
	printf("***********          5 ---- 查询学生信息             ***********\n");
	printf("***********          6 ---- 退出管理系统             ***********\n");
	printf("****************************************************************\n");

	printf("请选择想要实现的功能(数字):");
}

// 读取文件
int Read_FILE(node* L)
{
   
	FILE* pfRead = fopen("student_information.txt", "r");
	node st;
	node* s;
	node* t = L;

	if (pfRead == NULL)
	{
   
		return 0;
	}

	while (fscanf(pfRead, "%ld %s %d %d %d", &st.ID, st.Name, &st.Math, &st.C, &st.Score) != EOF)
	{
   
		s = (node*)malloc(sizeof(node));

		*s = st;

		// 尾插法
		t->next = s;
		t = s;
		t->next = NULL;
	}

	return 1;
}

// 保存文件
int Save_FILE(node* L)
{
   
	FILE* pfWrite = fopen("student_information.txt", "w");
	if (pfWrite == NULL)
	{
   
		return 0;
	}

	node* p = L->next;

	while (p != NULL)
	{
   
		fprintf(pfWrite, " %ld %s %d %d %d\n", p->ID, p->Name, p->Math, p->C, p->Score);
		p = p->next;
	}

	return 1;
}

// 新建学生信息
void Build(node* L)
{
   
	node* p, * q;
	p = L->next;
	while (p != NULL) {
   
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
	printf("新建成功!\n");
}

// 增加学生信息
void Add_Printf()
{
   
	system("cls");
	node st;
	printf("请输入新增学生的相关信息:\n");
	printf("学号:");
	scanf("%ld", &st.ID);
	printf("姓名:");
	scanf("%s", st.Name);
	printf("数学成绩:");
	scanf("%d", &st.Math);
	printf("程序设计成绩:");
	scanf("%d", &st.C);
	st.Score = st.Math + st.C;

	Add(&list, st);
}

void Add(node* L, node e)
{
   
	// 头插法
	node* p = L;
	node* s = (node*)malloc(sizeof(node));
	*s = e;

	s->next = p->next;
	p->next = s;

	Save_FILE(L);
}

// 删除学生信息
void Delete_Printf(node* L)
{
   
	system("cls");
	long int id;

	node* p;

	printf("请输入要删除的学生的学号:");
	scanf("%ld", &id);
	node* st = Search_id(id, L);
	p = st;

	if (st == NULL)
	{
   
		printf("查无此人!\n");
		return;
	}

	st = st->next;
	printf("________________________________________________________\n");
	printf("|学号\t|姓名\t|数学成绩\t|程序设计成绩\t|总分\t|\n");
	printf("________________________________________________________\n");
	printf("%ld|%s\t|%d\t\t|%d\t\t|%d\t|\n", st->ID, st->Name, st->Math, st->C, st->Score);
	printf("________________________________________________________\n");

	Delete(p);
	// 保存信息
	Save_FILE(L);
}

void Delete(node* s)
{
   
	node* t = s->next;

	s->next = t->next;
	t->next = NULL;

	free(t);
}

// 排序学生信息
void Sort(node* L)
{
   
	while (1)
	{
   
		system("cls");
		int choice1 = 0, choice2 = 0;
		printf("按照数学成绩排序     ---- 1\n");
		printf("按照程序设计成绩排序 ---- 2\n");
		printf("按照总分排序         ---- 3\n");
		printf("返回主菜单           ---- 4\n");
		printf("请选择排序方式:");
		scanf("%d", &choice1);

		system("cls");

		if (choice1 == 1 || choice1 == 2 || choice1 == 3)
		{
   
			printf("从大到小排序 ---- 1\n");
			printf("从小到大排序 ---- 2\n");
			printf("请选择排序方式:");
			scanf("%d", &choice2);
		}

		int flag = 0;
		for (node* p = L->next; p != NULL; p = p->next)
		{
   
			for (node* q = p; q != NULL; q = q->next)
			{
   
				switch (choice1)
				{
   
				case 1:
					if (choice2 == 1) 
					{
   
						if (!cmp_big_Math(*p, *q))
						{
   
							flag = 1;
						}
					}
					else if (choice2 == 2)
					{
   
						if (!cmp_small_Math(*p, *q))
						{
   
							flag = 1;
						}
					}
					break;
				case 2:
					if (choice2 == 1) 
					{
   
						if (!cmp_big_C(*p, *q))
						{
   
							flag = 1;
						}
					}
					else if (choice2 == 2)
					{
   
						if (!cmp_small_C(*p, *q
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WE-ubytt

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

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

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

打赏作者

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

抵扣说明:

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

余额充值