241228-C09-函数的传递方式
原题链接:33265.笔记 汇总2024-12-28 18:58:36
发布于:江苏
一、课前练习
回顾练习:A464.螺旋矩阵
模拟回型矩阵的填充效果即可,注意边界值的判断以及重复的填充。
#include <bits/stdc++.h>
using namespace std;
int a[105][105];
int n;
int main(){
cin >> n;
int cnt=1,x=1,y=1;
while(cnt <= n*n){
while(y<=n &&a[x][y]==0)
a[x][y++]=cnt++;
y--,x++;
while(x<=n &&a[x][y]==0)
a[x++][y]=cnt++;
x--,y--;
while(y>=1 &&a[x][y]==0)
a[x][y--]=cnt++;
y++,x--;
while(x>=1 &&a[x][y]==0)
a[x--][y]=cnt++;
x++,y++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
return 0;
}
二、函数传参
1. 数组中的地址
int a[10] = {108,2,3,4,5,6};
cout << a << endl; //内存地址 (指针) pointer
//指针类型: 存储变量在内存中的地址
cout << *a << endl; //取值符号 (*)
//数组名表示的是数组元素的首地址
int b = 19;
cout << b << endl; //取地址符号 (&)
cout << &b << endl;
cout << *(&b) << endl;
重点:数组名表示的是数组元素的首地址。
2. 变量的地址(指针)
int c = 66;
int *p = &c; //定义了一个int类型的指针
cout << p << endl;
cout << &c << endl;
3. 引用 (reference)
// 引用 n. reference: 变量的别名
int m = 6;
int *p = NULL; //野指针,空指针
int &xm = m; //定义了一个m的引用(别名)叫做xm
cout << xm << endl; //6
xm = 9;
cout << m << endl; //9
cout << xm << endl; //9
cout << p << endl; //地址相同表示是同一个变量
cout << &xm << endl; //地址相同表示是同一个变量
4. 函数的三种传递方式
(1). 值传递
(2). 地址传递(指针传递)
(3). 引用传递
#include <iostream>
using namespace std;
//1.值传递,不改变原来的值
//局部作用域:生命周期只有在函数内部,函数结束,变量释放
void change1(int a, int b){
int t = a; a = b; b = t;
printf("change: a=%d\tb=%d\n", a, b);
cout << "change:" << (&a) << endl;
}
//2.地址传递: 可以改变原来的值
void change2(int *a, int *b){
int t = *a; *a = *b; *b = t;
}
//3.引用传递:可以改变原来的值
void change3(int &a, int &b){
int t = a; a = b; b = t;
}
int main() {
int a=11, b=22;
// cout << "main:" << (&a) << endl;
printf("a=%d\tb=%d\n", a, b);
// change1(a, b); //实参
// change2(&a, &b);
change3(a, b);
printf("a=%d\tb=%d\n", a, b);
return 0;
}
三、常见数据库函数&随堂练习
实例1. A321.完成回文素数函数
补全完成 is_pal、is_prime 函数
#include<iostream>
using namespace std;
bool is_pal(int n) {
int m = 0, t = n;
while (n) {
m = m*10 + n%10;
n /= 10;
}
if(m == t) return 1;
return 0;
}
bool is_prime(int n) {
for (int i=2; i*i<=n; i++)
if (n%i==0) return 0;
return 1;
}
int main() {
int n, cnt = 0;
cin >> n;
for(int i = 11; i <= n; i++) {
if(is_pal(i) && is_prime(i)) {
cnt++;
}
}
cout << cnt;
return 0;
}
实例2. A429.函数求值
回顾三目运算符,以及小数点控制。
#include <iostream>
using namespace std;
double f(double a, double b, double c){
double t = (a>b?a:b);
return (t>c?t:c);
}
int main() {
double a, b, c;
cin >> a >> b >> c;
printf("%.2lf", f(a,b,c)/(f(a+b,b,c)*f(a,b, b+c)) ) ;
return 0;
}
实例3.A7852.【函数】计算星期几
数学库函数,周期问题使用%解决, 注意数据类型。
#include <iostream>
#include <cmath>
using namespace std;
int a, b;
int main() {
scanf("%d%d", &a, &b);
long long c = pow(a, b);
if (c%7 == 0) cout<<7;
else cout << c%7;
return 0;
}
实例4.A30598.【函数】求绝对素数
函数调用,如果这个数小于等于它的数字位置经过对换后所得的数,则输出这个数和它数字位置经过对换后所得的数。(为了防止重复出现)
#include <iostream>
using namespace std;
bool prime(int n) {
for (int i=2; i*i<=n; i++)
if (n%i==0) return 0;
return 1;
}
int main() {
for (int i=10; i<=99; i++){
int t = i%10*10+i/10;
if (prime(i) && prime(t) && i <= t){
printf("%d %d\n", i, t);
}
}
return 0;
}
实例5.A30628.【函数】哥德巴赫猜想
注意拆分 i 为 j 和 i-j 即可,另外输出的条件中注意break。
#include <iostream>
using namespace std;
bool prime(int n) {
for (int i=2; i*i<=n; i++)
if (n%i==0) return 0;
return 1;
}
int main() {
for (int i=6; i<=100; i++){
//将i拆分成 j 和 i-j
for (int j=2; j<=i-2; j++){
if (prime(j) && prime(i-j )){
printf("%d=%d+%d\n", i, j, i-j);
break;
}
}
}
return 0;
}
这里空空如也
有帮助,赞一个