当我们需要把同一段代码运行多次时,就可以用到自定义函数。
举一个例子:
int Abs(int x)
{
if(x<0)
return -x;
else
return x;
}
这是一个求绝对值的自定义函数,第一个int是返回值的类型,第二个int是读入的数据类型。return是返回值。比如求绝对值的完整代码就是。
#include<bits/stdc++.h>
using namespace std;
int Abs(int x)
{
if(x<0)
return -x;
else
return x;
}
int main()
{
int x;
cin>>x;
int ans=Abs(x);
cout<<ans;
}
函数按照实现方来分类,可以分为:系统函数和自定义函数。
例如: max()、swap()等函数是由系统定义的,我们可以直接使用。
函数按照形式来分类,可以有如下4种常见的函数形式:
1、 返回类型 函数名(参数列表)
因为有返回类型,所以函数体内要有return 语句,用来返回函数的值。
执行函数的过程中,碰到return语句,将在执行完return 语句后直接退出函数,不执行函数体内后面的语句。
2、 返回类型 函数名()
这种函数是没有参数传递的。
3、 void 函数名(参数列表)
这种函数有参数传递,其中的void表示函数没有返回值,函数内部不需要return语句。
4、 void 函数名()
这种函数没有参数传递,也没有返回值。
例题:
读入字符串包含加法和乘法的算术表达式,表达式最多还包含一对小括号,输出表达式的值。
AC代码
#include<bits/stdc++.h>
using namespace std;
int sti(string t)
{
stringstream sin;
sin<<t;
int s;
sin>>s;
return s;
}
string its(int t)
{
stringstream sin;
sin<<t;
string s;
sin>>s;
return s;
}
int findop(string t,char s)
{
for(int i=0;i<t.size();i++)
if(t[i]==s)
return i;
return -1;
}
int left(string t,int s)
{
int l;
for(int i=s;i>=0;i--)
{
if(t[i]>='0'&&t[i]<='9')
l=i;
else
break;
}
if(t[0]=='-')
return l-1;
else
return l;
}
int right(string t,int s)
{
int r;
for(int i=s;i<t.size();i++)
{
if(t[i]>='0'&&t[i]<='9')
r=i;
else
break;
}
return r;
}
int ans1(string s)
{
for(int i=findop(s,'+');i>0;i=findop(s,'+'))
{
int Left=left(s,i-1);
string sa=s.substr(Left,i);
int a=sti(sa);
int Right=right(s,i+1);
string sb=s.substr(i+1,Right);
int b=sti(sb);
int c=a+b;
string sc=its(c);
s=s.substr(0,Left)+sc+s.substr(Right+1,s.size()-Right);
}
return sti(s);
}
int ans2(string s)
{
for(int i=findop(s,'*');i>0;i=findop(s,'*'))
{
int Left=left(s,i-1);
string sa=s.substr(Left,i);
int a=sti(sa);
int Right=right(s,i+1);
string sb=s.substr(i+1,Right);
int b=sti(sb);
int c=a*b;
string sc=its(c);
s=s.substr(0,Left)+sc+s.substr(Right+1,s.size()-1-Right+1);
}
return ans1(s);
}
int Ans(string t)
{
int Left=findop(t,'('),Right=findop(t,')');
if(Left==-1||Right==-1)
return ans2(t);
string s=t.substr(Left+1,Right-Left-1);
int c=ans2(s);
string sk=its(c);
s=t.substr(0,Left)+sk+t.substr(Right+1,s.size()-Right-1);
return ans2(s);
}
int main(){
string s;
cin>>s;
cout<<Ans(s);
return 0;
}