| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1221 人关注过本帖
标题:C编写的通讯录
取消只看楼主 加入收藏
lovevista
Rank: 2
来 自:四川成都市
等 级:论坛游民
帖 子:41
专家分:13
注 册:2009-9-24
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:2 
C编写的通讯录
我上网找啦一个用C语言编写的通讯录,把源代码复制到VC中运行有如下错误:
--------------------Configuration: ctx - Win32 Debug--------------------
Linking...
ctx.obj : error LNK2001: unresolved external symbol _puttext
ctx.obj : error LNK2001: unresolved external symbol _gettext
ctx.obj : error LNK2001: unresolved external symbol _gotoxy
ctx.obj : error LNK2001: unresolved external symbol _clreol
ctx.obj : error LNK2001: unresolved external symbol _wherey
ctx.obj : error LNK2001: unresolved external symbol _wherex
ctx.obj : error LNK2001: unresolved external symbol _clrscr
Debug/ctx.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.

ctx.exe - 8 error(s), 0 warning(s)
为什么无法解析呢!
源代码如下:
#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;
              if(indx<n&&strcmp(temp.name,psn[indx].name)==0)
                 {
        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;}
                 }
               else {clrscr(); printf(" Index error!"); return;}
             }
    clrscr();
    if(num>0){printf(" Modified a record! name:%s->%s",temp.name,psn[indx].name);savstate=0;n--;}
    else printf(" The name %s do not exist!",str);
  }

void print(struct person psn[],int n)                              /*显示所有记录。由pgup、pgdn、home、end及上下键控制*/
  {
   int i,k=0,l=0,j=n/10+(n%10?1:0); char ch;
   do
     {
       printf("\n name::         phonenumber::   email::                 department::\n\n");
       for(i=k*10+l;i<(k+1)*10+l;i++)
         { if(i==n)break;
         printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);
         }
       if(l%10==0) {gotoxy(1,24);cprintf(" Press Esc back to menu.      page %d / %d ",k+l/10+1,j);}
       else {gotoxy(1,24);cprintf(" Press Esc back to menu.      (%d pages)",j);}        
       do
         { ch=getch();
           if(ch==0)
          { ch=getch();
            if(ch==pgdn&&((k+1)*10+l<n))k++;
            if(ch==pgup&&(k*10+l>=10))k--;else if(ch==pgup)ch=home;
                    if(ch==home){k=0;l=0;}
                    if(ch==end){k=j-1;l=0;}
            if(ch==upkey&&(k*10+l>0))l--;
                    if(ch==dnkey&&(k*10+l<n-1))l++;
            break;
          }
         }while(ch!=Esc);
       if(ch==Esc) break;clrscr();
     }while(1);clrscr();
  }

void find(struct person psn[],int n)              /*查找记录。直接输入姓名或电话,则显示匹配内容,姓名为纯数字者不显示*/
  {
     int i,num=0,cnt=1; char str[15];
     printf("\n\n\n Please input the name or phonenumber you want to find:\n\n");
     printf(" name or phone:");
     cnt=rtnstr(str,2,14);str[14]='\0'; if(cnt==0)return;
     for(i=0;str[i]!='\0';i++)
       if(str[i]<48||str[i]>57)
    {
      for(i=0;i<n;i++)
        if(strcmp(psn[i].name,str)==0)
          { num++;
         if(num==1)printf("\n\n name::         phonenumber::   email::                 department::\n\n");
         printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);
           }
      if(num==0) {clrscr();printf("Can't find any record in accordance with %s!",str);return;}
      gotoxy(2,24); cprintf("Press any key to cotinue.");
      getch(); clrscr(); return;
    }
     for(i=0;i<n;i++)
      if(strcmp(psn[i].tel,str)==0)
        { num++;
         if(num==1)printf("\n\n name::         phonenumber::   email::                 department::\n\n");
         printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt);
        }
      if(num==0) {clrscr();printf("Can't find any record in accordance with %s!",str);return;}
      gotoxy(2,24); cprintf("Press any key to cotinue.");
      getch(); clrscr(); return;
  }


void save(struct person psn[],int n)                                                /*保存记录。若磁盘故障或已满则退出*/
  { FILE *fp; int i;
    if(savstate==1)return;
    if((fp=fopen("C:\\zhyx.c","wb"))==NULL)
      {
       printf(" Cannot open file!");return;
      }
   for(i=0;i<=n;i++) if(fwrite(&psn[i],sizeof(struct person),1,fp)!=1)                        /*多保存了一项,但没必要*/
   {printf(" File error!");fclose(fp);return;}
   savstate=1;printf(" Records saved!");
   fclose(fp);
 }
main()                                                            /*主函数。有两重循环,第一重打印菜单,第二重处理按键*/
{
 int i,n=0,ex=0,y=8; char ch;
 struct person psn[100];
 for(i=0;i<100;i++)
   { strcpy(psn[i].name,"\0");
     strcpy(psn[i].tel,"\0");
     strcpy(psn[i].eml,"\0");
     strcpy(psn[i].dpmnt,"\0");
   }
 n=readrecord(psn,n);
 do
   {
    gotoxy(2,4); cprintf("#################################");
    gotoxy(2,5); cprintf("#                               #");
    gotoxy(2,6); cprintf("# A: add new records.           #");
    gotoxy(2,7); cprintf("#                               #");
    gotoxy(2,8); cprintf("# D: delete certain records.    #");
    gotoxy(2,9); cprintf("#                               #");
    gotoxy(2,10);cprintf("# O: order them.                #");
    gotoxy(2,11);cprintf("#                               #");
    gotoxy(2,12);cprintf("# M: modify a record.           #");
    gotoxy(2,13);cprintf("#                               #");
    gotoxy(2,14);cprintf("# P: print all.                 #");
    gotoxy(2,15);cprintf("#                               #");
    gotoxy(2,16);cprintf("# F: find certaen records.      #");
    gotoxy(2,17);cprintf("#                               #");
    gotoxy(2,18);cprintf("# S: save.                      #");
    gotoxy(2,19);cprintf("#                               #");
    gotoxy(2,20);cprintf("# Esc: exit.                    #");
    gotoxy(2,21);cprintf("#                               #");
    gotoxy(2,22);cprintf("#################################");
    y=8;y=barup(y);
    gotoxy(2,24);cprintf("Please choose a menu form the table above.");
    do
     { ch=getch();
       if(ch==0)                                                   /*若按部分非字符键,可能是移动光条,y值跟踪光条改变*/
 {
  ch=getch();
  switch(ch)
            {
     case upkey:
     y=barup(y);ch=0;break;
     case dnkey:
     y=bardn(y);ch=0;
            }
          }
       if(ch==Enter)
           {
            switch(y)                                                                       /*光条对应y值,y值对应字符*/
              {
       case 6: ch='a';break;
               case 8: ch='d';break;
               case 10: ch='o';break;
       case 12: ch='m';break;
               case 14: ch='p';break;
               case 16: ch='f';break;
               case 18: ch='s';break;
               case 20: ch=Esc;break;
              }
           }
       switch(ch)                                                                   /*对不同字符调用相应函数或其它操作*/
 { case 'a':
           case 'A':
    { clrscr(); n=add(psn,n);
      ch=Enter; break;
    }
   case 'd':
   case 'D':
    { clrscr(); n=delete(psn,n);
      ch=Enter; break;
    }
   case 'o':
           case 'O':
    { clrscr(); order(psn,n);
      ch=Enter; break;
    }
   case 'm':
           case 'M':
    { clrscr(); modify(psn,n);
      ch=Enter; break;
    }
   case 'p':
           case 'P':
    { clrscr(); print(psn,n);
      ch=Enter; break;
    }
   case 'f':
           case 'F':
    { clrscr(); find(psn,n);
      ch=Enter; break;
    }
   case 's':
           case 'S':
    { clrscr(); save(psn,n);
      ch=Enter; break;
    }
           case Esc:                                             /*退出时的处理。按Y保存后退出,N直接退出,Esc返回程序*/
    { clrscr();ex=1;
      if(savstate==0)
{ gotoxy(5,5); cprintf("Records not saved! save(y/n)? Cancel: Esc");
  do{ ch=getch();
      if(ch=='n'||ch=='N')savstate=1;
      if(ch=='y'||ch=='Y')save(psn,n);
                      if(ch==Esc){ex=0;break;}
    }while(savstate!=1);
}
      clrscr(); ch=Enter; break;
    }
 }
     }while(ch!=Enter);
    if(ex==1)break;
   }while(1);
 clrscr();
}                 
 
搜索更多相关主题的帖子: 编写 通讯录 
2009-09-27 10:50
lovevista
Rank: 2
来 自:四川成都市
等 级:论坛游民
帖 子:41
专家分:13
注 册:2009-9-24
收藏
得分:0 
什么意思吗
· ·
2009-09-29 17:29
lovevista
Rank: 2
来 自:四川成都市
等 级:论坛游民
帖 子:41
专家分:13
注 册:2009-9-24
收藏
得分:0 
哎呀· · 我也不知道哦· ·
·  郁闷· ·  
2009-09-30 11:38
快速回复:C编写的通讯录
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026558 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved