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;
}
相关推荐
MC何失眠9 分钟前
vulnhub靶场之momentum-2
网络·python·学习·网络安全
九圣残炎28 分钟前
【从零开始的LeetCode-算法】3227. 字符串元音游戏
java·算法·leetcode
澄澈天空39 分钟前
c++ mfc调用UpdateData(TRUE)时,发生异常
c++·mfc
XZHOUMIN40 分钟前
MFC中如何在工具条动态增加菜单
c++·mfc
R6bandito_1 小时前
Qt几何数据类型:QLine类型详解(基础向)
c语言·开发语言·c++·经验分享·qt
梁小憨憨1 小时前
变分推断(Variational Inference)
人工智能·算法·机器学习
禊月初三1 小时前
C++面试突破---C/C++基础
c语言·c++·面试
就爱学编程1 小时前
重生之我在异世界学编程之C语言:选择结构与循环结构篇
c语言·数据结构·算法
一只大侠1 小时前
输入一串字符,以“?”结束。统计其中字母个数,数字个数,其它符号个数。:JAVA
java·开发语言·算法
嗨信奥1 小时前
2023年第十四届蓝桥杯Scratch国赛真题—推箱子
青少年编程·蓝桥杯