/* 功能4:该函数实现的是对已经存在于系统种的同学的信息进行删除操作,具体想法是学生人数num--,后面所有人的信息前移一个位置,实现信息的覆盖*/ void Delete() { int i, j,flag = -1; char op[2],information[maxsize]; setInfo("请输入:<1>按学号删除<2>按姓名删除", op); if (op[0] == '1') { setInfo("请输入学号", information); for (i = 0; i < num; i++) { if (strcmp(Students[i].Student_ID, information) == 0) { flag = 1; for (j = i + 1; j < num; j++) { copy(&Students[i], &Students[j]); } } } } else { setInfo("请输入姓名", information); for (i = 0; i < num; i++) { if (strcmp(Students[i].Name, information) == 0) { flag = 1; for (j = i + 1; j < num; j++) { copy(&Students[i], &Students[j]); } } } } if (flag == -1) { printf("查无此信息!按回车键返回\n"); wait_for_Enter(); return ; } num--;//数据减少,容量相应减少 printf("删除完成!按回车键返回\n"); wait_for_Enter(); }请完善此删除功能,其查找学生姓名准备进行删除功能时,可以查找重名的情况,并且能精确到删除某一位同学的某一天的考勤记录
时间: 2024-04-27 19:25:31 浏览: 23
在该删除功能中,如果存在同名学生,只会删除第一个匹配到的学生信息,无法精确到删除某一位同学的某一天的考勤记录。为了实现该功能,可以在学生信息结构体中增加一个存储考勤记录的数组,同时在删除学生信息时,将对应学生的考勤记录也删除。具体实现步骤如下:
1.在学生信息结构体中增加一个存储考勤记录的数组,例如 Attendance[31],表示每个月有31天,可以存储每天的考勤记录。
2.在删除学生信息时,先查找到对应的学生信息,然后将该学生之后的所有学生信息和考勤记录依次往前移动一个位置,并将最后一个学生信息和考勤记录清空。
3.如果存在同名学生,则在删除学生信息时,需要进一步匹配考勤记录中的日期信息,找到对应日期的考勤记录进行删除。
完善后的代码如下:
/* 功能4:该函数实现的是对已经存在于系统种的同学的信息进行删除操作,具体想法是学生人数num--,后面所有人的信息前移一个位置,实现信息的覆盖*/
void Delete()
{
int i, j, k, flag = -1;
char op[2], information[maxsize];
setInfo("请输入:<1>按学号删除<2>按姓名删除", op);
if (op[0] == '1')
{
setInfo("请输入学号", information);
for (i = 0; i < num; i++)
{
if (strcmp(Students[i].Student_ID, information) == 0)
{
flag = 1;
for (j = i + 1; j < num; j++)
{
copy(&Students[i], &Students[j]);
for(k = 0; k < 31; k++) // 删除对应学生的考勤记录
{
Students[i].Attendance[k] = 0;
}
i++;
}
// 清空最后一个学生的信息和考勤记录
clear(&Students[num-1]);
for(k = 0; k < 31; k++)
{
Students[num-1].Attendance[k] = 0;
}
}
}
}
else
{
setInfo("请输入姓名", information);
for (i = 0; i < num; i++)
{
if (strcmp(Students[i].Name, information) == 0)
{
flag = 1;
int count = 0;
for (j = i + 1; j < num; j++)
{
if(strcmp(Students[i].Name, Students[j].Name) == 0) // 存在同名学生
{
char date[3];
setInfo("请输入要删除考勤记录的日期", date);
int d = atoi(date);
if(d >= 1 && d <= 31) // 输入的日期合法
{
Students[i].Attendance[d-1] = 0; // 删除对应学生的考勤记录
count++;
}
}
else
{
copy(&Students[i], &Students[j]);
for(k = 0; k < 31; k++) // 删除对应学生的考勤记录
{
Students[i].Attendance[k] = 0;
}
i++;
}
}
// 清空最后 count 个同名学生的信息和考勤记录
for(k = 0; k < count; k++)
{
clear(&Students[num-k-1]);
for(int d = 0; d < 31; d++)
{
Students[num-k-1].Attendance[d] = 0;
}
}
// 清空最后一个不同名学生的信息和考勤记录
clear(&Students[num-count-1]);
for(k = 0; k < 31; k++)
{
Students[num-count-1].Attendance[k] = 0;
}
}
}
}
if (flag == -1)
{
printf("查无此信息!按回车键返回\n");
wait_for_Enter();
return ;
}
num--;//数据减少,容量相应减少
printf("删除完成!按回车键返回\n");
wait_for_Enter();
}