高级光能
函数(一)课后讲义
知识点:函数章节第一次课
一、函数的意义:
为了实现某种功能而组合起来(封装)的多个指令。
调用函数是就相当于调用了多个指令
二、自定义 6!函数
int jc()
{
int s=1;
for(int i=1;i<=6;i++)
s=s*i;
return s;
}
自定义函数的类型由返回值决定。返回值类型是什么,函数的类型就是什么。
int main()
{
cout<<jc()<<endl;
return 0;
}
调用函数,实际上就是得到返回值。
三、定义函数
数据类型
函数名()
//函数头
{
函数体;
//执行语句(包括返回值)
}
函数不允许嵌套定义:在一个函数内定义另一个函数是非法的。但是允许嵌
套使用(调用)。
函数的数据类型是函数的返回值类型(若类型为 void ,则无返回值)。
四、形式参数
添加形参丰富函数功能。
int jc(int n)
{
int s=1;
for(int i=1;i<=n;i++)s=s*i;
return s;
}
int main()
{
cout<<jc(5)<<endl;
return 0;
}
功能:计算 5!
阶乘函数里面的 int n 是形式参数。
jc(5)里面的 5 是实际参数。
多个形式参数之间要用“,”隔开,并且都要指明数据类型。
五、例题
1176 求两个数中的较大值
#include<iostream>
using namespace std;
int f(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<f(a,b);
return 0;
}2835
#include<iostream>
#include<cmath>
using namespace std;
int Func(int a,int b){//函数定义 a 和 b 是形参
return pow(a,b);
}
int main(){
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
cout<<Func(n,m)<<endl;//调用函数 n 和 m 是实参
}
return 0;
}
六、课后作业
1178 1177 2836
--------------------------------------------------------------------------------------------------------------------------
函数(二)课后讲义
知识点:局部变量和全局变量
1. 局部变量与全局变量
(1) 局部变量:定义在函数内的变量,是局部变量,从定义位置开始,在整
个函数内有效。
(2) 全局变量:定义在函数(main)外的变量,是全局变量,从定义位置开始,
在整个程序内有效。
int f(int n)
{
int s=0;
for(int i=1;i<=n;i++)
s+=i;
return s;
}
n,s,i 都只在 f()里面有效
定义时:局部变量的值是随机的,全局变量的值是默认为 0。
2. 函数的声明
(1) 我们可以在 main()之前先声明函数,在 main()之后统一定义函数。
定义函数在 main()之后,必须先声明,否则会报错
声明函数:数据类型 函数名(形式参数);
int f(int a,int b);
// int f(int ,int ); 这种格式也可以的
int main(){
cout<<f(1,2);
}
int f(int a,int b){
if(a>b) return a;
return b;
}
3. 课堂练习
1180
#include<iostream>
using namespace std;
int f(int n){
int sum=0;
for(int i=1;i<=n;i++)
sum+=i;
return sum;
}int main(){
int n;
cin>>n;
cout<<f(n);
return 0;
}
2837
方法一:
#include<iostream>
using namespace std;
int f(string s){
int i=0;
while(s[i]!='\0'){
i++;
}
return i;
}
int main(){
int n;
cin>>n;
string s;
getline(cin,s);
while(n--){
getline(cin,s);
cout<<f(s)<<endl;
}
return 0;
}
方法二:
#include<iostream>
using namespace std;
int f(string s){
int i=0;
while(s!=""){
s.erase(0,1);
i++;
}
return i;
}
int main(){
int n;
cin>>n;string s;
getline(cin,s);
while(n--){
getline(cin,s);
cout<<f(s)<<endl;
}
return 0;
}
3955
#include<iostream>
using namespace std;
int a[10010];
void f(int n){
int mx=0,mxi;
for(int i=1;i<=n;i++)
if(a[i]>=mx){
mx=a[i];
mxi=i;
}
cout<<mxi<<' '<<mx;
return ;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
f(n);
return 0;
}
4. 课后作业
3961
3962
--------------------------------------------------------------------------
函数(三)课后讲义
知识点:值传递和引用传递
1. 函数值传递
(1) int a=1;
void f(int a){
a=123;
}
int main(){
f(a);
cout<<a;
return 0;
}
运行结果输出 1。
在传递数值时,只是将实参的值复制到形参里,因此对形参的任何操作都不
会改变实参。
int a;
void f(int &a){
a=123;
}
int main(){
f(a);
cout<<a;
return 0;
}
传实参的地址就可以改变实参的值了。
“&”取地址符。
(2) 数组作为参数
数组名是该数组在内存的首地址,
将数组名作为参数传给函数,就相当于引用传递了
int a[100];
void f(int a[]){
a[3]=123;
}
int main(){f(a);
cout<<a[3];
return 0;
}
在函数中改变元素值,实参也会改变。
2. 课堂练习
4001
方法一
#include<iostream>
#include<cmath>
using namespace std;
string f(int a){
for(int i=1;i<=35;i++)
if(i*i==a)
return "Yes";
return "No";
}
int main(){
int a;
cin>>a;
cout<<f(a);
return 0;
}
方法二
#include<iostream>
#include<cmath>
using namespace std;
string f(int a){
if(sqrt(a)==int(sqrt(a)))
return "Yes";
return "No";
}
int main(){
int a;
cin>>a;
cout<<f(a);
return 0;
}2845
3. 课后作业
2844
4002
#include<iostream>
#include<cmath>
using namespace std;
int a[100];
void f(int a[],int m){
for(int i=1;i<=m;i++)
for(int j=i+1;j<=m;j++)
if(a[i]<a[j])
swap(a[i],a[j]);
for(int i=1;i<=m;i++)
cout<<a[i]<<' ';
return ;
}
int main(){
int n;
cin>>n;
while(n--){
int m;
cin>>m;
for(int i=1;i<=m;i++)
cin>>a[i];
f(a,m);
cout<<endl;
}
return 0;
}
-----------------------------------------------------------------------------------------------------
函数(四) 课后讲义
知识点:sort()排序
1. sort()默认从小到大排序
加头文件#include<algotithm>
数组长度为 n,
给 a[1] a[2] a[3]......a[n]这 n 个数排序
sort(a+1,a+n+1);
给 a[0] a[1] a[2]......a[n-1]这 n 个数排序
sort(a,a+n);
2. sort()自定义函数 cmp,实现从大到小排序
bool cmp(int a,int b)
{
return a>b;
}
int a[100005];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
return 0;
}
自定义函数是 bool 类型,自定义函数 cmp 的形参和待排序的数组类型有关。
3. sort()按照特定条件排序
(1) 例题 3827
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
bool cmp(int x,int y){
if(x%10!=y%10)
return x%10>y%10;
else//个位相等
return x<y;
}
int main(){int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);//自己写比较函数,按照特定的条件
for(int i=0;i<n;i++)
cout<<a[i]<<endl;
return 0;
}
(2) 例题 3977
#include<iostream>
#include<algorithm>
using namespace std;
double a[20010];
bool cmp(double x,double y){
if(x-int(x)!=y-int(y))
return x-int(x)>y-int(y);
else//小数部分相同相等
return x<y;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);//自己写比较函数,按照特定的条件
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
return 0;
}
4. 课堂练习
3825
#include<iostream>
#include<algorithm>
using namespace std;
int a[20010];
int f(int a){
int sum=0;
while(a){
sum+=a%10;
a/=10;
}return sum;
}
bool cmp(int x,int y){
if(f(x)!=f(y)) return f(x)>f(y);
return x<y;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
return 0;
}
5. 课后作业
1762
3981
-----------------------------------------------------------------------------------------
函数(五) 课后讲义
知识点:函数总复习
一、 课堂练习
1.3981
#include<iostream>
#include<algorithm>
using namespace std;
string s[10010];
int f(string s){//找字符串里面的数字个数
int cnt=0;
for(int i=0;i<s.size();i++)
if(s[i]>='0'&&s[i]<='9')
cnt++;
return cnt;
}
bool cmp(string x,string y){
if(f(x)!=f(y))
return f(x)>f(y);
return x<y;
}
int main(){
int n;
cin>>n;
getline(cin,s[0]);
for(int i=1;i<=n;i++)
getline(cin,s[i]);
sort(s+1,s+1+n,cmp);
for(int i=1;i<=n;i++)
cout<<s[i]<<endl;
return 0;
}
2.3995
#include<iostream>
#include<algorithm>
using namespace std;
int a[110][110];
void f(int a[][110],int m,int n){
for(int j=1;j<=n;j++)swap(a[1][j],a[m][j]);
for(int i=1;i<=m;i++)
swap(a[i][1],a[i][n]);
return ;
}
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
f(a,m,n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
return 0;
}
3.3998
#include<iostream>
#include<algorithm>
using namespace std;
int a[110][110];
void f(int a[][110],int m,int n){
for(int k=1;k<=m;k++)
//循环 m 行
for(int i=1;i<=n-1;i++)
for(int j=1;j<=n-i;j++)
if(a[k][j]>a[k][j+1])
swap(a[k][j],a[k][j+1]);
return ;
}
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
f(a,m,n);
for(int i=1;i<=m;i++){for(int j=1;j<=n;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
return 0;
}
二、 课后作业
3998
4004
----------------------------------------------------------------------------------------
别说我复制你们火箭班的教材,我学过!
曲天歌在2020-07-15 12:14:35追加了内容
在QQ里......