ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言大作业--成绩信息管理系统

2022-01-03 17:01:58  阅读:146  来源: 互联网

标签:head -- C语言 STU int score printf 信息管理系统 next


本来要实现文件预读的功能,结果搞了好长时间还是有bug(我是菜鸡)

所以就只有文件保存的功能。

求求不要白嫖,点个赞~~~~~

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define maxchar 10
#define maxid 20 

typedef struct student
{
	char name[maxchar];
	char id[maxid];
	int score[5];
	char sex[3];
	struct student* next;
}STU;//定义一个可以存放考生信息的  ****链表
 
void Stu_Input(STU* head);//输入信息
void Stu_Output(STU* head);//打印成绩单
void Stu_Search(STU* head);//根据考号查询****查找算法 ****枚举算法 
void change(STU* head);//根据姓名查找到人以后修改
void Stu_delete(STU* head);//根据姓名删除考生
int JudgeID(char mid[]);//判断考号是否输入正确
void save_file(STU* head);//保存链表内容到文件****文件操作 
STU* free_head(STU* head);//释放链表
void sort(STU *head,int (*cmp)(int,int));//冒泡排序 
int Ascend(int x,int y);//升序 
int Descend(int x,int y);//降序 
void sortWindows(STU* head);

int main()
{
	int select = 1;//选择
	STU *head=(STU*)malloc(sizeof(STU));//定义链表头
	head->next = NULL;
    system ("color f0");//白色背景 
	/*交互界面*/
	while (select != 0)
	{
		printf("\n\n");
		printf("***************************************\n");
		printf("**            考试信息管理           **\n");
		printf("**===================================**\n");
		printf("**            1. 成绩录入            **\n");
		printf("**            2. 数据修改            **\n");
		printf("**            3. 数据查询            **\n");
		printf("**            4. 数据删除            **\n");
		printf("**            5. 排    名            **\n");
		printf("**            6. 打    印            **\n");
		printf("**            7. 保    存            **\n");
		printf("**-----------------------------------**\n");
		printf("**            0. 退    出            **\n");
		printf("***************************************\n");
		printf("请选择:");
		scanf("%d",&select);
		switch(select){
			case 1:
				Stu_Input(head);
				break;
			case 2:
				change(head);
				break;
			case 3:
				Stu_Search(head); 
				break;
			case 4:
				Stu_delete(head);
				break;
			case 5:
				sortWindows(head);
				break;
			case 6:
				Stu_Output(head);
				break;
			case 7:
				save_file(head);
				break;
			case 0:
				break;
			default:
				break;
		}
	}
	save_file(head);//自动保存功能 
	free_head(head);//释放链表 
	return 0;
}
 
/*输入*/
void Stu_Input(STU* head)
{
	system("cls");//清屏 
	STU* p = (STU*)malloc(sizeof(STU));//申请内存 
	STU* q=NULL;
	if (p == NULL)
	{
		printf("申请内存失败!\n"); return;//申请内存失败则退出程序
	}
	p->next = NULL;//使链表末尾为空
	int j,sum=0,temp;
	char leason[4][maxchar] = { "笔试","一面","二面","综测" };//名字
	char mname[maxchar] = { 0 };//暂存的名字
	char mid[maxid] = { 0 };//暂存的id。
	int mscore[5];//存放各科的成绩
	char msex[3] = { 0 };//性别
	printf("初始化中:");
	for(j=1; j<=4; j++)
	{
		printf(".");
		Sleep(500);
	}
	printf("\n");
	printf("**           成绩录入系统:          **\n"); 
	printf("***************************************\n");
	printf("请输入名字:");
	scanf("%s", mname);
	while (1)
	{
		printf("请输入考号(4位):");
		scanf("%s", mid);
		if (JudgeID(mid) != 0)
		{
			printf("你输入的考号有问题,请重新输入");
		}
		else
		{
			break;
		}
	}
	
	printf("请输入性别:");
	scanf("%s", msex);
	for (j = 0; j < 4; j++)
	{
		printf("请输入%s的成绩:", leason[j]);
		scanf("%d", &mscore[j]);
	}
	/*将暂存的存到链表里*/
	strcpy(p->name, mname);
	strcpy(p->id, mid);
	strcpy(p->sex, msex);
	/*将分数存到链表里*/
	for (j = 0; j < 4; j++)
	{
		p->score[j] = mscore[j];
		sum+=mscore[j];
	}
	p->score[4]=sum;
	q = head->next;
	if (q == NULL)//判断如果链表头为空则存到链表头
	{
		head->next = p;
	}else
	{
		/*找到链表的末尾*/
		while (q->next!=NULL)
		{
			q = q->next;
		}
		q->next = p;
	}
	printf("输入成功!\n");
	printf("是否继续输入?如果是则输入1,不是则输入其他数字.");
	scanf("%d",&temp);
	if(temp==1)
	{
		Stu_Input(head);//                        ****递归函数 
	}else
	{
		return;
	}
}
 
/*输出*/
void Stu_Output(STU *head)
{
	system("cls");//清屏 
	int j;
	STU* q=head->next;
	printf("初始化中:");
	for(j=1; j<=4; j++)
	{
		printf(".");
		Sleep(500);
	}
	printf("\n");
	printf("**              打印系统:           **\n"); 
	printf("***************************************\n");
	printf("\n\n姓名\t性别 考号\t笔试\t一面\t二面\t综测\t总分\t\n");
	while(q)
	{
		printf("%s\t", q->name);
		printf("%-5s", q->sex);
		printf("%-10s\t", q->id);
		q->score[4] = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d\t", q->score[j]);
			q->score[4] += q->score[j];//计算总成绩 
		}
		printf("\n");
		q = q->next;
	}
	printf("\n");
}
 
/*查找*/
void Stu_Search(STU *head)
{
	system("cls");
	STU* q = head->next;
	char m_id[maxid] = { 0 };//定义考号 
	int j;
	int myflag = 1;//判断当找不到该考生时是否输入
	printf("初始化中:");
	for(j=1; j<=4; j++)
	{
		printf(".");
		Sleep(500);
	}
	printf("\n");
	printf("**              查询系统:           **\n"); 
	printf("***************************************\n");
	printf("请输入你要查找的考号:");
	scanf("%s", m_id);
	printf("\n\n");
	while(q)
	{
		if (strcmp(q->id, m_id) == 0)
		{
			break;
		}
		q = q->next;
	}
	if (q == NULL)
	{
		printf("没找到该考生");
		printf("你要输入吗?1--输入,2--放弃\n");//判断 
		scanf("%d", &myflag);
		if (myflag != 1)
		{
			printf("成功退出!\n");
			return;
		}
		else
		{
			Stu_Input(head);//调用输入函数 
			return;
		}
	}
	printf("该考生的成绩为:\n");
	printf("姓名\t性别 考号\t笔试\t一面\t二面\t综测\t总分\t\n");
	printf("%s\t", q->name);
	printf("%-5s", q->sex);
	printf("%-10s\t", q->id);
	q->score[4] = 0;
	/*计算总分并且存入*/
	for (j = 0; j < 5; j++)
	{
		printf("%d\t", q->score[j]);
		q->score[4] += q->score[j];
	}
	printf("\n");
}
 
/*修改*/
void change(STU *head)
{
	system("cls");
	STU* q = head->next;
	int j;
	int flag = 0;//定义flag反应是否找到该考生
	char m_name[maxchar] = { 0 };
	int  change_score = 0;
	int myflag = 1;//用于判断如果找不到该考生是否输入。
	printf("初始化中:");
	for(j=1; j<=4; j++)
	{
		printf(".");
		Sleep(500);
	}
	printf("\n");
	printf("**              修改系统:           **\n"); 
	printf("***************************************\n");
	printf("请输入你要修改的考生名字:");
	scanf("%s", m_name);
	while(q!=NULL)
	{
		if (strcmp(q->name, m_name) == 0)//字符串匹配函数 
		{
			flag = 1;
			break;
		}
		q = q->next;
	}
	if (flag)
	{
		printf("该考生当前的成绩为:\n");
		printf("姓名\t性别 考号\t笔试\t一面\t二面\t综测\t总分\t\n");
		printf("%s\t", q->name);
		printf("%-5s", q->sex);
		printf("%-10s\t", q->id);
		q->score[4] = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%df\t", q->score[j]);
			q->score[4] += q->score[j];
		}
		printf("\n");
		printf("请输入你要修改的成绩:\n");
		printf("1-笔试,2-一面,3-二面,4-综测\n");
		scanf("%d", &change_score);
		while (change_score)
		{
			switch (change_score)//switch语句分支修改方面 
			{
			case 1:
				printf("请输入你要修改的笔试成绩:");
				scanf("%d", &q->score[0]);
				printf("是否要继续修改,如果是请输入修改科目的序号,否则输入零\n");
				printf("1-笔试,2-一面,3-二面,4-综测\n");
				scanf("%d", &change_score);
				break;
			case 2:
				printf("请输入你要修改的一面成绩:");
				scanf("%d", &q->score[1]);
				printf("是否要继续修改,如果是请输入修改科目的序号,否则输入零\n");
				printf("1-笔试,2-一面,3-二面,4-综测\n");
				scanf("%d", &change_score);
				break;
			case 3:
				printf("请输入你要修改的二面成绩:");
				scanf("%d", &q->score[2]);
				printf("是否要继续修改,如果是请输入修改科目的序号,否则输入零\n");
				printf("1-笔试,2-一面,3-二面,4-综测\n");
				scanf("%d", &change_score);
				break;
			case 4:
				printf("请输入你要修改的综测成绩:");
				scanf("%d", &q->score[3]);
				printf("是否要继续修改,如果是请输入修改科目的序号,否则输入零\n");
				printf("1-笔试,2-一面,3-二面,4-综测\n");
				scanf("%d", &change_score);
				break;
			default:
				printf("你输入的选择有问题,请重新输入:");//对非法输入判断 
				break;
			}
		}
		printf("该考生修改后的成绩为:\n");
		printf("姓名\t性别 考号\t笔试\t一面\t二面\t综测\t总分\t\n");
		printf("%s\t", q->name);
		printf("%-5s", q->sex);
		printf("%-10s\t", q->id);
		q->score[4] = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d\t", q->score[j]);
			q->score[4] += q->score[j];
		}
		printf("\n");
	}else
	{
		printf("目前没有该考生。\n");
		printf("你要输入吗?1--输入,2--放弃\n");
		scanf("%d", &myflag);
		if (myflag != 1)
		{
			printf("成功退出!\n");
			return;
		}
		else
		{
			Stu_Input(head);
			return;
		}
	}
}
 
/*保存到文件*/
void save_file(STU* head)
{
	int j;
	STU* q= head->next;
	FILE* fp;
	fp=fopen("sometext.txt", "wt");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");//程序健壮性 
		return ;
	}
	if (q==NULL)
	{
		printf("无考生信息!\n");//程序健壮性 
		return ;
	} 
	fprintf(fp, "姓名\t性别\t考号\t\t笔试\t一面\t二面\t综测\t总分\t\n");
	while (q!=NULL)
	{
		fprintf(fp,"%s\t", q->name);
		fprintf(fp,"%-5s\t", q->sex);
		fprintf(fp,"%-10s\t\t", q->id);
		q->score[4] = 0;
		for (j = 0; j < 5; j++)
		{
			fprintf(fp,"%d\t", q->score[j]);
			q->score[4] += q->score[j];
		}
		fprintf(fp,"\n");
		q = q->next;
	}
	fclose(fp);
	printf("文件保存成功!\n");//提示 
}

/*删除*/
void Stu_delete(STU* head)
{
	system("cls");//清屏 
	int i;
	int myflag;
	STU* q =head;
	STU* p = head->next;
	char mname[maxchar] = {0};
	printf("初始化中:");
	for(i=1; i<=4; i++)
	{
		printf(".");
		Sleep(500);
	}
	printf("\n");
	printf("**              删除系统:           **\n"); 
	printf("***************************************\n");
	printf("请输入你要删除的考生名字:");
	scanf("%s", mname);
	for (; p!=NULL ;p = p->next,q=q->next)//                  ****枚举 
	{
		if (strcmp(p->name, mname) == 0)
		{
			break;
		}
	}
 
	if (p==NULL)
	{
		printf("没有该考生\n");//健壮性提示 
	}else
	{
		printf("该考生的成绩为:\n");
		printf("姓名\t性别 考号\t笔试\t一面\t二面\t综测\t总分\t\n");
		printf("%s\t", p->name);
		printf("%-5s", p->sex);
		printf("%-10s\t", p->id);
		p->score[4] = 0;
		for (i = 0; i < 5; i++)
		{
			printf("%d\t", p->score[i]);
		}
		printf("\n");
		printf("是否删除该考生?1--是,2--否\n");
		scanf("%d", &myflag);
		if (myflag == 1)
		{
			if (p->next==NULL)
			{
				q->next = NULL;;
			}else
			{
				q->next=p->next;
			}
			free(p);
			printf("删除完毕\n");
		}else
		{
			printf("已保留\n");
		}
	}
}
 
/*判断考号输入是否正确*/
int JudgeID(char mid[])
{
	int i;
	for (i = 0; i  < strlen(mid); i++)
	{
		if (mid[i] < '0' || mid[i] > '9')	return 1;
	}
 
	return 0;
}
 
STU* free_head(STU* head)
{
	STU *p=head->next;
	STU *temp=head;
	while(p!=NULL)
	{
		temp=p;
		p=p->next;
		free(temp);//申请后再释放 
	}
	head->next=NULL;
	printf("链表释放完毕!按任意键返回.\n");
	
	return head;
}
int Descend(int x,int y)
{
	if(x<y)
	{
		return 0;
	}else
	{
		return 1;
	}
}
int Ascend(int x,int y)
{
	if(x<y)
	{
		return 1;
	}else
	{
		return 0;
	}
}
void sort(STU *head,int(*cmp)(int,int))
{
	int i;
	printf("初始化中:");
	for(i=1; i<=4; i++)//模拟系统 
	{
		printf(".");
		Sleep(500);
	}
	if(head->next==NULL)//程序的健壮性
	{
		printf("信息为空!\n");
		return;
	}
	if(head->next->next==NULL)//程序的健壮性 
	{
		printf("只有一组信息!\n");
		return; 
	}
 	STU *p1;
 	STU *p2;
 	int temp;//交换 
 	char tempname[maxchar],tempid[maxid],tempsex[3];
 	
 	for (p1=head->next; p1->next!=NULL;p1=p1->next) 
 	{
 		 for (p2=p1->next; p2!=NULL; p2=p2->next)
 		 {
  			if ((*cmp)(p1->score[4],p2->score[4]))
  			{
				for(i=0;i<5;i++)//交换成绩 
				{
					temp=p1->score[i];
					p1->score[i]=p2->score[i];
					p2->score[i]=temp;
				}
				strcpy(tempname,p1->name);//交换名字 
				strcpy(p1->name,p2->name);
				strcpy(p2->name,tempname);
				
				strcpy(tempid,p1->id);//交换考号 
				strcpy(p1->id,p2->id);
				strcpy(p2->id,tempid);
				
				strcpy(tempsex,p1->sex);//交换性别 
				strcpy(p1->sex,p2->sex);
				strcpy(p2->sex,tempsex);
				
   			}
  		}
 	}
 	printf("排名成功!\n");
}
void sortWindows(STU* head)
{
	system("cls");
	int i,select=1; 
	printf("初始化中:");//模拟系统 
	for(i=1; i<=4; i++)
	{
		printf(".");
		Sleep(500);
	}
	printf("\n");
	printf("**              排序系统:           **\n"); //交互式界面 
	printf("***************************************\n");
	printf("**           1. 按总成绩升序排名     **\n");
	printf("**           2. 按总成绩降序排名     **\n");
	printf("**           0. 退出                 **\n");
	printf("***************************************\n");
	while(select!=0)//选择 
	{
		printf("请选择:"); 
		scanf("%d",&select);
		switch(select)
		{
			case 1:
				sort(head,Descend);//调用排序函数 
				break;
			case 2:
				sort(head,Ascend);//应用函数指针 
				break;
			case 0:
				printf("退出成功!\n");
				break;
			default:
				printf("请重新输入:"); //防御性,可重复性 
		}
	}
	return ;
}

标签:head,--,C语言,STU,int,score,printf,信息管理系统,next
来源: https://blog.csdn.net/SillyGOAT/article/details/122289197

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有