[Powered by Google Translate] [주 3]
[데이비드 J. Malan - 하버드 대학교 (Harvard University)]
[이 CS50입니다. - CS50.TV]
내가 우리가 지난 번에 그만 둔 곳으로의 방향을 조종하자
구문에 대한보다 조금 더 생각하기 시작 한
그리고 사소한 모든에 대해 좀 덜 생각하는
그 세미콜론의 관점에서 지금까지에 적응하려면 시간이 좀 걸립니다
괄호와 중괄호,
높은 개념 수준으로 일들을 좀 복용 시작
그래서 지금 우리가 앞으로 몇 주 동안 해결 시작 문제
높은 수준의 개념적 문제에 훨씬 더를 포함 거에요
그리고 발에가 거든 구문에 덜 약간 서부 유럽 표준시
손으로 지난 몇 주에서 구문의 일부 더러워.
>> 지난 주에 우리가 배열의 개념을 도입하도록 기억합니다.
그리고 영어로 된 배열은 무엇으로 설명 할 수 있습니까? >> [안 들리게 학생 응답]
뭐라고 요?
의 수집? >> [안 들리게 학생 응답] >> 그래, 좋아.
항목의 모음입니다. 그래서 우리는 스크래치에서 배열을 보았다.
당신은 pset에 대해 당신이 일을 드래그 할 수있는 스크래치의 목록 0 하나를 사용하는 일 경우
종류의 인벤토리에 오렌지와 바나나 같은
그 배열이 무엇처럼 가지입니다.
그리고 더 기술적으로, 실제 컴퓨터의 맥락에서,
배열은 단순히 메모리의 연속 된 덩어리입니다.
즉, 그때 그때 다음 다른 바이트, 다른 바이트, 다른 바이트, 바이트가
당신은 사진에 그 바이트를 그릴 할 경우,
그들은 백업 백업 백업 다시 것입니다. 우리가 연속으로 뜻입니다.
>> 그럼 다음엔 바이트 숫자 1, 2, 3입니다.
그것은, 최대 여기, 여기, 여기 여기 의미하지 않는다.
배열은 0 개 이상의 바이트의 연속 된 덩어리입니다.
그럼 그들이 유용입니까?
우리는 프로그램에 저장 사람들의 퀴즈 등급의 인위적인 예를 들어 이러한 종류의를 가지고 기억
일부 과정에 대한 퀴즈 평균을 계산하려면
우리는 변수 quiz1를 선언하여 해당 프로그램을 작성할 수 있다는 기억합니다.
그럼 우리가 quiz2라는 또 다른 변수가있을 수 있습니다.
하지만,이 클래스에서 퀴즈 quiz4 3가 있다면.
아니면 매주 퀴즈가 있다고한다면, 그것은, quiz7 quiz6 quiz5 것입니다.
그래서이 변수의 모든 주요 내부 선언했을
또는 다른 프로그램에서
그 접근 방식과 문제는, 그냥 복사 붙여 넣기 쉽게하지만
그냥 매우 빨리 무거워집니다되어 있습니다.
맙소사 당신은 실제로 30 퀴즈 50 퀴즈 있습니다.
이 고등학교 스타일 매일 팝업 퀴즈처럼, 경우
다음은 변수가 선언되는 터무니 긴 목록을 가지고
이는 매우 빠른 속도로 제어가됩니다.
추한, 그것을 유지하기는 어렵지만, 그 오타를 만들기 위해 훨씬 쉽게
당신이한다면 한 번호는 프로그램에 어딘가에 잘못 입력.
>> 그래서 우리는 대신 배열의 개념을 도입했습니다.
그리고 우리가이 같은 작은 선물을함으로써이 프로그램을 구현하는 기억.
나 오늘날의 소스 3 월요일 디렉토리에 가자
그리고 우리가 마지막으로 본 배열을 엽니 다.
그리고 새로운 C의 마술을 몇 여기에 있었다하더라도,
그 중 상수의 개념,
우리가이 구문을 사용하여 기본적으로 여러 수레를 선언 한 기억 :
부동 한 다음 변수의 이름은 다음 우리는 처음으로 정말 사각 괄호를 사용
우리가 그 사각형 괄호 안에 무슨 짓을 효과적으로 번호를 넣어했습니다.
대신 번호를 타듯이,이 대문자 단어 퀴즈를 넣어.
그리고 퀴즈와 같은 대문자 단어를 넣어에 대한 동기 부여 뭔지
그리고 라인 17의 트릭을 사용하여 이곳에 있다는에게 전화 번호를 알려 하는가?
이 동기는 무엇입니까? 그래.
>> [안 들리게 학생 응답] >> 맞아.
우리가 그 값 2을 변경하려면, 우리는 한 곳에서 변경해야
때문에 고려 - 내가 이런 프로그램이 정확히 무슨 짓을했는지 기억이 안나요,
하지만 당신은 그걸 그냥 탈지 경우 퀴즈, 퀴즈를 참조하십시오.
당신은 퀴즈, 거기에 더 퀴즈를 참조하십시오.
우리가이 일정하지 않은면, 날카로운의 사용 정의
우리는 고급입니다 다음 2, 2, 2, 2를 입력 한 것입니다. 그냥 같은 올바른 것입니다.
하지만 우리가 CS50에서 3 퀴즈을 갖고 내년 같아요.
제가 코드를 가서 업데이트해야 할 그래서, 난 그것을 다시 컴파일해야
제가 멍청한 짓을 경우 2 1 언급을 내려다보고처럼하지만 문제는,
3로 연결 잊어, 전체 프로그램은 잘 깨 트릴 수있을거야.
그래서 우리는 단지 문제가 요구하고 있습니다.
>> 그래서 상수의 개념은 데이터의 일부 부분에서 고려해 중요하다
그것은 문자열이나 문자 또는 부동 또는 뭐든 여부
당신이 더 쉽게 미래에서 변경할 수 있도록 그것을 한 곳을 선언.
그리고, 당신은 지금이 생각하는 경우 때문에 읽기, 솔직히, 또한 조금 쉽게
이 퀴즈, 아니면 우리는 NUMBER_OF_QUIZZES처럼 뭔가 이름을 변경 할 수
더 명시 적 또는 무언가.
이 코드는, 이것의 일들을 좀 더 명확된다
당신은 숫자 2는 의미 무슨 일이 일어날 지 약간 덜 궁금하다.
배열을 근본적으로 아무 상관이없는 상수는 그럼.
배열은 이러한 사각 괄호에 의해 도입되었다.
>> 그러니까 줄 23 우리는 사용자가 요청하는 것을, "퀴즈 점수는 무엇입니까?"
그런 다음 우리는 분명 자신의 성적에 대한 사용자 요청이 루프가 있습니다. 어떻게해야합니까?
이 0에서 2로 반복. 모두 대문자로 퀴즈는 현재 2 때문에 나는 2 말한다.
그래서가 0에서 2로 반복 다음은 인쇄 아웃, # 무언가 무언가를 퀴즈
다음은 사용자로부터 값을 얻을 GetFloat를 사용합니다.
그래서 마지막 수요일 구문의 유일한 다른 새로운 작품입니다납니다.
당신은 그 배열의 특정 위치에 무언가를 저장하려는 경우
다시 대괄호를 사용합니다.
>> 따라서 이분법 약간은 여기있다.
당신은 대괄호를 사용하여 처음으로
당신은 당신이 배열되고 싶어 얼마나 큰 지정 사용합니다.
하지만 여기이 다음 상황에 맞는 우리 다시는이 대괄호를 고용 곳
그 배열에 당신이 어떤 값을보고 싶어 어디서 뜻 이죠?
여기 구별은 문맥에서 유추 할 수 있습니다.
우리는 데이터 형식이 있어요주의, 우리는, 변수의 이름이
그러면 우리는 세미콜론, 내부 번호로 우리의 광장 교정기가 있습니다. 그게 전부 야.
그래서 그런 선언입니다.
부동 grade2, 우리가 부동 grade1 같은 짓을 한 것처럼 있지만입니다;
하지만 다시이 매우 빠른 속도로 너무 많이 복사, 붙여 넣기로 devolves
대신에 우리는 이러한로 단순화
이는 금후 우리가 받침대 0 저장 될 수 있습니다 등급을 수 있다는 것을 의미합니다
우리는 브라켓 1에서 저장 될 수있는 다른 등급을 가지고
하지만 내가 바보짓한다면 있으며, 예를 들어, 내 루프는 멀리 가지 못합니다 -
예를 들어, 난이보다 작거나 같 확인
어떤 리콜 이전 버그의 원인 이었어 -
이는 효과적으로 루프의 일부 세번째 실수 반복에 그 의미
나는 브래킷 2를 사용하십시오. 사실, 무슨 일이됩니까? 뭐라고 요?
[학생]은 교체 할거야. >>는 교체 할 예정입니까?
무엇을 교체 할까요?
이 그대로 GetFloat의 반환 값으로 위치 2 무엇 교체 말하고 있습니다.
그러나 문제는 그 이야기의이 시점에서 배열 얼마나 크합니까?
[안 들리게 학생 응답] >> 배열 크기는 (2)의 아직
우리가 그것을 사용하기 전에 배열 때문에, 모든 변수처럼, 먼저 선언
우리 때문에 내가 놓을 게는 2 등급을 가지고이 상수 여기에 지정된.
>> 그러나 기억, 컴퓨터 과학자들은 0부터 카운트 시작합니다.
그래서 배열의 첫 번째 위치는 브래킷 0입니다.
다음 위치는 1입니다. 이 것은쪽으로 너무 멀리 아무리 약간 있습니다.
다시 말해, 사실이 배열이 있다면 -
이 날이 우리를 위해 여기에 협력 얼마나 잘 보자 -
제가 배열이있는 경우 간단하게 다음과 같이 도출 한
내가이 요소에 대한 공간을 할당 한 I는 메모리에서이처럼 그려 수
커다란 흰 캔버스가입니다.
그건 그냥 내 컴퓨터에있는 RAM, RAM의 공연, RAM 2 기가, 뭐가 있건간에
하지만이 두 상자는 이제 개별적으로 부동, 32 비트를 나타냅니다.
제가 1.0처럼 여기 한 번호를 넣어면, 그럼 내가 3.2처럼 여기 다른 번호를 넣어
하지만 난 여기를 넣어 같은 브라켓 2, 마십시오.
그림에서 알 수 있듯이 그리고 아무 것도 없습니다.
제가 운영 체제를 요구하지 않았기 때문에 그것은 무인의 땅과 같은 종류의입니다
저에게이 세 번째 퀴즈를 제공합니다.
그 세번째 퀴즈를 원하는 그랬다면, 나는 사전의 고려가 있었해야합니다
선언하여의 운영 체제를 부탁 것은이 될 퀴즈
대신 3 동일합니다.
>> 다시 말해, 우리는 효과적으로 손에 가지고있는 사진은 여기 것 같습니다.
다시는 무인의 땅입니다. 우리는 여기가 더 나은 값을 쓰고 없습니다.
다시 한 번, 컴퓨터 과학자 때문에, 0을 기준으로
우리가 배열에이 위치에 대해 이야기 할 때, 그는 위치 0 거였어
이것은 위치 하나 있어야되고,이 존재하지 않습니다
우리는이 같은 장소에 운영 체제를 묻는 때문입니다.
다른 언어의 사전 프로그래밍 경험을 가진 분들 자
이 항상 벡터라는 배열이나 물건의 경우 않다는 것을 알고 있습니다.
오히려, 당신은 단지, 추가 및 추가하고 배열 ​​물건을 추가 유지할 수
하는, 솔직히, 우리는 스크래치에 그런 능력이 있다면 아직 우리는 여기를 끼친 것 같아서
C와 때문에 훨씬 더 명시 적으로 프로그래밍되어 있습니다.
그것은 지금 당신과 컴퓨터 만이고, 컴퓨터는 할거야
넌 뭘 할 해주세요.
만 여기에 라인 22에 의해 당신에게 두 수레를 제공 할 말한다면은,
2 공간 : 그 말은 당신이 운영 체제에서 돌려 주겠다 전부 야.
>> 따라서 점점 더 당신의 프로그램은 경우에 따라 배열에 관한 버그가 될 것이다.
이것은 우리 모두가 실수하기도 하죠 상기 짐승의 성격 뿐이에요이며,
그리고 어떤 점 에선 당신은 배열의 경계 너머 가능성 인덱스 것이다.
그래서 당신이 브래킷 뭔가에 들어갔다 말하는 멋진 방법
뭔가를 숫자의 너무 큰했습니다. 당신은 배열의 범위를 넘어 갔다.
그러나 거꾸로 지금이 있습니다.
이 프로그램의 나머지 부분은 정말 배열과 근본적으로 아무 상관이 없습니다.
단지 컴퓨팅 평균에 대한 간단한 산술에 대한 거예요.
그럼 우리가 여기 루프 우리는 0으로 초기화되는 변수라는 합계를 여기서의 수 있습니다.
그럼 우리가 다시 0에서 2로 반복하고 우리는 그 합류 변수에 추가
i 번째 등급, 그래서 브래킷 0 다음 브래킷 1.
그리고 당신은 평균을 계산하는 초등학교에서하는 것처럼
우리가 단순히 그 금액을, 퀴즈의 총 수로 나누면
그리고 좋은 측정을 위해 우리는 원형 불리는 함수를 호출하십시오.
>> 지금, 옆으로, 선 34에이 삽입구 INT와 거래는 무엇인가?
이 섹션에서 이미 온 것, 정말, 공식적으로 여기에 대해 얘기하지 않은
하지만 parens 아마도 일이 정수는 무엇인가? >> [안 들리게 학생 응답]
네,이 주조 또는 typecasting을 의미합니다
이는 한 데이터 형식을 복용하고 다른로 변환을 의미합니다.
가끔 좀 이상한 것 때문에 모든 데이터 유형과이 작업을 수행 할 수 없습니다.
그러나이 경우 경우 원형의 반환 값은 부동이다
때문에,이 같은 모든 후, 나는 수레을 데리고 수로 나누어
나는 수레를 돌려받을거야.
그러나 초등학교 사람들이 평균 93.4 있다는 사실을 알게되어 정말 싫어
그들이 경험 해보지 못한 실현할 수 있기 때문에 그 95 반올림 지점에 인접 해 있습니다.
>> 그래서 우리는 대신 가장 가까운 int로 모두를 반올림하기 위해 정수를 사용하려면
그 후에는 포인트로 94 될 것입니다이 경우된다.
그럼 그냥 약간의 수학적 트릭입니다.
이 영향을 미칠 것이기 때문에 우리는, 주조의 개념에 돌아 오면
당신이 이미 발견하지 않은 경우, 문제에 대해 2를 설정합니다.
배열 한 다음 그래서, 당신은 생각할 수 - 나 하루 종일 미소를 만드는거야.
당신이 그림을 그릴 경우,이 모양
하지만 키의 크기도 귀하가 선택되어 있습니다
당신은 운영 체제에서 요청할 때.
다음 질문 배열에? 그래.
[안 들리게 학생 질문]
아, 좋은 질문입니다.
질문은 배열의 null이 0으로 무슨 일입니까? 그것은이 컨텍스트에 존재하지 않습니다.
그건 단지 우리가 순간에에 와서 할 겁니다 문자열의 맥락에서 존재합니다.
그러나 배열이 경우에서와 같이, 당신이 얻을 모든 당신이 운영 체제를시키는대로입니다.
>> 그리고 옆,이 불분명하지 않는다면, 등
당신이 운영 체제를 요청할 말을 계속, 운영 체제를 바랍니다.
운영 체제, 당신은 아마 알다시피, 맥 OS, 윈도우, 리눅스입니다.
당신은 GetFloat 같은 함수를 호출 할 때
또는 당신은 성적과 같은 변수를 선언 아르
하루의 끝에서 당신은 효과적으로 다른 사람이 당신에게 기억을 제공하기 위해 요청하는
우리는 프로그래머 상승하는 때문에
실제로 메모리에 물리적으로 액세스하는 방법을 모르겠어요.
하지만 누군가는 않습니다 : 운영 체제를.
따라서 외에 아름다운 아이콘 및 메뉴 및 폴더를 보내 제시하고 같은
당신은 Mac이나 PC 상관없이 바탕 화면에 표시되는
운영 체제는 또한 낮은 수준 평범한 일을
기가바이트을 관리하는 고도의 기술 콘텐츠
또는 가지고 메모리 2GB의, 당신이 가지고있는 CPU를 관리 등등.
당신은 코드를 작성하는 자 할 때
당신은 정말 의미에서 사용중인 운영 체제에 했는데요.
난을 최소화해야 겠어. 괜찮아요.
>> 배열에 대한 또 다른 질문 있나?
아냐? 좋아요.
따라서 전환 자연스럽게 배열에서 조금 잘 알고 주제에 실제로있다.
그리고 우리가 너무이 마지막 시간에 이렇게 간단히 다시 보았다.
이 수요일에서 문자열의 예이었다.
이 문자열 예는 아주 간단한 프로그램이었습니다
그리고 사실은 오늘날의 목적을 위해 선 몇하여 단순화했습니다.
이 라인 (19)에 이라곤, 사용자의 문자열을 얻을 수 있습니다 S라는 변수에 저장합니다.
그런 다음 줄 22 이후에 무리가 라인 당이 스트링 1 문자를 출력있어.
하지만 어떻게 이런 짓을하는 거지?
우리는 0 동등한를 설정 변수 i를 선언하고
이 지금은 오래된 습관되고 있습니다.
우리는 수요일까지이 보지 못했지만, 당신은 그 이름에서 추론 종류의 수
나 strlen은 S가 주어 졌을 때 무엇을 반환? 문자열의 길이입니다.
내가 한 문자열, 견적 - 인용을 끝 맺다 DAVID를 통과한다면
그것은 희망 내겐 다윗의 숫자 5를 반환하는거야.
그래서 이렇게 인생에서 목적 하드 귀하가 코딩 여부, 문자열을하는 것입니다입니다
또는이 경우에는, 인수와 같은 변수로 연결
그리고 그 문자열의 길이가 무엇인지 알아보지.
>> 그래서 여기 이제 우리는 이전의 퀴즈 예제에서 몇 가지 표기법을 빌려야겠군요.
이것은 수레와는 아무 상관이없는 퀴즈와는 아무 상관이없는 일,
하지만 작은 하얀 거짓말 우리가 주 1부터 말했어 한 것이 밝혀
C.에 문자열이 정말 존재하지 않는 것입니다
하루의 끝에서 문자열은 단지 배열입니다.
이 리콜은 단지 8 비트입니다 바이트의 배열 때문에 바이트, 바이트, 바이트, 바이트이고,
그래서 메모리의 덩어리, 메모리의 덩어리, 메모리의 덩어리, 메모리 덩어리.
그리고 문자열을 구현하는 수단
여기 첫 문자를 넣어하는 것입니다
여기를, 여기, 여기, 다시 컴퓨터의 메모리에 백업 할 백업하는 것이 었습니다.
당신은 HELLO 같은 단어를 철자하기를 원한다면 자, 1 자 H를 입력 할 수
그리고 E, 그리고 L 후 L, 그리고 O - 총 5 자 - 어디 선가 컴퓨터의 RAM 인치
하지만 여기 키 세부, 그들은 뒤에 백업 할 백업 다시 할거야 있다는 것입니다
서로 바로 옆에.
내가 말할 때 님의 [내가] 영어로 어떻게하면이 나를 좋아요?
님의 [내가]이 경우에는 무엇을 나타 냅니까? 그래.
>> [학생] 문자열의 i 번째 문자가 있습니다. 정확히 >>. 문자열의 i 번째 문자가 있습니다.
자, 여기 루프 내에 따라 0부터 시작 것입니다
모든 0부터 계산 시작하기 때문에 좋네요.
S 자 [0] HELLO 같은 단어에서 문자 H를 나타내는 것입니다,
님의 [1] 등등 HELLO 같은 단어 E 같은 편지를 나타내는 것, 그리고 수 있습니다.
그리고 우리가이 루프의 각 반복에 일을 할 것 같습니다
일시적으로 단지 숯불입니다, C라는 변수에 i 번째 문자를 저장하고,
그리고 우리는 C를 인쇄하는
수 있도록이 프로그램이 무엇을 하루의 끝에 다음과 같습니다.
나는 소스가있는 디렉토리로 가서, 내가 string1을 내가 가서 string1를 실행하는 경우
그리고 나서, 전 HELLO 입력 같은 단어를 입력 맞지 않는 모든 한 번에 1 번 문자를 인쇄 할 수 있습니다.
>> 따라서 상세 수있는 기회가 있어요.
그럴 필요보다, 아마이 방법보다 분명 할지라도, 더 많은 일을하고있는 것 같아요.
아마 모두 어떤 여기에 코드의 라인을 던져 수 있습니까? 그래.
선 24. 라인 24에서 나는 변수 C를 선언거야.
나는 거기에 s의 i 번째 문자를 저장하고 있는데 그럼 내가 여기에 C를 사용하고 있습니다.
그래서 C를 사용하고, 그래서 난 그냥 24 거리에 줄을 던질 줄도 모르는 것 같은 느낌.
[안 들리게 학생 코멘트] >> 맞아.
그래서 때이 프로그램의 디자인에 대해 얘기에 관한
마찬가지로 읽을 수있는 코드의 약간의 단순화, 알
하지만 S 단지 변수가 아니라는 것을 파악, 그 데이터 형식은 배열입니다
S 수 있도록 [I]는 즉시 해당 문자열의 i 번째 문자로 돌아 예정이다.
당신이 그것을 인쇄 할 경우 그리고, 괜찮아.
당신은, 당신은 문자열을 인쇄하지 않았기 때문에 %의 C를 사용해야합니다
당신은 문자열에서 문자를 인쇄하고,이 역시 i 번째 문자를 인쇄하는 효과가 있습니다.
그리고 printf를 사용으로 지난 주에 온 진짜 유일한 차이를 기억
주 반면 우리는 슈퍼 간단한 일을 할 과거 있다는 것입니다
% s의 자리 표시 자와 같은 한 다음 여기에 문자열의 이름,
지금 우리는 후드 아래에 좀 더 깊이에서 다이빙하고있어, 말
문자열을 인쇄하지 않습니다, 거기에 하나의 문자를 인쇄 할 수 있습니다.
>> 1 명의 있기 때문에 그래서 우리는 여기에 다른 뭔가를 조금 할 수 -없는 버그
이 프로그램은 오른쪽 있기 때문에,하지만 멍청한 짓을하고 있어요
나는 수요일에 간단히 언급하는.
그러나이 프로그램의 디자인을 더욱 개선 할 수 있는지, 다시 생각? 그래.
[안 들리게 학생 응답] >> 오, 좋아.
그래서 우리는이라는 초 변수 N 지난 번에 소개하는 기억,
어떤 때문에 내 목표 초 전 자신을 어기는 것 같습니다
, 불필요한 같은 변수를 멀리 던져 단지
하지만 수요일에 우리가 실제로 이런 짓을하는 기억.
나는 다음에 n = 나 strlen, 실제로 여기에 쉼표가 루프에 대한 변경
그리고 여기에 내가이 <N, 그럼 내 단위 짓을 했어요.
기본 게인 내가이 내 초기화를 변경하여 달성한다는 무엇입니까
이 지금까지 내 상태? >> [안 들리게 학생 응답] >> 맞아.
나는 기억 때문에 다시 다시 다시 나 strlen을 리콜하고 안하는 방법 루프 작품.
그들은 더 복잡하게 생긴 얻을 시작하더라도
첫 번째 세미 콜른의 앞 일이 한 번 발생 초기화,입니다 기억.
조건은하지만, 중간에
이 귀하가 루프 통과 때마다 확인됩니다.
>> 그게 바보 같은 종류의 또 한번, 또 한번 컴퓨터에게 같은 질문을 할거야 -
HELLO의 길이는 무엇입니까? HELLO의 길이는 무엇입니까? HELLO의 길이는 무엇입니까? -
오늘은 우리가 보게 될 때문 수요일, 이건 확실히, 시간이 걸릴 것입니다
문자열의 길이를 알아내는 있기 때문에 그 시간의 좋은 사용 안
실제로 노력의 조금 걸립니다.
가 일부 언어에서와 같이 그것은 즉각적인 없습니다.
따라서 N이을 변경하여, 내가 돈을 지불 가격은 무엇입니까?
우리는 여기서 트레이드 오프를 볼 수 있습니다.
나는 다시 다시 같은 빌어 먹을 질문을하지 않음으로써 시간을 절약 할 수 있습니다
하지만 나에게 무슨 일을 비용거야?
>> [학생] 당신은 메모리의 일정 금액을 잃게됩니다. 정확히 >>. 그것은 나에게 메모리를 들겠 죠.
따라서이 경우는 뭘 비용?
또 다른 32 비트 여기에 단어 INT에 의해 암시로 n은 단지 정수이기 때문이다.
하지만 그건 괜찮아요?
당신이 그것에 대해 생각하면 솔직히, 아마도 괜찮아
더 이상 문자열, 난 낭비거야 더 많은 시간이
나 strlen 다시 다시 다시 호출하려고하기 때문에
루프의 모든 반복하십시오.
그리고 요즘 제 맥 RAM 2 기가, 요즘 가끔 RAM의 4 기가 있습니다.
나는 실제로 일을 속도를 그 바이트의 4 감당할 수 있다고 생각합니다.
그러나 이것은 프로그래밍과 컴퓨터 과학 정말 트레이드 오프와 테마가 될 것입니다
정말 무료로 아무 것도 못한다고.
당신이 뭔가를 개선하려는 경우, 당신은 어떻게 든 다른 손에 비용을 지불해야합니다.
이 경우 우주 대 시간.
>> 그래서 모두 같은 암호화 된 것을 향해 이어지는되었습니다
어떤, 당신은 아마도 지금 쯤 생각 해낸 것처럼, 실제로 말한다?
[안 들리게 학생 응답] >> 그래, 그래서이있어, Ovaltine를 마시해야합니다
실제로 ROT13라는 알고리즘 ROT 1-3를 사용하여
이는 단지 문자의 13 곳을 회전을 의미합니다
이는을하고 거기에 13 추가 점, 점, 점을 갈 수 있다는
거리에 13 문자까지 모든 방법, 등등 B와 C 및 D에 대해 동일한 일을합니다.
그리고 우리는 13 곳의 변화를 사용하여 여기에 변환하면,
우리는, 작은 Ralphie가 가진 것의 소중함을 다시 전화 드리겠다 귀하의 Ovaltine 마시고 반드시되었다.
그러나 지금 문제는, 적어도 표준 판에, 2를 설정
당신은이 자신을 enciphering 않는 종류의 할 필요가
우리는 어떻게 든 같은 입력에 가져 가서 또는 해독을 암호화해야합니다.
>> 따라서 이러한 기본 정렬하는 그런 기회 단서가?
- 여기서이 세 번째 예를 살펴 보자.
우선,이 ASCII라고. ASCII로 무엇을 참조합니까?
정보 교환을위한 미국 표준 코드,
이는 무엇을 말하는 정말 먼 길입니까? ASCII 무엇입니까?
[안 들리게 학생 응답] >> 그게 뭐야? >> [학생] 문자지도. >> 문자지도.
세계 표준화가 있기 때문에 단지 문자에 번호를 매핑
어떤 번호는 우리 모두가 컴퓨터를 사용할 수 있도록 어떤 문자를 표현할 수
우리의 프로그램은 모두가 화면에 물건을 인쇄 할 때 단지 호환됩니다.
그래서 65를 나타내는 데 무슨 일이 기억, 97을 소문자 대표 발생합니다.
그리고 여기이 간단한 프로그램은 ASCII 그 사실을 이용하고있다 -
세계는 자본이 65입니다 알고 - 그리고는 그냥 매핑을 인쇄있어.
>> 우리가이 코드에 다이빙하기 전에 그래서, 내가 대신 터미널 창을 열 수 있습니다.
내가 가서 ASCII 확인한 다음 그냥 그냥 출력을 망치고이 일을 실행하게 보자.
나에게 다양한 코드를 모두 알려주는 아주 큰 차트 : 그리고 그냥이 일을
다양한 문자를합니다.
슈퍼 간단한 프로그램 그래서, 난 하드 코드 출력의 그 52 라인이 없었 :
26 대문자, 26 소문자.
대신, 나는 루프을 몇 개 프로그램이 했어요.
내가 여기서 무슨 짓을 확인할 수 있습니다.
나는 26 개의 문자를 인쇄 싶어서 65 + 26에 제가 65에서 최대 반복
영어 알파벳에, 난 + + 각 반복에서, 그리고 지금 다시를 확인합니다.
우리 친구 typecasting의 재발입니다
당신은 다른 한 데이터 형식으로 변환된다
나는 무엇을이 특정 프로그램에 어떻게해야할까요? 않기 때문에
등등 65, 66, 67, 그리고 - 그게이기 때문에 제가 계산을 성장하는 방법 숫자 계산하려면 -
하지만 난 그 번호를 인쇄하지 않습니다.
나는 수에 따라 편지를 인쇄하고 싶습니다.
수, B : 나는 인쇄 할 수 있지만 똑같은 변수로이 작업을 수행 할 수 있습니다.
그래서, 문자에 대한 자리 표시 자로 %의 C를 인쇄
숫자 나 숫자에 대한 자리 표시 자로 % d 개.
그리고 지난 2 자리 표시를 위해 무엇을 연결해야합니까?
나는 그의 캐릭터로 이에 상응하는 금액의 첫 번째 플러그, 그리고 나는 내가 아웃 자체를 인쇄 할 수 있습니다.
>> 그러니 일이 너무 만 작동 확인합니다.
나는 int로 부동의 캐스트 것처럼
실제 숫자의 정수로 이동하기 위해서는하면,
여기 당신이 INT에서 좀 이상 숯불로 이동 할 수 있습니다 -
꽤 현실 세계에 매핑되지 않습니다 -하지만 컴퓨터에
문자는 후드 아래에 단지 숫자입니다
그래서 우리는 말하는, 컴퓨터에 여기에 아무리 명시 적 인 것
printf, 내가 65으로하지 인쇄를 그 숫자 동등하게 인쇄합니다.
제가 기술적으로도이 필요하지 않습니다 아웃 그리고집니다.
제가 좀 전에 무슨 짓을하는지 명시 적으로 캐스팅합니다
나는에서 이동 한 원하는 것을 데이터 유형 지정하여.
하지만 이미이 자리 표시 자 %의 C이 표시
여기이 다른 % C 자리 표시 자.
이 INT하지 않더라도, 컴퓨터, 그 숯불을 실현
그냥 후드 아래에 정수입니다.
>> 난 사실이 다시 컴파일하고 ASCII 프로그램을 다시 실행면은,
컴퓨터가이 이메일은이 것을 알고 있기 때문에 아직도 단지 작동 확인합니다.
이제 ints 떠의 세계에서 명시 적으로 캐스팅을 수행하는 것이 더 중요합니다
이 때문에 실제로 계산 결정을하는 :
소수점 모든 버린다.
다음은 문자가 단지 숫자이기 때문에 버리지은 정말로 아무것도가 없습니다
그리고 문자열은 문자의 배열입니다.
따라서 일부 암호화 또는 해독을 구현하는 시간을 때,
우리가 실제로이 말도 안되는 짓을 번역 할 수있는 방법입니다
당신의 Ovaltine을 마실해야합니다?
우리가 지금 알고있는 경우 - 우리 가정으로 가져 가게 - 그게 키
우리가 이러한 문자를 모두 회전하고있는 숫자는 숫자 13인가?
그래서 우리는, 문자 B에서 문장의 시작 O하기위한 모든 방법을 간
나는 B를하면, 당신의 Ovaltine를 마시해야합니다
그럼 내가 C, D, E, F, G, H, I, J, K, L, M, N, O를,가
문자 B의 암호화 O되는 이유입니다
난 그냥 거기에 13을 추가 때문입니다.
>> 나는 해독이하고 싶다면 I은 본질적으로 O를 다음에서 13을 빼야한다.
알파벳에는 26 글자 있기 때문에 또는, 솔직히,,이 놀라 울 정도 대칭입니다
우리는 또한 단 13를 추가 할 수 있으며, 우리는 문자 B. 다시 연락 할게
하지만 당신은 카이사르에서이 같은 것을 구현 어떻게해야할까요
나 정말 일반적으로 문자열을 조작?
문자 B는 몇 번 경우?
문자 B는 무엇입니까? 그래서 바로 66이야?
문자 65와 문자 B는 66입니다면은,
66 그래서, 내가 할 일은 그것 밖에 13 추가하며,이 나에게 79을 제공합니다.
그리고 우리는 우리의 작은 컨닝 시트, O.로 79 실제로지도로 이동하는 경우
>> 그러나 코너 케이스 부분은 바로이 있습니다.
무엇, 문자 Z 할 말?
우리가 알파벳의 끝까지를 얻을 66 + 25을하면, 우리는 91에있다.
91 + 13 나에게 104를 부여하며 어떻게 됐을까?
104 대문자와 동일하지 않습니다.
의는 여기에 약간의 컨닝 시트로 돌아가 보자.
나는 어플라이언스 통지에이 프로그램을 다시 실행하면 그 104, 난 공항 터미날 창으로 돌아 가면,
104 분명히 소문자 H입니다.
그래서 우리는 우리가 Z에 시작할 때 있는지 확인하기 위해 여기에 몇 가지 주요 트릭을해야합니다
우리는 우리가 점점 커지고 숫자로 앞서 단조 유지하지 않으려는 여기에 13을 추가합니다.
우리가 정말 뭘하고 싶어?
당신은 주변의 포장을 할까.
>> 그럼 지금 섹션이나 문제 세트 사양 자체 아마도 본으로 판명
또한 퍼센트 기호입니다 C에서 다른 운영자가 있다는 것을 깨달았다,
하지만 자리 표시자를 지정하려면 여기를 %을 사용하는 반면,
특히 문제 세트 2이 같은도있어, 알고 :
INT X = Y % Z.
난 그냥이 매우 일반적인 형태로들을 소개합니다.
퍼센트는 프로그래밍 언어로 무슨 뜻 이죠? >> [학생] 모듈로.
나머지 말을하는 멋진 방법입니다 모듈로.
거기에 정의 약간 차이가있다하더라도
이 방법은 Z에서 Y를 나눌하지만, 그 부서의 결과를 반환하지 않습니다;
대신 나머지를 반환합니다.
>> y는 실제로 3과 z는, 실제로 2로 나누어 3 2면, (1)의 나머지 부분과 함께 1
그래서 뭐 x는이 시나리오에 실제로 평등합니까? 1.
여기에는 간단한 낮은 수준의 생각입니다.
당신의 마음이 감싸 얻을 약간의 시간이 걸립니다
당신은 심지어 remainders 신경했던 이후로는 아마 오래 살았 으니까
실제로, 목적 무언가를를 사용
하지만이 경우에 당신은 3 같은 큰 숫자부터 시작 할 수있는 단순한 사실
그리고 2와 같은 비교적 적은 수에 효율적으로 주위에 래핑
하나 같이 작은 값으로 나머지를 사용하여 귀중한 트릭 될 것입니다
우리는 황제 같은이 다른 물건 Vigenere에 모두 사용할 수있는
에 문제가 2로 설정하지만,이 학기 내내 반복 트릭 될 것입니다.
단지 일반적으로 나머지를 복용이 단순하고, 간단한 아이디어
우리 주변의 포장을 허락 할 수 있습니다.
그리고 우리가 메모리 자체에 이상 게임을 시작할 때 우리가 배열 이상 게임을 시작으로,
이 강력한 마술의 더 될 것입니다.
>> 따라서 ASCII에 대한 다음 질문이나 배열로 문자열의 표현?
그리고 우리는 한 노치 더를 차지합니다. 그래.
[안 들리게 학생 질문] >> 좋은 질문입니다.
변수가 앞의 별표가있는 경우는 무엇을 의미합니까?
제가 연기하게 모든 세부 사항에서 해당 답변을,
하지만이 포인터로 알려진 주제를 의미합니다.
포인터는 메모리와 필요, 우리는 실제로 오늘은
그 토론 향한 첫 발걸음을 내 디뎌,
하지만 지금은 저 별이 존재하지 않는 있다고 가정합시다
우리는, 문자열 문자열을 호출하는 대신 숯불 *를 계속 사용합니다
당신은 아마 전에 본 적 나는 티저로 한 순간에 화면에 올려 놓을 게요된다.
그래서 우리는 아마 좋아됩니다 많은 것보다 더 상세하게 그에게 돌아올 거예요.
결국, 오늘. 그래.
>> [안 들리게 학생 질문]
어떤 맥락에서 당신은 문자의 기호를 제공해야합니까? >> [학생] 그래.
따라서 기본적으로, 당신은 +를 넣어하지 않는 경우, 단지 긍정적 인 번호가 간주됩니다.
단지 숫자 1을 작성하면, 그것은 긍정적 인 일입니다.
당신은 실제로 값의 부정을 지정하려면,
당신은 말 그대로 키보드에서 -1을 할 수 있습니다.
그러나 이것은 아마도 질문하지 않습니다. >> [안 들리게 학생 응답]
>> 좋은 질문입니다. 좋아요.
이 버그 어떤 종류의와 함께, 내가 수집해야 할 일이 그래서 당신은 당신의 마주쳐
당신은 문자로 정수를 변환했기 때문에
하지만 어떻게 든 부정적는 사귀고있어
그래서 그냥이 나온 캐릭터는 어떻게 든 munged.
그럼 지금부터, 우리는 주제의이 종류에 돌아올 때까지 나를 조금 지나치게 단순화 보자.
지금은 일을 이런 식으로 생각을 - 그리고이 oversimplification입니다.
그러나 정수의 세계에서, 당신은 처리에서 얼마나 많은 비트가?
당신은 32 비트가 있습니다.
그리고 지금까지, 우리는 당신 때문에 표현할 수 정수의 총 수에 대해 얘기 한
당신이 32 비트를 가지고 있기 때문에 약 4,000,000,000 총에,
그 친구는 약 4,000,000,000 야하기 때문에, 32-2입니다.
하지만 우리는 당신이 정말로 숫자의 범위를하지 않아도 일주일 또는 2 전 본
최대의 0에서 4 억.
범위는 대신에 긍정적 인 대략적으로 부정적 2,000,000,000 2,000,000,000에서갑니다.
그러나 이것은 다음 부정적인 2,000,000,000의 개념을 어떻게 표시합니까, 문제는 남죠
혼자 부정적 일 있니?
지금, 우리는 지나치게 단순화하고 우리가 가장 왼쪽 비트를 사용하는 것처럼 말을 할 수
그것이 하나 있다면 그 32 비트의, 그리고는 음수입니다
그것이 0이라면하며 양수입니다.
음수의 단순화 된 표현의 문제
그게 당신이 의도적으로 영리 존재하고 번호를 문자로 변환하려고 한 경우
또는 그 반대로는 부정적 문자와 같은 것은 전혀 없습니다.
만 8 비트를 사용하여 ASCII, 그 비트 문제의 모든 8의 세계에서
그리고 왼쪽 비트는 부정적와는 아무 상관이 없습니다.
그리고 단지, 왼쪽 비트를 말할 때, 명확하게 할 수
기억 우리는 첫 주에서 우리의 비트 관련 예제를 한 때
우리가이 같은, 1001101 같은 일을 그린 기억.
제가 가장 왼쪽 비트를 말할 때, 나는 문자 그대로 당신이 왼쪽 위에있는 모든 방법을 작성하는 일을 뜻합니다.
따라서 문자의 세계에 부정적 대한 개념이 없습니다
그래서 왼쪽 비트는 실제로 ASCII, 부정적와 아무것도 할 일이 있습니다.
>> 그럼 같은데 -와 아웃 문맥을 정확히 대답 어렵습니다 -
하지만 어떻게 든 당신의 코드는 음수 값을 나타내는 등 그 왼쪽 비트를 혼란 된
정말 문제가되는 문자의 일부이었습니다.
컴퓨터가 실제로 약간 애호가 일을하기 때문에 다시 한번이 지나치게 단순화있어
단지 0 대 마이너스 기호에 대한 1에 해당 왼쪽 비트를 변경하는 것이 아니라.
당신은 Google에 호기심 경우 그들은 대신에,,, 일반적으로 2의 보수라는 것을 사용
이는 접근 방식의 조금 더 정교한 수 있습니다
하지만 아이디어는 궁극적으로 동일합니다.
>> 그래서 짧은에, 당신은 문자로 번호를 마사지 한 사실과 관련이 있었어
반대의 경우도 마찬가지이지만 코드는 사실을 인식 아니 었
그 비트 1은 숫자 세계에서 의미가 있다고.
그 문자 세계에서 가장 경우 없습니다.
지금 논의의 여지가있는 어떤 경우에 고친 것 그러나 그것은 들리 네요. 다른 질문입니다.
좋아요.
그럼 지금까지, 우리가 작성한 프로그램의 모든 사용자로부터 아마도 입력을 데리고
GetInt, GetString, 같은 기능의 형태로
또는 다양한 책이나 온라인 참조에 앞서 책을 읽은 적이 있는데 경우,
당신이 스스로 솔직히 우리가 CS50 도서관에서 사용 scanf와 같은 함수를 사용했을 수 있습니다.
그러나 주 또는 2, 우리는 실제로 CS50 라이브러리 구현하는 방법을 보여 줄게
우리는 모두 그 훈련 바퀴를 벗을 수 있도록.
>> 사용자로부터 입력을받을 수있는 다른 방법이 밝혀.
사실, 우리 자신은 명령 줄 인수를 사용하고
몇주 동안.
우리가 꽝을 실행했거나 우리가 실행 한 때마다 확인
우리가 그 소리를 입력하지 않은 입력, 우리는 입력합니다 입력하지 않았습니다.
우리는 일반적으로 우리의 터미널 창 프롬프트에서 단어 그 소리 후에 무엇을 쓰 셨나요?
[학생] 파일 이름입니다. >> 파일 이름, 맞죠?
Hello.c 또는 mario.c이든 뭐든간에 해당 파일 이름입니다.
그리고 정말 무슨 짓을했는지 그 의미에서 당신은 꽝의 동작에 영향을했습니다입니다
물론 꽝을 쓴 사람들은 그 작은 오래된 아무 생각을 가지고하지 않기 때문에
mario.c 년 후라는 프로그램을 작성하려고했습니다.
그래서 당신은, 어떻게 든 해당 프로그램의 동작에 영향을했다
그 프로그램 꽝는 당신의 입력을 받아 들일 수있는 방식으로 작성했습니다
프롬프트에 단어를 추가하여 사용자 조회는 입력하기 전에.
>> 그럼 얼마 동안 우리는 거의 모든 프로그램의를 선언 한 것이 밝혀
이런 식으로 시작합니다 - 정수 메인 (무효) - 그리고 우리는 계속해서 잔업을 해왔 어
우리의 코드를 작성 시작했다.
그리고 우리는, 파일의 상단에 포함 된 일부 날카로운있을 수
하지만 거의 모든 프로그램의 지금까지 이걸 시작했습니다
당신이 책에서 섹션에서 볼 수도하더라도, 온라인 참조
이 사실 무효 할 필요가 없습니다.
이되도록 또 다른 합법적 인 형태는 argc 정수 한 후 문자열 변수는 argv는 []입니다.
그럼 이제이게 무슨 뜻입니까?
그것은 인간의 컨벤션입니다 argc를 밝혀 -이 푸 전화 수
하지만 그저 독자들에게 훨씬 덜 명확한 것 -
argc는 무엇을 나타내는 주요이라는 함수에 인수입니까?
argc는 익숙한 사람들을 위해 무엇을 의미합니까?
>> [안 들리게 학생 응답] >> 네, 인수 또는 인수 개수의 번호입니다.
아주 간단한거야.
얼마나 많은 인수는이 프로그램에 전달 되었습니까?
그게 무슨 뜻 이죠?
그 소리 - 내가 이런 짓을 실행 한 명령 줄에 경우 mario.c .. -
제가 입력을 누르 argc은 2, 다소 혼동을 일으킬의 가치에 걸릴 것입니다.
그럼, argc는 인수 개수입니다 판명
하지만 역사적 이유로, 프로그램 자체의 이름은 그 수에 포함되어 있습니다.
그래서 argc는 내가 그 소리가 mario.c 쓴 2입니다.
변수는 argv는 무엇을 포함합니까?
우선, 변수는 argv는 문자열처럼 보이지만별로
때문에 지난 수요일부터 모든 더 오늘,
이러한 대괄호 무엇을 나타내는? 그 배열입니다.
이 배열에 전화 번호가없고, 그 직관적으로 이해한다
꽝 년 전에 쓴 사람들은 확실히 아무 생각도하지 않기 때문에
우리처럼 얼마나 많은 단어를 사람들이 입력을 때리기 전에 프롬프트에 입력하십시오.
>> 그래서 여기이 경우에 그들은 인수의 배열을 뽑아내는 등의 방법으로 함수가 메인 선언
0 또는 더 많은 인수.
그들은 거기에 얼마나 많은 사전에 알고하지 않습니다
그래서 이러한 대괄호 대한 번호가 안에 의도적 없습니다.
그러나 대괄호가 있다는 사실은 컴퓨터를 얘기하는
배열을 기대하고 있습니다.
변수는 argv는 인자 벡터에 대한 속기 표기법입니다.
벡터는 배열을 말하는 멋진 방법입니다
와 배열은 목록 또는 컬렉션을 말하는 멋진 방법입니다.
이 메시지는 같은 주요 작성하는 경우 것을 의미한다 그래서
대신 우리는 지난 2 주 동안 해왔 방법처럼
프로그램은 이제 명령 줄 인수를 수락 할 수있는 힘을 가지고
더 이상 당신은 입력을 누르 후 마리오를 작성해야 할 필요가없고 않도록
그런 다음, 당신이 피라미드가 원하는 얼마나 많은 블록 하이에 대한 번호를 입력
다시 Enter 키를 누르십시오.
우리는 그 문제에 대해 더 이상 나 GetInt 또는 GetFloat GetString를 사용할 필요가 없습니다.
우리는 사용자가 프롬프트에 자체를 해당 단어를 입력 기대할 수
꽝의 저자는 정말 짜증나는 프로그램이 될 결정처럼
먼저 형식이 그 소리 코드를 컴파일 할 경우, Enter 키를 누르
그리고 우리가 사용자에게 말했다, 당신은 컴파일 할 파일의 이름을 입력하십시오
그런 다음에 우리가 mario.c를 입력하고 Enter 키를 누르십시오.
그러나 우리는 사용자 지난 2 주에게했던 짓 맞아요.
우리는 GetString을 사용하고 프로그램이 입력을을 묻는 메시지를 표시하도록 실행 될 때까지 기다린다.
경우 할 필요가 없습니다 더 이상.
>> 그래서 여기이 예제에서, 우리는 지금, 문자열 변수는 argv가
이도 oversimplification입니다
훈련 바퀴는 곧 내려 올 것이다.
이 메인이 대안 선언을 작성하는 더 적절한 방법입니다
무슨 우리가 문자열을 호출 유지하는 것은 실제로 스타를 가지고 밝혀 때문하면,
의 실제 정의에 별표 (*), 그러나 이것은 단지 복잡한 보이는데,
처음에 혼란 때문에, 우리는 종류의 동의어를 만들어 단순화
CS50 라이브러리에 해당이 더 많은 사용자 친화적 인 단어 문자열에 매핑 숯불 *.
>> 그럼 실제로이 다음 해 봅시다. 내가 가서 여기 gedit를 열어 보자.
내가 가서 1의 변수는 argv를 열어 보자.
이 프로그램은 분명히 인수를 출력하지만, 영어의 측면에서 보면,
이 코드를보고이 더 구체적으로 무슨 일을합니까?
명령 a.out foo는 바에서 I 입력, 나의 흑백 창에 무엇을 인쇄 치면?
A.out foo는 바는 입력합니다.
어서. 그래. >> [안 들리게 학생 응답]
좋아. 따라서 a.out, 새로운 라인, foo는, 새로운 라인, 바, 새 줄.
왜인가요? 우리는 확실히 한 순간에 확인할 수 있습니다.
이 코드의 보송 보송 한 줄의 종류입니다.
그건 그냥 단지 화면에 일 귀엽 할 새 줄을 출력합니다.
이것은 argc까지에 0에서 반복있어 루프입니다
이 각 반복에 증가하고 있습니다 + +.
그래서 지금이 % s에서 암시와 같은 문자열을 인쇄 말하고있다.
변수는 argv [I] 거의 앞의 예에서 같은 생각입니다.
우리는 변수을 호출하는 데 사용, 지금은, 임의로, 변수는 argv라고합니다.
이것은 명령 줄에서 입력 된 i 번째 인수를 인쇄 의미
이 모든 일이 끝난 다음에 다음, 그냥 좋은 측정을위한 또 다른 새 줄을 인쇄 할 수 있습니다.
>> 그럼이 일을 보자. 제가 터미널 창을 열어 보자.
저 1 변수는 argv를 컴파일, 그리고 지금 내가 입력 1의 변수는 argv를 실행하게 보자. 음. 좋아요.
가 foo는 표시 줄을 실행할 수 있습니다. 흥미 롭군. Baz도.
그리고이를 입력 왜 궁금해 본 적 한 경우
이 단지에는 바보 같은 컴퓨터 과학 박람회입니다.
세계는 종종 단어에 대한 단지 구두 자리 표시 자이 필요합니다.
당신은 몇 가지 일반적인 문자열에 대해 이야기하고 싶다면
컴퓨터 과학자는, 그들은 임의의 단어를 필요로 할 때 foo는 말을하는 경향이
그들은 두 번째 임의의 단어가 필요한 경우 그럼 그 사람들은, 바, 말
그때, 그들은은 세번째 단어가 필요한 경우가 사분의 일 단어를해야하는 경우 다음 그들은 qux 말 Baz도 말
그리고 qux 이후의 일들을위한 거대한 종교 논쟁 온라인이있어
그래서 당신은 다른 임의의 단어가 있어야 무엇을 할 수 있는지 알아내는 것을 검색해 할 수 있습니다.
하지만이는, 전혀 의미가없는 것
하지만 foo는 바, 그 의미 한 일이지,이 Google 경우,
이는 여기 어원의 일부입니다.
>> 그러니까이 후 실적은 라인 당이 문자열 1을 인쇄하고 있습니다.
그래서 대신하는 경우,하지만, 조금 애호가들을 가져 오기를 원
제가 한 줄에 각 문자열을 인쇄 할 않았 겠지;
나는 한 줄에 각 문자열에서 각 문자를 인쇄 할 싶었어요.
내가 대신 어떻게 그럴 수있어?
안 각 단어를 인쇄하려면이 프로그램에 대해 변경하려면 어떻게해야합니까
하지만, 편지로 편지하여 각 단어 문자를 인쇄 할
편지로 편지로 그 다음 단어 편지?
우리가 어떻게 지금까지 이러한 아이디어를 결합해야합니까? 그래.
[학생] % 다. >> 좋아. 그래서 우리는 어딘가에 %의 C가 필요합니다.
난 전체 문자열을 인쇄 할하지 않기 때문에, 내가 문자를 인쇄 할 좋은 싶습니다. 또 뭐가 있지?
>> [안 들리게 학생 응답] >> 흥미 롭군.
그래서 우리는 지금 여기에 두 번째 차원의 정렬이 필요합니다
때문에 배열로 변수는 argv 생각하지만 문자열의 배열입니다.
하지만,의, 좋아, 15 분 전에 문자열이 뭐죠? 이 문자의 배열입니다.
그럼 정말 변수는 argv는 문자의 배열의 배열이다
문자 배열의 배열입니다.
그래서 우리가 더 대괄호 표기법을 사용할 수 있더군요. 그럼 이렇게 까.
라인 (19)에이 루프의 상단에서, 나는, 최대 전에서 argc에 반복거야
하지만 나는이 일을 할거야 :
에 - 지금 i를 사용할 수 없습니다.
나는 단어를 통해 반복 싶어서 다른 변수를 필요
하지만 또한 단어의 문자 이상
그래서 바닥의 수직 축과 수평 축, 개념적으로 정렬되어 있습니다.
따라서 정수 j를 0를 얻을 수, 그때 J가보다 작음있는 한 J을하고 싶어요 - 그리고 난 조금이 치울 게요.
어떻게 문자열의 문자를 통해 반복합니까? 우리는 잠시 전에 이런 짓을.
변수는 argv의 나 strlen [I]. 좋아.
또, 전 n 또는 무엇이든을 작성하지하여 여기에 약간의 비효율을 만들고있어
하지만 우리가 그에게 돌아올거야.
>> 이제 J + +. 지금은 여기에 추가로 들여 쓰기를해야합니다.
지금은 각 반복에 인쇄하려면 어떻게할까요?
[안 들리게 학생 응답] >> 자 [I] 나에게 단어를 제공합니다.
[I] [J], 정렬 매트릭스처럼.
수학 Y 배경으로하시는 분들,
우리는 배열의 매트릭스 또는이 배열에 색인을 생성 일종의도 깊이있어
이 2 차원 구조.
그래서 지금 여기서 무슨 일이 일어날 지 보자. 내 큰 터미널 창을 열어 보자.
저 1의 변수는 argv를 만들어 다시 실행 봅시다.
그리고 나도이 일을 잊었 기 때문에 좋은 교훈이다 여기 실수를했습니다.
암시 적 유형 '서명과 C 라이브러리 함수'나 strlen '을 선언 -
, 난 그 수단의 어떤 나머지 잘 모르겠지만, 전에 본 적있다
암시 적으로 선언.
우리가이 오류를 볼 때마다이 일반적으로 무엇을 의미합니까?
>> [안 들리게 학생 응답] >> 나는 맨 위로 라이브러리를 잊어 버렸습니다. 그러나 잠깐만 요.
나는 CS50 라이브러리를 잊어 버렸습니다 때문에 보통 내가 잘못했지만, 그가 있습니다.
나는 표준 I / O를 잊어 버렸습니다 때문에 보통 내가 망쳐 버린
그리고 솔직히, 난이 필요하지 않습니다. 오늘 GetString을 사용하지 않는 것입니다.
그래서 내가이 누락 무엇입니까?
지금 우리는 종종라는 string.h를 사용하는 데 필요한 또 하나의 라이브러리가 있어요
이는 아직 표준 I / O.에없는 더 많은 기능을 가지고있는 또 하나의 라이브러리입니다
>> 그럼 내 큰 터미널 창으로 돌아 가자.
좋아요. 지금, 젠장, 내가 잘못 생각한 것 같다. 나는 CS50 라이브러리를 사용했습니다.
그래서 우리는 두 가지 방법 중 하나에이 문제를 해결할 수 있습니다.
우리는 지금 훈련 바퀴를 벗고이 일을 할 수
또는 지금 그 단순화를 유지의하자 종류,이 뒤쪽에 붙여 넣습니다
이 문제를 해결, 지금 터미널 창으로 돌아갑니다.
따라서 CS50 라이브러리에, 명확하게하는 것은, 단지 기능을하지 않습니다
그것은 또한 오류가 방금 무슨 일이 일어난 이유 키워드 문자열입니다.
>> 그래서 여기에 우리가 이동합니다. 난 도서관에서 문제 모두를 해결했습니다. 입력합니다. 좋아.
1 argv가, foo는 바는 입력합니다. 좋아요.
이제 우리는 라인 당 1 인쇄 각 단어의 각 문자가
아주 흥미로운 프로그램을하지 않는
하지만 예고 지금 우리는 단어 이상 반복하지의 기능이
뿐만 아니라 대단히 많이 듣던 단어의 개별 문자, 이상
이 같은 문자열에서 출격 문자와 같은 응용 프로그램의 간단한조차합니다.
가 가서 여기 5 분 쉬었다합시다.
그리고 우리가 돌​​아 왔을 때, 우리는 효율성에 대해 얘기 시작합니다
되는 우리는 더 나은 이러한 일을 수행 할 수 있습니다.
>> 괜찮아요. 우리가 다시 있습니다.
bananagrams을 많이 연주 우리의 TFS 중 하나 덕분에,
우리가 실제로 오늘 우리와 함께 문자의 전체 무리가
실제로,이 작은 플라스틱 조각으로 incarnated
이 빈 슬레이트는 여기에 내 컴퓨터의 RAM을 나타냅니다 것을 나 제안 보자 -
노트북, 데스크탑, 무엇이든 - 그리고 그것의 많은 것 같습니다
때문에 우리가 작은 바이트 크기의 조각으로이 RAM을 자르고 시작하면,
우선은 임의로 크기와 그 흐릿가 나타내는 그 말을 -
거기에 우리는 가고, 가자 여기에 조금 축소 -
의 크기가 단일 바이트를 나타내는 말을 보자.
그래서이 문제를 실제로,이 메모리 내부 바이트 또는 문자의 전체 무리에 맞게 수
여기를 상대적 크기에 의해 제안했습니다.
>> 따라서 목표는 문자열에 대한 메모리를 할당하는 것입니다 지금 것 같아요.
어떻게 이런 일이 실제로 작동합니까?
우리가 만들고있어 프로그램에서, 우리는 보통, GetString을 사용하고
하지만 지금은, 분명히, 우리는 변수는 argv에서 사용자 입력을받을 수있는을 통해이 다른 채널이
명령 줄 인수를 통해.
그런데 정말 후드 아래에 무슨 일이야?
우리가 전화하면이 밝혀 - GetString으로 스크롤합시다 - 함수 GetString을
CS50 라이브러리에, 사용자가 문자열을 입력하라는 메시지가있다
일부 단어에서 사용자 유형 -가 HELLO을 불러.
그리고 우리는 지난 2 주 동안 말해 왔던 GetString의 반환 값
HELLO라는 단어처럼, 사실 문자열입니다.
>> 그런데 정말 짓을 GetString입니까?
입력 HELLO에서 사용자 유형으로 GetString는 알아 냈어있다
그래,이 얼마나 많은 자입니까? 이 H-E-L-L-O입니다.
이 경우에는 리눅스 - 어떻게 할당 할 필요는 운영 체제를 요청할 필요 -
적어도 5 바이트 안부 저장할 수 있습니다.
그것이 운영 체제에서 다시 그 5 바이트를 얻을되면 그리고 그 다음 할 일을 진행
백업 백업 백업 HELLO 다시 배치하는 것입니다.
그리고 어떤 정말 GetString에서 돌아 왔하면이 모양 데이터의 덩어리입니다.
만약에 그게 간단하지 않는다는 것이 판명하지만 이건 조금 잘못
단지 컴퓨터의 메모리에 저장 HELLO로
때문에, 나는 C에 쓸거야하는 내 프로그램이 다시 GetString 호출했다고 가정
과에서 사용자가 유형을 다음 단어 BYE, BYE입니다.
글쎄, 난 메모리에 어딘가에 단어 BYE에 맞게해야합니다.
나는 HELLO 옷을 입히다 할 수 없습니다.
예를 들면, 컴퓨터가 그냥이 같은 덮어 쓰기 시작하고 싶지 않아
난 아직 변수에 HELLO라는 단어를 사용 있기 때문에 원래의 단어
다른 곳에서 내 프로그램에서.
>> 따라서 B-Y-E는 다른 메모리에 결국 할 수 있습니다.
하지만 국제 대회는 일반적 당신이 할당 다음 문자열
아마 항상은 아니지만, 다음 사용 가능한 메모리 위치에 오게 예정이다.
그리고 어떤 메모리 운영 체제를 요청하지 않은 경우
제가 GetString이라는 마지막으로 발행 된 이후, 확률은 단어, 안녕
HELLO 메모리에 단어를 한 후 바로 종료 예정이다.
잠재적 인 문제가 발생하지만 어디이 시점에서 당신은 아마 볼 수 있습니다.
때문에 메모리의 다음 덩어리, 단지 무료로 있던 다음 바이트 -
흰색 슬레이트를 청소 - 컴퓨터의 메모리에, HELLO 바로 옆에있었습니다
이건 내가 갑자기 지금 변경 될 수 요구 첫 번째 문자열 느낌
나는 본질적으로 변경 한 때문 HELLOBYE하기
대신 어떻게 든 BYE의 시작과 HELLO의 끝을 demarcing.
>> 그래서, 어떻게 정말 후드 아래에 무슨 일 것이 밝혀
당신은 온라인 참조 또는 섹션 또는 책에서 보일 수도있는
여부를 아직 전혀 고의적 인 경계가 실제로 있다는 것을이다
컴퓨터의 메모리에있는 단어 사이.
그리고 사실은,이 경우보다는 단지 바로 옆에 HELLO에게 안녕을 넣어
대신, 컴퓨터는 특수 문자, 특수 널 문자를 말하자면,두고
어떤은 백 슬래시 0 표시와 함께 표시됩니다.
그럼 요약해서 말하면, 문자는 ASCII로 표현되는 기억.
ASCII, 그냥 숫자와 문자 사이의 매핑입니다
그리고 그 편지의 대부분은 자본에 대한 약 65 시작
당신은 확실히 정수 또는 이진에서 숫자 0을 나타낼 수 밖에 있지만, 변
이 세계 오래 전에 긴 결정 밝혀, "당신은 알아?"
키보드의 모든 문자를 대표하지는 않습니다 "하자 예약 번호 0 -
"더 이상 문자, 번호, 아니 문장이 있습니다. 0 특별 없습니다."
"그것은 특별한 널 (null) 문자 될거야, 우리는 \ 0로 쓸거야."
우리가 0, 0를 작성하면되는 차이는 문자입니다.
3, 2, 1, 0에 대한 ASCII 코드가 있다는 것을 기억
문자 0 숫자 0에서 다른이기 때문이다.
그리고 당신은, 당신은 주 1에서 돌아 보면 우리가 처음 ASCII 대해 얘기 할 때 것을 알 수 있습니다
최대 9-0과 1, 2, 3 모든 방법은 자신의 ASCII 코드를했습니다.
그들은 우연히도 0 - 9하지 않습니다. 그들은 매우 달라요.
그래서 공은 "나는 특별"를 의미하며, \ 0 수단은 문자 그대로, "나는 0 문자가 아니야."
"나는이 특별한 값이 유효하지 않은 문자입니다."
난 두 번 같은 실수를 할 수 없기 때문에 그래서 실제로이 중 하나가 필요합니다.
>> 따라서 단어 BYE 후 우리는 또한이 널 (null) 문자 중 하나를해야 할 것 같습니다.
내가 여기서 내 펜을 잡고 나를 빨리 다른 \ 0을 그리는 해 봅시다
그래서 나는이 문자열을 운영 체제를 묻는 한 후
GetString 또 다른 전화로 다음 GetString을 통해,
이 메모리에 실제로 일이야.
그래서 문자열을 돌아 갔을 때, 정말, 다시 그납니다
내가 다음 문자열을 때, 나는 정말 다시 나타납니다.
따라서이 우선, 나 strlen, 문제는 남죠, 그게 무슨 반환해야합니까?
나는 문자열 S에 나 strlen 전화를 걸어 s이 (가) HELLO 사용자가 입력 한 단어 때,
우리는 분명히 HELLO의 길이가 몇 분 전부터 무슨 얘기를 했죠?
그것은 바로, 5 살? H-E-L-L-O. 그래서 실제로 어떻게 나 strlen 작품입니다.
그것은 정상적인 인간이 될 수있는 문자열의 길이를 기대할지 반환합니다.
그러나 현실에서, 안녕 보관하고 있어요 문자의 배열 크기는 얼마나 되나요?
실제로 6이다.
나 strlen 그래서 당신에게 그 사실을 언급하지 않습니다.
하지만 후드 아래에 컴퓨터가 실제로 5 글자로 된 단어를 저장하는 6 바이트를 사용하고 있습니다
이 단어가 얼마나 오래 상관없이 적용됩니다.
항상 문자열의 끝 부분에 특수 널 종료 문자가있을거야
의 총 길이를 demarc합니다.
>> 당신은 지금, 30 년 전에, 나 strlen (20) 구현 사람입니다 그래서 경우
당신은 나 strlen 자체를 구현 어떻게해야할까요?
당연한 printf 존재 당연한 우리가 걸릴 것처럼 우리가이 있는지 타고
하지만 인사는 문제의 단어 인 경우
그리고 내가 기억하고있는 것은,이 같아 보이는 거입니다
당신이에게 물어했기 때문에 당신은 reimplement 나 strlen해야한다면
나 때문에, 솔직히, 당신은 나 strlen 몰랐는데 -
당신은 스스로를 롤백했습니다 - 당신이 어떻게 나 strlen을 구현 할 수
때이 모양을 좀 줬어요?
이제 우리는 문자열 배열 알고있는, 우리는 개별 문자의 각을 통해 반복 할 수 있습니다
같은 사용 - 가자하면 즉석에서이 작업을 수행하려고있어.
>> 제가 어플라이언스로 가자. - 새로운 파일 strlen.c을 만들 수 있습니다.
내가 지금 가서 stdio.h 우리가 printf에 대한 액세스 권한이 포함 하죠.
저 INT 메인 (무효)을 해봅시다. 오. 난 그냥 그런 다음 지금 스스로이 작업을 수행합니다. ㅠ ㅠ
감사합니다.
이 내가하는 일이 있습니다. 괜찮아요.
I가 화면에 설정 그럼 전에, 난 그 모든 입력.
그리고 지금은 뭘 할 건지는 다음과 같습니다
printf ( "나에게 문자열을한다 :")에게
그건 그냥 보송 보송 한 방법입니다.
지금 나 문자열 S = GetString 해주세요.
난 이미 지금 변경을해야합니다.
나는 CS50 라이브러리를 사용하고 갑자기, 그럼 내가 가서 cs50.h.를 입력하게
- % D, 나 strlen [S] : printf ( "길이는 : 그리고 지금은이 작업을 수행 두자
그리고 난 아직 안 끝났어요. 또 내가이 프로그램에 추가해야하나요?
>> [학생] string.h. >> string.h.
그럼 지금부터, 우리는 나 strlen을 사용하고 있으므로, 씨가있는 곳을 컴파일러가 알고 있는지 확인해
그래서 조금 정신이 확인합니다.
나는 8 호선의 문자열을 가져올 게, 줄 9 I는 % d 개과의 길이를 인쇄거야.
그러니 어서 가서이 일을 열 수 있습니다.
우리는 나 strlen을 한 - 알았어, 컴파일 -
나 strlen가 - 나 확대 구 - 입력, H-E-L-L-O 입력하십시오. 길이는 5가된다.
>> 좋아, 나 strlen 일 것 같습니다하지만, 세계는 것을 알고 있었다.
그럼 이제 우리는 다음과 나 strlen을 구현 보자.
저 멀리이 라이브러리를 보자.
우리는 더 이상 그것을 아주 몰랐는데 때문 string.h에 액세스 할 수 없습니다.
나는 나 strlen 자신을 구현할 수 있기 때문에하지만 괜찮아요
그리고이는, 입력라는 문자열을
지금은이 문자열의 길이를 알아내는 필요합니다.
그럼 어떻게이 작업을 수행 할 수 있습니까?
내가하면 무엇을 - 당신은 무엇을 하시겠습니까 -의이 작업을 수행하는 방법을 보자?
>> [안 들리게 학생 응답] >> 좋아요.
그래서 우리는 여러 가지 방법으로 무리에서이 작업을 수행 할 수 있습니다. 내가이 방법을 시도 보자.
내 자신에게 정수 variable 제가를 줘 보자, 그래서는 0시에 시작한다.
그리고 내가이 말을하게 해줘 : 입력하는 동안 [I] 것과 같지 않음? \ 0.
그럼, 프로그램에 그대로를 작성하는 모든 문자의 경우와 마찬가지로 밝혀
당신은 작은 따옴표가 아닌 큰 따옴표를 사용해야합니다.
나는 편지를 쓰고 있었다면, 내 말은, 문자 B를 그 짓을 했을까, 그렇게 할 것입니다.
이 반면, 아닌 개별 문자 문자열 것입니다.
>> 그래서 그대로 \ 0 원. 이 루프에서 어떻게할까요?
사실, 다른 변수를 필요하므로 int는 길이가 0를 얻을 수 있습니다.
우리가 그런 식으로 시작 왜 확인하지 못했다하더라도,
우리가이 길을 따라 내려 간다 이젠, 내가 9 호선에서 어떻게할까요?
길이 + + 그리고 여기 10 호선, 반품 길이 있습니다.
그럼 나 strlen을 어떻게 구현?
그것은 실제로 다음과 같이 아마도 구현있어.
누가 알 - 아마 그 사람이 루프에 대한 사용 루프 동안, 어쩌면합니까?
우리는 정말 실제 소스 코드 후드 아래 봐야 할
일부 파일에있을 string.c했다.
>> 하지만 여기가 내가 뭘하는지 생각해 보죠.
나는 0은 동일한 설정, 난라는 변수를 선언거야.
나는 그 때 0이 같은 설정, 다른 변수라는 길이를 선언거야.
입력의 i 번째 문자는 특별한 널 문자 \ 0 같지 않음 동안 그 때 나는, 말
길이를 증가.
하지만 곧 i 번째 문자가 특수 문자이기 때문에, 어떻게 루프는 어떻게됩니까?
이 단락. 그것은 어떤 우리가 다음 즉시 길이를 반환 의미하지 않습니다.
>> 제가 엉망으로하지 않은 경우 그럼, 그럼 가서 내 터미널 창으로 돌아 가자.
내가 다시 컴파일 보자. 그리고 망칠 않았습니다.
라이브러리 함수 나 strlen 중 호환되지 않는 재 선언입니다.
그래서 여기에 내 자신에게 좋은 일 더 영리려고했습니다.
컴파일러는 실제로 나 strlen이라는 함수가 있다는 것을 알고
우리는 라이브러리를 포함하지 않은 경우에도 마찬가지입니다. 괜찮아요. 뭐든간에.
우리는 다음 협력거야. 의이 길이의 이름을 바꾸 보자.
내가 여기서 길이로의 사용을 변경할 수 있으며,이 꽝이 행복 할 것입니다.
- 옆 이러한 기능 중 일부는 매우 이놈의 일반적인 때문으로
나 strlen, prinf - 실제로 특별한 상태 종류가 있습니다.
그리고 꽝은 그들에 대한 특별한 뭔가를 조금 알고 있습니다.
항상 대부분의 기능이있는 경우이 아니 잖아, 우리가 소리 질렀어요 했어 이유 죠 그럼.
>> 다시 시도 보자. 다행히, 그 시간을 일했습니다.
이제 내 자신의 나 strlen 프로그램을 실행할 수 있습니다.
나에게 문자열을한다 : H-E-L-L-O 입력하십시오. 그리고 내가 잘못했다.
이유는 무엇입니까? >> [안 들리게 학생 응답] >> 맞아.
그래서 자신은 여기에 아주 좋은 모양의 무한 루프가
I 각 반복에 길이를 증가 중이더라도 때문에,
당신이 멍청하게 뭘하지 무엇입니까? 난 내가을 증가 아니에요. 좋아요. 쉽게 수정. 그래?
좋아요. 제가 괄호를 필요로하는 곳에 번호 이제 우리는 다른 일반적인 실수에 걸렸나 것입니다.
그리고 솔직히,이 코드는, 못 생겼군 시작
그래서 우리는 순간에이 청소에 찔러 할게요.
하지만 지금은 길이와 나는 모두를 증가거야.
사실, 난 이미 개선을위한 기회를 볼 수 있지만, 우리는 그에게 다시 돌아 올꺼예요.
>> 이제 그냥 우리가 진전 적어도있어하고 있는지 확인할 수 있습니다.
이렇게하면 몇 일이 있었던, 나는 사전에이 얘기를 무시.
이 같은 시나리오의 불행이 언제, 어떻게이 문제를 해결합니까
어플라이언스를하거나 컴퓨터를 다시 시작하거나 창을 닫는 짧은?
실제로 간단합니다.
컨트롤 C는이 작은 당근 기호 C를 보내, 그리고 대부분의 프로그램을 종료 그 것이다.
당신은 물건 무한히 여러 번 인쇄 할거야 정말 나쁜 무한 루프가있는 경우
때때로 당신은 컨트롤 C에게 실제로 듣고 할 천 번을 누르해야 할 수도 있습니다.
나는 매우 간단 아무것도, 인쇄 않아 있기 때문에 지금 알고 있습니다.
그리고 기술적으로, 한 번 충분하지만 참을성이하고 나는 보통 그런 여러 번 누르십시오.
>> 나 strlen 그럼. 나에게 문자열을한다 :여보세요. 만약이 시간이 될까?
좋아요. 또 다른 일반적인 실수. 다시 컴파일해야합니다.
그, 그건 의도적이었다. 괜찮아요.
나 strlen 그래서, H-E-L-L-O 입력하십시오. 좋아요.
그래서 우리는 지금 나 strlen 5가 있습니다.
그래서 우리는 문자 그대로 바퀴를 다시 작성했습니다.
이제이 나를 감동하지 않기 때문에가이 일을 청소 해
내 코드의 디자인.
우리는 명확하게이 일을 정리하는이 프로그램에 무엇을 제거 할 수 있습니까?
[안 들리게 학생 응답] >> 그래. 그대로, 우리는 동일한 i와 길이를 치료하고 있습니다.
그럼 왜 우리가 스마트하고 길이 동안 말하지?
오히려, 그냥,로 시작하는 것이 길이 전화를 0으로 초기화 해
우리가 무엇을 알아낼 때 기본적으로 문자열은 길이가 없기 때문입니다.
>> 이제 우리는이 작업을 수행, 지금이 매우 우아한 프로그램입니다.
하나의 변수. 나는 그것을 청소 그걸 강화.
그래서 지금의 내 터미널 창으로 돌아 가자. 가 가서이를 실행할 수 있습니다.
나 strlen하십시오. 괜찮아 보이는군요. 입력, 다시 나 strlen을 실행합니다.
나에게 문자열을한다 : 안녕, 입력합니다. 그리고 5로 작동하는 것 같군.
내가 쓴하지 않았다면 지금, HELLO 한 문자열에서, 예를 들어, 명확하게 할 수
그리고 또 다른에서 BYE, 우리는 확실히 여러 단어를 할 수 있습니다.
나는 실제로 입력 싶었던 그 표현은 HELLO은 아니 였지만, 예를 들어, 경우
세계, 우리가하지 않았 으면하는 것이이 상황에 있다는 통지를 마우스 오른쪽여보세요?
그거 2 문자열 있다는 제안합니다.
당신은 확실히 우리가 실제로 더 이상 문구를 입력하면, 스페이스 바 문자를 가질 수
HELLO 월드처럼, 우리는 정말 메모리에 무엇을하면 되겠습니까
거기에 같은 뭔가를 조금 보입니다.
>> 괜찮아요. 질문 한 다음 문자열 여기에 표현 은요?
아냐? 괜찮아요.
그래서 다시 나 strlen를 호출 한 후 다시 의도적으로 그런 식으로하는 이전했다
당신은 일이 많이 일을 할 것 때문에 아마도 가장 좋은 생각이 아닙니다
또 한번, 또 한번 다시.
사실, 어떤 일의 종류 틀림없이, 문자열의 길이를 계산에 필요한입니까?
당신은 처음부터 시작하고 봐, 봐, 봐이
자네가 마침내 그 특수 문자가 나타날 때까지 어느 시점에, 아, 지금은 길이를 알아.
따라서 이전에 우리가 나 strlen을 다시하고 다시하고 다시 호출되는했을 때,
다시 그 문자열이 그런 식으로 보이기 때문 바보 같은 사람 이었어요 제가 제안 이유입니다.
그것은 몇 가지 루프를 통해 당신은 반복 할 때마다 변하지 않아
그래서 당신은 불필요한 작업을 다하고 있습니다.
동시에 당신은 옆으로, 꽝처럼 그 컴파일러가이 일 알고 있어야
오랜 세월에 걸쳐 개발되었으며,
그리고 컴파일러 작가, 프로그래머, 예쁘고, 똑똑하고 있습니다.
그리고는 꽝과 다른 컴파일러가 실제로 알아낼 수 있다는 밝혀 즉,
알았어, 그래, 당신은 당신의 상태 나 strlen를 작성
이는 기술적으로 우리가 다시 다시 다시 전화를 해 있다는 것을 의미합니다.
그러나 스마트 컴파일러는 실제로 좋지 않은 사용자의 의사 결정의 이러한 종류의 최적화 할 수
물건을 입히기 코드의 아웃.
>> 그래서 가끔 컴파일러가 똑똑 우리보다이 생겼어
그리고 가지 우리 자신의 실수를 숨 깁니다.
그러나 확실히이 문제 세트와 같은 할 때
이러한 근본적으로 잘못된 디자인 결정에 대해 생각해야합니까
잠재적으로 우리가, 더 이상 일을하고있을 거라고 간단한 이유
우리가 실제로해야 할보다. 그러나 얼마나 더 사용할 수 있습니까?
HELLO WORLD의 경우,이 문제의 크기를 일반화하기 시작하자.
문제의 길이 또는 문제의 크기는 무엇입니까
때 단어를 입력 사용자가 HELLO입니까?
그것은 아마도, 분명히 6 5입니다. 플러스 또는 마이너스 1. 뭐든간에.
우리가 단지 5 부를 너무 가까이 있습니다.
>> HELLO의 길이를 알아 내려고했을 때 문제의 크기가 뭐죠?
그것은 마지막 문자에 어쩌면 1, 2, 3, 4, 5, 6 만, 일반화합시다 N로 그.
따라서 N, 단지 변수 n은, 컴퓨터 과학자들은 일반적으로 사용 일입니다
손에 문제의 크기, 문제를 설명하는 것은 HELLO 얼마나 걸리나요?
나 strlen 시간이 얼마나 걸리나요?
각 단계는 문자의 모양을 의미 곳, N 단계의 순서에 걸립니다
문자 봐, 문자보세요.
그리고 우리가 잠시 돌아 토론을 한 뒤, 작업의 수는 일이 소요됩니다.
클래스의 첫날 우리는 모두가 어색, 일어나 있었다
그리고 모두가 서로 떨어져 페어링 시작
위해 실제로 방에 이상적으로 얼마나 많은 사람들이 있었 계산합니다.
그리고 우리는 또한 다른 일을 한 상기 내가 대신 기존의 학교 방식으로 한 경우
단지 등등 1, 2, 3, 4, 5, 6을 시작 및,
그것도 그 문제의 크기는 크기 N의했다. 방에있는 N 사람들이 있었다.
하지만, 권리를 그 속도를 수 있을까? 초등학교 스타일 나는 거 고요에 세는 수 있습니다.
2, 4, 6, 8, 10, 12. 그리고 너무 빠르고, 실제로 그것이 느낀다.
다른 4백명이 방에 들어올 경우이를 다시 그대로 두 번 빠른 속도로하지만
한 번에 모든 그 알고리즘은 다른 400 또는 아마 한 200 단계를 수행합니다.
>> 우리가 정말 똑똑하고 우리가 대신있는 경우 그러나 이와는 대조적으로, 당신의 모든이 스스로를 계산
그 알고리즘이 작동하는 방식 기억.
당신은 일어 섰다. 이렇게 빨리 감기 나합시다.
당신은 당신의 절반 앉았다 후, 당신은 오프 짝 일어 서서,
당신의 절반이 앉아 당신의 절반이 앉아서
그리고 주 0이 루프의 각 반복에, 우리는 손에 문제를 halved
그리고 다음에 n / 8, 다음에 n / 4, N / 2로 갔다.
그리고의 의미는 그 다른 4백명은 방, 별거로 간다면
그것은 우리에게없는 400 이상 발,하지 200 잔씩을 더 한 라운드를 취할 것입니다.
그리고 우리가 돌​​아 잠시 말 이야기가있는 작은 일을했습니다.
이 빨간 줄은 여기에 선형, 그것은 직선, 그리고 그것은 N로 표시 있어요
문제의 크기가 증가하고 있는데,
귀하의 알고리즘이나 프로그램이되는 당신이 해결하는 경우는, N 조치를 취하고 있습니다
우리는 문제의 더 큰 크기 더 많은 시간을 소요 직선으로 할 수 있겠나.
그리고 그냥 좀 더 나은 2 계산 twosies 방식, 4, 6, 8, 여전히 직선.
조금 시간이 덜 걸립니다, 노란색 선은 지점에 대한 레드 라인 포인트 아래집니다.
>> 그러나 더욱 우리는 로그 시간을 불렀이 성배를했습니다
어디에서 다시 그 방에있는 사람의 수를 두 배로 경우에도하면,
우리는, 클래스의 첫 번째 날부터 전화 번호부의 크기를 두 배로
더 큰 문제는 그 1 개 페이지 눈물이 소요, 1 이상 앉아 다운을지지 않습니다
두배로 크지 문제를 해결하기 위해 인치
그리고 대화는 우리가 지금하는 것에 시작하게
어떻게 실제로 효율적으로 문제를 해결합니까
우리는이 같은 문제의 간단한을 고려? 경우
우리는 몇 가지 숫자 뒤에있는 8 문이 있다고 가정합시다
이러한 숫자의 각은 어떤 방식으로 정렬되지 않습니다
그들은이 문 뒤에는 그냥 무작위 정수 야
알고 - 우리는 어떻게 번호를 찾는 것에 대해 이동 않는 질문 -
이 문 뒤에는 7?
당신 인간이 나 한테 전화 번호 7을 찾기 위해 뭘 할 수
다시이 각각 문하고 값을 볼 수있는 경우 당신은 문을 열어 있습니까?
당신의 알고리즘은 아마도겠습니까?
>> [안 들리게 학생 응답] >> 그럼 왼손으로 시작하고 문을 열어 문을 열어 문을 엽니 다.
그리고 최악의 경우에, 얼마나 숫자 7을 찾으 걸릴까요?
또, 그들은이 정렬되지하므로처럼 간단하지 않아있어, 음, 난 7 문을 열거야.
그것은 maximally, 8 단계를 우리가 걸릴 수 있습니다.
최악의 경우, 7, 문 줄의 맨 끝에서 무작위입니다
그래서 우리는 모두 N 문을 시도해야 할 수도 있습니다.
그러니 다시 여기, 우리는 선형 알고리즘을 갖고있는 것 같다.
사실, 우리는 몇 년 만 전에 이런 짓을.
당신의 전임자 중 하나가이 정확하게으로 도전했습니다
우리는 디지털 버전이 아닌 곳에서, 우리는 대신 칠판을했다
그 위에 종이 몇 조각으로.
그리고 내가 할 것이라고 생각하는 것은,이 갔는지 방법에 대해 다시 한번 살펴봐입니다
무대에서 최고의 아마 가장 어색한 기회 중 하나
여기에 샌더스의 데모를 가지고 있습니다.
우리는 숫자의 2 행을했다.
우리는이 행의 맨 위에에 션과 함께 어떻게 보는거야.
하지 않는 한 평화 아무도없는 CS50에서 자원 봉사자,
우리는 카메라에이 유지 션의 축복을했다
그래서 그는 사람들이 수백 년 동안 지금 이걸보고 된 것으로 알고 있습니다.
그러나 숀은 놀라운 일을 했어 - 혹은 그가 짓을 - 실제로 우리에게 특정 번호를 찾고에.
>> 그래서 우리가 오래 전에 대화를 재개 할 정도로 그는이 알고리즘을 해결하는 방법 보자
어떻게 우리는 효율적으로 일을 찾으십시오.
[비디오에 Malan] 나는,이 문 뒤에 숫자 7이 숨겨져 있습니다
하지만이 문 중 일부에 자리 잡고도 다른 음수가 아닌 숫자입니다
귀하의 목표는 배열로 숫자의 맨 위에 생각하는 것입니다
또는 뒤에 숫자에 종이 조각 중 순서,
귀하의 목표는 여기에 상위 배열을 사용하는 것입니다, 나 한테 전화 번호 7을 찾으십시오.
우리는 당신이 일을하는 방식 비판에 갈 수 있습니다. >> 좋아.
[Malan] 우리에게 숫자 7을 찾아주세요.
[웃음]
[Malan] 번호 [웃음]
5, 19, 13, [웃음]. 속임수의 질문이 아니 란다.
1.
[웃음]
이 시점에서 당신의 점수는 잘 못하므로뿐만 아니라 계속 할 수 있습니다. [웃음]
3.
에 이동합니다. 솔직히, 내가 도와하지만도에 대해 무슨 생각을하는지 궁금 할 수 없습니다. [웃음]
만 맨 위 행하기 때문에, 3 왼쪽있어. 그러니까 나 한테 7 찾습니다.
[학생들이 웅성 대는 소리]
[Malan]는 17.
[학생들이 웅성 대는 소리]
[Malan] 7! [박수]
>> 그럼 수요일에 우리는 물건을 찾는이 더 정교한 알고리즘에 뛰어 것이다.
지금 우리는 숀 당신을두고 갈 게요과 수요일에 당신을 참조하십시오.
[CS50.TV]