程序设计格式要求如下:
(1)要求使用多文方式实现设计。
(2)要求在各个文件内实现结构化设计。
(3)每个模块作为一个单独的C文件。
(4)系统的各个功能用函数调用的形式实现。
(5)宏和数据结构等放在头文件中,并使用条件编译。
(6)界面友好(良好的人机互交),程序要有注释。
完成一个学生成绩管理系统,具体要求如下:
1. 建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等
2. 能够提供添加、删除和修改通讯录信息的功能
3. 能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询
4. 将通讯录保存在文件中
5. 能够按表格方式输出通讯录信息
6. 退出程序
1.数据结构设计
定义一个结构体类型address_list ,结构体中包含姓名、学号、编号、手机号、邮箱和地址,以及指向下一人信息的指针,共7个结构体成员。
struct address_list
{
char name[30]; //名字
char age[30]; //生日
int number; //编号
char handset1[30]; //手机1
char handset2[30];//手机2
char email[30]; //电子邮件
char address[30]; //通讯地址
struct address_list *next;
};
2.函数功能说明、调用关系
根据功能模块划分,通讯录管理系统所需的函数以及各函数的功能说明,如下表所示。
函数名 | 功能说明 |
---|---|
void print() | 创建函数,创建不带头节点的链表 |
void add() | 输出函数,表格方式输出通讯录信息 |
void delet() | 增加函数,新增通讯录信息 |
void order() | 删除函数,删除多余人的信息 |
void search() | 显示函数,单个地表格化地显示所需的信息 |
void renew() | 排序函数,按照姓名大小将通讯录信息排序 |
void out() | 查找函数,按指定方式查找所需信息 |
void set() | 创建用户函数,用于创建新的用户 |
void enter() | 进入系统函数,用于进入管理系统 |
void person() | 系统界面函数,管理系统的菜单界面 |
3.磁盘文件 | |
这里只有一个文件,就是保存我们用户名和密码的文件(jilu.txt);需要说明的是,这个通讯录系统没有管理员和用户之分,但它的特色功能是可以自己注册用户名和密码。 这里的jilu.txt文件就是用来保存我们的用户名和密码的;另外,这并不代表我们程序只有这一个文件,只是需要我们知道的有这一个文件,因为其他的文件在我们创建用户时程序就已经自动生成了对应的文件。 |
系统的执行从登录系统的菜单开始,允许用户输入1~3之间的数值来选择要进行的操作要进行的操作。
其处理过程如下:
当用户从登录界面输入正确的账号和密码后,会进入到个人的通讯录管理系统,系统允许用户输入1~7之间的不同数字进行相应的操作。
其处理过程如下:
模块功能:用户在管理系统界面中输入3时,进入查找信息模块,进入子菜单后,进行多种详细操作。
其处理过程如下:
用户输入5,会进入修改信息操作菜单,该菜单允许用户输入1~4之间的数值进行相应的操作。
其处理过程如下:
排序模块可以对通讯录内的信息,按照联系人姓名的首字母顺序排序后储存并输出;在联系人数量较多的时候,可以对通讯录进行排序后输出,查看通讯录内的信息,这样更容易查找到用户希望查找的联系人的信息,代码如下。
void order()
{
FILE *fp;
int z,i,j;
struct stu
{
char name[30];
char age[30];
int number;
char handset1[30];
char handset2[30];
char email[30];
char address[30];
};
struct address_list *p,*last;
struct stu temp,s[200];
p=(struct address_list *)malloc(sizeof(struct address_list));
last=p;
fp=fopen(pp,"r");//打开
if(fp==NULL)
{
printf("can not open!\n");
return ;
}
i=0;
while(fread(p,LEN,1,fp))
{
strcpy(s[i].name,p->name);
strcpy(s[i].age,p->age);
s[i].number=p->number;
strcpy(s[i].handset1,p->handset1);
strcpy(s[i].handset2,p->handset2);
strcpy(s[i].email,p->email);
strcpy(s[i].address,p->address);
i++;
}
z=i;
for(i=0;i’s[j].name’)>0)
{
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
}
fclose(fp); //关闭
fp=fopen(pp,"w"); //打开
for(i=0;iname,s[i].name);
strcpy(p->age,s[i].age);
p->number=s[i].number;
strcpy(p->handset1,s[i].handset1);
strcpy(p->handset2,s[i].handset2);
strcpy(p->email,s[i].email);
strcpy(p->address,s[i].address);
fwrite(p,LEN,1,fp);
}
fclose(fp);
printf("=*=*=*=*=*=*=*=*=\n");
printf(" 排序后信息如下:\n");
printf("=*=*=*=*=*=*=*=*=\n");
print();
}
例如,查询菜单下,有3个等待用户选择的子菜单项,代码如下。
void search()
{
...//源代码较长,在此省略部分代码
...
...
printf(" ┌──────────┐\n");
printf(" │1 精确查找│\n");
printf(" │2 模糊查找│\n");
printf(" │3 退出 │\n");
printf(" └──────────┘");
printf("\n");
printf("=*=*=*=*=*=*=*=*=\n");
printf(" 请输入您的操作:\n");
printf("=*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(str);
printf("\n");
if(strlen(str)>1)
{
printf("=*=*=*=*=*=\n");
printf("操作错误!\n");
printf("=*=*=*=*=*=\n");
printf("\n");
continue;
}
switch(*str)
{
case ‘1’: ....;break;
case ‘2’: ....;break;
case ‘3’: ....;break;
default :printf(“操作错误!\n”);break;
}
...
...
...//源代码较长,在此省略部分代码
}
输出信息按照表格的方式输出,使输出界面看起来更清晰明了,用户体验更加舒畅,代码如下。
void print()
{
FILE *fp;
int n=0;
struct address_list *p,*head,*last;
p=(struct address_list *)malloc(LEN);
{
head=p;
last=p;
}
fp=fopen(pp,"r");
if(fp==NULL)
{
fp=fopen(pp,"w");
printf("通讯录不存在!已重新创建一个通讯录!\n");
//return ;
}
while(fread(p,LEN,1,fp))
{
n++;
p->number=n;
if(n==1)
{
printf("================================================================================================\n");
printf("|姓名 |生日 |编号 |手机号1 |手机号2 |邮箱 |地址 |\n");
}
printf("------------------------------------------------------------------------------------------------\n");
printf("|%-12s|%-13s|%-6d|%-14s|%-14s|%-19s|%-10s|\n",p->name,p->age,p->number,p->handset1,p->handset2,p->email,p->address);
}
if(n!=0)
printf("================================================================================================\n");
}
...//源代码较长,在此省略部分代码
...
...
fclose(fp);
}
系统采用了账号密码登录的方式,增强了系统在不同情况下通用性,方便多人添加的通讯录,并且使用了创建用户的方式来为不同的用户创建通讯录,创建用户的账号密码与通讯录文件都将保存到文件中,代码如下。
void est() //创建用户
{
FILE *fp,*Fp;
int flag=1;
struct person *p;
char Number[30],Key[30];
p=(struct person *)malloc(sizeof(struct person));
fp=fopen("jilu.txt","r");
if(fp==NULL)
{
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 用户目录文件不存在,已重新创建.\n");
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
printf("=*=*=*=*=*=*=*=*=\n");
printf(" 请重新创建用户\n");
printf("=*=*=*=*=*=*=*=*=\n");
printf("\n");
fp=fopen("jilu.txt","w");
fclose(fp);
return ;
}
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 请设置新建用户名:(请输入英文字符)\n");
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(Number);
printf("\n");
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf(" 请设置用户密码:(仅限英文与数字)\n");
printf("=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n");
printf("\n");
gets(Key);
printf("\n");
...//源代码较长,在此省略部分代码
...
...
}
}
执行程序后,得到的界面如下图所示,该图显示有本系统的登录选项。
输入如下数据:
用户名:mye 密码:12345
按照给定账号密码输入后,系统提示创建成功。如下图所示。
按照已经给定的账号密码,进入到账号登陆界面,输入账号和密码,如下图所示,系统提示成功进入通讯录管理系统。
测试数据
姓名:zhangsan
生日:1998-01-01
手机号1:12345654321
手机号2:12345676543
email:[email protected]
地址:安阳
按照所给联系人信息录入到通讯录,如下图所示。
在主菜单界面输入数字3,进入查找界面,依次测试精确查找和模糊查找,结果分别如下图所示。
在主菜单界面输入数字4,进入排序界面,排序后输出如下图所示。
在主菜单中输入数字5,进入修改信息界面,选择修改电话1,将zhangsan的电话1修改为18637621756,结果如下图所示。
在主菜单界面输入数字6,进入删除操作,删除lisi的信息,界面如下图所示。