黑马程序员技术交流社区
标题:
函数在程序中的作用以及运行特点
[打印本页]
作者:
HM周一帆
时间:
2013-3-29 21:02
标题:
函数在程序中的作用以及运行特点
深入讨论一下
作者:
胡志超
时间:
2013-3-29 21:08
函数在程序中的主要作用就是封装,提高代码的复用性,一个功能写成一个方法,这一个很好的习惯
作者:
刘胜寒
时间:
2013-3-29 21:37
函数在程序中的作用和特点,我说一下我的见解,一家之言,就如二楼说的,提高代码的复用性,因为java是面向对象的吗?调用函数他就会返回一个你想要的值。这个是很好的。我就想起了,我搞的一个数据结构课程设计,做什么一元多次项的操作,只是进行简单的加减乘。给你两个字符串进行运算。
例如给你 这么个东西:
6x^(-3)-x+4.4x^2-1.2x^9 -6x^(-3)+5.4x^2-x^2+7.8x^15
求这连个东西的加减乘的结果:
(6x^(-3)-x+4.4x^2-1.2x^9)+(-6x^(-3)+5.4x^2-x^2+7.8x^15)= -x+8.8x^2-1.2x^9+7.8x^15
(6x^(-3)-x+4.4x^2-1.2x^9)-(-6x^(-3)+5.4x^2-x^2+7.8x^15)= 12x^(-3)-x-1.2x^9-7.8x^15
(6x^(-3)-x+4.4x^2-1.2x^9)*(-6x^(-3)+5.4x^2-x^2+7.8x^15)= -36x^(-6)+6x^(-2)
我给你贴代码吧!我的表达能力确实不照。
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
struct Node
{
double x,y;
};
int N=45,NN=43;
int cmp(Node A,Node B)
{
if(A.y>B.y)return 0;
else return 1;
}
int huajian(Node AB[],int n)
{
sort(AB,AB+n,cmp);
int s=0;
for(int i=0;i<n;i++)//合并同类项
{
for(int j=i+1;j<n;j++)
if(AB[i].y==AB[j].y&&AB[i].x!=0)
{
AB[i].x+=AB[j].x;
AB[j].x=0; // 标记 是否有同类项
}
}
for(int i=0;i<n;i++)
{
if(AB[i].x!=0)
AB[s++]=AB[i];
}
return s;
}
int zhuanhuan(char A[],string AB[])
{
string B="";
int s=0;
for(int i=0;i<strlen(A);i++)
{
if( (A[i]=='+'||A[i]=='-') && ( A[i-1]==')'||A[i-1]=='x' )&&i!=0)
{
AB[s++]=B;
B="";
}
if( (A[i]=='+'||A[i]=='-') && ( A[i-1]<='9'&&A[i-1]>='0' ) )
{
AB[s++]=B;
B="";
}
B=B+A[i];
if(i==strlen(A)-1)
{
AB[s++]=B;B="";
}
}
return s;
}
int Tiqu(string A,Node AB[],int S)
{
int l,BJ=-1,bj=-1,i,B[2],s=0,Bj=-1;
double x=0,y=0;
l=A.length();
memset(B,-1,sizeof(B));
for(int i=0;i<l;i++)
{
if(A[i]=='x')
{
BJ=i;// x 的位置
break;
}
if(A[i]=='.')
B[0]=i;//因子 小数点的 位置
}
for(i=l-1;i>=BJ;i--)
{
if(A[i]=='(') bj=i; // 括号的位置
if(A[i]=='.') B[1]=i; //指数 小数点的 位置
if(A[i]=='-') Bj=i; //判断有无 '-'
if(A[i]=='^')break;
}
//***********************处理因子******************************************
if(BJ!=-1)//********************
{//x^n n!=0
for(int j=0;j<BJ;j++)
{
if(A[j]>='0'&&A[j]<='9')
x=x*10+A[j]-'0';
}
if((A[0]=='+'||A[0]=='-')&&A[1]=='x')x=1;
if(A[0]=='x')x=1;
if(A[0]=='-')x=-x;
if(B[0]!=-1)
x=x*pow(0.1,BJ-B[0]-1);
}
//*****************
if(BJ==-1)// x^n n=0
{
for(int j=0;j<l;j++)
{
if(A[j]>='0'&&A[j]<='9')
x=x*10+A[j]-'0';
}
if(A[0]=='-')x=-x;
if(B[0]!=-1)
x=x*pow(0.1,l-B[0]-1);
}
//****************************处理指数***************************************
if(BJ==-1)y=0;//没有指数 也就是指数为0
if(BJ!=-1)
{
for(int j=BJ+1;j<l;j++)
{
if(A[j]>='0'&&A[j]<='9')
y=y*10+A[j]-'0';
}
if(BJ+1==l)y=1;
if(B[1]!=-1)
{
if(bj!=-1)
{//有括号
y=y*pow(0.1,l-2-B[1]);
}
if(bj==-1)
{
y=y*pow(0.1,l-B[1]-1);
}
}
}
if(Bj!=-1)y=-y;
AB[S].x=x;
AB[S].y=y;
S++;
//************************************************************************
return S;
}
int Multi(Node AB1[],int n,Node AB2[],int m,Node AB3[])
{
int s=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
AB3[s].x=AB1[i].x*AB2[j].x;
AB3[s].y=AB1[i].y+AB2[j].y;
s++;
}
}
for(int i=0;i<s;i++)
{
for(int j=i+1;j<s;j++)
{
if(AB3[i].y==AB3[j].y)
{
AB3[i].x+=AB3[j].x;
AB3[j].x=0; // 标记 是否有同类项
// cout<<AB1[i].x<<" "<<AB1[i].y<<endl;
}
}
}
sort(AB3,AB3+s,cmp);
return s;
}
int add_sub(Node tmp1[],int n,Node tmp2[],int m,Node AB3[],int N) // 0 - 1 + NM=0,MN=1;
{
Node AB1[100], AB2[100];
for(int i=0;i<n;i++)
AB1[i]=tmp1[i];
for(int i=0;i<m;i++)
{
AB2[i]=tmp2[i];
if(N==0)
AB2[i].x*=-1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(AB1[i].y==AB2[j].y)
{
AB1[i].x+=AB2[j].x;
AB2[j].x=0; // 标记 是否有同类项
}
AB3[i]=AB1[i];
}
for(int j=0;j<m;j++)
{
if(AB2[j].x!=0)
AB3[n++]=AB2[j];
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(AB3[i].y==AB3[j].y)
{
AB3[i].x+=AB3[j].x;
AB3[j].x=0; // 标记 是否有同类项
// cout<<AB1[i].x<<" "<<AB1[i].y<<endl;
}
}
}
sort(AB3,AB3+n,cmp);
return n;
}
void output(Node A[],int n)
{
double x,y;
int BJ=0;
for(int i=0;i<n;i++)
{
x=A[i].x;
y=A[i].y;
if(x!=0)BJ=1;
if(x>0&&i!=0)cout<<'+';
if(x<0)cout<<'-';
if(y==0)
{
cout<<fabs(x);
}
else if(y==1)
{
if(fabs(x)!=1)
cout<<fabs(x)<<'x';
else cout<<'x';
}
else if(y<0)
{
if(fabs(x)!=1)
cout<<fabs(x)<<"x^("<<y<<')';
else
cout<<"x^("<<y<<')';
}
else
{
if(fabs(x)!=1)
cout<<fabs(x)<<"x^"<<y;
else cout<<"x^"<<y;
}
}
if(BJ==0)cout<<0;
cout<<endl;
}
int main()
{
char A1[100],A2[100];
while(cin>>A1>>A2,A1!="X")
{
string AB[100];
int B,i,s,S1=0,S2=0,S=0;
int NM=0,MN=1;
Node AB1[100],AB2[100],AB3[100];
B=zhuanhuan(A1,AB);// B 多少项
for(i=0;i<B;i++)
{
s=Tiqu(AB[i],AB1,S1);
S1++;
}
S1=huajian(AB1,B);
cout<<"/************字符串 A 化简后多项式*************/"<<endl;
for(int j=0;j<S1;j++)//S1 字符串 A多项式的个数
cout<<AB1[j].x<<" "<<AB1[j].y<<endl;
// cin>>A2;
B=zhuanhuan(A2,AB);// B 多少项
for(i=0;i<B;i++)
{
s=Tiqu(AB[i],AB2,S2);
S2++;
}
S2=huajian(AB2,B);
cout<<"/*********字符串 B 化简后多项式**********/"<<endl;
for(int j=0;j<S2;j++)//S1 字符串 A多项式的个数
cout<<AB2[j].x<<" "<<AB2[j].y<<endl;
cout<<"/***********多项式的乘积*************/"<<endl;
int m=Multi(AB1,S1,AB2,S2,AB3);
m=huajian(AB3,m);
output(AB3,m);
cout<<"/***********多项式的和**********/"<<endl;
int n=add_sub(AB1,S1,AB2,S2,AB3,MN); // 0 - 1 + NM=0,MN=1;
n=huajian(AB3,n);
output(AB3,n);
cout<<"/***********多项式的差**********/"<<endl;
int K=add_sub(AB1,S1,AB2,S2,AB3,NM);
K=huajian(AB3,K);
output(AB3,K);
}
}
复制代码
这个代码使用C/C++写的,里面写了好多个函数。
作者:
VOIDMAIN
时间:
2013-3-29 22:36
函数嘛,就是方法代码嘛,好处很多,不知道楼主玩过汇编没,写汇编就没有函数,其实从编程上,汇编还好理解些,只是实现一个简单功能就得很费劲,而且遇到同样的功能都能重复一下代码。所以函数在高级语言的出现,我觉得最直接就是提高代码的复用性,另外因为有经典函数,所以应用就比较规范了,也就有了移植性的考虑,而且现在的编译器功能都很强悍,最后出来的机器码和用会编写出来的差不多,但是效率不是汇编敢想象的了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2