学生成绩管理系统【c语言/课程设计/期末/附源码】

最新最全版本,专治期末课程设计没思路,看不懂,0基础快速上手,复制代码可直接运行~
欢迎批评指正,不明白的地方可以留言交流!


一、程序设计目的

使用C语言编写学生成绩管理系统,一方面拓展学生在文件、结构体、指针等方面的C语言知识,另一方面使学生运用所学理论知识进行实践开发,更好的培养学生综合学习能力和实践能力。

二、运行环境

vim+gcc+gdb

三、程序功能

  1. 能够记录学生信息包括但不限于学号、姓名、性别、电话号码、C语言程序设计、计算机网络、数据结构
  2. 读写保存了学生成绩记录的文件
  3. 实现学生成绩的增删改查
  4. 实现学生总成绩的排序功能

四、思路

使用一个while循环,展示菜单,用户可以选择增删查改或者退出。利用switch选择函数,在具体的函数中实现功能。每次操作后会对文件进行读写,保存所做的修改。

五、数据结构

使用顺序表保存学生的信息:

typedef struct{
	int nstudent;
	student stu[MAX];
}*studentDB;


结构体用来存储学生的基本信息:

typedef struct {
	int id;
	char name[40];
	char sex[10];
	int number;//学号
	int c;//c语言成绩
	int web;//计算机网络成绩
	int data;//数据结构成绩
	int sum;//总分
}*student,student1;

六、读文件中的数据

执行IO主要分为三个步骤——打开文件使用fopen等函数,进行读写,关闭文件使用fclose。

FILE *fopen(const char *filename, const char *mode)
用于以按照mode模式打开filename指定的文件,检查返回值不为NULL。
int fscanf(FILE *stream, const char *format, …)
从流 stream 读取格式化输入

void read (studentDB db)
{
	FILE *fp;//文件结构指针
	fp=fopen("record.txt","r");//以只读方式打开record.txt文件
	if (fp==NULL)
	{	printf("打开失败!");
		return;
	}
		while(!feof(fp))//当到达文件末尾时停止读取
		{
			db->stu[db->nstudent]=(student)malloc(sizeof(student1));
			fscanf(fp,"%d %s %s %d %d %d %d %d ",&db->stu[db->nstudent]->id,db->stu[db->nstudent]->name,db->stu[db->nstudent]->sex,&db->stu[db->nstudent]->number,&db->stu[db->nstudent]->c,&db->stu[db->nstudent]->web,&db->stu[db->nstudent]->data,&db->stu[db->nstudent]->sum);
			db->nstudent++;
		}

		fclose(fp);//关闭文件
		printf("读入成功!\n");
}

七、排序功能

使用冒泡排序法按照总分以递减规律排序。

冒泡排序的原理:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

void sort(studentDB db)
{
	int i=0,j=0;
	student temp;
	temp=(student)malloc(sizeof(student));
		for(i=1;i<db->nstudent;i++)
			{
				for(j=0;j<db->nstudent-i;j++)//从第0个到n-i个,分别与后面一个两两比较
				{
					if (db->stu[j]->sum < db->stu[j+1]->sum)//顺序不满足递减时进行交换
					{
						temp=db->stu[j];
						db->stu[j]=db->stu[j+1];
						db->stu[j+1]=temp;
					}
				}
			}
	

八、完整源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100 
typedef struct {
	int id;
	char name[40];
	char sex[10];
	int number;//学号
	int c;//c语言成绩
	int web;//计算机网络成绩
	int data;//数据结构成绩
	int sum;//总分
}*student,student1;

typedef struct{
	int nstudent;
	student stu[MAX];
}*studentDB;

void menu();
void add(studentDB db);
void del(studentDB db);
void search(studentDB db);
void update(studentDB db);
void sort(studentDB db);
void display(studentDB db);
void read (studentDB db);
void save (studentDB db);


int main ()
{	int a;
	studentDB  db;
	db= (studentDB)malloc(sizeof(*db));
	db->nstudent=0;
	read(db);
	while(1)
	{
		menu();
		scanf("%d",&a);
		//getchar();
		switch(a)
		{
			case 1:
				add(db);
				break;
			case 2:
				del(db);
				break;
			case 3:
				search(db);
				break;
			case 4:
				update(db);
				break;
			case 5:
				display(db);
				break;
			case 6:
				sort(db);
				break;
			case 7:
				exit(0);
				break;
			default:
				printf("请输入正确选项!");
		}
	save(db);
	
	}
	return 0;
}



void menu()
{
	printf("********欢迎使用成绩管理系统********\n");
	printf("\t1.增加学生成绩\t\t\n");
	printf("\t2.删除学生成绩\t\t\n");
	printf("\t3.查找学生成绩\t\t\n");
	printf("\t4.修改学生成绩\t\t\n");
	printf("\t5.显示学生成绩\t\t\n");
	printf("\t6.按总分排列成绩\t\n");
	printf("\t7.退出系统\t\t\n");
	printf("请选择操作:\n");
}


void read (studentDB db)
{
	FILE *fp;//文件结构指针
	fp=fopen("record.txt","r");//以只读方式打开record.txt文件,要求此时必须存在此文件
	if (fp==NULL)
	{	printf("打开失败!");
		return;
	}
		while(!feof(fp))
		{
			db->stu[db->nstudent]=(student)malloc(sizeof(student1));
			fscanf(fp,"%d %s %s %d %d %d %d %d ",&db->stu[db->nstudent]->id,db->stu[db->nstudent]->name,db->stu[db->nstudent]->sex,&db->stu[db->nstudent]->number,&db->stu[db->nstudent]->c,&db->stu[db->nstudent]->web,&db->stu[db->nstudent]->data,&db->stu[db->nstudent]->sum);
			db->nstudent++;
		}

		fclose(fp);
		printf("读入成功!\n");
}

void save (studentDB db)
{
	FILE *op;
	op=fopen("record.txt","w");
	if (op==NULL){
		printf("打开失败!\n");
		return;
	}
	for(int i=0;i<db->nstudent;i++)
		{	
			fprintf(op,"%d %s %s %d %d %d %d %d\n",db->stu[i]->id,db->stu[i]->name,db->stu[i]->sex,db->stu[i]->number,db->stu[i]->c,db->stu[i]->web,db->stu[i]->data,db->stu[i]->sum);
		}
	printf("保存成功!\n");
	fclose(op);
	
}
//1.创建变量分配内存 2.输入数据 
void add(studentDB db)
{
	db->stu[db->nstudent]=(student)malloc(sizeof(student1));
	printf("学号 姓名 性别 电话 C语言 计算机网络 数据结构 总分\n");
	scanf("%d %s %s %d %d %d %d %d",&db->stu[db->nstudent]->id,db->stu[db->nstudent]->name,db->stu[db->nstudent]->sex,&db->stu[db->nstudent]->number,&db->stu[db->nstudent]->c,&db->stu[db->nstudent]->web,&db->stu[db->nstudent]->data,&db->stu[db->nstudent]->sum);
	db->nstudent++;
}


void del(studentDB db)
{	int i,j,sid;
	printf("请输入要删除的学生的学号:");
	scanf("%d",&sid);
	for(i=0;i<db->nstudent;i++)
	{
		if(sid==db->stu[i]->id)
		{
			printf("找到该学生!\n");
			db->stu[i]=db->stu[i+1];
			printf("删除成功!\n");
		}
	}
	db->nstudent--;
}

void search(studentDB db)
{
	int sid,i=0;
	printf("请输入学号查找:");
	scanf("%d",&sid);
	for(i=0;i< db->nstudent;i++)
	{
		if(sid==db->stu[i]->id)
		{
			printf("找到该学生!\n");
			printf("%d %s %s %d %d %d %d %d\n",db->stu[i]->id,db->stu[i]->name,db->stu[i]->sex,db->stu[i]->number,db->stu[i]->c,db->stu[i]->web,db->stu[i]->data,db->stu[i]->sum);
		}
	}
		
	
	
}

void update(studentDB db)
{
	int sid,i=0;
	printf("请输入要修改的学生的学号:\n");
	scanf("%d",&sid);
	for(i=0;i<db->nstudent;i++)
	{
		if(sid==db->stu[i]->id)
		{
			printf("找到该学生!\n");
			printf("请输入改后成绩:C语言 计算机网络 数据结构 总分\n");
			scanf("%d %d %d %d",&db->stu[i]->c,&db->stu[i]->web,&db->stu[i]->data,&db->stu[i]->sum);
			printf("修改成功!\n");
		}
	}
}

void sort(studentDB db)
{
	int i=0,j=0;
	student temp;
	temp=(student)malloc(sizeof(student));
		for(i=1;i<db->nstudent;i++)
			{
				for(j=0;j<db->nstudent-i;j++)
				{
					if (db->stu[j]->sum < db->stu[j+1]->sum)
					{
						temp=db->stu[j];
						db->stu[j]=db->stu[j+1];
						db->stu[j+1]=temp;
					}
				}
			}
	
	printf("排序完成!\n");
}

void display(studentDB db)
{
	int i=0;
	printf("学号 姓名 性别 电话 C语言 计算机网络 数据结构 总分\n");
	for(i=0;i< db->nstudent;i++)
	{
		printf("%d %s %s %d %d %d %d %d\n",db->stu[i]->id,db->stu[i]->name,db->stu[i]->sex,db->stu[i]->number,db->stu[i]->c,db->stu[i]->web,db->stu[i]->data,db->stu[i]->sum);
	}
	printf("已全部显示!\n");
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值