您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页校友通讯录课程设计

校友通讯录课程设计

来源:小侦探旅游网


课程设计任务一览表

序号 课程设计任务名称 设计专题任务描述(可附页) 1 校友通讯录系统 实现校友信息的更新、查询功能 2 3 4 5 指导用书:__C语言课程设计案例精编 __

课程设计报告

设计项目 编 号 主要 仪器 设备 1 名 称 PC机 Visual C++6.0 或 Win-Tc 无 课程设计任务书 一、设计目的 为了训练自己的基本编程能力,了解系统的开发流程,熟悉C语言的文件和结构数组的各种基本操作,故设计这个校友通讯录系统。本程序中涉及结构体、数组、文件等方面的知识。 校友通讯录系统 附属 设备 主要 使用 软件 起止时间 同组人 二、功能描述 如图1所示,校友通讯录主要通过数组来实现,其数组元素是结构体类型,整个系统由如下几大功能模块组成。 校友录通讯系统 输出记录模块 查询记录 模块 更新记录 模块 输出记录模块 从文件读入从键盘输入按姓名查找按电话查找按原所在班级查找按毕业时间查找修改记录删除记录插入记录排序记录输出至文件输出至屏幕 (1) (1)输入记录模块。 输入记录模块主要完成将数据存入数组中的工作。在此校友通讯录系统中,记录可以从以文本形式存储的数据文件中读入,也可以从键盘逐个输入记录。记录由与联系人有关的基本信息字段构成。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到结构体类型的数组元素中。 (2)查询记录模块。 查询记录模块主要完成在数组中查找满足相关条件的记录。在此校友通讯录中,用户可以按照联系人的毕业时间或者原所在班级进行分组查找,也可以通过联系人姓名或电话号码在数组中进行查找。若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1的值,并打印出未找到该记录的提示信息。 (3)更新记录模块。 更新记录模块主要完成对记录的维护。在此校友通讯录中,它实现对记录的修改、删除、插入和排序操作。一般而言,系统进行了这些操作之后,需要将修改的数据存入原数据文件文件。 (4)输出记录模块。 输出记录模块主要完成两个任务。第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。第二,它实现将数组中存储的记录信息以表格的形式在屏幕上打印显示出来。 三、总体设计 (一)功能模块设计 1、主控main()函数执行流程 校友通讯录系统执行主流程序如图2所示。 它先以可读写的方式打开文本类型的数据文件,此文件默认为“c:\\FellowList\",若该文件不存在,则新建此数据文件。当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。 在判断键值时,有效的输入为0-8之间的任意数值,其他输入都被视为错误按键。若输入为0(即变量select=0),则会继续判断是否在对记录进行了更新操作后进行了存盘操作,若未存盘则全局变量saveflag=1系统会提示用户是否需要进行数据存盘操作,用户输入Y或y,系统会进行存盘操作,最后系统执行退出校友通讯录的操作。若选择1,则调用Add()函数,执行增加记录操作;若选择2,则调用Disp()函数,执行将记录以表格形式打印输出至屏幕的操作;若选择3,则调用Del()函数,执行删除记录操作;若选择4,则调用Qur()函数,执行查询记录操作;若选择5,则调用Modify()函数,执行修改记录操作;若选择6,则调用Insert()函数,执行插入记录操作;若选择7,则调用SelectSort()函数,执行按升序排序记录的操作;若选择8,则调用Save()函数,执行将记录存入磁盘中的数据文件的操作;若输入为0-8之外的值,则调用Wrong()函数,给出按键错误的信息。 2、输入记录模块 输入记录模块主要实现将数据存入数组中。当从数据文件中读出记录时,它调用fread(&tele[count],sizeof(FELLOWLIST),1,fp)文件读取函数,执行一次从文件中读取一条校友通讯录记录信息存入某个数组元素中的操作,并且这个操作在main()中调用执行,即在校友通讯录系统进入显示菜单界面时,该操作已经执行了。若该文件中没有数据,则系统会提示数组为空,没有任何记录可操作,此时,用户应选择1,调用Add()函数,进行记录的输入,即完成在数组中添加元素的操作。 3、查询记录模块 查询记录模块主要实现在数组中按联系人毕业时间、原所在班级以及姓名或电话查找满足条件的记录。在查询函数Qur()中,为了遵循模块化编程的原则,对在数组中进行的记录定位操作设计成了一个单独的函数int Locate(FELLOWLIST temp[],int n,char findness[],char target[]),参数findness[]保存要查找的具体内容,target[]保存要查找的字段,若找到该记录,则返回指向该记录的数组元素的下标;否则,返回一个-1的值。 开始 以可读写的方式打开一个数据文件 将此文件的内容读出,并存入一个新的结构体类型的数组中 调用menu()菜单函数 进入while(1)主循环 输入0-8中的一数值,选择相应操作 是 输入是否为0? 否 判断键值,调用相应函数,完成相应功能 否 调用Save()函数,进行写数据文件操作 是否对修改进行了存盘? 是 结束 (2) 4、更新记录模块 (1)修改记录 修改记录操作需要对数组中目标元素的数据域中的值进行修改,它分两步完成。第一步,输入要修改的联系人姓名,输入后调用定位函数Locate()在数组中逐个对联系人姓名字段的值进行比较,直到找到联系人姓名的记录;第二步,若找到该记录,修改除记录编号之外的各字段的值,并将存盘标记变量saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。 (2)删除记录 删除记录操作完成删除指定联系人姓名或电话号码的记录,它也分两步完成。第一步,输入要修改的联系人姓名或电话号码,输入后调用定位函数Locate()在数组中逐个对联系人姓名或电话号码字段的值进行比较,直到找到该联系人姓名或电话号码的记录,返回指向该记录的数组元素下标;第二步,若找到该记录,则从该记录所在元素的后续元素起,依次向前移一个元素位置,有值的数组元素个数减1。 (3)排序记录 选择排序法也属于内部排序法中的一种,它是运用字段值比较后,从欲排序的数组元素中,按指定规则选出其字段最小的元素,并依原则交换数组元素位置后,更新欲排序的数组元素,以达到排序的目的。对按照记录编号排序方式和按照原所在班级序号而言,都是按其数值大小来排序。 5.输出记录模块 当把记录输出至文件时,调用fwrite(&temp[i],sizeof(FELLOWLIST),1,fp)函数,将数组元素temp[i]中各字段的值,写入文件指针fp所指的文件;当把记录输出至屏幕时,调用void Disp()函数,将数组中存储的记录信息以表格的形式在屏幕上打印出来。 (二)数据结构设计 typedef struct FellowList { char num[5]; char name[8]; char graduatetime[12]; char class[8]; char phonenum[15]; char address[19]; }FELLOWLIST; 其各字段的值的含义如下: num[4]:保存记录编号。 name[10]:保存联系人姓名。 graduatetime[10]:保存联系人毕业时间。 class[10]:保存联系人原所在班级序号。 phonenum[15]:保存联系人电话号码。 address[20]:保存联系人地址。 (三)函数功能描述 (1)printheader() 函数原型:void printheader() printheader()函数用于在以表格形式显示记录时,打印输出表头信息。 (2)printdata() 函数原型:void printdata(FELLOWLIST pp) printdata()函数用于以表格显示的方式,打印输出单个数组元素pp中的记录信息。 (3)Disp() 函数原型:void Disp(FELLOWLIST temp[],int n) Disp()函数用于显示temp数组中存储的n条记录,内容为FellowList结构中定义的内容。 (4)stringinput() 函数原型:void stringinput(char *t,int lens,char *notice) stringinput()函数用于输入字符串,并进行字符串长度验证(长度课 程 设 计 报 告

#include \"stdio.h\" /*标准输入输出函数库*/ #include \"stdlib.h\" /*标准函数库*/ #include \"string.h\" /*字符串函数库*/ #include \"conio.h\" /*屏幕操作函数库*/ #define HEADER1 \" ------------------------------TELEPHONE BOOK------------------------------\\n\" #define HEADER2 \" | num | name |graduatetime| class | phonenumber | address |\\n\" #define HEADER3 \" |-----|--------|------------|--------|---------------|-------------------|\\n\" #define FORMAT \" |%-5s|%-8s|%-12s|%-8s|%-15s|%-19s|\\n\" #define DATA p->num,p->name,p->graduatetime,p->class,p->phonenum,p->address #define END \" --------------------------------------------------------------------------\\n\" #define N 100 int saveflag=0; /*是否需要存盘的标志变量*/ typedef struct FellowList /*定义与校友通讯录有关的数据结构,标记为FellowList*/ {char num[5]; /*编号*/ char name[8]; /*姓名*/ char graduatetime[12];/*毕业时间*/ char class[8]; /*原所在班级*/ char phonenum[15]; /*电话号码*/ char address[19]; /*地址*/ }FellowList; void menu() /*主菜单*/ {system(\"cls\"); /*调用DOS命令,清屏.与clrscr()功能相同*/ textcolor(13); /*在文本模式中选择新的字符颜色*/ gotoxy(4,5); /*在文本窗口中设置光标*/ cprintf(\" The FellowList Management System \\n\"); gotoxy(4,8); cprintf(\" *************************Menu********************************\\n\"); gotoxy(4,9); cprintf(\" * 1 input record 2 display record *\\n\"); gotoxy(4,10); cprintf(\" * 3 delete record 4 search record *\\n\"); gotoxy(4,11); cprintf(\" * 5 modify record 6 sort record *\\n\"); gotoxy(4,12); cprintf(\" * 7 save record 0 quit system *\\n\"); gotoxy(4,13); cprintf(\" *************************************************************\\n\"); } void printheader() /*格式化输出表头*/ { printf(HEADER1); printf(HEADER2); printf(HEADER3); } void printdata(FellowList pp) /*格式化输出表中数据*/ { FellowList* p; p=&pp; printf(FORMAT,DATA); } void Disp(FellowList temp[],int n) /*显示数组temp[]中存储的校友通讯录记录*/ { int i=0; if(n==0) /*表示没有校友通讯录记录*/ { printf(\"\\n=====>Not telephone record!\\n\"); getchar(); return; } printf(\"\\n\\n\"); printheader(); while(iNot find this telephone record!\\n\"); } /************************************************************* 作用:用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值 参数:findness[]保存要查找的具体内容; target[]保存按什么在数组中查找; **************************************************************/ int Locate(FellowList temp[],int n,char findness[],char target[]) { int i=0; if(strcmp(target,\"graduatetime\")==0) /*按毕业时间查询*/ {while(ilens) printf(\"\\n exceed the required length! \\n\"); /*进行长度校验,超过lens值重新输入*/ }while(strlen(n)>lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/ } int Add(FellowList temp[],int n) /*增加校友通讯录记录*/ {char ch,num[10];int i,flag=0; system(\"cls\"); Disp(temp,n); /*先打印出已有的校友通讯录信息*/ while(1) /*一次可输入多条记录,直至输入编号为0的记录才结束添加操作*/ {while(1) /*输入记录编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/ {stringinput(num,10,\"input number(press '0'return menu):\"); /*格式化输入编号并检验*/ flag=0; if(strcmp(num,\"0\")==0) /*输入为0,则退出添加操作,返回主界面*/ return n; i=0; while(iThe number %s is existing,try again?(y/n):\ scanf(\"%c\ if(ch=='y'||ch=='Y') continue; else return n; } else break; } strcpy(temp[n].num,num); /*将字符串num拷贝到temp[n].num中*/ stringinput(temp[n].name,15,\"Name:\"); stringinput(temp[n].phonenum,15,\"Telephone:\"); stringinput(temp[n].graduatetime,15,\"Graduatetime:\"); stringinput(temp[n].class,15,\"Class:\"); stringinput(temp[n].address,15,\"Adress:\"); saveflag=1; n++; } return n; } void Qur(FellowList temp[],int n) /*按姓名或电话或者毕业时间及原所在班级查询*/ { int select;int p=0; char searchinput[20]; /*保存用户输入的查询内容*/ if(n<=0) /*若数组为空*/ {system(\"cls\"); printf(\"\\n=====>No telephone record!\\n\"); getchar(); return; } system(\"cls\"); printf(\"\\n =====>1 Search by name =====>2 Search by telephone number\\n\"); printf(\"\\n =====>3 Search by class =====>4 Search by gruduatetime\\n\"); printf(\" please choice[1,2,3,4]:\"); scanf(\"%d\if(select==1) /*按姓名查询*/ {stringinput(searchinput,10,\"input the existing name:\"); p=Locate(temp,n,searchinput,\"name\"); /*在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/ if(p!=-1) /*若找到该记录*/ {printheader(); printdata(temp[p]); printf(END); printf(\"press any key to return\"); getchar(); } else Nofind(); getchar(); } if(select==2) /*按电话号码查询*/ {stringinput(searchinput,15,\"input the existing telephone number:\"); p=Locate(temp,n,searchinput,\"phonenum\"); if(p!=-1) {printheader(); printdata(temp[p]); printf(END); printf(\"press any key to return\"); getchar(); } else Nofind(); getchar(); } if(select==3) /*按原所在班级查询*/ { stringinput(searchinput,15,\"input the existing class:\"); p=Locate(temp,n,searchinput,\"class\"); if(p!=-1) {printheader(); printdata(temp[p]); printf(END); printf(\"press any key to return\"); getchar(); } else Nofind(); getchar(); } if(select==4) /*按毕业时间查询*/ {stringinput(searchinput,15,\"input the existing graduatetime:\"); p=Locate(temp,n,searchinput,\"graduatetime\"); if(p!=-1) {printheader(); printdata(temp[p]); printf(END); printf(\"press any key to return\"); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } int Del(FellowList temp[],int n) /*删除校友通讯录记录*/ { int sel;int p=0,i=0;char findness[20]; if(n<=0) {system(\"cls\"); printf(\"\\n=====>No telephone record!\\n\"); getchar(); return n; } system(\"cls\"); Disp(temp,n); printf(\"\\n =====>1 Delete by name =====>2 Delete by telephone number\\n\"); printf(\"\\n =====>3 Delete by class =====>4 Delete by graduatetime\\n\"); printf(\" please choice[1,2,3,4]:\"); scanf(\"%d\if(sel==1) /*按姓名删除*/ {stringinput(findness,10,\"input the existing name:\"); p=Locate(temp,n,findness,\"name\"); getchar(); if(p!=-1) {for(i=p+1;idelete success!\\n\"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } if(sel==2) /*按电话号码删除*/ {stringinput(findness,15,\"input the existing telephone number:\"); p=Locate(temp,n,findness,\"phonenum\"); getchar(); if(p!=-1) {for(i=p+1;idelete success!\\n\"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } if(sel==3) /*按原所在班级删除*/ {stringinput(findness,15,\"input the existing class:\"); p=Locate(temp,n,findness,\"class\"); getchar(); if(p!=-1) { for(i=p+1;idelete success!\\n\"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } if(sel==4) /*按毕业时间删除*/ {stringinput(findness,15,\"input the existing graduatetime:\"); p=Locate(temp,n,findness,\"graduatetime\"); getchar(); if(p!=-1) { for(i=p+1;idelete success!\\n\"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } return n; } void Modify(FellowList temp[],int n)/*修改校友通讯录记录*/ { int p=0;char findness[20]; if(n<=0) {system(\"cls\"); printf(\"\\n=====>No telephone number record!\\n\"); getchar(); return ; } system(\"cls\"); printf(\"modify telephone book recorder\"); Disp(temp,n); stringinput(findness,10,\"input the existing name:\"); /*输入并检验该姓名*/ p=Locate(temp,n,findness,\"name\"); /*查询到该数组元素,并返回下标值*/ if(p!=-1) /*若p!=-1,表明已经找到该数组元素*/ {printf(\"Number:%s,\\n\ printf(\"Name:%s,\ stringinput(temp[p].name,15,\"input new name:\"); printf(\"Graduatetime:%s,\ stringinput(temp[p].graduatetime,15,\"input new time:\"); printf(\"Class:%s,\ stringinput(temp[p].class,10,\"input new class:\"); printf(\"Phonenumber:%s,\ stringinput(temp[p].phonenum,15,\"input new telephone:\"); printf(\"Address:%s,\ stringinput(temp[p].address,30,\"input new address:\"); printf(\"\\n=====>modify success!\\n\"); getchar(); Disp(temp,n); getchar(); saveflag=1; } else {Nofind(); getchar(); } return ; } void SelectSort(FellowList temp[],int n) /*利用选择排序法实现数组排序*/ { int i=0,j=0,flag=0,indexmin,select; char charflag[10]; FellowList newinfo; if(n<=0) {system(\"cls\"); printf(\"\\n=====>Not telephone record!\\n\"); getchar(); return ; } system(\"cls\"); Disp(temp,n); /*显示排序前的所有记录*/ printf(\" ==>1 SORT BY NUMBER ==>2 SORT BY CLASS\\n\"); printf(\" please choice[1,2]:\"); scanf(\"%d\if(select==1) /*按记录编号升序排序*/ {for(i=0;isort complete!\\n\"); getchar(); return; } else if(select==2) { for(i=0;isort complete!\\n\"); getchar(); return; } else {Wrong(); getchar(); getchar(); return; } } void Save(FellowList temp[],int n) /*数据存盘*/ { FILE* fp; int i=0; fp=fopen(\"c:\\\\FellowList\以只写方式打开文本文件*/ if(fp==NULL) /*打开文件失败*/ {printf(\"\\n=====>open file error!\\n\"); getchar(); return ; } for(i=0;i0) {getchar(); printf(\"\\n\\n=====>save file complete,total saved's record number is:%d\\n\ getchar(); saveflag=0; } else {system(\"cls\"); printf(\"the current link is empty,no telephone record is saved!\\n\"); getchar(); } fclose(fp); /*关闭此文件*/ } void main() { FellowList tele[N]; /*定义FellowList结构体*/ FILE *fp; /*文件指针*/ int select; /*保存选择结果变量*/ char ch; /*保存(y,Y,n,N)*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen(\"C:\\\\FellowList\/*以追加方式打开文本文件c:\\FellowList,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) {printf(\"\\n=====>can not open file!\\n\"); exit(0); } while(!feof(fp)) {if(fread(&tele[count],sizeof(FellowList),1,fp)==1) /*一次从文件中读取一条校友通讯录记录*/ count++; } fclose(fp); /*关闭文件*/ printf(\"\\n==>open file sucess,the total records number is : %d.\\n\getchar(); menu(); while(1) {system(\"cls\"); menu(); printf(\"\\n Please Enter your choice(0~8):\"); /*显示提示信息*/ scanf(\"%d\ if(select==0) {if(saveflag==1) /*若对数组的数据有修改且未进行存盘操作,则此标志为1*/ {getchar(); printf(\"\\n==>Whether save the modified record to file?(y/n):\"); scanf(\"%c\ if(ch=='y'||ch=='Y') Save(tele,count); } printf(\"\\n===>thank you for useness!\"); getchar(); break; } switch(select) { case 1:count=Add(tele,count);break; /*增加校友通讯录记录*/ case 2:system(\"cls\");Disp(tele,count);break; /*显示校友通讯录记录*/ case 3:count=Del(tele,count);break; /*删除校友通讯录记录*/ case 4:Qur(tele,count);break; /*查询校友通讯录记录*/ case 5:Modify(tele,count);break; /*修改校友通讯录记录*/ case 6:SelectSort(tele,count);break; /*排序校友通讯录记录*/ case 7:Save(tele,count);break; /*保存校友通讯录记录*/ default: Wrong();getchar();break; /*按键有误,必须为数值0-8*/ } } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务