程序设计我想做一个学生考勤系统
此为结构体要素(几乎大部分功能函数无误可忽略)
此为读文件代码
此为终端输出和保存数据代码
运行后输入5 会出现一行无学生信息的文字
后输入1 添加一名学生信息
后输入5 再次查看 信息已输入但是无信息文字还在
随后输入8保存后输入9退出 查看文本 文本中存在刚刚输入的一项信息
后再次打开程序 输入5查看 原本发现无信息文字被所输入信息填满 即第一条输入的学生信息会重复两次
后续大量数据发现 只有第一个输入的学生信息会被重复两遍 其余功能均正常使用 而在show函数中多添加一个pr=pr->next就能只输出一个首位学生信息
本人 感觉问题会不会feof()导致多读一行重复了
求帮忙看看 以及怎么修改 以下是源码
#include"Attendance system.h";
int sum1 = 0, sum2 = 0, sum3 = 0;
char xuehao[100];//学号
char name[100];//姓名
char banji[100];//班级
char data[100];//时间
char daoke[10];//到课情况
char num[100][30];//存储一共有多少学号
char num2[100][30];//存储一共有多少姓名以便后面排序使用
char num3[100][30];//存储时间
void creatnewnode(node*& student)
{
student = (node*)malloc(sizeof(node));
student->next = NULL;
}
void insert(node*& L, node* p)
{
node* q = NULL;
q = L;
p->next = q->next;
q->next = p;
}
void read(node* L)
{
FILE* FP;
FP = fopen("data.txt", "rb");
if (FP == NULL)
{
printf("该文件不存在!");
exit(0);//终止程序
}
while (!feof(FP))
{
node* pr = L;
node* p=NULL;
node* l = (node*)malloc(sizeof(node));//创建节点中转信息
fscanf(FP, "%s%s%s%s%s", xuehao, name, banji, data, daoke);
strcpy(l->data.xuehao, xuehao);
strcpy(l->data.name, name);
strcpy(l->data.banji, banji);
strcpy(l->data.data, data);
strcpy(l->data.daoke, daoke);
int flag = 1, flag2 = 1, flag3 = 1;
for (int i = 0; i <= sum1; i++)
{
if (strcmp(num[i], xuehao) == 0)
{
flag = 0;
}
}
if (flag)
{
strcpy(num[sum1], xuehao);
sum1++;
}
for (int i = 0; i <= sum2; i++)
{
if (strcmp(num2[i], name) == 0)
{
flag2 = 0;
}
}
if (flag2)
{
strcpy(num2[sum2], name);
sum2++;
}
for (int i = 0; i <= sum3; i++)
{
if (strcmp(num3[i], data) == 0)
{
flag3 = 0;
}
}
if (flag3)
{
strcpy(num3[sum3], data);
sum3++;
}
insert(L, l);
l = l->next;
}
fclose(FP);
}
void search(node* student)
{
node* pr = student->next;
printf("输入1按学号查询,输入2按姓名查询,输入3按考勤时间查询:");
int flag;
scanf("%d", &flag);
if (flag == 1)
{
int flag2 = 1;
pr = student->next;
printf("请输入学号:");
scanf("%s", xuehao);
while (pr != NULL)
{
if (strcmp(pr->data.xuehao, xuehao) == 0)
{
flag2 = 0;
printf("学号:%s ", pr->data.xuehao);
printf("姓名:%s ", pr->data.name);
printf("时间:%s 到课状态:%s\n", pr->data.data, pr->data.daoke);
}
pr = pr->next;
}
if (flag2)
{
printf("学号不存在!\n");
}
}
else if (flag == 2) //按姓名查询
{
pr = student->next;
printf("请输入姓名:");
scanf("%s", name);
while (pr != NULL)
{
if (strcmp(pr->data.name, name) == 0)
{
printf("学号:%s\n", pr->data.xuehao);
printf("姓名:%s\n", pr->data.name);
printf("时间:%s 到课状态:%s", pr->data.data, pr->data.daoke);
}
pr = pr->next;
}
if (pr == NULL)
{
printf("姓名不存在!\n");
}
}
else if(flag==3) //按时间查询
{
pr = student->next;
printf("(注意!请严格按照00月00日00点00分输入)请输入具体时间:");
scanf("%s", data);
while (pr != NULL)
{
if (strcmp(pr->data.data, data) == 0)
{
printf("学号:%s\n", pr->data.xuehao);
printf("姓名:%s\n", pr->data.name);
printf("时间:%s 到课状态:%s", pr->data.data, pr->data.daoke);
}
pr = pr->next;
}
if (pr == NULL)
{
printf("该时间不存在记录!\n");
}
}
}
void add(node* L)
{
printf("请输入你想新增信息的学生学号:");
scanf("%s",xuehao);
printf("请输入你想新增信息的学生姓名:");
scanf("%s", name);
printf("(注意!请严格按照00月00日00点00分输入)请输入到课时间:");
scanf("%s", data);
printf("请输入学生班级:");
scanf("%s", banji);
node* pr = L->next;
while (pr != NULL)
{
if (strcmp(pr->data.xuehao, xuehao)==0)
{
if (strcmp(pr->data.data, data) == 0)
{
printf("该学生在该时间的考勤信息已存在!!");
break;
}
}
pr = pr->next;
}
if (pr == NULL)
{
node* p;
creatnewnode(p);
strcpy(p->data.xuehao, xuehao);
strcpy(p->data.name, name);
strcpy(p->data.data, data);
strcpy(p->data.banji, banji);
printf("注意1为到课 2为旷课 3为事假 4为病假 5为迟到 6为早退\n");
printf("请输入该时间的到课情况:");
scanf("%s", daoke);
strcpy(p->data.daoke,daoke);
int flag = 1, flag2 = 1, flag3 = 1;
for (int i = 0; i <= sum1; i++)
{
if (strcmp(num[i], xuehao) == 0)
{
flag = 0;
}
}
if (flag)
{
strcpy(num[sum1], xuehao);
sum1++;
}
for (int i = 0; i <= sum2; i++)
{
if (strcmp(num2[i], name) == 0)
{
flag2 = 0;
}
}
if (flag2)
{
strcpy(num2[sum2], name);
sum2++;
}
for (int i = 0; i <= sum3; i++)
{
if (strcmp(num3[i], data) == 0)
{
flag3 = 0;
}
}
if (flag3)
{
strcpy(num3[sum3], data);
sum3++;
}
insert(L, p);
printf("添加成功!\n");
}
}
void modify(node* L)
{
node* pr = L->next;
printf("请输入你想要修改的学生学号:");
scanf("%s", xuehao);
printf("请输入你想修改学生记录的具体时间:");
scanf("%s", data);
while (pr != NULL)
{
if(strcmp(pr->data.xuehao, xuehao) == 0)
{
if (strcmp(pr->data.data, data) == 0)
{
printf("注意1为到课 2为旷课 3为事假 4为病假 5为迟到 6为早退\n");
printf("请输入学生到课情况:");
scanf("%s", daoke);
strcpy(pr->data.daoke, daoke);
printf("修改成功!\n");
break;
}
}
pr = pr->next;
}
if (pr == NULL)
{
printf("无该日学生信息!");
}
}
void del(node* L)
{
node* pr = L->next;
node* p = L;
if (L->next == NULL)
{
printf("无考勤信息,请先添加");
return;
}
printf("请输入你想要删除的学生记录的学生学号:");
scanf("%s", xuehao);
printf("请输入你想要删除的学生记录的具体时间:");
scanf("%s", data);
int flag = 1;
while (pr != NULL)
{
if (strcmp(pr->data.xuehao, xuehao) == 0)
{
if (strcmp(pr->data.data, data) == 0)
{
flag = 0;
p->next = pr->next;
free(pr);
node* p = L->next;
int t = 0, k = 0;
while (p != NULL)
{
if (strcmp(p->data.xuehao, xuehao) == 0)
{
t++;
}
if (strcmp(p->data.data, data) == 0)
{
k++;
}
p = p->next;
}
if (t == 1)
{
for (int i = 0; i < sum1; i++)
{
strcpy(num[i] , num[i + 1]);
}
for (int i = 0; i < sum2; i++)
{
strcpy(num2[i], num2[i + 1]);
}
sum1--;
sum2--;
}
if (k == 1)
{
for (int i = 0; i < sum3; i++)
{
strcpy(num3[i], num3[i + 1]);
}
sum3--;
}
printf("删除成功\n");
break;
}
}
p = pr;
pr = pr->next;
}
if (flag)
{
printf("该学生记录不存在!\n");
}
}
void show(node* L)
{
if (L->next== NULL)
{
printf("无学生信息,请先添加\n");
return;
}
else
{
printf("注意1为到课 2为旷课 3为事假 4为病假 5为迟到 6为早退\n");
node* pr = L->next;
while (pr != NULL)
{
printf("学生学号:%s ", pr->data.xuehao);
printf("学生姓名:%s ", pr->data.name);
printf("学生班级:%s ", pr->data.banji);
printf("日期:%s ", pr->data.data);
printf("学生到课情况:%s\n", pr->data.daoke);
pr = pr->next;
}
}
}
void paixv(node* L)
{
node* pr = L->next;
if (pr == NULL)
{
printf("库中无数据");
return;
}
else
{
printf("输入1按学号排序,输入2按姓名排序,输入3按日期排序");
int flag;
scanf("%d", &flag);
if (flag == 1)
{
char temp[1000];
for (int i = 0; i < sum1 - 1; i++)
{
for (int j = 0; j < sum1 - i - 1; j++)
{
if (strcmp(num[j], num[j + 1]) > 0)
{
strcpy(temp, num[j]);
strcpy(num[j], num[j + 1]);
strcpy(num[j + 1], temp);
}
}
}
for (int i = 0; i < sum1; i++)
{
node* pr2 = pr;
while (pr2 != NULL)
{
if (strcmp(pr2->data.xuehao, num[i]) == 0)
{
printf("学生学号:%s ", pr2->data.xuehao);
printf("学生姓名:%s ", pr2->data.name);
printf("学生班级:%s ", pr2->data.banji);
printf("日期:%s ", pr2->data.data);
printf("学生到课情况:%s\n", pr2->data.daoke);
}
pr2 = pr2->next;
}
}
}
else if (flag == 2)
{
char temp[1000];
for (int i = 0; i < sum2 -1; i++)
{
for (int j = 0; j < sum2-i-1; j++)
{
if (strcmp(num2[j], num2[j+1]) > 0)
{
strcpy(temp, num2[j]);
strcpy(num2[j], num2[j + 1]);
strcpy(num2[j + 1], temp);
}
}
}
for (int i = 0; i < sum2; i++)
{
node* pr2 = pr;
while (pr2 != NULL)
{
if (strcmp(pr2->data.name, num2[i]) == 0)
{
printf("学生学号:%s ", pr2->data.xuehao);
printf("学生姓名:%s ", pr2->data.name);
printf("学生班级:%s ", pr2->data.banji);
printf("日期:%s ", pr2->data.data);
printf("学生到课情况:%s\n", pr2->data.daoke);
}
pr2 = pr2->next;
}
}
}
else if (flag == 3)
{
char temp[1000];
for (int i = 0; i < sum3-1 ; i++)
{
for (int j =0; j < sum3-i-1; j++)
{
int x = (num3[j][0] - '0') * 10+(num3[j][1]-'0');
int y = (num3[j+1][0] - '0') * 10 + (num3[j+1][1] - '0');
int z = (num3[j][4] - '0') * 10 + (num3[j][5] - '0');
int k = (num3[j+1][4] - '0') * 10 + (num3[j+1][5] - '0');
if (x>y)
{
strcpy(temp, num3[j]);
strcpy(num3[j], num3[j+1]);
strcpy(num3[j+1], temp);
}
else if (x == y)
{
if (z > k)
{
strcpy(temp, num3[j]);
strcpy(num3[j], num3[j+1]);
strcpy(num3[j+1], temp);
}
}
}
}
for (int i = 0; i < sum3; i++)
{
node* pr2 = pr;
while (pr2 != NULL)
{
if (strcmp(pr2->data.data, num3[i]) == 0)
{
printf("学生学号:%s ", pr2->data.xuehao);
printf("学生姓名:%s ", pr2->data.name);
printf("学生班级:%s ", pr2->data.banji);
printf("日期:%s ", pr2->data.data);
printf("学生到课情况:%s\n", pr2->data.daoke);
}
pr2 = pr2->next;
}
}
}
}
}
void tongji(node* L)
{
node* pr = L->next;
int flag;
printf("请输入数字查看统计报表 1 考勤日报表 2 考勤汇总表 3 考勤异常表 4 请假汇总表:");
scanf("%d", &flag);
if (flag == 1)
{
for (int i = 0; i < sum3; i++)
{
int k = 0;
printf("%s\t", num3[i]);
node* p = pr;
int sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0,sum8=0,sum9=0;
while (p != NULL)
{
if (strcmp(p->data.data, num3[i]) == 0)
{
if (strcmp(p->data.daoke, "1") == 0)
{
sum4++;
}
else if (strcmp(p->data.daoke, "2") == 0)
{
sum5++;
}
else if (strcmp(p->data.daoke, "3") == 0)
{
sum6++;
}
else if (strcmp(p->data.daoke, "4") == 0)
{
sum7++;
}
else if (strcmp(p->data.daoke, "5") == 0)
{
sum8++;
}
else if (strcmp(p->data.daoke, "6") == 0)
{
sum9++;
}
printf("%s\t", p->data.name);
k++;
}
p = p->next;
}
printf("当日总考勤人数:%d人 出勤%d人 旷课%d人 事假%d人 病假%d人 迟到%d人 早退%d人\n", k,sum4,sum5,sum6,sum7,sum8,sum9);
}
}
else if (flag == 2)
{
for (int i = 0; i < sum1; i++)
{
int k = 0;
printf("%s\t", num[i]);
node* p = pr;
int sum4 = 0, sum5 = 0, sum6 = 0, sum7 = 0, sum8 = 0, sum9 = 0;
while (p != NULL)
{
if (strcmp(p->data.xuehao, num[i]) == 0)
{
if (strcmp(p->data.daoke, "1") == 0)
{
sum4++;
}
else if (strcmp(p->data.daoke, "2") == 0)
{
sum5++;
}
else if (strcmp(p->data.daoke, "3") == 0)
{
sum6++;
}
else if (strcmp(p->data.daoke, "4") == 0)
{
sum7++;
}
else if (strcmp(p->data.daoke, "5") == 0)
{
sum8++;
}
else if (strcmp(p->data.daoke, "6") == 0)
{
sum9++;
}
printf("%s\t", p->data.name);
k++;
}
p = p->next;
}
printf("该学生总上课次数%d 出勤%d次 旷课%d次 事假%d次 病假%d次 迟到%d次 早退%d次\n", k, sum4, sum5, sum6, sum7, sum8, sum9);
}
}
else if (flag == 3)
{
printf("注意2为旷课 3为事假 4为病假 5为迟到 6为早退\n");
node* p = pr;
while (p != NULL)
{
if (strcmp(p->data.daoke, "1") != 0)
{
printf("%s %s %s %s 到课情况:%s\n", p->data.xuehao, p->data.name, p->data.banji, p->data.data, p->data.daoke);
}
p = p->next;
}
}
else if (flag == 4)
{
printf("3为事假 4为病假 \n");
node* p = pr;
while (p != NULL)
{
if (strcmp(p->data.daoke, "3") == 0|| strcmp(p->data.daoke, "4") == 0)
{
printf("%s %s %s %s 到课情况:%s\n", p->data.xuehao, p->data.name, p->data.banji, p->data.data, p->data.daoke);
}
p = p->next;
}
}
else
{
printf("请输入正确的数字\n");
}
}
void save(node* L)
{
FILE* fp;
node* pr = L->next;
if ((fp = fopen("data.txt", "wb")) == NULL)
{
printf("无法打开文件\n");
exit(0);
}
while (pr)
{
if(pr->next == NULL)
{
fprintf(fp, "%s\n%s\n%s\n%s\n%s", pr->data.xuehao,pr->data.name,pr->data.banji,pr->data.data,pr->data.daoke);
}
else
{
fprintf(fp, "%s\n%s\n%s\n%s\n%s\n", pr->data.xuehao, pr->data.name, pr->data.banji, pr->data.data, pr->data.daoke);
}
pr = pr->next;
}
printf("保存成功!\n");
fclose(fp);
}
#include"Attendance system.h";
void initwindow()
{
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("*--> 9 退出 *\n");
printf("*******************要老实上课嗷~************************\n");
printf("请在此输入你想要进行操作前的数字:");
}
int main()
{
node* stude;
creatnewnode(stude);
read(stude);
int flag = 1;
while (flag)//循环页面操作
{
initwindow();
int n;
scanf("%d", &n);
switch (n)
{
case 1:
add(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 2:
search(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
modify(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 4:
del(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 5:
show(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 6:
paixv(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 7:
tongji(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 8:
save(stude);
printf("请输入按下回车返回主菜单");
getchar();
getchar();
system("cls");
break;
case 9:
printf("感谢使用本系统!\n");
flag = 0;
break;
default:
printf("请输入正确的操作数!!!\n");
break;
}
}
return 0;
}
#undef UNICODE
#undef _UNICODE
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct s
{
char xuehao[100];//学号
char name[100];//姓名
char banji[100];//班级
char data[100];//日期
char daoke[100];//到课情况
}stud;
typedef struct node
{
stud data;
struct node* next;
}node;
void creatnewnode(node*& student);
void insert(node*& L, node* p);
void read(node* L);
void search(node* student);
void add(node* L);
void modify(node* L);
void del(node* L);
void show(node* L);
void paixv(node* L);
void tongji(node* L);
void save(node* L);