为什么C语言做的通讯录无法保存信息在文本里?

木棉飘絮 2020-10-17 08:10:51
同时这个还有个bug,就是删除不能删除第一条录入的信息,不知道怎么解决

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct person //定义一个结构体
{
char name[10]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbphum[15]; //移动电话
struct person * next;
}listnode,*listlink; //结构体的别名

struct add_person
{
char name[10]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbphum[15]; //移动电话
};

listlink readfp() //将文件的信息读出并转存入链表中
{
FILE * fp ; //定义文件指针
struct add_person persons;
listnode * s ;
listlink head = NULL , end = NULL ;
fp = fopen("people.txt" , "rb");
if(fp == NULL)
{
printf("cannot open file \n");
return head;
}
fread(&persons , sizeof(struct add_person) , 1 , fp);
while(!feof(fp)) //判断文件是否结束(文件位置指示器是否到达了文件结尾)
{
s=(listnode*)malloc(sizeof(listnode)); //存入链表中
strcpy(s->name , persons.name) ; //提取数据并复制
strcpy(s->addr , persons.addr) ;
strcpy(s->offphnum , persons.offphnum) ;
strcpy(s->hmphnum , persons.hmphnum) ;
strcpy(s->mbphum , persons.mbphum) ;
s->next = NULL;
if(head==NULL)
head=end=s ;
else
{
end->next=s ;
end=s;
}
fread(&persons , sizeof(struct add_person) , 1 , fp) ;
}
return head;
}

void Save(listlink head) //保存信息
{
FILE * fp;
static struct add_person persons;
listlink p1;
fp=fopen("people.txt" , "wb");
for(p1=head ; p1!=NULL ; p1=p1->next);
{
strcpy(persons.name , p1->name);
strcpy(persons.addr , p1->addr);
strcpy(persons.hmphnum , p1->hmphnum);
strcpy(persons.mbphum , p1->mbphum);
strcpy(persons.offphnum , p1->offphnum);
fwrite(&persons , sizeof(struct add_person ) , 1 ,fp);
}
fclose(fp);
}

listlink create() //建立通讯录函数
{
listlink s;
listlink head=NULL , end=NULL;
while(1)
{
s=(listlink)malloc(sizeof(listnode));
printf("\n\n\tcreate add_book's file \n");
printf("\n\n\t\tname:('#' is end)\n\t name:");
scanf("%s" , s->name);
if(strcmp(s->name , "#")==0)
break;
printf("\n\nAddr:\toffphnum: \thmphnum: \tmbphnum:\n");
scanf("%s %s %s %s", s->addr , s->offphnum , s->hmphnum , s->mbphum);
s->next=NULL;
if(head==NULL)
head=end=s;
else
{
end->next=s;
end=s;
}
}
return(head);
}

void Show(listlink head) //显示所有信息
{
listnode *p1;
p1=head;
while(p1!=NULL)
{
printf("%s\t", p1->name);
printf("%s\t", p1->addr);
printf("%s\t", p1->offphnum);
printf("%s\t", p1->hmphnum);
printf("%s\t\n", p1->mbphum);
p1=p1->next;
}
}

void Delete(listlink head) //定义一个删除的函数
{
listlink p1 , p2;
char name1[10];
p1=p2=head;
if(p1==NULL)
{
printf("no record\n");
return;
}
printf("\n\n\tDelete----please input the name");
scanf("%s" , name1); //输入要删除人的姓名
while(strcmp(p1->name , name1)!=0 && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name , name1)==0) //根据判断情况做相应处理
{
if(p1==head)
p1=p1->next;
else
p2->next=p1->next;
free(p1);
}
else
printf("It is not exist in the addr-book!\n"); //要删除的记录不存在
}

void Find(listlink head) //查找指定记录信息
{
listlink p1;
char name1[10];
while(1)
{
p1=head;
printf("\n\n\tFind----please input the name: ('#' is end)\n\t name:");
scanf("%s", name1); //查找人的姓名
if(strcmp(name1,"#")==0)return;
while(strcmp(name1,p1->name)!=0 && p1->next!=NULL)
p1=p1->next;
if(strcmp(name1,p1->name)!=0)
printf("\n\n\tIt is not exist in the addr-book!");
else
{
printf("\tname:%s",p1->name);
printf("\taddr:%s",p1->addr);
printf("\tphnum:%s",p1->offphnum);
printf("\tphnum:%s",p1->hmphnum);
printf("\tphnum:%s",p1->mbphum);
}
}
}

void Input(listlink head) //向通讯录追加一个人的信息
{
listlink s , end;
s=(listlink)malloc(sizeof(listnode));
do
{
printf("\n\n\tInput----please input the sb's meg: \n\tname:('#' is end)\n\t name:");
scanf("%s",s->name);
if(strcmp(s->name,"#")==0)
return;
end=head;
if(end==NULL)break;
while((strcmp(end->name, s->name)!=0) && end->next!=NULL)
end=end->next;
}while(strcmp(end->name , s->name)==0);
printf("\n\nAddr:\toffphnum: \thmphnum: \tmbphnum:\n");
scanf("%s %s %s %s", s->addr , s->offphnum , s->hmphnum , s->mbphum);
s->next=NULL;
end->next=s;
}

void Alter(listlink head) //改变一个人的信息
{
listlink p1;
char name1[10] , phnum1[15] , phnum2[15] , phnum3[15] , add1[30];
printf("\n\n\tAlter----Please input the sname:");
scanf("%s",name1); //输入要修改人的姓名
p1=head;
while(strcmp(name1, p1->name)!=0 && p1->next!=NULL)
p1=p1->next;
if(strcmp(name1, p1->name)!=0)
{
printf("\n\n\tIt is not exist in the addr-book!");
return;
}
else
{
printf("\n\n\tPlease input the Alter meg!"); //输入要修改人的新信息
printf("\n\n addr: offphnum: hmphnum: mbphnum\n");
scanf("%s %s %s %s", add1 , phnum1 , phnum2 , phnum3);
strcpy(p1->name , name1);
strcpy(p1->addr, add1);
strcpy(p1->offphnum , phnum1);
strcpy(p1->hmphnum , phnum2);
strcpy(p1->mbphum , phnum3);
}
}

int main()
{
listlink head=NULL;
int sel;
head=readfp();
if(head==NULL)head=create();
do
{
printf("\n WELCOME TO USE Address book"); //显示提示的信息
printf("\n 1.Show all the meg 2.Delete a piece of meg");
printf("\n 3.Find a piece of meg 4.Insert a piece of meg");
printf("\n 5.Alter a piece of meg");
printf("\n 0.Save and Exit");
printf("\n Input Your Choice(0-5):");
scanf("%d",&sel);
switch(sel)
{
case 1: Show(head);
printf("press anykey to return \n");
getchar();
break;
case 2: Delete(head);
break;
case 3: Find(head);
printf("press anykey to return \n");
getchar();
break;
case 4: Input(head);
break;
case 5: Alter(head);
break;
case 0: Save(head);
break;
}
}while(1);
}
...全文
220 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2020-10-19
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <errno.h>

typedef struct person //定义一个结构体
{
char name[10]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbphum[15]; //移动电话
struct person * next;
}listnode,*listlink; //结构体的别名

struct add_person
{
char name[10]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbphum[15]; //移动电话
};

listlink readfp() //将文件的信息读出并转存入链表中
{
FILE * fp ; //定义文件指针
struct add_person persons;
listnode * s ;
listlink head = NULL , end = NULL ;
fp = fopen("people.txt" , "rb");
if(fp == NULL)
{
printf("cannot open file \n");
return head;
}
fread(&persons , sizeof(struct add_person) , 1 , fp);
while(!feof(fp)) //判断文件是否结束(文件位置指示器是否到达了文件结尾)
{
s=(listnode*)malloc(sizeof(listnode)); //存入链表中
strcpy(s->name , persons.name) ; //提取数据并复制
strcpy(s->addr , persons.addr) ;
strcpy(s->offphnum , persons.offphnum) ;
strcpy(s->hmphnum , persons.hmphnum) ;
strcpy(s->mbphum , persons.mbphum) ;
s->next = NULL;
if(head==NULL)
head=end=s ;
else
{
end->next=s ;
end=s;
}
fread(&persons , sizeof(struct add_person) , 1 , fp) ;
}
return head;
}

void Save(listlink head) //保存信息
{
FILE * fp;
static struct add_person persons;
listlink p1;
fp=fopen("people.txt" , "wb");
if (!fp) {
fprintf(stderr, "%s\n", strerror(errno));
return;
}
//for(p1=head ; p1!=NULL ; p1=p1->next); //多一个分号
for(p1=head ; p1!=NULL ; p1=p1->next)
{
strcpy(persons.name , p1->name);
strcpy(persons.addr , p1->addr);
strcpy(persons.hmphnum , p1->hmphnum);
strcpy(persons.mbphum , p1->mbphum);
strcpy(persons.offphnum , p1->offphnum);
fwrite(&persons , sizeof(struct add_person ) , 1 ,fp);
}
fclose(fp);
}

listlink create() //建立通讯录函数
{
listlink s;
listlink head=NULL , end=NULL;
while(1)
{
s=(listlink)malloc(sizeof(listnode));
printf("\n\n\tcreate add_book's file \n");
printf("\n\n\t\tname:('#' is end)\n\t name:");
scanf("%s" , s->name);
if(strcmp(s->name , "#")==0)
break;
printf("\n\nAddr:\toffphnum: \thmphnum: \tmbphnum:\n");
scanf("%s %s %s %s", s->addr , s->offphnum , s->hmphnum , s->mbphum);
s->next=NULL;
if(head==NULL)
head=end=s;
else
{
end->next=s;
end=s;
}
}
free(s); //last node not be inserted into link
return(head);
}

void Show(listlink head) //显示所有信息
{
listnode *p1;
p1=head;
while(p1!=NULL)
{
printf("%s\t", p1->name);
printf("%s\t", p1->addr);
printf("%s\t", p1->offphnum);
printf("%s\t", p1->hmphnum);
printf("%s\t\n", p1->mbphum);
p1=p1->next;
}
}

void Delete(listlink *head) //定义一个删除的函数
{
listlink p1 , p2;
char name1[10];
p1=p2=*head;
if(p1==NULL)
{
printf("no record\n");
return;
}
printf("\n\n\tDelete----please input the name");
scanf("%s" , name1); //输入要删除人的姓名
while(strcmp(p1->name , name1)!=0 && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name , name1)==0) //根据判断情况做相应处理
{
if(p1==*head) {
//p1=p1->next;
*head = (*head)->next;
}
else
p2->next = p1->next;
free(p1);
return;
}
//else
printf("It is not exist in the addr-book!\n"); //要删除的记录不存在
}

void Find(listlink head) //查找指定记录信息
{
listlink p1;
char name1[10];
while(1)
{
p1=head;
printf("\n\n\tFind----please input the name: ('#' is end)\n\t name:");
scanf("%s", name1); //查找人的姓名
if(strcmp(name1,"#")==0)return;
while(strcmp(name1,p1->name)!=0 && p1->next!=NULL)
p1=p1->next;
if(strcmp(name1,p1->name)!=0)
printf("\n\n\tIt is not exist in the addr-book!");
else
{
printf("\tname:%s",p1->name);
printf("\taddr:%s",p1->addr);
printf("\tphnum:%s",p1->offphnum);
printf("\tphnum:%s",p1->hmphnum);
printf("\tphnum:%s",p1->mbphum);
}
}
}

void Input(listlink head) //向通讯录追加一个人的信息
{
listlink s , end;
s=(listlink)malloc(sizeof(listnode));
do
{
printf("\n\n\tInput----please input the sb's meg: \n\tname:('#' is end)\n\t name:");
scanf("%s",s->name);
if(strcmp(s->name,"#")==0)
return;
end=head;
if(end==NULL)break;
while((strcmp(end->name, s->name)!=0) && end->next!=NULL)
end=end->next;
}while(strcmp(end->name , s->name)==0);
printf("\n\nAddr:\toffphnum: \thmphnum: \tmbphnum:\n");
scanf("%s %s %s %s", s->addr , s->offphnum , s->hmphnum , s->mbphum);
s->next=NULL;
end->next=s;
}

void Alter(listlink head) //改变一个人的信息
{
listlink p1;
char name1[10] , phnum1[15] , phnum2[15] , phnum3[15] , add1[30];
printf("\n\n\tAlter----Please input the sname:");
scanf("%s",name1); //输入要修改人的姓名
p1=head;
while(strcmp(name1, p1->name)!=0 && p1->next!=NULL)
p1=p1->next;
if(strcmp(name1, p1->name)!=0)
{
printf("\n\n\tIt is not exist in the addr-book!");
return;
}
else
{
printf("\n\n\tPlease input the Alter meg!"); //输入要修改人的新信息
printf("\n\n addr: offphnum: hmphnum: mbphnum\n");
scanf("%s %s %s %s", add1 , phnum1 , phnum2 , phnum3);
strcpy(p1->name , name1);
strcpy(p1->addr, add1);
strcpy(p1->offphnum , phnum1);
strcpy(p1->hmphnum , phnum2);
strcpy(p1->mbphum , phnum3);
}
}

int main()
{
listlink head=NULL;
int sel;
head=readfp();
if(head==NULL)
head = create();
do
{
printf("\n WELCOME TO USE Address book"); //显示提示的信息
printf("\n 1.Show all the meg 2.Delete a piece of meg");
printf("\n 3.Find a piece of meg 4.Insert a piece of meg");
printf("\n 5.Alter a piece of meg");
printf("\n 0.Save and Exit");
printf("\n Input Your Choice(0-5):");
scanf("%d",&sel);
switch(sel)
{
case 1: Show(head);
printf("press anykey to return \n");
getchar();
break;
case 2: Delete(&head); //用二重指针解决无法删除第一个的问题,内部修改详见函数内部实现
break;
case 3: Find(head);
printf("press anykey to return \n");
getchar();
break;
case 4: Input(head);
break;
case 5: Alter(head);
break;
case 0: Save(head);
break;
}
}while(1);
}


供参考~

for循环后面不能有分号,除非特殊用途

删除第一个节点,需要传二重指针,建议对比找一下自己的问题~
C语言编写的通讯录管理程序设计 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define HEADER1"------------------------------------------MESSAGE MENU--------------------------------------------------------------\n" #define HEADER2" | num | name | phonenumber | address |\n" #define HEADER3" |-------------------------------------------------------------------|\n" #define FORMAT " | %-10s %-10s %-15s %-20s |\n" #define DATA p->num,p->name,p->phonenum,p->address #define END " ------------------------------------------------------------------------------------------------------------------\n" #define N 100 int saveflag=0; /*是否需要存盘的标志变量*/ typedef struct record /*标记为record*/ { char num[4]; /*编号*/ char name[10]; /*姓名*/ char phonenum[15]; /*电话*/ char address[20]; /*地址*/ } RECORD; RECORD tele[N]; void menu(); void Disp(); void Qur(); void Modify(); void SelectSort(); void Wrong(); void Save(); void main() { RECORD tele[N]; /*定义RECOED结构体*/ FILE *fp; /*文件指针*/ int select; /*保持内选择结果变量*/ char ch; /*保存y,Y,n,N*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen("C:\\record.txt","a+"); /*以追加方式打开文本文件c;\record,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) { printf("\n=>Can not open file!\n"); exit(0); } while(!feof(fp)) { if(fread(&tele[count],sizeof(RECORD),1,fp)==1) /*一次从文件中读取一条通讯记录*/ count++; } fclose(fp); /*关闭文件*/ printf("\n=>Open file success,the total records number is:%d.\n",count); getchar(); menu(); while(1) { system("cls"); menu(); cprintf("\n Please input your choice(0-8):"); /*显示提示信息*/ ch=getch(); if(ch=='0') { if(saveflag==1) /*若对数组的数据有修且未进行存盘操作,则此标志为1*/ { getchar(); printf("\n==>Whether save the modified record to file?(y/n):"); scanf("%c",&ch); if(ch=='y'||ch=='Y') Save(tele,count); } printf("\n=>Thank you for useness!"); getchar(); break ; } switch(ch) { case'0':break; case'1':count=Add(tele,count);break; /*增加通讯记录*/ case'2':system("cls");Disp(tele,count);break; /*显示通讯记录*/ case'3':count=Del(tele,count) ;break; /*删除通讯记录*/ case'4':Qur(tele,count);break; /*查询通讯记录*/ case'5':Modify(tele,count);break; /*修改通讯记录*/ case'6':count=Insert(tele,count);break; /*插入通讯记录*/ case'7':SelectSort(tele,count);break;/*排序通讯记录*/ case'8':Save(tele,count);break; /*保存通讯记录*/ default: Wrong();getchar();break; /*按键有误,必需为0~8*/ } } } void menu() { system("cls"); /*调用DOS命令清屏,与clrscr()功能相同*/ textcolor(63); /*在文本模式中选择新的字符颜色*/ gotoxy(10,5); /*在文本窗口中设置光标*/ printf(" The communication management system\n"); gotoxy(10,8); printf(" ****Menu**** \n"); gotoxy(10,9); printf("\n"); gotoxy(10,10); printf("\* 1. Add record\n"); /*增加*/ gotoxy(10,11); printf("\* 2. Display record\n"); /*展览*/ gotoxy(10,12); printf("\* 3. Delete record\n"); /*删除*/ gotoxy(10,13); printf("\* 4. Search record\n"); /*查找*/ gotoxy(10,14); printf("\* 5. Modify record\n"); /*更改*/ gotoxy(10,15); printf("\* 6. Insert record\n"); /*插入*/ gotoxy(10,16); printf("\* 7. Sort record\n"); /*整理*/ gotoxy(10,17); printf("\* 8. Save record\n"); /*保存*/ gotoxy(10,18); printf("\* 0 Quit system\n"); /*退出*/ gotoxy(10,19); printf(" ************ \n"); /*cprintf()送格式话输出至文本窗口屏幕中*/ } /*格式化输出表头*/ void printheader() { printf(HEADER1); printf(HEADER2); printf(HEADER3); } /*格式化输出表中数据*/ void printdata(RECORD q) { RECORD *p; p=&q; printf(FORMAT,DATA); } void Disp( RECORD temp[],int n) /*显示数组temp[]中存储的通讯记录,内容为record结构中定义的内容*/ { int i; if(n==0) /*表示没有通讯记录*/ { printf("\n=>No menu record!\n"); getchar(); return ; } printf("\n\n"); printheader(); /*输出表格头部*/ i=0; while(iNot find this menu record!\n"); } int Locate(RECORD temp[],int n,char findmess[],char nameorphonenum[]) { int i=0; if(strcmp(nameorphonenum,"phonenum")==0) /*按电话号码查询*/ { while(ilens) printf("\n Exceed the required length! \n"); /*进行长度检测,超过lens值重新输入*/ } while(strlen(n)>lens); strcpy(t,n); /*将输入发字符串拷贝到字符串t中*/ } int Add(RECORD temp[],int n) /*增加通讯记录*/ { char ch,num[10]; int i,flag=0; system("cls"); Disp(temp,n); /*先打印出已有的通讯录信息*/ while(1) /*一次可输入多条记录,直至输入编号为0的记录才结束添加操作*/ { while(1) /*输入记录编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/ { stringinput(num,10,"Input number(press '0' return menu):"); /*格式化输入编号并检验*/ flag=0; if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/ { return n; } i=0; while(iThe number %s is existing,try again?(y/n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return n; } else {break;} } strcpy(temp[n].num,num); /*将字符串num拷贝到temp[n].num中*/ stringinput(temp[n].name,15,"Name:\n"); stringinput(temp[n].phonenum,15,"Telephone:\n"); stringinput(temp[n].address,15,"Address:\n"); saveflag=1; n++; } return n; } void Qur(RECORD temp[],int n) /*按编号或姓名查询通讯记录*/ { int select; /*按1:按姓名查,2:按电话号码查,其他:返回住界面(菜单)*/ char searchinput[20]; /*包寻用户输入的查询内容*/ int p=0; if(n<=0) /*若数组为空*/ { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("\n =>1 Search by name =>2 Search by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按姓名查询*/ { stringinput(searchinput,10,"Input the existing name:"); p=Locate(temp,n,searchinput,"name"); /*在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/ if(p!=-1) /*若找到该记录*/ { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else if(select==2) /*按电话号码查询*/ { stringinput(searchinput,15,"Input the existing telephone number:"); p=Locate(temp,n,searchinput,"phonenum"); if(p!=-1) { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } int Del(RECORD temp[],int n) { int sel; char findmess[20]; int p=0,i=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return n; } system("cls"); Disp(temp,n); printf("\n =>1 Delete by name =>2 Delete by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10,"Input the existing name:"); p=Locate(temp,n,findmess,"name"); getchar(); if(p!=-1) { for(i=p+1;iDelete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) /*先按电话号码查询到该记录所在的数组元素的下标值*/ { stringinput(findmess,15,"Input the existing telephone number:"); p=Locate(temp,n,findmess,"phonenum"); getchar(); if(p!=-1) { for(i=p+1;iDelete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } return n; } void Modify(RECORD temp[],int n) { char findmess[20]; int p=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("modify menu book recorder"); Disp(temp,n); stringinput(findmess,10,"Input the existing name:"); /*输入并检验该姓名*/ p=Locate(temp,n,findmess,"name"); /*查询到该数组元素,并返回下标值*/ if(p!=-1) /*若p!=-1,表明已经找到该数组元素*/ { printf("Number:%s,\n",temp[p].num); printf("Name:%s,",temp[p].name); stringinput(temp[p].name,15,"Input new name:"); printf("Name:%s,",temp[p].phonenum); stringinput(temp[p].name,15,"Input new telephone:"); printf("Name:%s,",temp[p].address); stringinput(temp[p].address,30,"Input new address:"); printf("\n=>modify success!\n");getchar(); Disp(temp,n); getchar();saveflag=1; } else { Nofind(); getchar(); } return ; } int Insert(RECORD temp[],int n) { char ch,num[10],s[10]; /*s[]保存插入点位置之前的记录编号,num[]保存输入的新记录的编号*/ RECORD newinfo; int flag=0,i=0,m=0; system("cls"); Disp(temp,n); while(1) { stringinput(s,10,"Please input insert location after the Number:"); flag=0;i=0; while(iThe number is not existing,try again?(y\n):",s); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } } /*以下新记录的输入操作与Add()相同*/ while(1) { stringinput(num,10,"Input new Number:"); flag=0;i=0; while(iSorry,The number %s is existing,try again?(y\n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } else break; } strcpy(newinfo.num,num); /*将字符串num拷贝到newinfo.num中*/ stringinput(newinfo.name,15,"Name:"); stringinput(newinfo.phonenum,15,"Telephone:"); stringinput(newinfo.address,15,"Address:"); saveflag=1; /*在main()中有对该全局变量的判断,若为1,则进行存盘操作*/ for(i=n-1;i>m;i--) /*从最后一个组织元素开始往前移一个元素位置*/ { strcpy(temp[i+1].num,temp[i].num); strcpy(temp[i+1].name,temp[i].name); strcpy(temp[i+1].phonenum,temp[i].phonenum); strcpy(temp[i+1].address,temp[i].address); } strcpy(temp[m+1].num,newinfo.num); strcpy(temp[m+1].name,newinfo.name); strcpy(temp[m+1].phonenum,newinfo.phonenum); strcpy(temp[m+1].address,newinfo.address); n++; Disp(temp,n); printf("\n\n");getchar(); return n; } void SelectSort(RECORD temp[],int n) { int i=0,j=0,flag=0,indexmin,select; char charflag[10]; RECORD newinfo; if(n<=0) { system("cls"); printf("\n=>Not record!\n"); getchar(); return ; } system("cls"); Disp(temp,n); /*显示排序前的所有记录*/ printf("\n =>1 SORT by num =>2 SORT by another way \n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按记录编号排序*/ { for(i=0;iSort complete!\n");getchar(); return; } else if(select==2) { for(i=0;iSort complete!\n");getchar(); return; } else { Wrong(); getchar(); getchar(); return; } } void Save(RECORD temp[],int n) { int i=0; FILE *fp; fp=fopen("c:\\record.txt","w"); /*以只写方式打开文本文件*/ if(fp==NULL) /*打开文件失败*/ { printf("\n=>Open file error!\n"); getchar(); return; } for(i=0;i0) { getchar(); printf("\n\n=>Save file complete,total saved's record number is:%d\n",i); getchar(); saveflag=0; } else { system("cls"); printf("The current link is empty,no menu record is saved!\n"); getchar(); } fclose(fp); /*关闭此文件*/ }
一:需求分析 二:总体设计 三:详细设计 四:调试与测试 五;测试结果 六:本次课程设计的心得体会 七:附录 本程序设计亮点介绍(及)改进方面 1.在修改函数中,可以实现单条记录修改(运用switch) 2.查询函数中,能返回该函数继续查询(运用了递归) 3.使用变量少,仅通过变量i的递加和表示成员数的变量n就实现了数据结构体之间的联 系 4.界面美观,使用方便 5.允许编号输入为字符 6.在显示函数上能够分屏显示(换页) 缺点 在输入数据时,未输完一个成员的所有信息不能退出输入 一:需求分析 A.需要实现的功能有:输入功能、输出功能、显示功能、查找功能、以及增加、删 除、修改功能。输入功能要求一次完成若干信息的输入;显示功能要能完成所有信息的 显示,并且自动分页;查找可以通过多种方式进行。 按需求的功能,应该设计出输入函数、输出函数、显示函数、查找函数、修改函数。另 需要一个标准界面。 B.数据存储问题 这个系统数据庞大复杂,需要需要适当应用数组,循环,结构体,文件操作等基本 语句及稍有难度的语句。因此要求我们熟练掌握结构化程序设计的基本思路和方法,在 所掌握的基本知识和技能的基础上,进一步提高自学能力和查找资料的能力,解决一定 程度的复杂的结构化程序设计问题,加深对所学知识的理解与掌握,利用自己所学知识 解决实际问题的能力,为以后的程序开发打下基础。 二:总体设计 主要结构图示 本程序由主函数和多个子函数组成,可执行多种数据管理的功能。具体通过c语言中 结构体数组来实现。主函数主体为定义的结构体,和一个switch函数,以提供多种程序 操作功能。 主要需运用到结构体数组、文件、函数等内容知识。 子函数有六个,分别负责添加、显示、删除、查询、修改、保存的功能。通过变量i使结 构体数组之间达成数据链表的功能,利用该方法主要考虑到成员中对于结构体指针尚未 熟练掌握,而这种方法更加便捷易懂。 子函数功能介绍 1. 添加:输入成员信息,依次输入编号、姓名、QQ、电话号码、单位、电子邮箱、身 份。 2. 显示:以表格形式输出所有通讯记录 3. 删除:只需输入该成员姓名,便删除其所有记录 4. 查询:可选用姓名、电话、单位身份4种方式来查询 5. 修改:输入该成员姓名后,再依次输入更新信息完成修改 6. 保存:输入文件名(带后缀)后保存。C-free中会默认以txt文件保存至c- free standard/temp文件夹中 三:详细设计 1. 主函数 完成变量的初始化与函数的定义之后,运用for( ; ; )来开启一个无限循环。循环内有switch函数来实现函数的选择功能,case1、case2等分 别执行不同的函数操作,每个函数中调用了相应的函数,并采用函数system("pause") ;暂停等待按键。在case6中采用函数exit(0)跳出循环。 下面在讲一下主函数中定义的n的作用,n的初值是1,当执行完case1中的函数input ( )后返回值为n+i,i为输入的成员数,返回值重新赋给n,n变为成员数,从而确定了之后 display()等函数循环中的终止条件。 2. 分函数 【1】添加 【2】显示 【3】删除 【4】查询 【5】修改 保存函数:【1】定义一个文件指针fp 【2】输入想创建的文件名称,如filename 【3】开辟文件,用fopen以"写"的方式打开,并把fp指针指向该文件 【4】在文件中输入信息 【5】保存(即fclose(filename)) 查询函数:运用了if来实现选择,并通过递归返回继续查询。 注:身份以及单位的查询方式有所不同,单位只能查找一条符合的记录,而按身份查询 可显示所有符合的信息。若查找不到,则返回继续查询,选择5返回则退出查询。 四:调试与测试 我们编写的函数具有一定的容错能力。具体表现为 【1】如select函数中输入0-6以外的数,则循环继续进行,直到输入0-6为止 【2】sign!='n'&&sign!='N'语句保证了大小写不会影响结果 【3】while(m!='1'&&m!='2'&&m!='3'&&m!='4') { printf("输入错误,请重新选择:"); scanf("%c",&m); }保证了输入正确 【4】当输入的成员信息错误时,可通过修改函数进行改动 五:测试结果 1.主函数运行正常。通过for语句是界面循环,并有switch及system函数进行配合调节 达到目的。(界面显示如下) 2.测试结果:运行正常,达到了预订的目标。 此处为通过保存函数保存后的txt文本中的学生信息 六:心得 课程设计是一个不断学习、思考、编写、修改的过程。它对我们的能力提出了挑战。 我不仅意识到c语言基础的重要性,更意识到了自学能力的重要性,同学学习书本,查找 资料等多种途径来构建思
C语言课程设计通讯录管理系统 文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256) 文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256) C语言课程设计通讯录管理系统全文共44页,当前为第1页。C语言课程设计通讯录管理系统 C语言课程设计通讯录管理系统全文共44页,当前为第1页。 ***科技大学 本科生课程设计说明书 题 目:C语言课程设计 —— 通讯录管理系统 学生姓名:** 学 号:*** 专 业:软件工程 班 级:1 C语言课程设计通讯录管理系统全文共44页,当前为第2页。指导教师:** C语言课程设计通讯录管理系统全文共44页,当前为第2页。 C语言课程设计通讯录管理系统全文共44页,当前为第3页。内蒙古科技大学课程设计任务书 C语言课程设计通讯录管理系统全文共44页,当前为第3页。 课程名称 C语言课程设计 设计题目 通讯录管理系统 指导教师 *** 时间 —— 一、教学要求 1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力 二、设计资料及参数 每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。 通讯录管理系统 现有一批通讯录的数椐,要求输入计算机并存放在内存中,然后增加若干个新通讯录的记录,并可输出通讯录清单,实现文件存盘和读入文件进行修改的功能。通讯录的基本信息包括编号,姓名,电话号码,QQ号码,电子邮件,通讯地址。要求设计菜单来调用其各功能模块: 新建文件、打开文件、保存信息到文件 输入记录、输出记录 查询记录(至少具有两种查询方式,例如以姓名查询和以电话号码查询) 修改、插入和删除记录 三、设计要求及成果 1. 分析课程设计题目的功能需求(可选用数组或链表实现,可多人(最多3人)协作完成一个题目)2. 写出详细设计说明(至少包括功能实现分析和模块流程图)3. 编写程序代码,调试程序使其能正确运行(代码书写要规范,标示符要见名知意,要有必要的注释,每人至少3个函数,每人至少200行代码,不包括注释和花括号)4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告(请严格按照模板进行排版) 四、进度安排 第一天? 选择课程设计题目,分析课题的要求第二天? 编程第三天? 编程及调试第四天? 写课程设计报告第五天? 提交课程设计报告(打印稿及电子稿) 五、评分标准 1. 根据平时上机考勤、表现和进度,教师将每天点名和检查 2. 根据课程设计完成情况,必须有可运行的软件。3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。 六、建议参考资料 1.《C语言程序设计》,谭浩强,清华大学出版社 C语言课程设计通讯录管理系统全文共44页,当前为第4页。2.《C语言程序设计课程设计》,刘振安,机械工业出版社。 C语言课程设计通讯录管理系统全文共44页,当前为第4页。 目 录 C语言课程设计通讯录管理系统全文共44页,当前为第5页。 C语言课程设计通讯录管理系统全文共44页,当前为第5页。 第一章 需求分析 引言 通过程序设计,达到理论与实际应用相结合,提高对信息管理系统的分析能力,能够根据实际应用,初步实现系统功能模块及算法的设计,通过编程基本实现信息管理系统。 任务概述 采用结构体的形式对数据进行输入输出。 可以对通讯录进行简单的排序,筛选,删除。 可以对任意信息就行修改。 可以把数据已文件的形式输入输出。 任意浏览信息。 数据描述 以所示的文本数据位初始数据进行简单操作,也可另行添加。 功能需求 实现以上功能需求。 性能需求 能够进行简单的数据处理。 具有对新信息处理打印打能力。 运行需求 C语言课程设计通讯录管理系统全文共44页,当前为第6页。输入个人信息时以例如按照"编号、姓名、年龄、电话号码 、通讯地址 、 电子邮箱"的顺序输入。 C语言课程设计通讯录管理系统全文共44页,当前为第6页。 输入时编号年龄、电话号码、通讯地址、电子邮箱以数字格式输入,输入姓名以文字输入。 以(Y/N)形式判断时,仅限N或者n为否,其他字符真。 进入排序功能后,要想见排序信息,到主菜单下见浏览信息功能。 任务计划 1.样例输入和输出 2.本通讯录管理程序,可以对数据进行输入输出,集排序,修改,打印,删除等功能。 下面以上述数据描述的数据为测试数据进行简单输入输出。 ——1.未排序前的信息 4).删除界面: 删除后,通讯录的显示记录: 5).查询界面: 以姓名查询方式为例: 6).修改界面: 修改后,通讯录的显示记录: 7).保存界面: C语言课程设计通讯录

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧