概述
思路
用到的知识点:顺序表,冒泡排序。
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 ("ttt***************************************************n");
printf ("ttt*** 学生信息管理系统 ***n");
printf ("ttt***功能: ***n");
printf ("ttt*** 1、重新录入学生信息 ***n");
printf ("ttt*** 2、按从大到小的顺序对学生总成绩排序 ***n");
printf ("ttt*** 3、查看各分段人数 ***n");
printf ("ttt*** 4、按姓名查找学生 ***n");
printf ("ttt*** 其他、退出程序 ***n");
printf ("ttt***************************************************n");
printf ("ttt请按照功能前的序列号选择要实现的功能:t");
}
void input ( S *L, int num) //重新输入学生所有信息
{
int i;
for ( i = 0; i < num; i++)
{
printf ("请输入第%d个学生的姓名:nt",i+1);
scanf ("%s",L->students[i].name);
printf ("请输入第%d个学生的成绩:nt",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姓名: %st成绩: %fn",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姓名: %st成绩: %fn",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人nt",k[0]);
printf ("n80 ~ 90:%d人nt",k[1]);
printf ("n70 ~ 80:%d人nt",k[2]);
printf ("n60 ~ 70:%d人nt",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 ("nnendn");
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日:当时不写注释还又臭又长,懒得加功能了就这样吧,权当记录了
最后
以上就是活泼宝马为你收集整理的数据结构大作-学生信息管理系统的全部内容,希望文章能够帮你解决数据结构大作-学生信息管理系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复