C语言课程设计实战:图书管理与通讯录系统详解

需积分: 10 4 下载量 148 浏览量 更新于2024-09-11 1 收藏 102KB DOC 举报
C语言课程设计是一门针对自动化2016-01,02,03班的课程,旨在通过实际项目提升学生在C语言编程中的技能。课程设计共包含10个课题,每个课题都具有明确的目标和功能,以帮助学生巩固结构化程序设计思想,掌握程序调试技巧,以及如何编写课程设计报告。 第一个课题是图书管理系统,它涉及三个文本文件的管理:book.txt、borrow.txt和reader.txt。系统需要实现图书信息管理,包括按类别分类的图书添加、删除、修改和查询功能。每个图书的详细信息包括编号、书名、作者、出版日期、金额、类别等。借阅信息管理则涵盖了借出、归还、续借操作,以及对逾期图书的罚款计算。读者信息管理包括不同类型的读者(教师和学生)的区分,以及他们的借阅权限和数量限制。 第二个课题是个人通讯录管理系统,主要功能是在communication.txt文件中管理联系人信息,包括姓名、单位、电话号码、电子邮件、QQ等。系统提供输入、查找、删除和修改联系人信息的功能,用户可以通过控制台菜单进行操作。 这两个课题不仅考验了学生的C语言编程能力,还涉及到文件I/O操作、数据结构的运用(如数组或链表来存储信息)、数据库操作模拟以及用户交互设计。通过这些实践,学生可以提升数据组织和处理、异常处理以及程序逻辑设计的能力。 完成这些课题后,学生将能够深入理解C语言的特性,熟练运用循环、条件语句等基本结构,同时也锻炼了解决实际问题的思维能力和文档写作技巧。这门课程设计旨在将理论知识转化为实际应用,提高学生的工程素养和项目管理经验。
2013-06-02 上传
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 100 //最多学生人数 struct Stu1 //学生信息 { char no[10]; char name[20]; char sex[5]; int age; char classroom[20]; }; struct date //日期 { int year; int month; int day; }; struct Stu2 //考勤 { int late[MAX]; //迟到次数 int early[MAX]; //早退次数 int absence[MAX]; //旷课节数 struct date dat; }; typedef struct Stu3 //统计 { int late[MAX]; int early[MAX]; int absence[MAX]; }statistic; void input_stud() //学生信息初始化 { FILE *fp; struct Stu1 stu; int i,n; printf("\n学生人数(<=100): "); scanf("%d",&n); if((fp=fopen("student1.dat","wb+"))==NULL) { printf("\t>>不能建立student1.dat文件\n"); exit(0); } printf("\n******************************************************************************\n"); printf("学号 \t姓名\t性别\t年龄\t班级\n"); for(i=0;i<n;i++) { scanf("%s%s%s%d%s",stu.no,stu.name,stu.sex,&stu.age,stu.classroom); fwrite(&stu,sizeof(struct Stu1),1,fp); } printf("******************************************************************************\n"); fclose(fp); } void add_stud() //添加学生 { FILE *fp; struct Stu1 stu,stun; int i,n,t; if((fp=fopen("student1.dat","ab+"))==NULL) if((fp=fopen("student1.dat","wb+"))==NULL) { printf("\t>>不能建立student1.bin文件\n"); exit(0); } fseek(fp,0,2); n=ftell(fp)/sizeof(struct Stu1); printf("\n******************************************************************************\n"); printf(" 输入信息: 学号 \t姓名\t性别\t年龄\t班级\n"); printf(" 学生信息: "); scanf("%s%s%s%d%s",stun.no,stun.name,stun.sex,&stun.age,stun.classroom); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&t); switch(t) { case 1:rewind(fp); i=0; while(i<n) { fread(&stu,sizeof(struct Stu1),1,fp); if(strcmp(stun.no,stu.no)==0) break; i++; } if(i<n) printf("\t>>学号重复\n"); else { fseek(fp,0,2); fwrite(&stun,sizeof(struct Stu1),1,fp); }break; case 2:break; } printf("******************************************************************************\n"); fclose(fp); } void update_stud() //按学号修改学生信息 { FILE *fp; struct Stu1 stu; int i,n,t; char no[10]; if((fp=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(1); } fseek(fp,0,2); n=ftell(fp)/sizeof(struct Stu1); printf("\n******************************************************************************\n"); printf("要修改的学号: "); scanf("%s",no); i=0; rewind(fp); while(i<n) { fread(&stu,sizeof(struct Stu1),1,fp); if(strcmp(stu.no,no)==0) break; i++; } if(i<n) { printf("输入 姓名 性别 年龄 班级: "); scanf("%s %s %d %s",stu.name,stu.sex,&stu.age,stu.classroom); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&t); switch(t) { case 1:fseek(fp,-(long)sizeof(struct Stu1),1); fwrite(&stu,sizeof(struct Stu1),1,fp);break; case 2:break; } } else printf("\t>>无该学号的学生\n"); printf("******************************************************************************\n"); fclose(fp); } void create_attend(int t) //考勤记录 { FILE *fp1,*fp2; int i,n,p; struct Stu1 stu; struct Stu2 attend; switch(t) { case 2:if((fp1=fopen("student2.dat","ab+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(0); } break; case 1:if((fp1=fopen("student2.dat","wb+"))==NULL) { printf("\t>>不能建立student2.dat文件\n"); exit(0); } } fseek(fp1,0,2); if((fp2=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(2); } fseek(fp2,0,2); n=ftell(fp2)/sizeof(struct Stu1); printf("\n年.月.日: "); scanf("%d%d%d",&attend.dat.year,&attend.dat.month,&attend.dat.day); printf("\n******************************************************************************\n"); printf("学号 \t姓名\t迟到\t早退\t旷课\n"); rewind(fp2); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp2); printf("%s\t%s\t",stu.no,stu.name); scanf("%d%d%d",&attend.late[i],&attend.early[i],&attend.absence[i]); } printf("******************************************************************************\n"); for(;i<MAX;i++) { attend.late[i]=attend.early[i]=attend.absence[i]=0; } printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&p); switch(p) { case 1:fwrite(&attend,sizeof(struct Stu2),1,fp1);break; case 2:break; } fclose(fp1); fclose(fp2); } void get_attend() //按学号显示 { FILE *fp1,*fp2; int i,n,m; char s[10]; struct Stu1 stu; struct Stu2 attend; if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(3); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(4); } fseek(fp2,0,2); m=ftell(fp2)/sizeof(struct Stu2); if(m>0) rewind(fp2); printf("\n学号: "); scanf("%s",s); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); if(strcmp(s,stu.no)==0) break; } if(i==n) printf("对不起,该学号不存在,谢谢!\n"); else { printf("\n******************************************************************************\n"); printf("%s %s %s %d %s\n\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom); printf("迟到\t早退\t旷课\t扣学分\t日期\n"); while(m) { fread(&attend,sizeof(struct Stu2),1,fp2); printf("%d\t%d\t%d\t%.1f\t%d-%d-%d\n",attend.late[i],attend.early[i],attend.absence[i],-0.5*attend.absence[i],attend.dat.year,attend.dat.month,attend.dat.day); m--; } printf("******************************************************************************\n"); } fclose(fp1); fclose(fp2); } void disp_attend() //按日期显示 { FILE *fp1,*fp2; int i,n,x,y,m,d; struct Stu1 stu; struct Stu2 attend; if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(5); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(6); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); printf("\n日期: "); scanf("%d%d%d",&y,&m,&d); while(x) { fread(&attend,sizeof(struct Stu2),1,fp2); if(y==attend.dat.year && m==attend.dat.month && d==attend.dat.day) break; x--; } if(x==0) printf("对不起,该日期不存在,谢谢!\n"); else { printf("\n******************************************************************************\n"); printf("学号 \t姓名\t性别\t年龄\t班级\t迟到\t早退\t旷课\t扣学分\n"); rewind(fp2); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); printf("%s\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%.1f\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom,attend.late[i],attend.early[i],attend.absence[i],-0.5*attend.absence[i]); } printf("******************************************************************************\n"); } fclose(fp1); fclose(fp2); } void disp_stud() //显示学生信息 { FILE *fp; int i,n,t; struct Stu1 stu; if((fp=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(5); } fseek(fp,0,2); n=ftell(fp)/sizeof(struct Stu1); rewind(fp); printf("\n******************************************************************************\n"); printf("学号 \t姓名\t性别\t年龄\t班级\n"); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp); printf("%s\t%s\t%s\t%d\t%s\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom); } printf("******************************************************************************\n"); printf("\n1,修改 0,退出\n"); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) break; update_stud(); printf("\n1,修改 0,退出\n"); printf("请选择: "); } fclose(fp); } void find_attend() //查找(修改和显示) { FILE *fp1,*fp2; struct Stu1 stu; struct Stu2 attend; char s[10]; int i,n,x,t,p,y,m,d,q; printf("\n1,修改 2,显示 0,返回\n"); if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(7); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(8); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) break; p=x; printf("\n学号、日期: "); scanf("%s%d%d%d",s,&y,&m,&d); rewind(fp1); rewind(fp2); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); if(strcmp(s,stu.no)==0) break; } if(i==n) printf("对不起,该学号不存在,谢谢!\n"); else { while(p) { fread(&attend,sizeof(struct Stu2),1,fp2); if(y==attend.dat.year && m==attend.dat.month && d==attend.dat.day) break; p--; } if(p==0) printf("对不起,该日期不存在,谢谢!\n"); else { printf("\n******************************************************************************\n"); switch(t) { case 1: printf("输入迟到次数,早退次数,旷课节数: "); scanf("%d%d%d",&attend.late[i],&attend.early[i],&attend.absence[i]); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&q); switch(q) { case 1:fseek(fp2,-(long)sizeof(struct Stu2),1); fwrite(&attend,sizeof(struct Stu2),1,fp2);break; case 2:break; }break; case 2: printf("学号 \t姓名\t性别\t年龄\t班级\t迟到\t早退\t旷课\t扣学分\n"); printf("%s\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%.1f\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom,attend.late[i],attend.early[i],attend.absence[i],-0.5*attend.absence[i]); } printf("******************************************************************************\n"); } } system("pause"); system("cls"); printf("\n1,修改 2,显示 0,返回\n"); printf("请选择: "); } fclose(fp1); fclose(fp2); } void total_attend() //统计(单个显示和全显示) { FILE *fp1,*fp2; statistic s; struct Stu1 stu; struct Stu2 attend; int i,n,x,t,y1,m1,d1,y2,m2,d2; char str[10]; printf("\n起始时间: "); scanf("%d%d%d",&y1,&m1,&d1); printf("终止时间: "); scanf("%d%d%d",&y2,&m2,&d2); if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(9); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(10); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); for(i=0;i<n;i++) { s.late[i]=0;s.early[i]=0;s.absence[i]=0; } while(x) { fread(&attend,sizeof(struct Stu2),1,fp2); if(y1==attend.dat.year && m1==attend.dat.month && d1==attend.dat.day) break; x--; } x--; while(x) { for(i=0;i<n;i++) { s.late[i]+=attend.late[i];s.early[i]+=attend.early[i];s.absence[i]+=attend.absence[i]; } fread(&attend,sizeof(struct Stu2),1,fp2); if(y2==attend.dat.year && m2==attend.dat.month && d2==attend.dat.day) break; x--; } if(x==0) printf("对不起,错误!\n"); else { for(i=0;i<n;i++) { s.late[i]+=attend.late[i];s.early[i]+=attend.early[i];s.absence[i]+=attend.absence[i]; } printf("\n1,单个显示 2,全显示 0,返回\n"); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) break; printf("\n******************************************************************************\n"); switch(t) { case 1:rewind(fp1); printf("学号: "); scanf("%s",str); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); if(strcmp(str,stu.no)==0) break; } if(i==n) printf("对不起,该学号不存在,谢谢!\n"); else { printf("%s %s %s %d %s\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom); printf("迟到\t早退\t旷课\t扣学分\n"); printf("%d\t%d\t%d\t%.1f\n",s.late[i],s.early[i],s.absence[i],-0.5*s.absence[i]); } break; case 2:rewind(fp1); printf("学号 \t姓名\t性别\t年龄\t班级\t迟到\t早退\t旷课\t扣学分\n"); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); printf("%s\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%.1f\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom,s.late[i],s.early[i],s.absence[i],-0.5*s.absence[i]); } } printf("******************************************************************************\n"); system("pause"); system("cls"); printf("\n1,单个显示 2,全显示 0,返回\n"); printf("请选择: "); } } fclose(fp1); fclose(fp2); } struct Stu2 f(struct Stu2 at1,int i,int n) { int j; for(j=i;j<n;j++) { at1.late[j]=at1.late[j+1];at1.early[j]=at1.early[j+1];at1.absence[j]=at1.absence[j+1]; } return at1; } void del_stud() //删除 { FILE *fp1,*fp2; struct Stu1 st1,stt[MAX]; struct Stu2 at1,att[300]; int i,j=0,t,n,x,p; char no[10]; if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(11); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(12); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); printf("\n删除学号: "); scanf("%s",no); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&p); switch(p) { case 1:if(n>0 && x>0) { for(i=0;i<n;i++) { fread(&st1,sizeof(struct Stu1),1,fp1); if(strcmp(no,st1.no)==0) { t=j;continue; } stt[j]=st1;j++; } fclose(fp1); fp1=fopen("student1.dat","wb"); for(i=0;i<j;i++) fwrite(&stt[i],sizeof(struct Stu1),1,fp1); for(i=0;i<x;i++) { fread(&at1,sizeof(struct Stu2),1,fp2); att[i]=f(at1,t,n); } fclose(fp2); fp2=fopen("student2.dat","wb"); for(i=0;i<x;i++) fwrite(&att[i],sizeof(struct Stu2),1,fp2); printf("已删除!\n"); }break; case 2:break; } fclose(fp1); fclose(fp2); } void dela_stud() //全删 { FILE *fp1,*fp2; int t,p; printf("\n******************************************************************************\n"); printf("\n1,仅删除考勤记录 2,全部删除 0,返回\n"); printf("请选择: "); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&p); switch(p) { case 1:while(scanf("%d",&t)==1) { if(t==0) break; switch(t) { case 2:if((fp1=fopen("student1.dat","wb"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(13); } fclose(fp1); case 1:if((fp2=fopen("student2.dat","wb"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(13); } } printf("\t>>记录已删\n"); printf("\n1,仅删除考勤记录 2,全部删除 0,返回\n"); printf("请选择: "); } case 2:break; } printf("******************************************************************************\n"); fclose(fp2); } void main() { int t,p1,p2; system("color 3e"); printf("\n 欢迎使用\n"); printf("\n 考勤管理程序\n"); printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("1,初始化(学生信息和考勤初始化) 2,添加(添加学生和考勤记录)\n\n"); printf("3,按学号显示考勤记录 4,按日期显示考勤记录\n\n"); printf("5,查找(修改和显示) 6,显示学生信息(含修改)\n\n"); printf("7,统计(单个显示和全显示) 8,删除\n\n"); printf("9,全删 0,返回\n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) { system("cls"); printf("\n\n\n\n\n\n\n\n\n 再见!\n\n\n\n"); printf("\n\n\n\n\n\n\n 设计者: 邱河成\n"); printf("\n 班级: 计算111班 \n\n\n\n"); break; } switch(t) { case 1:system("cls"); printf("\n1,学生信息初始化 2,考勤初始化 0,返回\n"); printf("请选择: "); while(scanf("%d",&p1)==1) { if(p1==0) break; switch(p1) { case 1:system("cls");input_stud();break; case 2:system("cls");create_attend(t);break; } system("cls"); printf("\n1,学生信息初始化 2,考勤初始化 0,返回\n"); printf("请选择: "); } break; case 2:system("cls"); printf("\n1,添加学生 2,添加考勤记录 0,返回\n"); printf("请选择: "); while(scanf("%d",&p2)==1) { if(p2==0) break; switch(p2) { case 1:system("cls");add_stud();break; case 2:system("cls");create_attend(t);break; } system("cls"); printf("\n1,添加学生 2,添加考勤记录 0,返回\n"); printf("请选择: "); } break; case 3:system("cls");get_attend();system("pause");break; case 4:system("cls");disp_attend();system("pause");break; case 5:system("cls");find_attend();system("pause");break; case 6:system("cls");disp_stud();system("pause");break; case 7:system("cls");total_attend();system("pause");break; case 8:system("cls");del_stud();system("pause");break; case 9:system("cls");dela_stud();system("pause");break; } system("cls"); printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("1,初始化(学生信息和考勤初始化) 2,添加(添加学生和考勤记录)\n\n"); printf("3,按学号显示 4,按日期显示\n\n"); printf("5,查找(修改和显示) 6,显示学生信息(含修改)\n\n");; printf("7,统计(单个显示和全显示) 8,删除\n\n"); printf("9,全删 0,返回\n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("请选择: "); } }