考勤系统设计 功能:设计一考勤系统。考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、学生学号、缺课类型(迟到、早退、请假及旷课)。系统具有以下功能: 1、录入学生的缺课记录; 2、修改某个学生的缺课记录; 3、查询某个学生的缺课情况; 4、统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序; 5、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序; 6、系统以菜单方式工作。c语言
时间: 2023-07-10 14:03:58 浏览: 85
毕设_系统设计为教师端和学生端_主要_刷脸签到_课程管理_考勤管理等_功能模块
下面是一个基于C语言的考勤系统设计:
```c
#include <stdio.h>
#include <string.h>
// 学生结构体
typedef struct {
char name[20]; // 学生姓名
char id[10]; // 学生学号
} Student;
// 缺课信息结构体
typedef struct {
int date; // 缺课日期
int period; // 第几节课
char course[20]; // 课程名称
char type[10]; // 缺课类型
Student student; // 学生信息
} Absence;
// 全部缺课记录数组
Absence absences[100];
int absenceCount = 0; // 缺课记录数
// 打印菜单
void printMenu() {
printf("===== 考勤系统 =====\n");
printf("1. 录入学生的缺课记录\n");
printf("2. 修改某个学生的缺课记录\n");
printf("3. 查询某个学生的缺课情况\n");
printf("4. 统计某段时间内的旷课学生\n");
printf("5. 统计某段时间内的旷课课程\n");
printf("0. 退出系统\n");
}
// 录入缺课记录
void addAbsence() {
Absence absence;
printf("请输入缺课日期(例如20210101):");
scanf("%d", &absence.date);
printf("请输入第几节课:");
scanf("%d", &absence.period);
printf("请输入课程名称:");
scanf("%s", absence.course);
printf("请输入学生姓名:");
scanf("%s", absence.student.name);
printf("请输入学生学号:");
scanf("%s", absence.student.id);
printf("请输入缺课类型(迟到、早退、请假、旷课):");
scanf("%s", absence.type);
absences[absenceCount] = absence; // 添加到缺课记录数组
absenceCount++;
printf("添加成功!\n");
}
// 修改缺课记录
void editAbsence() {
char name[20], id[10];
printf("请输入要修改的学生姓名:");
scanf("%s", name);
printf("请输入要修改的学生学号:");
scanf("%s", id);
int index; // 要修改的缺课记录在缺课记录数组中的下标
for (int i = 0; i < absenceCount; i++) {
if (strcmp(absences[i].student.name, name) == 0 && strcmp(absences[i].student.id, id) == 0) {
index = i;
break;
}
}
printf("请输入新的缺课日期(例如20210101):");
scanf("%d", &absences[index].date);
printf("请输入新的第几节课:");
scanf("%d", &absences[index].period);
printf("请输入新的课程名称:");
scanf("%s", absences[index].course);
printf("请输入新的缺课类型(迟到、早退、请假、旷课):");
scanf("%s", absences[index].type);
printf("修改成功!\n");
}
// 查询缺课记录
void searchAbsence() {
char name[20], id[10];
printf("请输入要查询的学生姓名:");
scanf("%s", name);
printf("请输入要查询的学生学号:");
scanf("%s", id);
for (int i = 0; i < absenceCount; i++) {
if (strcmp(absences[i].student.name, name) == 0 && strcmp(absences[i].student.id, id) == 0) {
printf("缺课日期:%d,第%d节课,课程名称:%s,缺课类型:%s\n",
absences[i].date, absences[i].period, absences[i].course, absences[i].type);
}
}
}
// 统计旷课学生
void countAbsentStudents() {
int startDate, endDate;
printf("请输入开始日期(例如20210101):");
scanf("%d", &startDate);
printf("请输入结束日期(例如20210131):");
scanf("%d", &endDate);
// 统计旷课学生及旷课次数
int absentStudentCount = 0; // 旷课学生数
Student absentStudents[100]; // 旷课学生数组
int absentCounts[100]; // 旷课次数数组
int countIndex = 0; // 旷课学生数组和旷课次数数组的下标
for (int i = 0; i < absenceCount; i++) {
if (strcmp(absences[i].type, "旷课") == 0 && absences[i].date >= startDate && absences[i].date <= endDate) {
int foundIndex = -1; // 是否在旷课学生数组中找到该学生的下标
for (int j = 0; j < absentStudentCount; j++) {
if (strcmp(absentStudents[j].name, absences[i].student.name) == 0 && strcmp(absentStudents[j].id, absences[i].student.id) == 0) {
foundIndex = j;
break;
}
}
if (foundIndex == -1) { // 如果旷课学生数组中没有该学生,添加到数组中
absentStudents[absentStudentCount] = absences[i].student;
absentCounts[countIndex] = 1;
absentStudentCount++;
countIndex++;
} else { // 如果旷课学生数组中已经有该学生,将旷课次数加1
absentCounts[foundIndex]++;
}
}
}
// 按旷课次数由多到少排序
for (int i = 0; i < absentStudentCount - 1; i++) {
for (int j = i + 1; j < absentStudentCount; j++) {
if (absentCounts[i] < absentCounts[j]) {
Student tempStudent = absentStudents[i];
absentStudents[i] = absentStudents[j];
absentStudents[j] = tempStudent;
int tempCount = absentCounts[i];
absentCounts[i] = absentCounts[j];
absentCounts[j] = tempCount;
}
}
}
// 打印旷课学生及旷课次数
printf("旷课学生排名如下:\n");
for (int i = 0; i < absentStudentCount; i++) {
printf("%s(%s):%d次\n", absentStudents[i].name, absentStudents[i].id, absentCounts[i]);
}
}
// 统计旷课课程
void countAbsentCourses() {
int startDate, endDate;
printf("请输入开始日期(例如20210101):");
scanf("%d", &startDate);
printf("请输入结束日期(例如20210131):");
scanf("%d", &endDate);
// 统计旷课课程及旷课人次
int absentCourseCount = 0; // 旷课课程数
char absentCourses[100][20]; // 旷课课程数组
int absentCounts[100]; // 旷课人次数组
int countIndex = 0; // 旷课课程数组和旷课人次数组的下标
for (int i = 0; i < absenceCount; i++) {
if (strcmp(absences[i].type, "旷课") == 0 && absences[i].date >= startDate && absences[i].date <= endDate) {
int foundIndex = -1; // 是否在旷课课程数组中找到该课程的下标
for (int j = 0; j < absentCourseCount; j++) {
if (strcmp(absentCourses[j], absences[i].course) == 0) {
foundIndex = j;
break;
}
}
if (foundIndex == -1) { // 如果旷课课程数组中没有该课程,添加到数组中
strcpy(absentCourses[absentCourseCount], absences[i].course);
absentCounts[countIndex] = 1;
absentCourseCount++;
countIndex++;
} else { // 如果旷课课程数组中已经有该课程,将旷课人次加1
absentCounts[foundIndex]++;
}
}
}
// 按旷课人次由多到少排序
for (int i = 0; i < absentCourseCount - 1; i++) {
for (int j = i + 1; j < absentCourseCount; j++) {
if (absentCounts[i] < absentCounts[j]) {
char tempCourse[20];
strcpy(tempCourse, absentCourses[i]);
strcpy(absentCourses[i], absentCourses[j]);
strcpy(absentCourses[j], tempCourse);
int tempCount = absentCounts[i];
absentCounts[i] = absentCounts[j];
absentCounts[j] = tempCount;
}
}
}
// 打印旷课课程及旷课人次
printf("旷课课程排名如下:\n");
for (int i = 0; i < absentCourseCount; i++) {
printf("%s:%d人次\n", absentCourses[i], absentCounts[i]);
}
}
int main() {
int choice;
do {
printMenu();
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
addAbsence();
break;
case 2:
editAbsence();
break;
case 3:
searchAbsence();
break;
case 4:
countAbsentStudents();
break;
case 5:
countAbsentCourses();
break;
case 0:
printf("谢谢使用!\n");
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (choice != 0);
return 0;
}
```
这个考勤系统设计包含了录入学生的缺课记录、修改某个学生的缺课记录、查询某个学生的缺课情况、统计某段时间内的旷课学生、统计某段时间内的旷课课程等功能,并且使用了结构体、数组、循环、条件语句等C语言的基本语法。
阅读全文