?? cpp1.cpp
字號:
//通訊錄系統管理源程序
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#include"ctype.h"
//字符操作函數
#define M 50 //最大人數
typedef struct
{
char name[20]; //姓名
char units[30]; //單位
char tele[10]; //電話
}ADDRESS;
//以下是函數原型
int input(ADDRESS t[]); //輸入記錄
void list(ADDRESS t[],int n); //顯示記錄
void search(ADDRESS t[],int n); //按姓名查找顯示記錄
int deleted(ADDRESS t[],int n); //刪除記錄
int add(ADDRESS t[],int n); //插入記錄
void save(ADDRESS t[],int n); //記錄保存為文件
int load(ADDRESS t[]); //從文件中讀記錄
void display(ADDRESS t[]); //按序號查找顯示記錄
void sort(ADDRESS t[],int n); //按姓名排序
void qseek(ADDRESS t[],int n); //快速查找記錄
void copy(); //文件復制
void print(ADDRESS temp); //顯示單條記錄
int find(ADDRESS t[],int n,char *s); //查找函數
int menu_select(); //主菜單函數
//主函數開始
void main()
{
ADDRESS adr[M];
int length;
system("cls");
for(;;)
{
switch(menu_select())
{
case 0:length=input(adr);break; //輸入記錄
case 1:list(adr,length);break; //顯示全部記錄
case 2:search(adr,length);break; //查找記錄
case 3:length=deleted(adr,length);break; //刪除記錄
case 4:length=add(adr,length);break; //插入記錄
case 5:save(adr,length);break; //保存文件
case 6:length=load(adr);break; //讀文件
case 7:display(adr);break; //按序列號顯示記錄
case 8:sort(adr,length);break; //按姓名排序
case 9:qseek(adr,length);break; //快速查找記錄
case 10:copy();break; //復制文件
case 11:exit(0);break; //如果返回值11則程序結束
}
}
}
//菜單函數,函數返回值為整數,代表所選的菜單項
menu_select()
{
char s[80];
int c;
printf("press any key enter menu......\n");//提示按任意鍵繼續
getch();//讀入任意字符
system("cls"); //清屏
printf("*******************************************\n");
printf(" 您好!歡迎使用通訊錄管理服務系統!!! \n");
printf("******************MENU*********************\n\n");
printf(" 0.Enter record\n");
printf(" 1.List the file\n");
printf(" 2.Search record on name\n");
printf(" 3.Delete a record\n");
printf(" 4.add record\n");
printf(" 5.Save the file\n");
printf(" 6.Load the file\n");
printf(" 7.display record on order\n");
printf(" 8.sort to make new file\n");
printf(" 9.Quick seek record\n");
printf(" 10.copy the file to new\n");
printf(" 11.Quit\n");
printf("*****************************************\n");
do
{ printf("\n Enter you choice(0-11):");//提示輸入選項
scanf("%s",s);//輸入選擇項
c=atoi(s);//將輸入的字符串比較轉化為整型數
}while(c<0||c>11);//選擇項不在0-11之間重輸
return c;//返回選擇項,主程序根據該數調用相應的函數
}
//***輸入記錄,形參為結構體數組,函數值返回類型為整型,表示記錄長度
int input(ADDRESS t[])
{
int i, n;
system("cls");//清屏
system("cls");
printf("\nplease input num \n");//提示信息
scanf("%d",&n);//;輸入記錄數
printf("please input record \n");//提示輸入記錄
printf("name unit telephone\n");
printf("------------------------------------\n");
for(i=0;i<n;i++)
{
scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);
printf("----------------------------------\n");
}
return n;//返回記錄數
}
//顯示記錄,參數為記錄數組和記錄條數
void list(ADDRESS t[],int n)
{
int i;
system("cls");
printf("\n\n*****************ADDRESS***************\n");
printf("name unit telephone\n");
printf("-------------------------------------------\n");
for(i=0;i<n;i++)
printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);
if((i+1)%10==0) //判斷輸出是否達到10條記錄
{
printf("Press any key continue...\n"); //提示信息
getch(); //按任意鍵繼續
}
printf("********************end************************\n");
}
//查找記錄
void search(ADDRESS t[],int n)
{
char s[20];//保存待查找的姓名字符串
int i;//保存查找到結點的序號
system("cls");//清屏
printf("please search name\n");
scanf("%s",s);//輸入待查找姓名
i=find(t,n,s);//調用find函數,得到一個整數
if(i>n-1)//如果整數i值大于n-1,說明沒有找到
printf("not found\n");
else
print(t[i]);//找到,調用顯示函數顯示記錄
}
//顯示指定的一條記錄
void print(ADDRESS temp)
{
system("cls");
printf("\n\n**********************************\n");
printf("name unit telephone\n");
printf("----------------------------------------\n");
printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
printf("******************end******************\n");
}
//查找函數,參數為記錄數組、記錄條數以及姓名s
int find(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值
}
//刪除函數,參數為記錄數組和記錄條數
int deleted(ADDRESS t[],int n)
{
char s[20];//要刪除記錄的姓名
int ch=0;
int i,j;
printf("please deleted name\n");//提示信息
scanf("%s",s);//輸入姓名
i=find(t,n,s);//調用find函數
if(i>n-1)//如果i>n-1超過了數組的長度
printf("no found not deleted\n");//顯示沒有找到要刪除的記錄
else
{
print(t[i]);//調用輸出函數顯示該條記錄信息
printf("Are you sure delete it(1/0)\n");//確認是否要刪除
scanf("%d",&ch);//輸入一個整數0或1
if(ch==1)//如果確認刪除整數為1
{
for(j=i+1;j<n;j++)//刪除該記錄,實際后續記錄前移
{
strcpy(t[j-1].name,t[j].name);
strcpy(t[j-1].units,t[j].units);
strcpy(t[j-1].tele,t[j].tele);
}
n--;//記錄數減1
}
}
return n;//返回記錄數
}
//插入記錄函數,參數為結構體數組和記錄數
int add(ADDRESS t[],int n)//插入函數,參數為結構體數組和記錄數
{
ADDRESS temp;//插入記錄信息
int i,j ;
char s[20];//確定插入在哪個記錄之前
printf("plsease input record\n");
printf("*****************************************\n");
printf("name unit telephone \n");
printf("-----------------------------------------\n");
scanf("%s%s%s",temp.name,temp.units,temp.tele);
printf("-----------------------------------------\n");
printf("please input locate name \n");
scanf("%s",s);//輸入插入位置的姓名
i=find(t,n,s);//調用find,確定插入位置
for(j=n-1;j>=i;j--)//從最后一個結點開始向后移動一條
{
strcpy(t[j+1].name,t[j].name);
strcpy(t[j+1].units,t[j].units);
strcpy(t[j+1].tele,t[j].tele);
}
strcpy(t[i].name,temp.name);//將新插入記錄拷貝到第i個位置
strcpy(t[i].units,temp.units);
strcpy(t[i].tele,temp.tele);
n++;//記錄數加1
return n;//返回記錄數
}
//保存函數,參數為結構體數組和記錄數
void save(ADDRESS t[],int n)
{
int i;
FILE*fp;//指向文件的指針
if((fp=fopen("record.txt","wb"))==NULL)
{
printf("can not open file\n");//不能打開文件
exit(1);//退出
}
printf("\nSaving file\n");//輸出提示信息
fprintf(fp,"%d",n);//將記錄數寫入文件
fprintf(fp,"\r\n");//將換行符號寫入文件
for(i=0;i<n;i++)
{
fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);//格式寫入記錄
fprintf(fp,"\r\n");//將換行符號寫入文件
}
fclose(fp);//關閉文件
printf("***save success***********\n");//顯示保存成功
}
//讀入函數,參數為結構體數組
int load(ADDRESS t[])
{
int i,n;
FILE*fp;//指向文件的指針
if((fp=fopen("record.txt","rb"))==NULL)//打開文件
{
printf("can not open file\n");//不能打開
exit(1);
}
fscanf(fp,"%d",&n);//讀入記錄數
for(i=0;i<n;i++)
fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele);//按格式讀入記錄
fclose(fp);//關閉文件
printf("You have success read data from file!!!\n");//顯示保存成功
return n;//返回記錄數
}
//按序號顯示記錄函數
void display(ADDRESS t[])
{
int id,n;
FILE*fp;//指向文件的指針
if((fp=fopen("record.txt","rb"))==NULL)
{
printf("can not open file\n");
exit(1);
}
printf("Enter order number...\n");//顯示信息
scanf("%d",&id);//輸入序號
fscanf(fp,"%d",&n);//從文件讀入記錄數
if(id>=0&&id<n)//判斷序號是否在記錄范圍內
{
fseek(fp,(id-1)*sizeof(ADDRESS),1);//移動文件指針到該記錄位置
print(t[id]);// 調用輸出函數顯示該記錄
printf("\r\n");
}
else
printf("no %d number record!!!\n",id);//如果序號不合理顯示的信息
fclose(fp);
}
//排序函數,參數為結構體數組和記錄數
void sort(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.units,t[j].units);
strcpy(temp.tele,t[j].tele);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].units,t[j+1].units);
strcpy(t[j].tele,t[j+1].tele);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].units,temp.units);
strcpy(t[j+1].tele,temp.tele);
}
if(flag==0)break;//如果標志為0,說明沒有發生過交換,循環結束
}
printf("sort sucess!!!\n");//顯示排序成功
}
//快速查找,參數為結構體數組和記錄數
void qseek(ADDRESS t[],int n)
{
char s[20];
int l,r,m;
printf("\nPlease sort before qseek!\n");//提示確認在查找之前,記錄是否已排序
printf("\nPlease enter name for qseek\n");//提示輸入
scanf("%s",s);//輸入待查找的姓名
l=0;r=n-1;//設置左邊界與右邊界的初值
while(l<=r)//當左邊界<=右邊界時
{
m=(l+r)/2;//計算中間位置
if(strcmp(t[m].name,s)==0)//與中間結點的姓名字段進行比較,判斷是否相等
{
print(t[m]);//如果相等,則調用printf函數顯示記錄信息
return;//返回
}
if(strcmp(t[m].name,s)<0)//如果中間結點小
l=m+1;//修改左邊界
else
r=m-1;//否則,中間結點大,修改右邊界
}
if(l>r)//如果左邊界大于右邊界時
printf("not found\n");//顯示沒找到
}
//復制文件
void copy()
{
char outfile[20];//目標文件名
int i,n;
ADDRESS temp[M];//定義臨時變量
FILE *sfp,*tfp;//定義指向文件的指針
system("cls");
if((sfp=fopen("record.txt","rb"))==NULL)//打開記錄文件
{
printf("can not open file\n");//顯示不能打開文件信息
exit(1);
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n");//提示信息
scanf("%s",outfile);//輸入目標文件名
if((tfp=fopen(outfile,"wb"))==NULL)//打開目標文件
{
printf("can not open file\n");//顯示不能打開文件信息
exit(1);
}
fscanf(sfp,"%d",&n);//讀出文件記錄數
fprintf(tfp,"%d",n);//寫入目標文件數
fprintf(tfp,"\r\n");//寫入換行符
for(i=0;i<n;i++)
{
fscanf(sfp,"%20s%30s%10s\n",temp[i].name,
temp[i].units,temp[i].tele);//讀入記錄
fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,
temp[i].units,temp[i].tele);//寫入記錄
fprintf(tfp,"\r\n");//寫入換行符
}
fclose(sfp);//關閉源文件
fclose(tfp);//關閉目標文件
printf("You have success copy file!!!\n");//顯示復制
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -