The C++ Programming Language 第六章 作业

来源:互联网 发布:ui设计和美工的区别 编辑:程序博客网 时间:2024/04/30 08:49

The C++ Programming Language 第六章 作业
james chen/200503

6.6.1
将下面的for循环重写为采用while循环的等价形式
for(i=0;i<max_length;i++)
if(input_line[i]=='?')quest_count++;
重写这个片段,用一个指针作为被控制变量,其检测采用*p=='?'的形式..

int i=0;
while(max_length--)
if(input_line[i++]=='?')quest_count++;

指针为控制变量:
int i=0;
char *p=input_line;
while(*p)
if(*p++=='?')quest_count++;

6.6.2
为下面的各个表达式加上全部括号:77
a=b+c*d<<2&8 //a=b+(((c*d)<<2)&8)
a&077!=3 //a&(077!=3)
a==b||a==c&&c<5 //(a==b)||((a==c)&&(c<5))
c=x!=0 //c=(x!=0)
0<=x<7 //(0<=x)<7
f(1,2)+3 //(f(1,2))+3
a=-1++b---5 //a=(-1)+(+(b--))-5
a=b==c++ //a=(b==(c++))
a=b=c=0 //a=(b=(c=0))
a[4][2]*=*b?c:*d*2 //a[4][2]*=(*b)?c:((*d)*2)
a-b,c=d //(a-b),(c=d)



6.6.9
给下面的表达式加上括号:
*p++ //*(p++)
*--p //*(--p)
++a-- //(++a)--
(int*)p->m //((int*)p)->m
*p.m //(*p).m
*a[i] //(*a)[i]

6.6.10
写出下列函数:strlen(),返回c字串的长度;strcpy(),它将一个c字串复制到另一字串;strcmp(),比较两个c字串。
#include<iostream>
using namespace std;
int strlen(char *d)
{
int l=0;
while(*d++!=0)l++;
return l;
}
void strcpy(char *d,char* s)
{
while(*d++=*s++);
}
bool strcmp(char *d,char *s)
{
while(*d)
if(*d++!=*s++)return 0;
return 1;
}
void main()
{
char *a="i love you!!";
cout<<strlen(a)<<endl;
char *b=new char;
strcpy(b,a);
cout<<b<<endl;
cout<<strcmp(a,b)<<endl;
char *c="sdfsf";
cout<<strcmp(a,c)<<endl;
}


6.6.13
写一个cat(),它取两个c字串,返回一个字串,该字串是两个字串的拼接。利用new为这个结果取得存储。
#include<iostream>
using namespace std;
char *cat(const char *a,const char *b)
{
char *temp=new char;
char *t=temp;
while(*t++=*a++);
t--; //退到c字串a尾部的0的位置
while(*t++=*b++);
return temp;
}
void main()
{
char *a="abcde";
char *b="12345";
char *c=cat(a,b);
cout<<c<<endl;
}


6.6.14
写一个rev(),它取c字串为参数,并反转其中字符。
#include<iostream>
using namespace std;
//这里用两个指针分别指向头尾来作交换,个人感觉要比用递归要好
int strlen(char *a)
{
int l=0;
while(*a++!=0)l++;
return l;
}
void rev(char* a)
{
char t;
int l=strlen(a);
char *p=a+l-1;
for(int i=1;i<=l/2;i++)
{
t=*a;
*a++=*p;
*p--=t;
}
}
void main()
{
char a[]="1234sfdeefd98765";
rev(a);
cout<<a<<endl;
}


6.6.16
写一函数atoi(const char*),它以一c字串为参数,返回与之对应的int值,使能处理十进制外,还能处理八进制和十六进制。
晕,还不太会用const。。

#include<iostream>
using namespace std;

//十进制、八进制、十六进制字符串转十进制

//atoi(char *):转换不同进制格式之字串到int
//strlen(char *):计算c风格字串长度
//getype(char *):检查字串符合何种进制格式,返回类型
//1:十进制2:八进制3:十六进制0:格式不符
//ascii:
//A-F:65-70
//0-9:48-57
//X:88

int strlen(char *p)
{
int l=0;
while(*p++!=0)l++;
return l;
}

int getype(char *p)
{
char *a=p;
int t=0;
//第一,判断是否含有非法字符,有则返回0
while(*a!=0)
{
t=int(*a++);
if(!((t>47&&t<58)||(t>64&&t<71)||(t==88)))return 0;
}
a=p;//指针复位
//第二,判断是否为十进制(非0打头),是则返回1,非法返回0
if(*p!='0')
{
while(*a!=0)
{
t=int(*a++);
if(t<48||t>57)return 0;
}
return 1;
}
else
//第三,判断是否为八进制(以0打头,第二字符非0),是则返回2,非法返回0
{
if(*(p+1)!='X')
{
if(*(p+1)=='0')return 0; //八进制第二字符为零视为非法
while(*a!=0)
{
t=int(*a++);
if(t<48||t>55)return 0;
}
return 2;
}
else
//否则就是十六进制.
return 3;
}
}

int atoi(char *p)
{
int l=strlen(p);
int ct=getype(p);
int temp=0,o=1;

p+=l-1; //指向最后一个数字
int t=0;
switch(ct)
{
case 1://计算十进制
while(l--)
{
temp+=(int(*p--)-48)*o;
o*=10;
}
break;
case 2://计算八进制
while((l--)-1)
{
temp+=(int(*p--)-48)*o;
o*=8;
}
break;
case 3://计算十六进制
while((l--)-2)
{
t=int(*p--);
if(t>57)t-=55; //将ABCDEF还原为10,11,12,13,14,15
else t-=48;
temp+=t*o;
o*=16;
}
break;
default:temp=0;
}

return temp;
}

void main()
{
char *a="0X4F5D"; //十六进制
char *b="0231"; //八进制
char *c="2314"; //十进制

char *d="0x2314"; //不正确的十六进制
char *e="002314"; //不正确的八进制
char *f="2314F"; //不正确的十进制

cout<<atoi(a)<<endl; //20317
cout<<atoi(b)<<endl; //153
cout<<atoi(c)<<endl; //2314
cout<<atoi(d)<<endl; //0
cout<<atoi(e)<<endl; //0
cout<<atoi(f)<<endl; //0
}



6.6.17
写一个函数itoa(int i,char b[]),它在b中建立起i的字符串表示,并返回b;

#include<iostream>
using namespace std;
void itoa(int a,char *b)
{
char *temp=new char[];
char *t=temp;
int n=0;
while(a)
{
*t++=char((a%10)+48);
n++;
a/=10;
}
*t=0;
t=temp+n-1;
while(n--)
*b++=*t--;
*b=0;
}

void main()
{
char *b=new char[];
int i=433221;
itoa(i,b);
cout<<b<<endl;
}