(实训题目)-有兴趣者请进!
学生使用C/C++语言开发一个简单的电话簿程序,
假设电话簿是这样的:
张三 010-87589542
李四 020-87589693
王五 030-96325896
保存文件为tel.txt
要求做到
1,用户可以选择查询电话、添加新电话
2.用户查询电话时要输入电话记录号,系统返回电话号码和主人姓名
3.用户输入新的姓名和电话号码,可以被添加到电话簿中。
[解决办法]
#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;}
[解决办法]
/* 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; }