********************************二重循环 数字********************************
回顾:
循环结构:重复做一件事
两要素:
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种
相关概念:数组元素、索引、数组长度
特点:数据类型相同 长度固定 不要越界
操作:访问数组元素 数组名[索引]
遍历数组