一、问题及代码 :
/*
* 文件名称:TEST.cpp
* 作 者:胡嘉威
* 完成日期:2017 年 4 月 24 日
* 版 本 号:v1.0
* 对任务及求解方法的描述部分:编写函数设计一个“正整数”类,并通过一系列的成员函数对其性质进行做出判断或列出相关联的数值。
* 输入描述:无
* 问题描述:编写函数设计一个“正整数”类,并通过一系列的成员函数对其性质进行做出判断或列出相关联的数值。
* 程序输出: 6不是素数
37是素数
84的因子有:
1 2 3 4 6 7 12 14 21 28 42 84
8不是水仙花数
6是完全数
66不是28的逆向数
大于1,且小于数据成员n的水仙花数有:
153
* 问题分析:大体上还是函数循环、if条件语句及数组的应用,引入了很多新的有关类的知识,但是形式改变了一下
* 算法设计:
*/
#include<iostream>
using namespace std;
class NaturalNumber
{
private:
int n;
public:
void setValue (int x); //置数据成员n的值,要求判断是否是正整数
int getValue(); //返回私有数据成员n的值
bool isPrime(); //判断数据成员n是否为素数,是返回true,否则返回false
void printFactor(); //输出数据成员n的所有因子,包括1和n自身
bool isPerfect(); //判断数据成员n是否为完全数。若一个正整数n的所有小于n的因子之和等于n, 则称n为完全数, 如6=1+2+3是完全数。
bool isReverse(int x); //判断形式参数x是否为数据成员n的逆向数(例321是123的逆向数)。
bool isDaffodil(int x); //判断形式参数x是否是水仙花数。水仙花数的各位数字立方和等于该数,如153=1*1*1+5*5*5+3*3*3
void printDaffodils(); //显示所有大于1,且小于数据成员n的水仙花数;
};
void NaturalNumber::setValue (int x)
{
if(x<=0)
{
cout<<"输入错误!";
}
else
{
n=x;
}
}
int NaturalNumber::getValue()
{
return n;
}
bool NaturalNumber::isPrime() //判断数据成员n是否为素数,是返回true,否则返回false
{
int i,k=0;
for(i=2; i<n; i++)
{
if(n%2==0)
{
k=1;
break;
}
}
if(k==1)
{
return false;
}
else if(k==0)
{
return true;
}
}
void NaturalNumber::printFactor() //输出数据成员n的所有因子,包括1和n自身
{
int i;
//cout<<"n的因子有:";
for(i=1; i<=n; i++)
{
if(n%i==0)
{
cout<<i<<" ";
}
}
}
bool NaturalNumber::isPerfect() //判断数据成员n是否为完全数。
{
int i,sum=0;
for(i=1; i<n; i++)
{
if(n%i==0)
{
sum+=i;
}
}
if(sum==n)
{
cout<<n<<"是完全数"<<endl;
return true;
}
else
{
cout<<n<<"不是完全数"<<endl;
return false;
}
}
bool NaturalNumber::isReverse(int x) //判断形式参数x是否为数据成员n的逆向数(例321是123的逆向数)。
{
int i,j,z,q;
int a[100]= {0};
int b[100]= {0};
q=x;
for(i=1;; i++)
{
x=x/10;
if(x==0)
{
break;
}
}
x=q;
for(j=0; j<i; j++)
{
a[j]=x%10;
x=x/10;
}
x=q;
q=n;
for(i=1;; i++)
{
n=n/10;
if(n==0)
{
break;
}
}
n=q;
for(z=0; z<i; z++)
{
b[z]=n%10;
n=n/10;
}
n=q;
for(i=0; i<z; i++)
{
if(a[i]!=b[z-i])
{
cout<<x<<"不是"<<n<<"的逆向数"<<endl;
break;
return false;
}
}
if(i==z)
{
cout<<"x是n的逆向数"<<endl;
return true;
}
}
bool NaturalNumber::isDaffodil(int x) //判断形式参数x是否是水仙花数。
{
int i,z,sum=0;
int a[10]= {0};
z=x;
for(i=0;; i++)
{
a[i]=x%10;
x=x/10;
sum=sum+a[i]*a[i]*a[i];
if(x==0)
{
break;
}
}
x=z;
if(sum!=x)
{
cout<<x<<"不是水仙花数"<<endl;
//return false;
}
else
{
cout<<x<<"是水仙花数"<<endl;
//return true;
}
}
void NaturalNumber::printDaffodils() //显示所有大于1,且小于数据成员n的水仙花数;
{
int i,j,sum;
int a[3]= {0};
int k=0;
cout<<"大于1,且小于数据成员n的水仙花数有:"<<endl;
for(j=2; j<n; j++)
{
k=j;
sum=0;
for(i=0;; i++)
{
a[i]=k%10;
k=k/10;
sum=sum+a[i]*a[i]*a[i];
if(k==0)
{
break;
}
}
if(sum==j)
{
cout<<j<<"";
}
}
}
int main(void)
{
NaturalNumber nn; //定义类的一个实例(对象)
nn.setValue (6);
cout<<nn.getValue()<<(nn.isPrime()?"是":"不是")<<"素数" <<endl;
nn.setValue (37);
cout<<nn.getValue()<<(nn.isPrime()?"是":"不是")<<"素数" <<endl;
nn.setValue (84);
cout<<nn.getValue()<<"的因子有:"<<endl;
nn.printFactor();
nn.setValue (6);
cout<<endl;
nn.isDaffodil(8);
nn.setValue (6);
nn.isPerfect();
nn.setValue (28);
nn.isReverse(66);
nn.setValue (154);
nn.printDaffodils();
}
二、运行结果 :
三、心得体会 :
C++类的知识有点新,开始的时候在格式上错误了几次,幸好被改正过来了;努力很久终于把代码写好了,有点开心。
四、知识点总结 :
类的定义、类中私有形参的调用、类内及类外函数的声明和定义格式;数组内元素的储存与提取;for循环的应用;if条件语句的应用。