2019.9.23
#//算法/数据结构
//1. 试编写一个模板函数I n p u t,它要求用户输入一个非负数,并负责验证用户所输入的数是
//否真的大于或等于0,如果不是,它将告诉用户该输入非法,需要重新输入一个数。在函数非
//成功退出之前,应给用户三次机会。如果输入成功,函数应当把所输入的数作为引用参数返回。
//输入成功时,函数应返回true, 否则返回f a l s e。上机测试该函数。
#include <iostream>
using namespace std;
template<class T>
T input(T &b)
{
int i=3;
while(i>0)
{
cin>>b;
if(b>0)
{
cout<<"yes"<<endl;
return true;
}
else{
cout<<"try"<<endl;
i--;
}
if(i<=0)
{
return false;
}
}
}
int main()
{
int a;
cout<<input(a)<<endl;
return 0;
}
//2. 试编写一个模板函数,用来测试数组a中的元素是否按升序排列
//(即a [ i ]≤a [ i + 1 ] ,其中0≤ i<n - 1)。
//如果不是,函数应返回f a l s e,否则应返回t r u e。上机测试该函数。
#include <iostream>
using namespace std;
template<class T>
T paixu(T b[])
{
int temp;
for(int i=0;i<5;i++)
{
if(b[i]<b[i-1])//前面比后面大,前面变小
{
temp=b[i-1];
b[i-1]=b[i]; //大变小
b[i]=temp;
return true;
}else
{
return false;
}
}
// for(int i=0;i<5;i++)
// {
// cout<<b[i]<<" ";
// }
}
int main()
{
int a[5]={1,9,7,5,4};
paixu(a);
cout<<paixu(a)<<endl;
return 0;
}
//3. 试编写一个非递归函数来计算n!,并上机测试函数的正确性。
#include <iostream>
using namespace std;
int jc(int n)
{
int i,a=1;
for(i=1;i<=n;i++)
{
a*=i; //累乘
}
return a;
}
int main()
{
int n;
cin>>n;
int num=jc(n);
cout<<num<<endl;
return 0;
}
//递归的n!
//*******************************
#include <iostream>
using namespace std;
int jc(int n)
{
int s=0;
if(n<=1)
{
return 1;
}else
{
s=n*jc(n-1);
}
return s;
}
int main()
{
int n;
cin>>n;
int s=jc(n);
cout<<s<<endl;
return 0;
}
//4. 1) 试编写一个计算斐波那契数列Fn 的递归函数,并上机测试其正确性。
//2,3,5,8,13,21,34,55,89,144……
#include <iostream>
using namespace std;
int Factorial(int n)
{
if(n==1||n==2)
{
return 1;
}else
{
return Factorial(n-1)+Factorial(n-2);
}
}
int main()
{
int num;
cin>>num;
cout<<Factorial(num)<<endl;
return 0;
}
//**********************************
//2) 试编写一个--非递归--的函数来计算斐波那契数列 Fn ,
//该函数应能直接计算出每个斐波那契数。上机测试代码的正确性。
// 1,1, 2,3,5,8,13,21,34,55,89,144……
#include <iostream>
using namespace std;
int feibonaqie(int n)
{
int s,a=1,b=1;
if(n==1||n==2)
{
return 1;
}else
{
for(int i=3;i<=n;i++)
{
s=a+b;
b=a;
a=s;
}
return s;
}
}
int main()
{
int n;
cin>>n;
int num=feibonaqie(n);
cout<<num<<endl;
return 0;
}
//5. 试编写一个递归函数来确定元素x 是否属于数组a[ 0:n- 1 ]。
#include <iostream>
using namespace std;
bool fun(int *a,int b,int ac)
{
if(ac==0)
{
return false;//0
}
if(b==a[ac-1])
{
return true;//1
}
else{
return fun(a,b,ac-1);
}
}
int main()
{
int a[]={1,2,3,4,5};
int b=6;
int ac=sizeof(a) / sizeof(int);
cout<<fun(a,b,ac)<<endl;
return 0;
}
//6.顺序查找数组第一个出现指定元素的位置
#include <iostream>
using namespace std;
template<typename T>
int aa(T a[],int n,int x)
{
for(int i=0;i<n;i++)
{
if(a[i]==x)
{
return i;
}
}
}
int main()
{
int a[]={1,2,3,7,5,8,6,7};
int n=sizeof(a)/sizeof(int);
int x=7;
cout<<aa(a,n,x)<<endl;
return 0;
}
又复习了一下模板类,和类模板的使用。
最后学习写了个扑克牌的随机两次交换100洗牌。
原本花色要用char的ASCII码的,但是
char 字符连接弄了我半天,还是老实用回string类吧
//扑克牌随机100次两张交换洗牌
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
const string huase[4]={"黑桃","红桃","梅花","方块"}; //char 6354
const string pai[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
const string wang[2]={"bigKing","smallKing"};
string zong[54];
void initpk()
{
int i,j=0,k=0;
for(i=0;i<52;i++)
{
if(i%4==0)
j=0;
if(i%13==0)
k=0;
while(j<4&&k<13)
{
zong[i]=huase[j]+pai[k];
k++;
j++;
break;
}
}
zong[52]=wang[0];//两个鬼
zong[53]=wang[1];
}
void show()
{
cout<<endl;
for(int i=0;i<54;i++)
{
cout<<zong[i]<<" ";
if((i+1)%13==0)
{
cout<<endl;
}
}
}
void xipai()
{
int a,b;
string temp;
srand((unsigned)time(NULL));
for(int i=0;i<100;i++)
{
a=rand()%54;
b=rand()%54;
temp = zong[a];
zong[a]=zong[b];
zong[b]=temp;
}
}
int main()
{
initpk();
show();
xipai();
show();
return 0;
}