C語言實現(xiàn)考勤管理系統(tǒng)
這些天因為補修c語言課設,在花費了一段時間后寫完了這個課設,課設的要求如下:
考勤信息記錄了學生的缺課情況,它包括:缺課日期、第幾節(jié)課、課程名稱、學生姓名、缺課類型(遲到、早退、請假及曠課)。試設計一考勤管理系統(tǒng),使之能提供以下功能:
(1) 錄入學生的缺課記錄;
(2) 修改某個學生的缺課記錄;
(3) 查詢某個學生的缺課情況;
(4) 統(tǒng)計某段時間內,曠課學生姓名及曠課次數(shù),按曠課次數(shù)由多到少排序;
(5) 統(tǒng)計某段時間內,有學生曠課的課程及曠課人次,按曠課人次由多到少排序;
(6) 系統(tǒng)以菜單方式工作。
本程序由visual studio 2017編寫
我會先將程序放上來然后后面慢慢加注釋,程序的大概思路是設計三個結構體,考勤信息結構體負責保存每一條缺課信息,其中包括學生信息和課程信息,每次添加考勤信息的時候,剩下的兩個學生和課程結構體會自動從里面添加所需要的信息,整個程序的功能實現(xiàn)也是建立在三個結構體的基礎上的。
#define _CRT_SECURE_NO_WARNINGS #define N 1000 #define M 100 #include<stdio.h> #include<stdlib.h> #include<string.h> struct kaoqing { ?? ?//int total;//曠課總節(jié)數(shù) ?? ?int number;// 曠課的第幾節(jié) ?? ?char coure_name[20];//課程名稱 ?? ?char stu_name[20];//學生名字 ?? ?char type[20];//課程類型 ?? ?int year; ?? ?int month; ?? ?int day; }; struct stu { ?? ?char stu_name2[20]; ?? ?int num;//每個學生的曠課總節(jié)數(shù),曠課次數(shù) }; struct course { ?? ?char coure_name2[20];//課程名稱 ?? ?int num;//本門課程曠課人次 }; struct kaoqing K[N+1]= { 0 }; struct stu S[M + 1] = { 0 }; struct course C[M + 1] = { 0 }; int add_course(char name[], int *t) { ?? ?int z = *t; ?? ?int i = 1; ?? ?int flag = 0; ?? ?for (; i < z; i++) { ?? ??? ?if (strcmp(C[i].coure_name2, name) == 0) { ?? ??? ??? ?flag = 1; ?? ??? ?} ?? ?} ?? ?if (flag) { ?? ??? ?return 1;// ?? ?} ?? ?strcpy(C[i].coure_name2, name); ?? ?++(*t); ?? ?return 0; } int add_stu(char name[],int *t) { ?? ?int m = *t; ?? ?int i = 1; ?? ?int flag = 0; ?? ?for(;i<m;i++) { ?? ??? ?if (strcmp(S[i].stu_name2, name) == 0) { ?? ??? ??? ?flag = 1; ?? ??? ?} ?? ?} ?? ?if (flag) { ?? ??? ?return 1;// ?? ?} ?? ?strcpy(S[i].stu_name2, name); ?? ?++(*t); ?? ?return 0; } void Coure_show(int n,int m) { ?? ?int imax; int temp; ?? ?int i = 1, j = 1; ?? ?int by, bm, bd, ey, em, ed; ?? ?for (; i < n; i++) { ?? ??? ?printf("%s缺課日期:%d年%d月%d日 第%d節(jié)課 %s %s\n", K[i].stu_name, K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type); ?? ?} ?? ?printf("請輸入統(tǒng)計時間段的起點時間:"); ?? ?scanf("%d%d%d", &by, &bm, &bd); ?? ?printf("請輸入統(tǒng)計時間段的終點時間:"); ?? ?scanf("%d%d%d", &ey, &em, &ed); ?? ?i = 1; j = 1; ?? ?for (; i < m; i++) { ?? ??? ?for (j = 1; j < n; j++) { ?? ??? ??? ?if ((K[j].year >= by) && (K[j].year <= ey)) { ?? ??? ??? ??? ?if ((K[j].month >= bm) && (K[j].month <= em)) { ?? ??? ??? ??? ??? ?if ((K[j].day >= bd) && (K[j].day <= ed)) { ?? ??? ??? ??? ??? ??? ?if (strcmp(K[j].coure_name, C[i].coure_name2) == 0) { ?? ??? ??? ??? ??? ??? ??? ?++C[i].num; ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?i = 1; j = 1; ?? ?for (; i < m; i++) ?? ?{ ?? ??? ?imax = i; ?? ??? ?for (j = i + 1; j < m; j++) ?? ??? ?{ ?? ??? ??? ?if (C[j].num > C[imax].num) { ?? ??? ??? ??? ?imax = j; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?temp = C[imax].num; ?? ??? ?C[imax].num = C[i].num; ?? ??? ?C[i].num = temp; ?? ?} ?? ?i = 1; j = 1; ?? ?printf("從%d年%d月%d日到%d年%d月%d日這段時間內,曠課情況如下:\n", by, bm, bd, ey, em, ed); ?? ?for (; i < m; i++) { ?? ??? ?//if (C[i].num > 0) { ?? ??? ??? ?printf("%s ? 曠課人次%d\n", C[i].coure_name2, C[i].num); ?? ??? ?//} ?? ??? ?for (j = 1; j < n; j++) { ?? ??? ??? ?if (strcmp(K[j].coure_name, C[i].coure_name2) == 0) { ?? ??? ??? ??? ?printf("缺課日期:%d年%d月%d日 ? 第%d節(jié)課 ?%s ? %s\n", K[j].year, K[j].month, K[j].day, K[j].number, K[j].stu_name, K[j].type); ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?i = 1; ?? ?for (; i < m; i++) { ?? ??? ?C[i].num = 0; ?? ?} } void Info_show(int n,int m) { ?? ?int imax; int temp; ?? ?int i = 1,j=1; ?? ?int by, bm, bd,ey,em,ed; ?? ?for (; i < n; i++) { ?? ??? ??? ?printf("%s缺課日期:%d年%d月%d日 第%d節(jié)課 %s %s\n",K[i].stu_name,K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type); ?? ?} ?? ?printf("請輸入統(tǒng)計時間段的起點時間:"); ?? ?scanf("%d%d%d", &by, &bm, &bd); ?? ?printf("請輸入統(tǒng)計時間段的終點時間:"); ?? ?scanf("%d%d%d", &ey, &em, &ed); ?? ?i = 1; j = 1; ?? ?for (; i < m; i++) { ?? ??? ?for (j=1; j < n; j++) { ?? ??? ??? ?if ((K[j].year >= by) && (K[j].year <= ey)) {//滿足年份則不需要管月份和日期 ?? ??? ??? ??? ?if ((K[j].month >= bm) && (K[j].month <= em)) {//不滿足年份滿足月份則不需要管 ?? ??? ??? ??? ??? ?if ((K[j].day >= bd) && (K[j].day <= ed)) { ?? ??? ??? ??? ??? ??? ?if (strcmp(K[j].stu_name,S[i].stu_name2)==0) { ?? ??? ??? ??? ??? ??? ??? ?++S[i].num; ?? ??? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?i = 1; j = 1; ?? ?for (; i < m; i++) ?? ?{ ?? ??? ?imax = i; ?? ??? ?for (j = i + 1; j < m; j++) ?? ??? ?{ ?? ??? ??? ?if (S[j].num > S[imax].num) { ?? ??? ??? ??? ?imax = j; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?temp = S[imax].num; ?? ??? ?S[imax].num = S[i].num; ?? ??? ?S[i].num = temp; ?? ?} ?? ?i = 1; j = 1; ?? ?printf("從%d年%d月%d日到%d年%d月%d日這段時間內,曠課情況如下:\n",by,bm,bd,ey,em,ed); ?? ?for (; i < m; i++) { ?? ??? ?if (S[i].num > 0) { ?? ??? ??? ?printf("%s ? 曠課次數(shù)%d\n", S[i].stu_name2, S[i].num); ?? ??? ?} ?? ??? ?for (j=1; j < n; j++) { ?? ??? ??? ?if (strcmp(K[j].stu_name, S[i].stu_name2) == 0) { ?? ??? ??? ??? ?printf("缺課日期:%d年%d月%d日 ? 第%d節(jié)課 ?%s ? %s\n", K[j].year, K[j].month, K[j].day, K[j].number, K[j].coure_name, K[j].type); ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?i = 1; ?? ?for (; i < m; i++) { ?? ??? ?S[i].num = 0; ?? ?} } void Info_change(int n) { ?? ?char name[20]; ?? ?int i=1; ?? ?int flag = 0;//記錄是否修改 ?? ?int year, month, day, number; ?? ?printf("請輸入想修改的學生姓名:"); ?? ?scanf("%s", name); ?? ?printf("請輸入想修改記錄的時間和節(jié)數(shù):"); ?? ?scanf("%d%d%d%d", &year, &month, &day, &number); ?? ?for (; i < n; i++) { ?? ??? ?if ((strcmp(K[i].stu_name,name) == 0)&&((K[i].year==year)&&(K[i].month==month)&&(K[i].day==day)&&(K[i].number==number))) { ?? ??? ??? ?printf("請依次輸入新的該條信息!"); ?? ??? ??? ?printf("請輸入缺課日期,格式為年 月 日:"); ?? ??? ??? ?scanf("%d%d%d", &K[i].year, &K[i].month, &K[i].day); ?? ??? ??? ?printf("請輸入缺課課程為當日第幾節(jié):"); ?? ??? ??? ?scanf("%d", &K[i].number); ?? ??? ??? ?printf("請輸入缺課課程名稱:"); ?? ??? ??? ?scanf("%s", K[i].coure_name); ?? ??? ??? ?printf("請輸入缺課類型:"); ?? ??? ??? ?scanf("%s", K[i].type); ?? ??? ??? ?printf("請輸入缺課學生姓名:"); ?? ??? ??? ?scanf("%s", K[i].stu_name); ?? ??? ??? ?printf("修改成功!"); ?? ??? ??? ?++flag; ?? ??? ?} ?? ?} ?? ?if (!flag) { ?? ??? ?printf("修改失敗!請聯(lián)系管理員進行錯誤排查!"); ?? ?} } void Info_find(int n) { ?? ?char name[20]; ?? ?int i = 1; ?? ?printf("請輸入查找學生姓名:"); ?? ?scanf("%s", name); ?? ?printf("%s的缺課情況如下:\n",name); ?? ?for (; i < n; i++) { ?? ??? ?if (strcmp(K[i].stu_name, name) == 0) { ?? ??? ??? ?printf("缺課日期:%d年%d月%d日 第%d節(jié)課 %s %s\n", K[i].year, K[i].month, K[i].day, K[i].number, K[i].coure_name, K[i].type); ?? ??? ?} ?? ?} } void Info_init(int *x,int *y,int *z)? { ?? ?/* ?? ?int number;// 曠課的第幾節(jié) ?? ?char coure_name[20];//課程名稱 ?? ?char stu_name[20];//學生名字 ?? ?char type[20];//課程類型 ?? ?int year; ?? ?int month; ?? ?int day; ?? ?*/ ?? ?int a_s; ?? ?int a_c; ?? ?int X = *x; ?? ?int Y = *y; ?? ?int Z = *z; ?? ?int numbera;// 曠課的第幾節(jié) ?? ?char coure_namea[20];//課程名稱 ?? ?char stu_namea[20];//學生名字 ?? ?char typea[20];//課程類型 ?? ?int yeara; ?? ?int montha; ?? ?int daya; ?? ?FILE *fp; ?? ?if ((fp = fopen("INFO.txt", "r")) == NULL) { ?? ??? ?printf("數(shù)據(jù)讀入失敗!請聯(lián)系管理員進行錯誤排查!"); ?? ??? ?exit(0); ?//退出程序(結束程序) ?? ?} ?? ?while (fscanf(fp, "%d%s%s%s%d%d%d", &numbera, coure_namea, stu_namea, typea, &yeara, &montha, &daya) == 7) { ?? ??? ?K[*x].number = numbera; ?? ??? ?strcpy(K[*x].coure_name,coure_namea); ?? ??? ?strcpy(K[*x].stu_name, stu_namea); ?? ??? ?strcpy(K[*x].type, typea); ?? ??? ?K[*x].year = yeara; ?? ??? ?K[*x].month = montha; ?? ??? ?K[*x].day = daya; ?? ??? ?++(*x); ?? ??? ?printf("%d\n", *x); ?? ??? ?a_s = add_stu(stu_namea,y); ?? ??? ?a_c = add_course(coure_namea,z); ?? ??? ?/*if (!a_s) { ?? ??? ??? ?printf("%d\n", *y); ?? ??? ??? ?printf("學生姓名數(shù)組初始化成功!\n"); ?? ??? ?} ?? ??? ? ?? ??? ?if (!a_c) { ?? ??? ??? ?printf("%d\n", *z); ?? ??? ??? ?printf("課程名稱數(shù)組初始化成功!\n"); ?? ??? ?}*/ ?? ?} ?? ?fclose(fp); } void Info_save(int n) { ?? ?int i=1; ?? ?FILE * fp; ?? ?if ((fp = fopen("INFO.txt", "w")) == NULL) { ?? ??? ?printf("數(shù)據(jù)讀入失??!請聯(lián)系管理員進行錯誤排查!"); ?? ??? ?exit(0); ?//退出程序(結束程序) ?? ?} ?? ?for (; i < n; i++) { ?? ??? ?fprintf(fp, "%d %s %s %s %d %d %d\n", K[i].number, K[i].coure_name, K[i].stu_name, K[i].type, K[i].year, K[i].month, K[i].day); ?? ?} ?? ?fclose(fp); } void Info_in(int *w,int *z,int *v) { ?? ?char name[20]; ?? ?char c_name[20]; ?? ?int flag1, flag2; ?? ?int n = *w;//記錄數(shù)組的控制數(shù) ?? ?int m = *z;//學生數(shù)組的控制數(shù) ?? ?int o = *z;//課程數(shù)組的控制數(shù) ?? ?printf("請依次輸入學生的缺課情況:"); ?? ?printf("請輸入缺課日期,格式為年 月 日:"); ?? ?scanf("%d%d%d", &K[n].year, &K[n].month, &K[n].day); ?? ?printf("請輸入缺的課程為當日第幾節(jié):"); ?? ?scanf("%d", &K[n].number); ?? ?printf("請輸入缺的課程的名稱:"); ?? ?scanf("%s", K[n].coure_name); ?? ?strcpy(c_name, K[n].coure_name); ?? ?flag1 = add_course(c_name, v); ?? ?if (!flag1) ?? ?{ ?? ??? ?printf("課程名稱添加成功"); ?? ?} ?? ?printf("請輸入缺課的學生姓名:"); ?? ?scanf("%s", K[n].stu_name); ?? ?strcpy(name, K[n].stu_name); ?? ?flag2=add_stu(name,z); ?? ?if (!flag2) ?? ?{ ?? ??? ?printf("學生姓名添加成功"); ?? ?} ?? ?printf("請輸入缺課類型:"); ?? ?scanf("%s", K[n].type); ?? ?printf("添加成功!"); ?? ?++(*w); } int main() { ?? ?int X = 1; int Y = 1; int Z = 1; ?? ?Info_init(&X,&Y,&Z); ?? ?while (1) ?? ?{ ?? ??? ?system("cls"); ?? ??? ?int n; ?? ??? ?printf(" ? ? ? ? ? ?*************************************************************************\n"); ?? ??? ?printf(" ? ? ? ? ? ?** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? **\n"); ?? ??? ?printf(" ? ? ? ? ? ?** ? ? ? ? ? ? ? -------歡迎使用考勤管理系統(tǒng)------ ? ? ? ? ? ? ? ? ? ? **\n"); ?? ??? ?printf(" ? ? ? ? ? ?** ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? **\n"); ?? ??? ?printf(" ? ? ? ? ? ?*************************************************************************\n\n"); ?? ??? ?printf("\t\t\t ? ? ? ? [ ? ?1.缺課信息登記 ? ?]\n\n"); ?? ??? ?printf("\t\t\t ? ? ? ? [ ? ?2.缺課信息修改 ? ?]\n\n"); ?? ??? ?printf("\t\t\t ? ? ? ? [ ? ?3.缺課信息查詢 ? ?]\n\n"); ?? ??? ?printf("\t\t\t ? ? ? ? [ ? ?4.曠課學生信息展示]\n\n"); ?? ??? ?printf("\t\t\t ? ? ? ? [ ? ?5.課程情況展示 ? ?]\n\n"); ?? ??? ?printf("\t\t\t ? ? ? ? [ ? ?6.退出系統(tǒng) ? ? ? ?]\n\n"); ?? ??? ?printf("請輸入需要使用的功能數(shù)字:"); ?? ??? ?scanf("%d", &n); ?? ??? ?while (n < 1 || n > 7) { ?? ??? ??? ?printf("\n\n代碼輸入有誤,請您重新輸入:"); ?? ??? ??? ?scanf("%d", &n); ?? ??? ?} ?? ??? ?switch (n) { ?? ??? ?case 1:Info_in(&X,&Y,&Z); break; ?? ??? ?case 2:Info_change(X); break; ?? ??? ?case 3:Info_find(X); break; ?? ??? ?case 4:Info_show(X,Y); break; ?? ??? ?case 5:Coure_show(X,Z); break; ?? ??? ?case 6:exit(0); ?? ??? ?} ?? ??? ?Info_save(X); ?? ??? ?system("pause"); ?? ?} ?? ?return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用
這篇文章主要介紹了詳解C語言中strcpy()函數(shù)與strncpy()函數(shù)的使用,是C語言入門學習中的基礎知識,需要的朋友可以參考下2015-08-08一文掌握C++ const與constexpr及區(qū)別
C++ 11標準中,const 用于為修飾的變量添加“只讀”屬性而 constexpr關鍵字則用于指明其后是一個常量,編譯器在編譯程序時可以順帶將其結果計算出來,而無需等到程序運行階段,這樣的優(yōu)化極大地提高了程序的執(zhí)行效率,本文重點介紹C++ const與constexpr區(qū)別介紹,一起看看吧2024-02-02