Java语言程序设计基础篇(第五章>循环)

注意:循环常见的程序错误是出现无限循环,可以按Ctrl+C来终止程序的运行

警告:1、在循环控制中,不要使用浮点值来比较值是否相等。因为浮点值都是某些值的近似 值,使用它们可能导致不精确的循环次数和不准确的结果。

2、在循环继续条件中使用浮点数将导致数值错误。

5.1输入和输出重定向

为了避免键盘输入数据繁琐,可将这些数据用空格隔开保存在一个名为input.txt的文本文件中,然后使用下面命令运行程序:

java SentinelValue < input.txt

类似的有:(将输出发送给文件)

java ClassName > output.txt

下面的命令从文件 input. txt 中获取输入,并将输出发送给文件 output.txt

java SentinelValue <input.txt> output.txt

5.2 do-while 循环

提示:do-while 循环和 while 循环基本一样,不同的是它先执行循环体一次,然后判 断循环继续条件。如果循环中的语句至少需要执行一次,建议使用 do-while 循环

while 循环与 do-while 循环的 差别在于:计算循环继续条件和执行循环体的先后顺序不同。在使用do-while循环的情况下,循环体至少执行一次。有时候,选择其中一种会比另一种更方便。

do{ 

// 循环体; 语句(组);

  } while ( 循环继续条件);

5.3 for循环

注意:如果省略 for循环中的循环继续条件,則隐含地认为循环继续条件为 true。因此图 a 的语句和图 b 的语句一样,它们都是无限循环。但是,为了避免混 淆,最好还是使用图 c 中的等价循环

 

瞥告:在 for 子句的末尾和循环体之间多写分号是一个常见的错误,eclipse中编写时无法检测到错误

for(int i=0;i<=9;i++) ;{ } //错误 

for(int i=0;i<=9;i++) { } ; //错误

5.4 最小化数值错误

提示:在循环继续条件中使用浮点数将导致数值错误。 涉及浮点数的数值误差是不可避免的,因为浮点数在计算机中本身就是近似表示的

5.5 关键字 break 和 continue

break:直接终止该循环,该循环不再执行

continue:当程序遇到 continue时,它会结束当前的迭代。 程序控制转向该循环体的末尾。换句话说,continue 只是跳出了一次迭代,而关键字 break 是跳出了整个循环

如:要计算1~10之间除3和4之外的数字之和,可以用continue在循环体内加以控制,在为3或者4时给一个continue控制,相当于跳过这两个数字

 

1、foreach和for循环的区别

for循环

for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素。在处理比较复杂的处理的时候较为方便。

foreach循环

foreach,从头到尾,对于集合中的对象遍历。适用于简单的遍历。foreach使用的时候,会锁定集合的对象,期间不能进行修改。

使用的选择

foreach相对于for循环,代码减少了,但是foreach依赖IEnumerable。在运行的时候效率低于for循环。当然了,在处理不确定循环次数的循环,或者循环次数需要计算的情况下。使用foreach比较方便。而且foreach的代码经过编译系统的代码优化后,和for循环的循环类似。

可以说,foreach语句是for语句的特殊简化版本,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。在复杂的循环设计时,还是应该使用for循环更加的灵活。

能用foreach遍历则必定能用for遍历,而用for遍历则不一定能用foreach遍历。

编程题:

1、(找出一个整数的因子)编写程序,读入一个整数,然后以升序显示它的最小因子。例如:若输入的整数是120,那么输出就是:2,2,2,3,5。

import java.util.Scanner;
class Class14{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter a number:");
        int num=scanner.nextInt();
        if(num==2||num==3){     //2,3特殊情况
            System.out.println("1 "+num);
            return;     //直接结束程序不再执行下面的语句
        }
        int count=0;
        while(true){
            for(int i=2;i<=num;i++){
                if(num%i==0){
                    count++;
                    if(count==1&&num==i){       //考虑素数情况,能被1和自身整除
                        System.out.print(1+" "+i);
                    }else{      //非素数情况
                        System.out.print(i+" ");
                    }
                    num=num/i;  //更新num
                    break;  //退出for循环
                }
            }
            if(num==1){
                break;  //退出整个while循环
            }
        }
    }
}

2、(显示金字塔)编写程序,提示用户输人一个在1到15之间的整数,然后显示一个金字塔形状 的图案,如下面的运行示例所示

 

import java.util.Scanner;
public class Class15 {
  public static void main(String args[]){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter the number of lines:");
        int a=scanner.nextInt();
        for(int i=1;i<=a;i++){
            //打印每一行的空格
            for(int k=1;k<=a-i;k++){    //规律a-i
                System.out.print("  "); //两个空格
            }
            //打印每一行的数字
            for(int j=-(i-1);j<=i-1;j++){   //范围[-(i-1),i-1]
                System.out.print(Math.abs(j)+1+" ");
            }
            System.out.println();
        }
    }
}

 3、(检查SSN)编写一个程序,提示用户输入一个社保号码,它的格式是DDD-DD-DDDD,其中D是一个数字。你的程序应该判断输入是否合法。

import java.util.Scanner;
 class Class21 {
     public static void main(String args[]) {
         Scanner scanner = new Scanner(System.in);
         System.out.print("Enter a SSN:");
         String usr = scanner.nextLine();
         //先判断输入的长度是否合法
         if (usr.length() != 11) {
             System.out.print("错误1");
             return;
         }

         for (int i = 0; i < usr.length(); i++) {
             char c = usr.charAt(i);
             //判断对应位置是否是“-”
             if (i==3||i==6) {
                 if(c!='-'){
                 System.out.print("错误2");
                 return;}
             } else {
                //判断是否是数字
                 if(c < '0' || c > '9') {
                 System.out.print("错误3");
                 return;
             }
             }
         }
         System.out.print("录入成功");
     }
 }

 4、(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串。

 

import java.util.Scanner;
public class Class22 {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter string s1:");
        String s1 = scanner.nextLine();
        System.out.print("Enter string s2:");
        String s2 = scanner.nextLine();
        if (s2.length() >= s1.length()) {
            System.out.print("输入非法!");
        }
        //s1的角标i后移,直到剩余元素个数为s2的长度为止,因为角标从0开始所以又+1
        for(int i=0;i<s1.length()-s2.length()+1;i++){
            boolean flag=true;
            //先比较s2的第一个元素
            if(s1.charAt(i)==s2.charAt(0)){
                //s2的第一个位置已经比较,所以从第二个开始比较(即角标1)
                for(int j=1;j<s2.length();j++){
                        if(s1.charAt(i+j)!=s2.charAt(j)){   //i+j,相当于让i后移
                            flag=false;
                            break;
                        }
                }
                if(flag==true){
                    System.out.print("包含");
                    return;
                }
            }
        }
        //for循环正常结束说明没有包含
        System.out.print("不包含");
        }
        }

 5、如何判断1~1000素数

class Demo02{
    //如何判断素数1~1000?
    public static void main(String[] args){
        for(int i=2;i<=1000;i++){
            //i=9
            //j=2~4
            boolean flag=true;//默认你就是素数
            for(int j=2;j<=i/2;j++){
                if(i%j==0){ //不是素数
                    flag=false;
                    break;
                }
            }
            if(flag){
                System.out.println(i);
            }
        }
    }
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值