[KOCW韓国産業技術大学朴正民教授]Cプログラミング9強


Part 9関数とは?


9.1関数は


n.関数

  • 特定の動作を実行するコードセット
  • 関数のタイプ:

  • 標準ライブラリ関数
  • カスタムライブラリ関数
  • 関数を使用する利点

  • コードの信頼性向上
  • エラーの修正が容易
  • 再使用向上
  • 複雑性を低減し、凝集力
  • を向上させる

    9.2各種形式の関数


    11形態

  • 出力形式:
  • あり
  • 入力形式:有
    ex)
  • int sum (int x, int y)

    10形態

  • 出力形式:
  • あり
  • 入力形式:なし(void省略可)
    ex)
  • int input (void) // 

    01形態

  • 出力形式:
  • なし
  • 入力形式:有
    ex)
  • void print (int x)

    00形状

  • 出力形式:
  • なし
  • 入力形式:なし(void省略可)
    ex)
  • void output (void)

    9.3関数の適用方法


    1つ目の方法:関数の定義を呼び出す=>関数


    定義
  • 関数:関数機能を定義する文書
  • 呼び出し
  • 関数:定義関数を呼び出す文
    ex)
  • #include <stdio.h>
    int max(int a, int b) // Function definition
    {
        if(a>b)
            return a;
        else
            return b;
    }
    
    int main(void) // Function call 
    {
        int i, j;
        int k;
    
        printf("Enter two numbers :");
        scanf("%d %d", &i, &j);
    
        k = max(i, j);
        printf("The large number of %d or %d is %d \n", i, j, k);
    
        return 0;
    }

    2つ目の方法:関数の宣言=>関数の呼び出し=>関数の定義

  • 関数のプロトタイプ宣言により、
  • の関数リストがいくつあるかを直感的に見ることができる.
    ex)
    #include <stdio.h>
    double divide(double x, double y); // Function declaration
    double input(void); // Function declaration
    void output(double x); // Function declaration
    void information(void); // Function declaration
    
    int main(void)
    {
        double num1, num2, result;
    
        information(); // Function call
        printf("Enter the first real number: ");
        num1 = input(); // Function call
    
        printf("Enter the second real number: ");
        num2 = input(); // Function call
    
        result = divide(num1, num2);
        output(result);
    
        return 0;
    }
    
    double divide(double x, double y) // Function definition
    {
        double val;
        val = x / y;
        return val;
    }
    
    double input(void) // Function definition
    {
        double val;
        scanf("%lf", &val);
        return val;
    }
    
    void output(double x) // Function definition
    {
        printf("Divide results: %lf \n", x);
        return;
    }
    
    void information(void)
    {
        printf("----- start program ----- \n");
        return;
    }
    
    

    9.4変数のタイプと範囲


    ゾーン変数


    変数
  • は、条件文、条件文、繰返し文などのカッコ内および関数のパラメータに使用されます.
  • を初期化しないと、ゴミ値が保存されます.
  • メモリ作成ポイントは、括弧内で初期化すると
  • になります.
  • メモリ消失点は括弧なしで
  • である.

    グローバル変数

  • でカッコ外で宣言された変数
  • メモリ作成時間:プログラム起動時
  • メモリ消失点:プログラム終了時
  • プログラムはメモリに存在し、領域の制限を受けない.
  • 秒の値を指定しない場合は、0をデフォルト値とします.初期化は定数(定数ではありません)
  • でなければなりません.

    せいてきへんすう

  • データ型の前に静的キーワード
  • を付加する.
  • グローバル変数の欠点
  • を部分的に補う.
  • メモリ作成ポイント:カッコ内の初期化時
  • メモリ消失点:プログラム終了時
  • デフォルト値は
  • 秒で、差は
  • で、1回のみ初期化されます.
  • 関数内部、条件文、繰返し文などの大かっこ内のグローバル変数機能を使用する場合は、
  • を使用します.
    括弧内でグローバル変数としてのみ使用する静的変数を「静的領域変数」と呼ぶ.
    cf.ファイルでのみグローバル変数として使用され、外部参照は許可されない「静的グローバル変数」も存在する.
    ex)
    while(1)
    {
        static int num=0; // 초기화는 최초 한 번만 실행
        num=num+1;
        printf("%d \n", num);
    }
    上記のコードがある場合numは一度だけ初期化するので、0、1、2、3、4...許容値

    がいぶへんすう

  • 外部ファイルで宣言された変数を参照するために使用される変数
  • 表頭プラス外部キー
  • レジスタ変数

  • のCPUレジスタに変数を割り当てる処理速度
  • を速める.
  • 資料型の前にレジスタを付け、
  • を使用する
  • しかし、ほとんどのコンパイラは、コード最適化段階でレジスタ変数を自動的に設定する機能を提供するため、
  • を単独で使用しない.

    プロセスメモリ構造



    実行中のプログラムをプロセスと呼びます.
    このプロシージャで使用されるメモリ容量は、次のように大きくなります.
    これらの領域をストレージクラスと呼ぶ.
    ストレージカテゴリの役割

  • コード領域:実行コード、関数を格納するドメイン
    名前の通り、これは実行可能なコードを含むコード領域です.

  • スタック領域:関数呼び出しのパラメータ、領域変数
    グローバル変数とは異なり、プログラムの実行時にメモリが消えた変数は分離され、スタックに入ります.

  • ≪データ領域|Data Area|oem_src≫:グローバル変数と静的変数
    プログラムの実行から終了までのデータがゾーン変数とは別にデータゾーンに入る

  • 臀部領域:ダイナミックメモリを割り当てる変数
  • このように分割するのは、宣言された場所やタイプによって、変数のメモリ内の存在時間が異なるためです.

    9.5再帰関数

  • の関数では、再帰的呼び出し(Recursive Call)
  • と呼ばれる独自の関数が呼び出される.
  • 時間とメモリ容量の効率が低下するという問題
  • Reference
    授業:朴正民、《Cプログラム設計》、韓国工業技術大学、9強
    教材:朴正民、『熱血で話すC言語の本色名授業によるC言語の奇跡』、フリーク(2011)、p 227-266.