C语言学生教务管理系统结构体数组版本,跟着前面的项目做完之后可以看看最后的链表版本,也包括文件操作

对于刚学完C的小伙伴来说,做一个学生教务管理系统肯定是一个不错的巩固项目,废话不多说,直接上代码

第一步来写一个main()方法

int main()
{
    //这是一个清屏函数可以把黑窗口上面的内容全部清除掉
	system("cls");
    //这是我定义的菜单函数,记住这是一个菜单就可以了
	display();
    //定义一个字符型变量,来进行选择,其实用整形更好
    //用字符型输入会因为可以形成一个问题可以让我们巩固,具体什么问题呢,接下来在告诉你们
	char a;
    //输出提示信息,对a进行输入,然后用switch来进行选择
	printf("第一次使用请先选1增加学生信息:");
	scanf("%c",&a);
    //循环,条件为1是为了保证程序可以一直运行下去
	while(1)
	{
        //下面对a进行判断,然后来执行各种方法:后面的都是对应的方法
		switch(a)
		{
			case '0':break;
			case '1':addstudent();break;
			case '2':aver_score();break;
			case '3':print_();break;
			case '4':sort();break;
			case '5':seek();break;
			case '6':del();break;
			case '7':all_score();break;
		}
        //判断a是否等于零,来判断是否结束程序
		if(a=='0')
		{
			printf("即将退出程序!");
			break;
		}
		printf("请输入你的选择:");
        //fflush(stdin),这个是清楚缓冲区的函数,因为我们输出数据的时候,总是会有一个回车键
        //留在缓冲区里面,所以我们呢需要借助这个函数来清除一下,不然的话或导致莫名奇妙执行下一步       
        // 的操作
		fflush(stdin);
		scanf("%c",&a);
	}
	return 0;
}

接着定义结构体,初始化四个变量,然后我们每次运行程序的时候就可以直接对这四个成员信息进行操作,不用我们每次操作都需要输入学生信息,这样很麻烦,这些都是全局变量,包括后面的num是为了统计总人数的

struct student
{
	char ID[20];
	char name[20];
	int eng,math,C;
    float ave;
};
struct student stu[1000]={{"0","甲",89,89,98},{"1","乙",98,78,77},{"2","丙",89,87,77},{"3","丁",88,89,98}}; 
int num=4;

下一步就是对每一个函数的实现了

注意:我们把函数都写得主函数前面这样就可以不用对函数进行声明,省去很多麻烦的函数声明过程

首先我们来看菜单函数


void display()
{
	printf("                                         *欢迎使用学生成绩管理系统*              \n");
	printf("\n");
	printf("************************************************************************************************************************\n");
	printf("\n");
	printf("*                      请用户根据以下提示进行操作(温馨提示:请在成绩录入后再使用其它功能)                              *\n");
	printf("\n");
	printf("************************************************************************************************************************\n");
	printf("\n");
	printf("                                      0.退出系统             1.信息录入      \n\n");
	printf("                                      2.计算平均成绩         3.查看所有学生信息\n\n");
	printf("                                      4.排序                 5.学生查找      \n\n");
	printf("                                      6.删除学生信息         7.修改学生信息  \n\n");
	printf("************************************************************************************************************************\n");
	printf("\n");
	printf("                                               *如需退出系统请按0*                                      \n");
}

这个菜单可以自己根据自己的想法来设计的,然后我们就要对整个程序最主要的函数进行实现了

信息录入功能的实现,也就是添加学生函数的实现


void addstudent()
{
    //这个地方一样,定义一个变量对这个变量进行选择
	char ch;
    //清屏,输出菜单函数
	system("cls");
	display();
	printf("退出请按n");
	printf("\n按任意键继续,请输入你的选择:");
    //清空之前输入留下的空格键,或者输出很多的数据造成溢出的那些数据,最好是在每一个scanf函数前面都加一个
	fflush(stdin);
	scanf("%c",&ch);
	switch(ch)
	{
        //输出n可以结束掉这个函数,比如不想继续了,就直接结束掉
		case 'n':break;
		default :
		while(1)
		{
			int x=0;
			int i;
			printf("请输入姓名:");
            //接下来的输入与输出,有些前面带了取地址符&有的没有带,你们知道是为什么嘛?
            //是因为结构体声明时,这些声明的是一个字符型数组,数组名本身就是一个地址
            //所以不需要带取地址符号
			scanf("%s",stu[num].name);
			printf("请输入学号:");
			scanf("%s",stu[num].ID);
			for(i=0;i<num;i++)
			{
                //遍历,看看有没有学号冲突的
				if(strcmp(stu[i].ID,stu[num].ID)==0) 
				{
					x++;
					break;
				}
			}
			if(x!=0)
			{
				printf("该学号学生信息已存在,需要重新输入信息!");
			}
 			else
 			{
 				printf("请输入英语成绩:");
				scanf("%d",&stu[num].eng);
				printf("请输入数学成绩:");
				scanf("%d",&stu[num].math);
				printf("请输入C成绩:");
				scanf("%d",&stu[num].C);
				stu[num].ave=(stu[num].eng+stu[num].math+stu[num].C)/3.0;
				num++;
			}
			printf("如果要退出,请按n,按任意键继续输入:");
			getchar();
			if(getchar()=='n')
			{
				printf("即将返回主菜单!");
				break;
			}
		}
	}
}

求所有学生平均成绩


void aver_score()
{
	system("cls");
	display();
	int i;
	float aver,s1,s2,s3;
    //遍历,然后求和,在对总人数求平均
	for(i=0;i<num;i++)
	{
		aver=aver+stu[i].ave;
		s1=s1+stu[i].eng;
		s2=s2+stu[i].math;
		s3=s3+stu[i].C;
		stu[i].ave=(stu[i].eng+stu[i].math+stu[i].C)/3.0;
	}
	aver=aver/num;
	s1=s1/num;
	s2=s2/num;
	s3=s3/num;
	printf("全校平均成绩为:%f\n",s1);
	printf("全校英语平均成绩为:%f\n",s2);
	printf("全校数学平均成绩为:%f\n",s3);
}

查看所有学生信息


void print_()
{
	system("cls");
	display();
	int i;
	printf("---------------------------------------------------------------------------------------\n");
	printf("\n姓  名        学  号        英语成绩        数学成绩       C  成绩        平均分       \n");
	printf("---------------------------------------------------------------------------------------\n");
	printf("\n"); 
	for(i=0;i<num;i++)
	{
	printf("%-6s        %s             %-8d        %-8d       %-8d       %f\n",stu[i].name,stu[i].ID,stu[i].eng,stu[i].math,stu[i].C,stu[i].ave);
	}
}

排序

void sort()
{ 
	system("cls");
	display();
	char m;
	printf("-----------------------------------------------------\n");
	printf("\n");
	printf("1.按照学号大小排序\n");
	printf("2.按照名字拼音排序\n");
	printf("3.按照成绩大小排序\n");
	printf("4.返回主菜单\n");
	printf("请输入你的选择:");
	fflush(stdin);
	scanf("%c",&m);
    //接下来,我们对某不同功能函数的实现,也就是下面的sort1,sort2,sort3
	switch(m)
	{
		case '1':sort1();break;
		case '2':sort2();break;
		case '3':sort3();break;
		default:
			break;
	}
}

对排序特殊功能函数的实现(都是冒泡排序,我就不多说了)


void sort1()
{
	int i,j,x;
	struct student st;
	for(i=0;i<num-1;i++)
	{
		x=0;
		for(j=0;j<num-1-i;j++)
		{
			if(strcmp(stu[j].ID,stu[j+1].ID)>0)
			{
				st=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=st;
				x++;
			}
		}
		if(x==0) break;
	}
	print_();
}
void sort2()
{
	int i,j,x;
	struct student st;
	for(i=0;i<num-1-i;i++)
	{
		x=0;
		for(j=0;j<num-1-i;j++)
		{
			if(strcmp(stu[j].name,stu[j+1].name)>0)
			{
				st=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=st;
				x++;
			}
		}
		if(x==0) break;
	}
	print_();
}
void sort3()                      //冒泡排序为下面的排序菜单准备 
{
	int i,j,x;
	struct student st;
	for(i=0;i<num-1;i++)
	{
		x=0;
		for(j=0;j<num-1-i;j++)
		{
			if(stu[j].ave<stu[j+1].ave)
			{
				st=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=st;
				x++;
			}
		}
		if(x==0)
		break;
	}
	print_();
 } 

搜索学生信息函数的实现

void seek()
{
	system("cls");
	display();
	char name[20];
	int i;
	printf("请输入你要查找学生信息的名字或者学号:");
	fflush(stdin);
	scanf("%s",name);
    //前面的就不多说了,后面的只用了一个for循环,然后就是上面输入学号姓名都是用一个数组来接的
    //为什么?是因为下面for循环都会有对应的,不管是你输入的是姓名name,还是学号ID,下面都if-else
    //语句来选择,然后就是判断字符串是否相等的strcmp()可以在网上搜索一下用法
	for(i=0;i<num;i++)
	{
		if(strcmp(stu[i].name,name)==0)
		{
			printf("---------------------------------------------------------------------------------------------------------------\n");
			printf("\n姓  名        学  号        英语成绩        数学成绩       C  成绩        平均分       \n");
			printf("------------------------------------------------------------------------------------------------------------------\n");
			printf("\n"); 
			printf("%-6s        %s             %-8d        %-8d       %-8d       %f\n",stu[i].name,stu[i].ID,stu[i].eng,stu[i].math,stu[i].C,stu[i].ave);
		}
		else if(strcmp(stu[i].ID,name)==0)
		{
			printf("----------------------------------------------------------------------------------------------------------------------\n");
			printf("\n姓  名        学  号        英语成绩        数学成绩       C  成绩        平均分       \n");
			printf("-------------------------------------------------------------------------------------------------------------------\n");
			printf("\n"); 
			printf("%-8s        %-8s        %-8d        %-8d        %-8d        %f",stu[i].name,stu[i].ID,stu[i].eng,stu[i].math,stu[i].C,stu[i].ave);
		}
	}
}

删除学生信息(有了上面这些的基础了,下面的不就很简单了我就不多说了)


void del()
{	
	system("cls");
	display();
	int i,j;
	char a,name[20];
	printf("1.清空所有学生信息\n");
	printf("2.清空部分学生信息\n");
	printf("3.返回主菜单\n");
	printf("请输入你的选择:");
	fflush(stdin);
	scanf("%c",&a);
	while(1)
	{
		switch(a)
		{
			case '1':
			for(i=0;i<num;i++)
			{
				for(j=0;j<num-i;j++)
				{
					stu[j]=stu[j+1];
				}
			}
			num=0;
			printf("清除完毕!");
			break;
			case '2':
			printf("请输入你要清空学生的学号:");
			fflush(stdin);
			scanf("%s",name);
			int x=0;
			for(i=0;i<num;i++)
			{
				if(strcmp(name,stu[i].ID)==0)
				{
					for(j=i;j<num;j++)
					stu[j]=stu[j+1];
					printf("清除完毕!");
					x++;
					num--;
				}
			}
			if(x==0) printf("没有此学生信息!");
			break;
			case '3':break;
		}
		if(a=='3') break;
		printf("按3返回主菜单,按任意键继续删除");
		fflush(stdin);
		scanf("%c",&a);
		if(a=='3') break;
	}
}

清空学生信息


void all_score()
{
	system("cls");
	display();
	int i,j;
	char a,name[20];
	while(1)
	{
	printf("1.清空所有学生成绩\n");
	printf("2.清除部分学生成绩\n");
	printf("3.修改学生信息\n");
	printf("4.返回主菜单"); 
	printf("请输入你的选择:");
	fflush(stdin);
	scanf("%c",&a);
	
		switch(a)
		{
			case '1':
			for(i=0;i<num;i++)
			{
				stu[i].eng=0;
				stu[i].math=0;
				stu[i].C=0;
				stu[i].ave=0.0;
			}
			printf("清除完毕!");
			break;
			case '2':
			printf("请输入要删除学生的姓名或者学号:");
			fflush(stdin);
			scanf("%s",name); 
			int i=0,y;
			for(i=0;i<num;i++)
			{
				if(strcmp(stu[i].name,name)==0)
				{
					stu[i].eng=0;
					stu[i].math=0;
					stu[i].C=0;
					stu[i].ave=0.0;
					y++;
				}
				else if(strcmp(stu[i].ID,name)==0)
				{
					stu[i].eng=0;
					stu[i].math=0;
					stu[i].C=0;
					stu[i].ave=0.0;
					y++;
				}
			}
			if(y==0) printf("没有该学生信息!");
			else printf("修改完成!");
			break;
			case '3':
			printf("请输入要修改学生的学号或者姓名:");
			fflush(stdin);
			scanf("%s",name);
			int x=0;
			for(i=0;i<num;i++)
			{
				if(strcmp(stu[i].name,name)==0) 
				{
					x++;
					printf("1.修改math\n");
					printf("2.修改english\n");
					printf("3.修改C\n"); 
					printf("4.修改学号\n");
					printf("5.返回上一步\n");
					char b;
					fflush(stdin);
					printf("请输入你的选择:");
					scanf("%s",&b);
					switch(b)
					{
						case '1':
						printf("请修改:");
						fflush(stdin);
						scanf("%d",&stu[i].math);
						printf("修改完成!");break;
						case '2':
						printf("请修改:");fflush(stdin);
						scanf("%d",&stu[i].eng);
						printf("修改完成!");break;
						case '3':
						printf("请修改:");fflush(stdin);
						scanf("%d",&stu[i].C);
						printf("修改完成!");break;
						case '4':
						printf("请修改:");fflush(stdin);
						scanf("%d",stu[i].ID);
						printf("修改完成!");break;
						case '5':break;
					}
				}
				else if(strcmp(stu[i].ID,name)==0) 
				{
					x++;
					printf("1.修改math\n"); 
					printf("2.修改english\n");
					printf("3.修改C\n"); 
					printf("4.修改学号\n");
					printf("5.返回上一步\n");
					char b;
					fflush(stdin);
					printf("请输入你的选择:");
					scanf("%s",&b);
					switch(b)
					{
						case '1':
						printf("请修改:");fflush(stdin);
						scanf("%d",&stu[i].math);
						printf("修改完成!");break;
						case '2':
						printf("请修改:");fflush(stdin);
						scanf("%d",&stu[i].eng);
						printf("修改完成!");break;
						case '3':
						printf("请修改:");fflush(stdin);
						scanf("%d",&stu[i].C);
						printf("修改完成!");break;
						case '4':
						printf("请修改:");fflush(stdin);
						scanf("%d",stu[i].ID);
						printf("修改完成!");break;
						case '5':break;
					}
				}
			}
			if(x==0)
			printf("没有该学生信息!");break;
			case '4':break;
		}
		if(a=='4') break;
	}
}

看完是不是没有指针的内容,别着急,要懂得循序渐进

接下来,我们可以来试一下用链表来完成一个学生教务管理系统,作完下一个项目呢,我们就可以准备一下C二级了,很简单,买一套C二级真题,刷到80分以上基本上就是稳过了,我是做完之后

买了模拟题,模拟了两三套都是九十多分,就直接裸考了,最后考了八十多分,反正过了就可以了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
	char name[20];
	char ID[20];
	float eng;
	float math;
	float C;
	float add;
};//定义一个结构体 
struct Node{
	struct student stud;
	struct Node *next;
};//定义一个链表
//全局变量来计总人数 
int num;
//链表的头指针 
struct Node *head;
void display(){
	system("color 0");
	printf("\n");
	printf("\t\t\t             *欢迎使用学生成绩管理系统*                    \n");
	printf("\t\t\t+-------------------------------------------------------+\n");
	printf("\t\t\t|        *请用户根据以下提示进行操作*                   |\n");
	printf("\t\t\t+-------------------------------------------------------+\n");
	printf("\t\t\t|*******************************************************|\n");
	printf("\t\t\t|     0.退出系统             1.信息录入                 |\n");
	printf("\t\t\t|                                                       |\n");
	printf("\t\t\t|     2.计算平均成绩         3.查看所有学生信息         |\n");
	printf("\t\t\t|                                                       |\n");
	printf("\t\t\t|     4.排序                 5.学生查找                 |\n"); 
	printf("\t\t\t|                                                       |\n");               
	printf("\t\t\t|     6.删除学生信息         7.修改学生信息             |\n");  
	printf("\t\t\t|                                                       |\n");                
	printf("\t\t\t+-------------------------------------------------------+\n");
	printf("\t\t\t|    温馨提示:请在成绩录入后再使用其它功能             |\n");               
	printf("\t\t\t+-------------------------------------------------------+\n");
	printf("\t\t\t                 *如需退出系统请按0*                     \n\n\n");
}
//创建表头
struct Node *creatList(){
	struct Node *headNode=(struct Node *)malloc(sizeof(struct Node));
	headNode->next=NULL;
	return(headNode);
}

//判断有无改学号与之重复的
int isHaveId(char ID[]) {
	struct Node *p = head->next;
	while( p != NULL){
		if(strcmp(p->stud.ID, ID) == 0){
			return 1;
		}
		p = p->next;
	}
	return 0;
} 

//创建结点
struct Node *creatNode(){
	struct Node *newNode=(struct Node *)malloc(sizeof(struct Node));
	printf("请输入姓名:");
	scanf("%s",newNode->stud.name);
	printf("请输入学号:");
	scanf("%s",newNode->stud.ID);
	int i = isHaveId(newNode->stud.ID);
	if( i == 1){
		printf("有学号与之重复\n");
		printf("退出该菜单\n");
		return;
	}
	printf("请输入英语成绩:");
	scanf("%f",&newNode->stud.eng);
	printf("请输入数学成绩:");
	scanf("%f",&newNode->stud.math);
	printf("请输入C成绩:");
	scanf("%f",&newNode->stud.C);
	newNode->stud.add=newNode->stud.C+newNode->stud.eng+newNode->stud.C;
	newNode->next=NULL;
	num++;
	return(newNode);
}

//添加成员
void add(){
	system("cls");
	display();
	struct Node *p1, *p2;
	p1=head->next;
	p2=creatNode();
	if(p2 != NULL){
		head->next = p2;
		head->next->next=p1;
	}
} 
//求全校平均成绩
void averscore(){
	system("cls");
	display();
	int i;
	float a1=0,a2=0,a3=0;
	struct Node *p1=head->next;
	if(p1 == NULL){
		printf("没有学生信息!!!");
		return;
	}
	while(p1){
		a1=a1+p1->stud.eng;
		a2=a2+p1->stud.math;
		a3=a3+p1->stud.C;
		i++;
		p1=p1->next;
	}
	a1=a1/i;
	a2=a2/i;
	a3=a3/i;
	printf("全校英语平均成绩为:%-.2f\n",a1);
	printf("全校数学平均成绩为:%-.2f\n",a2);
	printf("全校C平均成绩为:%-.2f\n",a3);
 } 
 //查看所有学生信息 
void printNode(){
	system("cls");
	display();
	struct Node *p1=head->next;
	int i;
	printf("------------------------------------------------------------------------\n");
	printf("姓名        学号        英语成绩    数学成绩    C成绩     总分\n");
	printf("------------------------------------------------------------------------\n");
	while(p1){
		printf("%-12s%-12s%-.2f       %-.2f       %-.2f         %.2f\n",p1->stud.name,p1->stud.ID,p1->stud.eng,p1->stud.math,p1->stud.C,p1->stud.add);
		p1=p1->next;
	}
}
//相邻两个节点进行调换 
//将两个结点的数据进行交换
void Exchange(struct Node *p1,struct Node *p2){
	char t[20];                                                 //通过字符串复制函数和中间变量t对姓名进行交换 
	strcpy(t,p1->stud.name);
	strcpy(p1->stud.name,p2->stud.name);
	strcpy(p2->stud.name,t);
	char te[20];                                                  //通过字符串复制函数和中间变量te对学号进行交换 
	strcpy(te,p1->stud.ID);
	strcpy(p1->stud.ID,p2->stud.ID);
	strcpy(p2->stud.ID,te);
	float a;
	a=p1->stud.eng;                                  //通过a为中间变量对英语成绩进行交换 
	p1->stud.eng=p2->stud.eng;
	p2->stud.eng=a;
	a=p1->stud.math;                                //通过a为中间变量对数学成绩进行交换 
	p1->stud.math=p2->stud.math;
	p2->stud.math=a;
	a=p1->stud.C;                                   //通过a为中间变量对C成绩进行交换 
	p1->stud.C=p2->stud.C;
	p2->stud.C=a;
	a=p1->stud.add;                                   //通过a为中间变量对总分进行交换 
	p1->stud.add=p2->stud.add;
	p2->stud.add=a;
} 

//写一个函数对链表结点进行自减操作,返回前一个节点的指向前一个节点的指针值 
struct Node *Self_reduction(struct Node *p){
	struct Node *p1,*p2;
	p1=p2=head->next;
	int i;
	for(i=1;i<num;i++){
		p2=p1;
		p1=p1->next;
		if(p1==p) break;
	}
	return(p2);
}

//写一个函数来返回结点的位置 
int place(struct Node *p){
	int i;
	struct Node *q=head->next;
	for(i=1;i<num;i++){
		if(q==p) break;
		else q=q->next;
	}
	return i;
} 
//对学生进行排序

//按照学号排序 
void sort1() {
	int i=1,j=num,x;
	struct Node *p1,*p2;
	p1=head->next;
	for(i=1;i<num;i++){
		p1=p2=head->next;
		for(j=1;j<num-i+1;j++){
			p2=p1;
			p1=p1->next;
			if(strcmp(p2->stud.ID,p1->stud.ID)>0){
				Exchange(p1,p2);
			}
		}
	
	}
	printNode();
}

//按照姓名拼音排序 
void sort2(){
	int i=1,j=num,x;
	struct Node *p1,*p2;
	p1=head->next;
	for(i=1;i<num-1;i++){
		x=0;
		p1=p2=head->next;
		for(j=1;j<num-i+1;j++){
			p2=p1;
			p1=p1->next;
			if(strcmp(p2->stud.name,p1->stud.name)>0){
				Exchange(p1,p2);	
			}
		}
		
	}
	printNode();
}


//按照总成绩排序
void sort3() {
	int i=1,j=num,x;
	struct Node *p1,*p2;
	p1=head->next;
	for(i=1;i<num-1;i++) {
		x=0;
		p1=p2=head->next;
		for(j=1;j<num-i+1;j++) {
			p2=p1;
			p1=p1->next;
			if(p1->stud.add>p2->stud.add) {
				Exchange(p1,p2);
				x++;
			}
		}

	}
	printNode();
}

//最后通过这个函数对上面的排序功能进行总结 
void sort() {
	system("cls");
	display();
	printf("\n1.按照学号排序");
	printf("\n2.按照姓名拼音排序");
	printf("\n3.按照总分排序");
	printf("\n请输入你的选择:");
	char z;
	fflush(stdin);
	scanf("%c",&z);
	switch(z){
		case '1':sort1();break;
		case '2':sort2();break;
		case '3':sort3();break;
		default:printf("\n请输入1-3之内的数!");
	}
	printf("按任意键返回主菜单:");
	getchar();
}


void insertinfobyID_name(){
	system("cls");
	display();
	int x=0;
	char name[20];
	struct Node *p1=head->next;
	printf("请输入要查找人的姓名或者学号:");
	scanf("%s",name);
	while(p1){
		if((strcmp(name,p1->stud.name))==0){
			printf("------------------------------------------------------------------------\n");
			printf("姓名        学号        英语成绩    数学成绩    C成绩     总分\n");
			printf("------------------------------------------------------------------------\n");
			printf("%-12s%-12s%-.2f       %-.2f       %-.2f       %-.2f",p1->stud.name,p1->stud.ID,p1->stud.eng,p1->stud.math,p1->stud.C,p1->stud.add);
			x++;
			break;
		}
		else if(strcmp(name,p1->stud.ID)==0){
			printf("------------------------------------------------------------------------\n");
			printf("姓名        学号        英语成绩    数学成绩    C成绩     总分\n");
			printf("------------------------------------------------------------------------\n");
			printf("%-12s%-12s%-.2f       %-.2f       %-.2f       %-.2f",p1->stud.name,p1->stud.ID,p1->stud.eng,p1->stud.math,p1->stud.C,p1->stud.add);
			x++;
			break;
		}
		p1=p1->next;
	}
	if(x==0) printf("没有此人信息!");
}
//删除学生信息
void del(){
	system("cls");
	display();
	printf("请输入删除人的学号或姓名:");
	char name[20];
	scanf("%s",name);
	getchar();
	struct Node *p=head->next;
	while(1){
		if(strcmp(name,p->stud.name)==0){
			printf("------------------------------------------------------------------------\n");
			printf("姓名        学号        英语成绩    数学成绩    C成绩     总分\n");
			printf("------------------------------------------------------------------------\n");
			printf("%-12s%-12s%-12.2f%-12.2f%-12.2f%-12.2f",p->stud.name,p->stud.ID,p->stud.eng,p->stud.math,p->stud.C,p->stud.add);		
			char a;
			printf("\n请确认是否删除,取消删除请按n,按任意键继续删除");
			scanf("%c",&a);
			if(a=='n'){
				printf("即将返回主菜单!按任意键继续");
				getchar();
				return;
			}
			else{
				struct Node *q;
				q=p->next;
				p=Self_reduction(p);
				p->next=q;
				printf("删除成功!按任意键返回主菜单");
				getchar();
				return;
			}
		}
		else if(strcmp(name,p->stud.ID)==0){
			printf("------------------------------------------------------------------------\n");
			printf("姓名        学号        英语成绩    数学成绩    C成绩       总分\n");
			printf("------------------------------------------------------------------------\n");
			printf("%-12s%-12s%-12.2f%-12.2f%-12.2f%-12.2f",p->stud.name,p->stud.ID,p->stud.eng,p->stud.math,p->stud.C,p->stud.add);		
			char a;
			printf("\n请确认是否删除,取消删除请按n,按任意键继续删除");
			scanf("%c",&a);
			if(a=='n'){
				printf("\n即将返回主菜单!按任意键继续");
				getchar();
				return;
			}
			else{
				struct Node *q;
				q=p->next;
				p=Self_reduction(p);
				p->next=q;
				printf("删除成功!按任意键返回主菜单");
				getchar();
				return;
			}
		}
		p=p->next;
	}
}


void modify(){
	system("cls");
	display();
	printf("请输入要修改学生的姓名或者学号:");
	char name[20];
	scanf("%s",name);
	getchar();
	int x;
	struct Node *p=head->next;;
	while(1){
		if(strcmp(name,p->stud.name)==0){
			x++;
			printf("------------------------------------------------------------------------\n");
			printf("姓名        学号        英语成绩    数学成绩    C成绩       总分\n");
			printf("------------------------------------------------------------------------\n");
			printf("%-12s%-12s%-12.2f%-12.2f%-12.2f%-12.2f",p->stud.name,p->stud.ID,p->stud.eng,p->stud.math,p->stud.C,p->stud.add);
			printf("\n请确认是否修改,按n返回主菜单,按任意键继续修改,请输入你的选择:");
			char c;
			scanf("%c",&c);
			if(c=='n') break;
			printf("\n1.学号修改");
			printf("\n2.姓名修改");
			printf("\n3.英语成绩修改");
			printf("\n4.数学成绩修改");
			printf("\n5.C成绩修改");
			printf("\n请输入你的选择:");
			char ch;
			scanf("%c",&ch);
			char w;
			if(ch=='1'){
				w++;
				printf("请输入学号:");
				scanf("%s",p->stud.ID);
			}
			else if(ch=='2'){
				w++;
				printf("请输入姓名:");
				scanf("%s",p->stud.name);
			}
			else if(ch=='3'){
				w++;
				printf("请输入英语成绩:");
				scanf("%f",&p->stud.eng);
				p->stud.add=p->stud.C+p->stud.eng+p->stud.math; 
			}
			else if(ch=='4'){
				w++;
				printf("请输入数学成绩:");
				scanf("%f",&p->stud.math);
				p->stud.add=p->stud.C+p->stud.eng+p->stud.math;
			}
			else if(ch=='5'){
				w++;
				printf("请输入C成绩:");
				scanf("%f",&p->stud.C);
				p->stud.add=p->stud.C+p->stud.eng+p->stud.math;
			}
			else
			printf("请输入1-5内的数字!");
			if(x!=0){
				printf("\n修改成功!");
			}
		}
		else if(strcmp(name,p->stud.ID)==0){
			x++;
			printf("------------------------------------------------------------------------\n");
			printf("姓名        学号        英语成绩    数学成绩    C成绩       总分\n");
			printf("------------------------------------------------------------------------\n");
			printf("%-12s%-12s%-12.2f%-12.2f%-12.2f%-12.2f",p->stud.name,p->stud.ID,p->stud.eng,p->stud.math,p->stud.C,p->stud.add);
			printf("\n请确认是否修改,按n返回主菜单,按任意键继续修改,请输入你的选择:");
			char c;
			scanf("%c",&c);
			if(c=='n') break;
			printf("\n1.学号修改");
			printf("\n2.姓名修改");
			printf("\n3.英语成绩修改");
			printf("\n4.数学成绩修改");
			printf("\n5.C成绩修改");
			printf("\n请输入你的选择:");
			char ch;
			fflush(stdin);
			scanf("%c",&ch);
			char w;
			if(ch=='1'){
				w++;
				printf("请输入学号:");
				scanf("%s",p->stud.ID);
			}
			else if(ch=='2'){
				w++;
				printf("请输入姓名:");
				scanf("%s",p->stud.name);
			}
			else if(ch=='3'){
				w++;
				printf("请输入英语成绩:");
				scanf("%f",&p->stud.eng);
				p->stud.add=p->stud.C+p->stud.eng+p->stud.math; 
			}
			else if(ch=='4'){
				w++;
				printf("请输入数学成绩:");
				scanf("%f",&p->stud.math);
				p->stud.add=p->stud.C+p->stud.eng+p->stud.math;
			}
			else if(ch=='5'){
				w++;
				printf("请输入C成绩:");
				scanf("%f",&p->stud.C);
				p->stud.add=p->stud.C+p->stud.eng+p->stud.math;
			}
			else
			printf("请输入1-5内的数字!");
			if(x!=0){
				printf("\n修改成功!");
			}
		}
		if(x==0) p=p->next;
		else
			break;
	}
}

/*
写入文件操作 
*/
void writeFile() {
	FILE *fp;
	struct Node *p = head->next;
	if((fp = fopen("data.txt","w")) == NULL) {
		printf("不能打开数据文件。\n");
		exit(1);
	}
	while(p) {
		fwrite(p,sizeof(struct Node),1,fp);
		p = p->next;
	}
	fclose(fp);
}

/*
读取文件操作 
*/
void readFile(){
    // 声明一个文件指针
    FILE* fp;
    struct Node *p, *q = head;
    if ((fp = fopen("data.txt", "r")) == NULL){
		printf("文件读取失败...");
		exit(1);
    }
    else {
        while(!feof(fp)){
        	p = (struct Node *)malloc(sizeof(struct Node));
        	fread(p, sizeof(struct Node), 1, fp);
       		q->next = p;
       		q = q->next;
       		num++;
		}
		q = Self_reduction(q);
		q->next = NULL;
		num--; 
    }
    fclose(fp); // 关闭文件流
}


int main(){
	system("cls");
	display();
	char ch;
	head=creatList();
	readFile();
	printf("请输入你的选择:");
	scanf("%c",&ch);
	while(1){
		switch(ch){
			case '0':break;
			case '1':add();break;
			case '2':averscore();break;
			case '3':printNode();break;
			case '4':sort();break;
			case '5':insertinfobyID_name();break; 
			case '6':del();break;
			case '7':modify();break;
			default:printf("\n请输入正确选项!");
		}
		if(ch=='0'){
			printf("\n即将退出程序,按任意键退出");
			fflush(stdin);
			getchar();
			break;
		}
		printf("\n请输入你的选择:");
		fflush(stdin);
		scanf("%c",&ch);
	}
	writeFile();
	return 0;
}

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值