21.1.15


#1.コース:コンピュータ科学基礎(4~5課)
#2.授業内容:全員向けコンピュータ科学(CS 502019)
  • アルゴリズム

  • 検索アルゴリズム:線形(順次検索)vsバイナリ(対分検索)
    状況に応じて(ソートに基づいて)どのような効果を考慮しますか?

  • アルゴリズムシンボル:アルゴリズム実行時間の上限/下限(どれだけよく実現されているか)
  • Big-Oシンボル(推定値表示):トレンドが同じ場合は、同じ式を使用します.△必ずしも数字で区切らなければならないとは限らない.e.g O(n), Log(n)...
    実行時間:速度順にO記号をリストします.(上限)
    逆に、運転時間の下限を示す尺度
    オメガ:一番いい場合は、回数別にリストします(ラッキーなら一度でもできると仮定します)
    p.s端末でcdが効かない場合の確認方法:pwdで位置を確認した後、次の格子に入るとき、次の知らないときはdirで検索し、上のフォルダを直接確認して移動します.
  • リニアサーチ
    例1
  • #include <cs50.h>
    #include <stdio.h>
    
    int main(void){
        int numbers[6] = {4, 8, 15, 16, 23, 42};
    
        for (int i = 0; i < 6; i++){
            if (numbers[i] == 50){
                printf("Found\n");
            }
        }
        printf("Not found\n");
    }
    Not found // 50이 없으니까.
    p.s
    make: *** No rule to make target 'names'.  Stop.
    エラーは、ファイル名と私が作成するスペルや位置が異なるためです.大したことはないので、sとかちゃんと減っているかどうか確認したり、pwdをよくしたりします.(ファイル名はname.cで、私がnamesでコンパイルしようとしたのとは違います.本当に敏感な友達です.c言語です.
    数字ではなく文字列なら?関数を使用する必要があります.
    #include <cs50.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(void){
        string name[4] = {"EMMA", "RODIGO", "BRIAN", "DAVID"};
    
        for (int i = 0 ; i < 4; i++){
            if strcmp(name[i], "EMMA") == 0) {
                printf("Found\n");
            }
        }
        printf("Not found\n");
    }
    
    電話帳の例2
    #include <cs50.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(void){
        string name[4] = {"EMMA", "RODIGO", "BRIAN", "DAVID"};
        string number[4] = {"617-555-0100", "617-555-0103", "617-555-0102","617-555-0104"};
    
        for (int i =0 ; i < 4 ; i++){
            if (strcmp(name[i], "EMMA") == 0){
                printf("%s\n", number[i]);
                return 0;
            }
        }
        printf("Not Found\n");
        return 1;
    }
    
    しかし、ここでは、電話帳と人名はいつも一致していますか?
    ->新しいtypedef概念を理解する
    (辞書に似ています)
    #include <cs50.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct{
        string name;
        string number;
    }
    
    person;
    
    int main(void){
        person people[4];
        people[0].name = "EMMA";
        people[0].number = "617-555-0100";
        people[1].name = "RODIGO";
        people[1].number = "617-555-0103";
        people[2].name = "BRIAN";
        people[2].number = "617-555-0102";
        people[3].name = "DAVID";
        people[3].number = "617-555-0104";
    
    
        for (int i =0 ; i < 4 ; i++){
            if (strcmp(people[i].name, "EMMA") == 0){
                printf("%s\n", people[i].number);
                return 0;
            }
        }
        printf("Not Found\n");
        return 1;
    }
    
    上で使用したstruct:複数のデータ型を含むコンテナだと思います.前に学んだ内容の応用概念を総合することができる.
  • 泡ソート:「無効」
    ソートにどれくらいかかりますか?必ず並べ替えますか?
    ソートのアルゴリズムを理解する(ソートされていない配列をソートすることを目標とする)
    Bubbleソート(サイズ、エッジ、置換、置換...大きな値をまとめてソートするスタイル)には、より長いナビゲーション時間がかかります(数値はソートされていないため、ソートと同時に検索する必要があります).
    &(n-1)の二乗形

  • ソート選択:無効
    まず最小の数字を左に移動します(移動位置と配置位置の間の交換方式で並べ替えます)
    これはもっと良い方法ですか?(小さいものを選択して並べ替えますか?)
    &n(n+1)/2方式;他のものを見る前に、その数が一番小さいかどうかは保証できません.最良の場合でも時間を無駄にします.

  • ソートアルゴリズムの実行時間:コマンドがあれば時間を短縮できますか?
    ->バブルソートにも時間がかかります
  • リターン:自分を呼び出し続けます.
    ピラミッドの繰り返し作成(1+1+1+1+1+1...再帰定義)
  • # include <cs50.h>
    # include <stdio.h>
    void draw(int h);
    int main(void){
      int height = get_int("Height: ");
      draw(height);
      }
    
      void draw(int h){
          for (int i = 1; i<= h; i++){
              for (int j = 1; j <= i ; j++){
                  printf("#");
              }
              printf("\n");
          }
      }
    Height: 5
    #
    ##
    ###
    ####
    #####
    2つのループを再帰的に変換すると、次のように変更されます.(より小さな関数の値で再描画する概念を理解しておくだけです.)
    # include <cs50.h>
    # include <stdio.h>
    
    void draw(int h);
    int main(void){
      int height = get_int("Height: ");
      draw(height);
      }
    
      void draw(int h){
          if (h==0){ // 음수가 되지 않게 막아줌
             return; 
          }
          draw(h-1); // 재귀되는 부분
    
          for (int i = 0; i < h ; i++){
              printf("#");
          }
        printf("\n");
      }
    
  • マージソート:優れたアルゴリズム.複数の分野で使用されています.他のソートよりも速いです.
    左揃え+右揃え+マージ揃え(同じアルゴリズムを盲目的に繰り返す)
    nlog n方式
    7 4/5 2/6 3/8 1
    4 7 5 2/3 6 1 8
    2 4 5 7/1 3 6 8
    1 2 3 4/5 6 7 8(終了)
    ソートとマージを別々に行います(分割、相互ソート、マージを続行します).
    電話帳を切る「登録方法」を考えれば理解できる.
  • メモリ
  • メモリアドレス(16進数、メモリに書かれた進数)
    0 1 2 3 4 5 6 7 8 9 A B C D E F
    e.g RGB色
    soxの数字はすべて16進数です.
  • #include <stdio.h>
    
    int main(void){
    
        int n =50;
        printf("%p\n", &n);
    }
    0x7fff808841ac // 실제 n값의 메모리 상 위치 확인하는 것, 주소
    コマンド:
        printf("%i\n", *&n); 
        // 프린트는 50 그대로 나오지만 그 주소로 가긴 감.(사용자가 볼 수는 없음)
  • ポインタ:管理が困難なメモリアドレスの格納とアクセスを容易にする概念(上のポインタではなく正規表現を使用します.これはポインタを使用する概念で、結果は同じです).
  • #include <stdio.h>
    
    int main(void){
    
        int n =50;
        int *p = &n;
        printf("%p\n", p); // 포인터 사용.(별모양)
    }
    0x7ffe838e24bc //보안상 계속 바뀐다고 함. 여하튼 주소를 바로 보여줌.
    
    그냥 50을 바로 표현하려면?
    #include <stdio.h>
    
    int main(void){
    
        int n =50;
        int *p = &n;
        printf("%i\n", *p);
    }
    理解の概念:n=50はどんなアドレスがあって、pもどんなアドレスがあります.しかし、nのアドレスはpのアドレスと同じで、nのみを表し、pもメモリに格納され、互いに矢印で接続されている.
    共通の16進数アドレスを共有し、必要であればポインタがペアリングの方法を持ってきますが、詳しく理解するのは難しいです.例題であるポストの話がどういう意味なのか、逆に理解しづらい.
  • 文字列:文字列は実際にどのようにメモリに格納されますか?
    ポインタは最初の字しか知らない.(端末、中間文字を知らない);文字列はありません.
    (typedef char*string):文字のアドレスを指し、最後に0を保存して終了を示す.これを書くと文字列がありません.(???!)
  • #include <stdio.h>
    
    int main(void){
    
        char *s = "EMMA";
        printf("%s\n", s);
    }
    // include<cs 50> 쓴 것과 유사
    
        //printf("%p\n", s); 하면 string의 주소를 확인할 수 있다.
        0x42adba(첫번째 열의 주소. 굳이 인덱싱 안 해도 이 주소가 맞음)
        // 그 외 주소는 인덱싱하면 번호가 하나씩 이동하는 것을 알 수 있음.
    #include <stdio.h>
    
    int main(void){
    
        char *s = "EMMA";
        printf("%c\n", *s);
    
    }
    앞에 한 글자만(E)
    // 여기에 s+1, 2... 하면 인덱싱이 됨.
  • 文字列比較
  • ビン1(文字が同じかどうか)
    #include <cs50.h>
    #include <stdio.h>
    
    int main(void){
        int i = get_int("i: ");
        int j = get_int("j: ");
    
        if (i == j){
    
            printf("Same\n");
        }else{
            printf("Different\n");
        }
    }
    
    ビン2(文字が同じかどうか)
    #include <cs50.h>
    #include <stdio.h>
    
    int main(void){
        string s = get_string("s: ");
        string t = get_string("t: ");
        if (s == t){
    
            printf("Same\n");
        }else{
            printf("Different\n");
        }
    }
    厳密には、2つのアドレスを比較すべきですが、現在は文字列を比較しているだけです.
    でも住所を比較すると
    #include <stdio.h>
    #include <cs50.h>
    
    int main(void){
        char *s = get_string("s: ");
        char *t = get_string("t: ");
        if (s == t){
    
            printf("Same\n");
        }else{
            printf("Different\n");
        }
    }
    $ ./compare
    s: 2
    t: 2
    Different
    コピー
  • 文字列
  • #include <stdio.h>
    #include <cs50.h>
    #include <ctype.h>
    
    int main(void){
        string s = get_string("s: ");
        
        string t = s; // 복사
    
        t[0] = toupper(t[0]);
    
        printf("%s\n", s);
        printf("%s\n", t);
    }
    s: emma
    Emma
    Emma
    システムはs,tを逐字コピーし,結果値も同じになる.(tはsに割り当てられた同じ運動の体である)
    もしsとtが独立していたら?(deepcopyを思い浮かべます)
    #include <stdio.h>
    #include <cs50.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void){
        char *s = get_string("s: ");
        
        char *t = malloc(strlen(s)+1);
    
        for (int i = 0, n = strlen(s) ; i < n + 1; i++){
            t[i] = s[i];
        }
        t[0] = toupper(t[0]);
        printf("%s\n", s);
        printf("%s\n", t);
    }
    
    
  • メモリの割り当てと解放:mallocをメモリから完全に独立させるには、次の手順に従います.
    まず上のコードからメモリ漏れが発生します->free
  • #include <stdio.h>
    #include <cs50.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void){
        char *s = get_string("s: ");
        
        char *t = malloc(strlen(s)+1);
    
        strcpy(t, s);
    
        t[0] = toupper(t[0]);
        printf("%s\n", s);
        printf("%s\n", t);
    
        free(t); //메모리 누수를 해제시켜줌 : 오버플로우를 막아주는 역할한다고 함.
    }
  • メモリ交換、スタック、hip:アプリケーション
    メモリを交換するためには、水を2杯交換するようなカップサイズのスペースが必要です.(by swap)
  • void swap(int a, int b)
    {
    	int tmp = a;
        a = b;
        b = tmp;
    }
    可能に見えますが、実際にはできません(元のバージョンではなく、コピーが交換されており、実際の例としては使用できません).
    実際に使用するには、メモリの動作原理を理解する必要があります.
    スタック>ヒップ>グローバル>マシンコード
    しょくぎょう
    主(x,y)>交換(a,b,tmp;ここで値交換)>しかし交換から取り出して、それから捨てます...△先に入れて先に出すという概念ではなく、順番に出すという概念です.
    最終的にx,yは変わらない.
    解決策は次のとおりです.x,yアドレス自体を交換すればいい
    主(x,y)>a,bはx,yのアドレス値に関連付けられる(*)
    void swap(int *a, int *b)
    {
    	int tmp = *a;
        *a = *b;
        *b = tmp;
    }
  • ファイルへの書き込み:ユーザーから値を入力して出力するプログラミング
  • フォーマットで、ユーザーが入力したアドレスを格納して転送します.
    #include <stdio.h>
    
    int main(void){
        char s[5];
        printf("s : ");
        scanf("%s", s);
        printf("s: %s\n", s);
    }
    
    文字列は、設定された容量に基づいて保存されます(そのうち5つしかありません).容量を任意に増やすために、他のコードを使用すると、NULL処理を認識して行うことができない場合があります.△これは完全に理解された概念ではない.
    (ユーザからファイルを取得して作成するプロセス);Pythonでファイルを処理するのと同じです
    ファイルコントロール:
    #include <cs50.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(void){
    
        FILE *file = fopen("phonebook.csv", "a");
    
        char *name = get_string("Name: ");
        char *number = get_string("Number: ");
    
        fprintf(file, "%s, %s\n", name, number);
        fclose(file);
    }
    // .csv 내에 사용자가 입력한 내용이 적힘
  • ファイルの読み込み
    画像ファイルの検索例.../jpeg~(ファイル名)
  • #include <stdio.h>
    #include <string.h>
    int main(int argc, char *argv[]){
    
        if (argc != 2){
    
            return 1;
        }
        FILE *file = fopen(argv[1], "r");
        if (file == NULL){
            return 1;
        }
    
        unsigned char bytes[3];
        fread(bytes, 3, 1, file);
    
        if (bytes[0] == 0xff && bytes[1]== 0xd8 && bytes[2] == 0xff){
            printf("Maybe\n");
    
        }else{
            printf("No\n");
        }
    }
    
    このとき、写真ファイルもバイナリで検索されます.