栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

学生管理系统(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学生管理系统(C语言)

该程序包括以下功能:

1.录入每个学生的学号、姓名和各科考试成绩

2.计算每门课程的总分和平均分

3.计算每个学生的总分和平均分

4.按每个学生的总分由高到低排出名次表

5.按每个学生的总分由低到高排出名次表

6.按学号由小到大排出成绩表

7.按姓名的字典顺序排出成绩表

8.按学号查询学生排名及其考试成绩

9.按姓名查询学生排名及其考试成绩

10.按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比

11.输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分

12.将每个学生的纪录信息写入文件

13.从文件中读出每个学生的纪录信息并显示

#include
#include
#include
#include "malloc.h"
#include 

#define   MAX_LEN  10                	   
#define   STU_NUM 30                       
#define   COURSE_NUM 6                     
#define   LEN sizeof(struct Student)

typedef struct Student
{
	long num;	                    
	char name[MAX_LEN];            	
	float score[COURSE_NUM];	    
	float sum;                      
	float aver;						
	struct Student *next;
}STU;


int   Menu(void);                                      //创建菜单
void  Print(STU *head, int n, int m);                  //打印函数
void  AverSumofEveryStudent(STU *head, int n, int m);  //计算每门课程的总分和平均分
void  AverSumofEveryCourse(STU *head, int n, int m);   //计算每个学生的总分和平均分
STU  *SortbyScore(STU *head, int n);				   //按每个学生的总分由高到低排出名次表
STU  *Creat(int n, int m);   //创建链表并录入信息
STU  *Creat1(int n, int m);
STU  *SortbyScore1(STU *head, int n);                  //按每个学生的总分由低到高排出名次表
STU  *SortbyNum(STU *head);                            //按学号由小到大排出成绩表
STU  *SortbyName(STU *head, int n);                    //按姓名的字典顺序排出成绩表
void  SearchbyNum(STU *head, int n, int m);            //按学号查询学生排名及其考试成绩
void  SearchbyName(STU *head, int n, int m);           //按姓名查询学生排名及其考试成绩
void  StatisticAnalysis(STU *head, int n, int m);      //按类别及比例输出
void  WritetoFile(STU *head, int n, int m);            //将每个学生的纪录信息写入文件
STU  *ReadfromFile(STU *head, int *n, int *m);         //从文件中读出每个学生的纪录信息并显示

int main()
{
	int n, m;
	int i;
	STU *head;  //定义头节点
	head = (STU *)malloc(LEN);
	while (1)
	{
		i = Menu();
		if (i == 1)
		{
			system("cls");  //清屏
			printf("ttt******************************************************************************n");
			printf("tttInput student number(n<30):n"); //输入学生数
			printf("ttt");
			scanf("%d", &n);
			printf("tttInput course number(m<=6):n");
			printf("ttt");
			scanf("%d", &m);
		}
		switch (i)
		{
		case 1:
			printf("tttInput student's ID, name and score:n");
			head = Creat(n, m);
			system("cls");  //清屏
			break;
		case 2:
			system("cls");  //清屏
			AverSumofEveryStudent(head, n, m);
			break;
		case 3:
			system("cls");  //清屏
			AverSumofEveryCourse(head, n, m);
			break;
		case 4:
			system("cls");  //清屏
			printf("nnn");
			printf("tttSort in ascending order by score:n");
			head = SortbyScore(head, n);
			Print(head, n, m);
			break;
		case 5:
			system("cls");  //清屏
			printf("nnn");
			printf("tttSort in ascending order by score:n");
			head = SortbyScore1(head, n);
			Print(head, n, m);
			break;
		case 6:
			system("cls");  //清屏
			printf("nnn");
			printf("tttSort in ascending order by number:n");
			head = SortbyNum(head);
			Print(head, n, m);
			break;
		case 7:
			system("cls");  //清屏
			printf("nnn");
			printf("tttSort in dictionary order by name:n");
			head = SortbyName(head, n);
			Print(head, n, m);
			break;
		case 8:
			system("cls");  //清屏
			printf("nnn");
			printf("ttt******************************************************************************n");
			printf("tttInput the number you want to search:n");
			SearchbyNum(head, n, m);
			break;
		case 9:
			system("cls");  //清屏
			printf("nnn");
			printf("ttt******************************************************************************n");
			printf("tttInput the name you want to search:n");
			SearchbyName(head, n, m);
			break;
		case 10:
			system("cls");  //清屏
			StatisticAnalysis(head, n, m);
			break;
		case 11:
			system("cls");  //清屏
			printf("nnn");
			Print(head, n, m);
			break;
		case 12:
			system("cls");  //清屏
			WritetoFile(head, n, m);
			break;
		case 13:
			system("cls");  //清屏
			head = ReadfromFile(head, &n, &m);
			break;
		case 0:
			system("cls");  //清屏
			printf("nnn");
			printf("ttt******************************************************************************n");
			printf("tttEnd of program!n");
			printf("ttt******************************************************************************n");
			return 0;
		default:
			system("cls");  //清屏
			printf("nnn");
			printf("ttt******************************************************************************n");
			printf("tttInput error!n");
			printf("ttt******************************************************************************n");

		}

	}

	return 0;


}
// 创建菜单
int   Menu(void)
{
	int i;
	system("title 学生成绩管理系统V7.0  By wyxiang");
	printf("nn");
	printf("ttt                         学生成绩管理系统V7.0n");
	printf("ttt******************************************************************************n");
	printf("ttt*                Management for Students' scores                             *n");
	printf("ttt*                1.  Input record                                            *n");
	printf("ttt*                2.  Caculate total and average score of every course        *n");
	printf("ttt*                3.  Caculate total and average score of every student       *n");
	printf("ttt*                4.  Sort in descending order by score                       *n");
	printf("ttt*                5.  Sort in ascending order by score                        *n");
	printf("ttt*                6.  Sort in ascending order by number                       *n");
	printf("ttt*                7.  Sort in dictionary order by name                        *n");
	printf("ttt*                8.  Search by number                                        *n");
	printf("ttt*                9.  Search by name                                          *n");
	printf("ttt*                10. Statistic analysis                                      *n");
	printf("ttt*                11. List record                                             *n");
	printf("ttt*                12. Write to a file                                         *n");
	printf("ttt*                13. Read from a file                                        *n");
	printf("ttt*                0.  Exit                                                    *n");
	printf("ttt******************************************************************************n");
	printf("n");
	printf("n");
	printf("n");
	printf("n");
	printf("ttt*****************Please Input your choice:");
	scanf("%d", &i);
	return i;

}

// 创建链表
STU *Creat(int n, int m) {
	STU *head;
	STU *p1, *p2;
	int i, j;
	// system("cls");
	for (i = 1; inum);
		printf("ttt");
		scanf("%s", p1->name);
		for (j = 0; jscore[j]);
		}
		p1->next = NULL;
		if (i == 1)
		{
			head = p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	}
	return(head);
}

STU *Creat1(int n, int m)
{
	STU *head;
	STU *p1, *p2;
	int i, j;
	// system("cls");
	for (i = 1; inext = NULL;
		if (i == 1)
		{
			head = p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	}
	return(head);
}
void  AverSumofEveryStudent(STU *head, int n, int m)
{
	STU *p;
	int i, j = 1;
	char ch;
	float sum;
	p = head;
	if (head != NULL)
	{
		printf("ttt******************************************************************************n");
		for (i = 0; iscore[i];
				p = p->next;
			} while (p != NULL);

			printf("tttcourse %d:    sum=%.0f , aver=%.0fn", j, sum, sum / n);
			j++;
		}
		printf("ttt******************************************************************************n");

	}
}

void  AverSumofEveryCourse(STU *head, int n, int m)
{
	STU *p;
	int i, j;
	p = head;
	if (head != NULL)
	{
		printf("nnn");
		printf("ttt******************************************************************************n");
		for (i = 0; isum = 0.0;
			for (j = 0; jsum += p->score[j];
			}
			p->aver = p->sum / m;
			printf("tttstudent %d:    sum=%.0f , aver=%.0fn", i + 1, p->sum, p->aver);
			p = p->next;
		}
		printf("ttt******************************************************************************n");
	}
}

STU  *SortbyScore(STU *head, int n)
{
	STU *endpt;    //控制循环比较
	STU *p;        //临时指针变量
	STU *p1, *p2;

	p1 = (STU *)malloc(LEN);
	p1->next = head;        //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址
	head = p1;                 //让head指向p1节点,排序完成后,我们再把p1节点释放掉

	for (endpt = NULL; endpt != head; endpt = p)
	{
		for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
		{
			if (p1->next->sum < p1->next->next->sum)  //如果前面的节点键值比后面节点的键值大,则交换
			{
				p2 = p1->next->next;
				p1->next->next = p2->next;
				p2->next = p1->next;
				p1->next = p2;
				p = p1->next->next;
			}
		}
	}

	p1 = head;              //把p1的信息去掉
	head = head->next;       //让head指向排序后的第一个节点
	free(p1);          //释放p1
	p1 = NULL;          //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量

	return head;
}

STU  *SortbyScore1(STU *head, int n)
{
	STU *endpt;    //控制循环比较
	STU *p;        //临时指针变量
	STU *p1, *p2;

	p1 = (STU *)malloc(LEN);
	p1->next = head;        //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址
	head = p1;                 //让head指向p1节点,排序完成后,我们再把p1节点释放掉

	for (endpt = NULL; endpt != head; endpt = p)
	{
		for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
		{
			if (p1->next->sum > p1->next->next->sum)  //如果前面的节点键值比后面节点的键值大,则交换
			{
				p2 = p1->next->next;
				p1->next->next = p2->next;
				p2->next = p1->next;
				p1->next = p2;
				p = p1->next->next;
			}
		}
	}

	p1 = head;              //把p1的信息去掉
	head = head->next;       //让head指向排序后的第一个节点
	free(p1);          //释放p1
	p1 = NULL;          //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量

	return head;
}

STU *SortbyNum(STU *head)
{
	STU *first;    //为原链表剩下用于直接插入排序的节点头指针
	STU *t;        //临时指针变量:插入节点
	STU *p, *q;     //临时指针变量

	first = head->next;      //原链表剩下用于直接插入排序的节点链表:可根据图12来理解
	head->next = NULL;       //只含有一个节点的链表的有序链表:可根据图11来理解

	while (first != NULL)        //遍历剩下无序的链表
	{
		//注意:这里for语句就是体现直接插入排序思想的地方
		for (t = first, q = head; ((q != NULL) && (q->num < t->num)); p = q, q = q->next);  //无序节点在有序链表中找插入的位置

		first = first->next; //无序链表中的节点离开,以便它插入到有序链表中

		if (q == head)      //插在第一个节点之前
		{
			head = t;
		}
		else            //p是q的前驱
		{
			p->next = t;
		}
		t->next = q;     //完成插入动作
						 //first = first->next;
	}
	return head;
}

STU  *SortbyName(STU *head, int n)
{
	STU *endpt;    //控制循环比较
	STU *p;        //临时指针变量
	STU *p1, *p2;

	p1 = (STU *)malloc(LEN);
	p1->next = head;        //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址
	head = p1;                 //让head指向p1节点,排序完成后,我们再把p1节点释放掉

	for (endpt = NULL; endpt != head; endpt = p)
	{
		for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
		{
			if (strcmp(p1->next->name, p1->next->next->name)>0)  //如果前面的节点键值比后面节点的键值大,则交换
			{
				p2 = p1->next->next;
				p1->next->next = p2->next;
				p2->next = p1->next;
				p1->next = p2;     //结合第4点理解
				p = p1->next->next;   //结合第6点理解
			}
		}
	}

	p1 = head;              //把p1的信息去掉
	head = head->next;       //让head指向排序后的第一个节点
	free(p1);          //释放p1
	p1 = NULL;          //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量

	return head;
}


void Print(STU *head, int n, int m)
{
	STU *p;
	int i;
	p = head;

	if (head != NULL)        //只要不是空链表,就输出链表中所有节点
	{
		printf("ttt******************************************************************************n");
		do
		{

			printf("ttt%ldt%st", p->num, p->name);
			for (i = 0; iscore[i]);
			}
			printf("%.0ft%.0fn", p->sum, p->sum / m);
			p = p->next;     //移到下一个节点
		} while (p != NULL);
		printf("ttt******************************************************************************n");
	}
}

void  SearchbyNum(STU *head, int n, int m)
{
	long num;
	int i;
	int flag = 1;
	printf("ttt");
	scanf("%ld", &num);
	STU *p;
	p = head;
	if (head != NULL)
	{
		do {
			if (p->num == num)
			{
				printf("ttt");
				printf("%ldt%st", p->num, p->name);
				for (i = 0; iscore[i]);
				}
				printf("%.0ft%.0fn", p->sum, p->sum / m);
				flag = 0;

			}
			p = p->next;

		} while (p != NULL);
		if (flag)
		{
			printf("ttt");
			printf("Not found!n");
		}
	}
	printf("ttt******************************************************************************n");

}

void  SearchbyName(STU *head, int n, int m)
{
	char name[MAX_LEN];
	int i;
	int flag = 1;
	printf("ttt");
	scanf("%s", name);
	STU *p;
	p = head;
	if (head != NULL)
	{
		do {
			if (strcmp(name, p->name) == 0)
			{
				printf("ttt");
				printf("%ldt%st", p->num, p->name);
				for (i = 0; iscore[i]);
				}
				printf("%.0ft%.0fn", p->sum, p->sum / m);
				flag = 0;
			}
			p = p->next;

		} while (p != NULL);
		if (flag)
		{
			printf("ttt");
			printf("Not found!n");
		}
	}
	printf("ttt******************************************************************************n");

}

void  StatisticAnalysis(STU *head, int n, int m)
{
	int a[6];
	STU *p;
	p = head;
	int i, j;
	for (i = 0; iscore[i]<60)
			{
				a[0]++;
			}
			else if (p->score[i]<70)
			{
				a[1]++;
			}
			else if (p->score[i]<80)
			{
				a[2]++;
			}
			else if (p->score[i]<90)
			{
				a[3]++;
			}
			else if (p->score[i]<100)
			{
				a[4]++;
			}
			else
			{
				a[5]++;
			}

			p = p->next;

		} while (p != NULL);
		printf("nnn");
		printf("ttt******************************************************************************n");
		printf("ttt* For course %d:n", i + 1);
		printf("ttt* <60t%dt%.2f%%n", a[0], 100 * a[0] / 6.0);
		printf("ttt* %d-%dt%dt%.2f%%n", 60, 69, a[1], 100 * a[1] / 6.0);
		printf("ttt* %d-%dt%dt%.2f%%n", 70, 79, a[2], 100 * a[2] / 6.0);
		printf("ttt* %d-%dt%dt%.2f%%n", 80, 89, a[3], 100 * a[3] / 6.0);
		printf("ttt* %d-%dt%dt%.2f%%n", 90, 99, a[4], 100 * a[4] / 6.0);
		printf("ttt* %dt%dt%.2f%%n", 100, a[5], 100 * a[5] / 6.0);
		printf("ttt******************************************************************************n");

	}
}

void  WritetoFile(STU *head, int n, int m)
{
	STU *p;
	p = head;
	FILE *fp;
	int i, j;
	printf("nnn");
	printf("ttt******************************************************************************n");
	if ((fp = fopen("student.txt", "w")) == NULL)
	{
		printf("tttFail to open student.txtn");
		return;
	}
	fprintf(fp, "%dt%dn", n, m);
	for (i = 0; inum, p->name);
		for (j = 0; jscore[j]);
		}
		fprintf(fp, "%12.0f%12.0fn", p->sum, p->sum / m);

		p = p->next;
	}
	printf("tttExport Successfully!n");
	fclose(fp);
	printf("ttt******************************************************************************n");

}



//这里用了直接生成了一个新的链表,确保可以直接读取存好的数据
STU *ReadfromFile(STU *head, int *n, int *m)
{
	STU *p;
	FILE *fp;
	int i, j;
	if ((fp = fopen("student.txt", "r")) == NULL)
	{
		printf("tttFail to open student.txtn");
		return NULL;
	}
	fscanf(fp, "%dt%dn", n, m);
	head = Creat1(*n, *m);  //创建了一个空链表,并且赋给head
	p = head;
	for (i = 0; i<*n; i++)
	{
		fscanf(fp, "%12ld", &p->num);
		fscanf(fp, "%12s", &p->name);
		for (j = 0; j<*m; j++)
		{
			fscanf(fp, "%12f", &p->score[j]);
		}
		fscanf(fp, "%12f%12f", &p->sum, &p->aver);

		p = p->next;

	}
	i = *n;
	j = *m;
	printf("tttimport Successfully!n");
	fclose(fp);

	Print(head, i, j);

	return head;
}

 注意各个功能的实现,拿来练手最合适不过。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429489.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号