著者ホームページ: プログラミングコンパス
著者について: Java 分野の高品質クリエイター、CSDN ブログ エキスパート
、CSDN コンテンツ パートナー、Nuggets の招待著者、Alibaba Cloud ブログ エキスパート、51CTO 招待著者、長年のアーキテクト設計経験、Tencent 教室の常駐講師主なコンテンツ:Javaプロジェクト、Pythonプロジェクト、フロントエンドプロジェクト、人工知能とビッグデータ、履歴書テンプレート、学習教材、面接質問バンク、技術相互支援
お気に入り、いいね、迷わず作者フォローすると良いです
記事の最後にあるソースコードを入手してください
第 2 章 - プログラム フロー制御
【指導内容】
2-1 文と複合文
2-2 シーケンシャル構造
2-3分岐構造
2-4ループ構造
2-5 ループ内のジャンプ文
2-6 再帰的アルゴリズム
【ポイントと難しさ】 ポイントは分岐構造とループ構造の理解です。難しいのは再帰アルゴリズムです。
【求められる能力】 (1) 分岐構造とループ構造の文法を習得する (2) 再帰的アルゴリズムの知識を習得する
学生の皆さん、今日私たちはプログラム フロー制御というまったく新しい知識を学びます。プロセス制御とは何ですか? 端的に言えば、プログラムの実行順序を制御することです。
まず学生たちに、プログラムにはどのようなフロー制御があり、プログラムの実行順序を制御するために Java にはどのようなソリューションが提供されるのかを紹介します。
プログラムのフロー制御は大きく分けてシーケンシャル構造、分岐構造、ループ構造の3種類に分けられます。
-
シーケンシャル構造: 制御なしで、コードは main メソッドから開始され、上から下に実行されます。
-
分岐構造:条件に応じて真か偽かを判断し、どのコードを選択的に実行するかを判断します。Java 言語では、if と switch の 2 つの形式が提供されます。
-
ループ構造: 特定のコード部分の繰り返し実行を制御するものです。Java 言語では、for、while、do-while の 3 つの形式が提供されています。
以上が今日私たちが学ぶ主なコース内容です
1. 単文と複文
Java 言語のステートメントは、セミコロン「;」で終わる単純なステートメント、または中かっこ「{}」のペアで囲まれた複合ステートメントの場合があります。
复合语句:由多个简单语句构成的语句块
例:
public static void main(String[] args)
{
int a = 10;//简单语句
……
{
//复合语句
int b;
int a; //错误,因变量a前面已定义
……
}
}
Java 言語の複合文は、入れ子になった 2 つの複合文で同じ名前の 2 つの変数を宣言できないという点で C++ 複合文とは異なります。
2. 支店構造
2.1 if分岐
学生の皆さん、次に私たちはブランチ構造の最初の形式である if ブランチを学びます。
if の機能は条件を判定することであり、判定結果は true か false の 2 つの値しか取りえず、条件判定の結果に応じてそのコードを実行するかどうかを決定します。
1. if 分岐の適用シナリオは何ですか?
たとえば、駅や地下鉄の駅などの公共の場所では、通行する乗客の体温が測定されます。体温が37度以内であれば正常ですが、体温が37度を超えると体温を測定する装置が警告を発します。
別の例として、WeChat を使用して支払いを行う場合、まず WeChat の内部プログラムが残高が十分であるかどうかを判断し、残高が十分であれば支払いは成功し、残高が不足している場合は支払いが失敗したことを通知します。
2. if分岐の形式
次に、Java 言語での if ブランチがどのようなものかを見てみましょう。Java の if 分岐には 3 つの形式があります。
次に、いくつかの実際のケースを使用して、if ステートメントの適用と各 if ステートメントの実行フローを示します。
3. if の最初の形式
if の最初の形式のコード形式と実行フローを次の図に示します。
if 第一种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体
如果 条件表达式 为false,就不执行
// 需求:测量用户体温,发现体温高于37度就报警。
double t = 36.9;
if(t > 37){
System.out.println("这个人的温度异常,把他赶紧带走~~");
}
4. if の 2 番目の形式
if の 2 番目の形式のコード形式と実行フローを次の図に示します。
if 第二种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体1
如果 条件表达式 为false,就执行else下面的语句体2
// 需求2:发红包,你的钱包余额是99元,现在要发出90元
// 如果钱够触发发红包的动作,如果钱不够,则提示:余额不足。
double money = 19;
if(money >= 90){
System.out.println("发红包成功了~");
}else {
System.out.println("余额不足~~");
}
5. if の 3 番目の形式
if の 3 番目の形式のコード形式と実行フローを次の図に示します。
if 第三种形式执行流程如下:
如果 条件表达式1 为true,就执行下面的代码1;
如果 条件表达式1 为false,就继续判断条件表达式2;
如果 条件表达式2 为true,就执行下面的语句体;
如果 条件表达式2 为false,就继续判断条件语句体3;
如果 条件表达式3 为true,就执行下面的语句体3
如果 条件表达式3 为false,就继续判断后面的表达式;
....
如果前面所有条件表达式判断都为false,就执行最后的else语句中的代码
// 需求3:某个公司有一个绩效系统,根据员工的打分输出对应的绩效级别。[0,60) D [60,80) C [80,90) B [90,100] A
int score = 298;
if(score >= 0 && score < 60) {
System.out.println("您的绩效级别是: D");
}else if(score >= 60 && score < 80){
System.out.println("您的绩效级别是: C");
}else if(score >= 80 && score < 90){
System.out.println("您的绩效级别是: B");
}else if(score >= 90 && score <= 100){
System.out.println("您的绩效级别是: A");
}else {
System.out.println("您录入的分数有毛病~~");
}
6. if を使用する際のいくつかの一般的な問題
学生が初めて if コードを作成するとき、誤って問題が発生することがよくあります。学生が今後こうした問題を回避できるように、学生が直面する可能性のある問題を紹介します。
- 最初の質問: if () の後にセミコロンを続けることはできません
;
。そうでない場合、 if の下のステートメントは if と何の関係もありません。
- 2 番目の質問: if の後の中括弧は、コードが 1 行しかない場合、中括弧は省略できます。
7. if分岐の概要
if 分岐構造のいくつかの形式、さまざまな形式の実行プロセス、および if が使用されるシナリオについての説明は終わりました。要約しましょう
- if ブランチは何をするのでしょうか? アプリケーションシナリオにはどのようなものがありますか?
- if作用:if分支可以根据条件,选择执行某段程序
- if应用场景
比如1:测量用户体温,发现体温高于37度就报警
比如2:发红包,你的钱包余额是99元,现在要发出90元
比如3:根据员工的绩效打分输出对应的绩效级别
- if分岐にはいくつかの形式がありますが、実行処理はどのようなものなのでしょうか?
2.2 スイッチ分岐
if 分岐を学習した後、分岐構造の 2 番目の形式である switch 分岐を学習しましょう。
1. switchブランチの実行フロー
switch ブランチの役割は、値を比較してどのブランチ コードを実行するかを決定することです。まず、switch ブランチの形式と実行プロセスを確認します。
事例を通して実証してみましょう
/*
需求:做个电子备忘录,在控制台分别输出周一到周五的工作安排
周一:埋头苦干,解决bug
周二: 请求大牛程序员帮忙
周三:今晚啤酒、龙虾、小烧烤
周四:主动帮助新来的女程序解决bug
周五:今晚吃鸡
周六:与王婆介绍的小芳相亲
周日:郁郁寡欢、准备上班。
*/
String week = "周三";
switch (week){
case "周一":
System.out.println("埋头苦干,解决bug");
break;
case "周二":
System.out.println("请求大牛程序员帮忙");
break;
case "周三":
System.out.println("今晚啤酒、龙虾、小烧烤");
break;
case "周四":
System.out.println("主动帮助新来的女程序解决bug");
break;
case "周五":
System.out.println("今晚吃鸡");
break;
case "周六":
System.out.println("与王婆介绍的小芳相亲");
break;
case "周日":
System.out.println("郁郁寡欢、准备上班");
break;
default:
System.out.println("您输入的星期信息不存在~~~");
}
2. ifとswitchの選び方
switch 分岐を学習した後、if 分岐はすでにあるのに、なぜ switch 分岐があるのかと考える生徒もいるかもしれません。上記の場合はif分岐でもできるような気がしますが?では、特定のアプリケーション シナリオではどのように選択すればよいのでしょうか?
機能だけで見ると、if ブランチの機能の方が強力であり、switch ブランチが実行できることはすべて if ブランチで実行できます。ただし、具体的にどの分岐形式を使用するか、使用の原則もいくつかあります
- 如果是对一个范围进行判断,建议使用if分支结构
- 如果是与一个一个的值比较的时候,建议使用switch分支结构
2.3 スイッチに関する注意事項
学生の皆さん、次はswitchの注意点を学びましょう。学生がこれらの予防策を習得すれば、落とし穴にはまるのを避けることができ、筆記による面接の質問にも対処できるようになります。
- 1.表达式类型只能是byte、short、int、char
JDK5开始支持枚举,JDK7开始支持String
不支持double、float、double
- 2.case给出的值不允许重复,且只能是字面量,不能是变量。
- 3.正常使用switch的时候,不要忘记写break,否则会出现穿透现象。
1. switch ステートメントで一致するデータ型を示します。
学生の皆さん、次の図に示すように、switch ステートメント内で変数 a と b を一致させることができます。サポートされていない記述方法が見つかった場合、IDEA はエラーを報告します。
2. デモンストレーション ケースの背後にある値はリテラル値のみにすることができ、変数は使用できません
学生の皆さんもぜひ試してみてください。下図の矢印の位置にはリテラル値のみが書き込め、変数は書き込めません。
3. ケース貫通現象を実証する
switch ステートメント内でブレークが見つからない場合は、ブレークが見つかるまで次の case ステートメントに直接進みます。
この文法設計にも有用性があり、複数の case ステートメントで同じコードを実行する場合、大文字と小文字の貫通現象を利用してコードの再利用性を向上させることができます。
例: 以下のプログラムでは、火曜日、水曜日、木曜日にコードを書くように大手プログラマーに依頼したいと考えています。
3. サイクル構造
学生の皆さん、次はループ構造を勉強します。ループ構造により、コードの繰り返し実行を制御できます。ループ構造には、for ループ、while ループ、do-while ループが含まれます。
3.1 for ループ - 形式とフロー
ここではまず for ループについて学習し、for ループの記述形式を習得し、for ループの実行プロセスを理解することに重点を置きます。
1. forループの形式と流れ
for ループの実行プロセスをより直感的に理解できるように、具体的なケースのコードを直接見てみましょう。
例: コンソールに 3 HelloWorld を出力したいとします。
//需求:打印3行Hello World
for(int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
下図のように、①②③④、②③④…の順で実行されます。
②の条件が真の場合、③④のコードを順に実行し、②に戻って判定を継続します。
②の条件が偽の場合ループ終了
特定の実装の各ステップは、以下の図で確認できます。
上記のケースのデモを通じて、最終的に for ループの形式をまとめます。
//for循环格式:
for (初始化语句; 循环条件; 迭代语句) {
循环体语句(重复执行的代码);
}
初始化语句:一般是定义一个变量,并给初始值
循环条件:一般是一个关系表达式,结果必须是true或者false
迭代语句:用于对条件进行控制,一般是自增或者自减
循环语句体:需要重复执行的代码
2. for ループの応用シナリオは何ですか
上記の学習により、for ループの書き方とその実行プロセスがすでにわかりました。
では、実際にどのようなシナリオで使用されるのでしょうか? 実際、それが繰り返される限り、ループ ステートメントを使用して実行できます。
たとえば、JD.com の Web ページに 100 台の携帯電話の情報を表示するには、データを表示するコードのコピーを作成し、それを繰り返し実行するだけです。
3.2 for ループのケース 1 - 合計
for ループの形式と処理を学習したら、ケースを通してそれを定着させましょう。この事例を通して、プログラムを使って合計するという考え方を生徒に習得してもらうことが主な目的です。
//1.掌握使用for循环批量产生数据。
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
求和的思路分析:
1)首先需要定义一个求和变量,一般命名为sum
2)再遍历得到所有需要求和的数据(1~100之间的所有整数)
3)让需要求和的数据和sum累加,
结果:所有数据累加完之后最终sum就是所有数据的和
//2.需求:求1~100中所有整数的和
int sum = 0;
//定义一个循环,先产生1-100,这100个数
for (int i = 1; i <= 100; i++) {
//每产生一个数据,就把这个数和sum累加
sum += i; //sum = sum + i;
}
System.out.println("1-100的数据和:" + sum);
上記のコードの実行プロセスを分析します。
i=1时:sum=0+1; sum=1;
i=2时:sum=1+2; sum=3;
i=3时:sum=3+3; sum=6;
i=4时:sum=6+4; sum=10;
...
i=100时: sum+=99; sum=5050
3.2 for ループのケース 2 - 奇数の和を求める
要件: 1 から 100 までの奇数の合計を求めます。
1. コードの書き方1
求奇数和的思路(只是求和的数据变成了奇数,思路和前面没有变化)
1)首先需要定义一个求和变量,这里命名为sum1
2)再遍历得到所有需要求和的数据(1~100之间的所有奇数)
3)让需要求和的数据和sum1累加,
结果:所有数据累加完之后最终sum1就是所有数据的和
//1)定义一个变量用于求和
int sum1 = 0;
//2)定义一个循环产生1-100之间的奇数
for (int i = 1; i < 100; i+=2) {
// i = 1 3 5 7 ...
//3)让需要求和的数据和sum1累加,
sum1 += i;
}
System.out.println("1-100之间的奇数和:" + sum1);
上記コードの実行フロー解析
初始化sum1=0;
当i=1时:sum1+=1; sum1=1;
当i=3时:sum1+=3; sum1=4;
当i=5时:sum1+=5; sum1=9;
...
当i=99时:sum1+=99; sum1=2500
2. コードの書き方2
求奇数和的思路(只是求和的数据变成了奇数,思路和前面没有变化)
1)首先需要定义一个求和变量,这里命名为sum2
2)再遍历得到所有需要求和的数据(1~100之间的所有整数)
3)在求和之前先对数据判断,如果是奇数,才和sum1累加;否则什么也不干
结果:所有数据累加完之后最终sum1就是所有数据的和
//1)首先需要定义一个求和变量,这里命名为sum2
int sum2 = 0;
//2)再遍历得到所有需要求和的数据(1~100之间的所有整数)
for (int i = 1; i <= 100; i++) {
//i = 1 2 3 4 5 6 ... 99 100
//3)在求和之前先对数据判断,如果是奇数,才和sum1累加;否则什么也不干
if(i % 2 == 1){
// i = 1 3 5 7 9 ... 99
sum2 += i;
}
}
System.out.println("1-100之间的奇数和:" + sum2);
for ループの概要
今日の for ループに関しては、これらのいくつかのケースを学習するだけで十分であり、重要なのは for ループの実行プロセスをマスターすることです。今後、for ループを頻繁に使用することになりますが、使い込むとさらに詳しくなります。ただし、特定のシナリオでは、特定の問題の具体的な分析が依然として必要です。
3.3 while ループ - 形式とフロー
学生の皆さん、次に 2 番目のループ構造である while ループを学習します。
まず while ループがどのようなものかを理解してから、次の形式に従って while ループの基本的なケースを作成しましょう
// 需求:打印5行Hello World
int i = 0;
while (i < 5) {
// i = 0 1 2 3 4
System.out.println("Hello World");
i++;
}
コードの実行の流れは下図のようになります。 ① ②③④ ②③④ … の流れに従って実行します。
ステップ②が真の場合、ステップ③④が周期的に実行されます。
ステップ②が false の場合、ループは終了します
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NIeyLddg-1689742908661)(assets/1661141996444.png)]
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-OUo0Dqzv-1689742908662)(assets/1661141867092.png)]
いつでもどこでも選択する方法
これを学んだ後、注意深く学習する人は、while ループと for ループの実行プロセスが同じであることに気づくかもしれません。それらは普遍的なものなのでしょうか?
-
機能の面では、for ループで実行できることは while ループでも実行できます。
-
使用仕様としては、ループ回数が分かっている場合はfor、ループ回数が分からない場合はwhileを推奨します。
3.4 while ループのケース - 折り紙のケース
学生の皆さん、前のセクションで while ループの基本的な使い方を学びました。次に、while ループの使用法を統合するケースを使用します。主な目的は、要件を満たすために while ループを使用する方法を全員に知らせることです。
ケースの要件は次のとおりです。
需求:世界最高山峰珠穆朗玛峰高度是:8848.86米=8848860毫米,假如我有一张足够大的它的厚度是0.1毫米。请问:该纸张折叠多少次,可以折成珠穆朗玛峰的高度?
何をすべきかを分析しましょう
分析:首先由于不知道折叠多少次,我们可以选择用while循环
1)纸张的初始化厚度为0.1毫米,珠峰的高度为8848860毫米
double peakHeight = 8848860;
double paperThickness = 0.1;
2)每次折叠纸张的厚度为原来的两倍,这是需要循环执行的
while(纸张厚度<8848860){
纸张厚度*=2;
}
3)需要求折叠的次数,可以用一个变量来记录折叠的次数
int 次数 = 0;
while(纸张厚度<8848860){
纸张厚度*=2;
次数++; //每次折叠次数累加
}
结果:等循环结束之后,打印记录次数的值,就是折叠多少次了。
上記の分析に従ってコードを記述します
// 1、定义变量记住珠穆朗玛峰的高度和纸张的高度。
double peakHeight = 8848860;
double paperThickness = 0.1;
// 3、定义一个变量count用于记住纸张折叠了多少次
int count = 0;
// 2、定义while循环控制纸张开始折叠
while (paperThickness < peakHeight) {
// 把纸张进行折叠,把纸张的厚度变成原来的2倍。
paperThickness = paperThickness * 2;
count++;
}
System.out.println("需要折叠多少次:" + count);
System.out.println("最终纸张的厚度是:" + paperThickness);
3.5 do-while ループ - 形式とフロー
学生の皆さん、次にループ構造の 3 番目の形式である do-while ループを学習します。
まず while ループがどのようなものかを理解してから、形式に従って while ループの基本的なケースを作成しましょう。
do-while ループの実行フローは下図のように、① ②③④ ②③④…の順に実行されます。
do-while ループの特徴は、最初に実行してから判断することであることがわかります。条件が true でない場合でも、最初に 1 回実行されます。
学生向けに 3 つのサイクルの違いをまとめてみましょう
1. for循环 和 while循环(先判断后执行);
do...while (先执行后判断)
2.for循环和while循环的执行流程是一模一样的,
功能上无区别,for能做的while也能做,反之亦然。
如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。
3 for循环中控制循环的变量只在循环中使用
while循环中,控制循环的变量在循环后还可以继续使用
3.6 無限ループ
学生がコードを書くときに、誤って無限ループに陥ってしまうことがあります。いわゆる無限ループとは、止めることができないループのことです。
次に、無限ループを記述するいくつかの方法を生徒たちに理解してもらいます。次に、無限ループの使用について説明します。
//for死循环
for ( ; ; ){
System.out.println("Hello World1");
}
//while死循环
while (true) {
System.out.println("Hello World2");
}
//do-while死循环
do {
System.out.println("Hello World3");
}while (true);
無限ループの応用シナリオは何ですか?
最も典型的なのは、無限ループを使用してサーバー プログラムを作成することです。たとえば、Baidu のサーバー プログラムは常に実行されており、ブラウザーからいつでも Baidu にアクセスできます。ある日、Baidu のサーバーが停止すると、誰もが Baidu が提供するサービスを提供できなくなることを意味します。
このようなアプリケーションについては、今では理解できます。現時点では、コード形式の記述方法と、それによってどのような効果が得られるかを知る必要があるだけです。
3.7 ループの入れ子
学生の皆さん、次に私たちは実際の仕事で非常によく使われるループ形式、つまりループのネスティングを学びます。
いわゆるループの入れ子とは、ループに別のループが含まれていることを意味します (これは、学生がよく言う「Matryoshka _ 」です)。以下のケース コードでそれを示してみましょう。
ループネスト実行プロセス: 外側のループがループするたびに、内側のループが 1 ラウンド実行されます。
i=0时; i<3为true; 进入循环
//j的取值从0到5,执行一轮,打印5次"我爱你"
for(int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
内层循环执行完之后,执行外层的i++; i的值1
i=1时:i<3为true; 进入循环
//j的取值从0到5,又执行一轮,打印5次"我爱你"
for(int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
内层循环执行完之后,执行外层的i++; i的值2
i=2时:i<3为true; 进入循环
//j的取值从0到5,再执行一轮,打印5次"我爱你"
for(int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
内层循环执行完之后,执行外层的i++; i的值3
i=3时:i<3为false; 外层循环结束
ループのネストの実行プロセスを理解したら、それを統合するために別のケースを書いてみましょう
需求:在控制台使用 * 打印出4行5列的矩形
****
****
****
****
//1)先写一个循环用来在一行中打印5个"*"
for (int j = 1; j <= 5; j++) {
System.out.print("*"); // 不换行
}
System.out.println(); //换行
System.out.println("-----------------");
//2)再将第一步的代码套一层循环,执行4次,就可以打印4行
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 5; j++) {
System.out.print("*"); // 不换行
}
System.out.println(); //换行
}
要約すると、ネストされたループについては、次の文を理解することが重要です。外側のループがループするたびに、内側のループが 1 ラウンド実行されます。
3.9 Jump ステートメントの中断、続行
先ほどループの構造を学習し、途中でいくつかの形式の無限ループにも触れましたが、ループの途中でループから早く抜け出したい場合はどうすればよいでしょうか?
ここでは、jump ステートメントを使用する必要があり、breakおよびcontinueキーワードを使用する必要があります。まずはこれら 2 つのキーワードの役割を理解しましょう
- ブレーク機能: 現在のループを飛び出して実行を終了します。
- 継続機能: このサイクルを終了し、次のサイクルに入る
ケース 1: ブレークを使用してループの実行を早期に終了する方法を示します。
// 1、break:跳出并结束当前所在循环的执行。
// 场景:假如你又有老婆了,你犯错了,你老婆罚你说:5句我爱你
// 说到第三句的时候心软了,让你别再说了。
for (int i = 1; i <= 5; i++) {
System.out.println("我爱你:" + i);
if(i == 3){
// 说明已经说完了第三句了,心软了。
break; // 跳出并结束当前所在循环的执行。
}
}
ケース 2: continue の使用法を示し、サイクル内の 1 つのサイクルを終了し、次のサイクルに継続します。
// 2、continue:跳出当前循环的当次执行,直接进入循环的下一次执行。
// 场景: 假如你有老婆,你犯错了,你老婆罚你洗碗5天。
// 第三天的时候,你表现很好,第三天不用洗碗,但是不解恨,第四天还是要继续的。
for (int i = 1; i <= 5; i++) {
if(i == 3) {
// 已经到了第三天,第三天不用洗的。
continue;
}
System.out.println("洗碗:" + i);
}
ブレークとコンティニューはどこでも利用できないことに注意してください
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-S1NWDe9m-1689742908668)(assets/1661146324812.png)]
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-EaCki4Hv-1689742908670)(assets/1661146405314.png)]
3.9 ループ構造の概要
ここまででループ構造に関する内容はすべて学習できましたので、いくつかのループ構造が使用されるシナリオをまとめてみましょう。
1. 什么是流程控制
答:流程控制是用来控制程序的执行顺序的
2. 分支结构if和switch,如何选择?
答:if分支:一般用于对一个范围进行判断
switch分支:对一个一个值进行匹配
3. for循环和while循环、do-while如何循环
答:知道循环次数用for、不知道循环次数用while
想要先执行,再判断,用do-while
4. 再帰
Recursion (再帰) いわゆる再帰的メソッドは、自分自身を直接的または間接的に呼び出すメソッドです。
再帰的メソッドを終了するには、問題が最終的に終了条件に到達する必要があります。問題が終了条件に達すると、結果が呼び出し元に返されます。次に、呼び出し元は計算を実行し、その結果を自身の呼び出し元に返します。このプロセスは、結果が元の呼び出し元に返されるまで続きます。
例: 階乗 負でない整数を入力し、この数値の階乗を求めます。
import java.util.Scanner;
public class App01{
public static void main(String[] args){
Scanner inp=new Scanner(System.in);
System.out.print("请输入一个非负整数:");
int n=inp.nextInt();
System.out.print(n+"!="+factor(n));
}
//此为定义的一个方法,后面会讲,主要是以此来理解递归调用算法
public static long factor(int n){
if(n==0)
return 1;
else
return n*factor(n-1); //自己调用自己
}
}
5. 演習: 乱数を生成する
学生の皆さん、次に私たちは乱数の生成という新しい知識を学びます。
乱数の生成は、実際には多くのシナリオで非常に実用的です。たとえば、教室でランダム点呼デバイスを作成して、学生を呼び出して質問に答えることができます。たとえば、会社の年次総会で賞品をランダムに抽選することができます。
5.1 乱数の生成方法
乱数を生成する関数、実際には、Java には JDK で Random というクラスが用意されており、Random クラスが提供する関数を呼び出すだけで済みます。
// 目标:掌握使用Random生成随机数的步骤。
// 1、导包。import java.util.Random; (idea会自动完成)
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 2、创建一个Random对象,用于生成随机数。
Random r = new Random();
// 3、调用Random提供的功能:nextInt得到随机数。
for (int i = 1; i <= 20; i++) {
int data = r.nextInt(10); // 0 - 9
System.out.println(data);
}
}
}
5.2 数字当てゲーム
学生の皆さん、前のプロセス制御、ジャンプ文、乱数を包括的に使用するケースを使用してみましょう。
この事例が書けたということは、今日の知識ポイントを十分に理解していることを意味します。
需求:
随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中 结束游戏
分析:
1.先随机生成一个1-100之间的数据。
谁可以帮你生成随机数啊? 是不是要用到Random?
2.定义一个死循环让用户可以一直猜测。
用户猜的数据从哪里来啊? 是不是要用到Scanner?
3.在死循环里,每次让用户录入的数据和随机数进行比较
如果比随机数大:提示猜大了
如果比随机数小:提示猜小了
如果和随机数相同:提示恭喜你猜中了
import java.util.Random;
import java.util.Scanner;
public class RandomTest2 {
public static void main(String[] args) {
// 1、随机产生一个1-100之间的数据,做为中奖号码。
Random r = new Random();
int luckNumber = r.nextInt(100) + 1;
// 2、定义一个死循环,让用户不断的猜测数据
Scanner sc = new Scanner(System.in);
while (true) {
// 提示用户猜测
System.out.println("请您输入您猜测的数据:");
int guessNumber = sc.nextInt();
// 3、判断用户猜测的数字与幸运号码的大小情况
if(guessNumber > luckNumber){
System.out.println("您猜测的数字过大~~");
}else if(guessNumber < luckNumber){
System.out.println("您猜测的数字过小~~");
}else {
System.out.println("恭喜您,猜测成功了,可以买单了~~");
break; // 结束死循环
}
}
}
}