c语言综合练习二
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
#include "string.h"
#include "conio.h" //包含這個getch()方法
#define M 50
using namespace std;
typedef struct
{
?? char name[20]; /*姓名*/
?? char sex[10]; /*性別*/
?? char birth[15]; /*出生年月*/
?? char units[30]; /*工作單位*/
?? char studylevel[20]; /*學歷*/
?? char officenumber[15]; /*辦公電話*/
?? char homenumber[15]; /*住宅電話*/
?? char homeaddress[30]; /*家庭住址*/
}ADDRESS;
?
/*顯示指定的一條記錄*/
void mprint(ADDRESS temp)
{
?? printf("\n****************************************************************************\n");
?? printf(" 姓名 性別 出生年月 工作單位 學歷 辦公電話 住宅電話 家庭住址\n");
?? printf("----------------------------------------------------------------------------\n");
?? printf("%-8s%4s%13s%8s%7s%12s%12s%8s\n",temp.name,temp.sex,temp.birth,temp.units,
????????? temp.studylevel,temp.officenumber,temp.homenumber,temp.homeaddress);
?? printf("*********************************end****************************************\n");
}
?
/*輸入記錄,形參為結構體數組,函數值返回類型為整型表示記錄長度*/
int enter(ADDRESS t[])
{
?? int i,n;
?? system("cls");
?? printf("********************************************************************************\n");
?? printf("請確定您要輸入的記錄數\n"); /*提示信息*/
?? scanf("%d",&n); /*輸入記錄數*/
?? if(n>0)
?? {
??????? printf("請輸入您的通訊錄記錄\n\n"); /*提示輸入記錄*/
?????? printf(" 姓名 性別 出生年月 工作單位 學歷 辦公電話 住宅電話 家庭住址\n");
?????? printf("--------------------------------------------------------------------------\n");
?????? for(i=0;i<n;i++)
??????? {
??????? scanf("%s%s%s%s%s%s%s%s",t[i].name,t[i].sex,t[i].birth,t[i].units,
????????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress); /*輸入記錄*/
??????? printf("-------------------------------------------------------------------------\n");
??????? }
?????? printf("信息錄入成功!");
?????? return n; /*返回記錄條數*/
?? }
?? if(n<=0) printf("對不起,您輸入的記錄數不正確\n");exit(0);
}
?
/*顯示記錄,參數為記錄數組和記錄條數*/
void list(ADDRESS t[],int n)
{
??? int i;
?? system("cls");
?? printf("\n*********************************通訊錄***********************************\n");
?? printf(" 總共有%d 條記錄 \n",n);
?? printf(" 姓名 性別 出生年月 工作單位 學歷 辦公電話 住宅電話 家庭住址\n");
?? printf("--------------------------------------------------------------------------\n");
?? for(i=0;i<n;i++)
?? {
???????? printf("%-8s%4s%13s%8s%7s%12s%12s%8s\n",t[i].name,t[i].sex,t[i].birth,t[i].units,
????????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress);
???????? if((i+1)%10==0)
???????? {
????????????? printf("請輸入任意鍵繼續....\n");
????????????? getchar();
???????? }
?? }
?? printf("**********************************結束************************************\n");
}
?
/*按姓名查找函數,參數為記錄數組和記錄條數以及姓名s */
int namefind(ADDRESS t[],int n,char *s)
{
?? int i;
?? for(i=0;i<n;i++)/*從第一條記錄開始,直到最后一條*/
?? {
????? if(strcmp(s,t[i].name)==0) /*記錄中的姓名和待比較的姓名是否相等*/
?????? return i; /*相等,則返回該記錄的下標號,程序提前結結束*/
?? }
?? return i; /*返回i值*/
}
?
/*按辦公電話查找函數,參數為記錄數組和記錄條數以及辦公電話s */
int officenumberfind(ADDRESS t[],int n,char *s)
{
?? int i;
?? for(i=0;i<n;i++)/*從第一條記錄開始,直到最后一條*/
?? {
????? if(strcmp(s,t[i].officenumber)==0) /*記錄中的辦公電話和待比較的辦公電話是否相等*/
?????? return i; /*相等,則返回該記錄的下標號,程序提前結結束*/
?? }
?? return i; /*返回i值*/
}
/*按住宅電話查找函數,參數為記錄數組和記錄條數以及住宅電話s */
int homenumberfind(ADDRESS t[],int n,char *s)
{
?? int i;
?? for(i=0;i<n;i++)/*從第一條記錄開始,直到最后一條*/
?? {
????? if(strcmp(s,t[i].homenumber)==0) /*記錄中的住宅電話和待比較的住宅電話是否相等*/
?????? return i; /*相等,則返回該記錄的下標號,程序提前結結束*/
?? }
?? return i; /*返回i值*/
}
?
/*刪除記錄函數,參數為記錄數組和記錄條數*/
int delet(ADDRESS t[],int n)
{
?? char s[20]; /*要刪除記錄的姓名*/
?? int ch=0;
?? int i,j;
?? printf("請輸入您要刪除的記錄的姓名\n"); /*提示信息*/
?? scanf("%s",s);/*輸入姓名*/
?? i=namefind(t,n,s); /*調用namefind函數*/
?? if(i>n-1) /*如果i>n-1超過了數組的長度*/
????? printf("對不起,沒有找到要刪除的記錄!\n"); /*顯示沒找到要刪除的記錄*/
?? else
?? {
????? mprint(t[i]); /*調用輸出函數顯示該條記錄信息*/
????? printf("您確認要刪除該條記錄么?(1.是/0.否)\n"); /*確認是否要刪除*/
????? scanf("%d",&ch); /*輸入一個整數或*/
????? if(ch==1) /*如果確認刪除整數*/
????? {
????? for(j=i+1;j<n;j++) /*刪除該記錄,實際后續記錄前移*/
????? {
???????? strcpy(t[j-1].name,t[j].name); /*將后一條記錄的姓名拷貝到前一條*/
???????? strcpy(t[j-1].sex,t[j].sex); /*將后一條記錄的性別拷貝到前一條*/
???????? strcpy(t[j-1].birth,t[j].birth); /*將后一條記錄的生日拷貝到前一條*/
???????? strcpy(t[j-1].units,t[j].units); /*將后一條記錄的工作單位拷貝到前一條*/
???????? strcpy(t[j-1].studylevel,t[j].studylevel); /*將后一條記錄的學歷拷貝到前一條*/
???????? strcpy(t[j-1].officenumber,t[j].officenumber); /*將后一條記錄的辦公電話拷貝到前一條*/
???????? strcpy(t[j-1].homenumber,t[j].homenumber); /*將后一條記錄的住宅電話拷貝到前一條*/
???????? strcpy(t[j-1].homeaddress,t[j].homeaddress); /*將后一條記錄的家庭地址拷貝到前一條*/
????? }
????? n--; /*記錄數減*/
????? printf("記錄刪除成功!\n");
????? }
?? }
?? return n; /*返回記錄數*/
}
?
/*修改記錄函數,參數為記錄數組和記錄條數*/
void rewrite(ADDRESS t[],int n)
{
?? char s[20]; /*要修改記錄的姓名*/
?? int ch=0;
?? int i;
?? printf("請輸入您要修改的通訊錄的姓名:\n"); /*提示信息*/
?? scanf("%s",s);/*輸入姓名*/
?? i=namefind(t,n,s); /*調用namefind函數*/
?? if(i>n-1) /*如果i>n-1超過了數組的長度*/
????? printf("對不起,沒有找到要修改的記錄!\n"); /*顯示沒找到要修改的記錄*/
?? else
?? {
????? mprint(t[i]); /*調用輸出函數顯示該條記錄信息*/
????? printf("您確定要修改這條記錄么?(1.是/0.否)\n"); /*確認是否要修改*/
????? scanf("%d",&ch); /*輸入一個整數或*/
????? if(ch==1) /*如果確認修改整數為*/
?????? {
?????????? printf("請輸入新的記錄\n");
????????? printf("*************************************************************************");
????????? printf(" 姓名 性別 出生年月 工作單位 學歷 辦公電話 住宅電話 家庭住址\n");
????????? printf("---------------------------------------------------------------------------\n");
????????? scanf("%s%s%s%s%s%s%s%s",t[i].name,t[i].sex,t[i].birth,t[i].units,
??????????????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress); /*輸入修改信息*/
????????? printf("---------------------------------------------------------------------------\n");
?????????? printf("記錄修改成功!\n");
?????? }
?? }
}
?
/*插入記錄函數,參數為結構體數組和記錄數*/
int add(ADDRESS t[],int n) /*插入函數,參數為結構體數組和記錄數*/
{
?? ADDRESS temp; /*新插入記錄信息*/
?? int i,j;
?? char s[20]; /*確定插入在哪個記錄之前*/
?? printf("請輸入您要插入的記錄\n");
?? printf("***************************************************************************\n");
?? printf(" 姓名 性別 出生年月 工作單位 學歷 辦公電話 住宅電話 家庭住址\n");
?? printf("---------------------------------------------------------------------------\n");
?? scanf("%s%s%s%s%s%s%s%s",temp.name,temp.sex,temp.birth,temp.units,
????????? temp.studylevel,temp.officenumber,temp.homenumber,temp.homeaddress); /*輸入插入信息*/
?? printf("---------------------------------------------------------------------------\n");
?? printf("請輸入您要插入位置的姓名\n");
?? scanf("%s",s); /*輸入插入位置的姓名*/
?? i=namefind(t,n,s); /*調用namefind,確定插入位置*/
?
?? for(j=n-1;j>=i;j--) /*從最后一個結點開始向后移動一條*/
?? {
????? strcpy(t[j+1].name,t[j].name); /*當前記錄的姓名拷貝到后一條*/
????? strcpy(t[j+1].sex,t[j].sex); /*當前記錄的性別拷貝到后一條*/
????? strcpy(t[j+1].birth,t[j].birth); /*當前記錄的出生年月拷貝到后一條*/
????? strcpy(t[j+1].units,t[j].units); /*當前記錄的單位拷貝到后一條*/
????? strcpy(t[j+1].studylevel,t[j].studylevel); /*當前記錄的出生年月拷貝到后一條*/
????? strcpy(t[j+1].officenumber,t[j].officenumber); /*當前記錄的辦公電話拷貝到后一條*/
????? strcpy(t[j+1].homenumber,t[j].homenumber); /*當前記錄的住宅電話拷貝到后一條*/
????? strcpy(t[j+1].homeaddress,t[j].homeaddress); /*當前記錄的家庭地址拷貝到后一條*/
?? }
????? strcpy(t[j].name,temp.name); /*將新插入記錄的姓名拷貝到第i個位置*/
????? strcpy(t[j].sex,temp.sex); /*將新插入記錄的性別拷貝到第i個位置*/
????? strcpy(t[j].birth,temp.birth);/*將新插入記錄的出生年月拷貝到第i個位置*/
????? strcpy(t[j].units,temp.units); /*將新插入記錄的單位拷貝到第i個位置*/
????? strcpy(t[j].studylevel,temp.studylevel);/*將新插入記錄的學歷拷貝到第i個位置*/
????? strcpy(t[j].officenumber,temp.officenumber);/*將新插入記錄的辦公電話拷貝到第i個位置*/
????? strcpy(t[j].homenumber,temp.homenumber);/*將新插入記錄的住宅電話拷貝到第i個位置*/
????? strcpy(t->homeaddress,temp.homeaddress);/*將新插入記錄的家庭地址拷貝到第i個位置*/
????? n++; /*記錄數加*/
????? printf("記錄插入成功!\n");
?????? return n; /*返回記錄數*/
}
?
/*保存函數,參數為結構體數組和記錄數*/
void save(ADDRESS t[],int n)
{
?? int i;
?? FILE *fp; /*指向文件的指針*/
?? if((fp=fopen("record.txt","wb"))==NULL) /*打開文件,并判斷打開是否正常*/
?? {
????? printf("文件不能打開!\n");/*沒打開*/
????? exit(1); /*退出*/
?? }
?? fprintf(fp,"%d",n); /*將記錄數寫入文件*/
?? fprintf(fp,"\r\n"); /*將換行符號寫入文件*/
?? for(i=0;i<n;i++)
?? {
????? fprintf(fp,"%-8s%4s%13s%8s%7s%12s%12s%8s",t[i].name,t[i].sex,t[i].birth,t[i].units,
????????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress);/*格式寫入記錄*/
????? fprintf(fp,"\r\n"); /*將換行符號寫入文件*/
?? }
?? fclose(fp);/*關閉文件*/
}
?
/*讀入函數,參數為結構體數組*/
int load(ADDRESS t[])
{
?? int i,n;
?? FILE *fp; /*指向文件的指針*/
?? if((fp=fopen("record.txt","rb"))==NULL)/*打開文件*/
?? {
????? printf("對不起,不能打開文件!\n"); /*不能打開*/
????? exit(1); /*退出*/
?? }
?? fscanf(fp,"%d",&n); /*讀入記錄數*/
?? for(i=0;i<n;i++)
????? fscanf(fp,"%s%s%s%s%s%s%s%s",t[i].name,t[i].sex,t[i].birth,t[i].units,
????????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress); /*按格式讀入記錄*/
?? fclose(fp); /*關閉文件*/
?? return n; /*返回記錄數*/
}
?
/*按序號顯示記錄函數*/
void display(ADDRESS t[])
{
?? int id,n=0;
?? FILE *fp; /*指向文件的指針*/
?? if((fp=fopen("record.txt","rb"))==NULL) /*打開文件*/
?? {
????? printf("對不起,不能打開文件!\n"); /*不能打開文件*/
????? exit(1); /*退出*/
?? }
?? printf("請輸入您要查找的序號...\n"); /*顯示信息*/
?? scanf("%d",&id); /*輸入序號*/
?? fscanf(fp,"%d",&n); /*從文件讀入記錄數*/
?? if((id>=0)&&(id<n)) /*判斷序號是否在記錄范圍內*/
?? {
????? fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移動文件指針到該記錄位置*/
????? mprint(t[id]); /*調用輸出函數顯示該記錄*/
????? printf("\r\n");
?? }
?? else
????? printf("對不起,你要查詢的序號不存在!\n通訊錄內共有%d 條記錄!\n ",id); /*如果序號不合理顯示信息*/
?? fclose(fp); /*關閉文件*/
}
?
/*按姓名排序函數,參數為結構體數組和記錄數*/
void namesort(ADDRESS t[],int n)
{
?? int i,j,flag;
?? ADDRESS temp; /*臨時變量做交換數據用*/
?? for(i=0;i<n;i++)
?? {
????? flag=0; /*設標志判斷是否發生過交換*/
????? for(j=0;j<n-1;j++)
????? if((strcmp(t[j].name,t[j+1].name))>0) /*比較大小*/
????? {
????? flag=1;
????? strcpy(temp.name,t[j].name); /*交換記錄*/
????? strcpy(temp.sex,t[j].sex);
????? strcpy(temp.birth,t[j].birth);
????? strcpy(temp.units,t[j].units);
????? strcpy(temp.studylevel,t[j].studylevel);
????? strcpy(temp.officenumber,t[j].officenumber);
????? strcpy(temp.homenumber,t[j].homenumber);
????? strcpy(temp.homeaddress,t[j].homeaddress);
????? strcpy(t[j].name,t[j+1].name);
????? strcpy(t[j].sex,t[j+1].sex);
????? strcpy(t[j].birth,t[j+1].birth);
????? strcpy(t[j].units,t[j+1].units);
????? strcpy(t[j].studylevel,t[j+1].studylevel);
????? strcpy(t[j].officenumber,t[j+1].officenumber);
????? strcpy(t[j].homenumber,t[j+1].homenumber);
????? strcpy(t[j].homeaddress,t[j+1].homeaddress);
????? strcpy(t[j+1].name,temp.name);
????? strcpy(t[j+1].sex,temp.sex);
????? strcpy(t[j+1].birth,temp.birth);
????? strcpy(t[j+1].units,temp.units);
????? strcpy(t[j+1].studylevel,temp.studylevel);
????? strcpy(t[j+1].officenumber,temp.officenumber);
????? strcpy(t[j+1].homenumber,temp.homenumber);
????? strcpy(t[j+1].homeaddress,temp.homeaddress);
????? }
????? if(flag==0)break; /*如果標志為,說明沒有發生過交換循環結束*/
?? }
?? printf("按姓名排序成功!\n"); /*顯示排序成功*/
}
?
/*按工作單位排序函數,參數為結構體數組和記錄數*/
void unitssort(ADDRESS t[],int n)
{
?? int i,j,flag;
?? ADDRESS temp; /*臨時變量做交換數據用*/
?? for(i=0;i<n;i++)
?? {
????? flag=0; /*設標志判斷是否發生過交換*/
????? for(j=0;j<n-1;j++)
????? if((strcmp(t[j].units,t[j+1].units))>0) /*比較大小*/
????? {
????? flag=1;
????? strcpy(temp.name,t[j].name); /*交換記錄*/
????? strcpy(temp.sex,t[j].sex);
????? strcpy(temp.birth,t[j].birth);
????? strcpy(temp.units,t[j].units);
????? strcpy(temp.studylevel,t[j].studylevel);
????? strcpy(temp.officenumber,t[j].officenumber);
????? strcpy(temp.homenumber,t[j].homenumber);
????? strcpy(temp.homeaddress,t[j].homeaddress);
????? strcpy(t[j].name,t[j+1].name);
????? strcpy(t[j].sex,t[j+1].sex);
????? strcpy(t[j].birth,t[j+1].birth);
????? strcpy(t[j].units,t[j+1].units);
????? strcpy(t[j].studylevel,t[j+1].studylevel);
????? strcpy(t[j].officenumber,t[j+1].officenumber);
????? strcpy(t[j].homenumber,t[j+1].homenumber);
????? strcpy(t[j].homeaddress,t[j+1].homeaddress);
????? strcpy(t[j+1].name,temp.name);
????? strcpy(t[j+1].sex,temp.sex);
????? strcpy(t[j+1].birth,temp.birth);
????? strcpy(t[j+1].units,temp.units);
????? strcpy(t[j+1].studylevel,temp.studylevel);
????? strcpy(t[j+1].officenumber,temp.officenumber);
????? strcpy(t[j+1].homenumber,temp.homenumber);
????? strcpy(t[j+1].homeaddress,temp.homeaddress);
????? }
????? if(flag==0)break; /*如果標志為,說明沒有發生過交換循環結束*/
?? }
?? printf("按工作單位排序成功!\n"); /*顯示排序成功*/
}
?
/*復制文件*/
void copy()
{
?? char outfile[20]; /*目標文件名*/
?? int i,n;
?? ADDRESS t[100]; /*定義臨時變量*/
?? FILE *sfp,*tfp; /*定義指向文件的指針*/
?? if((sfp=fopen("record.txt","rb"))==NULL) /*打開記錄文件*/
?? {
????? printf("對不起,不能打開您所需要的文件!\n"); /*顯示不能打開文件信息*/
????? exit(1); /*退出*/
?? }
?? printf("請輸入目標文件名,例如:c:\\f1\\te.txt:\n"); /*提示信息*/
?? scanf("%s",outfile); /*輸入目標文件名*/
?? if((tfp=fopen(outfile,"wb"))==NULL) /*打開目標文件*/
?? {
????? printf("對不起,不能打開您所需要的文件!\n"); /*顯示不能打開文件信息*/
????? exit(1); /*退出*/
?? }
?? fscanf(sfp,"%d",&n); /*讀出文件記錄數*/
?? fprintf(tfp,"%d",n);/*寫入目標文件數*/
?? fprintf(tfp,"\r\n"); /*寫入換行符*/
?? for(i=0;i<n;i++)
?? {
????? fscanf(sfp,"%s%s%s%s%s%s%s%s",t[i].name,t[i].sex,t[i].birth,t[i].units,
???????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress); /*讀入記錄*/
????? fprintf(tfp,"%-8s%4s%13s%8s%7s%12s%12s%8s",t[i].name,t[i].sex,t[i].birth,t[i].units,
????????? t[i].studylevel,t[i].officenumber,t[i].homenumber,t[i].homeaddress); /*寫入記錄*/
????? fprintf(tfp,"\r\n"); /*寫入換行符*/
?? }
?? fclose(sfp); /*關閉源文件*/
?? fclose(tfp); /*關閉目標文件*/
}
?
/*按姓名查找記錄*/
void namesearch(ADDRESS t[],int n)
{
? char s[20]; /*保存待查找姓名字符串*/
? int i; /*保存查找到結點的序號*/
? printf("請輸入您要查找的姓名\n");
? scanf("%s",s); /*輸入待查找姓名*/
? for(i=0;i<n;i++)
? {
?????? if(strcmp(s,t[i].name)==0)
?????? {
?????? if(i==n)
???????? printf("對不起,沒有找到您所需要的記錄!\n");
????? else
?????????? mprint(t[i]); /*找到,調用顯示函數顯示記錄*/
?????? }
? }
}
?
/*按工作單位查找記錄*/
void unitssearch(ADDRESS t[],int n)
{
? char s[30]; /*保存待查找工作單位字符串*/
? int i; /*保存查找到結點的序號*/
? printf("請輸入您要查找的工作單位\n");
? scanf("%s",s); /*輸入待查找工作單位*/
? for(i=0;i<n;i++)
? {
?????? if(strcmp(s,t[i].units)==0)
?????? {
?????? if(i==n)
???????? printf("對不起,沒有找到您所需要的記錄!\n");
????? else
?????????? mprint(t[i]); /*找到,調用顯示函數顯示記錄*/
?????? }
? }
}
?
/*按辦公電話電話查找記錄*/
void officenumbersearch(ADDRESS t[],int n)
{
? char s[15]; /*保存待查找辦公電話字符串*/
? int i; /*保存查找到結點的序號*/
? printf("請輸入您要查找的辦公電話\n");
? scanf("%s",s); /*輸入待查找辦公電話*/
? i=officenumberfind(t,n,s);/* 調用officenumberfind函數,得到一個整數*/
? if(i==n)
????? printf("對不起,沒有找到您需要的記錄!\n");
? else
????? mprint(t[i]); /*找到,調用顯示函數顯示記錄*/
}
?
/*按住宅電話電話查找記錄*/
void homenumbersearch(ADDRESS t[],int n)
{
? char s[15]; /*保存待查找住宅電話字符串*/
? int i; /*保存查找到結點的序號*/
? printf("請輸入您要查找的住宅電話\n");
? scanf("%s",s); /*輸入待查找住宅電話*/
? i=homenumberfind(t,n,s);/* 調用homenumberfind函數,得到一個整數*/
if(i==n)
????? printf("對不起,沒有找到您需要的記錄!\n");
else
????? mprint(t[i]); /*找到,調用顯示函數顯示記錄*/
}
?
/*通訊錄信息瀏覽及排序功能*/
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: length=load(adr);
???????????? list(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
??????????? break; /*顯示全部記錄*/
???? case 2: length=load(adr);
???????????? display(adr);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();break; /*按序號顯示記錄*/
???? case 3: length=load(adr);
???????????? namesort(adr,length);
????????????? save(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*按姓名排序*/
???? case 4: length=load(adr);
???????????? unitssort(adr,length);
???????????? save(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
???????????? break; /*按工作單位排序*/
???? case 0: return;
?? }
?? 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: length=load(adr);
???????????? namesearch(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*按姓名查找記錄*/
???? case 2: length=load(adr);
????????????? unitssearch(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
???????????? break; /*按工作單位查找記錄*/
???? case 3: length=load(adr);
???????????? officenumbersearch(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*按辦公電話查找記錄*/
???? case 4: length=load(adr);
???????????? homenumbersearch(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*按住宅電話查找記錄*/
???? case 0: return;
?? }
?? 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=load(adr);
???????????? length=delet(adr,length);
????????????? save(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*刪除記錄*/
???? case 2: length=load(adr);
???????????? rewrite(adr,length);
????????????? save(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*修改記錄*/
???? case 3: length=load(adr);
???????????? length=add(adr,length);
????????????? save(adr,length);
????????????? printf(" 請按任意鍵返回...\n");
??????????? getch();
????????????? break; /*插入記錄*/
???? case 0: return;
?? }
?? goto menu3;
}
?
/*通訊錄及文件操作功能*/
void 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");
??????????? printf(" 請按任意鍵返回...\n");
??????????? getch();break;
???? case 2: copy();
???????????? printf("復制成功!\n");
??????????? printf(" 請按任意鍵返回...\n");
??????????? getch();break;
???? case 0: return;
?? }
?? goto menu4;
}
?
/*關于*/
void about()
{
???? system("color 87");
???? system("cls");
???? printf("\n\n\n\n 《通訊錄信息管理系統》\n\n\n");
???? printf(" *****************************************\n\n\n");???
????
???? printf(" *****************************************\n\n\n");
???? printf(" 請按任意鍵返回主菜單...");
???? getch();
}
?
/******主函數開始*******/
int _tmain(int argc, _TCHAR* argv[])
{
??? int choice;
??? int length; /*保存記錄長度*/
??? ADDRESS adr[100]; /*定義結構體數組*/
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 0: exit(0); /*如返回值為則程序結束*/
??????? case 1: length=enter(adr);
??????????????? save(adr,length);
??????????????? printf("\n 請按任意鍵返回...\n");
?????????????? getch();break;/*輸入記錄*/
??????? case 2: showpaixu(adr,length);break;
??????? case 3: chazhao(adr,length);break;
??????? case 4: biangeng(adr,length);break;
??????? case 5: wenjian(adr,length);break;
??????? case 6: about();break;/*關于*/
????? }
????? goto menu;
}
// 功能:打印表格線
// 參數:
// location 表格線的位置, 0 表頭線,1 表中線,2 表尾線
// colCount 表格的列數
// colWidth 表格的列寬
/
void PrintTableLine(int location, int colCount, int colWidth)
{
?//注意:這些是中文符號,所以要用3個字符裝(包括/0)
?char lineHead[][3] = {"┌", "├", "└"};
?char lineMid1[][3] = {"─", "─", "─"};
?char lineMid2[][3] = {"┬", "┼", "┴"};
?char lineTail[][3] = {"┐", "┤", "┘"};
?cout << lineHead[location]; //行首
?for (int i = 0; i < colCount; i++)
?{
??for (int j = 0; j < colWidth/2; j++)
??{
???cout << lineMid1[location];
??}
??if (i < colCount - 1) cout << lineMid2[location];
?}
?cout << lineTail[location] << endl; //行尾
}
/
// 功能:獲取指定二維數組中的最大顯示寬度
// 參數:A 二維數組名,rowCount 行數,colCount 列數
/
int GetMaxWidth(int* A, int rowCount, int colCount)
{
?int width = 0;
?for (int i = 0; i < rowCount; i++)
?{
??for (int j = 0; j < colCount; j++)
??{
???int c = 1;
???int temp = A[i*rowCount+j];
???while (temp)
???{
????temp /= 10;
????c++;
???}
???width = width < c ? c : width;
??}
?}
?return width;
}
///
// 功能:將二維數組打印成表格樣式
// 參數:A 二維數組名,rowCount 行數,colCount 列數
//
void PrintArray(int* A, int rowCount, int colCount)
{
?char tablines[] = {"┌┬┐├┼┤└┴┘─│"};
?int i, j, colWidth;
?//colWidth = GetMaxWidth(A, rowCount, colCount); //獲取所有數據中的最大寬度
?colWidth=20;
?//打印表頭線
?PrintTableLine(0, colCount, colWidth);
?//打印表格內容
?for (i = 0; i < rowCount; i++)
?{
??if (i > 0) PrintTableLine(1, colCount, colWidth); //打印表中線
??cout << "│";?//行首
??for (j = 0; j < colCount; j++)
??{
???cout.width(colWidth);??//內容按指定寬度輸出
???cout << A[i*rowCount+j];
???if (j < colCount - 1 ) cout << "│"; // 表中豎線
??}
??cout << "│" << endl;?//行尾
?}
?PrintTableLine(2, colCount, colWidth); //打印表尾
}
//void main()
//{
//?int A[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//?PrintArray(&A[0][0], 3, 3);
//}
//int _tmain(int argc, _TCHAR* argv[])
//{
//?int A[][3] = {{111, 2, 3}, {43, 5, 6}, {7, 8, 9}};
//?PrintArray(&A[0][0],3, 3);
//?int c;
//?cin>>c;
//?return 0;
//}
?
總結
- 上一篇: 如何训练飞鸽传书
- 下一篇: 飞鸽传书2007的java学习感想