《编程实习》报告
学院:________________
专业:________________
学号:________________
姓名:________________
一、功能分析
1.1 需求概述: 要求设计并实现一个通讯录管理工具软件,管理用户通信联系人的名片信息。名片包含的主要信息有:姓名、职务、单位、固定电话、手机、E-Mail、QQ、MSN、备注等。
1.2 功能需求: 要求设计并实现一个通讯录管理工具软件,管理用户通信联系人的名片信息。名片包含的主要信息有:姓名、职务、单位、固定电话、手机、E-Mail、QQ、MSN、备注等。要求该软件:
1、采用C语言在字符模式下设计。
2、将名片信息存放在二进制文件“Cards.Dat”中,该文件为名片文件。名片文件为记录文件。文件头包含用户注册号(8位)和名片数量(小于200),本设计中注册号采用设计者的学号。每个名片的信息存为一条记录,数据项及数据项的长度根据需求和常理自行设计。第一次运行时,名片文件才产生,此时需要输入注册号。
3、具有添加新名片功能。添加新名片时,需要输入姓名的拼音缩写,如“张雨生”缩写为“ZYS”。新名片信息中,姓名和单位是必须输入的。系统必须保证不会出现相同E-Mail的名片。
4、具有查询功能。系统拼音缩写的模糊匹配查询,模糊匹配时采用左对齐的规则。查询的结果按照拼音缩写的升序、列表分页显示,显示时自动依次编号,如1、2、3、……。在查询时,也可以显示所有的名片信息。
5、具有删除功能。对查询的结果,可以选择名片(输入编号)来删除该名片,删除前需要确认。
6、具有修改功能。对查询的结果,可以选择名片(输入编号)来修改该名片。修改时逐项修改,最后需要确认。
7、系统完成每个名片的添加、删除和修改后,需要及时保存到名片文件中,以防数据的丢失。
8、 系统启动时,如果不存在名片文件则视为首次运行,否则,需自动加载名片信息,并显示“欢迎(注册号),您共有N张名片!”的信息,其中“注册号”为注册号码,“N”为实际的名片数量。
9、 要求在人机交互时,系统显示的信息列表整齐、清晰,并有必要的提示。
10、 采用文本文件自动记录操作日志。日志中包括3类操作:系统的启动和停止、用户选择的功能、名片的操作。日志中的时间格式为:YYYY-MM-DD hh24:mm:ss。要求系统运行期间,日志文件依然能够打开查看。不同操作记录的日志信息为:
a) 系统的启停:时间、启动/停止;
b) 功能的选择:时间、功能的说明如添加、查询、删除、修改等;
c) 名片的操作:时间、操作类别(添加、删除、修改)和名片的拼音缩写。
1.3 功能的设计
(功能结构图和功能流程图)
2、系统流程图
(1)权限验证与主菜单程序流程图
(2)修改联系人程序流程图 (3)添加联系人程序流程图
(4)删除联系人程序模块
(5)查询联系人程序模块
3、逻辑设计
联系人:
4.系统运行界面赏析
3.系统评价
系统评价就是客观,公正的从各个方面评价系统的各项功能。本部分将具体从三方面阐述:优点,缺点以及将来可能提出的要求。
4.1 系统的特点
(1)流程符合选修课系统的基本要求。
(2)操作一目了然。
(3)系统扩充容易。体积小,程序易于修改。
4.2 系统的不足
(1) 界面不太美观、友好,操作不方便 貌似不支持多种输入法。
(2) 几乎是面向开发人员,而不是面向用户。输入信息不太方便(好多信息,系统不能进行异常处理)
(3) 网络功能欠缺。本系统只能在单片机上运行,不能实现网络连接,资源共
享。
(4) 容错性不高。系统的抗错,容错性不高。这方面有待加强。
(5) 没有良好的用户权限和密码限制以防止人为的破坏与盗窃数据资源
七)总结
(这里就自己写啦,每个人的感受都不同学到的东西都不O(∩_∩)O~
)
八)程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct record
{
char name[20];
char phone[20];
char adress[40];
char e_mail[30];
char QQ[20];
char msn[20];
}student[500];
int num=0;//外部变量num为文件中的纪录数
FILE *fp;
void mainmenu();//主菜单
void newrecord();//添加联系人
void searchmenu();//查询联系人
void modSub();//修改联系人
void searchbyname();//按姓名查询
void searchbyphone();//按电话查询
void deletemenu();//删除联系人
void deleteall();//删除所有联系人
void deleteone();//删除单个联系人
void showall();//显示所有联系人
void readfromfile();//读取文件
void writetofile();//写入文件
void deletebyname();//按姓名删除
int chcode();
void main()
{ if(!chcode()){exit(0);
}
readfromfile();
while (1)
{
mainmenu();
}
}
void readfromfile()//从文件导入
{
if((fp=fopen("student.bin","rb"))==NULL)
{
printf("\n\t\t通讯录不存在");
if ((fp=fopen("student.bin","wb"))==NULL)
{
printf("\n\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t通讯录已建立");
printf("\n\t\t按任意键进入主菜单");
getch();
return;
}
exit(0);
}
fseek(fp,0,2); /*文件位置指针移动到文件末尾*/
if (ftell(fp)>0) /*文件不为空*/
{
rewind(fp); /*文件位置指针移动到文件开始位置*/
for (num=0;!feof(fp) && fread(&student[num],sizeof(struct record),1,fp);num++);
printf("\n\t\t文件导入成功");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
printf("\n\t\t文件导入成功");
printf("\n\t\t通讯录中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
void mainmenu()//主菜单
{
char choic;
system("cls");
printf("\n\t\t xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
printf("\n\t\t X x");
printf("\n\t\t x 主菜单 (#`′)凸 ┏┓ x");
printf("\n\t\t X ┣┫ x");
printf("\n\t\t x 1-添加联系人 2-查询联系人 ┏┳┫┣┳┓ x");
printf("\n\t\t X ┃ ┃ x");
printf("\n\t\t x 3-删除联系人 4-修改联系人 ┻━━━━┛ x");
printf("\n\t\t X x");
printf("\n\t\t x 5-保存退出 6-直接退出 x");
printf("\n\t\t X x");
printf("\n\t\t xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':newrecord();break;
case '2':searchmenu();break;
case '3':deletemenu();break;
case '4':modSub();break;
case '5':writetofile();break;
case '6':exit(0);
default:printf( "\n\t\t请在1到5之间选择") ;
}
}
void searchmenu()//查询联系人
{
char choic;
system("cls");
printf("\n\t\t 查询菜单 ");
printf("\n\t\t 1-显示所有联系人 ");
printf("\n\t\t 2-按姓名查询 ");
printf("\n\t\t 3-按电话查询 ");
printf("\n\t\t 4-返回主菜单");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':showall();break;
case '2':searchbyname();break;
case '3':searchbyphone();break;
case '4':mainmenu();break;
default:mainmenu();
}
}
void deletemenu()//删除联系人
{
char choic;
if(num==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
system("cls");
printf("\n\t\t 删除菜单 ");
printf("\n\t\t 1-删除所有联系人 ");
printf("\n\t\t 2-删除单个联系人 ");
printf("\n\t\t 3-返回主菜单 ");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':deleteall();break;
case '2':deleteone();break;
case '3':mainmenu();break;
default:mainmenu();break;
}
}
void deleteall()//删除所有联系人
{
printf("\n\t\t确认删除?(y/n)");
if (getch()=='y')
{
fclose(fp);
if ((fp=fopen("student.bin","wb"))==NULL)
{
printf("\n\t\t不能打开文件,删除失败");
readfromfile();
}
num=0;
printf("\n\t\t纪录已删除,按任意键返回主菜单");
getch();
return;
}
else
return;
}
void deletebyname()//按姓名删除联系人
{
int a=0;
int findmark=0;
int j;
int deletemark=0;
int i;
char name[20];
printf("\n\t\t请输入要删除联系人的姓名:");
scanf("%s",name);
for (i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==NULL)
{
printf("\n\t\t以下是您要删除的联系人纪录:");
findmark++;
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话: %s",student[i].phone);
printf("\n\t\t地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\tmsn:%s",student[i].msn);
printf("\n\t\t是否删除?(y/n)");
if (getch()=='y')
{
for (j=i;j<num-1;j++) /*纪录移动,从stud数组中删除之*/
student[j]=student[j+1];
num--;
deletemark++;
printf("\n\t\t删除成功");}}}}
void newrecord()//添加联系人
{
printf("\n\t\t请输入联系人信息 \n");
printf("\n\t\t输入姓名:");
scanf("%s",&student[num].name);
printf("\n\t\t输入电话号码:");
scanf("%s",&student[num].phone);
printf("\n\t\t输入地址:");
scanf("%s",&student[num].adress);
printf("\n\t\t输入e-mail:");
scanf("%s",&student[num].e_mail);
printf("\n\t\t输入QQ:");
scanf("%s",&student[num].QQ);
printf("\n\t\t输入msn:");
scanf("%s",&student[num].msn);
num++;
printf("\n\t\t是否继续添加?(Y/N):");
if (getch()=='y')
newrecord();
return;
}
void showall()//显示所有联系人
{
int i;
system("cls");
if(num!=0)
{
printf("\n\t\t 以下为通讯录所有信息");
for (i=0;i<num;i++)
{
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话: %s",student[i].phone);
printf("\n\t\t地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\tmsn:%s",student[i].msn);
printf("\t\t");
if (i+1<num)
{
printf("\n\t\t__________________________");
system("pause");
}
}
}
else
printf("\n\t\t通讯录中无任何纪录");
printf("\n\t\t按任意键返回主菜单:");
getch();
return;
}
//按电话查询
void searchbyphone()
{
int mark=0;
int i;
int a=0;
printf("\n\t\t 按电话查找 ");
char phone[10];
printf("\n\t\t请输入号码:");
scanf("%s",phone);
for(i=0;i<num;i++)
{
if (strcmp(student[i].phone,phone)==0)
{
printf("\n\t\t以下是您查找的联系人信息 ");
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话: %s",student[i].phone);
printf("\n\t\t地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\tmsn:%s",student[i].msn);
printf("\n\t\t按任意键返回主菜单:");
mark++;
getch();
return;
}
}
if (mark==0)
{
printf("\n\t\t没有该联系人的信息");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void searchbyname()//按姓名查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t 按姓名查找 ");
char name[20];
printf("\n\t\t请输入姓名:");
scanf("%s",name);
for(i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==0)
{
printf("\n\t\t以下是您查找的联系人信息");
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话: %s",student[i].phone);
printf("\n\t\t地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\tmsn:%s",student[i].msn);
mark++;
if ((i+1)<num)
{
printf("\n\t\t是否继续查找相同名字的联系人信息:(y/n)");
if (getch()=='y')
{
a=i;
continue;
}
else
return;
}
else
{
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
}
if(mark!=0)
{
printf("\n\t\t没有相同姓名的联系人纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
else
{
printf("\n\t\t没有相同姓名的联系人纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void writetofile()//写入文件
{
int i;
if ((fp=fopen("student.bin","wb"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for (i=0;i<num;i++)
{
if (fwrite(&student[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
}
fclose(fp);
printf("\n\t\t通讯录文件已保存");
printf("\n\t\t按任意键退出程序\n\t\t");
exit(0);
}
void deleteone()//删除单个联系人
{
char choic;
printf("\n\t\t请选择删除人姓名");
if (choic=getch()); deletebyname();
}
void modSub()//修改联系人
{
char sub[20];
char name[30];
int i=0,j;
printf("\n\t\t修改联系人信息 \n");
printf("\n\t\t输入姓名:");
scanf("%s",name);
for(j=0;j<num;j++)
{
if(strcmp(student[j].name,name)==0)/* 找出名字相同的联系人并进行修改 */
{
printf("\t\t此联系人详情\n");
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话: %s",student[i].phone);
printf("\n\t\t地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\tmsn:%s",student[i].msn);
printf("\n\t\t修改\n\n");
printf("\n\t\t输入姓名:");
scanf(" %s",student[j].name);
printf("\n\t\t电话:");
scanf(" %s",student[j].phone);
printf("\n\t\t地址:");
scanf(" %s",student[j].adress);
printf("\n\t\te_mail:");
scanf(" %s",student[j].e_mail);
printf("\n\t\tQQ:");
scanf(" %s",student[i].QQ);
printf("\n\t\t输入msn:");
scanf("%s",&student[num].msn);
printf("\n\t\t修改成功");
printf("\n\t\t姓名: %s",student[j].name);
printf("\n\t\t电话: %s",student[j].phone);
printf("\n\t\t地址: %s",student[j].adress);
printf("\n\t\te-mail:%s",student[j].e_mail);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\tmsn:%s",student[i].msn);
printf("\n\t\t按任意键返回主菜单");
getch();
return; }
if(strcmp(student[j].name,name)!=0)
{
printf("\n\t\t没有相同姓名的联系人纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
}
int chcode()
{char aaa[]={'0','8','9','3','1','3','1','6'},bbb[9];
int i;
printf("请输入密码:");
scanf("%s",bbb);
for(i=0;i<=7;++i)
if(aaa[i]!=bbb[i])
{printf("密码错误 您无权使用本系统!!!\n");
printf("\n\n按任意键离开!");
getchar();
return 0;
}
else
if(i==7)
{printf("欢迎使用本系统!!!\n");
return 1;
}
}