北京大学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

发布了191 篇原创文章 · 获赞 66 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42403069/article/details/105537171