目次
1. ループ文
理解: 某些条件
が満たされると、ループ ステートメントは 反复执行
特定のコードの機能を持ちます。ループ構造の分類:
- for ループ
- while ループ
- do-while ループ
循环结构 四要素
:
- 初期化部分
- ループ条件部
- ループ本体部分
- 反復部分
2.forループ
2.1 基本的な構文
構文形式:
for (①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
}
执行过程: ①-②-③-④-②-③-④-②-③-④-…-② 图示:
说明:
for(;;)
そのうちの 2 つ、それ以上でもそれ以下でもない- ① 初期化部分では複数の変数を宣言できますが、同じ型でカンマで区切って宣言する必要があります。
- ②ループ条件部分はブール型の式となっており、値が false の場合はループを終了します。
- ④ カンマ区切りで複数の変数を更新可能
2.2 応用例
ケース 1: for ループを使用して特定のステートメントを繰り返し実行し、HelloWorld の 5 行を出力します。
public class ForTest1 {
public static void main(String[] args) {
//需求1:控制台输出5行Hello World!
//写法1:
//System.out.println("Hello World!");
//System.out.println("Hello World!");
//System.out.println("Hello World!");
//System.out.println("Hello World!");
//System.out.println("Hello World!");
//写法2:
for(int i = 1;i <= 5;i++){
System.out.println("Hello World!");
}
}
}
ケース 2: 形式が多様で、出力結果を書き込みます。
public class ForTest2 {
public static void main(String[] args) {
int num = 1;
for(System.out.print("a");num < 3;System.out.print("c"),num++){
System.out.print("b");
}
}
}
事例3:蓄積という考え方。 1 ~ 100 の範囲の偶数をたどり、偶数の個数を取得し、すべての偶数の合計を取得します。
public class ForTest3 {
public static void main(String[] args) {
int count = 0;//记录偶数的个数
int sum = 0;//记录偶数的和
for(int i = 1;i <= 100;i++){
if(i % 2 == 0){
System.out.println(i);
count++;
sum += i;
}
//System.out.println("偶数的个数为:" + count);
}
System.out.println("偶数的个数为:" + count);
System.out.println("偶数的总和为:" + sum);
}
}
ケース4:分岐構造と組み合わせて使用する場合。すべての水仙数字を出力します。いわゆる水仙数字は 3 桁の数字を指し、各桁の数字の 3 乗の合計がそれ自体に等しくなります。例えば:153 = 1*1*1 + 3*3*3 + 5*5*5
public class ForTest4 {
public static void main(String[] args) {
//定义统计变量,初始化值是0
int count = 0;
//获取三位数,用for循环实现
for(int x = 100; x < 1000; x++) {
//获取三位数的个位,十位,百位
int ge = x % 10;
int shi = x / 10 % 10;
int bai = x / 100;
//判断这个三位数是否是水仙花数,如果是,统计变量++
if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) {
System.out.println("水仙花数:" + x);
count++;
}
}
//输出统计结果就可以了
System.out.println("水仙花数共有"+count+"个");
}
}
ケース5:ブレイクと組み合わせて使用する。命令: 2 つの正の整数 m と n を入力し、それらの最大公約数と最小公倍数を求めます。たとえば、12 と 20 の最大公約数は 4、最小公倍数は 60 です。
/**
* @author AmoXiang
* @create 17:43
*/
public class ForTest5 {
public static void main(String[] args) {
//需求1:最大公约数
int m = 12, n = 20;
//取出两个数中的较小值
int min = (m < n) ? m : n;
for (int i = min; i >= 1; i--) {
//for(int i = 1;i <= min;i++){
if (m % i == 0 && n % i == 0) {
System.out.println("最大公约数是:" + i); //公约数
break; //跳出当前循环结构
}
}
//需求2:最小公倍数
//取出两个数中的较大值
int max = (m > n) ? m : n;
for (int i = max; i <= m * n; i++) {
if (i % m == 0 && i % n == 0) {
System.out.println("最小公倍数是:" + i);//公倍数
break;
}
}
}
}
説明: ループ内でブレークを使用できます。ブレークが実行されると、現在のループ構造が飛び出します。要約: ループ構造を終了するにはどうすればよいですか?
- 終了ケース 1: ループ構造内のループ条件部分が false を返す
- 終了ケース 2: ループ構造内でブレークが実行されます。
ループ構造が終了できない場合、それは無限ループです。開発では無限ループを避けなければなりません。
2.3 演習
演習 1: 1 ~ 100 のすべての奇数の合計を出力します
public class ForExer1 {
public static void main(String[] args) {
int sum = 0;//记录奇数的和
for (int i = 1; i < 100; i++) {
if(i % 2 != 0){
sum += i;
}
}
System.out.println("奇数总和为:" + sum);
}
}
演習 2: 7 の倍数である 1 ~ 100 のすべての整数の数と合計を出力します (カウンタを設定するという概念を体験してください)
public class ForExer2 {
public static void main(String[] args) {
int sum = 0;//记录总和
int count = 0;//记录个数
for (int i = 1; i < 100; i++) {
if(i % 7 == 0){
sum += i;
count++;
}
}
System.out.println("1~100之间所有是7的倍数的整数的和为:" + sum);
System.out.println("1~100之间所有是7的倍数的整数的个数为:" + count);
}
}
演習 3: 1 から 150 までループし、各行に値を出力し、さらに 3 の倍数ごとに出力するプログラムを作成します。foo
、5 の倍数のすべての行に印刷biz
、 7 の倍数のすべての行に印刷baz
。
参照コード:
public class ForExer3 {
public static void main(String[] args) {
for (int i = 1; i < 150; i++) {
System.out.print(i + "\t");
if(i % 3 == 0){
System.out.print("foo\t");
}
if(i % 5 == 0){
System.out.print("biz\t");
}
if(i % 7 == 0){
System.out.print("baz\t");
}
System.out.println();
}
}
}
3. while ループ
3.1 基本的な構文
構文形式:
①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
}
执行过程: ①-②-③-④-②-③-④-②-③-④-…-②
图示:
说明:
- while のループ条件 (ループ条件) はブール型である必要があります。
- ④の繰り返し部分の宣言を忘れないように注意してください。そうしないと、ループが終了せず、無限ループになります。
- for ループと while ループは相互に変換できます。両者に性能差はありません。実際の開発では、具体的な構造に応じて、どちらの形式がより適切で美しいかを選択してください。
- forループとwhileループの違い:初期化条件部分のスコープが異なります。
3.2 応用例
ケース 1: HelloWorld! の 5 行を出力します。
class WhileTest1 {
public static void main(String[] args) {
int i = 1;
while(i <= 5){
System.out.println("Hello World!");
i++;
}
}
}
ケース 2: 1 から 100 までの偶数をたどり、すべての偶数の合計と偶数の個数を計算します (累積の考え方)
class WhileTest2 {
public static void main(String[] args) {
//遍历1-100的偶数,并计算所有偶数的和、偶数的个数(累加的思想)
int num = 1;
int sum = 0;//记录1-100所有的偶数的和
int count = 0;//记录1-100之间偶数的个数
while(num <= 100){
if(num % 2 == 0){
System.out.println(num);
sum += num;
count++;
}
//迭代条件
num++;
}
System.out.println("偶数的总和为:" + sum);
System.out.println("偶数的个数为:" + count);
}
}
ケース 3: 数字当てゲーム
/*随机生成一个100以内的数,猜这个随机数是多少?
从键盘输入数,如果大了,提示大了;如果小了,提示小了;如果对了,就不再猜了,并统计一共猜了多少次。
提示:生成一个[a,b] 范围的随机数的方式:(int)(Math.random() * (b - a + 1) + a)*/
public class GuessNumber {
public static void main(String[] args) {
//获取一个随机数
int random = (int) (Math.random() * 100) + 1;
//记录猜的次数
int count = 1;
//实例化Scanner
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个整数(1-100):");
int guess = scan.nextInt();
while (guess != random) {
if (guess > random) {
System.out.println("猜大了");
} else if (guess < random) {
System.out.println("猜小了");
}
System.out.println("请输入一个整数(1-100):");
guess = scan.nextInt();
//累加猜的次数
count++;
}
System.out.println("猜中了!");
System.out.println("一共猜了" + count + "次");
}
}
事例 4: 折り紙のエベレスト
/*世界最高山峰是珠穆朗玛峰,它的高度是8848.86米,假如我有一张足够大的纸,它的厚度是0.1毫米。
请问,我折叠多少次,可以折成珠穆朗玛峰的高度?*/
public class ZFTest {
public static void main(String[] args) {
//定义一个计数器,初始值为0
int count = 0;
//定义珠穆朗玛峰的高度
int zf = 8848860;//单位:毫米
double paper = 0.1;//单位:毫米
while(paper < zf){
//在循环中执行累加,对应折叠了多少次
count++;
paper *= 2;//循环的执行过程中每次纸张折叠,纸张的厚度要加倍
}
//打印计数器的值
System.out.println("需要折叠:" + count + "次");
System.out.println("折纸的高度为" + paper/1000 + "米,超过了珠峰的高度");
}
}
3.3 演習
演習: キーボードから 0 で終わる整数を入力し、入力された正の数値と負の数値の数を数えます。
import java.util.Scanner;
public class Test05While {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int positive = 0; //记录正数的个数
int negative = 0; //记录负数的个数
int num = 1; //初始化为特殊值,使得第一次循环条件成立
while(num != 0){
System.out.print("请输入整数(0表示结束):");
num = input.nextInt();
if(num > 0){
positive++;
}else if(num < 0){
negative++;
}
}
System.out.println("正数个数:" + positive);
System.out.println("负数个数:" + negative);
input.close();
}
}
4. do-while ループ
4.1 基本的な構文
構文形式:
①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分);
**执行过程:**①-③-④-②-③-④-②-③-④-…-②
图示:
说明:
- 最後のwhile(ループ条件)内のループ条件はブール型である必要があります。
do{}while();
最後にセミコロンがあります- do-while 構造のループ本体ステートメントは、for や while とは異なり、少なくとも 1 回実行されます。
- for、while、do-while の 3 つのループ構造は相互に変換できます。
4.2 応用例
ケース 1: 1 から 100 までの偶数をたどり、すべての偶数の合計と偶数の個数を計算します (累積の考え方)
class DoWhileTest1 {
public static void main(String[] args) {
//遍历1-100的偶数,并计算所有偶数的和、偶数的个数(累加的思想)
//初始化部分
int num = 1;
int sum = 0;//记录1-100所有的偶数的和
int count = 0;//记录1-100之间偶数的个数
do{
//循环体部分
if(num % 2 == 0){
System.out.println(num);
sum += num;
count++;
}
num++;//迭代部分
}while(num <= 100); //循环条件部分
System.out.println("偶数的总和为:" + sum);
System.out.println("偶数的个数为:" + count);
}
}
ケース 2: do-while によってループ本体が少なくとも 1 回実行されるという経験
class DoWhileTest2 {
public static void main(String[] args) {
//while循环:
int num1 = 10;
while(num1 > 10){
System.out.println("hello:while");
num1--;
}
//do-while循环:
int num2 = 10;
do{
System.out.println("hello:do-while");
num2--;
}while(num2 > 10);
}
}
ケース3:ATM出金
/*声明变量balance并初始化为0,用以表示银行账户的余额,下面通过ATM机程序实现存款,取款等功能。
=========ATM========
1、存款
2、取款
3、显示余额
4、退出
请选择(1-4):*/
import java.util.Scanner;
public class ATM {
public static void main(String[] args) {
//初始化条件
double balance = 0.0;//表示银行账户的余额
Scanner scan = new Scanner(System.in);
boolean isFlag = true;//用于控制循环的结束
do{
System.out.println("=========ATM========");
System.out.println("\t1、存款");
System.out.println("\t2、取款");
System.out.println("\t3、显示余额");
System.out.println("\t4、退出");
System.out.print("请选择(1-4):");
int selection = scan.nextInt();
switch(selection){
case 1:
System.out.print("要存款的额度为:");
double addMoney = scan.nextDouble();
if(addMoney > 0){
balance += addMoney;
}
break;
case 2:
System.out.print("要取款的额度为:");
double minusMoney = scan.nextDouble();
if(minusMoney > 0 && balance >= minusMoney){
balance -= minusMoney;
}else{
System.out.println("您输入的数据非法或余额不足");
}
break;
case 3:
System.out.println("当前的余额为:" + balance);
break;
case 4:
System.out.println("欢迎下次进入此系统。^_^");
isFlag = false;
break;
default:
System.out.println("请重新选择!");
break;
}
}while(isFlag);
//资源关闭
scan.close();
}
}
4.3 演習
演習 1: 100 以内の数値をランダムに生成します。この乱数は何だと思いますか?キーボードから数値を入力します。大きすぎる場合はプロンプトが表示されます。大きすぎる場合は、プロンプトが表示されます。小さい場合は、小さすぎるというプロンプトが表示されます。正しい場合は、合計で何回推測したかもカウントされます。
import java.util.Scanner;
public class DoWhileExer {
public static void main(String[] args) {
//随机生成一个100以内的整数
/*
Math.random() ==> [0,1)的小数
Math.random()* 100 ==> [0,100)的小数
(int)(Math.random()* 100) ==> [0,100)的整数
*/
int num = (int)(Math.random()* 100);
//System.out.println(num);
//声明一个变量,用来存储猜的次数
int count = 0;
Scanner input = new Scanner(System.in);
int guess;//提升作用域
do{
System.out.print("请输入100以内的整数:");
guess = input.nextInt();
//输入一次,就表示猜了一次
count++;
if(guess > num){
System.out.println("大了");
}else if(guess < num){
System.out.println("小了");
}
}while(num != guess);
System.out.println("一共猜了:" + count+"次");
input.close();
}
}
4.4 3つのループ構造の比較
3 つのループ構造にはすべて次の 4 つの要素があります。
- ループ変数の初期化条件
- ループ条件
- ループ本体ステートメントブロック
- ループ変数の反復式の変更
サイクルタイムの観点からの分析
- do-while ループは、ループ本体のステートメントを少なくとも 1 回実行します。
- for ループと while ループは、まずループ条件ステートメントが true かどうかを判断し、次にループ本体を実行するかどうかを決定します。
選び方
- トラバーサルでループ数 (範囲) が明らかに必要な場合は、for ループを選択します。
- トラバーサルのループ数 (範囲) が明らかに必要ない場合は、while ループを選択します。
- ループ本体のステートメント ブロックが少なくとも 1 回実行される場合は、do-while ループの使用を検討してください。
- 基本的に、3 種類のサイクルは相互に完全に変換可能であり、すべてサイクルの機能を実現できます。
4.5 「無限」ループ
4.5.1 基本的な構文
语法格式: 最简单 无限
循环格式:while(true)
, for(;;)
該当するシーン:
- 開発中、何回ループする必要があるかわからない場合があり、ループ本体内の特定の条件に基づいて (break を使用して) ループの終了を制御する必要があります。
- このループ構造を終了できない場合、無限ループが形成されます。開発中の無限ループを避けてください。
4.5.2 応用例
ケース 1: あなたを永遠に愛していることに気づきました...
public class EndlessFor1 {
public static void main(String[] args) {
for (;;){
System.out.println("我爱你!");
}
// System.out.println("end");//永远无法到达的语句,编译报错
}
}
public class EndlessFor2 {
public static void main(String[] args) {
for (; true;){
//条件永远成立,死循环
System.out.println("我爱你!");
}
}
}
public class EndlessFor3 {
public static void main(String[] args) {
for (int i=1; i<=10; ){
//循环变量没有修改,条件永远成立,死循环
System.out.println("我爱你!");
}
}
}
考察: コード実行による影響は次のとおりです。
public class EndlessFor4 {
public static void main(String[] args) {
for (int i=1; i>=10; ){
//一次都不执行
System.out.println("我爱你!");
}
}
}
ケース 2: キーボードから不確実な数の整数を読み取り、読み取られた正負の数値の数を決定します。入力が 0 の場合、プログラムは終了します。
import java.util.Scanner;
class PositiveNegative {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int positiveNumber = 0;//统计正数的个数
int negativeNumber = 0;//统计负数的个数
for(;;){
//while(true){
System.out.println("请输入一个整数:(输入为0时结束程序)");
int num = scanner.nextInt();
if(num > 0){
positiveNumber++;
}else if(num < 0){
negativeNumber++;
}else{
System.out.println("程序结束");
break;
}
}
System.out.println("正数的个数为:"+ positiveNumber);
System.out.println("负数的个数为:"+ negativeNumber);
scanner.close();
}
}
4.6 入れ子になったループ (または複数のループ)
4.6.1 使用説明書
いわゆるネストされたループは、ループ構造 A のループ本体が別のループ構造 B であることを意味します。たとえば、for ループの中に for ループがあり、これはネストされたループです。このうち、for、while、do-while は外側ループまたは内側ループとして使用できます。外側のループ: ループ構造 A 内側のループ: ループ構造 B。基本的には、嵌套循环就是把内层循环当成外层循环的循环体
です。内側のループのループ条件が false の場合にのみ、内側のループが完全に飛び出し、現在の外側のループを終了し、次の外側のループを開始できます。外側のループの回数が m
回、内側のループの回数が n
回であるとすると、実際には内側のループ本体を実行する必要があります < i=5> 回。 スキル: 2 次元グラフィックスの観点から、外側ループ制御、内側ループ制御 < a i=9>。 開発経験: 実際の開発では、最も一般的なネストされたループは 2 レベルです。一般に、ネストされたループのレベルは 3 つまでです。このような事態が発生する場合は、ビジネス ロジックを停止して再編成し、アルゴリズムの実装を再考し、3 つのレイヤー内で制御する必要があります。そうしないと、可読性が悪くなります。 ネストされたループ形式には 2 つ:m*n
行数
列数
for(初始化语句①; 循环条件语句②; 迭代语句⑦) {
for(初始化语句③; 循环条件语句④; 迭代语句⑥) {
循环体语句⑤;
}
}
//执行过程:① - ② - ③ - ④ - ⑤ - ⑥ - ④ - ⑤ - ⑥ - ... - ④ - ⑦ - ② - ③ - ④ - ⑤ - ⑥ - ④..
実行特性: 外側のループは 1 回実行され、内側のループは 1 回実行されます。
4.6.2 応用例
ケース 1: 5 行と 6* を印刷します
class ForForTest1 {
public static void main(String[] args) {
/*
******
******
******
******
******
*/
for(int j = 1;j <= 5;j++){
for(int i = 1;i <= 6;i++){
System.out.print("*");
}
System.out.println();
}
}
}
ケース 2: 5 行の直角三角形を印刷する
*
**
***
****
*****
public class ForForTest2 {
public static void main(String[] args){
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
ケース 3: 5 行の逆直角三角形を印刷します
*****
****
***
**
*
public class ForForTest3 {
public static void main(String[] args){
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 6 - i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
事例4:「ひし形」のパターンを印刷する
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
public class ForForTest4 {
public static void main(String[] args) {
/*
上半部分 i m(表示-的个数) n(表示*的个数)关系式:2*i + m = 10 --> m = 10 - 2*i
--------* 1 8 1 n = 2 * i - 1
------* * * 2 6 3
----* * * * * 3 4 5
--* * * * * * * 4 2 7
* * * * * * * * * 5 0 9
下半部分 i m n 关系式: m = 2 * i
--* * * * * * * 1 2 7 n = 9 - 2 * i
----* * * * * 2 4 5
------* * * 3 6 3
--------* 4 8 1
*/
//上半部分
for (int i = 1; i <= 5; i++) {
//-
for (int j = 1; j <= 10 - 2 * i; j++) {
System.out.print(" ");
}
//*
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("* ");
}
System.out.println();
}
//下半部分
for (int i = 1; i <= 4; i++) {
//-
for (int j = 1; j <= 2 * i; j++) {
System.out.print(" ");
}
//*
for (int k = 1; k <= 9 - 2 * i; k++) {
System.out.print("* ");
}
System.out.println();
}
}
}
ケース 5: 九九
public class ForForTest5 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + (i * j) + "\t");
}
System.out.println();
}
}
}
4.6.3 演習
演習 1: 時刻をコンソールに出力します
public class ForForDemo {
public static void main (String[] args) {
for (int hour = 0;hour < 24 ;hour++ ) {
for (int min = 0; min < 60 ; min++) {
System.out.println(hour + "时" + min +"分");
}
}
}
}
5. キーワード Break と continue の使用
5.1 ブレークとコンティニューの説明
适用范围 在循环结构中使用的作用 相同点
break switch-case
循环结构 一旦执行,就结束(或跳出)当前循环结构 此关键字的后面,不能声明语句
continue 循环结构 一旦执行,就结束(或跳出)当次循环结构 此关键字的后面,不能声明语句
さらに、多くの言語には goto ステートメントがあり、goto ステートメントはプログラム内の任意のステートメントに制御を自由に移して実行できますが、プログラムがエラーを起こしやすくなります。 Java の Break と continue は goto とは異なります。
5.2 応用例
class BreakContinueTest1 {
public static void main(String[] args) {
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
//break;//123
continue;//123567910
//如下的语句不可能被执行,编译不通过
//System.out.println("今晚迪丽热巴要约我吃饭");
}
System.out.print(i);
}
System.out.println("####");
//嵌套循环中的使用
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break; //结束的是包裹break关键字的最近的一层循环!
continue;//结束的是包裹break关键字的最近的一层循环的当次!
}
System.out.print(j);
}
System.out.println();
}
}
}
5.3 ラベルと併用する
break语句用于终止某个语句块的执行
{
……
break;
……
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: {
……
label2: {
……
label3: {
……
break label2;
……
}
}
}
continue ステートメントが複数レベルのネストされたループ ステートメント本体に出現する場合、ラベルを使用してループのどのレベルをスキップするかを示すこともできます。 label ステートメントはループの先頭の直後に続く必要があります。ラベル ステートメントは、非ループ ステートメントの前に使用できません。例:
class BreakContinueTest2 {
public static void main(String[] args) {
l:for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break l;
continue l;
}
System.out.print(j);
}
System.out.println();
}
}
}
5.4 典型的なケース
問題: 100 以内のすべての素数 (素数) を見つけますか? 10万以内の人はどうなるの?
目的: コードの実装方法が異なれば、効率も大きく異なります。分析: 素数(素数):1とそれ自身でしか割り切れない自然数。 —> 2 から始まり、この数値 -1 で終わる、この範囲にはこの数値の約数はありません。すると、この数は素数になります。
例: 2、3、5、7、11、13、17、19、23、… 実装方法 1:
class PrimeNumberTest {
public static void main(String[] args) {
//boolean isFlag = true; //用于标识i是否被除尽过
long start = System.currentTimeMillis(); //记录当前时间距离1970-1-1 00:00:00的毫秒数
int count = 0;//记录质数的个数
for(int i = 2;i <= 100000;i++){
//i
boolean isFlag = true; //用于标识i是否被除尽过
for(int j = 2;j <= i - 1;j++){
if(i % j == 0){
//表明i有约数
isFlag = false;
}
}
//判断i是否是质数
if(isFlag){
//如果isFlag变量没有给修改过值,就意味着i没有被j除尽过。则i是一个质数
//System.out.println(i);
count++;
}
//重置isFlag
//isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("执行此程序花费的毫秒数为:" + (end - start)); //16628
}
}
実装方法 2: 実装方法 1 の最適化
class PrimeNumberTest1 {
public static void main(String[] args) {
long start = System.currentTimeMillis(); //记录当前时间距离1970-1-1 00:00:00的毫秒数
int count = 0;//记录质数的个数
for(int i = 2;i <= 100000;i++){
//i
boolean isFlag = true; //用于标识i是否被除尽过
for(int j = 2;j <= Math.sqrt(i);j++){
//优化2:将循环条件中的i改为Math.sqrt(i)
if(i % j == 0){
//表明i有约数
isFlag = false;
break;//优化1:主要针对非质数起作用
}
}
//判断i是否是质数
if(isFlag){
//如果isFlag变量没有给修改过值,就意味着i没有被j除尽过。则i是一个质数
//System.out.println(i);
count++;
}
}
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("执行此程序花费的毫秒数为:" + (end - start));//1062
}
}
実装 3 (オプション): continue + タグを使用する
class PrimeNumberTest2 {
public static void main(String[] args) {
long start = System.currentTimeMillis(); //记录当前时间距离1970-1-1 00:00:00的毫秒数
int count = 0;//记录质数的个数
label:for(int i = 2;i <= 100000;i++){
//i
for(int j = 2;j <= Math.sqrt(i);j++){
//优化2:将循环条件中的i改为Math.sqrt(i)
if(i % j == 0){
//表明i有约数
continue label;
}
}
//一旦程序能执行到此位置,说明i就是一个质数
System.out.println(i);
count++;
}
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("执行此程序花费的毫秒数为:" + (end - start));//1062
}
}
4.5 演習
演習 1:
生成 1-100 之间的随机数,直到生成了 97 这个数,看看一共用了几次?
提示:使用 (int)(Math.random() * 100) + 1
public class NumberGuessTest {
public static void main(String[] args) {
int count = 0;//记录循环的次数(或生成随机数进行比较的次数)
while(true){
int random = (int)(Math.random() * 100) + 1;
count++;
if(random == 97){
break;
}
}
System.out.println("直到生成随机数97,一共比较了" + count + "次");
}
}
6.スキャナー:キーボード入力機能の実装
キーボードからさまざまな型 (基本データ型、文字列型) の変数を取得する方法: Scanner クラスを使用します。キーボードでコードを入力するための 4 つの手順:
- ガイドパッケージ:
import java.util.Scanner;
- スキャナータイプのオブジェクトを作成します。
Scanner scan = new Scanner(System.in);
- Scanner クラス (
next() / nextXxx()
) の関連メソッドを呼び出して、指定された型の変数を取得します - リリースリソース:
scan.close();
注: 指定された型の値は、対応する方法に従って入力する必要があります。入力データ型が必要な型と一致しない場合、例外が報告され、プログラムは終了します。
6.1 各種データ入力
ケース: Xiao Ming は出会い系サイトに登録し、関連する個人情報の入力を求められました。以下のように: オンラインで名前、年齢、体重、独身かどうか、性別などを入力してください。
//① 导包
import java.util.Scanner;
public class ScannerTest1 {
public static void main(String[] args) {
//② 创建Scanner的对象
//Scanner是一个引用数据类型,它的全名称是java.util.Scanner
//scanner就是一个引用数据类型的变量了,赋给它的值是一个对象(对象的概念我们后面学习,暂时先这么叫)
//new Scanner(System.in)是一个new表达式,该表达式的结果是一个对象
//引用数据类型 变量 = 对象;
//这个等式的意思可以理解为用一个引用数据类型的变量代表一个对象,所以这个变量的名称又称为对象名
//我们也把scanner变量叫做scanner对象
Scanner scanner = new Scanner(System.in);//System.in默认代表键盘输入
//③根据提示,调用Scanner的方法,获取不同类型的变量
System.out.println("欢迎光临你好我好交友网站!");
System.out.print("请输入你的网名:");
String name = scanner.next();
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.print("请输入你的体重:");
double weight = scanner.nextDouble();
System.out.print("你是否单身(true/false):");
boolean isSingle = scanner.nextBoolean();
System.out.print("请输入你的性别:");
char gender = scanner.next().charAt(0);//先按照字符串接收,然后再取字符串的第一个字符(下标为0)
System.out.println("你的基本情况如下:");
System.out.println("网名:" + name + "\n年龄:" + age + "\n体重:" + weight +
"\n单身:" + isSingle + "\n性别:" + gender);
//④ 关闭资源
scanner.close();
}
}
6.2 演習
演習 1:
大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,当然要提出一定的条件:高:180cm以上;富:财富1千万以上;帅:是。
如果这三个条件同时满足,则:“我一定要嫁给他!!!”
如果三个条件有为真的情况,则:“嫁吧,比上不足,比下有余。”
如果三个条件都不满足,则:“不嫁!”
提示:
System.out.println("身高: (cm)");
scanner.nextInt();
System.out.println("财富: (千万)");
scanner.nextDouble();
System.out.println("帅否: (true/false)");
scanner.nextBoolean();
System.out.println("帅否: (是/否)");
scanner.next(); "是".equals(str)
import java.util.Scanner;
class ScannerExer1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的身高:(cm)");
int height = scan.nextInt();
System.out.println("请输入你的财富:(以千万为单位)");
double wealth = scan.nextDouble();
/*
方式1:关于是否帅问题,我们使用boolean类型接收
System.out.println("帅否?(true/false)");
boolean isHandsome = scan.nextBoolean();
//判断
if(height >= 180 && wealth >= 1.0 && isHandsome){ //不建议isHandsome == true
System.out.println("我一定要嫁给他!!!");
}else if(height >= 180 || wealth >= 1.0 || isHandsome){
System.out.println("嫁吧,比上不足,比下有余。");
}else{
System.out.println("不嫁");
}
*/
//方式2:关于是否帅问题,我们使用String类型接收
System.out.println("帅否?(是/否)");
String isHandsome = scan.next();
//判断
if(height >= 180 && wealth >= 1.0 && isHandsome == "是"){
//知识点:判断两个字符串是否相等,使用String的equals()
System.out.println("我一定要嫁给他!!!");
}else if(height >= 180 || wealth >= 1.0 || isHandsome == "是"){
System.out.println("嫁吧,比上不足,比下有余。");
}else{
System.out.println("不嫁");
}
//关闭资源
scan.close();
}
}
演習 2:
我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每一年相当于人类的10.5岁,之后每增加一年就增加四岁。那么5岁的狗相当于人类多少年龄呢?应该是:10.5 + 10.5 + 4 + 4 + 4 = 33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人类的年龄。如果用户输入负数,请显示一个提示信息。
import java.util.Scanner;
class ScannerExer2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入狗狗的年龄:");
int dogAge = scan.nextInt();
//通过分支语句,判断狗狗相当于人的年龄
if(dogAge < 0){
System.out.println("你输入的狗狗的年龄不合法");
}else if(dogAge <= 2){
System.out.println("相当于人的年龄:" + (dogAge * 10.5));
}else{
System.out.println("相当于人的年龄:" + (2 * 10.5 + (dogAge - 2) * 4));
}
//关闭资源
scan.close();
}
}
7. 乱数の求め方
指定された範囲内でランダムな整数を生成するにはどうすればよいですか? Math クラスのrandom() を呼び出すと、 [0,1)
の範囲の double 値が返されます。
Math.random() * 100 ---> [0,100)
(int)(Math.random() * 100) ---> [0,99]
(int)(Math.random() * 100) + 5 ----> [5,104]
範囲[a,b]
内のランダムな整数を取得するにはどうすればよいですか?
(int)(Math.random() * (b - a + 1)) + a
例:
class MathRandomTest {
public static void main(String[] args) {
double value = Math.random();
System.out.println(value);
//[1,6]
int number = (int)(Math.random() * 6) + 1; //
System.out.println(number);
}
}
本日の研究はこれで終わります. 著者はここで, Java言語を学習するより多くの読者が寄り道を避け, 時間を節約できるよう, 学習とコミュニケーションのみを目的として記事を書いていることを宣言します. 他の目的には使用しません. 権利侵害があれば,ブロガーに連絡して削除してください。このブログ記事をお読みいただきありがとうございます。この記事があなたのプログラミングの旅のガイドになれば幸いです。幸せな読書!
良い本は 100 回読んでも飽きません。レッスンを徹底的に読んだ後は自分自身を知ることができます。そして、もし私がこの部屋で一番ハンサムな男になりたいのなら、学習を通じてより多くの知識を獲得することに粘り強く取り組み、知識を使って自分の運命を変え、ブログを使って自分の成長を目撃し、自分の行動で自分が頑張っていることを証明しなければなりません。 。
私のブログがお役に立ちましたら、私のブログの内容が気に入っていただけましたら、点赞
、评论
、 < a i=4> ワンクリックで3連打!好きな人は運気が悪くならず、毎日元気に過ごせるそうですよ!本当にタダでセックスしたいのなら、毎日幸せな一日を過ごしてください。頻繁に私のブログにアクセスしてください。收藏
コーディングは簡単ではありませんが、皆さんのサポートが私の原動力です。关注
私を好きになることを忘れないでください!