Java学习第五天

********************************二重循环    数字********************************

回顾:
循环结构:重复做一件事
两要素:
1、循环条件:什么时候要重复   条件里会使用条件变量  条件的一部分
2、循环体:重复做的事  

while(条件){

}
do{
} while(条件);

for(循环变量的初始化;条件判断;循环变量的迭代){
 //循环体
}

 break;结束整个循环 共10次  当第5次执行到break,剩余5次不被执行
continue;结束当前次数  整个循环继续(继续执行下一次循环)
第5次被continue,那第五次不被执行,去执行第六次循环
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

今日内容:
1、循环的嵌套
2、数组的声明及应用 

1、循环的嵌套:
业务需要在循环的里面再嵌套,理论上可以嵌套无数层
实际开发中,通常只允许嵌套三层
Loop.java

package cn.qc.javaproject1706.day5;

import java.util.Scanner;

public class Loop {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner ip = new Scanner(System.in);
  // 二重循环:循环的嵌套只有两层
  // 从控制台任意接收两个数,计算出这两个数的最大公约数(能把这两个数都除开的最大数)
  System.out.println("请输入第一个数:");
  int num1 = ip.nextInt();
  System.out.println("请输入第二个数:");
  int num2 = ip.nextInt();
  // 思路1:从2开始逐个数字去判断能否被除开
  // 思路2:线比较两个数的最小的数,用小的数去判断是否同时除开
  // 如果能,这个小的数就是最大公约数
  // 如果不能,小的数-1,看-1后能否同时除开
  // 比较出小的数,三目运算符实现
  int min = num1 > num2 ? num2 : num1;
  // 等同于
  // if(num1>num2){
  // min=num2;
  // }else{
  // min=num1;
  // }
  // for 循环变量的值就是最大公约数
  for (int i = min; i > 0; i--) {
   // 判断
   if (num1 % i == 0 && num2 % i == 0) {
    System.out.println("最大公约数为:" + i);
    break;
   }
  }
  System.out.println("请输入第三个数:");
  int num3 = ip.nextInt();
  System.out.println("请输入第四个数:");
  int num4 = ip.nextInt();
  int max = num3 > num4 ? num3 : num4;
  //for
  // for (int i = max;  ; i+=max) {
  // // 判断
  // if (i % num3 == 0 && i % num4 == 0) {
  // System.out.println("最小公倍数为:" + i);
  // break;
  // }
  // }
  //while
  int i = max;
  while (true) {
   if (i % num3 == 0 && i % num4 == 0) {
    System.out.println("最小公倍数为:" + i);
    break;
   }
   i += max;
  }

 }
}

计算最大公约数和最小公倍数

打印出二十个  1 1 2 3 5 8 13 21 34
斐波那契数列  如何打印
Ex1.java

package cn.qc.javaproject1706.day5;

public class Ex1 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int first=1;
  int second=1;
  System.out.println("1\t1\t");
  //1  1   2   3  5  8
  //使用1来控制循环的次数
  for(int i=0;i<18;i++){
   int third=first+second;
   System.out.println(third+"\t");
   //交换变量的位置
   //把原来的第二个数赋值给 第一个数中
   first=second; 
   //把计算的第三个数赋值给第二个数中  
   second=third;
  }

 }

}


质数:素数(只能被1和本身整除)
要求:计算1~100之间的素数之和
关键点:判断这个数是素数

把这个数对小于它以下到2的所有数都取余看是否为0,如果为0,则不为素数。

Ex2.java

package cn.qc.javaproject1706.day5;

public class Ex2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //计算1-100之间素数之和
  //通过循环去判断2-100之间每个数是否是素数
  //通过循环来实现
  int sum=0;
  boolean flag=true;
  //外层循环
  for(int num=2;num<=100;num++){
   //一开始先认为是素数所以要定义:flag=true
   flag=true;
   //内层循环
   for(int i=2;i<num;i++){
    if(num%i==0){
     flag=false;
     break;
    }
   }if(flag==true){
    sum+=num;
    System.out.println(num+"是素数");
   }
   else{
    System.out.println(num+"本身不是素数");
   }
  }
  System.out.println("sum="+sum);

 }

}


二重循环的执行过程
外层循环执行一次(循环/遍历 一次)内层循环要(循环所有次数)

任何循环都可以相互嵌套
break continue 只作用于自己所在的那个循环,不会跳出外面那个循环

打印图形 的原理:
外层循环控制图形的行数
内层循环控制的是图形的每一行内的个数
见Demo1.java


package cn.qc.javaproject1706.day5;
import java.util.Scanner;
public class Demo1 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner ip=new Scanner(System.in);
  System.out.println("请输入图形的长度");
  int length=ip.nextInt();
  System.out.println("请输入图形的宽度");
  int width=ip.nextInt();
  //外层循环控制行数----也就是图形的宽度
  for(int i=1;i<=width;i++){
   //内层循环控制列数---也就是长度
   for(int j=1;j<=length;j++){
    System.out.print("* ");
   }
   //输出下一行时应该换行
   System.out.println("");
  }

 }

}

 



* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 


见Demo2.java


* * * * * * * 
* * * * * * 
* * * * * 
* * * * 
* * * 
* * 

package 见Demo1;

public class Demo2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //外层控制图形的行数:要打印七行
  for(int i=1;i<=7;i++){
   //内层控制每一行打印的个数
   //直角三角形中,每一行*的个数等于行数
    for(int j=1;j<=i;j++){
     System.out.print("* ");
    }   
   System.out.println(" ");
  }
  System.out.println("------------------");
  for(int i=7;i>0;i--){
   for(int j=1;j<=i;j++){
    System.out.print("* ");
   }System.out.println(" ");
  }
 }

}


数组
当存放数据比较多时,变量使用起来比较麻烦
由变量变成数组后来变成集合

什么是数组?
数组是具有相同数据类型的变量的集合

特点:可以存放多个数据
      数据类型要相同 
      数组的长度一旦确定后无法改变
 
好处:存取效率高
      使用便捷
见代码ArrayDemo.java

package cn.qc.javaproject1706.day5;

public class ArrayDemo {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //声明数组方式1:字面量方式
  //长度5个
  int[] aryScore={75,85,96,100,60};
  //长度:3个
  String[] aryNames={"帕帕","蕊蕊","瑶瑶"};
  //元素/数组元素,数组里存放的值
  //数组长度:数组里元素的个数
  //length  能够获得数组长度
  //数组名.length  获得长度
  System.out.println("aryScore的长度为:"+aryScore.length);
  System.out.println("aryNames的长度为:"+aryNames.length);
  //JVM为数组的每个元素分配索引  第一个元素的索引是0,第二个是1,以此类推
  //数组的最大索引值是数组长度-1
  //访问数组元素就要通过数组名字和索引来实现,语法:数组名字[索引]
  //注意索引不能越界
  System.out.println("aryNames数组中,第二个姓名是:"+aryNames[1]);
  //遍历:逐个编译
  //遍历成绩数组
  //数组的索引从0开始,所以i从0开始
  for(int i=0;i<aryScore.length;i++){
   System.out.println("成绩为:"+aryScore[i]);
  }
  //把数组中低于80分成绩+5分
  for(int j=0;j<aryScore.length;j++){
   if(aryScore[j]<80){
    aryScore[j]+=5;
   }
   System.out.println("加分后的成绩为:"+aryScore[j]);
  }
 }

}


System.out.println("aryNames数组中,第二个姓名是:"+aryNames[6]);
ArrayIndexOutOfBoundsException  数组越界异常
索引超过数组长度

package cn.qc.javaproject1706.day5;

public class AryDemo2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //先声明数组,然后赋值
  //声明数组方式2,构造方式
  //int类型的默认值是0
  int[] aryScore=new int[5];
  aryScore[3]=89;
  //遍历数组
  for(int i=0;i<aryScore.length;i++){
   System.out.println(aryScore[i]);
  }

 }

}


练习:

使用数组来存放成绩,询问用户录入成绩的门数(有几个就创建长度为几的数组)

然后让用户依次输入各门课程的成绩

最后输出总成绩及平均分
Ex3.java

package cn.qc.javaproject1706.day5;

import java.util.Scanner;

public class Ex3 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner ip = new Scanner(System.in);
  System.out.println("请输入你要录入成绩的门数:");
  int num = ip.nextInt();
  //创建成绩数组,长度就是录入的门数
  float[] aryScore = new float[num];
  //让用户诸葛录入成绩到数组当中
  //aryScore.length==num
  for (int i = 0; i < aryScore.length; i++) {
   System.out.println("请输入第" + (i + 1) + "门的成绩:");
   //接收成绩直接存入数组中
   aryScore[i] = ip.nextFloat();
  }
  //数组里存放了录入的成绩,通过遍历数组来计算总成绩
  float sum = 0;
  for (int i = 0; i < num; i++) {
   sum += aryScore[i];
  }
  float avg = sum / num;
  System.out.println("你的总成绩为:" + sum + "你的平均分为:" + avg);
 }

}


随机点名系统
Ex4.java

package cn.qc.javaproject1706.day5;
import java.util.Random;
public class Ex4 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String[] aryNames={"帕帕","蕊蕊","瑶瑶","薇薇"};
  Random rd=new Random();
  //产生0~最大数,但不包含最大数
  int index=rd.nextInt(aryNames.length);
  System.out.println("名字为:"+aryNames[index]);
 }

}


声明一个成绩数组,直接赋值 倒序输出
Ex5.java

package cn.qc.javaproject1706.day5;

public class Ex5 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int[] aryScore = new int[5];
  aryScore[0] = 90;
  aryScore[1] = 45;
  aryScore[2] = 68;
  aryScore[3] = 78;
  aryScore[4] = 98;
  for (int i = aryScore.length - 1; i >= 0; i--) {

   System.out.println("倒序输出的数为:" + aryScore[i]);
  }
  // 小于60的个数
  // 遍历数组
  int num = 0;
  for (int i = aryScore.length - 1; i >= 0; i--) {
   if (aryScore[i] < 60) {
    num += 1;
   }
  }
  System.out.println("小于60分的个数为:" + num);
  // 把高于60分的成绩存入新数组中
  //计算出个数,就是新数组的长度
  int passNum=0;
  for (int i = 0;i<aryScore.length ; i++) {
   if (aryScore[i] >= 60) {
    passNum++;
   }   
  }
  //创建新数组
  int[] aryScore1 = new int[passNum];
  //把旧数组中高于60分存入新数组中
  //遍历旧数组判断每一个成绩是否高于60分
  //如果高于60分遍历新数组,判断新数组中哪一个元素没有值
  for (int i = 0;i<aryScore.length ; i++) {
   if (aryScore[i] >= 60) {
    //遍历新数组
    //从0开始找
    for(int j=0;j<aryScore1.length;j++){
     if(aryScore1[j]==0){
      aryScore1[j]=aryScore[i];
      break;
     }
    }   
   }   
  }
  System.out.println("新数组为:");
  for (int j = 0; j < aryScore1.length; j++) {
   System.out.print(aryScore1[j]+" ");
  }
  
 }
}

 

今日总结:
循环嵌套
数组:
声明方式:2种
相关概念:数组元素、索引、数组长度
特点:数据类型相同 长度固定 不要越界

操作:访问数组元素 数组名[索引]
      遍历数组

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值