若想查看C++版,请移步主页查看《C++版-学生考勤系统 不能运行私信骂我》
代码都有注释,也可以私信问我
如是有别的需求改动,可直接私信我帮你解决!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义一个学生类型的结构体
struct Student
{
char name[25]; //名字
int age; //年龄
int num; //学号
int c; //班级
float date; //日期
char Attandance_Result[25]; //考勤结果
};
void PrintfStudentFunction();
//学生的人数,表示当前已经存在的学生数量。它的初始值设置为0,每次添加新的学生时会增加。
int numCount = 0;
//申请空间的容量,后续在通过用户要输入几个学生的个数len 来决定大小,初始值设置为0
//(如果 count 的初始值设置为0,则表示一开始没有为学生结构体数组分配任何内存空间。
//在这种情况下,当用户输入要添加的学生数量 num 大于0时,会进入重新分配内存空间的逻辑。
//也就是说,程序会使用 malloc 函数动态分配大小为 num 的学生结构体数组所需的内存空间,并将这块内存空间的起始地址赋给 PArr。
//接下来,会将用户输入的学生信息存储在这个新分配的内存空间中,并更新 numCount 和 count 的值。
//需要注意的是,在这种情况下,当添加第一个学生时,会将 PArr 指针指向新分配的内存空间。而后续添加的学生仍然会在这个已经分配好的内存空间中存储。
//总结起来,如果将 count 的初始值设置为0,表示一开始没有为学生结构体数组分配内存空间,并且会根据用户输入的学生数量动态分配所需的内存空间。)
int count = 0;
//得到学生人数
int Num();
//定义一个输入函数 从输入中读取学生信息,并将它们存储在 struct Student 类型的数组中。该函数可能会返回更新后的指针,指向包含输入信息的数组。
struct Student *Input(struct Student *pArr, int len);
//输出信息方法,通过传入指向 struct Student 的指针 pArr,函数可以访问学生数组,并将其内容输出
void Output(struct Student *pArr);
//删除信息,通过传入指向 struct Student 的指针 pArr,函数可以访问学生数组,并将其内容删除
void Delete(struct Student *PArr);
//查找信息,...
void Search(struct Student *PArr);
//修改学生信息,...
void Change(struct Student *PArr);
//添加学生信息,...
struct Student *Add(struct Student *PArr);
//排序,...
void Order(struct Student * PArr);
//统计学生数据,...
void studentsta(struct Student *PArr);
//
int i;
int main()
{
//(定义了一个 struct Student 类型的指针 pArr,以及一个整型参数 len。函数的返回类型也是 struct Student*。
struct Student *pArr = NULL;
struct Student *P = NULL;
PrintfStudentFunction();
while (1)
{
printf("请选择操作的命令:\n");
int item, num;
scanf("%d", &item);
switch (item)
{
case 1:
//录入信息
{
num = Num();
P = Input(pArr, num);
}
break;
case 2:
//输出学生信息
{
Output(P);
}
break;
case 3:
//删除学生信息
{
Delete(P);
}
break;
case 4:
//修改学生信息
{
Change(P);
}
break;
case 5:
//查询学生信息
{
Search(P);
}
break;
case 6:
//添加学生信息
{
P = Add(P);
}
break;
case 7:
//排序
{
Order(P);
}
break;
case 8:
//退出系统
{
//程序结束
exit(0);
}
break;
default:
printf("用户输入错误,请重新输入\n");
break;
}
}
return 1;
}
void PrintfStudentFunction()
{
printf("-------------------------------------------------\n");
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("-------------------------------------------------\n");
}
//得到学生人数
int Num()
{
int num;
printf("请输入要录入学生的人数\n");
scanf("%d", &num);
return num;
}
struct Student *Input(struct Student *pArr, int len)
{
//录入学生信息
count = len;
//开辟存储空间
pArr = (struct Student *)malloc(sizeof(struct Student) * len);
for (i = 0; i < len; i++)
{
//当前学生人数+1
numCount++;
printf("请输入第%d个学生的名字:\n", i + 1);
scanf("%s", pArr[i].name);
printf("请输入第%d个学生的年龄\n", i + 1);
scanf("%d", &pArr[i].age);
printf("请输入第%d个学生的学号\n", i + 1);
scanf("%d", &pArr[i].num);
printf("请输入第%d个学生的班级\n",i+1);
scanf("%d",&pArr[i].c);
printf("请输入第%d个学生的打卡时间(xx.xx)\n", i + 1);
scanf("%f", &pArr[i].date);
printf("请输入第%d个学生的考勤结果(出勤 旷课 事假 病假 迟到 早退)\n", i + 1);
scanf("%s", &pArr[i].Attandance_Result);
}
printf("学生信息录入完毕!!!!!!!\n");
PrintfStudentFunction();
return pArr;
}
//输出学生信息
void Output(struct Student *pArr)
{
printf("姓名\t年龄\t学号\t班级\t打卡时间 出勤结果\n");
int i;
for (i = 0; i < numCount; i++)
{
printf("%s\t%d\t%d\t%d\t%.2f\t %s\n", pArr[i].name, pArr[i].age, pArr[i].num,
pArr[i].c,pArr[i].date, pArr[i].Attandance_Result);
}
PrintfStudentFunction();
}
//删除信息
void Delete(struct Student *pArr)
{
int num;
int num1;
int i;
printf("请输入你要删除学生的学号\n");
scanf("%d", &num);
for (i = 0; i < numCount; i++)
{
if (pArr[i].num==num)
{
num1 = i;
}
}
//num = 1;
for (i = num1; i < numCount - 1; i++)
{
pArr[i] = pArr[i + 1];
}
numCount--;
Output(pArr);
}
//查找信息
void Search(struct Student *pArr)
{
printf("请输入要查找学生的名字\n");
char name[25];
scanf("%s", name);
int num;
int i;
printf("姓名\t年龄\t学号\t班级\t打卡时间 出勤结果\n");
for (i = 0; i < numCount; i++)
{
if (strcmp(pArr[i].name, name) == 0)
{
printf("%s\t%d\t%d\t%d\t%.2f\t %s\n",pArr[i].name, pArr[i].age, pArr[i].num,pArr[i].c,pArr[i].date, pArr[i].Attandance_Result);
}
}
PrintfStudentFunction();
}
//修改学生信息
void Change(struct Student *pArr)
{
char name[25];
printf("请输入你要修改学生的名字:\n");
scanf("%s", name);
int num = 0;
int i = 0;
for (i = 0; i < numCount; i++)
{
if (strcmp(pArr[i].name, name) == 0)
{
num = i;
break;
}
}
if (num == i)
{
printf("请输入修改后的学生名字:\n");
scanf("%s", pArr[num].name);
printf("请输入学生的年龄:\n");
scanf("%d", &pArr[num].age);
printf("请输入学生的学号:\n");
scanf("%d", &pArr[num].num);
printf("请输入学生的班级\n");
scanf("%d", &pArr[num].c);
printf("请输入学生的打卡时间\n");
scanf("%f", &pArr[num].date);
printf("请输入学生的考勤结果(出勤 旷课 事假 病假 迟到 早退)\n");
scanf("%s", &pArr[num].Attandance_Result);
}
else
{
printf("对不起没有要修改的学生信息");
}
PrintfStudentFunction();
}
//添加学生信息
struct Student *Add(struct Student *pArr)
{
printf("请输入要添加的人数\n");
int num;
int i;
scanf("%d", &num);
if (numCount + num > count)
{
struct Student *p = NULL;
p = pArr;
pArr = (struct Student *)malloc(sizeof(struct Student) * (numCount + num));
count = numCount + num;
for (i = 0; i < numCount; i++)
{
pArr[i] = p[i];
}
}
for (i = 0; i < num; i++)
{
printf("请输入第%d个添加学生的名字:\n", i + 1);
scanf("%s", pArr[numCount].name);
printf("请输入第%d个添加学生的年龄:\n", i + 1);
scanf("%d", &pArr[numCount].age);
printf("请输入第%d个添加学生的学号:\n", i + 1);
scanf("%d", &pArr[numCount].num);
printf("请输入第%d个添加学生的班级:\n", i + 1);
scanf("%d", &pArr[numCount].c);
printf("请输入第%d个添加学生的打卡时间:\n", i + 1);
scanf("%f", &pArr[numCount].date);
printf("请输入第%d个添加学生的考勤结果(出勤 旷课 事假 病假 迟到 早退):\n", i + 1);
scanf("%s", &pArr[numCount].Attandance_Result);
numCount++;
}
printf("数据添加成功");
PrintfStudentFunction();
return pArr;
}
void Order(struct Student *pArr)
{
int op;
int i;
int j;
struct Student temp;
printf("<1>学号升序 <2>姓名升序\n");
scanf("%d",&op);
if(op==1)
{
//将学生信息按学号排序
for(i=0;i<numCount-1;i++)
{
for(j=0;j<numCount-i-1;j++)
{
if(pArr[j].num>pArr[j+1].num)
{temp=pArr[j];
pArr[j]=pArr[j+1];
pArr[j+1]=temp;}
}
}
}
//将学生信息按姓名排序
else
if(op==2)
{
void StudentNameAsc(struct Student *pArr);
{
struct Student temp;
for(i=0;i<numCount-1;i++)
{
for(j=0;j<numCount-i-1;j++)
{
if(pArr[j].name[0]>pArr[j+1].name[0])
{
temp=pArr[j];
pArr[j]=pArr[j+1];
pArr[j+1]=temp;
}
}
}
}
}
Output(pArr);
}
//数据统计
//void studentsta(struct Student *pArr)
//{
// printf("请输入应打卡次数:\n");
// int num2;
// scanf("%d", &num2);
// for(i=0;i<numCount;i++)
// {
// if (num2>pArr[i].Attandance_Result)
// printf("%s没有打卡%d次\n", pArr[i].name,num2-pArr[i].Attandance_Result);
//
// }
// Output(pArr);
//}