目录
✧ʕ̢̣̣̣̣̩̩̩̩·͡˔·ོɁ̡̣̣̣̣̩̩̩̩✧ foreach加强for循环语句 ᶘ ᵒᴥᵒᶅ (´-㉨ก`)
♣ 打印金字塔
在我们的生活中,有些事物的运行与工作都不是只做一次的,而是会重复循环地连续做某事。例如:三点一线的工作学习,日升日落,行星绕着太阳周而复始的旋转........
在java中有三种循环语句:for循环语句(计次循环语句),while循环语句(前测试循环语句),do-while循环语句(后测试循环语句)。
for循环语句
我们先讲解for循环语句(计次循环语句)。
1,for循环语句的格式:for(初始化表达式;循环条件;操作表达式){循环体(执行语句)}
1)初始化表达式:给要进行操作的循环变量赋一个初始化的值,如:int i=0;
2)循环条件:要进行循环几次。并且必须返回一个Boolean类型。如:i<=66;
3)操作表达式:修改循环变量的执行语句,如i++/i--
问题:打印1到100的和
思路:首先要定义一个int型的变量sum用来存放后期相加的值(sm+=i),并给sum赋一个初始化值0。
接着我们使用for来进行遍历1到100间的数(for(int i=1;i<=100;i++)),
并让遍历的i自增(i++)。如下
java为循环语句提供了两种用来实现程序未执行完方法中的全部语句时退出的操作(即不用全部执行程序,我们也可以中途退出)的关键字:break和continue。
1,break语句用于退出整个循环,不再进行下一次循环。
2,continue语句用于退出本次循环,并执行下一次循环。
continue的使用
break关键字的使用
我们再来看看break的使用。现在我们打印一个大于等于666的sum(让程序在sum大于等于666的时候终止)
接下来我们再去看看,i为多少,(来想一想,使用了break后还是100吗?)
foreach加强for循环语句
在java中我们将形如:for(元素变量:遍历对象){执行语句}的特殊for语句叫做foreach语句,foreach语句是java5.0添加的。【注意:foreach并不是一个关键字】
1,元素变量:定义变量的类型,如:int i。
【需要注意的是:定义变量的类型不可以比要遍历的对象里面的数据精度小】
2,遍历对象:被遍历的集合对象或数组。
3,循环体:当条件满足的情况下执行的代码。
代码语义:通过foreach来循环数组array,在执行循环体的时候,数组array的值会赋值给元素变量i,之后通过打印i来进行遍历数组array。
while循环语句(前测试语句)---就是指先判断再执行的循环语句
三要素:循环变量初值(int i=1),循环条件(i<=100),循环增量(i++)。
while循环语句和if选择结构语句都是根据条件判断来决定是否执行大括号{}内的执行语句。
while循环语句
现在,让我们来写一个求1到100内的数字和的程序,感受一下whil循环语句。
只要是循环语句都会有跳转关键字:break和continue。接下来我们来看看它们在while中的应用。
break关键字的使用
当使用break时:实现当sum的值为666时,打印此时i的值的效果。
continue关键字的使用
当我们不想程序执行到特定的位置就停止运行,而是有选择的跳过我们所规定的条件时,使用continue无疑是最好的选择。如下:打印100以内偶数的和。
相信你们也发现了,在这个程序中i++的位置与之前有所不同,下面我来做一个大概的描述:
break关键字:在求当sum满足666时,打印i的值时,我们首先想到的就是在循环里面写一个if语句来判断当sum的值相等于666就跳出程序,然后,再让sum加上符合条件的i,我们的i再继续自增,自增到不符合条件时,就不再自增了。从我们的思路可以看出,sum要先加上i,i才能自增,假设我们让i先自增了,sum再加上i的话,sum就少了一个数字,即少了自增前的数字,就会导致程序的结果不是我们想要的结果。
continue关键字:在打印100以内偶数的和时,我们依旧考虑在循环里面写一个if判断语句来判断当i取模不等于0时为奇数,我们跳过此次循环不做任何操作,接着进入第二次循环,继续判断,那么,我们的if判断语句写哪呢?我们判断的主体为i,但操作的对象是sum,因此我们的if判断语句放在i的后面,sum的前面,让i能够进行自增,经过判断后sum再进行操作将符合条件的i相加。如果我们将i放在后面,如果第一个i就不符合条件(即if判断语句结构为false),那么后面的语句都不会执行,包括放在if判断语句后面的i++,所以,i一直都会是最初的值(永远不会进行if后面的操作)----就不会有什么东西输出。
do-while循环语句
再来看看do-while循环语句(后测试循环语句)-----先执行,后判断的循环语句---即,无条件执行一次。接下来,我们用代码来看看它的应用。(do-while和while的功能是相同的)
从上图我们可以看到,即使i对于while里面的循环条件i>2是不满足的,但是依旧会执行do里面的操作(sum会加上i的值)。我们接着看,如果是在while语句的话会怎么样呢?如下图:
我们可以看到sum的值为0,也就是当我们的i不满足循环条件时,就不会执行循环体里面的操作,由此可见do-while和while的区别。
三个循环体之间的区别:
最后,我们总结一下三个循环体之间的区别:
首先是for和两个while,do-while的区别:
for循环语句和其他两个循环语句有三个不同的地方:
1,for一般用于循环次数已知的情况下,其他两个用于未知次数。
2,for可以在迭代语句中包含使循环趋于结束的语句,如:i++;其他两个只能在循环体中包含
3,for语句可以在初始化语句中完成变量的初始化,如:i=1;其他两个需要在语句之前
【由此可见,使用for来进行循环的话会非常便利,因此,for用得最多】
while和do-while的区别:
1,while先判断表达是否为true,如果为true,执行循环,否则不执行。
do-while,先执行后判断,无条件执行一次。
学习了三个循环,接下来让我们来综合运用一下:
猜数字的游戏
package com.loop01;//这个是我的包名,可以去掉,加上自己的包名
import java.util.Scanner;
import java.util.Random;
public class GuessNumber {
public static void main(String[] args) {
int computerNumber=new Random().nextInt(10);
Scanner number=new Scanner(System.in);
// System.out.println(computerNumber);
System.out.print("请输入您猜的数字(1~10):");
int pepoleNumber=number.nextInt();
if(pepoleNumber == computerNumber) {
System.out.println("好棒,第一次就答对了!");}
while(pepoleNumber != computerNumber) {
if(pepoleNumber <computerNumber) {
System.out.println("您输入的数字偏小");
// System.out.println(computerNumber);
System.out.print("请再次输入您猜的数字:");
pepoleNumber=number.nextInt();
if(pepoleNumber == computerNumber) {
System.out.println("恭喜您终于猜对了!");
}
}else{
System.out.println("您输入的数字偏大");
// System.out.println(computerNumber);
System.out.print("请再次输入您猜的数字:");
pepoleNumber=number.nextInt();
if(pepoleNumber == computerNumber) {
System.out.println("恭喜您终于猜对了!");
}
}
}
}
}
打印九九乘法表
package com.loop01;
public class JiuJiu {
public static void main(String[] args) {
for(int hang=1;hang<=9;hang++) {
for(int lie=1;lie<=hang;lie++) {
System.out.print(lie+"*"+hang+"="+lie*hang+"\t");
}
System.out.println();
}
}
}
打印金字塔
package com.loop01;
import java.util.Scanner;
public class Loop_jcyt {
public static void main(String[] args) {
// //打印一半九层妖塔
// for(int jcytrow=1;jcytrow<=9;jcytrow++ ) {
// for(int jcytcol=1;jcytcol<=jcytrow;jcytcol++) {
// System.out.print("*");
// }
// System.out.println();
// }
//
//打印整个九层妖塔
int jcytrow001,jcytcol001,spacecount,startcount;
Scanner sc=new Scanner(System.in);
System.out.print("请输入您的金字塔层数:");
int cengshu=sc.nextInt();
for( jcytrow001=1;jcytrow001<=cengshu;jcytrow001++) {
for(spacecount=1;spacecount<=cengshu-jcytrow001;spacecount++) {
System.out.print(" ");
}
for(startcount=1;startcount<=2*jcytrow001-1;startcount++) {
System.out.print("*");
}
System.out.println();
}
}
}
姓名密码的 登录验证(综合)
下面我们结合for语句和while语句及break关键字来实现:输入姓名和密码,计算机判断是否正确,如果正确则显示‘加载’,不正确则可以再输入三次,三次后再没有输入正确就退出程序
代码实现如下:
import java.util.Scanner;
public class JudgeText1 {
public static void main(String[] args) {
int num1=0;
while(num1<=3){
Scanner sc_input_name=new Scanner(System.in);
Scanner sc_input_password=new Scanner(System.in);
System.out.print("请输入您的姓名:");
String name=sc_input_name.nextLine();
System.out.print("请输入您的密码:");
String password=sc_input_name.nextLine();
if (name.equals("gzm")&&password.equals("123456")) {
System.out.println(".........您的输入正确,正在为您加载中.............");
break;
}else{
System.out.printf("您还有%d次机会",3-num1);
System.out.println();
num1++;
}
if(num1==3) {
System.out.println(".............账号冻结五分钟,请稍后重试.........");
}
}
}
}
大家可能也注意到了我们判断两个数是否相等用的是“A.equals(B)”,为什么要用这个而不是‘==’?因为在我们的java中‘==’判断的是两个对象的地址是否相等,而我们只想要比较两个数据的值,就得使用equals方法。
while打印1000以内的水仙花数
首先,我们要知道什么是水仙花数,水仙花数的首要条件就是一定要是三位数的,且该数的百位数的立方加上十位数的立方再加上个位数的立方要等于该数本身。如1*1*1+5*5*5+3*3*3=153;这个代码实现的主要问题就是怎么取出百位数,十位数,及个位数的值,其实方法很多的,用什么来做都行,只要能够取到对应的数字就行。如下我们先用while循环来进行编写,之后再用for语句来打印
如上图所示,我们让i的值为100(最小的三位数),之后在while循环里面加上判断语句i<1000(让它小于1000,这样我们就可以取到1000以内的数)再在里面进行数字的百十个位数的提取。
接下来我们以123作为例子来进行讲解我们取数的过程:
- 百位:采取的是123直接整除100,得到百位数,为1。
- 十位:采取的是先使用123取模100得余数,为23,之后再对23整除,为2。
- 个位:采取的是将123取模100得余数,为23,之后再对23取模得3。
for打印1000以内的水仙花数
使用index打印输出200以内的素数和
代码效果如下:
如果看了代码后还有疑问的话,请看接下来的文字描述:
首先我们编写一个for语句,并定义一个存储素数和的变量sum,并给一个初始化值0
我们要知道,素数也叫质数,是一种只有1和它本身的因子的数。在java中的素数判断一般是使用双循环,外层的for循环表示的是当前的数,内层的for循环表示的是我们当前数前面的数的集合。那么内层循环的次数应该是多少呢?接下来我们来一步一步的分析:
- 因为1既不是素数也不是合数,因此外层循环可以直接从2开始,
- 而又根据素数的定义,我们可知,对于当前数(外层循环数)来说1是当它为素数时必备的条件,我们不将它放入集合中,那么我们的内层循环就从2开始。
- 接着到了最关键的地方---内层循环循环次数问题:
首先我们可以依照我们的习惯,将内层循环的次数写成外层数的次数。接着我们来看看所对应的i和j形成的集合
如上图所示:j形成的集合基本上后面的大半部分是不需要的,因为只有当i为素数时最后的数字是它唯一的因子(我们一开始就已经将1去除,不考虑它),除了1和最后的数字别无它数,因此我们再将最后的数去掉,不需要j遍历出来,且通过上图我们可以看到,只有前半段才有我们想要的因子,比方说合数4的因子之一2;合数10的因子之一5等。因此我们j遍历的次数就只需要遍历i/2(取中间数)次。所以我们需要定义一个变量来接收我们的中间数:int middle=i/2;
接着我们编写一个if判断语句来进行判断,如何判断?答:素数的定义。我们让当前数依次去取模它前面的数(即j生成的数)如果结果为整数(即取模后余数为0)那么我们可以判断这个数即是合数---因为前面的数中是有与它匹配的。因此我们定义一个变量index=0,如果当前为合数那么我们可以使用自增或者是加2乘2都随意的,只要和index=0(素数的标记)区别开就行,之后使用break关键字跳出(内层)j的循环,直接进行外层(i)的循环,让i到下一个数字。
在break后我们需要将此次循环的结果进行一次判断,判断我们的index是否为0,如果为0即为素数,我们打印出来,并让sum加上当前数(依旧是在外层循环里面),之后才是外层循环的遍历。
外层循环遍历完后,我们在外层循环外面打印出sum的结果
public class Sushu {
public static void main(String[] args) {
int sum=0;
for(int i=2;i<200;i++) {
int index=0;
for(int j=2;j<=i/2;j++) {
if(i%j==0) {
index++;
break;
}
}
if(index==0) {
System.out.print(i+" ");
sum+=i;
}
}
System.out.println();
System.out.println(sum);
}
}
打印输出200以内的素数和,我们还可以使用设置flag。[当flag依旧屹立不倒时我们就取那个数]
使用flag打印输出200以内的素数和
我们的循环条件依旧和前面的一样,这里就不赘述了
我们立一个flag,让它是直立的(true)
之后我们使用if语句判断是否i是合数,如果是合数,我们就让旗帜倒下(false),并退出j的循环
如上,我们在j循环结束后,设置一个判断:如果旗帜依旧是屹立不倒的,那么它就是一个素数
我们使用sum来加上符合条件的素数即可。
public class SuShu01 {
public static void main(String[] args) {
//设置flag来进行200以内的素数和
int sum=0;
for(int i=2;i<=200;i++) {
boolean flag=true;
for(int j=2;j<=i/2;j++) {
if(i%j==0) {
flag=false;
break;
}
}
if(flag) {
sum+=i;
}
}
System.out.println(sum);
}
}
对于代码有什么疑问的可以在评论区里面进行评论。
不理解代码意思或者代码有误以及觉得代码可以有一个更优的写法,请踊跃发表你们的看法--洗耳恭听及很乐意为您解惑。大家一起进步。