习题课2 2010-11-19 程序测试2-2
编写一个加密程序。输入一个6位整数的明码,按以下方法加密:首先将每位数字替换成它与7相加之和再用10求模的结果;然后逆置;输出密码。再编写程序,把这个密码还原成明码。若输入错误,则显示错误信息后退出程序。
//软件2班庞博-加密解密程序
#include
using namespace std;
int encipher(int t)//函数一:加密
{
int i,m,a,b;
for(i=0,a=100000,b=0;i<6;i++)
{ m=(t%10+7)%10;
b=m*a+b;
a=a/10;
t=t/10;
}
return b;
}
int exemption(int x)//函数二:解密
{
int i,n,a,b;
for(i=0,a=100000,b=0;i<6; i++)
{ if( x%10<7) n=x%10+10-7;
else n=(x%10-7);
b=a*n+b;
a=a/10;
x=x/10;
}
return b;
}
int main()//主函数
{
int a,b,c;
cout<<"请输入六位整数:";
cin>>a;
if(a<100000||a>999999)
{ cout<<"error"< cin.get(); return 0; } b=encipher(a); c=exemption(b); cout<<"密码是:"< cout<<"明码是:"< } 问题: (1)调用pow函数会降低运行效率 {for (i=5;i>=0;i--) b+=(((int) (a/pow(10,i))+7)%10)*(int)pow(10,(5-i)); } (2)在循环结束后输出效率更高 for(i=6;i>=1;i--) {c=c*10; b=((a%10)+7)%10; c=c+b; a=a/10; //cout< } cout< cout< (3)输入明码“000000”0一类的,但是在我的程序中没有办法对这种数字比较大小进行判断。 (4)输入明码“333333”,密码会出现0,而不是000000,或者是输入明码777733,会输出4444,而不是004444,为了在不同情况下补齐到六位又该怎样设计比较好? 程序测试3-1 1、编写一个程序,测试3个函数,它们都能够把main函数中的变量count的值增至3倍。这3个函数说明如下: (a)tripleByValue函数通过值传递count的一份副本,把值增至3倍并返回这一结果。 (b)tripleByReference函数通过引用参数传递count,用别名(即引用参数)把count 原来的值增至3倍。 (c)tripleByPointer函数通过指针参数传递count的地址,用间址方式把count原来的值增至3倍。 #include using namespace std; double tripleByValue( double x ) { return x * 3; //传值参数不能修改实参的值 } double tripleByReference( double &x ) { x = x * 3; //指针参数通过间址修改实参的值 return x; } double tripleByPointer( double *x ) { *x = *x * 3; //引用参数通过别名修改实参的值 return *x; } int main() { double count; cout<<"1, Please input count: "; cin>>count; count=tripleByValue( count ); //通过函数返回值修改count的值 cout<<"tripleByValue: "< cout<<"2, Please input count: "; cin>>count; tripleByReference( count ); //也可以count=tripleByReference(count) cout<<"tripleByReference: "< cout<<"3, Please input count: "; cin>>count; tripleByPointer( &count ); //也可以count=tripleByPointer(&count) cout<<"tripleByPointer: "< } 问题: (1)求值函数应该用return返回计算结果值,不应在函数内输出求值结果void tripleByValue (double x) { x=x*3; cout< } void tripleByReference (double &x) { x=x*3; cout< } void tripleByPointer (double *x) { *x=*x*3; cout<<*x; } (2)引用参数和指针参数的应用。引用参数和指针参数都可以通过形参读/写实参。 2、已知勒让德多项式为 ?????>---===--1 /))()1()()12((101)(21n n x p n x p n n x n x p n n n 编一程序,定义递归函数求 double poly( double &x, int n ); p n (x)的值。主函数从键盘上输入x 和n 的值, 调用poly 函数测试。 //计科()-王洁锋 #include using namespace std; double poly( double &, int ); int main() { int n; double x,p; cout<<"input n(n>=0)\t"; cin>>n; cout<<"input x(x>0)\t"; cin>>x; p=poly(x,n); cout< } double poly( double &x, int n ) { if (n==0) return 1; else { if (n==1) return x; else return ( (2*n-1) * poly( x, n-1 ) - (n-1) * poly( x, n-2 ) ) / n; } } 问题: (1)为什么x 用引用参数? (2)warning C4715: “poly”: 不是所有的控件路径都返回值 double poly(double &x,int n) { if (n==0) return 1.0; if (n==1) return x; if (n>1) return ((2*n-1)*poly(x,(n-1))-(n-1)*poly(x,(n-2)))/n; } //如果条件都不成立怎么办? (3)表达式计算: return ((2*n-1)*poly(x,n-1)-(n-1)*poly(x,n-2)/n); return(2*n-1)*poly(x,n-1)-(n-1)*poly(x,n-2)/n; if(n==0) return0; 指出以下程序中的错误: double poly(double &x,int n) { if(n=0)return0; else if(n=1)return x; else return(((2*n-1)*poly(double&x,int(n-1))-(n-1)*poly(double&x,int(n-2)))/n); } ○1“==”与“=” ○2return 1 ○3形参与实参的形式 函数原型double poly(double &x,int n); 函数调用poly( double &x, int(n-1) ) ○4表达式书写 程序测试4-1 本程序的main函数调用RandAry函数,生成20个1~20之间的随机数;调用OutAll函数显示生成的随机数序列;调用OutUnlike函数,删除生成序列中的重复数值,仅显示序列中的不同数值。显示数据不改变原来的相对顺序。 #include #include #include using namespace std; void RandAry( int ary[], int n, int min, int max ); //生成随机数序列 void OutAll( int ary[], int n ); //输出数组全部元素 void OutUnlike( int ary[], int n ); //输出数组中不相同元素 int main() { const int N=20; int ary[N]; cout<<"生成20个1~20之间的整数:\n"; RandAry(ary, N, 1, 20); //生成N个1~20之间的随机整数放在数组ary中 OutAll(ary,N); //输出数组全部原始数据 cout<<"输出不相同数据序列:\n"; OutUnlike(ary,N); //输出不相同的数据,不改变原来的相对顺序 } //生成n个min~max的随机数序列,放在数组ary中 void RandAry(int ary[], int n, int min, int max) { int i, k;