读书人

(实训题目)-有兴趣者请进!解决方法

发布时间: 2012-02-10 21:27:41 作者: rapoo

(实训题目)-有兴趣者请进!
学生使用C/C++语言开发一个简单的电话簿程序,
假设电话簿是这样的:
张三 010-87589542
李四 020-87589693
王五 030-96325896
保存文件为tel.txt

要求做到
1,用户可以选择查询电话、添加新电话
2.用户查询电话时要输入电话记录号,系统返回电话号码和主人姓名
3.用户输入新的姓名和电话号码,可以被添加到电话簿中。


[解决办法]

C/C++ code
#include<iostream>#include<string>#include<fstream>#include<vector>using namespace std;class info{  public:      string name;      string phone;      info(string st="",string str=""):name(st),phone(str){}       };bool readFile(vector<info>& ve){  string str1,str2;  info infos;  ifstream ifile("tel.txt");  if(!ifile)  {    cout<<"Can't open file..."<<endl;    return 0;  }  while(ifile>>str1&&ifile>>str2)  {    infos.name=str1;    infos.phone=str2;    ve.push_back(infos);  }  return 1;}bool saveFile(vector<info>& ve){  ofstream ofile("tel.txt");  if(!ofile)  {    cout<<"Can't open file..."<<endl;    return 0;  }  for(vector<info>::iterator it=ve.begin();it!=ve.end();++it)  {    ofile<<(*it).name<<ends<<(*it).phone<<endl;  }  return 1;  }int findone(vector<info>& ve,string num){  for(vector<info>::iterator it=ve.begin();it!=ve.end();++it)  {    if((*it).phone==num)        return it-ve.begin();  }    return -1;}int main(){  vector<info> vec;  bool flag=1;  int indicator=0;  string strn,strp;  info inf;  int offset=0;  vector<info>::iterator iter=vec.begin();  while(flag)  {      cout<<"\n\nselect menu:"<<endl;      cout<<"0 for reading from file"<<endl;      cout<<"1 for adding new item"<<endl;      cout<<"2 for saving to file"<<endl;      cout<<"3 for finding a specific item"<<endl;      cout<<"4 to exit"<<endl;      cin>>indicator;    switch(indicator)    {      case 0:        readFile(vec);        break;      case 1:        cout<<"input new item"<<endl;        cin>>strn>>strp;                inf.name=strn;        inf.phone=strp;        vec.push_back(inf);        break;      case 2:        saveFile(vec);        break;      case 3:        cout<<"input phone number:"<<endl;        cin>>strp;        iter=vec.begin();        offset=findone(vec,strp);        if(offset==-1)          cout<<"No such item"<<endl;        else        {          iter+=static_cast<size_t>(offset);          cout<<(*iter).name<<ends<<(*iter).phone<<endl;        }        break;      case 4:        flag=0;        break;      default:        break;           }  }      return 0;}
[解决办法]
C/C++ code
/* phone.c* 学生使用C/C++语言开发一个简单的电话簿程序, * 假设电话簿是这样的: * 张三 010-87589542 * 李四 020-87589693 * 王五 030-96325896 * 保存文件为tel.txt * 要求做到 * 1,用户可以选择查询电话、添加新电话 * 2.用户查询电话时要输入电话记录号,系统返回电话号码和主人姓名 * 3.用户输入新的姓名和电话号码,可以被添加到电话簿中。 */#include <stdio.h>#include <string.h>int judge_argc(int argc);long get_interspace(char *argv1,long *iInterSpace);long insertdata(char *argv1,char *argv2,char *argv3);long matchposition(char *argv1,char *argv2,long *iInterSpace);/* 主函数:通过命令行输入参数,输入格式为:程序可执行文件名 文件名 电话号码 或者:程序可执行文件名 文件名 新增姓名 电话号码 */int main(int argc,char *argv[]){    int iFlag = 0; /* 判断是查询还是插入 */    long iInterSpace = 0;    /* 文件大小(字节数) */         iFlag = judge_argc(argc);    /* 判断参数个数,根据具体个数判断是查询还是插入,如果个数不足,退出程序 */     get_interspace(argv[1],&iInterSpace);  /* 获取文件大小 */         /* 3个参数调用查询,4个参数调用插入 */    if(3 == iFlag)    {        matchposition(argv[1],argv[2],&iInterSpace);    /* 查询电话号码 */     }    else    {        insertdata(argv[1],argv[2],argv[3]); /* 插入姓名、电话号码 */    }           return 0;}/* 判断命令行参数个数,返回参数个数,以便之后程序中控制调用函数,如果参数个数不足,退出程序 */int judge_argc(int argc){    if(argc < 3)    {        printf("Input Error!\nUsage1:programmename filename phonenumber\nUsage2:programmename filename addname phonenumber\n");         printf("输入错误!\n使用方法1:程序可执行文件名 文件名 电话号码\n使用方法1:程序可执行文件名 文件名 新增姓名 电话号码\n");        exit(2);    }           return argc;}/* 获取文件大小,以便之后程序中申请合适的空间 */long get_interspace(char *argv1,long *iInterSpace){    FILE *fp;        if((fp = fopen(argv1,"r")) == NULL)    {        printf("Open the file named '%s' error!\n",argv1);        fclose(fp);        exit(2);    }           while(! feof(fp))    {            fgetc(fp);           *iInterSpace = *iInterSpace + 1;       }    fclose(fp);          return 0;}/* 插入数据 */long insertdata(char *argv1,char *argv2,char *argv3){    FILE *fp;        if((fp = fopen(argv1,"a+")) == NULL)    {        printf("Open the file named '%s' error!\n",argv1);        fclose(fp);        exit(2);    }      fwrite("\n",1,1,fp);    fwrite(argv2,1,strlen(argv2),fp);    fwrite(" ",1,1,fp);    fwrite(argv3,1,strlen(argv3),fp);    fwrite("\n",1,1,fp);        fclose(fp);          return 0;    }/* 查询电话号码 */long matchposition(char *argv1,char *argv2,long *iInterSpace){    FILE *fp;    char cString[*iInterSpace + 2];        /* 所有字符 */    char cPerLine[*iInterSpace + 2];    /* 单行字符 */    int ii;    /* 临时变量,用来控制循环 */    long iMatchNum = 0; /* 匹配行数 */        if((fp = fopen(argv1,"r")) == NULL)    {        printf("Open the file named '%s' error!\n",argv1);        fclose(fp);        exit(2);    }    /* 初始化缓冲空间,并一次性将数据都读出来 */    memset(cPerLine,'\0',sizeof(cPerLine));        while(!feof(fp))    {         fgets(cPerLine,sizeof(cPerLine),fp);        if(strstr(cPerLine,argv2) != NULL)        {            iMatchNum = iMatchNum + 1;            for(ii = 0;ii < strlen(cPerLine);ii++)            {                printf("%c",cPerLine[ii]);            }        }         memset(cPerLine,'\0',sizeof(cPerLine));   }   fclose(fp);      if(0 == iMatchNum)    {        printf("\n0 matched.\n");        exit(1);    }    else    {        printf("\nThe matched number of the string '%s' is %ld.\n",argv2,iMatchNum);    }    return 0;    } 

读书人网 >C语言

热点推荐