Java - 逻辑控制和输入/输出
最编程
2024-10-09 12:23:48
...
语法二
:
if ( 布尔表达式 1 ){// 语句 1} else if ( 布尔表达式 2 ){// 语句 2} else {// 语句 3}
一个小问题:
int x = 20 ;if ( x == 10 ); 这个分号多余了,导致了接下来的打印没有条件控制{System . out . println ( "hehe" );}// 运行结果hehe
此处多写了一个分号, 导致分号成为了 if 语句的语句体, 而 { } 中的代码已经成为了和一个 if 无关的代码块
小练习:
判断一个年份是否为闰年 :
public static void main(String[] args) {
int year = 2000;
if (year % 4 == 0&&year % 100 != 0||year % 400 == 0) {
System.out.println("是闰年");
}else{
System.out.println("不是闰年");
}
}
2.switch语句
switch ( 表达式 ){case 常量值 1 :{语句 1 ;break ;}case 常量值 2 :{语句 2 ;break ;}...default :{内容都不满足时执行语句 ;break ;}}
注意事项1:
- 多个case后的常量值不可以重复
- switch的括号内只能是以下类型的表达式:
- 基本类型:byte、char、short、int,注意不能是long,float,double类型
- 引用类型:String常量串、枚举类型
- break不要漏掉
String类型我讲述一下:
public static void main(String[] args) {
String s = "abc";
switch (s){
case "a" :
System.out.println("a");
break;
case "abc":
System.out.println("就是abc");
break;
case "bc":
System.out.println("bc");
break;
default:
System.out.println("没有相同的");
break;
}
就是把String类型的变量放进switch的括号内
注意事项二:
switch 不能表达复杂的条件
// 例如 : 如果 num 的值在 10 到 20 之间 , 就打印 hehe// 这样的代码使用 if 很容易表达 , 但是使用 switch 就无法表示 .if ( num > 10 && num < 20 ) {System . out . println ( "hehe" );}
注意事项3:
switch
虽然支持嵌套
,
但是很丑并且看着难受,一般不推荐
~:
int x = 1;
int y = 1;
switch(x) {
case 1:
switch(y) {
case 1:
System.out.println("hehe");
break;
}
break;
case 2:
System.out.println("haha");
break;
}
综上, 我们发现, switch 的使用条件挺多的
三:循环结构
1:while循环
基本语法格式
:
循环条件只能是boolean类型,为
true,
则执行循环语句
;
否则结束循环
.
代码示例
1: 计算
1! + 2! + 3! + 4! + 5! 的值
int num = 1 ;int sum = 0 ;// 外层循环负责求阶乘的和while ( num <= 5 ) {int factorResult = 1 ;int tmp = 1 ;// 里层循环负责完成求阶乘的细节 .while ( tmp <= num ) {factorResult *= tmp ;tmp ++ ;}sum += factorResult ;num ++ ;}System . out . println ( "sum = " + sum );
这里我们发现, 当一个代码中带有多重循环的时候, 代码的复杂程度就大大提高了. 而比较复杂的代码就更容易出错.
后面我们会采用更简单的办法来解决这个问题
2:break和continue
break:break 的功能是让循环提前结束.
int num = 100;
while (num <= 200) {
if (num % 3 == 0) {
System.out.println("找到了 3 的倍数, 为:" + num);
break;
}
num++;
}
// 执行结果
找到了 3 的倍数, 为:102
我们找到了,
break
就会让循环结束
.
continue:continue
的功能是跳过这次循环
,
立即进入下次循环
代码示例
:
找到
100 - 200
中所有
3
的倍数
int num = 100;
while (num <= 200) {
if (num % 3 != 0) {
num++; // 这里的 ++ 不要忘记! 否则会死循环.
continue;
}
System.out.println("找到了 3 的倍数, 为:" + num);
num++;
}
执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句.
3:for循环
两种遍历数组的方式:
第一种:我们学C的时候普遍用的(java的数组定义和C不太一样,后面的博客我会具体讲解)
int [] array = new int []{ 10 , 20 , 30 , 40 , 50 };for ( int i = 0 ; i < 5 ; i ++ ){System . out . println ( array [ i ]);}
第二种:java提供的 使用 for-each 遍历数组
int [] array = { 1 , 2 , 3 };for ( int x : array ) { 这里for(元素的类型:数组名)System . out . println ( x );}
第二种的缺点就是拿不到数组的下标
4:do while循环
特点:先执行一次
先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束。
例子:打印1~10
int num = 1 ;do {System . out . println ( num );num ++ ;} while ( num <= 10 )
【注意事项】1. do while 循环最后的分号不要忘记2. 一般 do while 很少用到 , 更推荐使用 for 和 while.
四:输入输出
1. 输出:
System . out . println ( msg ); // 输出一个字符串 , 带换行System . out . print ( msg ); // 输出一个字符串 , 不带换行System . out . printf ( format , msg ); // 格式化输出
- println 输出的内容自带 \n, print 不带 \n
- printf 的格式化输出方式和 C 语言的 printf 是基本一致的.
例如:
System . out . println ( "hello world" );int x = 10 ;System . out .printf ( "x = %d\n" , x )
2:从键盘输入:
使用
Scanner 类里的方法
读取字符串
/
整数
/
浮点数
import java . util . Scanner ; // 需要导入 util 包Scanner sc = new Scanner ( System . in );在Java中,System.in 是一个预定义的输入流(InputStream),它代表了标准输入流。这个输入流通常对应于键盘输入,但是也可以被重定向,例如从文件或其他输入源读取数据。System.in是Java程序用来从外部(如用户)接收输入的一种方式sc是Scanner类型的变量,它可以调用Scanner里面的方法System . out . println ( " 请输入你的姓名: " );String name = sc . nextLine (); 读取下一行has.NexLine(检查输入时是否还有下一行)System . out . println ( " 请输入你的年龄: " );int age = sc . nextInt ();读取下一个整形System . out . println ( " 请输入你的工资: " );float salary = sc . nextFloat ();读取下一个浮点数System . out . println ( " 你的信息如下:" );System . out . println ( " 姓名 : " + name + "\n" + " 年龄: " + age + "\n" + " 工资: " + salary );sc . close (); // 注意 , 要记得调用关闭方法,关闭Scanner对象,释放它所占用的资源//sc.next() 读取下一个完整的token(一般是单词)// 执行结果请输入你的姓名:张三请输入你的年龄:18请输入你的工资:1000你的信息如下:姓名 : 张三年龄: 18工资: 1000 . 0注意:一般不是读取一行的方法 例如sc.nextInt,会读取用户输入的整数直到遇到空格,换行符,或输入结束,如果用户输入的不是整数,就会抛出异常(和C不一样)
2.1:循环输入
使用
Scanner
循环读取
N
个数字,并求取其平均值(别忘了转换成double类型)
Scanner sc = new Scanner(System.in);
int sum = 0;
int num = 0;
while (sc.hasNextInt()) {
int tmp = sc.nextInt();
sum += tmp;
num++;
}
System.out.println("sum = " + sum);
System.out.println("avg = " +(double) sum / num);
sc.close();
注意事项
:
当循环输入多个数据的时候
,
使用
ctrl + z
来结束输入
(Windows
上使用
ctrl + z, Linux / Mac
上使用
ctrl + d).
2.2. 猜数字游戏:
游戏规则
:二分查找的猜
系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 "低了", 如果输入的数字比该随机数大, 提示 "高了" , 如果输入的数字和随机数相等, 则提示 "猜对了
import java.util.Random; import java.util.Scanner;; class Test { public static void main(String[] args) { Random random = new Random(); // 默认随机种子是系统时间 Scanner sc = new Scanner(System.in); int toGuess = random.nextInt(100);//生成随机数1~100(左闭右开) //int toGuess = random.nextInt(20)+10;//生成随机数10~30(左闭右开) // System.out.println("toGuess: " + toGuess); while (true) { System.out.println("请输入要输入的数字: (1-100)"); int num = sc.nextInt(); if (num < toGuess) { System.out.println("低了"); } else if (num > toGuess) { System.out.println("高了"); } else { System.out.println("猜对了"); break; } } sc.close(); } }
上述就是的Java—逻辑控制与输入输出全部内容了,
欢迎各位大佬评论区留言修正
您的支持就是我最大的力量
推荐阅读
-
学习笔记和每日一题 - 输入: nums = [7,8,9,11,12] 输出:1 解释: 最小的正数 1 没有出现:最小的正数 1 没有出现。 提示
-
LeetCode 问题练习和总结:二叉树的序列化和反序列化 - 297 - 输入:根 = [1,2] 输出: 根[1,2] 提示
-
C 语言教程] [常用库] (IX) 高级输入/输出 - <fcntl.h> 和 <unistd.h>
-
LeetCode 问题练习和总结:区域和检索 - 可修改数组 - 307 - 输入: ["NumArray", "sumRange", "update", "sumRange"] [[[1, 3, 5]], [0, 2], [1, 2], [0, 2]] 输出: [空,9,空,8] 说明 NumArray numArray = new NumArray([1, 3, 5]); numArray.sumRange(0, 2); // 返回 1 + 3 + 5 = 9 numArray.update(1, 2); // nums = [1,2,5]; numArray.sumRange(0, 2); // 返回 1 + 3 + 5 = 9 numArray.sumRange(0, 2); // 返回 1 + 2 + 5 = 8 小贴士
-
力扣 1884.Egg Drop Two Egg(两个鸡蛋掉落) - 输入: n = 100 输出: 1414 解说 最佳策略是 - 从 9 楼扔下第一个鸡蛋。如果蛋碎了,那么 f 在 0 和 8 之间。从第 1 层扔第 2 个鸡蛋,然后每扔 1 层,分 8 次找到 f。总操作次数 = 1 + 8 = 9。 - 如果第一个鸡蛋没有破,那么从 22 楼扔第一个鸡蛋。如果蛋碎了,那么 f 介于 9 和 21 之间。将第二个鸡蛋从 10 楼往下扔,然后每扔一次往上扔一层楼,在 12 次尝试中找出 f。总操作次数 = 2 + 12 = 14。 - 如果第一个鸡蛋没有再次破碎,那么用类似的方法从 34、45、55、64、72、79、85、90、94、97、99 和 100 层扔第一个鸡蛋。 无论结果如何,最多需要扔 14 次才能确定 f。 一个非常有趣的问题 方法 1:动态编程
-
Java - 逻辑控制和输入/输出
-
Java 中的多级循环控制,包括金字塔和 9-9 乘法表打印
-
14-傅里叶变换的代码实现-一、numpy实现傅里叶变换和逆傅里叶变换 1.numpy实现傅里叶变换numpy.fft.fft2实现傅里叶变换,返回一个复数数组(complex ndarray),也就是频谱图像numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置) 20*np.log(np.abs(fshift))设置频谱的范围。可以理解为,之前通过傅里叶变换得到复数的数组,是不能通过图像的方法展示出来的,需要转换为灰度图像(映射到[0,255]区间)需要注意的是1> 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的2> 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像3> 在频域对图像进行处理,在频域的处理会反映在逆变换图像上 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) # 移动中心位置 fshift = np.fft.fftshift(f) # 调整值范围 result = 20*np.log(np.abs(fshift)) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.numpy实现逆傅里叶变换numpy.fft.ifft2实现逆傅里叶变换,返回一个复数数组(complex ndarray)numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角iimg = np.abs(逆傅里叶变化结果)设置值的范围,映射到[0,255]区间 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过numpy实现高通滤波,保留图像的边缘信息 获取图像的形状rows,cols = img.shape获取图像的中心点crow,ccol = int(rows/2),int(cols/2)将频谱图像的中心区域(低频区域)设置为0(黑色)fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 高通滤波 rows,cols = img.shape crow,ccol = int(rows/2),int(cols/2) fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 使用numpy实现高通滤波的实验结果: 二、opencv实现傅里叶变换和逆傅里叶变换 1.opencv实现傅里叶变换 返回结果 = cv2.dft(原始图像,转换标识)1> 返回结果:是双通道的,第一个通道是结果的实数部分,第二个通道是结果的虚数部分2> 原始图像:输入图像要首先转换成np.float32(img)格式3> 转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置)调整频谱的范围,将上面频谱图像的复数数组,转换为可以显示的灰度图像(映射到[0,255]区间)返回值 = 20*np.log(cv2.magnitude(参数1,参数2))1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) # 移动中心位置 dftShift = np.fft.fftshift(dft) # 调整频谱的范围 result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1])) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.opencv实现逆傅里叶变换返回结果 = cv2.idft(原始数据)1> 返回结果:取决于原始数据的类型和大小2> 原始数据:实数或者复数均可numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角调整频谱的范围,映射到[0,255]区间返回值 = cv2.magnitude(参数1,参数2)1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftShift = np.fft.fftshift(dft) # 逆傅里叶变换 ishift = np.fft.ifftshift(dftShift) iimg = cv2.idft(ishift) iimg = cv2.magnitude(iimg[:,:,0],iimg[:,:,1]) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("inverse") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过opencv实现低通滤波,模糊一副图像
-
程序查询方式控制输入输出的汇编编写
-
操作/dev/video设备指南:摄像头和IP核的理想输入输出接口