c语言实践项目:学生成绩管理系统

目录

题目描述:

代码展示:


题目描述:

  1. 设计要求:

基本功能

  1. 添加成绩
  2. 删除成绩
  3. 查询学生成绩
  4. 查询班级成绩
  5. 退出

创新(自拟)功能:   

程序实现的其它功能由个人自拟。

  1. 设计要求具体说明

基本功能:

成绩记录簿中记录以下数据:

学号、姓名、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分;

输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:8位数字;课程编号:5位数字;成绩:0 -100 之间的整数,学分: 1- 5之间的实型数。

添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程成绩给出提示;

查询(班级或个人)成绩:

  1. 查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和已完成的总学分。
  2. 查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。

代码展示:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define SIZE 50
#define N 3
#define LEN sizeof(struct student)
struct student 
{
	char name[20]; //姓名
	int stu_num;  //学号
	int stu_score;//学分
	int less_num[N]; //课程编号
	char less_name[N][20];//课程名称。
	int score[N];  //成绩
}stu[SIZE];


void Menu();  //菜单
void inputstudent();  //添加学生
void printstudent();   //显示所有学生
void Delete();  //删除
void search_name();  //姓名查找
void search_stu_num(); //学号查找
void per_search();   //个人查找菜单
void class_search(); //查班级表//查班级表

int main()
{
	while(1)
	{
	int n;
	Menu();
	printf("请输入您要执行的操作:");
	scanf("%d",&n);
	switch(n)
	{
	case 1:inputstudent();break;        
	case 2:Delete();break;
	case 3:per_search();break;
	case 4:class_search();break;
	case 5:printstudent();break;
	case 0:exit(0);break;	
	default:printf("输入错误,没有该操作!\n");
	}
	}
	return 0;
}
void Menu()//菜单
{
	printf("****学生成绩管理系统****\n");
	printf("\n");
	printf("*       1.添加         *\n");
	printf("*       2.删除         *\n");
	printf("*       3.查学生成绩   *\n");
	printf("*       4.查单科成绩表 *\n");
	printf("*       5.显示所有学生 *\n");
	printf("*       0.退出         *\n");
	printf("************************\n");
}
void inputstudent()    //添加录入学生
{
	FILE*fp;								
		int i, n = 0,j;							//n记录学生个数
		for(i=0;i<SIZE;i++)
	{
		printf("请输入学生的信息:\n");
		printf("请输入学号(8位):");
			while(stu[i].stu_num<10000000||stu[i].stu_num>=100000000)
	{
		printf("学号不合法!请重新输入:");
		scanf("%d",&stu[i].stu_num);
	}
	scanf("%d",&stu[i].stu_num);
		printf("请输入姓名:");
	scanf("%s",stu[i].name);
	
	printf("请输入学分(1到5之间):");
	scanf("%d",&stu[i].stu_score);
	while(stu[i].stu_score<1||stu[i].stu_score>5)
	{
		printf("学分不合法!请重新输入:");
		scanf("%d",&stu[i].stu_score);
	}
	for(j=0;j<N;j++)
	{
		printf("请输入第%d门课程的编号(5位):",j+1);
		scanf("%d",&stu[i].less_num[j]);
		while(stu[i].less_num[j]<10000||stu[i].less_num[j]>=100000)
		{
			printf("编号不合法!请重新输入:");
			scanf("%d",&stu[i].less_num[j]);
		}
		printf("请输入第%d门课程的名称:",j+1);
		scanf("%s",stu[i].less_name[j]);
		printf("请输入第%d门课程的成绩:",j+1);
		scanf("%d",&stu[i].score[j]);
		while(stu[i].score[j]<0||stu[i].score[j]>100)
		{
			printf("成绩不合法!请重新输入:");
			scanf("%d",stu[i].score[j]);
		}
	}
	    printf("\n");
		printf("添加成功!");
		printf("\n\n");
		n++;
			printf("\n是否继续添加?(y/n):\n");	//选择继续添加数据还是停止添加
			if (getch() != 'y')
				break;
		}
		if ((fp = fopen("stu.txt", "a+")) == NULL)	
		{
			printf("文件操作失败\n");
			exit(0);							
		}								
		for (i = 0; i < n; i++)					
			if (fwrite(&stu[i], LEN, 1, fp) != 1)
				printf("写入文件失败\n");
		fclose(fp);
		system("cls");						
}
void printstudent()  //显示所有学生信息
{
	FILE*fp;								
		int i, n,j;
		if ((fp = fopen("stu.txt", "rb")) == NULL)	
		{
			printf("文件打开失败\n");
			exit(0);							
		}									
		i = 0;
		while (fread(&stu[i], LEN, 1, fp) != 0)		
			i++;      //n代表学生个数
		n = i;
		for (i = 0; i < n; i++)
			fread(&stu[i], LEN, 1, fp);			
		fclose(fp);
		system("cls");						
		printf("\n\t\t*************** 所有学生信息*******************\n");
		printf("\t\t姓名\t学号\t\t学分");
		for(i=0;i<N;i++)
		{
			printf("\t%s",stu[0].less_name[i]);
		}
		printf("\n");
		printf("\n\t\t************************************************\n");
		for (i = 0; i < n; i++)
		{
			printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
		for(j=0;j<N;j++)
		{
			printf("\t%d",stu[i].score[j]);
		}
		printf("\n");
		}
		printf("\n\t\t__________________按任意键继续__________________\n");
		getch();
		system("cls");					
}
void Delete()    //删除
{
	  FILE*fp;								
		int i, j, n, flag,k;
		struct student temp;
		int num;							//学号
		if ((fp = fopen("stu.txt", "rb")) == NULL)	
		{
			printf("文件打开失败!\n");
			exit(0);						
		}								
		i = 0;
		while (fread(&stu[i], LEN, 1, fp) != 0)		
			i++;
		n = i;									//记录个数
		printf("\n请输入要删除的学号:");
		scanf("%d", &num);
		flag = 1;								
		for (i = 0; i < n; i++)
		{
			if (num==stu[i].stu_num)		//查到了
			{
				for (j = i; j < n - 1; j++)			//依次向前移位
				{
					strcpy(stu[j].name, stu[j + 1].name);
					stu[j].stu_num=stu[j + 1].stu_num;
					stu[j].stu_score=stu[j + 1].stu_score;
					for(k=0;k<N;k++)
					{
					stu[j].less_num[k]=stu[j + 1].less_num[k];
					stu[j].score[k]=stu[j + 1].score[k];
					strcpy(stu[j].less_name[k], stu[j + 1].less_name[k]);
					}
				}
				flag = 0;							//标记已删除
				n--;								
			}
		}
		fp = fopen("stu.txt", "wb");				
		for (i = 0; i < n; i++)
			fwrite(&stu[i], LEN, 1, fp);			
		fclose(fp);
		if (flag == 1)							
		{
			printf("\n记录未找到!\n按任意键继续......\n\n");
			getch();						
			system("cls");					
			return;
		}
		else									
		{
			printf("\n\n删除成功!\n\n");
			printf("按任意键重新查看所有记录\n");
			getch();							
			system("cls");					
		}
		fclose(fp);
		fp = fopen("stu.txt", "rb");				
		for (i = 0; i < n; i++)						//学号从小到大冒泡排序
			for (j = i + 1; j < n; j++)
				if (stu[i].stu_num>stu[j].stu_num)
				{
					temp = stu[i];
					stu[i] = stu[j];
					stu[j] = temp;
				}
		printf("\n\t\t*************** 所有学生信息*******************\n");
		printf("\t\t姓名\t学号\t\t学分");
		for(i=0;i<N;i++)
		{
			printf("\t%s",stu[0].less_name[i]);
		}
		printf("\n");
		printf("\n\t\t************************************************\n");
		i = 0;
		while (fread(&stu[i], LEN, 1, fp) != 0)		//显示所有记录
		{
			printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
		for(j=0;j<N;j++)
		{
			printf("\t%d",stu[i].score[j]);
		}
			i++;
		}
		printf("\n\t\t***********************************************\n");
		fclose(fp);
		getch();								
		system("cls");							
}
void per_search()  //个人查找
	{
		int sel;
		system("cls");						
		do {								
			printf("\n\t\t*****************按学号或姓名查找****************\n");
			printf("\n\t\t1------------------用学号查找------------------\n");
			printf("\t\t2------------------用姓名查找------------------\n");
			printf("\t\t3------------------退出本次查找----------------\n");
			printf("\n\t\t*****************按姓名或学号查找 ***************\n");
			printf("\n请选择(1~3):\n");
			scanf("%d", &sel);					
			switch (sel)
			{
			case 1:search_stu_num(); break;		
			case 2:search_name(); break;	
			case 3:break;
			default:printf("输入有误!\n"); break;
			}
		} while (sel != 3);
		system("cls");	
	}
void search_stu_num()  //学号查找
	{
		FILE*fp;								
		int i, n,j,k;
		int num;							
		if ((fp = fopen("stu.txt", "rb")) == NULL)	
		{
			printf("文件打开失败!\n");
			exit(0);							
		}								
		i = 0;
		while (fread(&stu[i], LEN, 1, fp) != 0)		
			i++;
		n = i;									
		for (i = 0; i < n; i++)
			fread(&stu[i], LEN, 1, fp);			
		fclose(fp);
		printf("\n输入学号:");
		scanf("%d", &num);						
		for (i = 0; i < n; i++)
		{
			if (num==stu[i].stu_num)		
			{
				printf("\n\t\t***********************************************\n");
				printf("你要找的记录为:\n");
				printf("\t\t姓名\t学号\t\t学分");
		for(k=0;k<N;k++)
		{
			printf("\t%s",stu[0].less_name[k]);
		}
		printf("\n");
		printf("\n\t\t************************************************\n");
				printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
		for(j=0;j<N;j++)
		{
			printf("\t%d",stu[i].score[j]);
		}
		printf("\n");
				break;
			}								
		}
		printf("\n\t\t***********************************************\n");
		if (i == n)							
		{
			system("cls");					
			printf("\n\n\n\n\t\t未找到所需记录!\n");
			getch();
		}									
	}
void search_name()    //姓名查找
{
		FILE*fp;								
		int i, j, flag, n,k;
		char name[20];						
		if ((fp = fopen("stu.txt", "rb")) == NULL)	
		{
			printf("文件打开失败!\n");
			exit(0);						
		}									
		i = 0;
		while (fread(&stu[i], LEN, 1, fp) != 0)		
			i++;
		n = i;								
		for (i = 0; i < n; i++)
			fread(&stu[i], LEN, 1, fp);			
		fclose(fp);
		printf("\n请输入需要查找的学生姓名:");
		scanf("%s", name);					
		flag = 0;
		for (i = 0; i < n; i++)
		{
			if (strcmp(name, stu[i].name) == 0)		
			{
				printf("\n\t\t***********************************************\n");
				printf("查找的记录信息为:\n:");
				printf("\t\t姓名\t学号\t\t学分");
		for(k=0;k<N;k++)
		{
			printf("\t%s",stu[0].less_name[k]);
		}
		printf("\n");
		printf("\n\t\t************************************************\n");
					printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].stu_score);
		for(j=0;j<N;j++)
		{
			printf("\t%d",stu[i].score[j]);
		}
		printf("\n");
				flag = 1;							
			}								    
		}
		printf("\n\t\t***********************************************\n");
		if (flag != 1)								
		{
			system("cls");						
			printf("\n\n\n\n\t\t未找到所需记录!\n");
			getch();
		}									
	
}
void class_search() //查班级表
{
        FILE*fp;								
		int i,flag, n,t;
		int m=0;
		int b=0,c=0,d=0;
		float a=0,k=0; //及格人数
		float aver=0,pass;
		int sum=0;
		int less_num;						
		if ((fp = fopen("stu.txt", "rb")) == NULL)	
		{
			printf("文件打开失败!\n");
			exit(0);						
		}									
		i = 0;
		while (fread(&stu[i], LEN, 1, fp) != 0)		
			i++;
		n = i;								
		for (i = 0; i < n; i++)
			fread(&stu[i], LEN, 1, fp);			
		fclose(fp);
		printf("\n请输入需要查找的课程编号:");
		scanf("%d", &less_num);					
		flag = 0;
		for (i = 0; i < n; i++)  //统计
		{
			for(t=0;t<N;t++)
		{
			if (less_num==stu[i].less_num[t])		
			{
				sum=sum+stu[i].score[t];
				k++;
				m++;
				if(stu[i].score[t]>=60)
					a++;
				if(stu[i].score[t]>=0&&stu[i].score[t]<40)
					b++;  //0-40
				 else if(stu[i].score[t]>=40&&stu[i].score[t]<60)
					c++;  //40-60
				else if(stu[i].score[t]>=60&&stu[i].score[t]<100)
					d++;  //60-100
			}
			
		}
			aver=sum/k;
		}
		pass=a/k;
		printf("\n\t\t***********************************************\n");
		for (i = 0; i < n; i++)  //输出
		{
			for(t=0;t<N;t++)
		{
			if (less_num==stu[i].less_num[t])		
			{
				printf("\n\t\t***********************************************\n");
				printf("\t\t姓名\t学号\t\t");
				printf("%s\n",stu[i].less_name);
				printf("\t\t%s\t%d\t%d", stu[i].name, stu[i].stu_num,stu[i].score[t]);
				flag=1;
			}
		}
			
		}
		printf("\n\t\t***********************************************\n");
		printf("\n平均分:%f\n",aver);
		printf("人数:%d人\n",m);
		printf("及格率:%f\n",pass);
		printf("0-40  40-60  60-100\n");
		printf("%d人    %d人   %d人 \n",b,c,d);
		printf("\n\n\n");
		
		if (flag != 1)								
		{
			system("cls");						
			printf("\n\n\n\n\t\t未找到所需记录!\n");
			getch();
		}

}

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值