C语言—通讯录
要求利用靜態(tài)數(shù)組來實(shí)現(xiàn)通訊錄管理,掌握數(shù)組、文件讀寫、函數(shù)等知識。
系統(tǒng)設(shè)計(jì):??????
??????? 1、下面的功能要求通過菜單進(jìn)行選擇
????????2、記錄錄入:按照一定的格式,向通迅錄中添加聯(lián)系人的記錄,要求首先輸入準(zhǔn)備輸入的記? 錄數(shù),然后輸入記錄。
????????3、顯示全部記錄:查看通訊錄中的所有記錄。
?? ????????????????1)設(shè)計(jì)規(guī)范的輸出格式
?? ????????????????2)輸出記錄,每輸出8個記錄暫停,按任意鍵再繼續(xù)輸出。
????????4、查找記錄(未排序)
?? ????????????????1)輸入查找的姓名
?? ????????????????2)采用順序查找法查找記錄
?? ????????????????3)如果沒有找到,則輸出提示信息
?????????????????? 4)找到聯(lián)系人后,顯示找到的記錄信息
????????5、刪除記錄
?????????????????? 1)輸入要刪除記錄的姓名
?????????????????? 2)如果沒有該記錄,顯示沒有找到的信息
?????????????????? 3)如果找到,顯示記錄信息
?????????????????? 4)提示“是否確實(shí)要刪除,請輸入確認(rèn)信息(Y///N)”
?????????????????? 5)如果輸入的是Y 或者y,則系統(tǒng)刪除該條記錄信息
????????6、插入信息
?????????????????? 1)輸入要插入的記錄
?????????????????? 2)找到新記錄的插入位置
?? ????????????????3)插入新紀(jì)錄,記錄數(shù)加1
????????7、文件保存
?? ????????????????1)將記錄保存到指定文件
?? ????????????????2)根據(jù)數(shù)據(jù)是否保存成功,給出提示信息
????????8、從文件中讀取記錄
?? ????????????????1)按指定文件將記錄讀入內(nèi)存
?????????????????? 2)根據(jù)是否讀取成功,給出提示信息
????????9、按序號查找記錄
?? ????????????????1)打開指定的文件,輸入查找的序號
?? ????????????????2)判斷查找的序號是否在文件記錄范圍內(nèi)
?? ????????????????3)若在,則找到該記錄并輸出
?? ????????????????4)關(guān)閉文件
????????10、排序:采用冒泡(選擇、插入)排序法,按姓名進(jìn)行排序
????????11、快速查找:?在已按姓名排序的記錄中,按照二分差戰(zhàn)法,用姓名作為檢索碼,實(shí)現(xiàn)快速查詢。
????????12、復(fù)制文件
?????????????????? 1)打開源文件、目標(biāo)文件
?????????????????? 2)將源文件中的記錄獨(dú)處,寫入目標(biāo)文件中
?? ????????????????3)關(guān)閉源文件、目標(biāo)文件。
層次結(jié)構(gòu)圖:
?代碼實(shí)現(xiàn):
#include<stdio.h> #include<stdlib.h> #include<string.h> #define M 50 typedef struct add{char name[20]; //姓名 char units[30]; //單位char tele[12]; //電話號碼應(yīng)大于11位,因字符型后有一個結(jié)尾符struct add * next;}Address;int enter(Address * head);//輸入記錄的函數(shù)void List(Address * head); //顯示記錄的函數(shù)void search(Address * head); //按姓名查找記錄void Delete(Address *head); //刪除記錄void add(Address *head); //插入記錄函數(shù)void save(Address *head); //將記錄保存到文件中int Load(Address *head); //從文件中讀取記錄函數(shù)void display(Address *head); //按序號查找顯示記錄函數(shù)void sort(Address *head); //按姓名排序//void qseek(Address t[], int n); //快速查找記錄函數(shù)void Copy(); //文件復(fù)制函數(shù)void print(Address temp); //顯示單條記錄int menu_select(); //主菜單函數(shù)int main(){int length;Address * head;head = (Address*)malloc(sizeof(Address));system("cls"); //清屏for (;;) {switch (menu_select()){case 0:length=enter(head ); break; //輸入記錄case 1: List(head); break; //顯示全部記錄case 2: search(head); break; //查找記錄case 3: Delete(head); break; //刪除記錄case 4: add(head); break; //插入記錄case 5: save(head); break; //保存文件case 6: length=Load(head); break; //讀文件case 7: display(head); break; //按序號顯示記錄case 8: sort(head); break; //按姓名排序case 9:Copy(); break; //復(fù)制文件case 10: exit(0); //程序結(jié)束}}return 0;}int menu_select(){char s[80];int c;printf("Press any key enter menu……\n");getchar();system("cls");printf("**********************************************\n\n");printf("| 0.輸入記錄 \n");printf("| 1.顯示全部記錄\n");printf("| 2.按姓名查找記錄\n");printf("| 3.刪除記錄\n");printf("| 4.插入記錄\n");printf("| 5.保存文件\n");printf("| 6.讀文件\n");printf("| 7.按序號顯示記錄\n");printf("| 8.按姓名排序\n");printf("| 9.復(fù)制文件\n");printf("| 10.退出\n");printf("**************************************\n");do{printf("\n 請選擇(0—11) :");scanf("%s", s);c=atoi(s); //將輸入的字符串轉(zhuǎn)化為整型數(shù)} while (c<0||c>11);return c;}int enter(Address * head){ int i, n;Address *p,*pr;pr = head;system("cls");printf("\n請輸入要輸入的記錄數(shù)\n");scanf("%d",&n);printf("請輸入記錄\n");printf("姓名 單位 電話號碼\n");printf("------------------------------------------------------------\n");for (i = 0; i<n; i++){p = (Address *)malloc(sizeof(Address));scanf("%s%s%s",p->name, p->units, p->tele);printf("--------------------------------------------------\n");pr->next =p;pr=p;}pr->next = NULL;return n;}void List(Address * head){int i=0;Address *p;p = head->next;system("cls");printf("\n\n--------------------開始---------------------------- - \n");printf("姓名 單位 電話號碼\n");printf("------------------------------------------------------------\n");while(p !=NULL){printf("\n%-20s%-30s%-12s\n",p->name,p->units,p->tele);p = p->next;i++;if (i % 10 == 0){ printf("按任意鍵繼續(xù)….\n");getchar();getchar();}}printf("************結(jié)束****************\n");getchar();}void search(Address * head){char s[20];Address *p;p =head->next;system("cls");printf("輸入待查姓名\n");scanf("%s",&s);while(p!=NULL){if(strcmp(s,p->name)==0){printf("%s\n%-20s%-30s%-12s\n",p->name,p->units,p->tele,s);p=p->next;}}}void Delete(Address *head){Address *p,*pr;char s[20];int ch=0;pr=head;p=head->next;printf("請輸入姓名\n");scanf("%s",s);while(p!=NULL){if(strcmp(s,p->name)==0){printf("你確定要刪除嗎(1 / 0)?\n");scanf("%d",&ch);if (ch == 1){pr->next=p->next;free(p);break;}}else{pr=p;p=p->next;}}}void add(Address *head){Address *temp,*p,*pr;char s[20];pr=head;p=pr->next;temp=(Address *)malloc(sizeof(Address));printf("請輸入記錄信息\n");printf("*********************************\n");printf("姓名 單位 電話號碼\n");printf("-------------------------------------------------------------- - \n");scanf("%s%s%s",temp->name, temp->units, temp->tele);printf("------------------------------------------------------------\n");printf("請輸入插入位置的姓名\n");scanf("%s", s);while(p != NULL){if(strcmp(s,p->name)!=0){pr=p;p=p->next;} else{temp->next=p;pr->next=temp;printf("插入成功");break;}}}void save(Address *head){FILE *fp;Address *p=head->next;fp=fopen("c:\\record.txt", "w");if (fp==NULL){printf("不能打開文件\n");exit(1);}printf("\n保存文件\n");while(p!=NULL){fprintf(fp, "%-20s % -30s % -12s",p->name, p->units,p->tele);p=p->next;}fclose(fp);printf("*******保存入c:\\record.txt文件成功*******\n");getchar();getchar();}int Load(Address *head){int n,ret;FILE *fp;Address *p,*pr=head;n=0;if((fp=fopen("c:\\record.txt","r")) == NULL){printf("不能打開文件\n");exit(1);}while(!feof(fp)){p = (Address *)malloc(sizeof(Address));ret=fscanf(fp, "%20s%30s%12s",p->name, p->units,p->tele);if(ret<3)break;pr->next=p;pr=p;n++;}pr->next=NULL;//按格式讀入文件fclose(fp);printf("你已成功從c:\\record.txt文件中讀入信息\n");getchar();getchar();return n;}void display(Address * head){int id, n,i=1;FILE *fp;Address *p;n=Load(head);p=head->next;if ((fp = fopen("c:\\record.txt","r")) == NULL){printf("不能打開文件\n");exit(1);}printf("請輸入序號\n");printf("共有%d個序號\n",n);scanf("%d", &id);if (id >= 1 && id<=n){ //判斷序號是否在記錄范圍內(nèi)while(id!=i){p=p->next;i++;}printf("姓名 單位 號碼\n");printf("%-20s%-30s%-12s\n",p->name, p->units,p->tele);//按格式讀入文件printf("\r\n");getchar();getchar();}elseprintf("無%d序號記錄\n", id);fclose(fp);}void sort(Address *head){int i, j,n=0, flag;Address temp,*pr,*p=head->next;while(p!=NULL){n++;p=p->next;}for (i = 0; i<n-1; i++){flag = 0;pr=head->next;p=pr->next;for (j = 0; j<n -i-1; j++){if ((strcmp(p->name,pr->name))>0){flag = 1;strcpy(temp.name,p->name);strcpy(temp.units,p->units);strcpy(temp.tele, p->tele);strcpy(p->name,pr->name);strcpy(p->units, pr->units);strcpy(p->tele,pr->tele); strcpy(pr->name, temp.name);strcpy(pr->units, temp.units);strcpy(pr->tele, temp.tele);}pr=p;p=p->next;}if (flag == 0)break;}printf("排序成功\n");}void Copy(){char outfile[20];Address temp;FILE *sfp, *tfp;system("cls");if ((sfp = fopen("c:\\record.txt","r")) == NULL){printf("打開文件失敗\n");exit(1);}printf("請輸入目標(biāo)文件名,例如 c : \\f1\\tt.txt\n");scanf("%s", outfile);if ((tfp = fopen(outfile, "w")) == NULL){printf("打開文件失敗\n");exit(1);}while(!feof(sfp)){fscanf(sfp, "%20s%30s%12s\n", temp.name, temp.units,temp.tele);fprintf(tfp, "%-20s%-30s%-12s\n", temp.name,temp.units, temp.tele);fprintf(tfp, "\r\n");}fclose(sfp);fclose(tfp);printf("復(fù)制文件成功\n");}總結(jié)
- 上一篇: 如何复制PDF文件中的文本和图片?
- 下一篇: php读取excel 报错_php读取e