黑马程序员——3,JAVA基础(函数,数组相关)


          -----------android培训java培训、java学习型技术博客、期待与您交流!------------              

3,JAVA基础(函数,数组相关)

一:函数----》

//函数:在类中有特定功能的小程序(方法)
/*
  函数的格式:
  修饰符 返回值类型  函数名(参数类型  形式参数1,参数类型 形式参数2)
  {
          执行语句;
        //  return返回值;//该句看情况而定
  }
 
*/
 
class   Hanshu
{
         public  static void main(String[]args)  //主函数
         {
                   int a1 = jiafa(10);   
                   int a2 = jiafa(20);
                    jiafa1(30);
                   System.out.println("a1="+a1+";a2="+a2);
         }
 
         public  static   int jiafa(int n)  //具有独立的功能的代码段,提高了代码的复用性
         {
         return n+10;
         }
   /*
   函数之间不可以定义函数,函数只能够调用函数,
   定义函数时,函数结果返回给调用者,交由调用者处理
  
   */
     public  static  void  jiafa1(int n)  // void表示函数没有具体返回值
    {
         System.out.println(n+10);
         //return;    由于函数没有返回值,所以这个函数里面的return可以不写
    }
}

编译运行结果如图1


                图1

关于return返回值的一些常见写法:

  public   static    int    bijiao(int n1,int n2)  //具有独立的功能的代码段,提高了代码的复用性
   {
          return    n1==n2;  //n1与n2做比较,返回值是布尔类型的,要么为true,要么为false
   }

public    static   int    bijiao2(int n1,int n2)  //具有独立的功能的代码段,提高了代码的复用性
    {
            return (n1>n2)?n1:n2;  //这是三元运算符,n1与n2做比较,当n1大于n2时,返回n1;否则返回n2
    }


/*
函数例子演示
定义功能:打印矩形
思路:1,确定结果
      2,确定有没有未知内容
 
*/
 
class Hanshu1
{
          publicstatic void main(String[] args)
          {
                   dayin(5,6);
                   System.out.println("HelloWorld!");
          }
 
   public   static   void   dayin(int n1,int n2) //这是打印函数,没有返回值
          {
          for(inta=0;a<n1;a++)   //确定行数
                   {
          for(int b=0; b<n2;b++)  //确定列数
                   {
                    System.out.print("&");
                    }
          System.out.println();
                   }
          }
                  
}

编写函数:

功能:可以打印九九乘法表(可以根据用户需要打印到第几行)

public   static void dayin99(int n)   //这里添加了一个新的功能,可以调控打印到乘法表的第几行
          {
               for(int a=1;a<=n;a++)
                   {
                     for(int b=1;b<=a;b++)
                   {
 
        System.out.print(a+"*"+b+"="+a*b+"\t");
                    }
        System.out.println();
                   }
          }


而另外一种是直接打印完整的99乘法表:

  public  static  void   dayin99()   //这里是直接打印99乘法表
          {
                   for(int a=1;a<=9;a++)
                   {
                     for(int b=1;b<=a;b++)
                     {
                       System.out.print(a+"*"+b+"="+a*b+"\t");
                      }
                     System.out.println();
                   }
         
         
          }

         如果以上两个函数同时出现在同一个类中,就会出现重载。函数的重载:

        在同一个类中,可以存在一个以上的同名函数,要求参数个数或者参数类型不一样。

        观察函数的重载只看函数的参数列表就可以了。重载和返回值类型没有关系,和参数列表顺序有关系。

举例子 :

在同一个类中,对于函数void lizi(int x,char y,double z){}来说,

void  lizi(int a,char b,double c){}       //没有和它重载,因为两者一样
int    lizi(int x,double z,char y){}      //这个重载了,参数列表顺序不一样(顺序不同导致参数类型不一样)。
int   lizi(int x, char y){}               //这个也是重载了,参数个数不一样。
Int  lizi(int a,char b,double c){}        //这个则是不可以与题目中的函数放在同一个类里面。


二:数组----》

        数组:同一种类型数据的集合(数组就是容器)自动给数组中元素从0开始编号。

        格式:元素类型[] 数组名=new 元素类型[元素个数或数组长度]

        例如int[]   a=new   int[5];

        格式2:元素类型[] 数组名=new 元素类型[]{元素,元素……};

        例如int[]   a=new   int[]{3,4,5,6,2};

        int[]    a=new{3,4,5,6,2};

        可以用这个方法直接获取数组元素个数:数组名.length

        布尔类型的数组的元素默认值是false;

内存结构:

栈内存:存放局部变量,数据使用完了所占空间自动释放

堆内存:1,数组和对象,通过new建立的实例都放在堆内存中

                2,每一个实体都有内存地址值

                3,实体中的变量都有默认初始化值

                4,实体不在被使用,会在不确定时间内被垃圾回收站回收

             例如

             int[] a=new int[5];  在堆内存里面就有了数组实体,栈内存中的a指向这个数组

             int[] b=a;  这个a与b都是同时指向堆内存中的同一个数组

             b[2]=11; 数组中角标为2的元素被改写成11

             如果此时输出打印a[2]的话,也是会打印出11,因为a与b同时指向一个数组。

还有一种情况如下:

int[]     a=new     int[5];
System.out.println(a[5]);这种情况是属于角标越界,编译不会提示错误,但是运行时会提示异常。

class Shuzhu
{
          public  static void main(String[] args)
          {
               int[] a={10,52,48,36,4,15,25};
               printshuzhu(a) ;
 
              //System.out.println(a);这句话不是打印所有元素,而是会打印数组的哈希值
              System.out.println("HelloWorld!");
          }
         public static void printshuzhu(int[] a) //遍历数组元素并打印出来
          {
             for(int x=0;x<a.length;x++)
             {
               System.out.print(a[x]+";");
            
             }
          }
}

关于数组的一些编程应用:

 public static int getmax(int[] a) //这是第一种得到数组最大值的方法
          {
                  int max=a[0];
                   for(intx=0;x<a.length;x++)
                   {
                      if(max<a[x])
                      max=a[x];
                   }
                   returnmax;
          }
public static int getmax2(int[] a)   //这是第二种得到数组最大值的方法,采用的是读取角标的方法
          {
              int max=0;
                   for(intx=0;x<a.length;x++)
                   {
                      if(a[x]>a[max])
                               max=x;
 
                   }
          return  a[max];
          }


选择排序法:

原理:先把第一个和后面所有元素对比,选出最大值放在第一位;接着把第二位和后面所有元素对比,选出最大值放在第二位,如此类推

class Shuzhu
{
          publicstatic void main(String[] args)
          {
               int[] a={10,52,48,36,4,15,25};
              //Arrays.sort(a);这也是用来数组排序的,常用于开发中
               xuanzepaixu( a);  //这里是先排序了
               dayin( a);       //打印出来的已经从大到小排好顺序的数组了
                  
          }
         public  static  void  xuanzepaixu(int[] a)  //这是选择排序方法
          {
                   int   s=0;
             for(int x=0;x<a.length-1;x++)
             {
                for(int y=x+1;y<a.length;y++)
                     {
                              if(a[x]<a[y])
                              {
                                        s=a[x];
                                        a[x]=a[y];
                                        a[y]=s;
                              }
 
                     }
             }
          }
          public   static   void dayin(int[] a) //这是打印方法
          {
              for(int x=0;x<a.length;x++)
                   {
                            System.out.print(a[x]+";");
 
                   }
          }
 
 
}


编译运行结果如图2所示


                                              图2

 冒泡排序:

public    static   void    maopaopaixu(int[] a)//冒泡排序
          {
                   int   s=0;    //设置第三方变量
                   for(int   x=0;x<a.length-1;x++)  //决定冒泡的次数
                   {
                            for(int   y=0;y<a.length-x-1;y++)  //决定在每次冒泡过程中与相临元素比较的次数
                            {
                                      if(a[y]>a[y+1])
                                      {
                                               s=a[y];
                                               a[y]=a[y+1];
                                               a[y+1]=s;
                                      }
                            }
                  
                   }
         
          }
public  static  void  huanwei(int[] a,int b,intc)//位置换取的函数,可以使得上面的函数调用
          {
                   int   s=0;
                   if(a[b]>a[c])
                                      {
                                               s=a[b];
                                               a[b]=a[c];
                                               a[c]=s;
                                      }
 
          }


图3是折半查找


                                                 图3

 

        折半查找的原理:

        max和min这两个指示头不断的相对缩,两者的距离越来越小,当然,也不能排除要查找的数字不在这个数组里面,而这个又延伸出另外一个查数字的问题,其实当min大于max的时候,就可以确定min就是要插入的数字所在位置的数组角标。


进制之间的相互转化:

          //十进制变十六进制
            public static void  toshiliou(int n)
          {
                    for(int x=0;x<8;x++)
                   {
                             int t=n&15;//位与15,相当于二进制中每四位一段
                             if(t>9)
                             System.out.println((char)(t-10+'A'));
                             //注意要利用转换,
                             //仅仅是打印t-10+'A'的结果不是字符,而是数字!
                             //所以要转化为字符形式!
                             else
                             System.out.println(t);
                             n=n>>>4;//要转变进制的数字无符号右移4位
 
                     }
           
            }


再修改一下:

public   static void  toshiliou(int n)
          {
                    StringBuffer a=new StringBuffer();//建立一个装数据的容器
                    for(int x=0;x<8;x++)
                   {
                           
                             int   t=n&15;//位与15,相当于二进制中每四位一段
                             if(t>9)
                                      a.append(char)(t-10+'A'));//把数装进去
                             
                             else
                                       a.append(t);
                             n=n>>>4;//要转变进制的数字无符号右移4位
 
                     }
            System.out.println(a.reverse());//输出打印时反向打印
            }
查表法,十进制转成十六进制:

 public   static   void  toshiliou(int n)
{
 char[]   rq={'0','1','2','3'
          ,'4','5','6','7'
                      ,'8','9','A','B'
                      ,'C','D','E','F'};
char[]   rq1=new char[8];
 for(int x=0;x<8;x++)
{
           int t=n&15;
           rq1[x]=rq[t];
           n=n>>>4;
 
 }
 for(int x=rq1.length-1;x>=0;x--)
{
           System.out.print(rq1[x]+",");
 
 }
}
//查法表的意义在于可以对着数组角标来放进数据,再读取出来(注意顺序)
//改进方法查表法,十进制转十六进制
 public   static void  toshiliou(int n)
{
 char[] rq={'0','1','2','3'
          ,'4','5','6','7'
                      ,'8','9','A','B'
                      ,'C','D','E','F'};
 char[] rq1=new char[8];
 int   pos=rq1.length; //设定一个指针
 while(n!=0)
  {
            pos--;
            int t=n&15;
            rq1[pos]=rq[t];//反向装入数组内
            n=n>>>4;
 
  }
 for(int  x=pos;x<rq1.length;x++)//所以,这里就变成了从指针开始向最高位打印
          {
            System.out.print(rq1[x]+",");
           }
 
}
 
 
//最后的进制转化的简化
 public  static   void  zhuanhua(int n,int base,intoffset)
{
 char[] rq={'0','1','2','3'
          ,'4','5','6','7'
                      ,'8','9','A','B'
                      ,'C','D','E','F'};
 char[] rq1=new char[32];
 int  pos=rq1.length; //设定一个指针
 while(n!=0)
  {
            pos--;
            int t=n&base;
     rq1[pos]=rq[t];//反向装入数组内
            n=n>>>offset;
 
  }
 for(int x=pos;x<rq1.length;x++)//所以,这里就变成了从指针开始向最高位打印
          {
            System.out.print(rq1[x]+",");
  }
 }
       


                              -----------android培训java培训、java学习型技术博客、期待与您交流!------------ 


  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值