学生通讯录管理程序.docx
- 文档编号:29154973
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:17
- 大小:20.19KB
学生通讯录管理程序.docx
《学生通讯录管理程序.docx》由会员分享,可在线阅读,更多相关《学生通讯录管理程序.docx(17页珍藏版)》请在冰豆网上搜索。
学生通讯录管理程序
/*这是个学生通讯录管理程序,可以进行添加、删除、查找(按学号或姓名!
、排序和列表输出等操作*/
/*TYPEIN代替getch()输入,使输入同时在屏幕上显示信息*/
#defineTYPEINputch(getch())
#include"stdio.h"
#include"conio.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h"
#include"string.h"
/*学生资料*/
structstudent/*定义学生资料结构体*/
{charcnm[20];/*班级序号classnumber*/
charnam[20];/*姓名name*/
chardom[20];/*寝室dorm*/
charnat[20];/*籍贯nativeplace*/
charadd[40];/*家庭地址address*/
chartel[20];/*电话telephone*/
charqq[20];/*qq*/
}*stu[1000],*tmp;/*定义一千个学生的全局数组,以及一个用于交换数据的临时指针和一个用于展示的指针*/
FILE*fp=0;/*全局文件指针*/
/*数据状态*/
intcou,ord,syc;/*最后一个有效数据对应的数组位置,及数组是否有序1为有序,文档是否同步1为同步*/
/*函数声明*/
voidadd();voiddel();voidfin();voidfso();intfind(char*tar);voidlis();/*对函数进行声明*/
char*inp(int);voidsort(int);voidshow(intn);voiditf();voidini();voidminitf();
voiddatacopy(structstudent*in,structstudent*out);voiduniversal_search();voiduniversal_sort();
voidimport();
/*函数指针,实现被调函数对调用函数的处理*/
char*(*loop)(int);
/*导入默认其他数据文件*/
voidimport(){
intn=5;
char*imp,*a="\nerroronopen";
imp=(char*)malloc(sizeof(char)*80);
puts("\npleaseinputdata'saddresslikethis'd:
\\data.txt'\n\n");
scanf("%s",imp);
/*打开*/
if((fp=fopen(imp,"r"))==NULL)
{/*打开文件若文件不存在则直接返回*/
gotoxy(30,12);printf("Thedatafileisnotexist\n");
TYPEIN;return;
}
while(EOF!
=n)
{stu[++cou]=(structstudent*)malloc(sizeof(structstudent));
n=fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[cou]->cnm,stu[cou]->nam,/*把学生资料存入数组*/
stu[cou]->dom,stu[cou]->nat,stu[cou]->add,stu[cou]->tel,stu[cou]->qq);
}
cou--;/*最后一行为空,删除*/
gotoxy(20,12);printf("Thedatafilehasbeenreadsuccessfully");
TYPEIN;(*loop)(0);
}
/*通用搜索,可以搜索符合任意条件的所有信息。
但效率低下,不适用于大型数据*/
voiduniversal_search()
{
while
(1)
{char*cmp[7],tar[40];
intn,i=0,sta;
for(n=0;n<7;cmp[n++]=(char*)malloc(sizeof(char)*40));
/*界面及功能说明*/
minitf();gotoxy(55,24);printf("press'Esc'togoback");
gotoxy(30,4);puts("UniversalSearch\n");
printf("pleaseinputanypieceofthestudents'information\n\n");/*anditwillshowthecompleteinformationofallthestudentswhomatchyourcondition*/
/*BUTitwilltakeyoualongtimetowaitifyourdatasfileisbiggerthan100MB.ANDthisprogramhasnotmeantojumpoutofit.*/
strcpy(tar,(*loop)
(2));/*输入*/
fso('s');/*同步文件*/
/*我自己都没想到这么漂亮~~~*/
minitf();
printf("Number\tName\tDorm\tNative\tAddress\tTelephone\tQQ\n\n");while(EOF!
=fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",cmp[0],cmp[1],cmp[2],cmp[3],cmp[4],cmp[5],cmp[6]))/*读文件*/
for(n=0;n<7;n++)/*对比*/
if(0==strcmp(cmp[n],tar))
{printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",cmp[0],cmp[1],cmp[2],cmp[3],cmp[4],cmp[5],cmp[6]);
i++;
if(i>15)
{i=0;
(*loop)
(1);
minitf();
printf("Number\tName\tDorm\tNative\tAddress\tTelephone\tQQ\n\n");
}
}
puts("\nThat'sall");
(*loop)
(1);
}
}
/*通用排序,实现按任意项目排序*/
voiduniversal_sort()
{charcmd;
minitf();gotoxy(30,4);puts("UniversalSort\n");
printf("Sortby\n");
puts("1forNumber\n2forName\n3forDorm\n4forNative\n5forAddress\n6forTelephone\n7forQQ");
cmd=*(*loop)
(1);
puts("\nSorting...\n");
sort(cmd-'0');
puts("thedatahasbeensortedasyoumean\n");
*(*loop)
(1);
}
/*据说主函数的函数指针不能乱用,所以让位给inp函数*/
voidmain()
{inp(-1);
}
goodbye()
{/*退出程序前保存、GoodBye*/
fso('s');fclose(fp);clrscr();
gotoxy(30,12);puts("THANKYOUFORTESTING");TYPEIN;
exit
(1);
}
/*输入,及对不同输入的不同处理。
goback为-1时进行初始化操作,,0时不返回调用函数,1时为命令控制,2为需要返回输入字符串*/
staticchar*inp(intgoback)
{chartar[40],ch;/*用于储存输入字符串*/
intn=0;
if(-1==goback)
{/*进行初始化*/
cou=-1;syc=1;ord=1;goback=0;/*变量初始化*/
loop=inp;
fso('o');/*打开文件*/
}
while
(1)
{
if(0==goback)
{/*刷新界面*/
itf();
printf("\npleaseinputyourcommand..\n");
}
ch=getch();
/*返回被调函数*/
if(goback)
{/*无法修改首字符*/
n=-1;/*n为数组中末尾有效字符的位置*/
do{putch(ch);
switch(tar[++n]=ch){/*若输入首字符为下列字母则进入相应函数,否则把字符地址返回调用函数*/
case27:
goback=0;(*inp)(0);break;/*返回主菜单,27为Esc的ASCII码*/
/*case'\t':
return"\n";break;若按Tab,返回空输入*/
case13:
break;/*若按回车,返回空输入。
13为getch()获得的回车的值,与'\n'不同,我也没办法。
。
。
*/
case'':
ch='\n';break;/*空格当回车处理*/
case8:
putch('');putch(8);n--;ch=getch();break;/*退格*/
default:
/*把输入存如字符串*/
if(1==goback)
returntar;
ch=getch();
break;/*把输入字符串赋值给tar[40],返回*/
}
}while(13!
=ch);
tar[n+1]='\0';
returntar;
}
/*返回主菜单*/
else
{switch(ch){/*若输入首字符为下列字母则进入相应函数,否则把字符地址返回调用函数*/
case'a':
add();continue;break;
case'd':
del();continue;break;
case'f':
fin();continue;break;
case's':
fso('s');puts("\nthefilehasbeensaved\n");getch();continue;break;
case'l':
lis();continue;break;
case'i':
import();break;
case'u':
universal_search();continue;break;
case'o':
universal_sort();continue;break;
case13:
continue;break;/*对回车忽略*/
case'e':
goodbye();break;
default:
puts("\nUnlegalCommand\n");
printf("pleaseinputyourcommand..\n");
break;
}
}
}
}
/*精简界面*/
voidminitf()
{
clrscr();/*清屏*/
gotoxy(1,1);/*光标位置*/
printf("|-------------------------ContactsManagementSystem--------------------------|");
gotoxy(60,2);printf("developedbykdjf");/*版权*/
gotoxy(1,4);
}
/*绘制简单界面*/
voiditf()
{
/*若不声明字符串直接用put()输出,会造成界面混乱。
因其输出内容储存在缓冲区,程序运行过程会被改写*/
char*a="|'a'toadddata",*d="|'d'todeletedata",
*f="|'f'tofinddata",*l="|'l'toshowthelist",
*u="|'u'universalsearch",*e="|'e'tosaveandexit",
*o="|'o'universalsort",*s="|'s'tosave",
*i="|'i'toimportdata";
minitf();/*简单框架和提示信息*/
gotoxy(55,16);printf("%s",i);
gotoxy(55,17);printf("%s",a);
gotoxy(55,18);printf("%s",d);
gotoxy(55,19);printf("%s",f);
gotoxy(55,20);printf("%s",l);
gotoxy(55,21);printf("%s",u);
gotoxy(55,22);printf("%s",o);
gotoxy(55,23);printf("%s",s);
gotoxy(55,24);printf("%s",e);
gotoxy(1,4);
}
/*同步txt文件,ch为's'时为保存,'o'为打开*/
voidfso(charch)
{
intn=5;/*在下文中用于循环计数和储存数据*/
/*保存*/
if('s'==ch)/*若不同步且要求保存则写入文件(写文件并关闭)*/
{fclose(fp);
if(1!
=ord)/*若数组无序则进行排序*/
sort
(1);
/*打开文件及对错误处理,为减少储存过程中的意外造成的影响,使用读写方式而非只写方式打开*/
if((fp=fopen("stu_list.txt","wt++"))==NULL)
{printf("Cannotopenfilestrikeanykeyexit!
");
(*loop)
(1);exit
(1);
}
for(n=0;n<=cou;n++)fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[n]->cnm,stu[n]->nam,
stu[n]->dom,stu[n]->nat,stu[n]->add,stu[n]->tel,stu[n]->qq);/*写入*/
fclose(fp);
syc=1;
if((fp=fopen("stu_list.txt","r"))==NULL)
{/*打开文件*/
printf("Thedatafileisnotsaved");
TYPEIN;
clrscr();
gotoxy(30,12);printf("Thedatafileissaved");
TYPEIN;return;
}
return;
}
/*打开*/
if((fp=fopen("stu_list.txt","r"))==NULL)
{/*打开文件若文件不存在则直接返回*/
gotoxy(30,12);printf("Thedatafileisnotexist\n");
TYPEIN;return;
}
while(EOF!
=n)
{stu[++cou]=(structstudent*)malloc(sizeof(structstudent));
n=fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[cou]->cnm,stu[cou]->nam,/*把资料存数组*/
stu[cou]->dom,stu[cou]->nat,stu[cou]->add,stu[cou]->tel,stu[cou]->qq);
}
cou--;/*最后一行为空,删除*/
gotoxy(20,12);printf("Thedatafilehasbeenreadsuccessfully");
TYPEIN;(*loop)(0);
}
/*删除数据。
使用find函数找出待删除数据对应的指针位置,将其与最后一个指针交换,并将数据个数减一*/
voiddel()
{while
(1)
{intn;/*储存将删除的数据位置*/
chartar[40],cd;/*tar储存输入的学生资料字符串,cd储存命令*/
minitf();gotoxy(55,24);printf("press'Esc'togoback");gotoxy(35,4);/*界面*/
printf("DELETE!
!
!
\n\nschoolnumber\n");
strcpy(tar,(*loop)
(2));
n=find(tar);/*查找并显示待删除学生完整信息*/
printf("\nNumber\tName\tDorm\tNative\tAddress\tTelephone\tQQ\n");
show(n);
puts("\n");printf("press'y'todelete\n\n");/*确认删除*/
if('y'==getch())
{/*删除*/
free(stu[n]);/*将要删除的内存空间释放*/
stu[n]=stu[cou--];/*将最后一个有效指针赋值给待删除数据对应的指针,并将有效指针个数减一*/
printf("Thedataisdeleted\n");(*loop)
(1);
ord=0;/*数组变为无序*/
syc=0;/*文档有不同步*/
return;
}
else
{/*不删除的情况*/
printf("Thedataisnotdeleted\n");(*loop)
(1);
return;
}
}
}
/*对数组进行希尔排序排序。
/
voidsort(intn)
{intgap,i,j,sortby=0;
if(1!
=n)
{switch(n)
{case2:
sortby=stu[0]->nam-stu[0]->cnm;break;
case3:
sortby=stu[0]->dom-stu[0]->cnm;break;
case4:
sortby=stu[0]->nat-stu[0]->cnm;break;
case5:
sortby=stu[0]->add-stu[0]->cnm;break;
case6:
sortby=stu[0]->tel-stu[0]->cnm;break;
case7:
sortby=stu[0]->qq-stu[0]->cnm;break;
default:
puts("\nUnlegalCommand\n");break;
}
}
for(gap=cou/2;gap>0;gap/=2)/*每次间隔折半至1*/
for(i=gap;i<=cou;i++)/*第一进步从gap递增*/
for(j=i-gap;j>=0&&strcmp(stu[j]->cnm+sortby,stu[j+gap]->cnm+sortby)>0;j-=gap)
{/*第二进步从第一进步-gap,对以gap为间隔的数据倒序对比交换*/
tmp=stu[j];
stu[j]=stu[j+gap];
stu[j+gap]=tmp;
}
if(n=1)
ord=1;
else
ord=0;
}
/*按姓名查找学生*/
voidfin()
{while
(1)
{chartar[40];
minitf();gotoxy(55,24);printf("press'Esc'togoback");gotoxy(38,4);/*界面*/
printf("SEARCH\n\nschoolnumber\n");
strcpy(tar,(*loop)
(2));;/*输入*/
printf("\nNumber\tName\tDorm\tNative\tAddress\tTelephone\tQQ\n");
show(find(tar));/*显示*/
(*loop)
(1)
);
}
}
/*输出当前用于展示的学生指针所对应的数据,处理数据不存在的情况*/
voidshow(intn)
{if(n>cou||n<0)
{/*判断输入变量是否正常*/
printf("thedatacannotbefound\n");
(*loop)
(1);return;
}
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[n]->cnm,stu[n]->nam,
stu[n]->dom,stu[n]->nat,stu[n]->add,stu[n]->tel,stu[n]->qq);
}
intfind(char*tar)/*对输入信息查找相应学生数据。
返回当前学生对于数组的位置,-1为未找到*/
{intlow=0,hig=cou,mid;/*midhif为二分法查找中的上下限,mid为当前查找位置*/
if(1!
=ord)/*查找前进行选择排序*/
sort
(1);
/*输入为学号的查找办法*/
if(isdigit(tar[0]))
{while
(1)
{/*用于二分法查找*/
mid=(low+hig)/2;/*查找上下限的中间值*/
/*用字符串也可比较数字大小,但对两数字位数要求相同*/
if(0==strcmp(tar,stu[mid]->cnm))/*找中*/
returnmid;
elseif(strcmp(tar,stu[mid]->cnm)>0)/*待查值比当前大,把下限改为当前值加一*/
low=mid+1;
elseif(strcmp(tar,stu[mid]->cnm)<0)/*待查值比当前小,把上限改为当前值减一*/
hig=mid-1;
if(low>hig)break;/*找不到时跳出无限循环*/
}
}
return-1;
}
/*列表输出*/
voidlis()
{
intn,i=0;
if(1!
=ord)/*输出前进行选择排序*/
sort
(1);
minitf();
printf("Number\tName\tDorm\tNative\tAddress\tTelephone\tQQ\n\n");
for(n=0;n<=cou;n++)/*一次显示十五个*/
if(i++<15)
show(n);
else
{puts("\npressan
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 通讯录 管理程序