| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 886 人关注过本帖, 1 人收藏
标题:[求助]电子通讯录的问题
只看楼主 加入收藏
linda1214
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-6-4
收藏(1)
 问题点数:0 回复次数:1 
[求助]电子通讯录的问题

#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "stdio.h"
#include "dos.h"
FILE *fp;
int i; //i是全局变量 可代替length
struct address
{ char postnum[10];
char a[40]; //家庭地址
};
struct birthday
{ int year;
int month;
int day;
};
struct ffriend
{ int num; //序号
char name[20];
char sex;
char telephone[13];
struct birthday birthday;
struct address address;

}
friends[50];

void Load()
{
int j;
long k;
fp=fopen("friend.txt","a+"); //打开文件friend.txt
if(fp!=NULL)
{
for(i=1;i<50;i++)

{
j=fgetc(fp);
if(j==EOF) //判断是否到了文件尾
return;
k=i-1;
fseek(fp,k*sizeof(struct ffriend),SEEK_SET);
fread(&friends[i],sizeof(struct ffriend),1,fp); //从文件中读取一条记录
}

}
else
{
fp=fopen("friend.txt","w");
i=1;
}

}
void Show(int j)
{
// friends[j].num=i;
printf("\n\n\t编号-Nnumber: %3d",friends[j].num);
printf("\n\t姓名-Name:%-20s",friends[j].name);
printf("\n\t性别-Sex:%c",friends[j].sex);
printf("\n\t联系电话-Telephone:%-13s",friends[j].telephone);
printf("\n\t出生日期-Birthday:%4d-%2d-%3d",friends[j].birthday.year,friends[j].birthday.month,friends[j].birthday.day);
printf("\n\t邮编-Postnum:%-10s",friends[j].address.postnum);
printf("\n\t通信地址-address:%-40s",friends[j].address.a);
}
void Append(int j)
{
fflush(stdin); //区内清除文件缓冲区,文件以写方式打开时将缓冲容写入文件
//stdin是一个标准FILE*(文件型指针)指向通常是用键盘的输入的输入流
friends[j].num=j;
printf("\n\t\t\t序号-Number:%d",j);
printf("\n\t\t\t姓名-Name:");
scanf("%s",friends[j].name);
fflush(stdin); //为什么没有fflush(stdin); 的效果会自动跳过呢?
printf("\t\t\t性别-Sex(m/w):"); //为什么输入汉字男女也会自动跳过联系电话呢
scanf("%c",&friends[j].sex);
printf("\t\t\t联系电话-telephone:");
scanf("%s",friends[j].telephone);
printf("\t出生日期-birthday");
printf("\n\t\t\t年份-year:");
scanf("%d",&friends[j].birthday.year);
printf("\t\t\t月份-month:");
scanf("%d",&friends[j].birthday.month);
printf("\t\t\t日-day:");
scanf("%d",&friends[j].birthday.day);
printf("\t\t\t邮编-Postnumber:");
scanf("%s",friends[j].address.postnum);
printf("\t\t\t通信地址-Address:");
scanf("%s",friends[j].address.a);
getchar();
}
void Delete()
{
int k;
printf("\n\tDelete 序号-Number:");
scanf("%d",&k);
if(k<=i)
{
for(int j=k;j<i+1;j++) /*插入位置后的元素顺序后移*/
{
strcpy(friends[j].name,friends[j+1].name); /*交换元素内容*/
friends[j].sex=friends[j+1].sex;
strcpy(friends[j].telephone,friends[j+1].telephone);
friends[j].birthday.year=friends[j+1].birthday.year;
friends[j].birthday.month=friends[j+1].birthday.month;
friends[j].birthday.day=friends[j+1].birthday.day;
strcpy(friends[j].address.postnum,friends[j+1].address.postnum);
strcpy(friends[j].address.a,friends[j+1].address.a);

}
i--;
}
else
{
printf("输入的序号太大!");
}
}
void Modify(int j)
{
Append(j);
}
void Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{
fwrite(&friends[j],sizeof(struct ffriend),1,fp);
}
fclose(fp);

}

void main()
{
int j;
char grade;
char searchname[10];
Load();
i--;
do
{
printf("\t\t\t\t简易通讯录\n\n");
printf("功能选择(Function choose)\n");
printf("\1A.读取(Read)\n");
printf("\2B.增添(Append)\n");
printf("\6C.插入(Insert)\n");
printf("\5D.删除(Delete)\n");
printf("\5E.查询(Search)\n");
printf("\6F.修改(Modify)\n");
printf("\2G.保存(Save)\n");
printf("\1H.退出(Quit)\n");
printf("请选择(Choice)\n注:输入A~H的大写字母\n");
scanf("%c",&grade);
switch(grade)
//加个大写和小写 都可以啊
{
case 'A': j=1; //显示功能
while(getchar()!=0x1b&&j<=i) //增添按Esc键退出
{
Show(j++);
printf("\n请按回车键继续!");
}
if(j-1<1)
{
printf("\n\t空文档,无任何记录-Empty Note\n");
printf("\n请按回车键继续!");
getchar();

}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'B': //增加功能
while(i<=50) //增加按ESC键退出的功能
{
i++;
Append(i);
printf("\t是否继续增加?y/n");
//修改 加上else if 其他就跳出或强制打印出出错
char a=getchar();
if(a=='n'||a=='N')
break;
}
if(i==51)
printf("\n\t文档已满,无法增加记录-note full");
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'C':
int k;
printf("\n\t输入要插入的位置:");
scanf("%d",&k);
j=i+1;
friends[j].num=j;
for(j;j>k;j--) //插入功能
{
strcpy(friends[j].name,friends[j-1].name); //数据后移
friends[j].sex=friends[j-1].sex;
strcpy(friends[j].telephone,friends[j-1].telephone);
friends[j].birthday.year=friends[j-1].birthday.year;
friends[j].birthday.month=friends[j-1].birthday.month;
friends[j].birthday.day=friends[j-1].birthday.day;
strcpy(friends[j].address.postnum,friends[j-1].address.postnum);
strcpy(friends[j].address.a,friends[j-1].address.a);

}
Append(k);
i++;
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'D': //删除功能 //增添随意删除多条记录的功能
Delete();
if(i<1)
printf("\n没有记录-No records\n");
printf("\n请按回车键继续!");
getchar();
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'E': //查询功能
printf("\n\t请输入要查询记录的相关姓名:"); //增添查询按列号的
scanf("%s",searchname);
for(j=1;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0) //比较字符串
{
Show(j);
break;
}
}
if(i<1)
{
printf("\n 没有您所查询的记录-No records");
printf("\n 请按回车键继续!");
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'F': //修改功能 / /增添按序列号查询
printf("\n\t请输入要修改记录的相关姓名:");
gets(searchname);
scanf("%s",searchname);
for(j=1;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0) //比较字符串
{
Modify(j);
// getchar(); //加个输出确定修改吗
}
}
if(i<1) //修改功能
{ printf("\n 没有您所要修改的记录-No records");
printf("\n 请按回车键继续!");
getchar();
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'G':
Save(); //存盘功能
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;

case 'H': //退出功能
char x;
printf("是否保存?yes/no\n");
scanf("%s",&x);
//getchar();
// getchar();
if(x=='y')
{
Save();
exit(0);
}
else
exit(0);

default:
printf("\n\t输入有误,请输入正确的序列号!");
printf("\n请按回车键继续!");
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
}
}while(1);
}


高手看看还有什么问题没 帮我改一下这程序的健壮性
还有注释中的问题~~
谢谢了

搜索更多相关主题的帖子: 通讯录 电子 
2007-06-04 10:00
零下一度冰
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-6-22
收藏
得分:0 

我把我以前的一个程序随便改了一下,没有用文件保存数据,楼住看看吧
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct cust
{
int num;
char name[30];
char party[50];
char tel[12];
char mob_tel[11];
struct cust *next;
}node;
node *create(); //创建带头结点单链表
void print(node *h); //输出单链表h各个结点的信息
node *del(node *h,int i); //删除表h中编号为i的结点
node *Insert(node *h); //插入
void Find(node *h); //查询并显示


void main()
{
node *h;
int choice,n;
while(1)
{

printf(" ____________________________________________________________\n");
printf(" | |\n");
printf(" | 电话号码管理系统主菜单 |\n");
printf(" | 1. 建立号码薄 |\n");
printf(" | 2. 电话号码薄记录的输出 |\n");
printf(" | 3. 电话号码薄记录的插入 |\n");
printf(" | 4. 电话号码薄查询 |\n");
printf(" | 5. 电话号码薄记录的删除 |\n");
printf(" | 0. 退出本系统 |\n");
printf(" |__________________________________________________________|\n");
printf("请选择:");
scanf("%d",&choice);
switch(choice)
{
case 1:h=create();
break;
case 2:print(h);
break;
case 3:h=Insert(h);
break;
case 4:Find(h);
break;
case 5:printf("请输入编号(整数):");
scanf("%d",&n);
h=del(h,n);
break;
case 0: exit(0);
}
}
}


node *create() //创建带头结点单链表
{
node *head,*s,*t;
head=(node *)malloc(sizeof(node)); //头结点
t=head;t->next=NULL; //t为临时结点
s=(node *)malloc(sizeof(node)); //生成新结点
printf("请输入用户信息:\n ");
printf(" 编号(整数,为0时退出 : ");
scanf("%d", &(s->num));
while(s->num > 0 )
{
s->next=NULL;
printf(" 姓名 : ");
scanf("%s", s->name);
printf(" 固定电话 : ");
scanf("%s", s->tel);
printf(" 移动电话 : ");
scanf("%s", s->mob_tel);
printf(" 所属部门 : ");
scanf("%s", s->party);
t->next=s; t=s; //尾插法,t始终指向表尾
s=(node *)malloc(sizeof(node)); //生成新结点
printf("\n\n请输入用户信息:\n ");
printf(" 编号(整数,为0时退出 : ");
scanf("%d", &(s->num));
}
return head;
}


void print(node *h) //输出单链表h各个结点的信息
{
node *p=h->next;
printf("\n=========== 号码记录如下:=======\n ");
while(p!=NULL)
{
printf("\n编号 : %d ",p->num);
printf("\n姓名 : %s ",p->name);
printf("\n固定电话 : %s ",p->tel);
printf("\n移动电话 : %s ",p->mob_tel);
printf("\n所属部门 : %s \n\n",p->party);
p=p->next;
}
}


node *del(node *h,int i)
{
node *p=h,*s;
while(p->next!=NULL)
{
if(p->next->num==i)
{
s=p->next;
p->next=s->next; free(s);
}
else
p=p->next;
}
return h;
}

node *Insert(node *head) //插入
{
node *p,*s; //p、s为临时结点
p=head;
s=(node *)malloc(sizeof(node)); //生成新结点
printf("请输入信息: ");
printf(" \n 编号(输入0退出): ");
scanf("%d", &(s->num) );
while( s->num > 0 )
{
s->next=NULL;
printf(" 姓名 : ");
scanf("%s", s->name);
printf(" 固定电话 : ");
scanf("%s", s->tel);
printf(" 移动电话 : ");
scanf("%s", s->mob_tel);
printf(" 所属部门 : ");
scanf("%s", s->party);
while(p->next!=NULL)
{
p=p->next;
}
if(p->next==NULL)
{
p->next=s;
p=s;
s=(node *)malloc(sizeof(node)); //生成新结点,放在最后
}
}
return head;
}

void Find(node *h) //查询并显示
{
int i; node *q; char a[20];
printf("_______________________________________\n");
printf("| |\n");
printf("| 电话号码查询: |\n");
printf("| 1. 按姓名查询 |\n");
printf("| 2. 按电话号码查询 |\n");
printf("| 0. 返回主菜单 |\n");
printf("|_____________________________________|\n");
printf("请选择:\n");
scanf("%d",&i);
switch(i)
{
case 1: printf("请输入名字:");
scanf("%s",a);
q=h->next;
while(q!=NULL)
{
if(strcmp(a,q->name)==0)
{
printf("\n编号 : %d ",q->num);
printf("\n姓名 : %s ",q->name);
printf("\n固定电话 : %s ",q->tel);
printf("\n移动电话 : %s ",q->mob_tel);
printf("\n所属部门 : %s \n",q->party);
}
q=q->next;
}
break;

case 2: printf("请输入电话号码:");
scanf("%s",a);
q=h->next;
while(q!=NULL)
{
if((strcmp(a,q->tel))==0||(strcmp(a,q->mob_tel)==0))
{
printf("\n编号 : %d ",q->num);
printf("\n姓名 : %s ",q->name);
printf("\n固定电话 : %s ",q->tel);
printf("\n移动电话 : %s ",q->mob_tel);
printf("\n所属部门 : %s \n",q->party);
}
q=q->next;
}
break;
case 0: break;
default: printf("您要查询的记录不存在!\n");
}
}

2007-06-22 15:49
快速回复:[求助]电子通讯录的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020223 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved