⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pro.c

📁 C语言开发的通讯录
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h> 
#include <conio.h> 

#define Back 8 
#define Enter 13 
#define Esc 27 

#define home 71 
#define end 79 
#define upkey 72 
#define dnkey 80 
#define pgup 73 
#define pgdn 81 

struct person{ 
 char name[14]; 
 char tel[13]; 
 char eml[22]; 
 char dpmnt[22]; 
}; 
int savstate=1; 

int barup(int y)                                                                                            /*光条上移*/   
  { 
   if(y>=8) 
     { 
      int i;struct{unsigned char ch;unsigned char attr;}t; 
      for(i=4;i<=30;i++) 
        { gettext(i,y,i,y,&t);t.attr=0x07;puttext(i,y,i,y,&t);} 
      y=y-2; 
      for(i=4;i<=30;i++) 
        { gettext(i,y,i,y,&t);t.attr=0x70;puttext(i,y,i,y,&t);} 
     } 
   return y; 
  } 
   
int bardn(int y)                                                                                            /*光条下移*/ 
  { 
   if(y<=18) 
     { 
      int i;struct{unsigned char ch;unsigned char attr;}t; 
      for(i=4;i<=30;i++) 
        { gettext(i,y,i,y,&t);t.attr=0x07;puttext(i,y,i,y,&t);} 
      y=y+2; 
      for(i=4;i<=30;i++) 
        { gettext(i,y,i,y,&t);t.attr=0x70;puttext(i,y,i,y,&t);} 
     } 
   return y; 
  } 

int rtnstr(char ary[],int l,int m)                       /*对按键逐个测试,排除部分非法输入,按后退键修改,Enter键确认*/ 
  { 
 int i,x,y; char ch;  
 for(i=0;i<=m;i++) 
   { x=wherex();y=wherey(); 
     if(i<m) { ary[i]=getch();  
               if(ary[i]==0) {getch(); i=i-1; continue;} 
             } 
     clreol(); 
     if(i==m) do{ ch=getch(); if(ch==0)getch(); if(ch==Esc)return 0; 
                  if(ch==Enter){ary[m]='\0'; return 1;} if(ch==Back)break; 
                  gotoxy(x+m-i,y) ;clreol(); cprintf("    # Can't be more than %d letters.",m); 
                  gotoxy(x,y); 
                 }while(1); 
     if(ary[i]==Esc)return 0; 
     if(ary[i]==Back&&i==0) {i=i-1;continue;} 
     if(ary[i]==Enter) 
       { 
         if(i>=l){ary[i]='\0';return 1;} 
        else{ gotoxy(x+m-i,y); clreol(); cprintf("  # Can't be less than %d letters.",l); 
              gotoxy(x,y); i=i-1; continue; 
            } 
       } 
     if(ary[i]==Back&&i>0||ch==Back) {gotoxy(x-1,y); clreol(); i=i-2; ch=0; continue;} 
     if(m==3||(l==7&&m==12)){if(ary[i]<48||ary[i]>57){i=i-1;continue;}} 
     putchar(ary[i]); 
   } 
  } 

int readrecord(struct person psn[],int n)                   /*读文件。若不存在则新建并写入初始化后的数组,返回记录个数*/ 
  { int i,rcd=1; FILE *fp; 
    if((fp=fopen("C:\\zhyx.c","rb"))==NULL) 
      { rcd=0;if((fp=fopen("C:\\zhyx.c","wb"))==NULL) 
              { printf(" Cannot open file!"); 
return n; 
              } 
      } 
    if(rcd==0) for(i=0;i<100;i++)fwrite(&psn[i],sizeof(struct person),1,fp); 
    else       for(i=0;i<100;i++) 
                 {           
                   fread(&psn[i],sizeof(struct person),1,fp);if(psn[i].name[0]=='\0')break;n++; 
                 } 
 
     fclose(fp); printf(" There are %d records now.\n Records in C://zhyx.c",n); return n; 
  } 

int add(struct person psn[],int n)             /*增加记录。任意位置按Esc键退出,返回记录总数,并于主菜单显示增加的个数*/ 
  { int i,cnt=1;int t=n; 
    while(n<100) 
    {  clrscr(); 
       printf("\n\nAdded %d.\nPlease input the information,Esc back to menu:\n\n\n\n",n-t); 
       printf("name:"); 
       cnt=rtnstr(psn[n].name,2,13);if(cnt==0)break; 
       printf("\n\nphonenumber:"); 
       cnt=rtnstr(psn[n].tel,7,12);if(cnt==0)break; 
       printf("\n\nemail:"); 
       cnt=rtnstr(psn[n].eml,7,21);if(cnt==0)break; 
       printf("\n\ndepartment:"); 
       cnt=rtnstr(psn[n].dpmnt,2,21);if(cnt==0)break; 
       printf("\n\nRecord added successfully!"); 
       n++; 
    }if(n==100){ 
                 printf("\n\nThe record number has reached 100,can't add any more!");getch(); 
               }             
   clrscr();if(cnt==0)psn[n]=psn[n+1]; 
   if(t!=n){savstate=0;if(n-t!=1) printf(" Added %d records.\n",n-t);else printf(" Added 1 record.\n");} 
   return n; 
  } 

int delete(struct person psn[],int n)       /* 删除一记录 。姓名重复则输入序号字符串再转化为整数,由于情况简单直接讨论*/  
  { 
int i,indx,num=0,cnt=1; char ch; char str[14]; 
   printf("\n\n\n\nDelete name:"); 
cnt=rtnstr(str,2,13);str[13]='\0'; if(cnt==0) {clrscr();return n;} 
        printf("\n"); 
for(i=0;i<n;i++)if(strcmp(psn[i].name,str)==0) 
     { num++; printf("\n%-2d %-14s %-15s %-23s %-22s",i,psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); 
       if(num==1)indx=i; 
     } 
   if(num==1){ printf("\n\nFind 1 recod. Delete it(Y/N)?:"); 
                    do{ ch=getch(); 
                        if(ch=='Y'||ch=='y'){ clrscr();printf(" Deleted a record! name: %s",str); 
                                              for(i=indx;i<n;i++)psn[i]=psn[i+1];savstate=0;n--;return n; 
                                            } 
                        else if(ch=='N'||ch=='n'){clrscr();return n;} 
                       }while(1); 
                  } 
if(num>1){ printf("\n\nFind %d recods.Input the number before a record to delete it:\n\n",num); 
           cnt=rtnstr(str,1,3);if(cnt==0){clrscr();return n;}  
                   cnt=strlen(str);if(cnt==3) {clrscr();printf(" Index error!");return n;}         /*借用cnt(continue)*/ 
           if(cnt==1)cnt=str[0]-48;                                                        /*续借,indx还要用到*/ 
                   else if(cnt==2)cnt=(str[0]-48)*10+str[1]-48; 
              if(cnt<n&&strcmp(psn[cnt].name,psn[indx].name)==0)  
                   { clrscr();printf(" Deleted a record! name: %s",psn[indx].name); 
                     for(i=cnt;i<n;i++)psn[i]=psn[i+1];savstate=0;n--;return n; 
                   } 
            else {clrscr(); printf(" Index error!"); return n;} 
           } 
    clrscr(); 
    printf(" The name %s do not exist!",str); 
    return n; 
  } 

void order(struct person psn[],int n)                           /*排序。可按姓名或电话按升序排序,主菜单中显示排序情况*/ 
  { char ch; 
 
  
     printf("\n\npress F to order by name,S by phonenumber.\n"); 
    do 
      { ch=getch(); 
        if(ch==Esc)break; 
      }while(ch!='f'&&ch!='F'&&ch!='s'&&ch!='S'); 
    if(ch=='f'||ch=='F') 
      { 
       int i,j,k; struct person temp; 
       for(i=0;i<n-1;i++) 
         { 
          k=i;for(j=i+1;j<n;j++)if(strcmp(psn[j].name,psn[k].name)<0)k=j; 
          if(k!=j){temp=psn[i];psn[i]=psn[k];psn[k]=temp;} 
         }clrscr(); 
       printf("\n Ordered by name."); 
       savstate=0;return; 
      } 
    if(ch=='s'||ch=='S') 
      { 
       int i,j,k; struct person temp; 
       for(i=0;i<n-1;i++) 
         { 
          k=i;for(j=i+1;j<n;j++)if(strcmp(psn[j].tel,psn[k].tel)<0)k=j; 
          if(k!=j){temp=psn[i];psn[i]=psn[k];psn[k]=temp;} 
         }clrscr(); 
       printf("\n Ordered by phonenumber."); 
       savstate=0;return; 
      } 
    clrscr(); 
  } 

void modify(struct person psn[],int n)           /*修改记录 。姓名重复输入序号字符串再转化为整数,由于情况简单直接讨论*/ 
  { 
   int i,indx,num=0,cnt=1; char str[14]; struct person temp; 
   printf("\nPlease input the friend's name:"); 
   cnt=rtnstr(str,2,13);str[13]='\0'; if(cnt==0) {clrscr();return;} 
   printf("\n"); 
   for(i=0;i<n;i++)if(strcmp(psn[i].name,str)==0) 
     { num++; printf("\n%-2d %-14s %-15s %-23s %-22s",i,psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); 
       if(num==1)indx=i; 
     } 
   if(num==1) 
     { 
           temp=psn[indx];  
           printf("\n\nPlease input new information,Esc back to menu:\n\n"); 
           printf("name:"); 
           cnt=rtnstr(psn[indx].name,2,13);if(cnt==0){psn[indx]=temp;clrscr();return;} 
           printf("\n\nphonenumber:"); 
           cnt=rtnstr(psn[indx].tel,7,12);if(cnt==0){psn[indx]=temp;clrscr();return;} 
           printf("\n\nemail:"); 
           cnt=rtnstr(psn[indx].eml,7,21);if(cnt==0){psn[indx]=temp;clrscr();return;} 
           printf("\n\ndepartment:"); 
           cnt=rtnstr(psn[indx].dpmnt,2,21);if(cnt==0){psn[indx]=temp;clrscr();return;} 
          } 
   if(num>1){ printf("\n\nFind %d recods.Input the number before a record to modify it:\n\n",num); 
              cnt=rtnstr(str,1,3);if(cnt==0){clrscr();return;}  
                   cnt=strlen(str);if(cnt==3) {clrscr();printf(" Index error!");return;}                     /*借用cnt*/ 
           temp=psn[indx]; if(cnt==1)indx=str[0]-48; 
                                   if(cnt==2)indx=(str[0]-48)*10+str[1]-48; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -