计算机程序设计c++ 10-4:类的实例——能翻译整数机器人2

能翻译整数的机器人

机器人的特征

  • 姓名
  • 型号
  • 整数:待翻译的整数
  • 翻译的英文句子字符串:字符指针,句子有长有短

机器人的功能

  • 翻译整数函数: 形成英文字符串,并将字符串指针返回
    • 例如128翻译成one hundred and twenty-eight
  • 构造函数
  • 设置函数
  • 析构函数
  • 输出英文句子函数
  • ……

机器人 类的定义

class robot
{
    
    
	private:
		char name[20]; //机器人姓名
		char type[20]; //机器人型号
		int num;  //待翻译的整数
		char *ps;  //指向英文字符串

	public:
		robot()//构造函数
		{
    
    
			strcpy(name, "XXXXXX");
			strcpy(type, "XXXXXX");
			num = 0;
			ps = new char[5];
			strcpy(ps, "zero");
		}

		void set(char n[], char t[], int m); //设置修改数据
		void out(int a);  //英文中每三位数读法相同,所以定义out函数翻译小于1000的整数
		void tran_int(int n);  //将1至1999999999的整数翻译成英文句子
		void print_num();  //输出整数及其英文句子
		~robot(){
    
    delete [] ps;};  //析构函数 释放构造函数和set函数中动态申请的空间
};

特殊数字词汇定义

// 定义两个全局字符指针数组,存取所需的单词
// num1中为1到19,空出了0,所以可以直接用num1[n]调用,得到n对应单词
static char *num1[]=
{
    
    
	"","one ", "two ", "three ", "four ", "five ", "six ", 
	"seven ", "eight ", "nine ", "ten ", "eleven ", "twelve ", 
	"thirteen ", "fourteen ", "fifteen ", "sixteen ", 	
	"seventeen ", "eighteen ", "nineteen "
};


// num10中为20-90,空出了0和1,所以可以直接用num10[n/10]调用,得到n对应单词
static char *num10[]=
{
    
    
	"", "", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", 
	"seventy ", "eighty ", "ninety "
};
void robot::set(char n[], char t[], int m)
{
    
    
	strcpy(name, n);
	strcpy(type, t);
	if(num == m)  //待翻译的整数没有变
	{
    
    
		return;
	}
	else
	{
    
    
		num = m;
		delete [] ps;  //删除已有的英文句子
	}
	
	if(num > 0)
	{
    
    
		char *tp = tran_int(num);
		ps = new char[strlen(tp)+1];
		strcpy(ps, tp);
		delete [] tp;  //释放在trans_int中动态申请的空间
	}
	else if(num==0)
	{
    
    
		ps = new char[5];
		strcpy(ps, "zero");
	}
	else
	{
    
    
		ps = new char[13];
		strcpy(ps, "负数不能翻译");
	}
}

小于1000整数翻译函数

char *robot::out(int a)
{
    
    
	char k[1000] = "";
	int b = a%100;
	//若百位不为零,输出百位数加hundred,若此时十位个位均为0,不加and
	if(a/100!=0)
	{
    
    
		strcat(k, num1[a/100]);
		strcat(k, "hundred ");
		if(b!=0)
			strcat(k, "and ");
	}
	
	//当后两位在20以内时,直接调用num1[n],输出
	if(b<20)
		strcat(k, num1[b]);
		//当后两位大于20时
	else
		{
    
     //先调用num10,输出十位数
			strcat(k, num10[b/10]);
			//个位不为0时应输出"-"个位数
			if(b%10!=0)
			{
    
    
				stract(k, "\b-");
				strcat(k, num1[b%10]);
			}
		}
	char *p = new char[strlen(k)+1];
	stcpy(p, k);
	return p;
}

翻译大数

分段调用上述的out函数

void *robot::tran_int(int n)
{
    
    
	char *p;
	char kk[1000]="";
	if(n>1999999999)
		strcat(kk, "dev C++平台无法处理大于1999999999位的数!\n");
	else
		{
    
     //三位三位取出,存入abcd中
			int a = n/1000000000
			int b = (n%1000000000)/1000000
			int c = (n%1000000)/1000,d=n%1000;
			//不等于0时,输出并加上million或thousand
			if(a!=0)
				{
    
     
					p = out(a);
				 	strcat(kk, p);
				 	strcat(kk, "billion ");
				 	delete [] p;  // 释放在out函数中动态申请的空间
				}

			if(b!=0)
				{
    
    
					p = out(b);
					strcat(kk, p);
					stract(kk, "million ");
					delete [] p;
				}

			if(c!=0)
				{
    
    
					p = out(c);
					strcat(kk, p);
					strcat(kk, "thousand ");
					delete [] p;
				}

			if(d!=0)
				{
    
     //据英文语法规则,最后两位前一定有and
					if(d<100&&(a!=0||b!=0||c!=0))
						strcat(kk, "and ");
					p = out(d);
					strcat(kk, p);
					delete [] p;
				}
		}
	p = new char[strlen(kk)+1];
	strcpy(p, kk);
	return p;
}

机器人翻译测试

int main() {
    
    
	int n;
	cout << "请输入n:";
	cin >> n;
	cout << n << endl;
	robot brown;
	brown.set("brown", "800#", n);
	brown.print_num();
	return 0;
}

存储空间的实际分配

  • 当运行 int n;robot brown;
  • 存储空间分配如下:
    在这里插入图片描述
  • 当运行brown.set("brown", "800#", n);
  • 堆区有字符串空间被占用,具体空间分配如下:
    在这里插入图片描述
    空析构函数的作用
  • 当析构函数为空函数时:~robot() { };
  • 运行return语句后,空间状态如下:
    在这里插入图片描述
    但当运行非空的析构函数时候
  • 当析构函数为:~robot() { delete [ ] ps; };
  • 运行return语句后,空间状态如下:
    在这里插入图片描述
    可以看见存储都删掉了

猜你喜欢

转载自blog.csdn.net/uncle_ll/article/details/121730714