给设计一种结构体,用来保存学生信息(包括学号、姓名、三科成绩、平均成绩)。除平均成绩外,各项数据均由键盘输入。现在要求输入若干学生的信息,并实现以下功能:(可以使用数组或链表实现) 1)计算学生的平均成绩,并填入相应的数据域; 2)插入学生信息; 3)删除学生信息; 4)查询学生信息。
看到有人问这道题或者这个实验,因为刚帮朋友写了类似的这个代码,所以直接修改一下就发出来了,我的实现是通过数组,通过链表也可以实现:
#include
#include
#include
// 声明结构体
struct Student
{
int num;
char name [20];
int score[3];
float ave;
};
// 声明全局变量
const int MAX = 100;
struct Student stu[MAX];
int count = 0; // 学生数组下标
// 函数的声明
void menu(); // 功能选择菜单
void put(); // 输入学生信息
void insert(); // 插入学生信息
void getAverage(); // 计算平均数
void query(); // 查询学生信息
void del(); // 删除学生信息
void list(); // 打印全部学生信息
void stuInfo(int index); // 打印index下标对应的学生信息
// main函数
int main() {
struct Student s[70];
int choice;
while (1)
{
menu();
scanf("%d", &choice);
switch(choice)
{
case 1 :
put();
break;
case 2:
insert();
break;
case 3:
query();
break;
case 4:
getAverage();
break;
case 5:
del();
break;
case 6:
list();
break;
case 0:
exit(0);
default:
printf("无效的输入,请输入0--6的整型数字\n");
break;
}
}
return 0;
}
void menu() {
printf("请选择您要执行的功能:\n");
printf("1.输入学生信息\n");
printf("2.插入学生信息\n");
printf("3.查询学生信息\n");
printf("4.计算学生平均成绩\n");
printf("5.删除学生信息\n");
printf("6.列出所有学生信息\n");
printf("0.退出\n");
}
void put() {
int n;
printf("请输入你想要输入的学生数量:");
scanf("%d", &n);
if(count + n 0) {
// 从index以后的都向后移动一个位置
index--; // 因为数组是从0开始存储
for(int i = count, j = count - 1; i >= index; i--, j--) {
stu[i].num = stu[j].num;
strcpy (stu[i].name, stu[j].name);
stu[i].score[0] = stu[j].score[0];
stu[i].score[1] = stu[j].score[1];
stu[i].score[2] = stu[j].score[2];
stu[i].ave = stu[j].ave;
}
count++;
printf("请输入学生信息,按照学号 姓名 成绩1 成绩2 成绩3 的格式\n");
scanf("%d %s %d %d %d", &stu[index].num, stu[index].name, &stu[index].score[0], &stu[index].score[1], &stu[index].score[2]);
} else {
printf("输入的下标位置已经超过了目前存储的最大位置\n");
}
}
void getAverage() {
if(count == 0) {
printf("还没有数据,请先输入学生信息再进行操作\n");
} else {
for(int i = 0; i < count; i++) {
stu[i].ave = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
}
}
}
void stuInfo(int index) {
printf("学号:%d 姓名:%s 成绩1:%d 成绩2:%d 成绩3:%d 平均成绩:%.2f\n", stu[index].num, stu[index].name, stu[index].score[0],
stu[index].score[1], stu[index].score[2], stu[index].ave);
}
void query() {
int num, flag = 0;
printf("请输入查询学生的学号:");
scanf("%d", &num);
for(int i = 0; i < count; i++) {
if(stu[i].num == num) {
stuInfo(i);
flag = 1;
break;
}
}
if(!flag) {
printf("没有找到对应学生,请检查输入的学号\n");
}
}
void del() {
int num, flag = 0;
printf("请输入要删除的学生学号:");
scanf("%d", &num);
for(int i = 0; i < count - 1; i++) { // 当不是在删除的学生在数组中间时
if(stu[i].num == num) {
int tmp = i;
for(int j = i + 1; j < count; j++, tmp++) {
stu[tmp].num = stu[j].num;
strcpy (stu[tmp].name, stu[j].name);
stu[tmp].score[0] = stu[j].score[0];
stu[tmp].score[1] = stu[j].score[1];
stu[tmp].score[2] = stu[j].score[2];
stu[tmp].ave = stu[j].ave;
}
count--;
flag = 1;
break;
}
}
if(!flag) { // 还没有找到,这时可能在最后一个位置,也可能学号输入错误
if(stu[count - 1].num != num) {
printf("学号输入错误,请重新检查\n");
} else {
count--;
}
}
}
void list() {
for(int i = 0; i < count; i++) {
printf("学号:%d 姓名:%s 成绩1:%d 成绩2:%d 成绩3:%d 平均成绩:%.2f\n", stu[i].num, stu[i].name, stu[i].score[0],
stu[i].score[1], stu[i].score[2], stu[i].ave);
}
}
希望一键三连!!!
|