注意:循环常见的程序错误是出现无限循环,可以按Ctrl+C来终止程序的运行
警告:1、在循环控制中,不要使用浮点值来比较值是否相等。因为浮点值都是某些值的近似 值,使用它们可能导致不精确的循环次数和不准确的结果。
2、在循环继续条件中使用浮点数将导致数值错误。
5.1输入和输出重定向
为了避免键盘输入数据繁琐,可将这些数据用空格隔开保存在一个名为input.txt的文本文件中,然后使用下面命令运行程序:
java SentinelValue < input.txt
类似的有:(将输出发送给文件)
java ClassName > output.txt
下面的命令从文件 input. txt 中获取输入,并将输出发送给文件 output.txt
java SentinelValue 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
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);
}
}
}
}