资源描述
c语言课程设计学生通讯录管理系统
25
2020年4月19日
文档仅供参考,不当之处,请联系改正。
题目:学生通讯录管理系统
任务说明: 主要利用c语言的文件操作能力设计开发一个小型的通讯录管理系统,至少具有如下功能: ①记录通讯录内的人员的学号、姓名、地址、电话号码。
②显示所有人员的信息。
③经过输入姓名查找人员信息。
④经过输入姓名查找到要删除的人员信息,然后能够进行删除。
⑤经过输入姓名查找到要修改的人员信息,然后能够进行修改。
⑥添加人员信息。
系统功能描述:
本程序的功能是为用户提供简单的通讯录进行管理,经过该程序存储联系人信息,提供关键字(只能是英文关键字进行查找)查找功能,能够对数据进行修改、删除、添加等操作。
各按钮的功能如下:
查找记录:以姓名为关键字,查找并显示该记录。若查找不到,则显示“好象没有”;
添加记录:将当前记录按姓名序加入通讯录,然后显示第一条记录;
修改记录:修改当前记录,显示当前记录。姓名为关键字,不允许修改;
删除记录:删除当前记录,然后显示第一条记录;
第一条记录:将当前记录指针移动至首节点,若已为首节点,则不移动;
前一条记录:将当前记录指针向前移动一个节点,若已为首节点,则不移动;
后一条记录:将当前记录指针向后移动一个节点,若已为尾节点,则不移动;
最后一条记录:将当前记录指针移动至尾节点,若已为尾节点,则不移动;
加载:从文件中掉入已保存的通讯录数据;
保存:保存通讯录数据;
退出:退出系统;
设计思路:
根据要求,电话录数据以文本文件存放在文件中,故需要提供文件的输入、输出等操作;还需要保存记录以进行修改,删除,查找等操作;另外还应提供键盘式选择菜单实现功能选择。
通讯录管理系统
数据输入
数据修改
删除
数据添加
查找
浏览
图1 系统功能模块图
软件中使用的结构体和结构体数组,如:
struct callmember
{
char name[20];
char address[20];
char code[20];
char callnumber[20];
};
对用户的信息进行保存,她们都以二进制的形式读写。
其中:
char name[20];
char address[20];
char code[20];
char callnumber[20]
分别对姓名、地址、邮编、电话号码进行储存
在子函数中还使用了结构体数组:
struct callmember one[100];
还使用了exit()、 fclose()等库函数。
还运用了头文件:
#include "stdafx.h"
#include"string.h "
#include <stdio.h>
#include<stdlib.h>
其中还使用大量的子函数,例如:
void output();
void del();
void found();
void modify() ;
void insert();
部分子函数的详细代码:
void output()
{
int b=0,i=0;
int j;
struct callmember one[100];
FILE *fp;
if((fp=fopen("e:\\通讯录.txt","r"))==NULL)
{
printf("无法从已有通讯录输入!\n可能是因为原通讯录不存在或为空!\n建议你检查你的通讯录文挡!\n");
exit(1);
}
while(fscanf(fp,"%s%s%s%s",one[i].name,one[i].address,one[i].code,one[i].callnumber)!=EOF)
i++;
j=i;
for(i=0;i<j;i++)
{
printf("%s %s %s %s\n ",one[i].name,one[i].address,one[i].code,one[i].callnumber);
}
fclose(fp);
}
void insert()
{
FILE *fp;
struct callmember *p;
if((fp=fopen("e:\\通讯录.txt","a+"))==NULL)
{
printf("操作失败.");
exit(1);
}
p=(struct callmember *)malloc(sizeof(struct callmember));
printf(" ************************\n");
printf(" 姓名:");
scanf("%s",p->name);
printf(" 地址:");
scanf("%s",p->address);
printf(" 邮编:");
scanf("%s",p->code);
printf(" 电话:");
scanf("%s",p->callnumber);
printf(" ************************\n");
fprintf(fp,"%s %s %s %s",p->name,p->address,p->code,p->callnumber);
fclose(fp);
free(p);
}
经过对这些资源的合理利用使系统初步实现了通讯录管理系统的基本功能。
程序流程图:
执行printf()
退出系统
调用output()
函数
调用
insert()
函数
调用
modify()
函数
调用
found()函数
调用
del()
函数
选择(a)
执行printf()函数
开始
else
printf("\n对不起,通讯录中没有此人的记录。");
fclose(fp);
}
结果分析:
1运行进入程序主菜单
主选单具有所有函数的功能实现的选择功能,经过主选单的操作进入各个功能。主选单主要由主函数提供,其功能由子函数实现。
2查看所有人员信息界面
能够显示全部的人员的信息。可在3 .3参看流程图。
3删除模块
删除功能界面
4查找模块
进入查找记录界面
5修改模块
进入修改界面
6添加模块
进入添加界面
能够根据要求添加用户想添加的人员信息。
7.退出
进入退出界面:
当出现没有查找人员信息时会自动返回主选单
总结
1本程序的局限性及改进方法:
本程序中包含的信息不够全面,比如年龄,性别,通讯地址,电子邮箱等,都没有包含。改进方法就是在设计程序时把这些内容都加进去,电子邮箱还能够建立链接。
2运用本程序还能够编写比如对学生信息的管理系统,商店、超市里面对商品的管理,仓库里面对货物的查询等等。
3在课程设计过程中遇到的问题,解决的办法
1、从文本中写入数据时可能指针指错位置,导致不能正常进行。解决的办法是对指针进行必要跟踪,把该函数写入独立的cpp文件中,单个进行检查。
2、从文本文件中载入数据时,当记录数为1的时,出现内存不能读的情况,当记录数为0时,当前记录数和总记录数以及用户信息显示的情况比较特殊,解决的办法是分三种情况,写段程序分别进行处理。
4心得体会与收获:
经过这次课程设计,我对很多的函数有了新的认识,我对C语言有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,写软件的过程中我又学到啦曾经自己不知道的函数或是自己不会的函数的用法。特别是文件的开启和关闭,读与写。这次课程设计课总的来说让我受益匪浅。
虽然在调试程序遇到了很多的困难,可是都一一去把它解决了。从中也让我知道了要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。
程序清单:
#include<stdio.h> /*标准输入输出函数库*/
#include<string.h>
struct student
{
char name[8];
char tel[15];
char addr[50];
};
char filename[20];
FILE *fp;
void creat();
void output();
void search();
void append();
void modify();
void remove();
main()
{
int m;
creat();
while(1)
{
printf("\n\n添加,请按1");
printf("\n查找,请按2");
printf("\n修改,请按3");
printf("\n删除,请按4");
printf("\n输出,请按5");
printf("\n退出,请按0\n");
scanf("%d",&m);
if(m>=0&&m<=5)
{
switch(m)
{
case 1: append();
break;
case 2: search();
break;
case 3: modify();
break;
case 4: remove();
break;
case 5: output();
break;
case 0: break;
}
printf("\n\n操作完毕,请再次选择!");
}
else
printf("\n\n选择错误,请再次选择!");
}
}
void creat()
{
struct student one;
long s1;
printf("\n请输入通讯录名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\n不能建立通讯录!");
exit();
}
fprintf(fp,"%-10s%-20s%-50s\n","姓名","电话号码","住址");
printf("\n请输入姓名、电话号码及住址(以0结束)\n");
scanf("%s",one.name);
while(strcmp(one.name,"0"))
{
scanf("%s%s",one.tel,one.addr);
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
scanf("%s",one.name);
}
fclose(fp);
}
void output()
{
struct student one;
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打开通讯录!");
exit();
}
printf("\n\n%20s\n","通 讯 录");
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
printf("%-10s%-20s%-50s",one.name,one.tel,one.addr);
}
fclose(fp);
}
void append()
{
struct student one;
if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打开通讯录!");
exit();
}
printf("\n请输入添加的姓名、电话号码及住址\n");
scanf("%s%s%s",one.name,one.tel,one.addr);
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
fclose(fp);
}
void search()
{
int k=0;
char namekey[8];
struct student one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开通讯录!");
exit();
}
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
printf("\n\n已查到,记录为:");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
k=1;
}
}
if(!k)
printf("\n\n对不起,通讯录中没有此人的记录。");
fclose(fp);
}
void modify()
{
int m,k=0;
long offset;
char namekey[8];
struct student one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯录!");
exit();
}
while(!feof(fp))
{
offset=ftell(fp);
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为:");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
printf("\n请输入新姓名、电话号码及住址:");
scanf("%s%s%s",one.name,one.tel,one.addr);
fseek(fp,offset,SEEK_SET);
printf("%ld",ftell(fp));
fprintf(fp,"%-10s%-20s%-50s\n",one.name,one.tel,one.addr);
}
else
printf("\n对不起,通讯录中没有此人的记录。");
fclose(fp);
}
void delete()
{
int m,k=0,flag;
long offset1,offset2;
char namekey[8], valid[4];
struct student one;
printf("\n请输入姓名:");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开通讯录!");
exit();
}
while(!feof(fp))
{
offset1=ftell(fp);
fscanf(fp,"%s%s%s\n",one.name,one.tel,one.addr);
if(!strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n已查到,记录为");
printf("\n%-10s%-18s%-50s",one.name,one.tel,one.addr);
printf("\n确实要删除,按1;不删除,按0:");
scanf("%d",&m);
if(m)
{
fseek(fp,offset1,SEEK_SET);
fprintf(fp,"%-10s%-20s%-50s\n","","","");
}
}
}
展开阅读全文