编程基础05

运算符的优先级

C语言运算符优先级(超详细)

sizeof(表达式):不是函数 是长度运算符

函数

封装函数的好处

  • 提高代码可维护性:修改代码功能或bug
  • 代码复用、减少冗余代码:避免重复编写相同逻辑,一方面也能降低出错风险
  • 便于测试:避免重复测试相同逻辑
  • 提高代码可扩展性:与可维护性类似,便于扩展代码功能
  • 隐藏实现细节,提高安全性(项目中更能体会到)

函数的语法定义

return_type function_name( parameter list )
{
body of the function
}

返回值类型 函数名(参数列表 变量类型 变量名, 变量类型 变量名)
{
函数体
return 返回值;
}

void 无返回值类型 也可以有return

return作用: 1.结束一个函数 2.返回一个值

函数声明

return_type function_name( parameter list );

有三种调用类型:值传递 址传递 引用调用

实例

以交换两个数为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
using namespace std;

void func()
{
// return作用: 1.结束一个函数 2.返回一个值
return ;
}

void myswap1(int* pa, int* pb)
{
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}

void myswap2(int** ppa, int** ppb) // 形参
{
int* temp;
temp = *ppa;
*ppa = *ppb;
*ppb = temp;
}

int main()
{
// 交换两个数
int a = 10, b = 20;
int* pa = &a, * pb = &b;
cout << a << " " << b << endl;
cout << pa << " " << pb << endl;
myswap1(&a, &b);
myswap2(&pa, &pb); // 实参
cout << a << " " << b << endl;
cout << pa << " " << pb << endl;
return 0;
}

指针

房子理论

定义易混淆:

1
2
3
int* pa; // int类型指针变量pa
int *pa; // int类型指针变量pa 两者作用相同
int * pa, a, b; // int类型变量a、int类型变量b、int类型指针变量pa

一句话学懂指针变量

指针变量中放的是谁的地址,*指针变量就是谁

作业

620 输出一个数的二进制有多少个1

方法1:右移和1与

遍历二进制位

暴力求解,拿到这个数的二进制中的每一位,通过移位运算,让最低位按位与1。

运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;

int main(){
int cnt = 0;
int n;
cin >> n;
for (int i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1) cnt++;
}
printf("%d\n", cnt);
return 0;
}

方法2:巧妙按位与

n = n&(n-1); 这个表达式会让n的二进制中最右边的1就消失了。大大提高了代码效率,有多少个1,循环就进行多少次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
// n = n & (n - 1)
int n;
cin >> n;
int cnt = 0;
while (n)
{
n = n & (n - 1);
cnt++;
}
cout << cnt << endl;
return 0;
}

1409 最大跨度值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int x, _min = 1000, _max = 0;
for (int i = 0; i < n; i++)
{
cin >> x;
if (_max < x)
{
_max = x;
}
if (_min > x)
{
_min = x;
}
}
cout << _max - _min << endl;
return 0;
}

1432 最大公约数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
// 最早:更相减损术(太慢了)
//辗转相除法(欧几里得算法)求最大公约数gcd

// a % b = c
// 4 % 6 = 4 a = b b = c
// 6 % 4 = 2
// 4 % 2 = 0
// 2 0 b为0,此时a为最大公约数
int gcd(int a, int b) {//函数的封装
int c = 0;
while (b!=0) {
c = a % b;
a = b, b = c;
}
return a;
}

int main() {
int a, b; cin >> a >> b;
int ans = gcd(a, b);//函数的调用
cout << ans << endl;
return 0;
}

1407求整数的和与均值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>

int main() {
int n;
scanf("%d", &n);

int sum = 0, x;
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
sum += x;
}

printf("%d %.5lf", sum, sum * 1.0 / n);
return 0;
}

1429计算星期几

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;

int main() {
int a, b, m = 7;
cin >> a >> b;
int ans = 1;
for (int i = 1; i <= b; i++) {
ans *= a % m;
ans %= m;
}
//ans ==> a^b%7

if (ans == 0) cout << "Sunday" << endl;
else if (ans == 1) cout << "Monday" << endl;
else if (ans == 2) cout << "Tuesday" << endl;
else if (ans == 3) cout << "Wednesday" << endl;
else if (ans == 4) cout << "Thursday" << endl;
else if (ans == 5) cout << "Friday" << endl;
else cout << "Saturday" << endl;

return 0;
}

编程基础05
http://yjmanman.github.io/2024/09/18/05/
作者
YuJia
发布于
2024年9月18日
许可协议