/用C语言编写具有数据插入、修改、删除、显示和查询功能的电话薄管理程序
1、数据包括:人名、工作单位、电话号码和E-mail地址。
2、可对记录中的姓名和电话号码进行修改。
3、可增加或删除记录。
4、可显示所有保存的记录。
5、可按人名或电话号码进行查询。
另:采用结构体数组和文件系统实现。结构体包括人名、工作单位、电话号码和E-mail
绝对原创,2010年7月12日晚刚写完测试通过的,纯C语言! /
#include <stdioh>
#include <stdlibh>
#include <stringh>
#define szSTR 64
#define fileDB "c:\\contacttxt"
struct CONTACT {
char name[szSTR];/姓名/
char unit[szSTR];/工作单位/
char tele[szSTR];/电话/
char mail[szSTR];/mail/
};
typedef struct CONTACT CON;
#define BNAME 1
#define BUNIT 2
#define BTELE 4
#define BMAIL 8
#define BFULL 0xFF
int OPER[5] = {BFULL, BNAME, BUNIT, BTELE, BMAIL};
void input(CON s, int mask)
{
if(mask & BNAME) { printf("请输入学生姓名:"); scanf("%s", s->name); }
if(mask & BUNIT) { printf("请输入工作单位:"); scanf("%s", s->unit); }
if(mask & BTELE) { printf("请输入联系电话:"); scanf("%s", s->tele); }
if(mask & BMAIL) { printf("请输入电子邮件:"); scanf("%s", s->mail); }
}/end input/
void show (int id, CON s)
{
if(!s) return ;
if(id)
printf("%d\t%s\t%s\t%s\t%s\n",
id, s->name , s->unit , s->tele , s->mail );
else
printf("姓名%s工作单位%s电话%s电邮%s\n",
s->name , s->unit , s->tele , s->mail );
/end if/
}/end show/
void regist(void)
{
CON s; FILE f = 0;
input(&s, BFULL);
f = fopen(fileDB, "ab");
fwrite(&s,sizeof(s),1,f);
fclose(f);
printf("资料已保存!\n");
}/end regist/
int browse(char key, fpos_t p, CON s)
{
FILE f =0; int i = 0, r = 0; CON t;
char a = 0, b = 0; fpos_t q;
if(!s) return 0;
f = fopen(fileDB, "rb");
if(!f) {
printf("数据库暂无记录\n");
return 0;
}/end if/
printf("编号\t姓名\t单位\t电话\t电邮\n");
printf("------------------------------------------------\n");
while(!feof(f)) {
fgetpos(f, &q);
r = fread(&t, sizeof(t), 1, f);
if(r<1)break;
if(tname[0]==0) continue;
if(key) {
a = strstr(tname , key);
b = strstr(ttele , key);
if(a == 0 && b == 0) continue;
}/end if/
if(p) p = q;
if(s) memcpy(s, &t, sizeof(t));
i++;
show(i, &t);
}/end while/
fclose(f);
printf("------------------------------------------------\n");
return i;
}/end browse/
fpos_t query(CON s)
{
char key[szSTR]=""; fpos_t p = 0; int r = 0;
printf("请输入姓名或者电话号码:");
scanf("%s", key);
r = browse(key, &p, s);
return rp:-1;
}/end query/
void clear(void)
{
FILE f = 0; CON s;
fpos_t p = query(&s);
if(p<0) return;
f = fopen(fileDB, "rb+");
fsetpos(f, &p);
memset(&s, 0, sizeof(s));
fwrite(&s, sizeof(s),1, f);
fclose(f);
printf("记录已删除!\n");
}/end clear/
void modify(void)
{
FILE f = 0; CON s; int cmd = 0;
fpos_t p = query(&s);
if(p<0) return;
f = fopen(fileDB, "rb+");
fsetpos(f, &p);
for(;;) {
show(0, &s);
printf("请选择:1-姓名;2-工作单位;3-电话;4-电邮;5-保存并退出;6-放弃修改并退出\n");
scanf("%d", &cmd);
switch(cmd) {
case 1:
case 2:
case 3:
case 4:
input(&s, OPER[cmd]);
break;
case 5:
fsetpos(f, &p);
fwrite(&s, sizeof(s), 1, f);
case 6:
fclose(f);
return;
default:
printf("错误的 *** 作,请重新输入。\n");
}/end case/
}/mext/
}/end clear/
int main(void)
{
int cmd = 0; CON s;
for(;;) {
printf("欢迎使用通信簿!请选择:1-添加;2-查询;3-删除;4-修改;5-全部输出;0-退出\n");
scanf("%d", &cmd);
switch(cmd) {
case 0: return 0;
case 1: regist(); break;
case 2: query(&s); break;
case 3: clear(); break;
case 4: modify(); break;
case 5: browse(0, 0, &s); break;
}//end case
}
return 0;
}
自己写的,看一下
// 头文件部分
//============================
#include <stdioh>
#include <windowsh>
#include <stdlibh>
#include <conioh>
// 初始化数据部分
int Menu();
void Start();
void Write();
void Read();
void Search();
void Detele();
void beauty();
void Rework();
void Lock();
int Judge();
//============================
struct Student{
char name[20];
char Tel[20];
char QQ[20];
int age;
}xy[100];
char wenjian[10000];
char Number[10];
char number=0;
int GOTO;
//
int main()
{
Start();
for(;;)
{
GOTO=Menu();
if(GOTO==1)
{
for(;;)
{
Write();
int judge=Judge();
if(judge==2)
{
break;
}
}
}
if(GOTO==2)
{
for(;;)
{
Read();
system("pause");
break;
}
}
if(GOTO==3)
{
for(;;)
{
Search();
int judge=Judge();
if(judge==2)
{
break;
}
}
}
if(GOTO==4)
{
for(;;)
{
Rework();
int judge=Judge();
if(judge==2)
{
break;
}
}
}
if(GOTO==5)
{
Detele();
break;
}
if(GOTO==6)
{
beauty();
break;
}
if(GOTO==7)
{
}
if(GOTO==8)
{
printf("");
break;
}
if(GOTO==9)
{
printf("\t\t\t退出系统\n\n");
return 0;
}
if(GOTO==0)
{
printf("");
break;
}
}
// beauty();
//
// Write();
// Read();
// Search();
// Rework();
// Detele();
return 0;
}
void Write()
{
printf("\t\t\t请输入好友名字\n");
scanf("%s",&xy[number]name);
printf("\t\t\t请输入好友电话号码\n");
scanf("%s",&xy[number]Tel);
printf("\t\t\t请输入好友QQ号码\n");
scanf("%s",&xy[number]QQ);
printf("\t\t\t请输入好友年龄\n");
scanf("%d",&xy[number]age);
FILE file;
if((file=fopen("Friendtxt","rt"))==NULL)
{
file=fopen("Friendtxt","wt");
fprintf(file,"%-20s%-20s%-20s%-20s","姓名","电话","QQ","年龄");
}
file=fopen("Friendtxt","at");
fprintf(file,"%-20s%-20s%-20s%-20d\n",xy[number]name,xy[number]Tel,xy[number]QQ,xy[number]age);
fclose(file);
number++;
Number[0]=number;
FILE Sta;
if((Sta=fopen("numbertxt","r"))=NULL)
{
Sta=fopen("numbertxt","wt");
exit(1);
}
Sta=fopen("numbertxt","wt");
fprintf(Sta,"%d",Number[0]);
fclose(Sta);
}
void Read()
{
printf("\t\t\t您通讯录中一共有%d位好友\n",Number[0]);
FILE read;
if((read=fopen("Friendtxt","r"))=NULL)
{
printf("\t\t\t您通讯中当前没有好友,请返回添加\n");
}
read=fopen("Friendtxt","rt");
printf("%-20s%-20s%-20s%-20s\n","姓名","电话 ","QQ","年龄");
for(int i=0;i<number;i++)
{
fscanf(read,"%s%s%s%d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,&xy[i]age);
printf("%-20s%-20s%-20s%-20d\n",xy[i]name,xy[i]Tel,xy[i]QQ,xy[i]age);
}
/ fread(wenjian,10000,1,read);
for(int i=0;i<number80+80;i++)
{
printf("%c",wenjian[i]);
}
printf("\n");
/
fclose(read);
}
void beauty()
{
int d;
do{
printf("choose");
scanf("%d",&d);
}while(d<1&&d>5);
if(d==1)
{
system("color 27");
printf("===1===");
}
if(d==2)
{
system("color 37");
printf("===2===");
}
if(d==3)
{
system("color 47");
printf("===3===");
}
if(d==4)
{
system("color 57");
printf("===4===");
}
if(d==5)
{
system("color 67");
printf("===5===");
}
}
void Start()
{
FILE Start;
if((Start=fopen("numbertxt","r"))==NULL)
{
Start=fopen("numbertxt","w");
number=0;
Number[0]=number;
fscanf(Start,"%d",&Number[0]);
printf("\t\t\t您的通讯录中还没有任何好友,赶快添加吧此次 *** 作需要重新运行程序。\n");
exit(1);
}
Start=fopen("numbertxt","r");
fscanf(Start,"%d",&Number[0]);
number=Number[0];
fclose(Start);
}
void Search()
{
int change=0;
char Searchname[20];
printf("\t\t\t输入要查找的好友的名字\n\n");
scanf("%s",&Searchname);
fflush(stdin);
printf("\t\t\t您要查找的好友是 %s \n\n",Searchname);
FILE Search;
Search=fopen("Friendtxt","rt");
for(int i=0;i<=number;i++)
{
fscanf(Search,"%s%s%s%d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,&xy[i]age);
if(strcmp(xy[i]name,Searchname)==0)
{
printf("\t\t\t下面是该好友的信息:\n\n");
printf("%-20s%-20s%-20s%-20s\n","姓名","电话 ","QQ","年龄");
printf("%-20s%-20s%-20s%-20d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,xy[i]age);
change=1;
}
fclose(Search);
}
if(change==0)
{
printf("\t\t\t您要查找的好友不存在,请返回菜单添加。\n");
}
}
void Rework()
{
char Rework[20];
printf("\t\t\t输入要修改的好友的名字\n\n");
scanf("%s",&Rework);
printf("\t\t\t您要修改 %s 的信息\n\n",Rework);
int Change=0;
FILE Search;
Search=fopen("Friendtxt","rt");
for(int i=0;i<=number;i++)
{
fscanf(Search,"%s%s%s%d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,&xy[i]age);
if(strcmp(xy[i]name,Rework)==0)
{
printf("\t\t\t下面是该好友的信息:\n\n");
printf("%-20s%-20s%-20s%-20s\n","姓名","电话 ","QQ","年龄");
Change=1;
int Choose;
printf("%-20s%-20s%-20s%-20d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,xy[i]age);
//---------------------------------------------------------------------
do
{
printf("\t\t\tchoose\t\t\t1-----3");
scanf("%d",&Choose);
}while(Choose>3||Choose<1);
if(Choose==1){
printf("\t\t\t请输入好友电话号码\n");
scanf("%s",&xy[i]Tel);
}
if(Choose==2)
{
printf("\t\t\t请输入好友QQ号码\n");
scanf("%s",&xy[i]QQ);
}
if(Choose==3)
{
printf("\t\t\t请输入好友年龄\n");
scanf("%d",&xy[i]age);
}
Search=fopen("Friendtxt","wt");
for(int sta=0;sta<i;sta++)
{
fprintf(Search,"%-20s%-20s%-20s%-20d\n",xy[sta]name,xy[sta]Tel,xy[sta]QQ,xy[sta]age);
}
if(sta==i)
{
fprintf(Search,"%-20s%-20s%-20s%-20d\n",xy[i]name,xy[i]Tel,xy[i]QQ,xy[i]age);
i++;
}
for(i;i<=number;i++)
{
fprintf(Search,"%-20s%-20s%-20s%-20d\n",xy[i]name,xy[i]Tel,xy[i]QQ,xy[i]age);
}
printf("\t\t\t修改后的信息为:\n\n");
Read();
}
fclose(Search);
}
if(Change==0)
{
printf("\t\t\t您要查找的好友不存在,请返回菜单添加。\n");
}
}
void Detele()
{
int change=0;
char delete_friend[20];
printf("\t\t\t输入要删除的好友的名字\n\n");
scanf("%s",&delete_friend);
fflush(stdin);
printf("\t\t\t您要删除的好友是 %s \n\n",delete_friend);
FILE DeleteF;
DeleteF=fopen("Friendtxt","rt");
for(int i=0;i<=number;i++)
{
fscanf(DeleteF,"%s%s%s%d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,&xy[i]age);
if(strcmp(xy[i]name,delete_friend)==0)
{
printf("\t\t\t下面是该好友的信息:\n\n");
printf("%-20s%-20s%-20s%-20s\n","姓名","电话 ","QQ","年龄");
printf("%-20s%-20s%-20s%-20d\n",&xy[i]name,&xy[i]Tel,&xy[i]QQ,xy[i]age);
change=1;
DeleteF=fopen("Friendtxt","wt");
for(int st=0;st<i;st++)
{
fprintf(DeleteF,"%-20s%-20s%-20s%-20d\n",xy[st]name,xy[st]Tel,xy[st]QQ,xy[st]age);
}
i++;
for(i;i<=number;i++)
{
printf("%-20s%-20s%-20s%-20d\n",xy[i]name,xy[i]Tel,xy[i]QQ,xy[i]age);
fprintf(DeleteF,"%-20s%-20s%-20s%-20d\n",xy[i]name,xy[i]Tel,xy[i]QQ,xy[i]age);
}
}
//--------------------------------------------------------------------------------
if(change==1)
{
printf("\t\t\t删除后的通讯录信息为:\n\n");
number--;
Number[0]=number;
FILE St;
if((St=fopen("numbertxt","r"))=NULL)
{
St=fopen("numbertxt","wt");
exit(1);
}
St=fopen("numbertxt","wt");
fprintf(St,"%d",Number[0]);
fclose(St);
fclose(DeleteF);
Start();
Read();
}
}
if(change==0)
{
printf("\t\t\t您要删除的好友不存在。\n");
}
}
void Lock()
{
}
int Menu()
{
printf("\t\t欢迎进入通讯管理界面\n\n");
printf("\t\t\t1添加我的好友\n");
printf("\t\t\t2显示所有好友\n");
printf("\t\t\t3查找我的好友\n");
printf("\t\t\t4修改好友信息\n");
printf("\t\t\t5删除我的好友\n");
printf("\t\t\t6设置背景颜色\n");
printf("\t\t\t7设置管理密码\n");
printf("\t\t\t8使用注意事项\n");
printf("\t\t\t9退出通讯系统\n");
printf("\t\t\t0作者想说的话\n");
printf("\t\t\n\n");
do{
printf("\t\t\t请输入你的选择:\n\n");
scanf("%d",&GOTO);
}while(GOTO>9||GOTO<1);
return GOTO;
}
int Judge()
{
char JUDGE;
do
{
printf("\t\t\t是否继续当前 *** 作\n\n Y(yes) / N(no)\n");
printf("\t\t\t输入你的选择\n");
JUDGE=getch();
if(JUDGE=='y'||JUDGE=='Y')
{
return 1;
}
if(JUDGE=='n'||JUDGE=='N')
{
return 2;
}
}while(JUDGE!='y'||JUDGE!='n');
}
这看你是怎样定义的了。如果你50个同学是用结构体来定义的话就比较容易实现。用二维数组的话,就比较麻烦。
查找名字可以用strcmp(输入的名字,编好的名字)==0如果相等,就等于查找到你输入的名字了。记录它的下标,再输出它的****。
下面是一个比较完整的通讯录代码,你参考一下啦。(看到专家两个字,我真没资格去回答你了,汗)
/1032源程序/
/头文件(h)/
#include "stdioh" /I/O函数/
#include "stdlibh" /标准库函数/
#include "stringh"/字符串函数/
#include "ctypeh" /字符 *** 作函数/
#define M 50 /定义常数表示记录数/
typedef struct /定义数据结构/
{
char name[20]; /姓名/
char units[30]; /单位/
char tele[10]; /电话/
}ADDRESS;
/以下是函数原型/
int enter(ADDRESS t[]); /输入记录/
void list(ADDRESS t[],int n); /显示记录/
void search(ADDRESS t[],int n); /按姓名查找显示记录/
int delete(ADDRESS t[],int n); /删除记录/
int add(ADDRESS t[],int n); /插入记录/
void save(ADDRESS t[],int n); /记录保存为文件/
int load(ADDRESS t[]); /从文件中读记录/
void display(ADDRESS t[]); /按序号查找显示记录/
void sort(ADDRESS t[],int n); /按姓名排序/
void qseek(ADDRESS t[],int n); /快速查找记录/
void copy(); /文件复制/
void print(ADDRESS temp); /显示单条记录/
int find(ADDRESS t[],int n,char s) ; /查找函数/
int menu_select(); /主菜单函数/
/主函数开始/
main()
{
int i;
ADDRESS adr[M]; /定义结构体数组/
int length; /保存记录长度/
clrscr(); /清屏/
for(;;)/无限循环/
{
switch(menu_select()) /调用主菜单函数,返回值整数作开关语句的条件/
{
case 0:length=enter(adr);break;/输入记录/
case 1:list(adr,length);break; /显示全部记录/
case 2:search(adr,length);break; /查找记录/
case 3:length=delete(adr,length);break; /删除记录/
case 4:length=add(adr,length); break; /插入记录/
case 5:save(adr,length);break; /保存文件/
case 6:length=load(adr); break; /读文件/
case 7:display(adr);break; /按序号显示记录/
case 8:sort(adr,length);break; /按姓名排序/
case 9:qseek(adr,length);break; /快速查找记录/
case 10:copy();break; /复制文件/
case 11:exit(0); /如返回值为11则程序结束/
}
}
}
/菜单函数,函数返回值为整数,代表所选的菜单项/
menu_select()
{
char s[80];
int c;
gotoxy(1,25);/将光标定为在第25行,第1列/
printf("press any key enter menu\n");/提示压任意键继续/
getch(); /读入任意字符/
clrscr(); /清屏/
gotoxy(1,1);
printf("MENU\n\n");
printf(" 0 Enter record\n");
printf(" 1 List the file\n");
printf(" 2 Search record on name\n");
printf(" 3 Delete a record\n");
printf(" 4 add record \n");
printf(" 5 Save the file\n");
printf(" 6 Load the file\n");
printf(" 7 display record on order\n");
printf(" 8 sort to make new file\n");
printf(" 9 Quick seek record\n");
printf(" 10 copy the file to new file\n");
printf(" 11 Quit\n");
printf("\n");
do{
printf("\n Enter you choice(0~11):"); /提示输入选项/
scanf("%s",s); /输入选择项/
c=atoi(s); /将输入的字符串转化为整型数/
}while(c<0||c>11); /选择项不在0~11之间重输/
return c; /返回选择项,主程序根据该数调用相应的函数/
}
/输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度/
int enter(ADDRESS t[])
{
int i,n;
char s;
clrscr(); /清屏/
printf("\nplease input num \n"); /提示信息/
scanf("%d",&n); /输入记录数/
printf("please input record \n"); /提示输入记录/
printf("name unit telephone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
{
scanf("%s%s%s",t[i]name,t[i]units,t[i]tele); /输入记录/
printf("----------------------------------------------\n");
}
return n; /返回记录条数/
}
/显示记录,参数为记录数组和记录条数/
void list(ADDRESS t[],int n)
{
int i;
clrscr();
printf("\n\nADDRESS\n");
printf("name unit telephone\n");
printf("------------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-20s%-30s%-10s\n",t[i]name,t[i]units,t[i]tele);
if((i+1)%10==0) /判断输出是否达到10条记录/
{
printf("Press any key continue\n"); /提示信息/
getch(); /压任意键继续/
}
printf("end\n");
}
/查找记录/
void search(ADDRESS t[],int n)
{
char s[20]; /保存待查找姓名字符串/
int i; /保存查找到结点的序号/
clrscr(); /清屏/
printf("please search name\n");
scanf("%s",s); /输入待查找姓名/
i=find(t,n,s); /调用find函数,得到一个整数/
if(i>n-1) /如果整数i值大于n-1,说明没找到/
printf("not found\n");
else
print(t[i]); /找到,调用显示函数显示记录/
}
/显示指定的一条记录/
void print(ADDRESS temp)
{
clrscr();
printf("\n\n\n");
printf("name unit telephone\n");
printf("------------------------------------------------\n");
printf("%-20s%-30s%-10s\n",tempname,tempunits,temptele);
printf("end\n");
}
/查找函数,参数为记录数组和记录条数以及姓名s /
int find(ADDRESS t[],int n,char s)
{
int i;
for(i=0;i<n;i++)/从第一条记录开始,直到最后一条/
{
if(strcmp(s,t[i]name)==0) /记录中的姓名和待比较的姓名是否相等/
return i; /相等,则返回该记录的下标号,程序提前结结束/
}
return i; /返回i值/
}
/删除函数,参数为记录数组和记录条数/
int delete(ADDRESS t[],int n)
{
char s[20]; /要删除记录的姓名/
int ch=0;
int i,j;
printf("please deleted name\n"); /提示信息/
scanf("%s",s);/输入姓名/
i=find(t,n,s); /调用find函数/
if(i>n-1) /如果i>n-1超过了数组的长度/
printf("no found not deleted\n"); /显示没找到要删除的记录/
else
{
print(t[i]); /调用输出函数显示该条记录信息/
printf("Are you sure delete it(1/0)\n"); /确认是否要删除/
scanf("%d",&ch); /输入一个整数0或1/
if(ch==1) /如果确认删除整数为1/
{
for(j=i+1;j<n;j++) /删除该记录,实际后续记录前移/
{
strcpy(t[j-1]name,t[j]name); /将后一条记录的姓名拷贝到前一条/
strcpy(t[j-1]units,t[j]units); /将后一条记录的单位拷贝到前一条/
strcpy(t[j-1]tele,t[j]tele); /将后一条记录的电话拷贝到前一条/
}
n--; /记录数减1/
}
}
return n; /返回记录数/
}
/插入记录函数,参数为结构体数组和记录数/
int add(ADDRESS t[],int n)/插入函数,参数为结构体数组和记录数/
{
ADDRESS temp; /新插入记录信息/
int i,j;
char s[20]; /确定插入在哪个记录之前/
printf("please input record\n");
printf("\n");
printf("name unit telephone\n");
printf("--------------------------------------------------\n");
scanf("%s%s%s",tempname,tempunits,temptele); /输入插入信息/
printf("------------------------------------------------\n");
printf("please input locate name \n");
scanf("%s",s); /输入插入位置的姓名/
i=find(t,n,s); /调用find,确定插入位置/
for(j=n-1;j>=i;j--) /从最后一个结点开始向后移动一条/
{
strcpy(t[j+1]name,t[j]name); /当前记录的姓名拷贝到后一条/
strcpy(t[j+1]units,t[j]units); /当前记录的单位拷贝到后一条/
strcpy(t[j+1]tele,t[j]tele); /当前记录的电话拷贝到后一条/
}
strcpy(t[i]name,tempname); /将新插入记录的姓名拷贝到第i个位置/
strcpy(t[i]units,tempunits); /将新插入记录的单位拷贝到第i个位置/
strcpy(t[i]tele,temptele); /将新插入记录的电话拷贝到第i个位置/
n++; /记录数加1/
return n; /返回记录数/
}
/保存函数,参数为结构体数组和记录数/
void save(ADDRESS t[],int n)
{
int i;
FILE fp; /指向文件的指针/
if((fp=fopen("recordtxt","wb"))==NULL) /打开文件,并判断打开是否正常/
{
printf("can not open file\n");/没打开/
exit(1); /退出/
}
printf("\nSaving file\n"); /输出提示信息/
fprintf(fp,"%d",n); /将记录数写入文件/
fprintf(fp,"\r\n"); /将换行符号写入文件/
for(i=0;i<n;i++)
{
fprintf(fp,"%-20s%-30s%-10s",t[i]name,t[i]units,t[i]tele);/格式写入记录/
fprintf(fp,"\r\n"); /将换行符号写入文件/
}
fclose(fp);/关闭文件/
printf("save success\n"); /显示保存成功/
}
/读入函数,参数为结构体数组/
int load(ADDRESS t[])
{
int i,n;
FILE fp; /指向文件的指针/
if((fp=fopen("recordtxt","rb"))==NULL)/打开文件/
{
printf("can not open file\n"); /不能打开/
exit(1); /退出/
}
fscanf(fp,"%d",&n); /读入记录数/
for(i=0;i<n;i++)
fscanf(fp,"%20s%30s%10s",t[i]name,t[i]units,t[i]tele); /按格式读入记录/
fclose(fp); /关闭文件/
printf("You have success read data from file!!!\n"); /显示保存成功/
return n; /返回记录数/
}
/按序号显示记录函数/
void display(ADDRESS t[])
{
int id,n;
FILE fp; /指向文件的指针/
if((fp=fopen("recordtxt","rb"))==NULL) /打开文件/
{
printf("can not open file\n"); /不能打开文件/
exit(1); /退出/
}
printf("Enter order number\n"); /显示信息/
scanf("%d",&id); /输入序号/
fscanf(fp,"%d",&n); /从文件读入记录数/
if(id>=0&&id<n) /判断序号是否在记录范围内/
{
fseek(fp,(id-1)sizeof(ADDRESS),1); /移动文件指针到该记录位置/
print(t[id]); /调用输出函数显示该记录/
printf("\r\n");
}
else
printf("no %d number record!!!\n ",id); /如果序号不合理显示信息/
fclose(fp); /关闭文件/
}
/排序函数,参数为结构体数组和记录数/
void sort(ADDRESS t[],int n)
{
int i,j,flag;
ADDRESS temp; /临时变量做交换数据用/
for(i=0;i<n;i++)
{
flag=0; /设标志判断是否发生过交换/
for(j=0;j<n-1;j++)
if((strcmp(t[j]name,t[j+1]name))>0) /比较大小/
{
flag=1;
strcpy(tempname,t[j]name); /交换记录/
strcpy(tempunits,t[j]units);
strcpy(temptele,t[j]tele);
strcpy(t[j]name,t[j+1]name);
strcpy(t[j]units,t[j+1]units);
strcpy(t[j]tele,t[j+1]tele);
strcpy(t[j+1]name,tempname);
strcpy(t[j+1]units,tempunits);
strcpy(t[j+1]tele,temptele);
}
if(flag==0)break; /如果标志为0,说明没有发生过交换循环结束/
}
printf("sort sucess!!!\n"); /显示排序成功/
}
/快速查找,参数为结构体数组和记录数/
void qseek(ADDRESS t[],int n)
{
char s[20];
int l,r,m;
printf("\nPlease sort before qseek!\n"); /提示确认在查找之前,记录是否已排序/
printf("please enter name for qseek\n"); /提示输入/
scanf("%s",s); /输入待查找的姓名/
l=0;r=n-1; /设置左边界与右边界的初值/
while(l<=r) /当左边界<=右边界时/
{
m=(l+r)/2; /计算中间位置/
if(strcmp(t[m]name,s)==0) /与中间结点姓名字段做比较判是否相等/
{
print(t[m]); /如果相等,则调用print函数显示记录信息/
return ; /返回/
}
if(strcmp(t[m]name,s)<0) /如果中间结点小/
l=m+1; /修改左边界/
else
r=m-1; /否则,中间结点大,修改右边界/
}
if(l>r) /如果左边界大于右边界时/
printf("not found\n"); /显示没找到/
}
/复制文件/
void copy()
{
char outfile[20]; /目标文件名/
int i,n;
ADDRESS temp[M]; /定义临时变量/
FILE sfp,tfp; /定义指向文件的指针/
clrscr();/清屏/
if((sfp=fopen("recordtxt","rb"))==NULL) /打开记录文件/
{
printf("can not open file\n"); /显示不能打开文件信息/
exit(1); /退出/
}
printf("Enter outfile name,for example c:\\f1\\tetxt:\n"); /提示信息/
scanf("%s",outfile); /输入目标文件名/
if((tfp=fopen(outfile,"wb"))==NULL) /打开目标文件/
{
printf("can not open file\n"); /显示不能打开文件信息/
exit(1); /退出/
}
fscanf(sfp,"%d",&n); /读出文件记录数/
fprintf(tfp,"%d",n);/写入目标文件数/
fprintf(tfp,"\r\n"); /写入换行符/
for(i=0;i<n;i++)
{
fscanf(sfp,"%20s%30s%10s\n",temp[i]name,temp[i]units,
temp[i]tele); /读入记录/
fprintf(tfp,"%-20s%-30s%-10s\n",temp[i]name,
temp[i]units,temp[i]tele); /写入记录/
fprintf(tfp,"\r\n"); /写入换行符/
}
fclose(sfp); /关闭源文件/
fclose(tfp); /关闭目标文件/
printf("you have success copy file!!!\n"); /显示复制成功/
}
好好参考一下啦,可能有些函数你还没学到,找找书就行了。
;
#include <string>
#include "addressh"
#include "addressListh"
#include "addressBookh"
using namespace std;
int main()
{
new AddressBook; //开启通信录
return 0;
}
ostream& operator<<(ostream& os, const RecordList& c_rl)
{
RecordList::const_iterator it;
RecordList::const_iterator it_end =c_rlend();
for (it=c_rlbegin();it!=it_end; it++)
{
os << (it)->name << '\n' << (it)->tel << '\n';
}
return os;
}
istream& operator>> (istream& is, RecordList& rl)
{
Record rec;
string name;
while (true)
{
//注意这里使用的是全局的getline()函数,而不是istream的成员函
//数全局的getling()函数将从istream中取出最后一个分隔符,
//而istream的成员函数getline则不会
getline(is,name);
if (name =="")
break;
rec = new Record;
rec->name=name;
getline(is,rec->tel );
rlpush_back(rec);
}
return is;
}
#include<stdlibh>
#include<fstream>
#include "addressBookh"
using namespace std;
AddressBook::AddressBook()
{
isModified = false;
start();
}
AddressBook::~AddressBook()
{
}
//功能:显示欢迎画面,并开始进行用户交互处理
void AddressBook::start()
{
cout<<"\n"
<<"\t\n"
<<"\t 这是一个 \n"
<<"\t 简单的通信录程序 \n"
<<"\t 可以对通信录进行简单管理 \n"
<<"\t 欢迎使用通信录 \n"
<<"\t\n"
<<"\n";
handleMenu();
}
//功能:显示通信录菜单,返回用户选择的选项
//返回:用户选择的选项,是1-9之间的一个字符
char AddressBook::menuSelect()
{
cout<<"\n"
<<"1显示记录\n"
<<"2查询记录\n"
<<"3增加记录\n"
<<"4删除记录\n"
<<"5保存记录\n"
<<"6读取记录\n"
<<"7新建记录\n"
<<"8结束运行\n"
<<"\n左边数字对应功能选择,请选1-8:";
char choice[2];
while(true)
{
cingetline(choice,2);
if(choice[0]<'1' || choice[0]>'8')
cout<<"\n输入错误,重选1-8:";
else
break;
}
return choice[0];
}
//功能:根据用户选择的项目调用相应的处理函数
void AddressBook::handleMenu()
{
while(true)
{
switch(menuSelect())
{
case '1':
displayRecords();
break;
case '2':
queryRecord();
break;
//功能:打印用于显示记录信息时的表头
void AddressBook::dispTable()
{
}
//功能:显示通信录中的所有记录
void AddressBook::displayRecords()
{
}
//功能:首先检查通信录是否已保存,然后清空当前通信录中所有记录
//注意:该函数覆盖了基类中的函数
void AddressBook::clear()
{
}
//功能:查询指定记录
void AddressBook::queryRecord()
{
//功能:向当前通信录追加新的记录
//注意:该函数重载了基类中的函数
void AddressBook::addRecord()
{
}
/
//说明:如果使用string 类,效果更好。下面是实现本功能的程序代码:
while(true)
{
//输入新记录
string name;
cout<<"姓名:";
getline(cin,name);
//如果输入的姓名为“0”,则结束添加记录的 *** 作
if(name=="0")
break;
Record rec=new Record;
rec->name=name;
cout<<"电话:";
getline(cin,rec->tel);
//将新记录加入链表
AddressList::addRecord(rec);
}
//同理,下面的成员函数removeRecord()中的判断,可以使用如下替代方法:
string str;
getline(cin,str);
while(true)
{
if(str[0]!='1' && str[0]!='2')
{
cout<<"输入错误,重选1-2:";
getline(cin,str);
}
else
break;
}
/
//功能:从当前通信录移除指定的记录
//注意:该函数重载了基类中的函数
void AddressBook::removeRecord()
{
if(empty())
{
cout<<"通信录已空,退出删除 *** 作!"<<endl;
return;
}
//选择获取需要删除的记录的方式
cout<<"可以通过姓名或电话删除记录\n"
<<"1通过姓名\n"
<<"2通过电话\n";
char choice[2];
cingetline(choice,2);
while(true)
{
if(choice[0]!='1' && choice[0]!='2')
{
cout<<"输入错误,重选1-2:";
cingetline(choice,2);
}
else
break;
}
int type=static_cast<int>(choice[0])-48;
//输入需要匹配的字符串
if(type==1)
cout<<"请输入姓名:"<<flush;
else
cout<<"请输入电话:"<<flush;
char pattern[20];
cingetline(pattern,20);
int deletedCount=0;
//找到匹配的记录
Iterator it=findRecord(pattern,type,first());
Iterator it_end=pastEnd();
while(it!=it_end)
{
cout<<"找到一条匹配的记录:\n";
dispTable();
cout<<(it)->name<<"\t\t"<<(it)->tel<<"\n";
cout<<"确定要删除这条记录吗?[Y/N]";
cingetline(choice,2);
//删除这条记录
if(choice[0]!='n' && choice[0]!='N')
{
it=AddressList::removeRecord(it);
deletedCount++;
}
//取下一条匹配的记录
if(it!=it_end)
it=findRecord(pattern,type,++it);
}
cout<<"一共删除了"<<deletedCount<<"条记录\n"
<<"现在还有"<<size()<<"条记录"<<endl;
if(deletedCount!=0)
isModified=false;
}
//功能:将通信录保存至指定文件
//注意:该函数重载了基类中的函数
void AddressBook::saveRecords()
{
if(empty())
{
cout<<"没有记录可存!"<<endl;
return;
}
//因为下面的程序中使用string类的成员函数,所以需要进行一次转换
string fname;
char name[16];
cout<<"请输入要存在的文件名(直接回车选择文件sname):";
cingetline(name,16);
fname=name;
if(fnameempty())
fname="sname";
ofstream of(fnamec_str(),ios_base::out);
if(!of)
{
cout<<"不能存入文件!"<<endl;
return;
}
AddressList::saveRecords(of);
ofclose();
cout<<size()<<"条记录已经存入文件,请继续 *** 作。"<<endl;
isModified=false;
}
//功能:从指定文件读取记录追加到当前通信录末尾
//注意:该函数重载了基类中的函数
void AddressBook::loadRecords()
{
}
void AddressBook::quit()
{
}
#ifndef H_ADDRESSBOOK_H_NNN
#define H_ADDRESSBOOK_H_NNN
#include "addressListh"
//处理通信录 *** 作的面向用户使用的类,包含所有功能的用户界面及用户交互的实现
class AddressBook :public AddressList
{
protected:
bool isModified; //通信录是否已被修改还未保存
public:
AddressBook();
virtual ~AddressBook();
//开始通信录的用户界面 *** 作
virtual void start();
//菜单处理函数
virtual void handleMenu();
//显示记录
virtual void displayRecords();
//查询记录
virtual void queryRecord();
//增加记录
virtual void addRecord();
//删除记录
virtual void removeRecord();
//保存记录
virtual void saveRecords();
//读取记录
virtual void loadRecords();
//结束程序
virtual void quit();
//清空当前通信录
virtual void clear();
protected:
//菜单选择函数
char menuSelect();
//显示表头
void dispTable();
};
#endif //H_ADDRESSBOOK_HZ-NNN
#include "addressListh"
AddressList::~AddressList()
{
recListclear();
}
//功能:向通信录中添加新的记录
//参数:rec,指向新记录的指针
void AddressList::addRecord (Record rec)
{
if (rec !=NULL)
{
recListpush_back(rec);
}
}
//功能:从通讯录中删除一个记录
//参数:it,指向欲删除记录的迭代器
//注意:it,应是可提领的迭代器,可以通过findRecord()获得
AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it)
{
return recListerase(it);
}
//功能:从通信录中寻找一个记录
//参数:pattern,欲寻找的记录的指定域与pattern相等
// type,为1表示欲寻找记录的名称(name)与pattern相等;
// 为2表示欲寻找记录的电弧(tel)与(pattern)相等。
// from,从from开始寻找匹配的记录。
//返回:若找到了则返回的迭代器指向第一个匹配记录的迭代器,
// 若找不到则返回的迭代器等于pastEnd()的返回值。
//注意:from应是可提领的迭代器。
// 第一次调用可以用first(),之后使用上一次findRecord()的返回值增1,
// 直到返回pastEnd(),便可以获得所有匹配的记录。
AddressList::Iterator AddressList::findRecord(string pattern,int type,AddressList::Iterator from)
{
Iterator it;
Iterator it_end=recListend();
for (it=from; it!=it_end; it++)
{
if ((type==1 && (it)->name==pattern)||(type==2 && (it)->tel==pattern))
break;
}
return it;
}
//功能:将通信录保存到输出流中
//参数:os指定的输出流
void AddressList::saveRecords(ostream &os)
{
os << recList;
}
//功能:从输入流中读入数据并追加到当前通信录的末尾
//参数:is,指定的输入流
//返回:读入的记录数
int AddressList::loadRecords(istream &is)
{
int ori =size();
is >> recList;
return size()-ori;
}
#ifndef H_ADDRESSLIST_H_AAA
#define H_ADDRESSLIST_H_AAA
#include <iostream>
#include <string>
#include "addressh"
using namespace std;
//处理通信录 *** 作的底层类,包括增加记录、删
//除记录、查询记录以及保存和读取记录的函数,
//该类不涉及任何关于用户界面的 *** 作
class AddressList
{
protected:
RecordList recList;// 使用对象成员作为数据成员
public:
typedef RecordList::iterator Iterator;
//向通信录中添加新的记录
virtual void addRecord(Record rec);
//从通信录中删除一个记录
virtual Iterator removeRecord(Iterator it);
//从通讯录中寻找一个记录
virtual Iterator findRecord(string pattern,int type,Iterator from);
//将通信录保存到输出流中
virtual void saveRecords(ostream& os);
//从输入流中读入数据并追加到当前通信录的末尾
virtual int loadRecords(istream& is);
virtual ~AddressList();
//获得通信录中存储的记录数
const int size() const
//通信录是否为空
const bool empty() const
//清除通信录
virtual void clear()
//获得通信录的第一条记录
Iterator first()
//获得通信录超过最后一个记录之后的迭代器
Iterator pastEnd()
};
#endif //H_ADDRESSLIST_H_AAA
简单通讯录管理程序,代码如下:#include
<stdioh>
#include
<stringh>
#include
<stdlibh>
typedef
struct
student
ST;
struct
student
{
char
stN[20];
char
stVal[128];
char
stNo[10];
char
stTel[12];
ST
next;
};
ST
head
=
NULL;
int
ShowNode()
{
char
no[20]
=
{0};
ST
t;
printf("输入姓名:");
scanf("%s",
no);
for
(t
=
head;
t;
t
=
t->next)
{
if
(!memcmp(t->stN,
no,
strlen(no)))
{
printf("姓名:%s,
地址:%s
邮编:%s
电话:%s\n",
t->stN,
t->stVal,
t->stNo,
t->stTel);
return
0;
}
}
printf("无此人信息\n");
return
0;
}
int
ChangeNode()
{
char
no[20];
ST
t;
printf("输入姓名:");
scanf("%s",
no);
for
(t
=
head;
t;
t
=
t->next)
{
if
(!memcmp(t->stN,
no,
strlen(no)))
{
printf("输入新的记录:\n");
printf("地址:");
scanf("%s",
t->stVal);
printf("邮编:");
scanf("%s",
t->stNo);
printf("英语成绩:");
scanf("%s",
t->stTel);
return
0;
}
}
printf("无此人信息\n");
return
0;
}
int
InsertNode()
{
ST
t;
t
=
(ST)malloc(sizeof
t);
printf("输入姓名:");
scanf("%s",
t->stN);
printf("输入地址:");
scanf("%s",
t->stVal);
printf("输入邮编:");
scanf("%s",
t->stNo);
printf("输入电话:");
scanf("%s",
t->stTel);
t->next
=
head;
head
=
t;
return
0;
}
int
DelNode()
{
ST
x,
y;
char
no[20]
=
{0};
printf("输入姓名:");
scanf("%s",
no);
for
(x
=
y
=
head;
x;
y
=
x,
x
=
x->next)
{
if
(!memcmp(x->stN,
no,
strlen(no)))
{
if
(x
==y)
{
x
=
head
=
head->next;
y->next
=
NULL;
free(y);
return
0;
}
else
{
y->next
=
x->next;
x->next
=
NULL;
free(x);
return
0;
}
}
}
printf("无此学生\n");
return
0;
}
int
main(void)
{
int
i;
while(1)
{
printf("查询记录:1\n"
"更改记录:2\n"
"插入记录:3\n"
"删除记录:4\n"
"退出:5\n");
scanf("%d",
&i);
if
(1==i)
{
ShowNode();
}
else
if(2==i)
{
ChangeNode();
}
else
if(3==i)
{
InsertNode();
}
else
if(4==i)
{
DelNode();
}
else
if(5==i)
{
break;
}
else
{
printf("输入错误!请重新输入!\n");
continue;
}
}
return
0;
}
#include<stdioh>
#include<stdlibh>
#define MAX 100
struct addr{
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
}addr_list[MAX];
void init_list(void);
int menu_select(void);
void enter(void);
int find_free(void);
void deleted(void);
void list(void);
int main(void){
char choice;
init_list(); / initialize the structure array /
for(;;){
choice=menu_select();
switch(choice){
case 1:
enter();
break;
case 2:
deleted();
break;
case 3:
list();
break;
case 4:
exit(0);
}
}
return 0;
}
/ initialize the list/
void init_list(void){
register int t;
for(t=0;t<MAX;++t)
addr_list[t]name[0]='\0';
}
/ Get a menu selection/
int menu_select(void){
int c;
printf("1Enter a name\n");
printf("2deleted a name\n");
printf("3List the file\n");
printf("4Quit\n");
do{
printf("\nEnter your choice:");
scanf("%d",&c);
}while(c<0||c>4);
return c;
}
/ Input address into the list/
void enter(void){
int slot;
char s[80];
slot=find_free();
if(slot==-1){
printf("\nList Full");
return;
}
printf("Enter name: ");
gets(addr_list[slot]name);
printf("Enter street: ");
gets(addr_list[slot]street);
printf("Enter city: ");
gets(addr_list[slot]city);
printf("Enter state: ");
gets(addr_list[slot]state);
printf("Enter zip: ");
gets(s);
addr_list[slot]zip=strtoul(s,'\0',10);
}
/ Find an unused structure/
int find_free(void){
register int t;
for(t=0;addr_list[t]name[0]&&t<MAX;++t);
if(t==MAX)
return -1;
return t;
}
/ deleted an address/
void deleted(void){
register int slot;
char s[80];
printf("Enter record #: ");
gets(s);
slot=atoi(s);
if(slot>=0&&slot<MAX)
addr_list[slot]name[0]='\0';
}
/ Display the list on the screen/
void list(void){
register int t;
for(t=0;t<MAX;++t){
if(addr_list[t]name[0]){
printf("%s\n",addr_list[t]name);
printf("%s\n",addr_list[t]street);
printf("%s\n",addr_list[t]city);
printf("%s\n",addr_list[t]state);
printf("%lu\n",addr_list[t]zip);
}
}
printf("\n\n");
}
我以前写的一个。。你参考参考吧
以上就是关于C语言程序设计,通讯录管理系统全部的内容,包括:C语言程序设计,通讯录管理系统、用c语言编写通讯录、用C语言制作通讯录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)