第2期第3週、指導課程CS 50補習班


📌 整列
プログラム実行手順
  • 前処理
    #で始まるCソースコードは、プリプロセッサが実際にコンパイルする前に、いくつかの操作を実行するように通知されます.
    たとえば、#includeは、フロントプロセッサに他のファイルの内容が含まれていることを通知します.プログラムのソースコードにincludeなどの行が含まれている場合、フロントプロセッサは、Cソースコード形式のstdioのままの新しいファイルを作成します.hファイルの内容は#includeセクションに含まれます.
  • コンパイル(Complie)
    フロントプロセッサが前処理のソースコードを生成した後、次はコンパイルです.コンパイラと呼ばれるプログラムはCコードをコンポーネントと呼ばれる低レベルのプログラミング言語にコンパイルする.
    コンポーネント内の演算はCよりはるかに少ないが、複数の演算を同時に使用すると、Cが実行できるすべての操作を実行することができる.Cコードをコンポーネントコードに変換することで,コンパイラはプログラムをコンピュータが理解できる言語にできるだけ近づけることができる.「コンパイル」という言葉は、ソースコードからオブジェクトコードに変換するプロセス全体を指しますが、特定の処理を施したソースコードをコンポーネントコードに変換するステップも指します.
  • 組立
    ソースコードがコンポーネントコードに変換された場合は、コンポーネントコードをオブジェクトコードに変換する、すなわち次のコンポーネントステップを示します.これは、コンピュータの中央プロセッサを連続的な0と1に変換する命令形式であり、プログラムをどのように実行するかを知る.この変換はアセンブリというプログラムによって実行されます.ソースコードにオブジェクトコードとしてコンパイルするファイルが1つしかない場合は、コンパイル操作はこれで終了します.しかし、そうでなければ「イクラ」と呼ばれる段階が増える.
  • リンク(リンク)
    プログラムにmath.hやcs 50.hなどの複数のファイルが含まれている場合、1つのオブジェクトファイルにマージする必要がある場合は、リンクと呼ばれる最後のステップをコンパイルする必要があります.ループは、複数の異なるオブジェクトコードファイルを実行可能なオブジェクトコードファイルにマージします.たとえば、コンパイル中にCS 50ライブラリをリンクすると、オブジェクトコードはGetInt()やGetString()などの関数をどのように実行するかを知ることになります.
  • この4つのステップは、最終実行可能ファイルを完了しました.
    💡 コンパイルせずに直接機械言語でプログラムを作成したらどうしますか?
  • 機械語を習いたい
  • 私の同僚は機械言語を学ぶ必要があります
  • 毒性低下
  • デバッグ
    コード内のエラーを認識して修正する必要があります
    💡 デバッグを支援するツールがなければ?
    不審な
  • エラーにprintf()を塗り、変数の状態を表示し、
  • を表示します.
  • コードを再コンパイルし、出力
  • を1つずつチェックする.
    コードせっけい
    協力が必要です.各コンピュータ言語のスタイルガイドまたはビジネス・ルール
    C -> snake_case, Java -> camelCase
    アレイ
  • インデックスと番号に対応するデータからなるプログラミング言語における最も基礎的なデータ構造
  • は、通常、同種のデータを順次格納、相対位置
  • として表す.
  • は、メモリにデータ(例えば
  • )を格納し、変数として管理するために使用される
    グローバル変数
    const int N = 3;
    constキーワード宣言を使用します.通常、グローバル変数は大文字で表されます.
    string
    焦点の配列."HI!"入力すると、メモリに終端文字0が追加されます.
    string.h
    文字列ライブラリ
  • strcpy:レプリケーション文字列
  • strcat:文字列合計
  • strlen:文字列長
  • strcmp:文字列比較
  • ctype.h
  • toupper:charを大文字
  • に変換
  • tolower:文字を小文字に変換
  • isalnum:文字がアルファベットまたは数値の場合、ゼロ以外の値
  • を返します.
  • isgraph:charがグラフィック文字の場合、ゼロ以外の値
  • が返されます.
  • toascii:charをaskiコード
  • に変換する
    コマンドラインパラメータ
    次のコードは、main()にvoidを機械的に入力するのではなくargc、argvを定義します.
    #include <cs50.h>
    #include <stdio.h>
    
    int main(int argc, string argv[])
    {
        if (argc == 2)
        {
            printf("hello, %s\n", argv[1]);
        }
        else
        {
            printf("hello, world\n");
        }
    }
    最初の変数argcはmain関数が受信する入力数です.argv[]は、入力を含む配列です.プログラムはコマンドラインで実行されるので、入力は文字列です.したがってargv[]は文字列配列である.デフォルトではargv[0]はプログラム名で保存されます.もう1つの入力を与えるとargv[1]に保存されます.たとえば、上記のプログラムを「arg.c」として保存し、「./argc」にコンパイルすると、「hello,world」という値が出力されます.コマンドラインパラメータの値はプログラム名が1つしかないためです.ただし、「./argc David」を実行すると、「hello,David」という値が出力されます.コマンドラインパラメータにはDavidという値も入力されているため、argcは2、argv[1]は「David」となる.
    📺 生活する
    開発者が守るべき道徳
  • (勉強を恐れないでください)
  • 通信
  • 圧力管理
  • 一緒に働きたい開発者や同僚になる方法
  • コメントが上手な同僚
  • 既知/不明の同僚を共有
  • 必ず能力がある.
  • コードスタイル
  • テスト
  • API(Application Programming Interface)
  • インタフェースは、オペレーティングシステムまたはプログラミング言語が提供する機能を制御し、プログラムで使用することができる.
    チームタスク👩🏻‍💻
  • 単位計算問題
  • の最も簡単な問題の難易度は前回の駐車とあまり差がありません.
  • #include <cs50.h>
    #include <stdio.h>
    
    string calculateGrade(int myScore){
        string grade[] = {"A+","A","B+","B","C+","C","D+","D","F"};
        if (myScore >= 95){
            return grade[0];
        } else if(myScore >= 90){
            return grade[1];
        } else if(myScore >= 85){
            return grade[2];
        } else if(myScore >= 80){
            return grade[3];
        } else if(myScore >= 75){
            return grade[4];
        } else if(myScore >= 70){
            return grade[5];
        } else if(myScore >= 65) {
            return grade[6];
        } else if(myScore >= 60) {
            return grade[7];
        } else {
            return grade[8];
        }
    }
    
    int main(void){
        int myScore = 0;
    
        printf("학점 프로그램\n");
        printf("종료를 원하면 \"999\"를 입력\n");
        printf("[ 학점 테이블 ]\n");
        printf("점수 : 95   90  85  80  75  70  65  60  0\n");
        printf("학점 : A+   A   B+  B   C+  C   D+  D   F\n");
    
        while(true){
            myScore = get_int("성적을 입력하세요 (0 ~ 100) : ");
            
            if(myScore == 999){
                printf("학점 프로그램을 종료합니다.\n");
                break;
            }
    
            if(myScore >= 0 && myScore <=100){
                printf("학점은 %s 입니다.\n",calculateGrade(myScore));
            } else {
                printf("** %i 성적을 올바르게 입력하세요. 범위는 0 ~ 100 입니다.\n",myScore);
            }
        }
    
    }
    
    No Number
  • を検索
  • リダイレクトの問題make hello<10を使用します.txtを10に入力します.txtファイルをscanf()で読み込みます.txtファイルに複数の数字がランダムに格納されているのは、漏れた数字を探す問題です.解法は,1~nのフィット式n(n+1)/2を用いてnのフィットを求め,txtファイル中の数字の和を取り除く.
  • #include <cs50.h>
    #include <stdio.h>
    #define SIZE 500000
    
    int main(int argc, char*argv[]){
        int n;
    
        scanf("%d", &n);
    
        // 1부터 N의 숫자중 K가 빠진 배열
        int partArr[SIZE];
        int lengthOfPartArr = n-1;
        long totalSum = n * (n + 1) / 2;
        long sum = 0;
    
        for(int i=0; i < lengthOfPartArr; i++){
            scanf("%d", &partArr[i]);
            sum += partArr[i];
        }
    
        printf("K : %ld\n", totalSum - sum);
    
        return 0;
    }
    
  • Queue
  • #include <cs50.h>
    #include <stdio.h>
    #define MAX 10
    
    int front = -1;
    int rear = -1;
    int queue[MAX];
    int count = 0;
    
    void add(){
        if (count == MAX){
            printf("Queue가 꽉 찼습니다.\n" );
        } else {
            int value = get_int("숫자를 입력하세요 : ");
            rear = (rear + 1) % MAX;
            queue[rear] = value;
            count++;
        }
    }
    
    void pop(){
        if(count == 0){
            printf("Queue가 비었습니다.\n" );
        } else {
            front = (front + 1) % MAX;
            count--;
        }
    }
    
    void display() {
    //     - 반복문을 사용하여 배열의 모든 요소를 출력 (hint: front, rear 변수 범위로 배열값을 출력)
        if (count == 0){
            printf("Queue가 비었습니다.\n" );
        }
        else {
            if(front >= rear){
                printf("Queue : " );
                for(int i = front+1; i<= MAX + rear; i++){
                    printf("%d ",queue[i % 10]);
                }
                printf("\n");
            } else {
                printf("Queue : " );
                for(int i = front+1; i<=rear; i++){
                    printf("%d ",queue[i]);
                }
                printf("\n");
            }
        }
    }
    
    int main(int argc, char*argv[]){
        int num = 0;
        while(num != 4){
           num  = get_int("1.add 2.pop 3.display 4.quit : ");
    
          switch(num){
            case 1 : 
                add(); 
                break;
            case 2 :
                pop();
                break;  
            case 3 :
                display();
                break;  
            default :
                break;   
            }
    
            printf("f : %d , r : %d\n",front, rear);
        }
        
        return 0;
    }
    
    
    レビュー🏻
    3週目の難易度は初心者には難しすぎるようです.😭 私たちのチームも半分以上もこの問題をしていない.もし私が一年生の時にもこの問題を受け取ったら、私は絶対にしません.しかし、出題の意図は理解できる.コード化するたびにわからない問題にぶつかるので、この難易度に触れてみるのも役に立つかも…?!
    この問題の中で一番面白いのは2番目の問題です.テキストファイルの数値はランダムで、順序ではなく和を求める必要があります.私の下にヒントがあって、考えもせずにすぐに解けましたが、ヒントがなければ、どれだけ迷っているのか知りたいです.
    来週は難易度が高いと言われているので、難易度を調整するそうです.来週は隊員たちが謎を解き、コードコメントをしてほしい.