文章目录
概要
采用结构体数组存储学生信息(包括学号、姓名、各科成绩),按成绩(总分)排序,按学号、姓名查找。
要求:
(1)能够正确实现学生信息的存储、排序、查找等操作;
(2)对原程序进行注释,包括文件头注释和相应行注释;
设计思路
简单来说,需要先有一张表来存储学生的成绩信息,要对表实现增删改查及排序的功能。
一、定义一个存储学生成绩信息的结构体
由于是多类型的数据,所以不定义结构体的类型。
//学生成绩表
struct Student
{
int xuhao; //序号
int xuehao; //学号
char xingming[20]; //姓名
int yuwen; //语文
int shuxue; //数学
int yingyu; //英语
int zongfen; //总分
};
二、创建学生成绩表
开始导入学生成绩信息。
//创建学生成绩表
void createStudent()
{
struct Student s; //临时存储信息的表
int i;
for (i = 1 ; i <= MAX_STUDENTS; i++){
s.xuhao = i;
printf("请输入学生的信息(学号 姓名 语文分数 数学分数 英语分数):\n");
scanf("%d %s %d %d %d", &s.xuehao, s.xingming, &s.yuwen, &s.shuxue, &s.yingyu);
s.zongfen = s.yuwen + s.shuxue + s.yingyu;
stu[i] = s; //将学生成绩信息存入学生成绩表
sum_stu = i; //学生数量
if(true){
char judge;
printf("是否要继续添加学生(请输入Y/N)?\n");
scanf("%s", &judge);
if(judge == 'Y') printf("");
else if(judge == 'N') return;
else return;
}
}
}
三、插入学生成绩信息
此方法实现了在表中的任何位置插入新增的学生成绩信息。
//插入学生成绩信息
void insertStudent()
{
if (sum_stu >= MAX_STUDENTS) {
printf("学生成绩表空间已满!\n");
return;
}
struct Student s; //临时存储信息的表
printf("输入要插入学生的学号:\n");
scanf("%d", &s.xuehao);
int judge = judge_By_xuehao(s.xuehao);
if(judge == 1){ //判断表中是否已有该学号的学生
printf("此学号已经存在!\n");
return;
}else{
printf("请输入学生的信息(姓名 语文分数 数学分数 英语分数):\n");
scanf("%s %d %d %d", s.xingming, &s.yuwen, &s.shuxue, &s.yingyu);
s.zongfen = s.yuwen + s.shuxue + s.yingyu;
for(int i = 1; i <= sum_stu; i++){
if(s.xuehao < stu[i].xuehao){ //寻找该学生插入的位置
for (int j = sum_stu; i <= j; j--){
stu[j + 1] = stu[j]; //将该位置及其下面的数据向下移动一个位置
stu[j + 1].xuhao = j + 1; //更新序号
}
s.xuhao = i; //设置插入学生的序号
stu[i] = s;
sum_stu = sum_stu + 1; //学更新生数量
return;
}
}
if (s.xuehao > stu[sum_stu].xuehao){ //此学号比其他所有学生的学号都大,则直接在最后插入此学生的成绩信息
stu[sum_stu + 1] = s;
stu[sum_stu + 1].xuhao = sum_stu + 1;
sum_stu = sum_stu + 1; //更新学生数量
}
}
}
四、更新学生成绩信息
此方法实现了更新(修改)表中的学生成绩信息。
//更新学生各科成绩
void update_stu_score()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("要更新谁的成绩?请输入该学生的学号:\n");
int id;
int p = scanf("%d", &id);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
int judge = judge_By_xuehao(id);
if (judge == 1){ //表中存在该学号的学生
int k = get_xuhao(id); //查找该学生的序号
printf("输入%s的各科成绩(语文 数学 英语):\n", stu[k].xingming);
scanf("%d %d %d", &stu[k].yuwen, &stu[k].shuxue, &stu[k].yingyu);
stu[k].zongfen = stu[k].yuwen + stu[k].shuxue + stu[k].yingyu;
}else{
printf("表中没有学号为%d的学生!\n", id);
}
}
}
五、删除学生成绩信息
此方法实现了删除表中某个学生的成绩信息。
//删除学生成绩信息
void delete_stu()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("要删除谁的成绩?请输入该学生的学号:\n");
int id;
int p = scanf("%d", &id);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
int k = judge_By_xuehao(id);
if (k == 1){ //表中存在此学号的学生
int n = get_xuhao(id); //获取此学生的序号
for (int i = n; i <= sum_stu; i++){
stu[i] = stu[i + 1];
stu[i].xuhao = i; //更新序号
}
sum_stu = sum_stu - 1; //更新学生数量
}else{
printf("表中没有学号为%d的学生!\n", id);
}
}
}
六、查询学生成绩信息
次方法是一个顺序查找方法,依次输出表中的所有数据。
//打印学生成绩表
void printStudent()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
//printf("学生的成绩如下:\n");
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
for(int i = 1; i <= sum_stu; i++){
printf("%d\t%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].xuhao, stu[i].xuehao, stu[i].xingming, stu[i].yuwen, stu[i].shuxue, stu[i].yingyu, stu[i].zongfen);
}
}
七、按学号查找学生成绩信息
此方法实现了根据学生的学号来查找此学生的成绩信息。
//按学号查找学生成绩
void search_by_id()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("输入该学生的学号:\n");
int id;
int p = scanf("%d", &id);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
int k = judge_By_xuehao(id); //判断表中是否存在此学号
if (k == 1){
for (int i = 1; i <= sum_stu; i++){
if (id == stu[i].xuehao){
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%d\t%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].xuhao, stu[i].xuehao, stu[i].xingming, stu[i].yuwen, stu[i].shuxue, stu[i].yingyu, stu[i].zongfen);
}
}
}else{
printf("表中没有学号为%d的学生!\n", id);
}
}
}
八、按姓名查找学生成绩信息
此方法实现了根据姓名来查找学生的成绩信息。
//按姓名查找学生成绩
void search_by_name()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("输入该学生的姓名:\n");
char name[20];
int p = scanf("%s", name);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
for (int i = 1; i <= sum_stu; i++){
int n = strcmp(name, stu[i].xingming); //判断两个字符串是否相等
if (n == 0){
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%d\t%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].xuhao, stu[i].xuehao, stu[i].xingming, stu[i].yuwen, stu[i].shuxue, stu[i].yingyu, stu[i].zongfen);
return;
}
}
printf("表中没有名字叫%s的学生!\n", name);
}
}
九、按学号排序
此方法实现了根据学号的先后顺序来对表中的数据进行排序。
(ps:采用冒泡排序)
//按学号排序
void sort_by_id()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
for (int i = 1; i <= sum_stu; i++) {
for (int j = 1; j <= sum_stu - i; j++){
if (stu[j].xuehao > stu[j + 1].xuehao){
//交换两个位置的数据
struct Student temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
//交换两个位置的序号
temp.xuhao = stu[j].xuhao;
stu[j].xuhao = stu[j + 1].xuhao;
stu[j + 1].xuhao = temp.xuhao;
}
}
}
printStudent();
}
十、按成绩(总分)排序
此方法实现了对学生成绩总分按降序排序。
(ps:采用冒泡排序)
//按成绩(总分)排序
void sort_by_score()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
for (int i = 1; i <= sum_stu; i++) {
for (int j = 1; j <= sum_stu - i; j++){
if (stu[j].zongfen < stu[j + 1].zongfen){
//交换两个位置的数据
struct Student temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
//交换两个位置的序号
temp.xuhao = stu[j].xuhao;
stu[j].xuhao = stu[j + 1].xuhao;
stu[j + 1].xuhao = temp.xuhao;
}
}
}
printStudent();
}
十一、菜单信息
打印菜单信息,提供输入选择。
//菜单信息
void showInfo()
{
printf("·············\n");
printf("·1.创建学生成绩表····\n");
printf("·2.插入学生成绩·····\n");
printf("·3.更新学生成绩·····\n");
printf("·4.删除学生成绩信息···\n");
printf("·5.按学号查找学生成绩··\n");
printf("·6.按姓名查找学生成绩··\n");
printf("·7.按学号排序······\n");
printf("·8.按成绩(总分)排序··\n");
printf("·9.打印学生成绩表····\n");
printf("·10. 退出程序······\n");
printf("·············\n");
}
十二、主函数
控制程序的执行过程,以便于测试程序、处理故障。
int main() {
while(1){
showInfo();
printf("输入的您的选择:\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
createStudent();
break;
case 2:
insertStudent();
break;
case 3:
update_stu_score();
break;
case 4:
delete_stu();
break;
case 5:
search_by_id();
break;
case 6:
search_by_name();
break;
case 7:
sort_by_id();
break;
case 8:
sort_by_score();
break;
case 9:
printStudent();
break;
case 10:
printf("正在退出,请稍后......\n");
exit(0);
break;
default:
printf("输入有误!\n");
break;
}
}
return 0;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 10000
//学生成绩表
struct Student
{
int xuhao; //序号
int xuehao; //学号
char xingming[20]; //姓名
int yuwen; //语文
int shuxue; //数学
int yingyu; //英语
int zongfen; //总分
};
struct Student stu[MAX_STUDENTS]; //存储学生成绩信息的表
int sum_stu = 0; //学生数量
//创建学生成绩表
void createStudent()
{
struct Student s; //临时存储信息的表
int i;
for (i = 1 ; i <= MAX_STUDENTS; i++){
s.xuhao = i;
printf("请输入学生的信息(学号 姓名 语文分数 数学分数 英语分数):\n");
scanf("%d %s %d %d %d", &s.xuehao, s.xingming, &s.yuwen, &s.shuxue, &s.yingyu);
s.zongfen = s.yuwen + s.shuxue + s.yingyu;
stu[i] = s; //将学生成绩信息存入学生成绩表
sum_stu = i; //学生数量
if(true){
char judge;
printf("是否要继续添加学生(请输入Y/N)?\n");
scanf("%s", &judge);
if(judge == 'Y') printf("");
else if(judge == 'N') return;
else return;
}
}
}
//打印学生成绩表
void printStudent()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
//printf("学生的成绩如下:\n");
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
for(int i = 1; i <= sum_stu; i++){
printf("%d\t%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].xuhao, stu[i].xuehao, stu[i].xingming, stu[i].yuwen, stu[i].shuxue, stu[i].yingyu, stu[i].zongfen);
}
}
//判断表中是否存在该学号的学生
int judge_By_xuehao(int n)
{
for(int i = 1; i <= sum_stu; i++){
if(stu[i].xuehao == n){
return 1; //此学号已经存在
}
}
return 0; //不存在此学号
}
//根据学号查找学生的序号
int get_xuhao(int k)
{
for (int i = 1; i <= sum_stu; i++){
if (k == stu[i].xuehao){
return stu[i].xuhao;
}
}
return 0;
}
//插入学生成绩信息
void insertStudent()
{
if (sum_stu >= MAX_STUDENTS) {
printf("学生成绩表空间已满!\n");
return;
}
struct Student s; //临时存储信息的表
printf("输入要插入学生的学号:\n");
scanf("%d", &s.xuehao);
int judge = judge_By_xuehao(s.xuehao);
if(judge == 1){ //判断表中是否已有该学号的学生
printf("此学号已经存在!\n");
return;
}else{
printf("请输入学生的信息(姓名 语文分数 数学分数 英语分数):\n");
scanf("%s %d %d %d", s.xingming, &s.yuwen, &s.shuxue, &s.yingyu);
s.zongfen = s.yuwen + s.shuxue + s.yingyu;
for(int i = 1; i <= sum_stu; i++){
if(s.xuehao < stu[i].xuehao){ //寻找该学生插入的位置
for (int j = sum_stu; i <= j; j--){
stu[j + 1] = stu[j]; //将该位置及其下面的数据向下移动一个位置
stu[j + 1].xuhao = j + 1; //更新序号
}
s.xuhao = i; //设置插入学生的序号
stu[i] = s;
sum_stu = sum_stu + 1; //学更新生数量
return;
}
}
if (s.xuehao > stu[sum_stu].xuehao){ //此学号比其他所有学生的学号都大,则直接在最后插入此学生的成绩信息
stu[sum_stu + 1] = s;
stu[sum_stu + 1].xuhao = sum_stu + 1;
sum_stu = sum_stu + 1; //更新学生数量
}
}
}
//更新学生各科成绩
void update_stu_score()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("要更新谁的成绩?请输入该学生的学号:\n");
int id;
int p = scanf("%d", &id);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
int judge = judge_By_xuehao(id);
if (judge == 1){ //表中存在该学号的学生
int k = get_xuhao(id); //查找该学生的序号
printf("输入%s的各科成绩(语文 数学 英语):\n", stu[k].xingming);
scanf("%d %d %d", &stu[k].yuwen, &stu[k].shuxue, &stu[k].yingyu);
stu[k].zongfen = stu[k].yuwen + stu[k].shuxue + stu[k].yingyu;
}else{
printf("表中没有学号为%d的学生!\n", id);
}
}
}
//删除学生成绩信息
void delete_stu()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("要删除谁的成绩?请输入该学生的学号:\n");
int id;
int p = scanf("%d", &id);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
int k = judge_By_xuehao(id);
if (k == 1){ //表中存在此学号的学生
int n = get_xuhao(id); //获取此学生的序号
for (int i = n; i <= sum_stu; i++){
stu[i] = stu[i + 1];
stu[i].xuhao = i; //更新序号
}
sum_stu = sum_stu - 1; //更新学生数量
}else{
printf("表中没有学号为%d的学生!\n", id);
}
}
}
//按学号查找学生成绩
void search_by_id()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("输入该学生的学号:\n");
int id;
int p = scanf("%d", &id);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
int k = judge_By_xuehao(id); //判断表中是否存在此学号
if (k == 1){
for (int i = 1; i <= sum_stu; i++){
if (id == stu[i].xuehao){
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%d\t%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].xuhao, stu[i].xuehao, stu[i].xingming, stu[i].yuwen, stu[i].shuxue, stu[i].yingyu, stu[i].zongfen);
}
}
}else{
printf("表中没有学号为%d的学生!\n", id);
}
}
}
//按姓名查找学生成绩
void search_by_name()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
printf("输入该学生的姓名:\n");
char name[20];
int p = scanf("%s", name);
if (p == 0){
printf("输入的数据有误!\n");
return;
}else{
for (int i = 1; i <= sum_stu; i++){
int n = strcmp(name, stu[i].xingming); //判断两个字符串是否相等
if (n == 0){
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
printf("%d\t%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].xuhao, stu[i].xuehao, stu[i].xingming, stu[i].yuwen, stu[i].shuxue, stu[i].yingyu, stu[i].zongfen);
return;
}
}
printf("表中没有名字叫%s的学生!\n", name);
}
}
//按学号排序
void sort_by_id()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
for (int i = 1; i <= sum_stu; i++) {
for (int j = 1; j <= sum_stu - i; j++){
if (stu[j].xuehao > stu[j + 1].xuehao){
//交换两个位置的数据
struct Student temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
//交换两个位置的序号
temp.xuhao = stu[j].xuhao;
stu[j].xuhao = stu[j + 1].xuhao;
stu[j + 1].xuhao = temp.xuhao;
}
}
}
printStudent();
}
//按成绩(总分)排序
void sort_by_score()
{
if(sum_stu == 0){
printf("表中暂无学生成绩信息!\n");
return;
}
for (int i = 1; i <= sum_stu; i++) {
for (int j = 1; j <= sum_stu - i; j++){
if (stu[j].zongfen < stu[j + 1].zongfen){
//交换两个位置的数据
struct Student temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
//交换两个位置的序号
temp.xuhao = stu[j].xuhao;
stu[j].xuhao = stu[j + 1].xuhao;
stu[j + 1].xuhao = temp.xuhao;
}
}
}
printStudent();
}
//菜单信息
void showInfo()
{
printf("·············\n");
printf("·1.创建学生成绩表····\n");
printf("·2.插入学生成绩·····\n");
printf("·3.更新学生成绩·····\n");
printf("·4.删除学生成绩信息···\n");
printf("·5.按学号查找学生成绩··\n");
printf("·6.按姓名查找学生成绩··\n");
printf("·7.按学号排序······\n");
printf("·8.按成绩(总分)排序··\n");
printf("·9.打印学生成绩表····\n");
printf("·10. 退出程序······\n");
printf("·············\n");
}
int main() {
while(1){
showInfo();
printf("输入的您的选择:\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
createStudent();
break;
case 2:
insertStudent();
break;
case 3:
update_stu_score();
break;
case 4:
delete_stu();
break;
case 5:
search_by_id();
break;
case 6:
search_by_name();
break;
case 7:
sort_by_id();
break;
case 8:
sort_by_score();
break;
case 9:
printStudent();
break;
case 10:
printf("正在退出,请稍后......\n");
exit(0);
break;
default:
printf("输入有误!\n");
break;
}
}
return 0;
}
测试截图
1. 创建学生成绩表
2. 插入学生成绩信息
3. 查询学生成绩信息
4. 更新学生成绩信息
5. 删除学生成绩信息
6. 按学号查找学生成绩信息
7. 按成绩(总分)排序
总结
此程序需要对C语言的结构体、基本数据类型熟练掌握。不要厌倦编程的枯燥,要有独立的思维,更需要有敢于吃苦耐劳的能力。
只要不轻言放弃,坚持下去,你也会成功!