A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM周一帆 中级黑马   /  2013-3-29 21:02  /  2826 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

深入讨论一下

3 个回复

倒序浏览
函数在程序中的主要作用就是封装,提高代码的复用性,一个功能写成一个方法,这一个很好的习惯
回复 使用道具 举报
函数在程序中的作用和特点,我说一下我的见解,一家之言,就如二楼说的,提高代码的复用性,因为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)
我给你贴代码吧!我的表达能力确实不照。
  1. #include<iostream>
  2. #include<string>
  3. #include<cmath>
  4. using namespace std;
  5. struct  Node
  6. {
  7.         double x,y;
  8. };
  9. int N=45,NN=43;
  10. int cmp(Node A,Node B)
  11. {
  12.         if(A.y>B.y)return 0;
  13.         else return 1;
  14. }
  15. int huajian(Node AB[],int n)
  16. {
  17.           sort(AB,AB+n,cmp);
  18.           int s=0;
  19.      for(int i=0;i<n;i++)//合并同类项
  20.     {
  21.             for(int j=i+1;j<n;j++)
  22.                 if(AB[i].y==AB[j].y&&AB[i].x!=0)
  23.                 {
  24.                 AB[i].x+=AB[j].x;       
  25.                 AB[j].x=0;  //  标记 是否有同类项
  26.                 }       
  27.     }
  28.     for(int i=0;i<n;i++)
  29.     {
  30.     if(AB[i].x!=0)
  31.     AB[s++]=AB[i];       
  32.     }
  33.    
  34.         return s;       
  35. }
  36. int zhuanhuan(char A[],string AB[])
  37. {
  38.         string B="";
  39.             int s=0;
  40.                 for(int i=0;i<strlen(A);i++)
  41.                 {
  42.                         if(  (A[i]=='+'||A[i]=='-')  && (  A[i-1]==')'||A[i-1]=='x' )&&i!=0)
  43.              {
  44.                      AB[s++]=B;
  45.                      B="";
  46.                 }
  47.                if( (A[i]=='+'||A[i]=='-')    &&  (   A[i-1]<='9'&&A[i-1]>='0' ) )
  48.                 {
  49.                      AB[s++]=B;
  50.                      B="";
  51.                 }
  52.                 B=B+A[i];
  53.                if(i==strlen(A)-1)
  54.        {
  55.                                    AB[s++]=B;B="";
  56.                    }
  57.                 }
  58.                 return s;
  59. }
  60. int  Tiqu(string A,Node AB[],int S)
  61. {
  62.          int l,BJ=-1,bj=-1,i,B[2],s=0,Bj=-1;
  63.      double x=0,y=0;
  64.      l=A.length();
  65.      memset(B,-1,sizeof(B));
  66.      for(int i=0;i<l;i++)
  67.      {
  68.              if(A[i]=='x')
  69.              {
  70.          BJ=i;// x 的位置
  71.          break;       
  72.              }
  73.        
  74.              if(A[i]=='.')
  75.              B[0]=i;//因子  小数点的 位置
  76.      }
  77.      for(i=l-1;i>=BJ;i--)
  78.      {
  79.              if(A[i]=='(')       bj=i;    // 括号的位置
  80.              if(A[i]=='.')           B[1]=i;  //指数  小数点的 位置
  81.              if(A[i]=='-')            Bj=i;    //判断有无 '-'
  82.              if(A[i]=='^')break;
  83.      }
  84. //***********************处理因子******************************************
  85.      if(BJ!=-1)//********************
  86.      {//x^n  n!=0
  87.         for(int j=0;j<BJ;j++)
  88.             {
  89.                    if(A[j]>='0'&&A[j]<='9')
  90.                    x=x*10+A[j]-'0';
  91.              }
  92.              if((A[0]=='+'||A[0]=='-')&&A[1]=='x')x=1;
  93.              if(A[0]=='x')x=1;
  94.              if(A[0]=='-')x=-x;
  95.         if(B[0]!=-1)
  96.         x=x*pow(0.1,BJ-B[0]-1);
  97.      }
  98.          //*****************
  99.      if(BJ==-1)// x^n  n=0
  100.      {
  101.        for(int j=0;j<l;j++)
  102.             {
  103.                    if(A[j]>='0'&&A[j]<='9')
  104.                    x=x*10+A[j]-'0';
  105.              }
  106.              if(A[0]=='-')x=-x;
  107.              if(B[0]!=-1)
  108.              x=x*pow(0.1,l-B[0]-1);
  109.             
  110.      }
  111. //****************************处理指数***************************************
  112.       if(BJ==-1)y=0;//没有指数 也就是指数为0
  113.       if(BJ!=-1)
  114.       {
  115.               for(int j=BJ+1;j<l;j++)
  116.             {
  117.                    if(A[j]>='0'&&A[j]<='9')
  118.                    y=y*10+A[j]-'0';
  119.              }
  120.              if(BJ+1==l)y=1;
  121.              if(B[1]!=-1)
  122.              {
  123.              if(bj!=-1)
  124.                  {//有括号
  125.                  y=y*pow(0.1,l-2-B[1]);
  126.                  }
  127.                  if(bj==-1)
  128.                  {
  129.                    y=y*pow(0.1,l-B[1]-1);               
  130.                    }
  131.             }
  132.       }
  133.       if(Bj!=-1)y=-y;
  134.       AB[S].x=x;
  135.       AB[S].y=y;
  136.       S++;
  137. //************************************************************************
  138. return S;
  139. }
  140. int  Multi(Node AB1[],int n,Node AB2[],int m,Node AB3[])
  141. {
  142.         int s=0;
  143.                 for(int i=0;i<n;i++)
  144.         {
  145.                 for(int j=0;j<m;j++)
  146.                 {
  147.                 AB3[s].x=AB1[i].x*AB2[j].x;
  148.             AB3[s].y=AB1[i].y+AB2[j].y;       
  149.             s++;
  150.                 }
  151.             
  152.         }
  153.     for(int i=0;i<s;i++)
  154.     {
  155.             for(int j=i+1;j<s;j++)
  156.             {
  157.                 if(AB3[i].y==AB3[j].y)
  158.                 {
  159.                 AB3[i].x+=AB3[j].x;       
  160.                 AB3[j].x=0;  //  标记 是否有同类项
  161.         //        cout<<AB1[i].x<<"          "<<AB1[i].y<<endl;
  162.                 }       
  163.             }
  164.     }
  165.         sort(AB3,AB3+s,cmp);
  166.         return s;
  167. }
  168. int  add_sub(Node tmp1[],int n,Node tmp2[],int m,Node AB3[],int N) //  0 -  1 +  NM=0,MN=1;
  169. {
  170.         Node AB1[100], AB2[100];
  171.         for(int i=0;i<n;i++)
  172.         AB1[i]=tmp1[i];
  173.         for(int i=0;i<m;i++)
  174.         {
  175.                 AB2[i]=tmp2[i];
  176.                 if(N==0)
  177.                 AB2[i].x*=-1;
  178.         }
  179.                 for(int i=0;i<n;i++)
  180.         {
  181.                 for(int j=0;j<m;j++)
  182.                 if(AB1[i].y==AB2[j].y)
  183.                 {
  184.                 AB1[i].x+=AB2[j].x;       
  185.                 AB2[j].x=0;  //  标记 是否有同类项
  186.                 }       
  187.                 AB3[i]=AB1[i];
  188.         }
  189.         for(int j=0;j<m;j++)
  190.         {
  191.                         if(AB2[j].x!=0)
  192.                         AB3[n++]=AB2[j];
  193.         }
  194.     for(int i=0;i<n;i++)
  195.     {
  196.             for(int j=i+1;j<n;j++)
  197.             {
  198.                 if(AB3[i].y==AB3[j].y)
  199.                 {
  200.                 AB3[i].x+=AB3[j].x;       
  201.                 AB3[j].x=0;  //  标记 是否有同类项
  202.         //        cout<<AB1[i].x<<"          "<<AB1[i].y<<endl;
  203.                 }       
  204.             }
  205.     }
  206.         sort(AB3,AB3+n,cmp);       
  207.         return n;
  208. }
  209. void output(Node A[],int n)
  210. {
  211.         double x,y;
  212.         int BJ=0;
  213.         for(int i=0;i<n;i++)
  214. {
  215.          x=A[i].x;
  216.          y=A[i].y;
  217.          if(x!=0)BJ=1;
  218.          if(x>0&&i!=0)cout<<'+';
  219.          if(x<0)cout<<'-';
  220.          if(y==0)
  221.          {
  222.                 cout<<fabs(x);
  223.          }
  224.          else if(y==1)
  225.          {
  226.                  if(fabs(x)!=1)
  227.                 cout<<fabs(x)<<'x';
  228.                 else cout<<'x';
  229.         }
  230.          else if(y<0)
  231.          {
  232.                  if(fabs(x)!=1)
  233.                 cout<<fabs(x)<<"x^("<<y<<')';
  234.                 else
  235.                 cout<<"x^("<<y<<')';
  236.         }
  237.          else
  238.          {
  239.                  if(fabs(x)!=1)
  240.                 cout<<fabs(x)<<"x^"<<y;
  241.                 else cout<<"x^"<<y;
  242.         }
  243. }       
  244. if(BJ==0)cout<<0;
  245. cout<<endl;
  246. }
  247. int main()
  248. {
  249.         char A1[100],A2[100];
  250.     while(cin>>A1>>A2,A1!="X")
  251.     {
  252.     string  AB[100];
  253.     int B,i,s,S1=0,S2=0,S=0;
  254.     int NM=0,MN=1;
  255.     Node AB1[100],AB2[100],AB3[100];
  256.         B=zhuanhuan(A1,AB);//  B    多少项
  257.         for(i=0;i<B;i++)
  258.         {
  259.             s=Tiqu(AB[i],AB1,S1);
  260.             S1++;
  261.         }
  262.         S1=huajian(AB1,B);
  263.         cout<<"/************字符串 A 化简后多项式*************/"<<endl;
  264.         for(int j=0;j<S1;j++)//S1  字符串 A多项式的个数
  265.         cout<<AB1[j].x<<"      "<<AB1[j].y<<endl;

  266. //        cin>>A2;
  267.         B=zhuanhuan(A2,AB);//  B    多少项
  268.         for(i=0;i<B;i++)
  269.         {
  270.             s=Tiqu(AB[i],AB2,S2);
  271.             S2++;
  272.         }
  273.         S2=huajian(AB2,B);
  274.         cout<<"/*********字符串 B 化简后多项式**********/"<<endl;
  275.         for(int j=0;j<S2;j++)//S1  字符串 A多项式的个数
  276.         cout<<AB2[j].x<<"      "<<AB2[j].y<<endl;       
  277.         cout<<"/***********多项式的乘积*************/"<<endl;
  278.         int m=Multi(AB1,S1,AB2,S2,AB3);
  279.         m=huajian(AB3,m);

  280.         output(AB3,m);
  281.     cout<<"/***********多项式的和**********/"<<endl;
  282.         int n=add_sub(AB1,S1,AB2,S2,AB3,MN);  //  0 -  1 +  NM=0,MN=1;

  283.         n=huajian(AB3,n);
  284.         output(AB3,n);
  285.     cout<<"/***********多项式的差**********/"<<endl;
  286.         int K=add_sub(AB1,S1,AB2,S2,AB3,NM);
  287.         K=huajian(AB3,K);
  288.         output(AB3,K);                   
  289.     }
  290. }
复制代码
这个代码使用C/C++写的,里面写了好多个函数。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
函数嘛,就是方法代码嘛,好处很多,不知道楼主玩过汇编没,写汇编就没有函数,其实从编程上,汇编还好理解些,只是实现一个简单功能就得很费劲,而且遇到同样的功能都能重复一下代码。所以函数在高级语言的出现,我觉得最直接就是提高代码的复用性,另外因为有经典函数,所以应用就比较规范了,也就有了移植性的考虑,而且现在的编译器功能都很强悍,最后出来的机器码和用会编写出来的差不多,但是效率不是汇编敢想象的了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马