[C++] 02. 制御文と関数


2.1文の選択


-if文を使用して奇数と偶数を判別する

  • 選択文
    -条件が満たされているか否かに基づいて実行される部分を決定する-if文、switch文
  • if文
    -if文、if~else文
  • #include <iostresam>
    using namespace std;
    
    int main()
    {
    	int num;
        
        cout << "정수값 입력 : ";
        cin >> num;
        
        if (num % 2 == 1)
        	cout << num << " : " << "홀수" << endl;
        else
        	cout << num << " : " << "짝수" << endl;
            
        return 0;
    }
    [결과]
    정수값 입력 : 123
    123 : 홀수

    - if ~ else if ... ドア

  • if ~ else if ... ドア
    -if文は文-if文のif文でもよいし、else文の後のif文-{}でもよい.これは分かりやすい
  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	int num, remainder3;
        
        cout << "정수값 입략 : ";
        cin >> num;
        remainder3 = num % 3;	// 3으로 나눈 나머지
        
        if (remainder3 == 0)	// 나머지가 0
        	cout << num << " : 3으로 나눈 나머지가 0입니다." << endl;
        else if (reaminder3 ==1)	// 나머지가 1
        	cout << num << " : 3으로 나눈 나머지가 1입니다." << endl;
        else
        	cout << num << " : 3으로 나눈 나머지가 2입니다. << endl;
            
        return 0;
    }
    [결과]
    정수값 입력 : 123
    123 : 3으로 나눈 나머지가 0입니다.

    -if~else文の複雑な使い方

  • 次のプログラムを実行した結果は?
    -{}を使用して可読性を向上-インデントを適切に使用
  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	int num1 = 7, num2 = 7;
        
        if (num1 == 1)
        	if (num2 == 2)
            	num1 += num2;
        else	// 어떤 if 문에 대한 else 문인가?
        	num1 -= num2;
            
        cout << "num1 : " << num1 << endl;
        
        return 0;
    }
    [결과]
    num1 : 7

    -スイッチドア

  • switching-condition値のcaseテクスチャドリフト-注意行動
  • switch (condition)	// condition : 평가 결과가 정수형 값(char, int, bool)이어야 함
    {
    	case val1 :	// val1 : 상수값 또는 상수 표현식
        	statements
        case val2 :
        	statements
        ......
        default : 
        	statements
    }
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int num, remainder3;
        
        cout << "정수값 입력 : ";
        cin >> num;
        remainder3 = num % 3;	// 3으로 나눈 나머지
        
        switch (remainder3)
        {
        	case 0:	// 나머지가 0
            	cout << num << " : 3으로 나눈 나머지가 0입니다." << endl;
                break;
            case 1:	// 나머지가 1
            	cout << num << " : 3으로 나눈 나머지가 1입니다." << endl;
                break;
            default: // 나머지가 2
            	cout << num << " : 3으로 나눈 나머지가 2입니다." << endl;
                break;
        }
        
        return 0;
    }
    [결과]
    정수값 입력 : 30
    30 : 3으로 나눈 나머지가 0입니다.

    2.2繰り返し文


    -1~1000加算:for文

  • 繰り返し
    -特定の条件が満たされたときにタスクを繰り返します-文、while文、do while文の場合
  • for for文
  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	int result = 0;	// 0으로 초기화
        int i;
        
        for (i = 1; i <= 1000; i++)	// 1부터 100까지의 값들을
        	result = result + i;	// Result에 더해 줌
            
        cout << "1부터 1000까지의 합 : " << result << endl;
        
        return 0;
    }
    [결과]
    1부터 1000까지의 합 : 500500

    -1~1000加算:while文

  • while
  • int main()
    {
    	 int result = 0;	// 0으로 초기화
         int i =1;	// 1로 초기화
         
         while (i <= 1000)	// for(i = 1; i <= 1000; i++)
         {
         	result = result + i;	// 1부터 1000까지 result에 더해줌
            i++
         }
         
         cout << "1부터 1000까지의 합 : " << result << endl;
         
         return 0;
    }
    [결과]
    1부터 1000까지의 합 : 500500

    -1から1000加算:do~while文

  • do~while文(少なくとも1回実行)
  • int main()
    {
    	int result = 0;	// 0으로 초기화
        int i = 1;	// 1로 초기화
        
        do	// while (i <= 1000)
        {
        	result = result + i	// 1부터 1000까지 result에 더해 줌
            i++
        } while (i <= 1000);
        
        cout << "1부터 1000까지의 합 : " << result << endl;
        
        return 0;
    }
    [결과]
    1부터 1000까지의 합 : 500500

    -繰り返し文の選択方法

  • 繰り返し文の選択->練習で身につける必要がある
    -特定範囲のデータ処理:for文-範囲が指定されていない繰返しタスク:while文
  • 少なくとも1回実行する必要があります:do~while文
  • ex)特定の条件を満たす前に繰り返し実行
    -1つ、2つ、3つ、4つまたは5つの文字列を入力し、その数で文字列を出力します->5で終了
  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	int result =0;	// 0으로 초기화
        int i = 1;	// 1로 초기화
        
        do	// while(i <= 1000)
        {
        	result = result + i;	// 1부터 1000까지 result에 더해 줌
            i++
        } while(i <= 1000)
        
        cout << "1부터 1000까지의 합 : " << result << endl;
        
        return 0;
    }

    2.3四半期の記事


    -ドアを破って

  • break文
    -自分を含む重複文から逃れる-重複文が重複して現れる場合、自分を含む重複文の中で最も細い重複文から逃れる
  • int main()
    {
    	for(int dan = 2; dan <= 9; dan++)
        {
        	for(int i=1; i<=9; i++)
            {
            	if(dan % 2 == 0)	// 짝수단이라면
                	break;			// 가장 가까운 for문을 빠져나옴
                    
                cout << dan << "*" << i << "=" << dan * i << endl;
            }
        }
        
        return 0;
    }

    -文の続行

  • continue文
    -繰り返し文に含まれるcontinue文の後の文を実行せずに、
  • を直接スキップします.
    int main()
    {
    	for(int dan =2; dan<=9; dan)
        {
        	if(dan % 2 == 0)	// 짝수단이라면
            	continue;		// 해당 단(i)을 skip함
            
            for(int i = 1; i <= 9; i++)
            {
            	cout << dan << "*" << i << "=" << dan * i << endl;
            }
        }
        
        return 0;
    }

    -返信

  • return文
    -関数終了時に特定の値を返します-関数の戻りタイプがvoidの場合、関数終了
  • のみ
    void GuGu(int dan)
    {
    	if(dan % 2 == 0)	// 짝수단이라면
        	return;			// 출력하지 않고 바로 반환
            
        for(int i = 1; i <= 9; i++)
        {
        	cout << dan << "*" << i << "=" << dan * i << endl;
        }
    }
    
    int main()
    {
    	for(int dan = 2; dan <= 9; dan++)
        	GuGu(dan);
            
        return 0;
    }

    -ゴドア

  • goto文
    -特定のラベルに移動(ある場合)
  • int main()
    {
    	for(int dan = 2; dan <= 9l dan++)
        {
        	if(dan % 2 == 0)	// 짝수단이라면
            	goto next;		// next 레이블로 점프
                
            for(int i = 1; i <= 9; i++)
            	cout << dan << "*" << i << "=" << dan * i << endl;
                
            next: ;	// next 레이블
        }
        
        return 0;
    }

    2.4関数と変数


    -減算計算機の作成

  • グローバル変数
    -関数外-関数共有
  • 地域変数
    -関数にあり、パラメータ-この領域でのみ使用可能
  • #include <iostream>
    using namespace std;
    
    int g_result = 0;	// g_result : 전역변수
    
    void Plus(int num)	// num : 지역변수
    {
    	g_result += num;
    }
    
    void Minus(int num)
    {
    	g_result -= num;
    }
    
    int main()
    {
    	Plus(5); Minus(10); Minus(3); Pluse(4);
        cout << "최종 결과 : " << g_result << endl;
        
        return 0;
    }
    [결과]
    최종결과 : -4

    -変数の宣言位置

  • グローバル
  • 地域
    -ブロック内:{}-制御文
  • int g_var1;					// 전역변수
    int Sum(int num1, int num2)	// 함수 매개변수
    {
    	g_var1 = 0;
        
        for(int i = num1; bool j = (i <= num2); i++)	// for 초기화문 및 조건문
        	g_var1 += i;
            
        while(bool i = (num1 <= num2))	// while 조건문
        {
        	int temp = num2;			// while 복합문 내 변수
            g_var1 += temp;
            num2--;
        }
        return g_var1;
    }
    
    int g_var2;
    int main()
    {
    	int num1, num2;				// 전역 변수
        cout << "정수 2개 입력 : ";	// 함수 내 변수
        cin >> num1 >> num2;
        g_var2 = Sum(num1, num2);
        int num3 = g_var;			// 함수 내 변수
        cout << "최종 결과 : " << num3 << endl;
        return 0;
    }
    [결과]
    정수 2개 입력 : 10 20
    최종 결과 : 330

    -変数の使用可能領域(Scope)

  • Scope:変数が使用可能な領域(範囲)
    -変数を宣言した後で使用可能-変数を宣言した地域でのみ使用可能
  • 名前を隠す
    -ある地域の変数が以前に宣言された変数と同じ名前で宣言された場合、その地域の以前の変数は使用できません->グローバル変数使用可能
  • int var1 = 0;
    
    int main()
    {
    	int var2 = 100;
        int var1 = 200;
        
        {
        	int var2 =200;
            int var3 = var1 + var2;
            
            var1 = var2 + var3;
        }
        
        cout << "var1 : " << var1 << endl;	// 어떤 var1인가?
        cout << "var2 : " << var2 << endl;	// 어떤 var2인가?
        // cout << "var3 : " << var3 << endl;
        // 20라인의 var3은 해당 지역 종료 후 사라짐
        cout << "::var1 : " << ::var1 << endl;	// 전역 변수 var1
        
        return 0;
    }
    [결과]
    var1 : 600
    var2 : 100
    ::var1 : 0

    -変数の寿命(ライフサイクル)

  • Storage duration:メモリの割り当てがいつ無効になるか
  • 変数タイプ説明静的(static)変数-プログラム終了時に無効-初期化文は最初の呼び出し時にのみ実行-初期化文がない場合、自動的に0に初期化される自動(auto)変数-非静的領域変数-この領域から脱出するときに無効-初期化文がない場合、ゴミ値(dynamic)に初期化されます変数-new演算子とdelete演算子によって宣言および作成
    int g_var;	// 자동으로 0으로 초기화
    
    void Func(int param)
    {
    	static int s_num = 100;	// static 지역 변수
        int a_num = 100;		// auto 지역 변수
        
        g_var++;
        s_num++;
        a_num++;
        
        cout << "g_var : " << g_var << ", ";
        cout << "s_num : " << s_num << ", ";
        cout << "a_num : " << a_num << endl;
    }
    
    int main()
    {
    	for(int i = 0; i < 5; i++)
        	Func(i);
            
        return 0;
    }
    [결과]
    g_var : 1, s_num : 101, a_num : 101
    g_var : 2, s_num : 102, a_num : 101
    g_var : 3, s_num : 103, a_num : 101
    g_var : 4, s_num : 104, a_num : 101
    g_var : 5, s_num : 105, a_num : 101

    2.5関数過負荷


    -Sum関数の作成

  • int値と2つの値を加算する関数、2つの値を加算する関数
    -int:Isum関数-double:DSum関数
  • どちらもsum関数名を使用できませんか?
    ->関数リロード
  • #include <iostream>
    using namespace std;	// std라는 namespace의 내용을 불러옴
    
    int ISum(int num1, int num2)
    {
    	int result = 0;
        
        for(int i = num1; i <= num2; i++)	// num1 <= num2 로 가정
        	result += i;
          
        return result;
    }
    
    double DSum(double num1, double num2)
    {
    	return(num1 + num2);
    }
    
    int main()
    {
    	cout << "ISum(1, 10) 	 : " << ISum(1, 10) << endl;
        cout << "DSum(1.0. 10.0) : " << DSum(1.0, 10.0) << endl;
        
        return 0;
    }
    [결과]
    ISum(1, 10)		: 55
    DSum(1.0, 10.0) : 11

    -関数リロードを使用してSum関数を作成

  • 関数リロード
    -同じ名前で複数の関数を作成できます-関数を区別します
  • 関数名が異なるか
  • パラメータの数とタイプは異なる必要があります
  • 次は関数リロードですか?
    - int Func(int n); - char Func(int n);
    ->オーバーロードではありません
  • int Sum(int num1, int num2)
    {
    	int result = 0;
        
        for(int i = num1; i <= num2; i++)	// num <= num2 로 가정
        	result += i;
            
        return result;
    }
    
    double Sum(double num1, double num2)
    {
    	return(num1 + num2);
    }
    
    int main()
    {
    	cout << "Sum(1, 10)		: " << Sum(1, 10) << endl;
        cout << "Sum(1.0, 10.0)	: " << Sum(1.0, 10.0) << endl;
        
        return 0;
    }
    [결과]
    Sum(1, 10)		: 55
    Sum(1.0, 10.0)  : 11

    2.6デフォルトパラメータ


    -べき乗関数を作成し、二乗を反復します。

  • 1パラメータxの2乗;2パラメータxのy乗戻り
    -関数リロードを使用してPower関数を作成
  • デフォルトパラメータの使用
    - int Power(int x, int y = 2); - Power(3)->3リターン2勝-Powerer(3,4)->3リターン4勝
    -最後からデフォルトのパラメータ値を設定できます.
    -ぼやけた状況に注意
  • int Power(int x), int Power(int x, int y = 2)
  • int Power(int x)		// x의 2승
    {
    	return(x * x);
    }
    
    int Power(int x, int y)	// x의 y승
    {
    	int result = 1;
        
        for(int i = 0; i < y; i++)
        	result *= x;
            
        return result;
    }
    
    int main()
    {
    	cout << "Power(3)	 : " << Power(3) << endl;		// 3의 2승
        cout << "Power(3, 3) : " << Power(3, 3) << endl; 	// 3의 3승
        
        return 0;
    }
    [결과]
    Power(3)	: 9
    Power(3, 3) : 27

    2.7再帰呼び出し


    -合計2つの数の値

  • コールバック
    -現在の実行ポイントまで前の関数を再呼び出し-再帰関数:再帰呼び出しを含む関数
  • 2つの数の間の値の合計
    -再帰関数の使用
    1+2+3+4+5+6+7+8+9+10=>1,10間の和
  • int Sum(int num1, int num2)
    {
    	if(num1 == num2)
        	return num2;
        else
        	return (num1 + Sum(num1 + 1, num2));
    }
    
    int main()
    {
    	cout << "Sum(1, 10)	  : " << Sum(1, 10) << endl;
        cout << "Sum(10, 100) : " << Sum(10, 100) << endl;
        
        return 0;
    }
    [결과]
    Sum(1, 10)	 : 55
    Sum(10, 100) : 5005

    -再帰コールを使用して階乗を取得

  • factorial求法
    -コールバックの練習に関する一般的な問題-トラブルシューティング(5)=5 4 3 2 1トラブルシューティング(0)=1
  • int Fact(int num)
    {
    	if(num == 0)
        	return 1;
        else
        	return(num * Fact(num - 1));
    }
    
    int main()
    {
    	cout << "3! = " << Fact(3) << endl;
        cout << "%! = " << Fact(5) << endl;
        cout << "0! = " << Fact(0) << endl;
        
        return 0;
    }
    [결과]
    3! = 6
    5! = 120
    0! = 1

    2.8行内関数


    -マクロ関数と一般関数の復習

    // 매크로로 구현한 경우
    #defune MIN(X, Y) ((X) < (Y) ? (X) : (Y))	// 최소값 반환
    Int main()
    {
    	cout << MIN(4, 5) << endl;
        cout << MIN((2 + 3), (1 + 2)) << endl;
        return 0;
    }
    // 함수로 구현한 경우
    int MIN(int X, int Y)
    {
    	return(X < Y ? X : Y);	// 최소값 반환
    }
    
    int main()
    {
    	cout << MIN(4, 5) << endl;
        cout << MIN((2 + 3), (1 + 2)) << endl;
        return 0;
    }
    [결과]
    4
    3

    -インライン関数

  • inline関数
    -マクロと似ています:関数呼び出し文を関数に置換するコードを要求します-コンパイラによって決定されます-関数定義時にインラインキーワードを追加します-インラインint MIN(int X,int Y){return((X)<(Y):(Y)}
  • factorial再帰関数はinline関数によって作成されますか?
  • inline int Fact(int num)	// 재귀 호출 함수
    {
    	return((num == 0) ? 1 : num * Fact(num - 1));
        // 5! = 5 * 4!
    }
    
    int main()
    {
    	cout << "5! = " << Fact(5) << endl;
    	return 0;
    }
    [결과]
    5! = 120

    2.9ネーミングスペース:クラシックC++と標準C++


    -ネームスペースが必要

  • ロック各種ライブラリ使用時に発生する可能性のある問題:どのsum関数ですか?
  • ネーミングスペース(ネーミングスペース)
    -特定の識別子で構成されるグループ(複数の識別子を1つのグループに結合する)
  • -ネーミングスペースの作成と使用

  • ネーミングスペースの作成方法
    -ネームスペース名{..}
  • ネーミングスペースの使用方法
    -ネームスペース名:::識別子
  • グローバルネーミングスペース
    -::Sum(3,4)と併用
  • namespace Microsoft	// Microsoft 네임스페이스 작성
    {
    	int g_var;
        int Plus(int x, int y) {return(x + y);}
        int Minus(int x, int y)	{return(x - y);}
    }
    
    namespace Google	// Google 네임스페이스 작성
    {
    	int g_var;
        int Plus(int x, int y) {return(x + y);}
        int Minus(int x, int y)
    }
    
    int Google ::Minus(int x, int y)	// Google 네임스페이스의 Minus 함수 작성
    {
    	return(x - y);
    }
    
    int main()	// 네임스페이스 이름으로 접근
    {
    	Microsoft::g_var = Microsoft::Minus(5, 2);
        cout << Microsoft::g_ var << endl;
        return 0;
    }
    [결과]
    3

    -宣言の使用

  • 使用宣言
    -現在のネーミングスペースで別のネーミングスペースの識別子を使用-キーワードを使用したネーミングスペースで有効-Microsoftを使用::Minus;using namespace Microsoft; -> Microsoftのすべての識別子
  • を現在の場所で宣言
    #include <iostream>
    // using namespace std;
    
    using std::cout;	// 전역예서 cout를 사용할 수 있음
    using std::endl;	// 전역에서 endl을 사용할 수 있음
    
    int main()
    {
    	cout << "표준 C++" << 두이;
        // std::cout << "표준 C++" << std::endl;	// using 선언 없을 떄
    }
    [결과]
    표준 C++

    -既存のCライブラリをC++で使用する方法

  • Visual C++
    -既存のCライブラリ-C++スタイルを保持します.ヘッダファイルにはC接頭辞があり、拡張子がありません(たとえばcstdio)-ヘッダファイルには拡張子がありません
  • cstdioファイル:stdio.hファイルを保持し、stdネーミングスペースに識別子を含める
    -宣言を使用して既存のバージョンと同じにします-Visual c++6.0:stdioのみ.hファイルのみ含む->使用不可宣言
  • // #include <stdio.h>
    #include <cstdio>
    using namespace std;
    
    int main()
    {
    	printf("C++ Programming\n");
        return 0;
    }
    [결과]
    C++ Programming

    -ネストされたネーミングスペース

  • ネストネーミングスペース
    -ネーミングスペース内で別のネーミングスペースを宣言できます-CompanyB::DeptC::Func 1()とともに使用
  • namespace CompanyA	// 네임스페이스 CompanyA 작성
    {
    	int g_var_b
        void Func1() { cout << "CompanyA::Func1" << endl; }
        void Func2() { cout << "CompanyA::Func2" << endl; }
    }
    
    namespace CompanyB	// 네임스페이스 CompanyB 작성
    {
    	using namespace CompanyA;	// 네임스페이스 CompanyA를 CompanyB로 포함
        int g_var_b;
        void Func1() {cout << "CompanyB::Func1" << endl;}
        
        namespace DeptC	// Company 내에 네임스페이스 DeptC 작성
        {
        	void Func1() {cout << "CompanyB::DeptC::Func1" << endl;}
        }
    }
    
    int main()
    {
    	CompanyB::Func1();
        CompanyB::Func2();	// 실제로는 CompanyA의 Func2 함수 실행
        CompanyB::DeptC::Func1();
        return 0;
    }
    [결과]
    CompanyB::Func1
    CompanyA::Func2
    CompanyB::DeptC::Func1