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;
}