1. C++ の if ステートメント
C++ には常に 3 つの構造、つまりシーケンシャル構造、分岐構造、ループ構造が存在します。いわゆるシーケンシャル構造とは、実際には、C++ でのコードの実行が上から下に順番に実行されることを意味します (ほとんどのプログラミング言語にはこの機能があります)。分岐構造で最も一般的に使用されるのは if ステートメントです。
1. 単一の if ステートメント
(1)
if文の形式 形式は以下のとおりです。
if(判断条件){
代码块;
}
ここで、判定条件は通常、ブール値、または関係式など、最終的な演算結果がブール値となる式である。コード ブロックは、実行する必要がある C++ コードです。
(2) 実行処理
if 文の判定条件が真の場合はそのコードブロックが実行され、条件が偽の場合はコードブロックをスキップして if 文以降のコードが直接実行されます。
例えば:
#include<iostream>
using namespace std;
int main()
{
bool is_happy = true;
bool is_bad = false;
if(is_happy==true){
cout<<"今天心情很好"<<endl;
}
if(is_bad==false){
cout<<"今天心情不好。"<<endl;
}
return 0;
}
出力は次のとおりです。
今天心情很好
今天心情不好
2. if...else ステートメント
(1) if...else 文の形式
if...else 文の形式は次のとおりです。
if(判断条件){
代码块1
}else{
代码块2
}
(2) 実行処理
if 文の判定条件の結果が true の場合はコードブロック 1 が実行され、else コードブロックの内容は無視され、if 文の判定条件の結果が false の場合はコードブロック 1 が実行されます。 else 内のコード ブロック 2 が実行され、コード ブロック 1 は実行されません。
注: if...else ステートメントでは、コード ブロック 1 とコード ブロック 2 のどちらか一方のみが実行され、両方を実行することは不可能であり、両方を実行することも不可能です。
例えば:
#include<iostream>
using namespace std;
int main()
{
int age=10;
if(age>=18){
cout<<"已经成年了。";
}else{
cout<<"还未成年。";
}
}
出力は次のとおりです。
还未成年。
else 文は単独で使用できず、if 文と併用する必要があり、1 つの if は 1 つの else にのみ対応し、1 対 1 に対応します。ただし、if ステートメントは単独で使用できます。
3. if...else if ステートメント
(1)
if...else 文の形式 if...else 文の形式は以下のとおりです。
if(判断条件A){
代码块1
}else if(判断条件B){
代码块2
}else{
代码块3
}
(2) 実行処理
判定条件 A が真の場合はコードブロック 1 が実行され、それ以外のコードブロックは無視され、判定条件 A が偽の場合は判定条件 B が実行され、判定条件が真の場合はコードブロック 1 が実行されます。条件 B が true の場合、コード ブロックは実行されます。コード ブロック 2 が実行されます。条件 B が false の場合、コード ブロック 3 が実行されます。
同様に、if...else if 構造では、コード ブロックの 1 つだけが実行され、残りのコード ブロックは無視されます。
例えば:
#include<iostream>
using namespace std;
int main()
{
int n;
cout<<"请输入一个整数:";
cin>>n;
if(n>0){
cout<<"这是正数";
}else if(n==0){
cout<<"这是0";
}else{
cout<<"这是负数。";
}
}
出力結果:
当输入1时,输出:这是正数
当输入0时,输出:这是0
当输入-2时,输出:这是负数。
もちろん、if...else if ステートメントには else if 構造が 1 つだけ含まれるのではなく、複数の else if 構造が含まれる場合があります。次に例を示します。
#include<iostream>
using namespace std;
int main()
{
int score;
cout<<"请输入你的分数:";
cin>>score;
if(score>=90){
cout<<"你的成绩等级为A";
}else if(score>=80){
cout<<"你的成绩等级为B";
}else if(score>=70){
cout<<"你的成绩等级为C";
}else if(score>=60){
cout<<"你的成绩等级为D";
}else{
cout<<"你的成绩等级为E";
}
}
実行処理は if...else if と同じで、最初の if 文から順に実行を判定し、いずれかの if 条件が成立すると、対応するコードブロックが実行され、構造が終了します。条件が false の場合、else ステートメントが実行されます。
4. ネストされた if ステートメント
従来の if 構造に加えて、いくつかの構造をネストして、より複雑な分岐構造を形成することもできます。
例えば:
#include<iostream>
using namespace std;
int main()
{
//从键盘输入性别(m代表男性,w代表女性)和年龄,判断是否达到法定结婚年龄
char gender;
int age;
cout<<"请输入你的性别(m代表男性,w代表女性)";
cin>>gender;
cout<<"请输入你的年龄:";
cin>>age;
//男性的法定结婚年龄为22,女性的为20
//先判断性别,在判断年龄
if(gender=='m'){
//条件为真,则为男性
//判断是否满22岁
if(age>=22){
//条件为真,则达到法定结婚年龄
cout<<"先生,你已达到国家法定结婚年龄。";
}
else{
//条件为假,则未到法定结婚年龄
cout<<"先生,你还未到国家法定结婚年龄。";
}
}
else{
//条件为假,则为女性
//判断是否满20岁
if(age>=20){
cout<<"女士,你已达到国家法定结婚年龄。";
}
else{
cout<<"女士,你还未到国家法定结婚年龄。";
}
}
}
2. C++ の switch ステートメント
switch ステートメントは、典型的な分岐構造の代表でもあります。
switch ステートメントを使用すると、変数が複数の値と等しいかどうかをテストできます。それぞれの値はケースと呼ばれ、テスト対象の変数はスイッチ ケースごとにチェックされます。
1. switch文の構文
switch(表达式1){
case 值A :
代码块1
case 值B :
代码块2
// 可以有任意数量的 case 语句
default : // 可选的
代码块n;
}
2、switch文のルール
switch ステートメントは次の規則に従う必要があります。
- switch ステートメント内の変数または式の結果の値は、整数型または列挙型、あるいは整数型または列挙型に変換する単一の変換関数がクラスにあるクラス型である必要があります。
- スイッチには任意の数の case ステートメントを含めることができます。各ケースの後には、比較する値とコロンが続きます。
- case の後の値は、スイッチ内の変数と同じデータ型である必要があり、定数またはリテラルである必要があります。
- テストされる変数が case 内の定数と等しい場合、case に続くステートメントは、break ステートメントに遭遇するまで実行されます。
- Break ステートメントが見つかると、switch は終了し、制御フローは switch ステートメントの後の次の行にジャンプします。
- すべてのケースにブレークを含める必要があるわけではありません。case ステートメントにブレークが含まれていない場合、制御フローはブレークが検出されるまで後続のケースの実行を続けます。
- switch ステートメントには、switch の最後に表示されるオプションのデフォルト ステートメントを含めることができます。上記のいずれのケースにも当てはまらない場合、デフォルト ステートメントを使用してタスクを実行できます。デフォルトのbreak文は必要ありません。
3. スイッチケース
一般的なケース: 年と月を入力し、その月が何日あるかを判断します。
実装コード:
#include<iostream>
using namespace std;
int main()
{
//从键盘输入年份和月份,判断这个月有多少天
int year,month;
cout<<"请输入年份:\n";
cin>>year;
cout<<"请输入月份:\n";
cin>>month;
//判断月份对于的天数,所以判断条件是月份
switch(month){
//case后的值即为month对应的所有可能的情况
case 1:
cout<<"这个月有31天。"<<endl;//一月
break;
//二月,二月份比较特殊,闰年29天,平年28天,所以需要判断是否为闰年
//闰年判断条件:能被4整除,不能被100整除;或者能被400整除
case 2:
if(year%4==0&&year%100!=0||year%400==0){
cout<<"这个月有29天。"<<endl;
}
else{
cout<<"这个月有28天。"<<endl;
}
break;
case 3:
cout<<"这个月有31天。"<<endl;//三月
break;
case 4:
cout<<"这个月有30天。"<<endl;//四月
break;
case 5:
cout<<"这个月有31天。"<<endl;//五月
break;
case 6:
cout<<"这个月有30天。"<<endl;//六月
break;
case 7:
cout<<"这个月有31天。"<<endl;//七月
break;
case 8:
cout<<"这个月有31天。"<<endl;//八月
break;
case 9:
cout<<"这个月有30天。"<<endl;//九月
break;
case 10:
cout<<"这个月有31天。"<<endl;//十月
break;
case 11:
cout<<"这个月有30天。"<<endl;//十一月
break;
case 12:
cout<<"这个月有31天。"<<endl;//十二月
break;
default:cout<<"你输入的月份有误。"<<endl;
}
}
この例は、簡易バージョンを使用して実装することもできます。コードは次のとおりです。
#include<iostream>
using namespace std;
int main()
{
//从键盘输入年份和月份,判断这个月有多少天
int year,month;
cout<<"请输入年份:\n";
cin>>year;
cout<<"请输入月份:\n";
cin>>month;
//判断月份对于的天数,所以判断条件是月份
switch(month){
//case后的值即为month对应的所有可能的情况
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout<<"这个月有31天。"<<endl;//一月
break;
//二月,二月份比较特殊,闰年29天,平年28天,所以需要判断是否为闰年
//闰年判断条件:能被4整除,不能被100整除;或者能被400整除
case 2:
if(year%4==0&&year%100!=0||year%400==0){
cout<<"这个月有29天。"<<endl;
}
else{
cout<<"这个月有28天。"<<endl;
}
break;
case 4:
case 6:
case 9:
case 11:
cout<<"这个月有30天。"<<endl;//三月
break;
default:cout<<"你输入的月份有误。"<<endl;
}
}
簡略化されたバージョンは、実際には、break ステートメントを使用して切り替えを終了するタイミングを制御し、同じ状況にある月をまとめて判断します。
3. 条件演算子
条件演算子の形式は次のとおりです。
表达式1?表达式2:表达式3
コロンの使用と配置に注意してください。条件式の値は式1の評価結果に依存します。式 1 が true の場合、式 2 の値が評価され、式 2 の結果が条件式全体の値となります。式 1 が偽の場合、式 3 の値が計算され、式 3 の結果が条件式全体の値となります。
条件演算子は 3 つのオペランドを受け取り、if...else ステートメントの代わりに使用できるため、三項演算子と呼ばれます。例えば:
#include<iostream>
using namespace std;
int main()
{
int a=2,b=3;
if(a>b){
cout<<a;
}
else{
cout<<b;
}
}
条件式の使用は次のように記述されます。
#include<iostream>
using namespace std;
int main()
{
int a=2,b=3;
a>b?cout<<a:cout<<b;
}
条件演算子を使用すると、多くの場合、コードをより簡潔にすることができます。
4、while ループ
場合によっては、同じコード ブロックを複数回実行する必要がある場合があります。一般に、ステートメントは順番に実行されます。つまり、関数内の最初のステートメントが最初に実行され、次に 2 番目のステートメントが実行されます。
ループ ステートメントを使用すると、ステートメントまたはステートメント グループを複数回実行できます。次は、ほとんどのプログラミング言語におけるループ ステートメントの一般的な形式です:
C++ のループには、主に while ループ、do while ループ、および for ループが含まれます。
1. whileループの構文
C++ の while ループの構文:
while(循环条件){
代码块
}
このうち、ループ条件は任意の式を使用できます(ただし、ブール式を使用する方が良いです)。コード ブロックは、1 行のコードまたは複数行のコードにすることができます。ループは、ループ条件が true の場合にのみ実行されます。条件が false の場合、ループは終了します。
2. 例
(1) 例1
#include<iostream>
using namespace std;
int main()
{
//计算1-10的和
int i=1,sum=0;
//要计算1-10的和,所以i的值最大应该要能够等于10
while(i<=10){
//循环体
//每循环一次,将i的值加1,并计算和
sum = sum + i;
i++;
//注意i自增和求和两个表达式的顺序,顺序相反会得到不一样的值。
}
//循环结束,输出最后计算的和
cout<<"1-10的和为:"<<sum;
}
出力は次のとおりです。
1-10的和为:55
同時に、簡略化された記述を使用することもできます。
#include<iostream>
using namespace std;
int main()
{
//计算1-10的和
int i=1,sum=0;
//要计算1-10的和,所以i的值最大应该要能够等于10
while(i<=10){
//循环体
//每循环一次,将i的值加1,并计算和
sum = sum + i++;
//i++;
//注意i自增和求和两个表达式的顺序,顺序相反会得到不一样的值。
}
//循环结束,输出最后计算的和
cout<<"1-10的和为:"<<sum;
}
ただし、簡易記述はコードの可読性が高くないため、推奨しません。
5. do...while ループ
do...while ループは、ループの最後にその状態をチェックします。
do…while ループは while ループに似ていますが、do…while ループはループが少なくとも 1 回実行されることを保証します。
1. do...while ループの構文
C++ の do...while ループの構文:
do{
代码块
}while(循环条件);
do...while ループは、ループ内のコードブロックを制限し、コードブロックの実行後にループ条件判定を実行します。条件が true の場合はループを継続し、条件が false の場合はループを終了します。終わり。したがって、do...while ループは少なくとも 1 回実行されます。
2. 例
#include<iostream>
using namespace std;
int main()
{
//输出1-20之间所有的偶数
int i=1;
//进入循环
do{
//判断是否为偶数
if(i%2==0){
cout<<i<<" ";
}
//改变i的值
i++;
} while(i<=20);
}
6、forループ
for ループは、C++ で使用される非常に一般的なループ構造です。
1. for ループの構文
for ループの構文は次のとおりです。
for(表达式A;表达式B;表达式C){
代码块
}
の:
- 式 A は、主に while ループなどのループ変数を初期化するために使用され、
int i=1;
複数の変数を同時に初期化できます。次に例を示します。int i=1,j=2;
- 式 B はループ条件の役割を果たし、while ループのループ条件と一致します。
- 式 C は、ループ変数の値を変更するために使用されます。同時に、式 C には次のような複数の式を含めることができます。
i++,j++;
2. forループの実行処理
実装プロセス:
(1)先执行表达式A,初始化变量;
(2)执行表达式B,判断循环条件,如果结果为真,则执行循环体;如果结果为假,则结束循环。
(3)循环体执行结束后,执行表达式C,改变循环变量的值。
(4)继续执行表达式B,判断循环条件,如果结果为真,则执行循环体;如果结果为假,则结束循环。
(5)重复(2)(3)(4)步操作,直到循环结束。
3. 例
#include<iostream>
using namespace std;
int main()
{
//输出1-100的和
int sum=0;
for(int i=1;i<=100;i++){
sum = sum + i;
}
cout<<"1-100的和为:"<<sum;
}
出力は次のとおりです。
1-100的和为:5050
7、ネストされたループ
いわゆる入れ子ループとは、1 つのループの中に別のループを入れ子にすることです。
ネストされたループの構文:
循环1{
循环2{
...
循环n{
}
}
}
このうち、最も一般的な入れ子ループは 2 層ループ、つまりループが 1 回入れ子になっているものです。複数のループをネストするとプログラムの実行時間が長くなる可能性があるため、使用には注意が必要です。
古典的なケース:
1. 九十九九九を印刷する
#include<iostream>
using namespace std;
int main()
{
//打印九九乘法表
/*
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
.......
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
*/
//九九乘法表其实是一个等腰直角三角形,可以看做是由行和列组成
/*行列关系:
行数 列数
1 1
2 2
3 3
4 4
... ...
9 9
*/
//因此,可以使用双层循环实现,一层循环表示行,一层循环表示列,即可打印。
//最小数值为1,最大为9,依次递增
//打印完一整行之后进行换行,所以应该在外层循环中打印换行符
for(int i=1;i<=9;i++){
//表示行
//第一行有1列,第二行有2列,以此类推
for(int j=1;j<=i;j++){
//表示列
//打印乘法算式:需要注意是i在前,还是j在前
cout<<j<<"x"<<i<<"="<<i*j<<" ";
}
cout<<"\n";
}
}
2. 素数を探す(素数)
#include<iostream>
using namespace std;
int main()
{
//打印1-100之间所有的质数
//质数(素数):只有1和这个数本身能被它自己整除的数叫做质数,例如2,3,5,7,11等
/*解题思路:要判断一个数是否为质数,需要将所有小于这个数本身的正整数和它相除,
如果没有任何一个能够除尽,则说明这个数是质数,否则,便不是质数。
使用双层循环进行解题,外层用于控制规定的范围1-100,内层用于判断是否为质数
*/
//1既不是质数,也不是合数,所以1不需要进行判断,初值为2即可
for(int i=2;i<=100;i++){
//控制范围
//由于任何一个数和1相除都能除尽,所以1没有判断的意义,直接从2开始即可
//定义布尔变量flag代表是否为质数
bool flag=false;
for(int j=2;j<i;j++){
//判断是否为质数
//判断时,将2至i之间所有数与i进行取余,如果余数为0,则表示能除尽,不为0,则表示除不尽。
//而一旦有任意一个数能被i除尽,则说明这个i不是质数
if(i%j==0){
//能除尽,则不是质数,没有继续判断的必要,结束循环
//不是质数,将flag值改为true
flag=true;
break;
}
}
//如果flag值为true,则说明i不是质数,flag为false,则说明内层循环的if语句一次都没有触发,说明是质数
if(!flag){
cout<<i<<" ";
}
}
}
8、ループ制御ステートメント: ブレークと続行
ループ制御ステートメントは、通常の実行シーケンスを変更します。実行がスコープを離れると、そのスコープ内で作成されたすべての自動オブジェクトが破棄されます。メインのループ制御ステートメントは、break と continue です。
1. ブレイクの使い方
C++ の Break ステートメントには、次の 2 つの用途があります。
- ループ内に Break ステートメントが出現すると、ループはただちに終了し、プログラム フローはループの直後の次のステートメントに進みます。
- switch ステートメントでケースを終了するために使用できます。
- ネストされたループで Break を使用すると、ブレークが配置されているループのみが終了し、他のループには影響しません。
例えば:
#include<iostream>
using namespace std;
int main()
{
for(int i=1;i<=100;i++){
cout<<i<<" ";
//添加break语句
break;
}
}
出力は次のとおりです。
1
プログラムが中断されると、for ループはすぐに終了するため、出力は 1 回だけです。
ただし、break ステートメントをこのように使用することはまれで、通常は if ステートメントと組み合わせて使用されます。たとえば、次のようになります。
#include<iostream>
using namespace std;
int main()
{
//输出1-100的和
int sum=0;
int i=1;
while(true){
sum = sum + i;
i++;
if(i>100){
break;
}
}
cout<<"1-100的和为:"<<sum;
}
出力は次のとおりです。
1-100的和为:5050
2. continueの使い方
C++ の continue ステートメントは、break ステートメントに似ています。ただし、強制終了はされません。続行すると、現在のループ内のコードがスキップされ、次のループが強制的に開始されます。
例えば:
#include<iostream>
using namespace std;
int main()
{
//输出1-50之间偶数的和
int sum=0;
int i=0;
while(i<=50){
i++;
if(i%2!=0) {
continue;
}
sum = sum + i;
}
cout<<"1-50的偶数和为:"<<sum;
}
出力結果:
1-50之间的偶数和为:650
実行が continue に達すると、 continue の後のステートメントは実行を続行せず、ループの先頭に直接戻り、新しいループを再度開始します。
3. 中断と続行の違い
Break ステートメントはループ構造全体を終了するために使用されますが、Continue ステートメントはループの処理を高速化するためにループ内の特定のサイクルを終了するだけであり、ループ構造全体を直接終了するわけではありません。