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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux网络重启失败「建议收藏」

    linux网络重启失败「建议收藏」问题:网络重启失败如下:[root@localhost~]#systemctlrestartnetworkJobfornetwork.servicefailedbecausethecontrolprocessexitedwitherrorcode.See”systemctlstatusnetwork.service”and”journalctl…

    2022年10月21日
    2
  • Implementing the Singleton Pattern in C#

    Implementing the Singleton Pattern in C#

    2021年9月2日
    48
  • MFC CCriticalSection 关键段

    MFC CCriticalSection 关键段和其他同步对象不同,除非有需要以外,关键区域工作在用户模式下。若一个线程想运行一个封装在关键区域中的代码,它首先做一个旋转封锁,然后等待特定的时间,它进入内核模式去等待关键区域。实际上,关键区域持有一个旋转计数器和一个信号量,前者用于用户模式的等待,后者用于内核模式的等待(休眠态)。在Win32API中,有一个CRITICAL_SECTION结构体表示关键区域对象。在MFC中,有一个类CCri

    2022年7月21日
    12
  • java数组如何赋值_java数组如何赋值

    java数组如何赋值_java数组如何赋值Java语言中数组必须先初始化,然后才可以使用。所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值。初始化数组有以下3种方式:1)使用new指定数组大小后进行初始化使用new关键字创建数组,在创建时指定数组的大小。语法如下:type[]arrayName=newint[size];示例:int[]number=newint[5];number[0]…

    2022年7月16日
    67
  • Databus简介「建议收藏」

    Databus简介「建议收藏」1.背景在互联网架构中,数据系统通常分为真实数据(source-of-truth)系统,作为基础数据库,存储用户产生的写操作;以及衍生数据库或索引,提供读取和其他复杂查询操作。后者常常衍生自主数据存储,会对其中的数据做转换,有时还要包括复杂的业务逻辑处理。缓存中的数据也来自主数据存储,当主数据存储发生变化,缓存中的数据就需要刷新,或是转为无效。这样架构自然而然的一个问题就是如何保障基础数

    2022年10月17日
    4
  • PHP如何解决网站大流量与高并发的问题(一)「建议收藏」

    PHP如何解决网站大流量与高并发的问题(一)

    2022年2月9日
    71

发表回复

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

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