/* * ContractManager.cc * * Created on: 2010-7-29 * Author: LiuFeng */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define INPUT_LINK_LENGTH 40 #define BUFSIZE 16 #define DBSIZE 100 typedef struct { int ID; char name[BUFSIZE]; char workPlace[BUFSIZE]; char teleOff[BUFSIZE]; char teleHome[BUFSIZE]; }*ADDRP, ADDRESS; ADDRESS addrTmp[DBSIZE], adTmp; int cntAddr = 0; const char * strFmt = "/n%d/t%s/t%s/t%s/t%s/n"; const char * fstrFmt = "%d %s %s %s %s /n"; // ------------------------------------------------------------------------------------------ // Utilities void inputItem(ADDRP itp) { printf("请输入ID:/n"); scanf("%d", &(itp->ID)); printf("请输入姓名:/n"); scanf("%s", itp->name); printf("请输入工作单位:/n"); scanf("%s", itp->workPlace); printf("请输入办公电话:/n"); scanf("%s", itp->teleOff); printf("请输入家庭电话:/n"); scanf("%s", itp->teleHome); }; void outputItem(ADDRP itemp) { printf(strFmt, itemp->ID, itemp->name, itemp->workPlace, itemp->teleOff,itemp->teleHome); }; void list(ADDRESS addr[], int length) { for (int i = 0; i < length; ++i) outputItem(&addr[i]); } // ------------------------------------------------------------------------------------------ // Sorted Display void idsort(ADDRESS addr[]) { for (int i = 0; i < cntAddr; ++i) addrTmp[i] = addr[i]; for (int i = 0; i < cntAddr - 1; ++i) for (int j = i + 1; j < cntAddr; ++j) if (addrTmp[i].ID > addrTmp[j].ID) { adTmp = addrTmp[i]; addrTmp[i] = addrTmp[j]; addrTmp[j] = adTmp; } list(addrTmp, cntAddr); }; void namesort(ADDRESS addr[], int length) { for (int i = 0; i < length; ++i) addrTmp[i] = addr[i]; for (int i = 0; i < length - 1; ++i) for (int j = i + 1; j < length; ++j) if (strcmp(addrTmp[i].name, addrTmp[j].name) > 0) { adTmp = addrTmp[i]; addrTmp[i] = addrTmp[j]; addrTmp[j] = adTmp; } list(addrTmp, length); }; void unitssort(ADDRESS addr[], int length) { for (int i = 0; i < length; ++i) addrTmp[i] = addr[i]; for (int i = 0; i < length - 1; ++i) for (int j = i + 1; j < length; ++j) if (strcmp(addrTmp[i].workPlace, addrTmp[j].workPlace) > 0) { adTmp = addrTmp[i]; addrTmp[i] = addrTmp[j]; addrTmp[j] = adTmp; } list(addrTmp, length); }; // ------------------------------------------------------------------------------------------ // Search void namesearch(ADDRESS adr[], int length) { char in[BUFSIZE]; printf("请输入姓名:/n"); scanf("%s", in); for (int i = 0; i < length; ++i) if (strcmp(adr[i].name, in) == 0) outputItem(&adr[i]); }; void unitssearch(ADDRESS adr[], int length) { char in[BUFSIZE]; printf("请输入工作单位:/n"); scanf("%s", in); for (int i = 0; i < length; ++i) if (strcmp(adr[i].workPlace, in) == 0) outputItem(&adr[i]); }; void officenumbersearch(ADDRESS adr[], int length) { char in[BUFSIZE]; printf("请输入办公电话:/n"); scanf("%s", in); for (int i = 0; i < length; ++i) if (strcmp(adr[i].teleOff, in) == 0) outputItem(&adr[i]); }; void homenumbersearch(ADDRESS adr[], int length) { char in[BUFSIZE]; printf("请输入家庭电话:/n"); scanf("%s", in); for (int i = 0; i < length; ++i) if (strcmp(adr[i].teleHome, in) == 0) outputItem(&adr[i]); }; // ------------------------------------------------------------------------------------------ // Delete int delet(ADDRESS adr[], int length) { int j; printf("要修改第几条记录:/n"); scanf("%d", &j); --j; for (int i = j; i < length - 1; ++i) adr[i] = adr[i + 1]; return --cntAddr; }; // ------------------------------------------------------------------------------------------ // Modify void rewrite(ADDRESS adr[]) { int j; printf("要修改第几条记录:/n"); scanf("%d", &j); inputItem(&adr[j]); }; // ------------------------------------------------------------------------------------------ // Add int add(ADDRESS adr[], int last) { inputItem(&adr[++cntAddr]); return cntAddr; }; int enter(ADDRESS adr[]) { while (1) { inputItem(&adr[cntAddr++]); printf("/n输入下一条?Y/N:"); fflush( stdin); char quitChar = getchar(); if ('N' == quitChar || 'n' == quitChar) break; } return cntAddr; }; // ------------------------------------------------------------------------------------------ // file I/O int load(ADDRESS adr[]) { FILE *fp; if ((fp = fopen("D://ConData.dat", "r+")) != NULL) { cntAddr = 0; while (!feof(fp)) { fscanf(fp, fstrFmt, &(adr[cntAddr].ID), adr[cntAddr].name,adr[cntAddr].workPlace, adr[cntAddr].teleOff,adr[cntAddr].teleHome); ++cntAddr; } } fclose(fp); return cntAddr; }; void display(ADDRESS* addr) { list(addr, cntAddr); }; void save(ADDRESS adr[], int length) { FILE *fp = fopen("D://ConData.dat", "w+"); for (int i = 0; i < cntAddr; ++i) fprintf(fp, fstrFmt, adr[i].ID, adr[i].name, adr[i].workPlace,adr[i].teleOff, adr[i].teleHome); fclose(fp); }; void copy(void) { char in[BUFSIZE]; FILE *fp, *fc; printf("请输入新文件名(路径中的反斜杠用//表示)/n"); scanf("%s", in); if ((fp = fopen("D://ConData.dat", "r+")) != NULL) { fc = fopen(in, "w"); while (!feof(fp)) { fscanf(fp, fstrFmt, &(adTmp.ID), adTmp.name, adTmp.workPlace,adTmp.teleOff, adTmp.teleHome); fprintf(fc, fstrFmt, adTmp.ID, adTmp.name, adTmp.workPlace,adTmp.teleOff, adTmp.teleHome); } fclose(fc); } fclose(fp); }; // ------------------------------------------------------------------------------------------ // Menu void showpaixu(ADDRESS adr[], int length) { int choice; menu1: system("cls"); printf("/n/n/n/n *************************通讯录信息管理系统*************************/n/n"); printf(" 1. 全部显示通讯录信息/n/n"); printf(" 2. 按序号显示通讯录信息/n/n"); printf(" 3. 按姓名排序/n/n"); printf(" 4. 按工作单位排序/n/n"); printf(" 0. 返回上一级菜单/n/n"); printf(" ********************************************************************/n"); printf(" 请选择(0~4)/n "); scanf("%d", &choice); switch (choice) { case 1: display(adr); system("pause"); break; case 2: idsort(adr); system("pause"); break; case 3: namesort(adr, length); system("pause"); break; case 4: unitssort(adr, length); system("pause"); break; case 0: return; default: printf("输入选项有误,请重新输入(0-4):"); system("pause"); break; } goto menu1; }; void chazhao(ADDRESS adr[], int length) { int choice; menu2: system("cls"); printf("/n/n/n/n *************************通讯录信息管理系统*************************/n/n"); printf(" 1. 通过姓名查找/n/n"); printf(" 2. 通过工作单位查找/n/n"); printf(" 3. 通过办公电话查找/n/n"); printf(" 4. 通过家庭电话查找/n/n"); printf(" 0. 返回上一级菜单/n/n"); printf(" ********************************************************************/n"); printf(" 请选择(0~4)/n "); scanf("%d", &choice); switch (choice) { case 1: namesearch(adr, length); system("pause"); break; case 2: unitssearch(adr, length); system("pause"); break; case 3: officenumbersearch(adr, length); system("pause"); break; case 4: homenumbersearch(adr, length); system("pause"); break; case 0: return; default: printf("输入选项有误,请重新输入(0-4):"); system("pause"); break; } goto menu2; }; void biangeng(ADDRESS adr[], int length) { int choice; menu3: system("cls"); printf("/n/n/n/n *************************通讯录信息管理系统*************************/n/n"); printf(" 1. 删除记录/n/n"); printf(" 2. 修改记录/n/n"); printf(" 3. 添加记录/n/n"); printf(" 0. 返回上一级菜单/n/n"); printf(" ********************************************************************/n"); printf(" 请选择(0~3)/n "); scanf("%d", &choice); switch (choice) { case 1: length = delet(adr, length); save(adr, length); getchar(); break; case 2: rewrite(adr); save(adr, length); break; case 3: length = add(adr, length); save(adr, length); getchar(); break; case 0: return; default: printf("输入选项有误,请重新输入(0-3):"); system("pause"); break; } goto menu3; }; int wenjian(ADDRESS adr[], int length) { int choice; menu4: system("cls"); printf("/n/n/n/n *************************通讯录信息管理系统*************************/n/n"); printf(" 1. 导入通讯录到内存/n/n"); printf(" 2. 把当前文件复制到新文件上/n/n"); printf(" 0. 返回上一级菜单/n/n"); printf(" ********************************************************************/n"); printf(" 请选择(0~2)/n "); scanf("%d", &choice); switch (choice) { case 1: length = load(adr); printf("您已经成功的导入通讯录文件到内存!/n"); system("pause"); break; case 2: copy(); printf("复制成功!/n"); system("pause"); break; case 0: return length; default: printf("输入选项有误,请重新输入(0-2):"); system("pause"); break; } goto menu4; }; void about() { system("color 87"); system("cls"); printf("/n/n/n/n 《通讯录信息管理系统》/n/n/n"); printf(" *****************************************/n/n/n"); printf(" 版权所有(C) 2010-2011 /n/n/n"); printf(" 制作人:/n/n/n"); printf(" *****************************************/n/n/n"); system("pause"); }; int main(void) { int choice; int length = 0; ADDRESS adr[DBSIZE]; length = load(adr); menu: system("color f9"); system("cls"); printf("/n/n/n/n *************************通讯录信息管理系统*************************/n/n"); printf(" 请选择以下通讯录管理功能:/n/n"); printf(" 1. 通讯录信息输入/n/n"); printf(" 2. 通讯录信息浏览及排序/n/n"); printf(" 3. 通讯录信息查询/n/n"); printf(" 4. 通讯录信息更改/n/n"); printf(" 5. 通讯录及文件操作/n/n"); printf(" 6. 关于通讯录信息管理系统/n/n"); printf(" 0. 退出通讯录信息管理系统/n/n"); printf(" ********************************************************************/n"); printf(" 请选择(0~6)/n "); scanf("%d", &choice); switch (choice) { case 1: length += enter(adr); save(adr, length); system("pause"); break; case 2: showpaixu(adr, length); break; case 3: chazhao(adr, length); break; case 4: biangeng(adr, length); break; case 5: length = wenjian(adr, length); break; case 6: about(); break; case 0: return 0; default: printf("输入选项有误,请重新输入(0-6):"); system("pause"); break; } goto menu; return 0; };