一、任务要求
1、数据存储
你需要将⼀系列的学生期末考试信息进行存储(学生人数不会超过100)。每个学生的信 息包括:姓名;学号; C语言成绩(一个大于等于零的整数);GPA等级(A+,A,B+,B,C+,C,D,F );班级排名(成绩相同需并列)。其中,姓名,学号,成绩,GPA等级为输入数据,其余数据需要你计算。 同时,你需要添加⼀些维护数据库的功能: Add(name, id, score): 新增⼀个学生的信息; Delete(id): 根据学号删除某个学生的信息; Search(id):根据学号查找某个学生的信息。
2、数据处理
Sort_by_id()
:生成根据学号顺序排列学生信息的表格
Sort_by_score()
:生成根据分数由高到低顺序排列学生信息的表格
Max():
返回最高分学生的信息
Min():
返回最低分学生的信息
Ave():
返回所有学生期末成绩平均分
3、用户界面
实现⼀个菜单,以供用户决定要使用哪个功能。
菜单参考:
Hello, pls input a series of student information!
(
用户开始输入
)
Okay, data upload finished. What do you what to do next? You can enter a number to tell me.
1 add
2 delete
3 search
4 sort by id
5 sort by score
6 best score
7 worst score
8 prime judge
9 coprime judge
二、各功能实现
1、界面打印
void menu() //打印菜单
{
printf("Do you still need my service? You can enter a number to tell me.\n");
printf("1 add\n2 delet\n3 search\n4 sort by id\n5 sort by score\n6 best score\n7 worst score\n8 average value\n0 exit\n");
printf("请输入:");
}
2、录入学生数据
此处创建一个结构体用来存储学生的信息
struct student //存储学生信息
{
char name[10];//姓名
int number;//学号 注意不要超过存储范围
int score;//分数
char GPA[2];//GPA等级(A+, A, B+, B, C+, C, D, F )
};
在通过循环输入录入学生信息
printf("请输入想录入学生的人数:");
scanf("%d", &len);
struct student member[101];
int i = 0;
while (1)
{
for (i = 0; i < len; i++)
{
printf("请输入第%d个学生信息:", i + 1);
scanf("%s %d %d %s", &member[i].name, &member[i].number, &member[i].score, &member[i].GPA);
}
break;
}
3、添加学生信息
void add(struct student* num, int len)//添加学生信息
{
printf("请输入学生信息");
scanf("%s %d %d %s", &num[len].name, &num[len].number, &num[len].score, &num[len].GPA);
len++;//添加之后总人数增加
}
4、删除学生信息
int delete(struct student* num) //删除学生
{
int number = 0;
printf("请输入要删除学生的学号:");
scanf("%d", &number);
int i = 0;
for (i = 0; i < len; i++)
{
if (number == num[i].number)
{
if (i != len - 1)
{
num[i] = num[len-1];
len--; //减少总人数
return 0;//跳出函数
}
else
{
num[i] = num[len];
len--;//减少总人数
return 0;
}
}
}
printf("没有找到该学生\n");
return 0;
}
5、查找某个学生
int search(struct student* num)//查找学生
{
int number = 0;
printf("请输入要查找学生的学号:");
scanf("%d", &number);
int i = 0;
for (i = 0; i < len; i++)
{
if (number == num[i].number)
{
printf("找到了,姓名:%s 学号:%d 成绩:%d GPA:%s\n", num[i].name, num[i].number, num[i].score, num[i].GPA);
return 0;//跳出函数
}
}
printf("没有此学号的学生\n");
return 0;
}
6、生成根据学号顺序排列学生信息的表格
void sort_by_id(struct student* num)//生成根据学号顺序排列学生信息的表格
{
//使用冒泡排序
int i = 0;
int j = 0;
int tem = 0;
for (i = 0; i < len - 1; i++)//len-1是因为不用与自己比较,所以比的数就少一个
{
int count = 0;
for (j = 0; j < len - 1 - i; j++)
{
if (num[j].number > num[j + 1].number)//升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
{
num[len] = num[j];
num[j] = num[j + 1];
num[j + 1] = num[len];
count = 1;
}
}
if (count == 0)//如果某一趟没有交换位置,则说明已经排好序,直接退出循环
{
break;
}
}
for (i = 0; i < len; i++)
{
printf("排序后:%d 姓名:%s 学号:%d 成绩:%d GPA:%s\n", i+1,num[i].name, num[i].number, num[i].score, num[i].GPA);
}
}
7、生成根据分数由高到低顺序排列学生信息的表格
void sort_by_score(struct student* num)//生成根据分数由高到低顺序排列学生信息的表格
{
//和学号排序一样,将number改成score即可
int i = 0;
int j = 0;
int tem = 0;
for (i = 0; i < len - 1; i++)//len-1是因为不用与自己比较,所以比的数就少一个
{
int count = 0;
for (j = 0; j < len - 1 - i; j++)
{
if (num[j].score > num[j + 1].score)//升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
{
num[len] = num[j];
num[j] = num[j + 1];
num[j + 1] = num[len];
count = 1;
}
}
if (count == 0)//如果某一趟没有交换位置,则说明已经排好序,直接退出循环
{
break;
}
}
for (i = 0; i < len; i++)
{
printf("排序后:%d 姓名:%s 学号:%d 成绩:%d GPA:%s\n", i+1, num[i].name, num[i].number, num[i].score, num[i].GPA);
}
}
8、返回最高分学生的信息
void max(struct student* num)//返回最高分学生的信息
{
int i = 0;
int x = 0;//用于找到最高分学生的下标
int arr = num[0].score;
for (i = 1; i < len-1; i++)
{
if (num[i].score > arr)
{
arr = num[i].score;
x = i;
}
}
printf("找到了,姓名:%s 学号:%d 成绩:%d GPA:%s\n", num[x].name, num[x].number, num[x].score, num[x].GPA);
}
9、返回最低分学生的信息
void min(struct student* num)//返回最低分学生的信息
{
int i = 0;
int x = 0;//用于找到最低分学生的下标
int arr = num[0].score;
for (i = 1; i < len - 1; i++)
{
if (num[i].score < arr)
{
arr = num[i].score;
x = i;
}
}
printf("找到了,姓名:%s 学号:%d 成绩:%d GPA:%s\n", num[x].name, num[x].number, num[x].score, num[x].GPA);
}
10、返回所有学生期末成绩平均分
void ave(struct student* num)//返回所有学生期末成绩平均分
{
double ave = 0;
int i = 0;
int sum = 0;
for (i = 0; i < len; i++)
{
sum += num[i].score;
}
ave = (sum *1.0)/ len;
printf("学生期末成绩平均分为:%.3f", ave);
}
11、主函数功能选择的实现
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1: add(&member,len) ; break;//添加学生信息
case 2: delete(&member); break;//根据学号删除某个学生的信息
case 3: search(&member); break;// 根据学号查找某个学生的信息
case 4: sort_by_id(&member); break;//生成根据学号顺序排列学生信息的表格
case 5: sort_by_score(&member); break;//生成根据分数由高到低顺序排列学生信息的表格
case 6: max(&member); break;//返回最高分学生的信息
case 7: min(&member); break;//返回最低分学生的信息
case 8: ave(&member); break;//返回所有学生期末成绩平均分
case 0: ; break;
}
} while (input);
三、总程序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int len = 0; //学生的存储人数
struct student //存储学生信息
{
char name[10];//姓名
int number;//学号 注意不要超过存储范围
int score;//分数
char GPA[2];//GPA等级(A+, A, B+, B, C+, C, D, F )
};
void menu() //打印菜单
{
printf("Do you still need my service? You can enter a number to tell me.\n");
printf("1 add\n2 delet\n3 search\n4 sort by id\n5 sort by score\n6 best score\n7 worst score\n8 average value\n0 exit\n");
printf("请输入:");
}
void add(struct student* num, int len)//添加学生信息
{
printf("请输入学生信息");
scanf("%s %d %d %s", &num[len].name, &num[len].number, &num[len].score, &num[len].GPA);
len++;//添加之后总人数增加
}
int delete(struct student* num) //删除学生
{
int number = 0;
printf("请输入要删除学生的学号:");
scanf("%d", &number);
int i = 0;
for (i = 0; i < len; i++)
{
if (number == num[i].number)
{
if (i != len - 1)
{
num[i] = num[len-1];
len--; //减少总人数
return 0;//跳出函数
}
else
{
num[i] = num[len];
len--;//减少总人数
return 0;
}
}
}
printf("没有找到该学生\n");
return 0;
}
int search(struct student* num)//查找学生
{
int number = 0;
printf("请输入要查找学生的学号:");
scanf("%d", &number);
int i = 0;
for (i = 0; i < len; i++)
{
if (number == num[i].number)
{
printf("找到了,姓名:%s 学号:%d 成绩:%d GPA:%s\n", num[i].name, num[i].number, num[i].score, num[i].GPA);
return 0;//跳出函数
}
}
printf("没有此学号的学生\n");
return 0;
}
void sort_by_id(struct student* num)//生成根据学号顺序排列学生信息的表格
{
//使用冒泡排序
int i = 0;
int j = 0;
int tem = 0;
for (i = 0; i < len - 1; i++)//len-1是因为不用与自己比较,所以比的数就少一个
{
int count = 0;
for (j = 0; j < len - 1 - i; j++)
{
if (num[j].number > num[j + 1].number)//升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
{
num[len] = num[j];
num[j] = num[j + 1];
num[j + 1] = num[len];
count = 1;
}
}
if (count == 0)//如果某一趟没有交换位置,则说明已经排好序,直接退出循环
{
break;
}
}
for (i = 0; i < len; i++)
{
printf("排序后:%d 姓名:%s 学号:%d 成绩:%d GPA:%s\n", i+1,num[i].name, num[i].number, num[i].score, num[i].GPA);
}
}
void sort_by_score(struct student* num)//生成根据分数由高到低顺序排列学生信息的表格
{
//和学号排序一样,将number改成score即可
int i = 0;
int j = 0;
int tem = 0;
for (i = 0; i < len - 1; i++)//len-1是因为不用与自己比较,所以比的数就少一个
{
int count = 0;
for (j = 0; j < len - 1 - i; j++)
{
if (num[j].score > num[j + 1].score)//升序排法,前一个数和后一个数比较,如果前数大则与后一个数换位置
{
num[len] = num[j];
num[j] = num[j + 1];
num[j + 1] = num[len];
count = 1;
}
}
if (count == 0)//如果某一趟没有交换位置,则说明已经排好序,直接退出循环
{
break;
}
}
for (i = 0; i < len; i++)
{
printf("排序后:%d 姓名:%s 学号:%d 成绩:%d GPA:%s\n", i+1, num[i].name, num[i].number, num[i].score, num[i].GPA);
}
}
void max(struct student* num)//返回最高分学生的信息
{
int i = 0;
int x = 0;//用于找到最高分学生的下标
int arr = num[0].score;
for (i = 1; i < len-1; i++)
{
if (num[i].score > arr)
{
arr = num[i].score;
x = i;
}
}
printf("找到了,姓名:%s 学号:%d 成绩:%d GPA:%s\n", num[x].name, num[x].number, num[x].score, num[x].GPA);
}
void min(struct student* num)//返回最低分学生的信息
{
int i = 0;
int x = 0;//用于找到最低分学生的下标
int arr = num[0].score;
for (i = 1; i < len - 1; i++)
{
if (num[i].score < arr)
{
arr = num[i].score;
x = i;
}
}
printf("找到了,姓名:%s 学号:%d 成绩:%d GPA:%s\n", num[x].name, num[x].number, num[x].score, num[x].GPA);
}
void ave(struct student* num)//返回所有学生期末成绩平均分
{
double ave = 0;
int i = 0;
int sum = 0;
for (i = 0; i < len; i++)
{
sum += num[i].score;
}
ave = (sum *1.0)/ len;
printf("学生期末成绩平均分为:%.3f", ave);
}
int main()
{
printf("请输入想录入学生的人数:");
scanf("%d", &len);
struct student member[101];
int i = 0;
while (1)
{
for (i = 0; i < len; i++)
{
printf("请输入第%d个学生信息:", i + 1);
scanf("%s %d %d %s", &member[i].name, &member[i].number, &member[i].score, &member[i].GPA);
}
break;
}
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1: add(&member,len) ; break;//添加学生信息
case 2: delete(&member); break;//根据学号删除某个学生的信息
case 3: search(&member); break;// 根据学号查找某个学生的信息
case 4: sort_by_id(&member); break;//生成根据学号顺序排列学生信息的表格
case 5: sort_by_score(&member); break;//生成根据分数由高到低顺序排列学生信息的表格
case 6: max(&member); break;//返回最高分学生的信息
case 7: min(&member); break;//返回最低分学生的信息
case 8: ave(&member); break;//返回所有学生期末成绩平均分
case 0: ; break;
}
} while (input);
return 0;
}
本文描述了一个C语言编写的程序,用于管理学生期末考试信息,包括添加、删除、查找、按学号和分数排序以及统计最高分、最低分和平均分等功能。用户可以通过菜单进行操作。

1166

被折叠的 条评论
为什么被折叠?



