本周学习了选择结构和循环结构
目录
http://t.csdn.cn/Kk6d2http://t.csdn.cn/Kk6d2
首先是if选择结构:
1.基本的if选择结构:
语法结构为:
if(条件){
//代码块
}
执行规律:
如果条件为true,执行{}里的代码块,执行完代码块之后继续执行{}后面的代码
如果条件为false,则跳过if选择结构,执行{}后面的代码
注意:条件不管是多简单还是多复杂,其运行结果都是布尔值,true或false
2.复杂的if选择结构
首先要结合运算符的优先级编写条件:
最高的优先级:( )
最低的优先级:=
优先级:!> 算术运算符 > 关系运算符 > && > ||
复杂条件使用括号提高可读性
双分支if-else选择结构
语法结构:
if ( 条件 ) {
//代码块1
}else {
//代码块2
}
执行规律:如果条件为true,执行代码块1,执行完代码块1后,结束整个if-else结构,继续往后执行if-else结构后面的代码
如果条件为false,执行代码块2,执行代码块2,执行完代码块2后,结束整个if-else结构,继续往后执行if-else结构后面的代码
多重if分支选择结构
语法结构:
if ( 条件1) {
//代码块1
}
else if (条件2) {
//代码块2
}
else {
//代码块3
}
执行规律:
判断条件1,若条件1为true,则执行代码块1,执行完代码块1,结束整个if-elsei-if结构,执行if-else-if后面的代码
如果条件1为false,则继续往下判断条件2,如果条件2为true,则执行代码块2,执行完代码块2,结束整个if-else-if结构,执行if-else-if后面的代码
如果条件2为false,则继续往下判断条件3,如果条件3为true,则执行代码块3,执行完代码块3,结束整个if-else-if结构,执行if-else-if后面的代码
…………………………
所有条件都不满足执行else中的代码块n
注意:
(1)所有的条件都为布尔值
(2)else if可以有很多个
(3)else是可以省略不写的,当所有的条件都不满足,并且没有else是会直接结束整个if-else-if
多重if选择结构里的条件不能随意排列,要将要求严格的排在前面,如果要改还需要加上其他的闲置条件达到目的!
http://t.csdn.cn/duuBghttp://t.csdn.cn/duuBg
嵌套的if选择结构
语法结构:
if(条件1) {
if(条件2) {
代码块1
} else {
代码块2
}
} else {
代码块3
}
执行规律:嵌套if选择结构,在一个if选择结构中包含另一个完整的if选择结构
执行条件:根据条件是否成立决定执行对应的代码
String类型数据的判断
Scanner类中有能够获取String类型数据的方法,使用的是equals来对其进行比较
比如:Scanner sc = new Scanner(System.in);
String str = sc.next();
str.equals("好");
Math.Random的使用
随机获取一个[num1,num2)之间的int类型的整数(num2>num1)
int num=(int)(Math.random()*(num2-num1)+num1);
//Math.Random():随机产生一个大于等于0.0,小于1.0之间的double类型的数据
double num1 = Math.random();
System.out.println(num1);
//Math.random()*10:随机产生一个大于等于0.0,小于10.0之间的double类型的数据
double num2=Math.random()*10;
System.out.println(num2);
//(int)(Math.random()*10):随机产生一个大于等0,小于10之间的int类型数据
int num3=(int)(Math.random()*10);
System.out.println(num3);
//随机产生一个大于等于19,小于51之间的随机数
int num4=(int)(Math.random()*32+19);
System.out.println(num4);
switch选择结构
执行规律:根据表达式的值去匹配case后面的常量值,匹配上了就执行对应的语句,执行完对应语句后,执行break,结束整个switch结构,继续往下执行switch选择结构之后的代码。
如果表达式的值与所用的常量值不匹配,就执行default里面的语句,执行完之后执行break退出整个switch选择结构。
语法结构:
switch(表达式){
case 常量1:
//语句1;
break;
case 常量2:
//语句2;
break;
case 常量3:
//语句3;
break;
……………………
default:
//语句n;
break;
}
注意事项:
1.表达式的值可以是 int、short、byte、char、枚举类型、String(JDK1.7及以后支持)
2.case后面的常量值不能相同
3.default语句可以省略不写,如果写上表示表达式的值与所用常量值不匹配,就执行default里的语句。default语句可以写在任意位置,一般写在Switch的末尾位置
4.switch选择结构只能处理等值判断的情况
5.break的作用是结束整个switch选择结构,如果缺少,代码会继续向下执行下一个case里的语句,这种现象成为“case穿透”现象
case穿透现象的使用
Scanner sc = new Scanner(System.in);
int month = sc.nextInt();
switch (month) {
case 2:
case 3:
case 4:
System.out.println("属于春天");
break;
case 5:
case 6:
case 7:
System.out.println("属于夏天");
break;
case 8:
case 9:
case 10:
System.out.println("属于秋天");
break;
case 11:
case 12:
case 1:
System.out.println("属于冬天");
break;
default:
System.out.println("输入错误");
}
这样写直接省了16行代码!
http://t.csdn.cn/3yHLXhttp://t.csdn.cn/3yHLX
while循环
语法结构:
初始值;
while(循环条件){
//循环操作代码
迭代部分
}
执行规律:
(1).首先执行1次初始值代码
(2).判断循环条件,如果循环条件为true,就执行{}里面的循环操作代码和迭代部分的代码, 迭代完之后,继续返回判断循环条件,根据循环条件的结果决定是否继续执行循环操作
如果循环条件为false,则结束整个while循环结构,继续往下执行while循环结构之后的代码
注意:
(1).初始值代码只执行一次
(2).循环条件不管写的多么简单或者多么复杂,结果都只能是布尔值,要么为true要么为false
(3).迭代部分的作用是改变初始值,让循环条件再某一时刻不满足,从而结束整个while循环结构
(4).while循环是先判断循环条件,再根据循环条件的结果决定是否执行循环,如果第一次就不满足条件,循环操作时不会执行的。
do-while循环
语法结构
初始值1;
do{
循环操作
迭代
}while(循环条件);
执行规律:
1.首先执行一次初始值代码
2.进入{}里执行一次循环操作和迭代部分,执行完之后进行条件判断,如果条件为true,返回{}里执行循环操作和迭代部分,如果条件为false,则结束整个do-while循环结构,继续往下执行do-while循环结构后面的代码
注意:
1.初始值只执行一次
2.循环条件不管写的多么简单还是复杂,都只能时布尔值,要么为true,要么为false
3.do-while循环是先执行一次循环操作,再判断循环条件,因此,如果第一次判断循环条件就不满足,循环操作也会执行一次(do-while循环里的循环操作至少会执行一次)
http://t.csdn.cn/Ou4h0http://t.csdn.cn/Ou4h0
for循环
for循环:
语法结构:
for(初始值;循环条件;迭代部分){
循环操作
}
执行规律:
(1).首先执行1次初始值代码
(2.)判断 循环条件是否成立,如果循环条件为true,则执行{}里的循环操作代码,执行循环操作后,进行迭代,迭代完再进行循环条件判断,根据循环条件的结构决定是否继续执行循环操作
注意:
(1).初始值只执行1次
(2).循环条件只能是布尔值,要么为true,要么为false
(3).如果第一次判断循环条件就不满足,那么循环操作一次都不会执行。
for循环中的常见问题
问题1:for循环中缺少初始值,编译不能通过,初始值可以写在for循环外面,也可以写在for循环()内
int i =1;
for(;i<=10;i++){
System.out.println(i);
}
问题2:for循环缺少循环条件,会进入死循环
for(int i=0;;i++){
System.out.println("这是 "+i);
}
问题3:for循环缺少迭代部分,会进入死循环,可以在{}里添加迭代代码,也可以在()最后位置添加迭代代码
for (int i = 0; i < 10;) {
System.out.println("这是 " + i);
}
问题4:for循环缺少初始值、循环条件、迭代,会进入死循环
for(;;){
System.out.println("这是测试");
}
需要多次重复执行一个或多个任务的问题考虑使用循环来解决
无论哪一种循环结构,都有4个必不可少的部分:初始部分、循环条件、循环体、更新循环变量
三种循环的区别
(1). 语法不同
(2).执行顺序
while 循环:先判断,再执行
do-while循环:先执行,再判断
for循环:先判断,再执行
(3).适用情况
循环次数确定的情况,通常选用for循环
循环次数不确定的情况,通常选用while或do-while循环
http://t.csdn.cn/Ou4h0http://t.csdn.cn/Ou4h0
多重循环:
一个循环体内有包含另一个完整的循环结构
执行规律:
(1)外层循环控制行,内层循环控制列
(2)外层循环执行一次,内层循环执行了一遍
结构:
while(循环条件1){
//循环操作1
while(循环条件2){
//循环操作2
}
}
-----------------------
do{
//循环操作1
do{
//循环操作2
}while(循环条件2);
}while(循环条件1);
-----------------------
for(循环条件1){
//循环操作1
for(循环条件2){
//循环操作2
}
}
------------------------
while(循环条件1){
//循环操作1
for(循环条件2){
//循环操作2
}
}
注意
各循环可互相嵌套
一般不超过三层
外层循环变量变化一次,内层循环变量要变化一遍
break语句
作用场景:switch选择结构和循环结构中
作用:
(1).在switch选择结构中遇到break,则结束整个switch选择结构,执行switch选择结构后面的代码
(2).在循环结构中遇到break,则结束整个循环结构后续所有操作,执行循环结构后面的代码
语法结构:
while(……){
…………
…………
break;
…………
…………
}
注意:break一般结合if选择语句一起使用
continue语句
作用场景:只能作用在循环结构中
作用:结束当前(本次)循环后续操作,继续执行下一次循环操作
语法结构:
while(……){
…………
…………
continue;
…………
…………
}
注意:continue一般结合if语句一起使用
break与continue的对比:
使用场合:break常用于switch结构和循环结构中;continue一般用于循环结构中
作用:break语句终止某个循环,程序跳转到循环块外的下一条语句;continue跳出本次循环,进入下一次循环
break和continue在双重循环中的使用:
break在双重循环中的使用,内层循环中的break结束的是内层循环,如果要结束外层训话你,需要使用标记来表明结束哪个循环
程序调试
通过代码阅读或者加输出语句查找程序错误
当程序结构越来越复杂时,需要专门的技术来发现和定位错误,就是"程序调试":
设置断点---->单步运行----->观察变量
总结:
和我一起学习的还有很多同学,其中很多很多人都比我优秀,我之前做了一个题目,用循环将十进制数改写为二进制,八进制数,十六进制数。我一开始使用的是累加的方法,才能实现将数据到过来输出,做法很繁杂。后来我在网上看到了一个大神,用的数组的方法,结构清晰,方法也很巧妙。后来我发现居然是我们班的同学,我想着哪来的大佬跑这里来炸鱼塘,不过我自身还需要努力训练自己的思维,争取能像我们班那些学的好的同学靠齐。
这是我写的:
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个十进制数");
int num=sc.nextInt();
//二进制
int sum=0;
for(int i=1;i<=99;i++){
int mod=num%2;
num/=2;
sum+=((mod+1)*(int)(Math.pow(10, i-1)))-((int)(Math.pow(10,i-1)));
}
System.out.println("转换为二进制是:"+sum);
结构不清晰,运算复杂
这是我们班某个大佬写的:
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个十进制数");
int num = sc.nextInt();
// 二进制
int i;
int j;
int k;
int[] arr=new int[999];
for(i=1;num>0;i++){
arr[i]=num%2;
num/=2;
}
System.out.print("输出二进制为:");
for(int a=i-1;a>0;a--){
System.out.print(+arr[a]);
}
System.out.println();
System.out.println("请输入一个十进制数");
int num_8 = sc.nextInt();
for(j=1;num_8>0;j++){
arr[j]=num_8%8;
num_8/=8;
}
System.out.print("输出八进制为:");
for(int b=j-1;b>0;b--){
System.out.print(+arr[b]);
}
System.out.println();
System.out.println("请输入一个十进制数");
int num_16 = sc.nextInt();
for(k=1;num_16>0;k++){
arr[k]=num_16%16;
num_16/=16;
}
System.out.print("输出十六进制为:");
a:for(int c=k-1;c>0;c--){
switch(arr[c]){
case 10:
System.out.print("A");
continue a;
case 12:
System.out.print("B");
continue a;
case 13:
System.out.print("C");
continue a;
case 14:
System.out.print("D");
continue a;
case 15:
System.out.print("E");
continue a;
}
System.out.print(+arr[c]);
}
说好听点我这叫进步空间大,不过还是要加油啦