北京大學C語言學習第二天

1.函數使用實例,max函數
求兩個變量較大值,形參實參需要兼容
code:

#include<iostream>
using namespace std;
int Max(int x,int y){
if(x>y)
return x;
return y;
}
int main(){
int n=Max(4,6);
cout<<n<<","<<Max(20,n)<<endl;
return 0;
}

函數使用實例2:判斷是否是素數的函數
code:

#include<iostream>
using namespace std;
bool IsPrime(unsigned int n){
if(n<=1)
return false;
for(int i=2;i<n;i++){//查找n的因子
if(n%i==0)
return false;
return true;
}
}
int main(){
int n;
cin>>n;
cout<<IsPrime(n)<<endl;
return 0;
}

函數使用實例3:已知三角形三個頂點位置a(x1,y1),b(x2,y2),c(x3,y3),求邊長.
code:

#include<iostream>
#include<cmath>
using namespace std;
double m;
double Angel(double x1,double y1,double x2,double y2){
m=(double)sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
int main(){
double K,P,Q;
double x1,x2,x3,y1,y2,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
K=Angel(x1,y1,x2,y2);
P=Angel(x1,y1,x3,y3);
Q=Angel(x2,y2,x3,y3);
cout<<K<<" "<<P<<" "<<Q;
return 0;
}

函數的聲明很重要,函數聲明也叫函數原型。
函數包含: 返回值類型,函數名,參數;

2.函數參數的傳遞
函數胡形參是實參的一個拷貝,且形參的改變不會影響到實參(除非形參類型是數組或者引用)
code:

#include<iostream>
using namespace std;
void swap(int a,int b){
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<" "<<b;
}
int main(){
int x=4,y=5;
swap(x,y);
return 0;
}

數組作爲函數參數
例題:編寫一個程序求得數組最大值的函數
code:

#include<iostream>
using namespace std;
int a1[4]{1,2,3,4};
int a2[4]{1,8,3,4};
//length是數組長度:length=sizeof(數組)/sizeof(數組類型); 
int FindMax(int a[],int length){
	int max=a[0];
	for(int i=0;i<length;++i)
	if(max<a[i])
	max=a[i];
	return max;
}
int main(){
	cout<<FindMax(a1,sizeof(a1)/sizeof(int))<<endl;
		cout<<FindMax(a2,sizeof(a2)/sizeof(int))<<endl;
		return 0;
}

編寫一個將所有數組置爲0的函數
code:

#include<iostream>
using namespace std;
int a1[4]={4,15,6,9};
void SetZero(int a[],int length){
for(int i=0;i<length;i++)
a[i]=0;
}
int main(){
SetZero(a1,4);
for(int i=0;i<4;i++)
cout<<a1[i]<<" ";
return 0;
}

二維數組作爲函數的參數
二維數組作爲形參時,必須寫明數組有多少列,不必寫明多少行:

void PrintArray(int a[][5]){
cout<<a[4][3];
}

寫明列數,便以其纔可以更具下表計算出元素的地址。
a[i][j]的地址:

數組首地址+i * N*sizeof(a[0][0])+j*sizeof(a[0][0]) (N是數組列數)

形參數組的首地址就是是參數組的首地址

3.遞歸初步
遞歸:一個函數自己調用自己
如1.求階乘:

int Faction(int n){
if(n<2) return 1;
else
return n*Faction(n-1);
}
//cout<<Faction(5);=>120

2.斐波那契數列
code:

int Fibo(int n){
if(n==1||n==2) return  1;
else return Fibo(n-1)+Fibo(n-2);
}

遞歸函數需要有終止條件,否則將永遠調用下去。

4.庫函數和頭文件
許多函數可以直接調用,加上頭文件即可。
C++編譯器提供許多頭文件如:
iostream
cmath
string
頭文件中包含了許多庫函數的聲明以及其他信息,如cin,cout的定義
數學庫函數:cmath
int abs(int x);
double cos(double x);
int ceil(double x); //求不小於x的最小整數
double sin(double x) ;
double sqrt(double x);
字符處理函數:ctype
int isdight(int c) //判斷c是否是數學字符
int isalpha(int c) //判斷c是否是字母
int isalnum(int c) ////判斷c是否是數學字符或字母
int islower(int c) //判斷c是否是一個小寫字母
int istoupper(int c) //判斷c是否是一個大寫字母
int tolower(int c) //大寫轉小寫
int toupper(int c) //小寫轉大寫

4.位運算

& 按位與 : A和B同時成立
| 按位或 : A,B有一個成立即可成立
^ 按位異或 : A,B相同爲0不同爲1
如:實現交換兩個變量的值。
int a=5,b=7;
a = a ^ b;
b= b ^ a;
a = a ^ b;
~ 非(取反): 取反操作
<< 左移 n位 :*2的n次方
code:

#include<stdio.h>
int main(){
int n1=15;
short n2=-15;
unsigned short n3=0xffe0;
char c=15;
n1=n1>>2;
n2>>=3;
n3>>=4;
c>>=3;
printf("n1=%d,n2=%x,n3=%x,c=%x",n1,n2,n3,c);
return 0;
}
右移  n位       :/2的n次方

按位與 &
如25& 18=16;
轉爲二進制進行位運算
也可以將某些爲置爲零,如將int 型變量的低8位全置位0,其餘位不變:
n = n & 0xffffff00;

例題: 如何判斷一個int型變量n的第七位(從右往左,從0開始數) 是否是1;
只需要表達式 “n & 0x80 ”的值是否等於0x80即可。
0x80: 1000 0000

位運算思考題:
有兩個Int型的變量a和n(0<=n<=31),要求寫一個表達式,使該表達式的值和a的第n位相同。

答案:
(a>>n) & 1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章