猜单词.doc_第1页
猜单词.doc_第2页
猜单词.doc_第3页
猜单词.doc_第4页
猜单词.doc_第5页
免费预览已结束,剩余5页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#include#include#include#include class CStr private: int nLen; /字符串长度 char *pStr; /字符串首地址public: CStr()nLen=0;pStr=NULL; /不含参数的构造函数CStr(char *str); /含参数的构造函数 CStr(CStr &str); /拷贝的构造函数/CStr()if(pStr)delete pStr; /析构函数 int GetLen()return nLen; /返回字符串的长度CStr Midstr(CStr &str,int nStart,int nLength); /返回指定字符串类中从nStart序号开始nLength长度的字符串CStr Left(CStr &str,int nLength); /返回指定字符串类中从左边开始nLength个字符CStr Right(CStr &str,int nLength); /返回指定字符串类中从右边开始nLength个字符 CStr &Calculate(); /计算该字符串所代表的四则运算的值(内无括号)int CharInStr(char chChar); /判断字符chChar是否在字符串中 double Val();/求字符串代表的数字字符的值 char GetChar(int i)return *(pStr+i);/返回字符串中第i个字符 CStr Str(double val); /将数值表示成字符串的形式CStr &operator=(CStr &);/重载赋值运算符 friend CStr operator+(CStr &str1,CStr &str2)/友元,实现对象的加法 CStr t; t.nLen=str1.nLen+str2.nLen; t.pStr=new char t.nLen+1; strcpy (t.pStr,str1.pStr); strcat(t.pStr,str2.pStr); return t; operator char*()return(char*)pStr; /将字符串类转换成字符数组 friend istream &operator(istream &is,CStr &str)/重载输入运算符 char oristr100; is.getline(oristr,100); CStr in(oristr); str=in; str.GetLen(); return is; friend ostream &operator=0)/赋值nLength个字符 *(t.pStr+nLength)=*(str1.pStr+nLength-); return t; /返回指定字符串类中从左边开始nLength个字符CStr CStr:Left(CStr&str,int nLength) CStr t;CStr str1(str); t.nLen=nLength; t.pStr=new chart.nLen+1; *(t.pStr+-nLength+1)=0; /目的字符串以0结尾 while(nLength=0)/赋值nLength个字符 *(t.pStr+nLength)=*(str1.pStr+nLength-); return t;/返回指定字符串类中从右边开始nLength个字符CStr CStr:Right(CStr &str,int nLength) CStr t;CStr str1(str); t.nLen=nLength; t.pStr=new chart.nLen+1; while(*str1.pStr!=0)str1.pStr+; /移至第一 个字符串尾部 str1.pStr-=nLength;/跳至欲赋值的首地址 *(t.pStr+-nLength+1)=0;/目的字符串以0结尾 while(nLength=0) /赋值nLength个字符 *(t.pStr+nLength)=*(str1.pStr+nLength-); return t;/判断字符chChar是否在字符串中int CStr: CharInStr(char chChar) int pos=0; while(*(pStr+pos)!=0) /循环查找 if(chChar=*(pStr+pos+) return pos;/找到返回其位置 return 0;/求字符串所代表的数字字符的数值double CStr:Val() char *source=pStr; double result=0,multiplier; int pos_in_str=CharInStr(.);/找出小数点的位置if(*pStr=)source+;/如字符串代表的值为负值,指针后移一位if(pos_in_str=0) /字符串中不含小数点if(*pStr=) multiplier=pow(10,nLen-2);else multiplier=pow(10,nLen-1); while(*source!=0) result+=(*(source+)-0)*multiplier;multiplier/=10; else if(*pStr=) /字符串中含小数点 multiplier=pow(10,pos_in_str-3);else multiplier=pow(10,pos_in_str-2); while(*source!=0) if(*source!=.)result+=(*(source)-0)*multiplier; multiplier/=10; source+; if(*pStr=) result=0-result;/含“”时,将得出的值转为负值return result;/将数值表示成对象的形式CStr CStr:Str(double val) char p100; CStr str;int x=0,a=0,i=0,multiplier1;double multiplier2,b;if(val=0)/数值为零时p0=0;p1=0;else if(val=1)/正数时将整数部分和小数部分分开存放,x:小数部分; val:整数部分x=int(val);val-=x;if(x=0)/只有小数部分,整数部分为零pi+=0;pi+=.;multiplier2=0.1;for(;i+) b=val/multiplier2; pi=0+int(b); val-=multiplier2*int(b); multiplier2/=10; if(val=1e-10) /小数部分小于10的-10次方部分舍去pi+1=0;break;else /整数部分和小数部分都有时for(multiplier1=1000000000;multiplier1!=0;multiplier1/=10)/先将整数部分转换为字符pi=0+(x/multiplier1); x-=(x/multiplier1)*multiplier1; if(pi!=0|(a)/寻找数字转换为字符的第一个a+;i+;if(val=0) pi=0; /小数部分为零时(原值为整数时)else/小数部分不为零时pi=.;/增加小数点,指针后移一位i+;multiplier2=0.1; for(;i+) /将小数部分转换为字符b=val/multiplier2;pi=0+int(b);val-=multiplier2*int(b); multiplier2/=10; if(val=1e-10) pi+1=0; break; str=CStr(p); return str;/*char p100;sprintf(p,%.10f,val);CStr res(p);return res;*/ /重载赋值运算符CStr & CStr:operator=(CStr &str) if(pStr) deletepStr; nLen=str.nLen; if(str.pStr) pStr=new charnLen+1; strcpy(pStr,str.pStr); else pStr=0; return *this;/计算该字符串所代表的四则运算的值(内无括号) CStr &CStr:Calculate() CStr buf1,buf2,buf3,buf4,buf5; char opstr6=*/+-; double leftnr; double rightnr; int oppos; int z; long double result;for(int pos_in_opstr=0;pos_in_opstr=0;z-)/*将运算符左边的数字字符取出转换为值*/ if(*(pStr+z)=+)|(*(pStr+z)=-)|(*(pStr+z)=*)|(*(pStr+z)=/)|(*(pStr+z)=) buf1=Midstr(oristr,z+2,oppos-z-2); leftnr=buf1.Val(); z=-1; else if(z=0) buf1=Left(oristr,oppos-1); leftnr=buf1.Val(); for(z=oppos;znLen;z+)/*将运算符右边的数字字符取出转换为值*/ if(*(pStr+z)=+)|(*(pStr+z)=-)|(*(pStr+z)=*)|(*(pStr+z)=/)|(*(pStr+z)=) buf2=Midstr(oristr,oppos+1,z-oppos); rightnr=buf2.Val(); z=nLen; else if(z=nLen-1) buf2=Right(oristr,nLen-oppos); rightnr=buf2.Val(); /对两个数值进行计算,结果在result中 if (opstrpos_in_opstr=+)result=leftnr+rightnr; else if(opstrpos_in_opstr=-)result=leftnr-rightnr; else if(opstrpos_in_opstr=*)result=leftnr*rightnr; else if(opstrpos_in_opstr=/)result=leftnr/rightnr; else if(opstrpos_in_opstr=)result=pow(leftnr,rightnr); /计算后,将结果转换为字符串,然后将左右未运算过的字符串与其连接起来 buf4=Left(oristr,oppos-buf1.nLen-1); buf5=Str(result); buf3=buf4+buf5; buf5=Right(oristr,nLen-oppos-buf2.nLen); *this=buf3+buf5; return *this;/判断输入是否合法,清除空格int CStr:judge() int i,j; CStr str=*this; int flag=1; for(i=0;i=0&*(pStr+i)=9)|*(pStr+i)=+|*(pStr+i)=-|*(pStr+i)=*|*(pStr+i)=/|*(pStr+i)=|*(pStr+i)=.|*(pStr+i)=(|*(pStr+i)=)|*(pStr+i)=) /不存在不合法的字符时 if(i=nLen-1); else if(*(pStr+i)= )/如有空格,去除空格,所有字符向前移一位 j=i; while(*(pStr+j)=*(pStr+j+1); *(pStr+j)=0; i-; nLen-; if(i=nLen-1); else continue; else flag=0; /存在不合法的字符时 for(i=0;inLen;i+) if(*(str.pStr+i)=+|*(str.pStr+i)=-|*(str.pStr+i)=*|*(str.pStr+i)=/|*(str.pStr+i)=) i+; if(*(str.pStr+i)=+|*(str.pStr+i)=-|*(str.pStr+i)=*|*(str.pStr+i)=/|*(str.pStr+i)=) flag=0; /if(flag=0) /coutn 输入的表达式有误,请重新输入。nn; return flag;/友元重载运算符,实现对象的输入ostream &operator(ostream &os,CStr &str)for(int i=0;istr.nLen;i+)if(*(str.pStr+i)=)os-;else os*(str.pStr+i);return os;void main() CStr oristr,strn,buf1,buf2,buf3,buf4,buf5;int z,lastopen;char choice100;cout*; cout*欢迎使用四则运算器*;cout*注意:输入需符合一定规则,运算优先级为 * / + -,另用代替负号*;for(;)cout*;coutoristr; while(oristr.judge()=0) /判断输入是否合法,错误时提示重新输入coutoristr; strn=oristr; while(strn.CharInStr() /判断左括号 for(z=0;z=strn.GetLen();z+) if(strn.GetChar(z)=()lastopen=z;/找最后一个左括号的位置 if(strn.GetChar(z)=) /找到第一个右括号,将左右括号中的字符串取出计算buf4=strn.Midstr(strn,lastopen+2,z-lastopen-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论