学生成绩管理系统
1 数据结构:学生信息:学号,姓名,年龄,性别,三科成绩
2 功能:
增加学生记录
删除学生记录
查找学生信息(学号,姓名)
修改学生信息
按照成绩排序,求平均值,最大值,最小值
3 用户界面
主菜单
子菜单
/*
学生成绩管理系统
1 数据结构:学生信息:学号,姓名,年龄,性别,三科成绩
2 功能:
增加学生记录
删除学生记录
查找学生信息(学号,姓名)
修改学生信息
按照成绩排序,求平均值,最大值,最小值
3 用户界面
主菜单
子菜单
4 批量生成测试数据
原作者链接 https://www.cnblogs.com/XYQ-208910/p/4745371.html
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 50
static int count = 10; // 定义静态全局变量,统计目前数组中的人数
struct Student
{
char name[20];
int sno;
int age;
char gender;
float EnglishScore;
float mathScore;
float chineseScore;
}stu[N]= {{"zhao",1000,20,'M',98,99,97},
{"zhao",1001,21,'F',97,96,95},
{"qian",1002,23,'M',95,96,92},
{"hong",1003,22,'F',91,93,97},
{"zhou",1004,25,'M',90,90,90},
{"feng",1005,21,'F',96,93,96},
{"wang",1006,23,'M',97,91,90},
{"chen",1007,21,'F',94,92,91},
{"geng",1008,20,'F',90,99,91},
{"tang",1009,24,'M',99,99,99}};
//添加数据
void add(struct Student stu[],int pos,int nums);
//删除数据
void Delete_name(struct Student *stu,char Name[]);//(按姓名)
void Delete_sno(struct Student *stu,int Sno);//(按学号)
//修改数据
void update(struct Student stu[],int Sno,int len);
//查询子菜单
void menu(struct Student stu[],int m);
void search(struct Student stu[],int n,char Name[]);//按姓名查询
void search1(struct Student stu[],int n,int Num);//按学号查询
void sort(struct Student stu[],int n); //按总分高低排序
void print(struct Student stu[],int n);
void My_print_sum(struct Student stu[],int n);
void max_min(struct Student stu[],int n);
// 主菜单
void PrintScreen()
{
printf("------------------\n");
printf("** 1.增加学生记录 **\n");
printf("** 2.删除学生记录 **\n");
printf("** 3.查找学生记录 **\n");
printf("** 4.修改学生记录 **\n");
printf("** 0.退出管理系统 **\n");
printf("------------------\n");
}
// 删除子菜单
void deleteScreen()
{
printf("------------------\n");
printf("** 0.按姓名删除数据**\n");
printf("** 1.按学号删除数据**\n");
printf("** 2.返回主菜单 **\n");
printf("------------------\n");
printf("please select 0-1:");
}
// 查找子菜单
void seekScreen()
{
printf("-------------------------\n");
printf("****** 1.按姓名查找信息 *\n");
printf("****** 2.按学号查找信息 *\n");
printf("****** 3.查看所有学生成绩 *\n");
printf("****** 4.成绩名次排序(总分)*\n");
printf("****** 5.查看成绩最优最差 *\n");
printf("****** 6.返回主菜单 *\n");
printf("-------------------------\n");
printf("please you select 1-6:");
}
int main(int argc, const char *argv[])
{
int nums, temp;
int snos;
char names[20];
while (1)
{
PrintScreen();
printf("please press enter_key continue!\n");
getchar();
printf("please select 0-4:");
char c = getchar();
switch (c)
{
case '1':
printf("please student'number you want to add:");
scanf("%d",&nums);
add(stu, count, nums); // 添加数据
getchar();
break;
case'2':
deleteScreen();
scanf("%d",&temp);
switch (temp)
{
case 0:
printf("plseas input delete name:");
scanf("%s",names);
Delete_name(stu,names); // 按照姓名删除
break;
case 1:
printf("plseas input delete sno:");
scanf("%d",&snos);
Delete_sno(stu,snos); // 按照学号删除
default:
break;
}
case '3':
menu(stu, count); // 查找数据
getchar();
break;
case '4':
printf("please input uddate sno:");
scanf("%d",&snos);
update(stu, snos, count); // 修改数据
case '0':
exit(0); // 退出系统
default:
printf("data is illeagl !\n"); // 输入非法
getchar();
break;
}
}
return 0;
}
//添加数据
void add(struct Student stu[], int pos, int nums) // 开始位置,添加的人数
{
for (int i = pos; i < pos + nums; i++) { // 学号不能存在重复的
printf("please input name:");
scanf("%s",stu[i].name);
int flag = 1, sno;
while (flag)
{
printf("please input sno:");
scanf("%d",&stu[i].sno);
for (int j = 0; j < pos; j++) {
if (stu[j].sno == sno) {
printf("sno is exit!\n");
break;
} else {
flag =0;
}
}
stu[i].sno = sno;
}
printf("please input age:");
scanf("%d",&stu[i].age);
printf("please input gender:(f/m or F/M)");
getchar(); // 为何要有这个
scanf("%c",&stu[i].gender);
printf("please input EnglishScore:");
scanf("%f",&stu[i].EnglishScore);
printf("please input mathScore:");
scanf("%f",&stu[i].mathScore);
printf("please input ChineseScore:");
scanf("%f",&stu[i].chineseScore);
printf("学生信息添加成功!\n");
}
count += nums;
}
// 按学号删除
void Delete_sno(struct Student *stu, int Sno)
{
if (count == 0) {
printf("no student!\n");
return;
}
int flag = 0;
for (int i = 0; i < count; i++) {
if ((stu + i)->sno == Sno) {
for (int j = i; j < count; j++) {
*(stu + j) = *(stu + j + 1); // 后面的数据前移动
}
printf("\n");
printf("学号为%d的学生信息已被删除\n",Sno);
flag = 1;
count = count - 1;
break;
}
}
if (flag == 0) {
printf("学号%d不存在.\n",Sno);
}
}
// 按照姓名删除
void Delete_name(struct Student *stu, char Name[])
{
if (count == 0) {
printf("no student!\n");
return;
}
int flag = 0;
int n = count; // 可能存在多个姓名一样的学生
for (int i = 0; i < n; i++) {
if (strcmp((stu + i - flag)->name, Name) == 0) {
for (int j = i - flag; j < count; j++) { // flag 存在的作用是减少循环次数
*(stu + j) = *(stu + j + 1); // 后面的数据前移动
}
printf("\n");
printf("学号为%s的学生信息已被删除\n",Name);
flag += 1;
count = count - 1;
break;
}
}
if (flag == 0) {
printf("学生%s不存在.\n",Name);
}
}
// 修改数据
void update(struct Student stu[], int sno, int len)
{
char cs, cs1, cs2, cs3; // 标志
char p[20];
int grade, i;
for (i = 0; i < len; i++) {
if (sno == stu[i].sno) {
printf("please ask update name?(y/n):");
getchar();
cs = getchar();
if (cs == 'y') {
printf("please input a new name:");
scanf("%s",p);
strcpy(stu[i].name, p);
printf("update is succeed!\n");
}
printf("please ask update EnglishScore?(y/n):");
getchar();
cs1 = getchar();
if (cs1 == 'y') {
printf("please input a new EnglishScore:");
scanf("%d",&grade);
stu[i].EnglishScore = grade;
printf("update is succeed!\n");
}
printf("please ask update mathScore?(y/n):");
getchar();
cs2 = getchar();
if (cs2 == 'y') {
printf("please input a new mathScore:");
scanf("%d",&grade);
stu[i].mathScore = grade;
printf("update is succeed!\n");
}
printf("please ask update chineseScore?(y/n):");
getchar();
cs3 = getchar();
if (cs3 == 'y') {
printf("please input a new chineseScore:");
scanf("%d",&grade);
stu[i].chineseScore = grade;
printf("update is succeed!\n");
break;
} else { // 是否应该存在
getchar();
break;
}
} else if ( i == len - 1){// 到达循环结束条件
printf("error,don't have the sno!");
break;
} else {
continue;
}
}
}
// 查询数据
void menu(struct Student stu[], int m)
{
int logel = 1;
while (logel)
{
seekScreen();
int n;
scanf("%d",&n);
char name[20];
int num;
switch (n)
{
case 1:
printf("请输入学生的姓名:");
scanf("%s",name);
search(stu, count, name);
break;
case 2:
printf("请输入学生的学号:");
scanf("%d",&num);
search1(stu, count, num);
case 3:
print(stu, count);
break;
case 4:
sort(stu, count);
print(stu, count);
break;
case 5:
max_min(stu, count);
break;
case 6:
logel = 0;
break;
default:
logel = 0;
printf("输入的数字有无!\n");
break;
}
}
}
void search(struct Student stu[], int n, char Name[])
{
char *p = Name;
int flag = 0;
for (int i = 0; i < n; i++) {
if (strcmp(stu[i].name, p) == 0) {
flag = 1;
My_print_sum(stu, i);
}
}
if (flag == 0) {
printf("the name is not!\n");
}
}
void search1(struct Student stu[], int n, int Num)
{
int flag = 0;
for (int i = 0; i < n; i++) {
if (stu[i].sno == Num) {
flag = 1;
My_print_sum(stu, i);
}
}
if (flag == 0) {
printf("the sno is not!\n");
}
}
void sort(struct Student stu[],int n)
{
float sum[N];
for(int i=0;i<n;i++)
{
sum[i]=stu[i].EnglishScore+stu[i].mathScore+stu[i].chineseScore;
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(sum[j]<sum[j+1])
{
float temp1 = sum[j];
sum[j] = sum[j+1];
sum[j+1] = temp1;
struct Student temp;
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
}
void max_min(struct Student stu[], int n)
{
sort(stu, n);
printf("成绩最好的同学:");
My_print_sum(stu, 0); // 没有排除存在成绩一样的同学
printf("成绩最差的同学:");
My_print_sum(stu, n - 1); // 没有排除存在成绩一样的同学
}
void print(struct Student stu[], int n)
{
for(int i = 0; i < n; i++) {
My_print_sum(stu, i);
}
}
void My_print_sum(struct Student stu[], int n)
{
printf("\n姓名:%s,学号:%d,年龄:%d,性别:%c,英语:%.2f,数学:%.2f,语文: %.2f,总分:%.2f\n",// 保留2位小数
stu[n].name,stu[n].sno,stu[n].age,stu[n].gender,
stu[n].EnglishScore,stu[n].mathScore,stu[n].chineseScore,
(stu[n].EnglishScore+stu[n].mathScore+stu[n].chineseScore));
}
郑重声明本文章的代码是我对照着 https://www.cnblogs.com/XYQ-208910/p/4745371.html 这位大佬的文章敲出来的,如有侵权,立刻删除。
这部分代码还可以完善。1 增加保存功能,2 更换排序算法
打算使用C++语言再次实现