C语言学生成绩管理系统

C语言实现了学生成绩管理系统,可以对学生成绩进行录入、查询、修改、删除和排序。#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructStuScore{ intstuID; charstuName[10]; intyuwen;

大家好,又见面了,我是你们的朋友全栈君。

C语言实现了学生成绩管理系统,可以对学生成绩进行录入、查询、修改、删除和排序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct StuScore{
	int stuID;
	char stuName[10];
	int yuwen;
	int shuxue;
	int yingyu;
} STUSCORE;
typedef struct StuScoreNode{
	STUSCORE stu;
	struct StuScoreNode *NEXT;
}  SSN,*SSNLINK;
 
//创建学生信息的结构体
STUSCORE createStuScore()
{
	STUSCORE stu;
	printf("请输入学生的学号:\n");
	scanf("%d",&stu.stuID);
		if(stu.stuID==-1) return stu;
	printf("请输入学生的姓名:\n");
	scanf("%9s",stu.stuName);
	printf("请输入学生的语文成绩:\n");
	scanf("%d",&stu.yuwen);
	printf("请输入学生的数学成绩:\n");
	scanf("%d",&stu.shuxue);
	printf("请输入学生的英语成绩:\n");
	scanf("%d",&stu.yingyu);
	return stu;
}
 
//创建一个学生信息节点
SSNLINK addStuScoreNode()
{
	SSNLINK assn;
	assn=(SSNLINK)malloc(sizeof(SSN));
	assn->stu=createStuScore();
	assn->NEXT=NULL;
	return assn;
}
 
//将一个节点添加到列表中去,返回列表的头指针
SSNLINK addToList(SSNLINK * list,SSNLINK stunode)
{
	stunode->NEXT=*list;
	*list=stunode;
	return *list;
}
 
void showOneInfo1(STUSCORE ss)
{
	printf("学号:%d\n姓名:%s\n语文:%d\n数学:%d\n英语:%d\n",ss.stuID,ss.stuName,ss.yuwen,ss.shuxue,ss.yingyu);
 
}
 
void showOneInfo2(STUSCORE ss)
{
	printf("%8d%8s%8d%8d%8d\n",ss.stuID,ss.stuName,ss.yuwen,ss.shuxue,ss.yingyu);
}
 
void showAllInfo(SSNLINK list)
{
	SSNLINK  p;
	p=list;
	printf("%8s%8s%8s%8s%8s\n","学号","姓名","语文","数学","英语");
	while(p!=NULL)
	{
		showOneInfo2((*p).stu);
		p=p->NEXT;
	}
	getchar();getchar();
}
 
/* 查询  */
SSNLINK searchInfo(SSNLINK  head)
{
	int sno;
	SSNLINK p;
	printf("请输入要选择的学号:\n");
	scanf("%d",&sno);
	p=head;
	while(p!=NULL)
	{
		if(p->stu.stuID==sno)
			break;
		p=p->NEXT;
	}
	if(p==NULL)
		printf("查无此人!");
	else
		showOneInfo1(p->stu);
	getchar();getchar();
	return p;
}
 
/* 修改  */
void modifyInfo(SSNLINK  head)
{
	SSNLINK p;
	p=searchInfo(head);
	if(p==NULL)
	{
	getchar();getchar();
	return ;
	}
	printf("请输入新的学生成绩信息:\n");
	p->stu=createStuScore();
	printf("信息修改成功!");
	getchar();getchar();
}
 
/* 删除 */
void  deleteInfo(SSNLINK * head)
{
	SSNLINK p,q;//p是要删除的节点指针,q是p节点的上一个节点的指针
	int choice;
	p=searchInfo(*head);
	if(p==NULL)
	{
	getchar();getchar();
	return ;
	}
	printf("您确定要删除该信息吗?(1删除/0取消)\n");
	scanf("%d",&choice);
	if(choice==0)
		return;
	//真删除节点
	if(p==*head)//删除头节点
	{
		*head=(*head)->NEXT;//实现了在函数内,把外部变量(list)的值改变
		free(p); //malloc的反函数
	}
	else
	{
		//先找到P指向的上一个节点
		q=*head;
		while(q->NEXT!=p)
			q=q->NEXT;
		q->NEXT=p->NEXT;
		free(p);
	}
	getchar();getchar();
}
 
/* 排序 */
void sortInfo(SSNLINK  head)
{
	//冒泡排序法
	SSNLINK tail=head,p;
	STUSCORE t;
	//让tail指针指向链表结尾
	while(tail->NEXT!=NULL)
		tail=tail->NEXT;
	while(head->NEXT!=tail)//控制冒泡的次数
	{
		p=head;
		while(p->NEXT!=tail)//每一次的循环比较
		{
			if(p->stu.stuID> p->NEXT->stu.stuID)
			{
				t=p->stu;
				p->stu=p->NEXT->stu;
				p->NEXT->stu=t;
			}
			p=p->NEXT;
		}
		if(p->stu.stuID> p->NEXT->stu.stuID)
			{
				t=p->stu;
				p->stu=p->NEXT->stu;
				p->NEXT->stu=t;
			}
		tail=p;//尾指针前移一个
	}
	printf("排序完成\n");
	getchar();getchar();
}
 
int main()
{
	SSNLINK list=NULL,node;//list是列表的头指针,node为单节点的指针
	int choice;
	while(1)
	{
		system("cls");
	printf("*********学生成绩管理系统********\n");
	printf("1.输入学生成绩信息\n");
	printf("2.显示所有学生的成绩信息\n");
	printf("3.按学号查询学生成绩信息\n");
	printf("4.按学号修改学生成绩信息\n");
	printf("5.按学号删除学生成绩信息\n");
	printf("6.按学号排序学生成绩信息\n");
	printf("*********************************\n");
	printf("请输入您的选择:\n");
	scanf("%d",&choice);
	switch(choice)
        {
        case 1://添加学生信息
            while(1)
            {
                node=addStuScoreNode();
                if(node->stu.stuID==-1)
                    break;
                list=addToList(&list,node);
            }
            break;
        case 2:showAllInfo(list);break;
        case 3:searchInfo(list);break;
        case 4:modifyInfo(list);break;
        case 5:	deleteInfo(&list);break;
        case 6:sortInfo(list);break;
        case -1:exit(0);
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127116.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 能与PowerDesigner媲美的数据库建模工具PDMan[通俗易懂]

    软件生存周期分为:1、可行性分析与项目开发计划2、需求分析3、概要设计4、详细设计5、编码6、测试7、维护而数据库建模工作就发生在“编码”之前,“概要设计”与“详细设计”中。在设计数据库时,对现实世界进行分析、抽象、并从中找出内在联系,进而确定数据库的结构,这一过程就称为数据库建模。当然,一款实用、便利的工具,会使我们的工作效率大大提高,今天我们就来介绍一款能与PowerD…

    2022年4月8日
    247
  • 女生学Java软件开发好就业吗

    女生学Java软件开发好就业吗  java在IT行业非常火热,近几年不仅引起了很多人的关注,女性同胞也非常关注这一行业,想要学习java技术,但是不知道女生学Java软件开发好就业吗?来看看下面的详细介绍就知道了。  女生学Java软件开发好就业吗?目前大多数想要参加Java培训学习女生的一个重要关注的话题,学习不用多说,只要是自己足够的努力,在选择一个靠谱的Java培训机构,还是比较容易学会的。有的时候我们可以看到同样的老师、同样的课程和同样的学习方式,整个Java培训过程下来女生很多是要比男生学习的更好。  所以,在学习

    2022年7月8日
    15
  • 微信H5页面 会被软键盘顶起来

    微信H5页面 会被软键盘顶起来

    2021年7月5日
    75
  • j2EE是什么_j2ee体系结构

    j2EE是什么_j2ee体系结构经过本次学习,我们知道了J2EE的整体架构以及一些核心的组件,更加理解了其伸缩性、灵活性和易维护性,这对我们以后的学习会有很大的帮助.当然,我们学过了这些基本的概念之后,最主要的还是要在实际运用中去体会,去总结,然后再返回来看这些东西,我们就会有很大的收获。这就是一个学习的过程,加油。

    2022年10月11日
    1
  • 三分钟学会用Python+OpenCV批量裁剪xml格式标注的图片

    三分钟学会用Python+OpenCV批量裁剪xml格式标注的图片文章目录前言xml文件格式代码思想完整代码效果展示总结前言在目标检测中,数据集常常使用labelimg标注,会生成xml文件。本文旨在根据xml标注文件来裁剪目标,以达到去除背景信息的目的。xml文件格式以下是一个标注好的图片生成的xml文件。具体含义见代码注释。<annotation><!–xml所属文件夹–> <folder>JPEGImages</folder>

    2022年6月29日
    29
  • 分层抽样不按比例如何加权_按比例分层抽样和定额抽样的区别?

    分层抽样不按比例如何加权_按比例分层抽样和定额抽样的区别?从宏观上,两者的目的都是为了提供更好的样本代表性,并且两者的理论基础都来自于:总体的个体的同质性越高,抽样误差越小,样本的代表性越好。两者的本质区别在于是否以概率为基础,比例分层抽样是概率抽样而后者是非概率抽样。从最宏观的角度来说,比例分层抽样产生的样本是随机抽样样本,其本身可以进行抽样误差的评估和推断检验,进而把你样本的结论推广到总体。而定额抽样本身不具备这种可能。从具体操作上,两者都需要选取一…

    2022年5月14日
    63

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号