C++学习日记---第12天(函数重载+蓝桥杯基础题)

笔记复习

1.函数默认参数

在C++中,函数的形参列表中的形参是可以有默认值的,即在定义形参的同时可以初始化形参

语法:返回值类型 函数名(参数=默认值){}

cpp 复制代码
int my(int a=10,int b=20){

}

并且默认参数不止可以出现在函数实现中,也可以出现在函数的声明中

cpp 复制代码
int my(int a = 10, int b = 10);

注意事项:当我们需要对函数进行声明并且要声明的函数的形参有默认值时,形参的初始化只能出现在函数声明或函数实现的其中一个

cpp 复制代码
int my(int a=20, int b=20);

int my(int a = 20, int b = 20) {
	return a + b;
}

如果同时出现的话会导致重定义的问题

当我们给有默认参数的函数传参时,实际上在函数体内部使用的是传入的参数的值,如果不传参则默认使用形参的值

cpp 复制代码
#include<iostream>
using namespace std;

int my(int a, int b=10, int c=20) {
	return a + b + c;
}

int main() {
	cout<<my(10,30)<<endl;
//传参时是按顺序传,这里10传给a,30传给b,则在函数my中a,b分别表示10,30
	system("pause");
	return 0;
}

注意事项:在函数的参数列表中,如果某个参数有默认参数,那么后面的参数也必须有默认参数,默认参数必须在参数列表的末尾

2.函数重载

作用:函数名可以相同,提高复用性

函数重载需满足下面条件:

1.同一个作用域下

2.函数名称相同

3.函数参数类型不同或者个数不同或者顺序不同

注:函数的返回值不可以作为函数重载的条件,仅仅修改返回值类型无法进行函数重载

1).函数参数类型不同的函数重载

cpp 复制代码
#include<iostream>
using namespace std;

void my(int a) {
	cout << "my(int)" <<a<< endl;
}

void my(double a) {
	cout << "my(double)"<<a<< endl;
}

int main() {
	my(2);
	my(2.12);
	system("pause");
	return 0;
}

2).函数参数个数不同的函数重载

cpp 复制代码
#include<iostream>
using namespace std;

void my(int a) {
	cout << "my(int)" <<a<< endl;
}

void my(int a,int b) {
	cout << "my(double int)"<<a<<b<< endl;
}

int main() {
	my(2,3);
	my(2);
	system("pause");
	return 0;
}

3).函数参数类型顺序不同的函数重载

cpp 复制代码
#include<iostream>
using namespace std;

void my(double c, int a) {
	cout << "my(int)" <<c<<a<< endl;
}

void my(int a,double b) {
	cout << "my(double int)"<<a<<b<< endl;
}

int main() {
	my(2.12,3);
	my(2,2.12);
	system("pause");
	return 0;
}

4).引用的函数重载

函数参数类型的函数重载

cpp 复制代码
#include<iostream>
using namespace std;

void my(int& a) {//参数类型为变量
	cout << "my(int &a)" << endl;
}

void my(const int& a) {//参数类型为不可修改的常量
	cout << "my(const int &a)" << endl;
}

int main() {
	int a = 10;
	my(a);//a是变量,因此调用的是第一个函数
	my(20);//20是常量,因此调用的是第二个函数
	system("pause");
	return 0;
}

5).函数默认参数的函数重载

cpp 复制代码
#include<iostream>
using namespace std;

void my(int a, int b=10) {
	cout << "shang" << endl;
}

void my(int a) {
	cout << "xia" << endl;
}
int main() {
	my(10);//只传入一个参,但上面两个函数都是接收一个参数即可,因此此时无法发生函数重载
	system("pause");
	return 0;
}

注意事项:当函数有默认参数时,可能无法发生重载

6).总结

函数重载需要保证函数名相同,作用域相同,在函数名相同的情况下区分不同的函数主要是在函数的参数列表上做文章,包括参数的数据类型,参数的个数,参数数据类型的顺序,而能否使用这些条件的判断方法是在调用函数时能否区分会调用哪个函数。

精选好题

学习到的知识点

1.双循环遍历数组的列

对于一个二维数组,当我们用双循环去遍历数组时往往是第一个元素开始从左往右,这时候我们将循环换一下,就可以实现从上到下先遍历数据的列。

cpp 复制代码
#include<iostream>
using namespace std;

int main() {
	string arr[] = { "1234","5678" };
	//这个数组我们可以将其视为二维数组,其第一列的元素从上到下分别为1,5
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 2; j++) {
			cout << arr[j][i];
			if (j == 1) {
				cout << endl;
			}
		}
	}
	return 0;
}
2.输出一个数组或字符串中连续的相同元素的最大长度

例如:11001100001111,那么连续的0的最大长度为4

cpp 复制代码
#include<iostream>
using namespace std;

int main() {
	int arr[] = { 1,1,0,0,1,0,1,0,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int max_1 = 0;//数组中连续的1的最大数量
	int d = 0;
	for (int i = 0; i < len; i++) {
		if (arr[i] == 1) {
//当数组的元素为1时,d加1,同时判断d是否大于max_1,如果d大于则将d的值赋给max_1;
			d += 1;
			if (d > max_1) {
				max_1 = d;
			}
		}
		else {
//当数组的元素为0时,将d归零,这样d就能够表示每一段连续的1的数量
			d = 0;
		}
	}
	cout << max_1;
	return 0;
}
3.正难则反

拿到这道编程题我们可以注意到,当有空的时候必须全为o,而没空只需要至少1个x就可以,因此我们可以从方面的角度切入。

答案

法一(正面切入):

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 100;
string arr[N];

int main() {
	int a = 0;
	int D = 0;
	int max_D=0;
//max_D记录了最多的连续有空天数
	int d=0;
//d记录每一次连续有空的天数
	cin >> a >> D;
	for (int i = 0; i < a; i++) {
		cin >>arr[i];
	}
	for (int i = 0; i < D; i++) {
		int c = 0;
		for (int j = 0; j < a; j++) {
			if (arr[j][i] == 'o') {
				c += 1;
            //当字符为o时c加1,如果每个人这一天都有空,那么c等于a
			}
		}
		if (c == a) {
			d += 1;
			if (d > max_D) {
				max_D = d;
			}
		}
		else {
			d = 0;
    //当c不等于a时说明出现了一个人是x,那么就不连续,故d要重置
		}
	}
	cout << max_D;
	return 0;
}

法二(反面切入):

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 105;
string D[N];
int n, m;

bool check(int l, int r) {
	for (int k = l; k <= r; ++k) {
		for (int x = 0; x < n; ++x) {
			if (D[x][k] == 'x') {
				return false;
			}
		}
	}
	return true;
}

int main() {
	cin >> n >> m;
	for (int i = 0; i < n; ++i) {
		cin >> D[i];
	}
	int ans = 0;
	for (int i = 0; i < m; ++i) {
		for (int j = i; j < m; ++j) {
			if (check(i, j)) {
				ans = max(ans, j - i + 1);
			}
		}
	}
	//上面for循环和bool函数中的for循环可以实现从第一列的第一个元素开始从上到下遍历到
	//第一列的最后一个元素,再从第二列的第一个元素开始以此类推
	cout << ans;
	return 0;
}
相关推荐
会周易的程序员2 分钟前
5Draft使用说明书
服务器·c++·分布式·raft·共识
ysu_03147 分钟前
02-单链表完全指南
c语言·数据结构·算法·leetcode
码匠许师傅17 分钟前
【设计模式精讲】21.迭代器模式(Iterator)
c++·设计模式·rpc·迭代器模式·软件工程·uml
生态学者19 分钟前
香港理工大学Nature Communications:沿海塑料际古菌组特征及生态影响
大数据·人工智能·算法·r语言·微信公众平台
YYYing.24 分钟前
【C++进阶系列 (一)】关于线程堆栈的那些事 (上篇)
c语言·开发语言·c++·线程堆栈
努力努力再努力wz34 分钟前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
ly-2725335 分钟前
IEEE PDF eXpress终稿检测踩坑记录:PDF图片字体未嵌入与LaTeX参考文献编译异常解决方法
服务器·人工智能·算法
代码不停43 分钟前
子序列问题
java·算法
火眼金睛炼单词44 分钟前
零基础高效记忆单词:小程序学习法的完整实操指南
学习·小程序