學生通訊錄c語言
❶ c語言編寫一個通訊錄系統 用簡單一點的c😊
#defineN100
#defineSIZE30
#include<stdio.h>
#include<string.h>
#include<conio.h>
structstudent{
charnum[SIZE];
charname[SIZE];
chartel[SIZE];
};
/*函數聲明*/
voidmyprint();/*顯示菜單*/
intmycreat(structstudent*p,intn);/*輸入通訊錄*/voidmydisplay(structstudent*p,intn);/*顯示通訊錄*/voidmysearch(structstudent*p,intn);/*查找*/
voidmymodify(structstudent*p,intn);/*修改通訊錄*/intmyadd(structstudent*p,intn);/*增加通訊錄*/intmydelete(structstudent*p,intn);/*刪除*/voidmysort(structstudent*p,intn);/*排序*/
voidsch_num(structstudent*p,intn);/*按學號查找*/voidsch_name(structstudent*p,intn);/*按姓名查找*/
intloadinfo(structstudent*p,intn);/*載入通訊錄信息*/intsaveinfo(structstudent*p,intn);/*保存通訊錄信息*/voidmain(){
/*文件定義*/charchoose,yes_no;
structstudentrecord[N];/*存放通訊錄信息,共100條*/inttotal=0,flag;/*通訊錄總數*/
total=loadinfo(record,N);/*從文件讀取記錄信息,不超過100條*/do{
myprint();/*顯示菜單*/
printf("請選擇:");do{
choose=getchar();}
while(choose<'0'||choose>'9');switch(choose){
case'1':
total=mycreat(record,total);break;case'2':
mydisplay(record,total);break;case'3':
mysearch(record,total);break;case'4':
mymodify(record,total);break;case'5':
total=myadd(record,total);break;case'6':
total=mydelete(record,total);break;case'7':
mysort(record,total);break;case'8':
flag=saveinfo(record,total);if(flag==1)
printf(" 保存成功! ");else
printf(" 保存失敗! ");break;case'0':
break;default:
printf(" %c為非法選項! ",choose);}
if(choose=='0')break;printf(" 要繼續選擇嗎(Y/N)?");do{
yes_no=getchar();}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');}
while(yes_no!='Y'||yes_no!='y');}
voidmyprint()/*顯示菜單信息*/{
printf(" ");printf(" ");printf("請輸入選項編號(0--7) ");printf("1---批量輸入通訊錄 ");printf("2---顯示通訊錄 ");printf("3---查詢通訊錄 ");printf("4---修改通訊錄 ");printf("5---添加通訊錄 ");printf("6---刪除通訊錄 ");printf("7---排序通訊錄 ");printf("8---保存通訊錄 ");printf("0---退出 ");printf(" ");
}
intmycreat(structstudent*p,intn)/*批量輸入學生信息*/{
inti=0;intm;
printf("添加前的記錄,共有<%d>個: ",n);printf(" 記錄號學號姓名電話號碼 ");
i=0;
while((i<n)&&(strcmp(p->num,"")!=0)){
printf("%d:%15s%15s%15s ",i+1,p->num,p->name,p->tel);i++;p++;}
printf(" 請輸入要輸入的學生人數(<%d):",N-n);
scanf("%d",&m);i=0;
while(i<m){
printf(" ");
printf("請輸入第%d個記錄: ",i+1);printf("學號:");do{
gets(p->num);}
while(strcmp(p->num,"")==0);printf("姓名:");gets(p->name);
printf("電話號碼:");gets(p->tel);p++;i++;}
returnm+n;}
voidmydisplay(structstudent*p,intn)/*顯示學生信息*/{
/*clrscr();*/inti=0;
printf(" 記錄號學號姓名電話號碼 ");while(i<n){
printf("%d:%15s%15s%15s ",i+1,p->num,p->name,p->tel);p++;i++;}}
voidmymodify(structstudent*p,intn)/*修改學生信息*/{
inti;
charnam[10];mydisplay(p,n);
printf(" 請輸入要修改記錄的姓名:");gets(nam);
for(i=0;i<n;i++,p++)
if(strcmp(nam,p->name)==0)break;if(i==n)
printf("無此人! ");else{
printf("請輸入正確的學號:");do{
gets(p->num);}
while(strcmp(p->num,"")==0);printf("請輸入正確的姓名:");gets(p->name);
printf("請輸入正確的電話號碼:");gets(p->tel);}
}
voidmysearch(structstudent*p,intn)/*查找指定學生*/{
charc;
mydisplay(p,n);
printf(" 按學號查詢(h),還是按姓名查詢(m)?");c=getchar();
if(c=='h'||c=='H')
sch_num(p,n);elseif(c=='m'||c=='M')
sch_name(p,n);else
printf(" 非法字元! ");}
voidsch_num(structstudent*p,intn)/*按學號查詢*/{
inti,flag=0;charnm[10];
printf(" 請輸入要查詢記錄的學號:");gets(nm);
for(i=0;i<n;i++)
if(strcmp(nm,p[i].num)==0)
{
printf(" 學號姓名電話號碼 ");printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);flag=1;
}
if(flag==0)
printf("無此人! ");}
voidsch_name(structstudent*p,intn)/*按姓名查詢*/{
inti,flag=0;charnam[10];
printf(" 請輸入要查詢記錄的姓名:");gets(nam);
for(i=0;i<n;i++)
if(strcmp(nam,p[i].name)==0){
printf(" 學號姓名電話號碼 ");printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);flag=1;}
if(flag==0)
printf("無此人! ");
}
intmyadd(structstudent*p,intn)/*增加學生信息*/{
inti=0;charc;
structstudentt,*q;
printf("添加前的記錄: ");printf(" 學號姓名電話號碼 ");i=0;q=p;
/*顯示原有記錄信息*/while(i<n){
printf("%15s%15s%15s ",q->num,q->name,q->tel);i++;q++;}do{
printf("請輸入新記錄的學號: ");do{
gets(t.num);
}
while(strcmp(t.num,"")==0);/*學號不能為空*/printf("請輸入新記錄的姓名:");gets(t.name);
printf("請輸入新記錄的電話號碼:");gets(t.tel);
for(i=0;i<n;i++)
if(strcmp(t.num,(p+i)->num)==0||strcmp(t.tel,(p+i)->tel)==0){
printf("學號或電話號碼重,要重新輸入嗎(Y/N)?");c=getchar();putchar(' ');break;}
/*找到最後,沒有重復*/if(i==n){
*(p+i)=t;
printf("添加後的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n+1;i++)
printf("%15s%15s%15s ",(p+i)->num,(p+i)->name,p[i].tel);break;}
}
while(c=='y'||c=='Y');returnn+1;}
intmydelete(structstudent*p,intn)/*刪除學生信息*/{
inti,x;
charc,nm[10],nam[10];
printf("刪除前的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);printf("按學號刪除(h),還是按姓名刪除(m)?");c=getchar();
if(c=='h'||c=='H'){
printf(" 請輸入要刪除記錄的學號:");gets(nm);
for(x=0;x<n;x++)
{
gets(t.num);
}
while(strcmp(t.num,"")==0);/*學號不能為空*/printf("請輸入新記錄的姓名:");gets(t.name);
printf("請輸入新記錄的電話號碼:");gets(t.tel);
for(i=0;i<n;i++)
if(strcmp(t.num,(p+i)->num)==0||strcmp(t.tel,(p+i)->tel)==0){
printf("學號或電話號碼重,要重新輸入嗎(Y/N)?");c=getchar();putchar(' ');break;}
/*找到最後,沒有重復*/if(i==n){
*(p+i)=t;
printf("添加後的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n+1;i++)
printf("%15s%15s%15s ",(p+i)->num,(p+i)->name,p[i].tel);break;}
}
while(c=='y'||c=='Y');returnn+1;}
intmydelete(structstudent*p,intn)/*刪除學生信息*/{
inti,x;
charc,nm[10],nam[10];
printf("刪除前的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);printf("按學號刪除(h),還是按姓名刪除(m)?");c=getchar();
if(c=='h'||c=='H'){
printf(" 請輸入要刪除記錄的學號:");gets(nm);
for(x=0;x<n;x++)
intj,i,k;charc1,c2;
structstudenttemp;
printf(" 排序前的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);printf(" 按學號排序(h),還是按姓名排序(m)?");c1=getchar();
if(c1=='h'||c1=='H'){
printf(" 按升序排序(s),還是按降序排序(j)?");c2=getchar();/*升序*/
if(c2=='s'||c2=='S'){
for(i=0;i<n-1;i++){
k=i;
for(j=i;j<n;j++)
if(strcmp(p[k].num,p[j].num)<0)
k=j;
temp=p[k];p[k]=p[i];p[i]=temp;
}
printf(" 排序後的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);}
elseif(c2=='j'||c2=='J')/*降序*/{
for(i=0;i<n-1;i++){
k=i;
for(j=0;j<n;j++)
if(strcmp(p[k].num,p[j].num)<0)
k=j;
temp=p[k];p[k]=p[i];p[i]=temp;
}
printf("排序後的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);}
elseprintf(" 非法字元 ");}
elseif(c1=='m'||c1=='M')/*按姓名排序*/{
printf(" 按升序排序(s),還是按降序排序(j)?");c2=getchar();
if(c2=='s'||c2=='S'){
for(i=0;i<n-1;i++){
k=i;
for(j=0;j<n;j++)
if(strcmp(p[k].name,p[j].name)<0)
k=j;
temp=p[k];p[k]=p[i];p[i]=temp;}
printf("排序後的記錄: ");printf(" 學號姓名電話號碼 ");for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);
}
elseif(c2=='j'||c2=='J')/*降序*/{
for(i=0;i<n-1;i++){
k=i;
for(j=i;j<n;j++)
if(strcmp(p[k].name,p[j].name)<0)
k=j;
temp=p[k];p[k]=p[i];p[i]=temp;
}
printf("排序後的記錄: ");printf(" 學號
姓名電話號碼 ");
for(i=0;i<n;i++)
printf("%15s%15s%15s ",p[i].num,p[i].name,p[i].tel);}
elseprintf(" 非法字元! ");}
elseprintf(" 非法字元! ");}
intloadinfo(structstudent*p,intn)/*載入通訊錄信息*/{
FILE*fp;inti,all=0;
charfilename[30]="tongxunlu.txt";fp=fopen(filename,"r");if(fp==NULL){
printf(" ***不能打開文件%s,或%s文件不存在,創建一個新文件!
",filename,filename);*/
fp=fopen(filename,"w");}
fscanf(fp,"%d ",&all);
if(all>N)/*讀取記錄總數*/{
printf("文件記錄數太多,不能讀取");return0;}
for(i=0;i<all;i++)/*讀取記錄信息*/{
fscanf(fp,"%s%s%s ",p[i].num,p[i].name,p[i].tel);}
fclose(fp);/*關閉文件*/returnall;}
intsaveinfo(structstudent*p,intn){
FILE*fp;inti,all=0;
charfilename[30]="txl.dat";/*文件可以用記事本打開*/fp=fopen(filename,"w");if(fp==NULL){
printf(" ***不能建立或打開文件%s!***",filename);return0;}
fprintf(fp,"%d ",n);for(i=0;i<n;i++)
fprintf(fp,"%s%s%s ",p[i].num,p[i].name,p[i].tel);fclose(fp);return1;}
抄來的
❷ C語言程序設計,通訊錄管理系統
/*【用C語言編寫具有數據插入、修改、刪除、顯示和查詢功能的電話薄管理程序】
1、數據包括:人名、工作單位、電話號碼和E-mail地址。
2、可對記錄中的姓名和電話號碼進行修改。
3、可增加或刪除記錄。
4、可顯示所有保存的記錄。
5、可按人名或電話號碼進行查詢。
另:採用結構體數組和文件系統實現。結構體包括人名、工作單位、電話號碼和E-mail
絕對原創,2010年7月12日晚剛寫完測試通過的,純C語言! */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define szSTR 64
#define fileDB "c:\\contact.txt"
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(t.name[0]==0) continue;
if(key) {
a = strstr(t.name , key);
b = strstr(t.tele , 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 r?p:-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;
}
❸ 用C語言做通訊錄
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct Telephone
{
char number[200];
char name[20];
char off[20];
char addrass[20];
char mail[20];
char telephone[20];
struct Telephone *next;
};
typedef struct Telephone TEL;
TEL *head=NULL;
void Menu(); /*菜單*/
void Crease(); /*添加條目*/
void print(); /*輸出條目*/
void Search(); /*查找條目( 按姓名 )*/
void Delate(); /*刪除信息*/
void Save(); /*保存到文件*/
void Open(); /*打開文件*/
void Change(); /*修改信息*/
void Arrange(); /*排序*/
void main()
{
char ch;
Open(); /*打開文件*/
while(1)
{
Menu(); /*顯示菜單*/
scanf(" %c",&ch);
switch(ch)
{
case '1':Crease(); /*添加條目*/
break;
case '2':Search(); /*查找條目1.按姓名*/
break;
case '3':Change(); /*修改信息*/
print();
break;
case '4': Delate(); /*刪除信息*/
print(); /*輸出刪除後的結果*/
break;
case '5':print(); /*輸出條目*/
break;
case '0':Save(); /*保存並釋放內存*/
exit(0); /*退出*/
break;
default:
printf("選擇錯誤!");
break;
}
}
}
/*菜單*/
void Menu()
{
printf("\n*****************通訊錄系統*****************\n");
printf("\t1.錄入。\n");
printf("\t2.按姓名查詢\n");
printf("\t3.修改信息\n");
printf("\t4.刪除\n");
printf("\t5.輸出\n");
printf("\t0.保存並退出!\n");
printf("*************************************************\n");
printf("\t請選擇:");
}
/*添加條目*/
void Crease()
{
TEL *p1=NULL,*p2=NULL;
p1=(TEL *)malloc(sizeof(TEL)); /*申請結點*/
printf("輸入編號:");
scanf("%s",p1->number);
printf("輸入姓名:"); /*添加信息*/
scanf("%s",p1->name);
printf("輸入單位:");
scanf("%s",p1->off);
printf("輸入地址:");
scanf("%s",p1->addrass);
printf("輸入郵箱:");
scanf("%s",p1->mail);
printf("輸入電話:");
scanf("%s",p1->telephone);
p1->next=NULL; /*保存到鏈表*/
if(head==NULL)
{
head=(TEL *)malloc(sizeof(TEL)); /*申請空間*/
head->next=p1;
}
else
{
for(p2=head;p2->next!=NULL;p2=p2->next); /*找到結點尾*/
p2->next=p1;
}
printf("此信息已添加!");
}
/*輸出學生信息*/
void print()
{
TEL *p=NULL;
if(head==NULL)
{
printf("此通訊錄中無記錄,請輸入記錄後在使用本功能!\n");
return;
}
printf("**************通訊錄系統*********************\n"); /*輸出信息*/
printf("編號\t姓名\t單位\t地址\t郵箱\t電話\n");
for(p=head->next;p!=NULL;p=p->next)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
}
/*查找信息1.按姓名*/
void Search()
{
TEL *p;
char findname[20];
printf("請輸入要查找的姓名:");
scanf("%s",findname);
printf("**************通訊錄系統*********************\n");
printf("編號\t姓名\t單位\t地址\t郵箱\t電話\n");
for(p=head;p!=NULL;p=p->next)
{
if(strcmp(p->name,findname)==0)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
}
}
/*刪除信息*/
void Delate()
{
char findname[20]; /*先查找 後刪除*/
TEL *p = head, *pr ;
printf("輸入要刪除的姓名:");
scanf(" %s",findname);
if (head->next == NULL)
{
printf("空鏈表!\n");
return;
}
while ((strcmp(p->name,findname)!=0 )&& p->next != NULL)
{
pr =p;
p =p->next;
}
if (strcmp(findname, p->name)==0) /*輸出刪除信息*/
{
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
if (p == head->next)
head->next = p->next;
else
pr->next = p->next;
free(p);
printf("此信息已刪除!");
}
else printf("無此信息!\n");
}
void Save() /*保存鏈表信息到文件並釋放內存空間*/
{
TEL *p=NULL;
FILE *fp;
char *Book="books.txt";
if(head==NULL)
{
printf("\n記錄為空!\n");
return;
}
else
p=head->next;
if((fp=fopen(Book,"wb+"))==NULL)
{
printf("\n打不開文件!\n");
return;
}
while(p!=NULL) /*保存信息*/
{
fwrite(p,sizeof(TEL),1,fp);
p=p->next;
}
printf("保存完畢!\n");
fclose(fp);
/*****釋放鏈表空間*****/
for(;head->next!=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
/*文件信息輸出到鏈表*/
void Open()
{
FILE *fp;
TEL *p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("books.txt","rb+"))==NULL)
{
printf("\n****************通訊錄******************\n");
return;
}
head=(TEL *)malloc(sizeof(TEL));
head->next=NULL;
temp=p2=head;
while(! feof(fp)) /*循環讀取*/
{
p1=(TEL *)malloc(sizeof(TEL));
temp=p2;
p2->next=p1;
p2=p1;
fread(p1,sizeof(TEL),1,fp);
}
temp->next=NULL;
fclose(fp); /*關閉文件*/
}
void Change()
{
TEL *p;
char name[20];
printf("輸入要修改人的姓名:");
scanf("%s",name);
for(p=head->next;p!=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{printf("**************通訊錄系統*********************\n");
printf("編號\t姓名\t單位\t地址\t郵箱\t電話\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
printf("輸入要修改的內容:\n");
printf("輸入編號:");
scanf("%s",p->number);
printf("輸入姓名:");
scanf("%s",p->name);
printf("輸入單位:");
scanf("%s",p->off);
printf("輸入地址:");
scanf("%s",p->addrass);
printf("輸入郵箱:");
scanf("%s",p->mail);
printf("輸入電話:");
scanf("%s",p->telephone);
}
else printf("無此信息!\n");
}
}
自己對比一下
❹ C語言,編寫一個簡單的通訊錄管理系統
實現一個通訊錄管理系統;
通訊錄管理系統可以用來存儲1000個人的信息,每個人的信息包括:
姓名、性別、年齡、電話、住址
**提供方法:
1. 添加聯系人信息
2. 刪除指定聯系人信息
3. 查找指定聯系人信息
4. 修改指定聯系人信息
5. 顯示所有聯系人信息
6. 清空所有聯系人
7. 以名字排序所有聯系人**
1、linkman.h(頭文件)
3、程序運行結果部分示範:
❺ 請C語言高手幫忙做一下c程序設計題目
沒工夫編了,給你找了個現成的,網路知道里的。
#include <iostream>
#include <string>
#include "address.h"
#include "addressList.h"
#include "addressBook.h"
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_rl.end();
for (it=c_rl.begin();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 );
rl.push_back(rec);
}
return is;
}
#include<stdlib.h>
#include<fstream>
#include "addressBook.h"
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)
{
cin.getline(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];
cin.getline(choice,2);
while(true)
{
if(choice[0]!='1' && choice[0]!='2')
{
cout<<"輸入錯誤,重選1-2:";
cin.getline(choice,2);
}
else
break;
}
int type=static_cast<int>(choice[0])-48;
//輸入需要匹配的字元串
if(type==1)
cout<<"請輸入姓名:"<<flush;
else
cout<<"請輸入電話:"<<flush;
char pattern[20];
cin.getline(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]";
cin.getline(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):";
cin.getline(name,16);
fname=name;
if(fname.empty())
fname="sname";
ofstream of(fname.c_str(),ios_base::out);
if(!of)
{
cout<<"不能存入文件!"<<endl;
return;
}
AddressList::saveRecords(of);
of.close();
cout<<size()<<"條記錄已經存入文件,請繼續操作。"<<endl;
isModified=false;
}
//功能:從指定文件讀取記錄追加到當前通信錄末尾
//注意:該函數重載了基類中的函數
void AddressBook::loadRecords()
{
}
void AddressBook::quit()
{
}
#ifndef H_ADDRESSBOOK_H_NNN
#define H_ADDRESSBOOK_H_NNN
#include "addressList.h"
//處理通信錄操作的面向用戶使用的類,包含所有功能的用戶界面及用戶交互的實現
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 "addressList.h"
AddressList::~AddressList()
{
recList.clear();
}
//功能:向通信錄中添加新的記錄
//參數:rec,指向新記錄的指針
void AddressList::addRecord (Record* rec)
{
if (rec !=NULL)
{
recList.push_back(rec);
}
}
//功能:從通訊錄中刪除一個記錄
//參數:it,指向欲刪除記錄的迭代器
//注意:it,應是可提領的迭代器,可以通過findRecord()獲得
AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it)
{
return recList.erase(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=recList.end();
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 "address.h"
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 {return (int)recList.size();}
//通信錄是否為空
const bool empty() const {return recList.empty();}
//清除通信錄
virtual void clear() {recList.clear();}
//獲得通信錄的第一條記錄
Iterator first(){return recList.begin();}
//獲得通信錄超過最後一個記錄之後的迭代器
Iterator pastEnd() {return recList.end();}
};
#endif //H_ADDRESSLIST_H_AAA
❻ 求用C語言編寫一個 通訊錄管理系統 。設計要求如下
這個主要用到鏈表來做就可以的啦,鏈表的基本操作(創建、插入、刪除等)要掌握好。之前我自己寫有一個,和你的功能差不多,但是變數有所不同,給你參考參考吧,可以仿照。不懂的再問吧。代碼如下:
#include"stdafx.h"
using namespace std;
//結構體
struct contaxt
{
char name[10];
char sex[5];
char Adrre[50];
char Class[20];
char Mobi[20];
char qq[10];
struct contaxt *next;
};
//函數聲明
typedef struct contaxt CONT;
CONT *InsertCon(CONT *head);
CONT *AddContaxt(int n);
CONT *FindCon(CONT *head);
CONT *AmendMessage(CONT *head);
CONT *DeleteMessage(CONT *head);
void showmessage(CONT *head);
int menu(CONT *head);
CONT *saveFileCONT(CONT *head );
CONT *readFileCONT(CONT *head);
int choose;
//入口
void main()
{
//system("color F4");
CONT *head;
head = NULL;
menu(head);
}
//系統主菜單
int menu(CONT *head)
{
cout << "請選擇操作菜單!!!" << endl ;
do
{
cout << "---------------------------歡迎進入通訊錄管理系統-------------------------------"
<< "---------------------------------操作菜單---------------------------------------";
cout << "--------------------------------------------------------------------------------"
<< " 1 添加聯系人信息 "
<< " 2 插入聯系人信息 " << endl
<< " 3 查找聯系人信息 "
<< " 4 修改聯系人信息 " << endl
<< " 5 刪除聯系人信息 "
<< " 6 顯示聯系人信息 " << endl
<< " 7 退出本系統 " << endl
<< " 8 保存文件 " << endl
<< " 9 讀取文件 " << endl
<< "--------------------------------------------------------------------------------" << endl;
cout << "請選擇操作菜單!!!" << endl ;
int choose;
//choose = getchar();
fflush(stdin);
//return choose;
cin >> choose;
if(choose != 1&& choose != 2 && choose != 3 && choose !=4 && choose != 5 && choose !=6 && choose !=7&&choose != 8)
{
cout << "輸入錯誤:"<<endl;
}
else
{
switch(choose)
{
case 1:
int n;
do
{
fflush(stdin);
cout << "請確定要添加幾個聯系人:";
cin >> n;
}while(n <= 0);
head = AddContaxt(n);
break;
case 2:
system("CLS");
head = InsertCon(head);
break;
case 3:
head = FindCon(head);
break;
case 6:
system("CLS");
showmessage(head);
break;
case 7:
exit(0);
break;
case 4:
system("CLS");
AmendMessage(head);
break;
case 5:
system("CLS");
DeleteMessage(head);
break;
case 8:
system("CLS");
head = saveFileCONT(head );
break;
case 9:
// head = readFileCONT(head);
default:
system("CLS");
cout << "你輸入錯誤,請重新選擇!!!" << endl;
break;
}
}
}while(choose != 1&& choose != 2 && choose != 3 && choose !=4 && choose != 5 && choose !=6 && choose !=7);
return choose;
}
//添加聯系人
CONT *AddContaxt(int n)
{
CONT *p,*q,*head;
int i;
system("CLS");
p = (CONT *)malloc(sizeof(CONT));
cout << "開始添加聯系人信息:"<< endl;
cout << "輸入姓名:";
cin >> p->name;
cout << "輸入姓別:";
cin >> p->sex ;
cout << "輸入班級:";
cin >> p->Class ;
cout << "輸入住址:";
cin >> p->Adrre ;
cout << "輸入手機號:";
cin >> p->Mobi ;
cout << "輸入qq號:";
cin >> p->qq ;
head = p;
for(i = 2;i <= n;i++)
{
q = (CONT *)malloc(sizeof(CONT));
p->next = q ;
p = q;
system("CLS");
cout<< "總共需要輸入"<< n << "個聯系人的信息,"<<"現在你已輸入" << i-1<< "個聯系人信息."<< endl<< "請繼續輸入第"<<i << "個人的信息!!"<< endl;
cout << "輸入姓名:";
cin >> p->name;
cout << "輸入姓別:";
cin >> p->sex ;
cout << "輸入班級:";
cin >> p->Class ;
cout << "輸入住址:";
cin >> p->Adrre ;
cout << "輸入手機號:";
cin >> p->Mobi ;
cout << "輸入qq號:";
cin >> p->qq ;
}
p->next = NULL;
return head;
}
//插入聯系人信息
CONT *InsertCon(CONT *head)
{
CONT *pc,*p,*q;
int choose ;
char name[10];
if(head ==NULL)
{
cout << "還沒有添加任何聯系人,請先添加聯系人!!"<< endl;
return head;
}
pc = (CONT *)malloc(sizeof(CONT));
cout << "請依次輸入被插入人的信息:姓名 /性別/班級/住址/手機號/qq號"<< endl;
cin >> pc->name >> pc->sex >> pc->Class >> pc->Adrre >> pc->Mobi >> pc->qq ;
pc ->next = NULL;
cout << "請選擇自己喜歡的插入方式: "<< endl<< "1 插入在自己喜歡的人之前"<< endl << "2 插入在最後" << endl << "3 插入在開頭" << endl;
do {
cin >> choose;
switch(choose)
{
case 1:
cout << "請輸入自己喜歡的人的名字:";
cin >> name ;
if(strcmp(head->name ,name)==0)
{
pc->next = head;
head = pc;
return head;
}
else
{
q = head;
p = head->next ;
while(strcmp(p->name,name)!=0 && p->next !=NULL)
{
q = p;
p = p->next ;
}
if(strcmp(p->name ,name)==0)
{
pc->next = p ;
q = pc;
return head;
}
else
{
p->next = pc;
return head;
}
}
break;
case 2:
//cout << "請輸入自己喜歡的人的名字:";
//cin >> name ;
p = head;
while(p->next != NULL)
p = p->next ;
p->next = pc;
return head;
break;
case 3:
//cout << "請輸入自己喜歡的人的名字:";
//cin >> name ;
pc->next = head;
head = pc;
return head;
break;
default :
cout<<"error"<< endl;
break;
}
}while(choose!=1 &&choose != 2 && choose != 3);
}
//查找聯系人信息
CONT *FindCon(CONT *head)
{
system("CLS");
char na[20];
CONT *p,*q;
if(head == NULL)
{
cout << "沒有任何信息可查找,請先添加信息!!"<< endl;
return head;
}
cout << "請您輸入要查找人的姓名:"<< endl;
cin >> na;
p = head;
while(p!= NULL)
{
if(strcmp(p->name ,na)==0)
{
q = p;
cout << "找到聯系人,信息如下!!"<< endl;
cout << "姓名:" << q->name <<" 性別: " << q->sex << q->Class <<" 住址: " <<q->Adrre <<" 手機號: " <<q->Mobi <<" qq號: "
<< q->qq << endl;
break;
}
else
p = p->next ;
}
return head;
}
//修改聯系人信息
CONT *AmendMessage(CONT *head)
{
CONT *p;
char nam[10];
char sex[5];
char Adrre[50];
char Class[20];
char Mobi[20];
char qq[10];
if(head == NULL)
{
cout<< "沒有任何信息,請返回添加信息!!!"<< endl;
return head;
}
else
p = head;
cout << "請你輸入要修改人的名字:";
cin >> nam;
while(p != NULL && p->name != nam)
{
if(strcmp(p->name ,nam)==0)
{
strcpy(p->name ,nam);
int choose;
do
{
cout << "請選擇要修改哪一項的信息!!!"<< endl;
cout << "1 修改性別 2 修改班別 3 修改地址 4 修改手機號碼 5 修改qq號 " << endl;
cin >> choose;
switch(choose)
{
case 1:
cout << "請輸入要修改後的性別:";
cin >> sex;
strcpy(p->sex , sex);
cout << "修改成功!!!"<< endl;
system("CLS");
return head;
break;
case 2:
cout << "請輸入修改後的班別:";
cin >> Class;
strcpy(p->Class ,Class);
system("CLS");
cout << "修改成功!!!"<< endl;
return head;
break;
case 3:
cout << " 請輸入修改後的地址:";
cin >> Adrre;
strcpy(p->Adrre ,Adrre);
system("CLS");
cout << "修改成功!!!"<< endl;
return head;
break;
case 4:
cout << "請輸入修改後的手機號碼:";
cin >> Mobi;
strcpy(p->Mobi ,Mobi);
system("CLS");
cout << "修改成功!!!"<< endl;
return head;
break;
case 5:
cout << "請輸入修改後的qq號:";
cin >> qq;
strcpy(p->qq ,qq);
system("CLS");
cout << "修改成功!!!"<< endl;
return head;
break;
default:
cout << "輸入錯誤,重新選擇!!" << endl;
break;
}
}while(choose != 0);
}
else if(p->next != NULL && p->name != nam)
{
p = p->next ;
}
else
{
cout << "輸入名字錯誤,請重新選擇4修改!!!" << endl;
return head;
}
}
//return head;
}
//刪除聯系人
CONT *DeleteMessage(CONT *head)
{
CONT *p,*q,*t;
char name[20];
char elem[10];
cout << "請輸入要刪除聯系人的姓名:";
cin >> name;
if(head == NULL)
{
cout << "沒有任何信息可刪除,請添加信息!!"<< endl;
return head;
}
else if(strcmp(head->name,name)==0 )
{
t = head;
head = head->next ;
return head;
}
else
{
p = head->next ;
q = head;
}
while(p !=NULL && p->name != name)
{
q = p;
p = p->next ;
}
if(strcmp(p->name ,name)==0)
{
q->next = p->next ;
free(p);
//t = p;
}
else
{
cout<< "表中無該元素!" << endl;
return head;
}
if(t)
{
// elem = t->name ;
free(t);
}
return head;
}
//保存文件
CONT *saveFileCONT(CONT *head )
{
char *fileName;
FILE *fp;
CONT *p;
p = (CONT *)malloc(sizeof(CONT));
if(p=NULL)
{
cout <<"分配內存失敗"<< endl;
// exit(0);
}
if(head ==NULL)
{
cout <<"沒有任何信息,請先添加信息!!"<< endl;
return head;
}
else
{
p = head;
fileName = (char *)malloc(sizeof(char));
cout << "請輸入文件名:" << endl;
cin >> fileName;
fileName = strcat(fileName,".txt");
if( (fp = fopen(fileName,"a")) == NULL)
cout << "can't open file" << endl;
do
{
//fwrite(head,sizeof(CONT),1,fp);
//fprintf(fp,p->name,p->sex,p->Class,p->Adrre,p->Mobi,p->qq );
fprintf(fp," 姓名:");
fprintf(fp, p->name );
fprintf(fp," 性別:");
fprintf(fp, p->sex);
fprintf(fp," 班別:");
fprintf(fp, p->Class);
fprintf(fp," 地址:");
fprintf(fp, p->Adrre);
fprintf(fp," 手機號:");
fprintf(fp, p->Mobi);
fprintf(fp," qq號:");
fprintf(fp, p->qq);
fprintf(fp,"\n");
cout << endl;
cout << "--------------------------------------------------------------------------------";
cout << " "<<"姓名:" <<p->name <<" 性別:" <<p->sex << " 班別:" <<p->Class <<" 住址:" <<p->Adrre <<"手機號:"
<< p->Mobi <<" qq號:" << p->qq << endl;
cout << "--------------------------------------------------------------------------------";
p=p->next ;
}while(p!=NULL);
}
fclose(fp);
return head;
}
//讀取文件
CONT *readFileCONT(CONT *head)
{
char *fileName;
CONT *p;
FILE *fp;
fileName = (char *)malloc(sizeof(char));
cout << "請輸入要打開的文件名:";
cin >> fileName;
fileName = strcat(fileName,".txt");
fp = fopen(fileName,"r");
if(fp == NULL)
{
cout << "文件沒有任何信息,請先輸入信息!!"<< endl;
}
else
{
while(!feof(fp))
{
p = (CONT *)malloc(sizeof(CONT));
if(p == NULL)
{
cout << "分配內存失敗!!"<< endl;
return head;
}
fscanf(fp,p->name );
fscanf(fp,p->sex );
fscanf(fp,p->Class );
fscanf(fp,p->Adrre );
fscanf(fp,p->Mobi );
fscanf(fp,p->qq );
cout << "--------------------------------------------------------------------------------";
cout << " "<<"姓名:" <<p->name <<" 性別:" <<p->sex << " 班別:" <<p->Class <<" 住址:" <<p->Adrre <<"手機號:"
<< p->Mobi <<" qq號:" << p->qq << endl;
cout << "--------------------------------------------------------------------------------";
p->next = head;
head = p;
p = p->next ;
}
fclose(fp);
cout<< "讀取信息成功!!!"<< endl;
}
fclose(fp);
return head;
}
void showmessage(CONT *head)
{
CONT *p;
int i=0;
if(head == NULL )
{
cout << "沒有任何信息可輸出,請添加信息!!!"<< endl;
}
else
{
p = head;
cout << "*******************************聯系表如下***************************************";
do
{
i++;
cout << "--------------------------------------------------------------------------------";
cout << i << " "<<"姓名:" <<p->name <<" 性別:" <<p->sex << " 班別:" <<p->Class <<" 住址:" <<p->Adrre <<"手機號:"
<< p->Mobi <<" qq號:" << p->qq << endl;
cout << "--------------------------------------------------------------------------------";
p = p->next ;
}while(p!=NULL);
}
cout << "*********************************聯系表***************************************";
cout << endl;
}