设计和完成:简单学生成绩管理信息系统

学生成绩信息包括:学号,姓名,课程名,平时成绩,实验成绩,考试成绩,总评成绩。

要求实现如下功能:

1)能够实现学生成绩信息的插入、删除和修改;
2)能够实现各种查询(分别根据学生学号、姓名、课程名称等);
3)能够实现按照考试成绩、总评成绩进行排序;
4)能够查询某门课程的最高分、最低分并输出相应学生信息;
能够查询某门课程的优秀率(90 分及以上)、不及格率;

构建结构体

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Students
{
    
    
	int num;//学号
	char name[100];//名字
	char subject[100];//科目
	float test;//平时成绩
	float shiyan;//实验成绩
	float exam;//考试成绩
	float score;//总评成绩
	struct Students* next;
};

创建单链表

struct Students *creat(int N)
{
    
    
	struct Students* head, * p1;
	int i;
	head=p1 = (struct Students*)malloc(sizeof(struct Students));
		printf("请输入学生的信息:\n");
		for (i = 1; i <= N; i++)
		{
    
    
			printf("学号:");
			scanf_s("%d",&p1->num);
			printf("姓名:");
			scanf_s("%s", p1->name, 100);
			printf("科目:");
			scanf_s("%s", p1->subject, 100);
			printf("平时成绩:");
			scanf_s("%f", &p1->test);
			printf("实验成绩:");
			scanf_s("%f", &p1->shiyan);
			printf("考试成绩:");
			scanf_s("%f", &p1->exam);
			printf("总评成绩:");
			scanf_s("%f", &p1->score);
			if (i < N)
			{
    
    
				p1->next = (struct Students*)malloc(sizeof(struct Students));
			}
			else
			{
    
    
				p1->next = NULL;
			}
			p1 = p1->next;
			printf("\n");
		}
	return head;
}

显示学生信息(参数中有学生的人数传递进来)

void print1(struct Students* head,int N)
{
    
    
	printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
	struct Students *p;
	int i;
	i = 1;
	for (p=head;p!=NULL;p=p->next)
	{
    
    
		p->num = i;
		if (i<=N)
		{
    
    
			printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
		}
		i++;
	}
}

显示学生信息(这个不需要学生人数)

void print2(struct Students* head)
{
    
    
	printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
	struct Students* p;
	for (p = head; p != NULL; p = p->next)
	{
    
    
		printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
	}
}

插入学生信息,在输入位置的后面插入

void chooseA(struct Students* head,int N)//插入学生信息,在输入位置的后面插入
{
    
    
	printf("请输入要插入的位置:\n");
	int i;
	scanf_s("%d", &i);
	struct Students* p1, * p2,*p3;
	p2=p3 = (struct Students*)malloc(sizeof(struct Students));
	if (i>N)
	{
    
    
		printf("找不到该位置!\n");
		exit(EXIT_FAILURE);
	}
	else
	{
    
    

		for (p1=head;p1!=NULL;p1=p1->next )
		{
    
    
			if (p1->num==i)
			{
    
    
				printf("名字:");
				scanf_s("%s", p2->name, 100);
				printf("课程名:");
				scanf_s("%s", p2->subject, 100);
				printf("平时成绩:");
				scanf_s("%f", &p2->test);
				printf("实验成绩:");
				scanf_s("%f", &p2->shiyan);
				printf("考试成绩:");
				scanf_s("%f", &p2->exam);
				printf("总评成绩:");
				scanf_s("%f", &p2->score);
				p3 = p1->next;
				p1->next = (struct Students*)malloc(sizeof(struct Students));
				p1->next->num = i+1;
				strcpy_s(p1->next->name, strlen(p2->name) + 1, p2->name);
				strcpy_s(p1->next->subject, strlen(p2->subject) + 1, p2->subject);
				p1->next->test = p2->test;
				p1->next->shiyan = p2->shiyan;
				p1->next->exam = p2->exam;
				p1->next->score = p2->score;
			    p1->next->next=p3;
				p3->num = i + 2;
				N++;
			}
		}
	    print1(head, N);
	}
}

删除学生信息

void chooseB(struct Students* head,int N)//删除学生信息
{
    
    
	printf("删除学生信息的学号:\n");
	int i;
	scanf_s("%d", &i);
	struct Students* p1;
	if (i>N||i<1)
	{
    
    
		printf("没有学号为%d的学生\n",i);
		exit(EXIT_FAILURE);
	}
	else if (i==1)
	{
    
    
		head = head->next;
		N--;
	}
	else
	{
    
    
		for (p1=head;p1!=NULL;p1=p1->next )
		{
    
    
			if (p1->num==i-1)//假设要删除学号为2的学生,那么就要在学号为1的链表指向学号为3
			{
    
    
				p1->next = p1->next->next;
				N--;
			}
		}
		print1(head, N);
	}
}

修改学生信息

void chooseC(struct Students* head,int N)//修改学生信息
{
    
    
	struct Students* p1;
	printf("请入要修改学生信息的学号:\n");
	int i;
	scanf_s("%d", &i);
	if (i>N)
	{
    
    
		printf("找不到学号为%d的学生!\n", i);
		exit(EXIT_FAILURE);
	}
	else
	{
    
    
		for (p1=head;p1!=NULL;p1=p1->next)
		{
    
    
			if (p1->num==i)
			{
    
    
			b: {
    
    
				printf("请输入要修改的信息:\n");
				printf("1.姓名\t2.科目\t3.平时成绩\t4.实验成绩\t5.考试成绩\t6.总评成绩\n");
				char ch;
				scanf_s(" %c", &ch);
				switch (ch)
				{
    
    
				case'1':
					printf("姓名:\t");
					scanf_s("%s", p1->name,100);
					break;
				case'2':
					printf("科目:\t");
					scanf_s("%s",p1->subject,100);
					break;
				case'3':
					printf("平时成绩:\t");
					scanf_s("%f", &p1->test);
					break;
				case'4':
					printf("实验成绩\t");
					scanf_s("%f", &p1->shiyan);
					break;
				case'5':
					printf("考试成绩\t");
					scanf_s("%f", &p1->exam);
					break;
				case'6':
					printf("总评成绩\t");
					scanf_s("%f", &p1->score);
					break;
				}
				printf("是否继续修改其他信息(是请按Y,否请按N)\n");
				char z;
				scanf_s(" %c", &z);
				if (z == 'Y')
				{
    
    
					goto b;
				}
				else
				{
    
    
					break;
				}
				}
			}
		}
	}
}

根据学号查找信息

void chooseD(struct Students* head,int N)//根据学号查找信息
{
    
    
	struct Students* p;
	printf("请输入要查找学生的学号:\n");
	int i;
	scanf_s("%d",& i);
	if (i>N)
	{
    
    
		printf("不存在学号为%d的学生!\n");
		exit(EXIT_FAILURE);
	}
	else
	{
    
    
		for (p=head;p!=NULL;p=p->next)
		{
    
    
			if (i==p->num)
			{
    
    
				printf("这位学生的信息\n");
				printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
				printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
			}
		}
	}
}

根据学生姓名查找信息

void chooseE(struct Students* head)
{
    
    
	printf("请输入要查找学生的姓名:\t");
	char name[100];
	scanf_s("%s", name,100);
	struct Students* p;
	for (p=head;p!=NULL;p=p->next)
	{
    
    
		if (strcmp(p->name,name)==0)//比较两个字符串是否一样
		{
    
    
			printf("该学生的信息:\n");
			printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
			printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
		}
	}

}

根据课程名查找学生信息

void chooseF(struct Students* head)//根据课程名查找学生信息
{
    
    
	char subject[100];
	printf("请输入要查找的课程名:\n");
	scanf_s("%s",subject, 100);
	struct Students* p;
	printf("该课程名下的学生有:\n");
	printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
	for (p=head;p!=NULL;p=p->next)
	{
    
    
		if (strcmp(p->subject,subject)==0)
		{
    
    
			printf("%d\t%s\t%s\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
		}
	}
}

按照考试成绩排序,从小到大排序

void chooseG(struct Students* head,int N)//按照考试成绩排序,从小到大排序
{
    
    
	int i;
	i = 1;
	struct Students* p,*p1,*p2;
	p1 = (struct Students*)malloc(sizeof(struct Students));
	for(p=head;i<=N;i++,p=p->next)
	{
    
    
		for(p2=p->next;p2!=NULL;p2=p2->next)
		{
    
    
			if (p->exam > p2->exam)//从小到大排序,冒泡排序
			{
    
    
				p1->exam = p->exam;
				p1->num = p->num;
				strcpy_s(p1->name, strlen(p->name) + 1, p->name);
				strcpy_s(p1->subject, strlen(p->subject)+1, p->subject);
				p1->test = p->test;
				p1->shiyan = p->shiyan;
				p1->score = p->score;

				p->exam = p2->exam;
				p->num =p2->num;
				strcpy_s(p->name, strlen(p2->name) + 1, p2->name);
				strcpy_s(p->subject, strlen(p2->subject)+1, p2->subject);
				p->test =p2->test;
				p->shiyan = p2->shiyan;
				p->score = p2->score;

				p2->exam = p1->exam;
				p2->num = p1->num;
				strcpy_s(p2->name, strlen(p1->name) + 1, p1->name);
				strcpy_s(p2->subject, strlen(p1->subject) + 1, p1->subject);
				p2->test = p1->test;
				p2->shiyan = p1->shiyan;
				p2->score = p1->score;
			}
		}
	}
}

根据总评成绩排序

void chooseH(struct Students* head,int N)//根据总评成绩排序
{
    
    
	struct Students* p, * p1,*p2;
	int i;
	i = 1;
	p1 =p2= (struct Students*)malloc(sizeof(struct Students));
	for(p=head;i<=N;i++,p=p->next)
	{
    
    
		for(p2=p->next;p2!=NULL;p2=p2->next)
		{
    
    
			if (p->score > p->next->score)//从小到大排序,冒泡排序
			{
    
    
				p1->score = p->score;
				p1->num = p->num;
				strcpy_s(p1->name, strlen(p->name) + 1, p->name);
				strcpy_s(p1->subject, strlen(p->subject) + 1, p->subject);
				p1->test = p->test;
				p1->shiyan = p->shiyan;
				p1->exam = p->exam;

				p->score =p2->score;
				p->num =p2->num;
				strcpy_s(p->name, strlen(p->next->name) + 1, p2->name);
				strcpy_s(p->subject, strlen(p->next->subject) + 1,p2->subject);
				p->test = p2->test;
				p->shiyan = p2->shiyan;
				p->exam = p2->exam;
				
				p2->score = p1->score;
				p2->num = p1->num;
				strcpy_s(p2->name, strlen(p1->name) + 1, p1->name);
				strcpy_s(p2->subject, strlen(p1->subject) + 1, p1->subject);
				p2->test = p1->test;
				p2->shiyan = p1->test;
			    p2->exam = p1->exam;
			}
		}
	}
}

查找某一门课程的最高分与最低分

void chooseI(struct Students* head)//查找某一门课程的最高分与最低分
{
    
    
	char subject1[100];
	printf("请输入要查找的课程名:\n");
	scanf_s("%s",subject1, 100);
	struct Students* p;
	int i;
	i = 0;
	int num[100];
	char name[100];
	char subject2[100];
	float test[100], shiyan[100], exam[100], score[100];
	printf("该课程名下的学生有:\n");
	printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
	for (p = head; p != NULL; p = p->next)
	{
    
    
		if (strcmp(p->subject, subject1) == 0)
		{
    
    
			printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
			num[i] = p->num;
			strcpy_s(name, strlen(p->name) + 1, p->name);
			strcpy_s(subject2, strlen(p->subject) + 1, p->subject);
			test[i] = p->test;
			shiyan[i] = p->shiyan;
			exam[i] = p->exam;
			score[i] = p->score;
			i++;//最后结束的时候,i会加一
		}
	}
	if (i==1)
	{
    
    
		printf("该课程名下只录入了一位学生,无法判断该课程的最高分,最低分!\n");
		exit(EXIT_FAILURE);
	}
	else if (i==0)
	{
    
    
		printf("没有录入与该课程相关的学生!\n");
		exit(EXIT_FAILURE);
	}
	else
	{
    
    
		
		int x,y,z1; 
		float  z2, z3, z4, z5;
		for (x=0;x<=i;x++)
		{
    
    
			for (y=x+1;y<i;y++)
			{
    
    
				if (score[x]>score[y])//冒泡排序,从小到大排序
				{
    
    
					z5 = score[x];
					z1 = num[x];
					z2 = test[x];
					z3 = shiyan[x];
					z4 = exam[x];

					score[x] = score[y];
					num[x] = num[y];
					 test[x]= test[y];
					shiyan[x] = shiyan[y];
					exam[x] = exam[y];

					score[y] = z5;
					num[y] = z1;
					test[y] = z2;
					shiyan[y] = z3;
					exam[y] = z4;
				}
			}
			struct Students* p1;
			if (x==0)
			{
    
    
				printf("该课程下总评成绩最低分的学生的信息如下:\n\n");//数组中最小的总评成绩是第一个元素
				printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
				for (p1=head;p1!=NULL;p1=p1->next)
				{
    
    
					if (p1->num==num[0])//数组中最小的元素是第一个元素,查找对应学号的学生信息
					{
    
    
						printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n\n", p1->num, p1->name, p1->subject, p1->test, p1->shiyan, p1->exam, p1->score);
					}
				}
			}
			if (x==i)
			{
    
    
				printf("该课程下总评成绩最高分的学生的信息如下:\n\n");//数组中最大的总评成绩是最后一个元素
				printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
				for (p1=head;p1!=NULL;p1=p1->next )
				{
    
    
					if (p1->num==num[i-1])//数组中最后一个元素的总评成绩是最大值,最后一个元素是第i-1个;查找对应的学号的学生信息
					{
    
    //因为上面的循环中,最后i会加上一,我们需要的是第i-1个
						printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p1->num, p1->name, p1->subject, p1->test, p1->shiyan, p1->exam, p1->score);
					}
				}
			}
		}
	}
}

查找某一课程的优秀率与不及格率

void chooseJ(struct Students* head)//查找某一课程的优秀率与不及格率
{
    
    
	char subject[100];
	printf("请输入要查找的课程名:\n");
	scanf_s("%s",subject, 100);
	struct Students* p1,*p2,*p3;
	int i; 
	float j, k;
	i =0;
	j = k = 0.00;
	for (p1 = head; p1 != NULL; p1 = p1->next)
	{
    
    
		if (strcmp(p1->subject, subject) == 0)
		{
    
    
			i++;
			if (p1->score>=90)//优秀的人数
			{
    
    
				j++;
			}
			else if (p1->score<60)//不及格的人数
			{
    
    
				k++;
			}
		}
	}
	if (i==1)
	{
    
    
		printf("该课程只录入一位学生,无法得出该课程的优秀率以及不及格率!\n");
		exit(EXIT_FAILURE);
	}
	else if (i==0)
	{
    
    
		printf("没有录入与该课程相关的学生!\n");
		exit(EXIT_FAILURE);
	}
	else
	{
    
    
		if (j != 0)
		{
    
    
			printf("该科目的优秀率为:%.2f%\n", j / i * 100.00);
		}
		else
		{
    
    
			printf("该科目的优秀率为0\n");
		}
		if (k != 0)
		{
    
    
			printf("该科目的不及格率为:%.2f%\n", k / i * 100.00);
		}
		else
		{
    
    
			printf("该科目的不及格率为0\n");
		}
	}
}

主函数

int main()
{
    
    
	struct Students* head;
	int N;
	printf("请输入要录入学生的人数:\t");
	scanf_s("%d", &N);
	head = creat(N);
	print2(head);
a: {
    
    
	printf("学生成绩管理系统\n\n");
	printf("A.插入学生信息\nB.删除学生信息\nC.修改学生信息\nD.根据学号查找学生信息\n");
	printf("E.根据学生姓名查找信息\nF.根据课程名查找信息\nG.按照考试成绩排序\n");
	printf("H.根据总评成绩进行排序\nI.查询某门课程的最高分,最低分\n");
	printf("J.查询某门课程的优秀率(90分以及90分以上)和不及格率\n");
	char ch;
	scanf_s(" %c", &ch);
	switch (ch)
	{
    
    
	case'A':
		chooseA(head, N);
		break;
	case'B':
		chooseB(head, N);
		break;
	case'C':
		chooseC(head, N);
		print2(head);
		break;
	case'D':
		chooseD(head, N);
		break;
	case'E':
		chooseE(head);
		break;
	case'F':
		chooseF(head);
		break;
	case'G':
		chooseG(head,N);
		print2(head);
		break;
	case'H':
		chooseH(head,N);
		print2(head);
		break;
	case'I':
		chooseI(head);
		break;
	case'J':
		chooseJ(head);
		break;
	default:
		break;
	}
c: {
    
    
	printf("是否继续(是请按Y,否请按N)\n");
	char choose;
	scanf_s(" %c", &choose);
	if (choose == 'Y')
	{
    
    
		goto a;
	}
	else if (choose == 'N')
	{
    
    
		return 0;
	}
	else
	{
    
    
		printf("请重新输入:\n");
		goto c;
	}
	}
	}
}

猜你喜欢

转载自blog.csdn.net/zsxbd/article/details/113097516