数据结构大作-学生信息管理系统

思路
用到的知识点:顺序表,冒泡排序。
typedef struct	//顺序表,长度为MAXSIZE
{
	STU students[MAXSIZE];
	int length;
} S;
首先确定要实用的数据结构:用链表可以提高空间的利用率,但是写代码的时候需要考虑的就会多一点,而且出错了不好检查(第一次尝试的时候就被各种指针指向搞晕了)。所以就选择了实现起来比较方便的顺序表。

主要的几个函数:录入学生信息,按关键字查找学生,冒泡排序法以及没有技术含量的初始化函数。下面的代码中都有功能注释,不多哔哔了。
完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

#define MAXSIZE 40
/***************	结构体定义	**********************/
typedef struct
{
	char name[MAXSIZE];
	float score;
} STU;

typedef struct 
{
	STU students[MAXSIZE];
	int length;
} S;
/***************	函数定义		***********************/
void Init()                //初始化
{
	printf ("\t\t\t***************************************************\n");
	printf ("\t\t\t***               学生信息管理系统              ***\n");
	printf ("\t\t\t***功能:                                       ***\n");
	printf ("\t\t\t***  1、重新录入学生信息                        ***\n");
	printf ("\t\t\t***  2、按从大到小的顺序对学生总成绩排序        ***\n");
	printf ("\t\t\t***  3、查看各分段人数                          ***\n");
	printf ("\t\t\t***  4、按姓名查找学生                          ***\n");
	printf ("\t\t\t***  其他、退出程序                             ***\n");
	printf ("\t\t\t***************************************************\n");
	printf ("\t\t\t请按照功能前的序列号选择要实现的功能:\t");
}


void input ( S *L, int num)			//重新输入学生所有信息
{
	int i;
	for ( i = 0; i < num; i++)
	{
		printf ("请输入第%d个学生的姓名:\n\t",i+1);
		scanf ("%s",L->students[i].name);
		printf ("请输入第%d个学生的成绩:\n\t",i+1);
		scanf ("%f",&L->students[i].score);
	}
	L->length = num;	
}


void show_all ( S n)					//显示
{
	int i;
	for ( i = 0; i < n.length; i++)
	{
		printf("第%d个学生 \n姓名: %s\t成绩: %f\n",i+1,n.students[i].name,n.students[i].score);
	}
}


STU *search ( S *L)					//按姓名查找,返回值为 储存目标学生的信息 的结构体的地址
{
	int i;
	char name_1[MAXSIZE];
	printf ("请输入目标学生的姓名:\n");
	scanf ("%s",name_1);
	for ( i = 0; i < L->length; i++)
	{
		if ( strcmp( name_1, L->students[i].name) == 0)
			return  &L->students[i];
		else 
			continue;
	}
	printf ("错误\n");
	return 0;
}


void search_name ( S *L)
{
	STU *lll;
	lll = search ( L);												//lll储存查找目标的结构体地址
	if ( lll != NULL)												//判断查找是否成功
		printf ("\n姓名: %s\t成绩: %f\n",lll->name,lll->score);		
	else															
		printf ("找不到该学生\n");		
}


void bubble ( S *L)													//冒泡排序
{
	int i,j;
	float score_1;
	char name_1[MAXSIZE];
	for ( i = 0; i < L->length; i++)
	{
		for ( j = 0; j < L->length ; j++)
		{
			if ( L->students[j].score < L->students[j+1].score)		//分别交换结构体内容
			{
				score_1 = L->students[j].score;						//成绩交换
				L->students[j].score = L->students[j+1].score;			
				L->students[j+1].score = score_1; 
				
				strcpy ( name_1, L->students[j+1].name);
				strcpy ( L->students[j+1].name, L->students[j].name);//姓名交换
				strcpy ( L->students[j].name, name_1);
			}
		}
	}
}


void show_range ( S n)												//显示各分段的人数
{
	int i;
	int k[5];
	for ( i = 0; i < 5; i++)
	{
		k[i] = 0;
	}
	for ( i = 0; i < n.length; i++)
	{
		if ( n.students[i].score >= 90 && n.students[i].score < 100)
			k[0]++;
		if ( n.students[i].score >= 80 && n.students[i].score < 90)
			k[1]++;
		if ( n.students[i].score >= 70 && n.students[i].score < 80)
			k[2]++;
		if ( n.students[i].score >= 60 && n.students[i].score < 70)
			k[3]++;
		if ( n.students[i].score < 60)
			k[4]++;
	}
	printf ("\n90 ~ 100:%d人\n\t",k[0]);
	printf ("\n80 ~ 90:%d人\n\t",k[1]);
	printf ("\n70 ~ 80:%d人\n\t",k[2]);
	printf ("\n60 ~ 70:%d人\n\t",k[3]);
	printf ("\nunder 60:%d人\n",k[4]);
}


/***************	main函数	**********************/
int main()															//main()函数
{
	S nnn;
	int i,j;
	while (1)	
	{
		Init();
		scanf ("%d",&i);
		if ( i == 1)												//选择功能
		{
			printf ("学生总人数:\n");
			scanf ("%d",&j);
			input ( &nnn, j);			
			printf ("\n\nend\n");
			system ("pause");
			system ("cls");
		}
		if ( i == 2)
			{
				bubble ( &nnn);
				printf ("排序后的结果为:");
				show_all ( nnn);
				system ("pause");
				system ("cls");
			}
		if ( i == 3)
			{ 
				show_range ( nnn);
				system ("pause");
				system ("cls");
			}
		if ( i == 4)
			{ 
				search_name ( &nnn);
				system ("pause");
				system ("cls");
			}
		else
			break;
	}
	return 0;
}

扩展:

  • 添加另外的学生信息
  • 按照其他的方式把学生信息排列组织起来
  • 把学生的信息输入到txt文件中保存
  • 添加图形界面(QT)

之后会尝试更新的。

2022年3月24日:当时不写注释还又臭又长,懒得加功能了就这样吧,权当记录了

  • 11
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值