CS50 Lecture2 Array

36328 단어 arraytech
하버드 대학 컴퓨터 과학 과목 CS50 lecture2 자용 노트

Compile


원본 코드에서 기계 코드로 컴파일하는 데는 몇 가지 절차가 필요하다
https://cs50.jp/x/2021/week2/
  • processing
  • compiling
  • assembling
  • linking
  • processing


    우선 아래 소스 코드를 수신하고 위에서부터 왼쪽에서 오른쪽으로 예처리(예처리)합니다.

    예처리는 기본적으로 해시 기호로 시작하는 줄을 찾는 것이다.
    이 처리는 검색과 교체 등을 진행한다.
    해시 기호가 발견되면 CS50h라는 코드를 모두의 코드에 복제하다.

    compiling


    컴파일링은 이곳의 원본 코드를 다른 종류의 코드로 변환하는 것을 의미한다
    컴파일러가 구성 요소 코드로 컴파일되다
    다음은 조립부품입니다.

    CPU는 명령을 이해합니다.
    그 명령은 어셈블리라고 불리는 언어 표현 경향이 있다

    assembling


    구성 요소는 상기 코드를 0, 1로 변환하는 것을 가리킨다

    linkng


    마지막 링크 왕 중, 인클로드CS50.h인클로드studio.h와 자기가 쓴 main関数 중 0, 1을 하나로 정리했다.

    디버깅


    step over로 디버깅

    call stack


    프로그램이 실행되었지만 아직 돌아오지 않은 함수를 모두 가리키다

    열 번째 줄에는 단점이 있지만, 정의상main 함수의 내부입니다

    step into로 디버깅 해보세요.
    함수get_nagative_int로 건너뛰고 첫 번째 관심 코드로 건너뛰기
    점프get_nagative_int 후 콜스택도 진입

    RAM


    프로그램이 실행되는 동안 메모리인 RAM에 저장됩니다.

    프로그램을 저장하거나 설치하거나 저장할 때 일반적으로 하드디스크, 하드디스크, 고체 디스크 등 물리 매체에 저장한다.보존할 때 전기를 쓰지 않는 것이 특징이다.
    RAM은 다르기 때문에 잃어버리기 쉽다.
    프로그램 저장 또는 표시를 두 번 클릭하면 RAM에 임시로 저장됩니다.
    컴퓨터의 배터리가 꺼지고 저장되지 않은 부분이 사라진 것은 램(메모리)이 쉽게 잃어버리기 때문이다.
    전력을 계속 공급하기 위해서는 전력이 필요하다.
    만약 정수를 정수로 나누면 상이 부동소수로 변할 수 있다면 오류가 발생할 수 있으므로 숫자를 나누거나 부동소수로 나누면 k를 얻을 수 있다
    int score1 = 72;
    int score2 = 73;
    int score3 = 33;
    
    printf("Average* %f\n",(score1 + score2 + score3) / 3.0 );
    
    

    Array


    score1,score2,score3은 각각 아래 메모리에 저장된다


    #include <stdio.h>
    
    int main(void)
    {
        char c = '#';
        
        printf("%i\n", (int) c);
    }
    
    char가 아닌 int로 35하면 (ASCII의 해시 코드)
    C 언어에서 문자만 있으면 int로 변환할 수 있는 컴퓨터에 있어 간단하고 알기 쉬운 상황에서 캐릭터를 명확하게 분배할 필요가 없다

    #include <stdio.h>
    
    int main(void)
    {
        char c = '#';
        
        printf("%i\n",  c);
    }
    
    이것도35#이 1byte에 저장됨(char는 1byte이므로 1칸만 필요함)

    #include <stdio.h>
    
    int main(void)
    {
        char c1 = 'H';
        char c2 = 'I';
        char c3 = '!';
        
        
        printf("%c%c%c \n",  c1,c2,c3);
    }
    
    HI!
    기억에 이렇게 저장돼 있어요.

    #include <stdio.h>
    
    int main(void)
    {
        char c1 = 'H';
        char c2 = 'I';
        char c3 = '!';
        
        
        printf("%i%i%i \n",  c1,c2,c3);
    }
    
    727333
    ※ C 언어에는 string형이 없고, cs50은 string형을 정의할 수 있습니다
    #include <stdio.h>
    #include <cs50.h>
    
    int main(void)
    {
        string s = "HI!";
        
        printf("%s\n", s);
    }
    
    상자 3개를 준비하는 것을 문자열s라고 한다
    cs50.h는 어떻게 문자열을 실현합니까?
    →char의 배열을 고려할 수 있다
    기술적으로 HI!"s"라고 불리는 배열s = [H,I,!]
    따라서 s[1] = I처럼 각 문자에 액세스할 수 있습니다.

    분수의 예에서 수조 자체를 확보할 뿐만 아니라 두 변수로 수조에 얼마나 많은 정수가 있는지 관리한다(모르겠다)
    printfm로 문자열을 출력할 때 논리적으로 문자열의 배열만 전달되지만, 배열의 길이를 확정합니다.
    printf가 배열이 있다면 길이를 알 수 있을수록 똑똑해진다.
    printf는 지정한 단어만 인쇄하기 때문입니다.
    만약 문자열이 단지 문자의 나열일 뿐이라면, 컴퓨터는 메모리에서 문자열의 끝을 어떻게 알 수 있습니까?
    알파벳 길이는 HI-33!이렇게 세 글자인 경우 4byte를 사용한다.
    4byte\0를 사용하여 초기화합니다.
    일명 null 문자

    HI!컴퓨터는 어디서 끝나는지, 다음 문자는 어디서 시작하는지 알아야 하기 때문이다.
    이 문자열은 정지 신호를 필요로 합니다.

    0번째는 뉴엘.

    #include <stdio.h>
    #include <cs50.h>
    
    int main(void)
    {
        string s = "HI!";
        
        printf("%i %i %i %i\n", s[0], s[1], s[2], s[3]);
    }
    //0
    
    #include <stdio.h>
    #include <cs50.h>
    
    int main(void)
    {
        string s = "HI!";
        
        printf("%i %i %i %i %i\n", s[0], s[1], s[2], s[3], s[4]);
    }
    //72 73 33 0 37
    

    37%🤔
    40번째(s[40])는 24입니다.🤔
    400번째(s[400])는 0입니다.🤔
    C 언어도 자신의 기억을 만질 수 있으니 주의해야 한다!
    ※ 메모리 전면에 저장된 물건에 접근할 수 있습니다.
    string s = "HI!";
    string t = "BYE!";
    

    위에서 말한 바와 같이 메모리에 저장되어 있기 때문에, 조금 앞의 번호에 접근하면 거기에 저장된 물건을 볼 수 있다
    문자열의 마지막이 \0이므로 마지막 문자열이\0일 때까지 계속 출력하면 마지막 문자열로 출력할 수 있습니다.
    #include <stdio.h>
    #include <cs50.h>
    
    int main(void)
    {
        string s = get_string("Input: ");
        printf("Output: ");
        for(int i = 0; s[i] != '\0'; i++)
        {
            printf("%c", s[i]);
        }
        
        printf("\n");
    }
    
    한 군데만 수정하면...
    #include <stdio.h>
    #include <cs50.h>
    #include <string.h>
    
    int main(void)
    {
        string s = get_string("Input: ");
        printf("Output: ");
    //ここが毎度文字の長さを計算してる
        for(int i = 0; i < strlen(s); i++)
        {
            printf("%c", s[i]);
        }
        
        printf("\n");
    }
    
    //Input: hello
    //Output: hello
    
    #include <stdio.h>
    #include <cs50.h>
    #include <string.h>
    
    int main(void)
    {
        string s = get_string("Input: ");
        printf("Output: ");
    //一度だけ文字の長さを算出して変数に入れる
        for(int i = 0; n = strlen(s); i < n; i++)
        {
            printf("%c", s[i]);
        }
        
        printf("\n");
    }
    
    //Input: hello
    //Output: hello
    
    스토리지는 이렇습니다.
    근데 원래 문자열은 배열이에요.
    즉, 위의 그림은 배열된 배열이다
    아래와 같이 한 글자 한 글자 방문할 수 있다

    상기 특징을 이용하여 소문자를 대문자로 바꾸는 함수를 써 보아라
    string word[2];
    word[0] = "HI!";
    word[1] = "BYE!";
    
    ASCII 차트 보기
    A:65
    a:97
    B:66
    b:98
    ...
    대문자와 소문자 사이에는 항상 32의 차이가 있다

    #include <stdio.h>
    #include <cs50.h>
    #include <string.h>
    
    int main(void)
    {
        //現在の文字が小文字であれば大文字に変換する
        string s = get_string("Before: ");
        printf("After: ");
        for(int i = 0; n = strlen(s); i < n; i++)
        {
            //ASCII表は大文字の次に小文字が定義されてる
            if(s[i] >= 'a' && s[i] <='z')
            {
    						//大文字だった場合、はてなの部分で何をすべきか???
                printf("%c", s[i] ???);
            }else
            {
                printf("%c", s[i]);
            }
        }
        
        printf("\n");
    }
    
    ctype.include를 통해 상술한 동일한 의미의 코드는 아래처럼 유창할 수 있다
    #include <stdio.h>
    #include <cs50.h>
    #include <string.h>
    
    int main(void)
    {
        //現在の文字が小文字であれば大文字に変換する
        string s = get_string("Before: ");
        printf("After: ");
        for(int i = 0; n = strlen(s); i < n; i++)
        {
            //ASCII表は大文字の次に小文字が定義されてる
            if(s[i] >= 'a' && s[i] <='z')
            {
    						//小文字だった場合、32を引けば大文字になる 
                printf("%c", s[i] - 32);
            }else
            {
                printf("%c", s[i]);
            }
        }
        
        printf("\n");
    }
    
    다음 실행 명령과 이름을 입력할 때 Hello (이름) 를 출력합니다
    c 언어로 0 개 이상의 매개 변수를 받아들일 때void의 변경int argc, string argv[]
    #include <stdio.h>
    #include <cs50.h>
    #include <string.h>
    //c言語の文字の種類に関する関数がたくさん入ってる
    #include <ctype.h>
    
    int main(void)
    {
        //現在の文字が小文字であれば大文字に変換する
        string s = get_string("Before: ");
        printf("After: ");
        for(int i = 0; n = strlen(s); i < n; i++)
        {
           printf("%c", touppers[i]);
        }
        
        printf("\n");
    }
    
    컴퓨터가 자동으로 해줄 수 있는 일은 사람이 입력한 단어의 총수입니다.
    즉 매개 변수뿐만 아니라 기술적으로도 자신의 프로그램 이름을 포함한 모든 단어를argc에 저장해야 한다는 것이다.
    그리고argv에는 프로그램 이름과 자신의 이름이 저장되어 있습니다

    좋은 웹페이지 즐겨찾기