C语言程序设计,通讯录管理系统

C语言程序设计,通讯录管理系统,第1张

/用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语言制作通讯录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9479177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存