데이비드 J. 마란 : 이것은 CS50이며, 이 주 네의 시작입니다. 그리고, 소년, 폭스 바겐에 모든 때문에 소프트웨어의 문제. 우리가 살펴 보자. [비디오 재생] -Cars, 똑똑한 문자 맹렬한 기세 영화. 이번 주 독일의 자동차 폭스 바겐은 자체 발견 의 스캔들의 중간에 잠재적 범죄 비율. -Volkswagen는 수십억 보강한다 벌금, 형사 책임 그 임원 등 이 회사는 사과 11 만대를 장비에 대한 이 방출 시험을 이길 도움이됩니다. -Certain 디젤 모델이었다 정교한 소프트웨어 설계 그 포함 사용 정보 스티어링 및 차량의 위치 자동차이었다 결정하는 속도 방출 시험을 진행. 그 상황에서, 엔진 독성 배출을 감소시킬 것이다. 그러나 자동차는 바이 패스 리깅했다 그것이가 구동 될 때. 배출량은 40 10 증가 허용 EPA 수준 위의 시간. [END 재생] 데이비드 J. 마란 : 그래서하자 이것 좀보세요 정확히 어떻게 참조 구현 될 수 있습니다 이것은 영향을 줄 수있는 방법 이 같은 많은 자동차. 그래서 내 손에 여기에 언론이다 그는 EPA--에서 발급 한 눌렀다 환경 보호국하는 미국 규제 기관입니다 환경 문제를 처리, 다음 실제 이었다 법적 고지 몇 일 전 폭스 바겐에 보냅니다. 따라서 EPA는 쓰고, 지금이 개시 공개적으로, 정교한 소프트웨어 특정의 알고리즘 폭스 바겐 차량 감지 때 차를 겪고있다 공식 방출 시험 전체 배출량을집니다 단지 시험 중에 제어합니다. 의 효과 이 차량 오염 방출 제어 장치는 크게 인 모든 정상 운전 중에 감소 상황. 이는 자동차를 충족 초래 실험실 또는 테스트에서 표준 스테이션, 그러나 정상 작동 중에 질소 oxides-- 또는 NOx--을 방출 에서 최대 40 배의 표준. 바겐 제작 소프트웨어 견적 맺다, 패배 장치이며, 면도에 의해 정의 된 바와 같은 미국의 대기 오염 방지법. 그들은 말을 계속 EPA와 다른 기관 패배 장치를 발견 독립적 인 분석 후 소프트웨어 웨스트 연구자 버지니아 대학. 질소 산화물 오염에 기여 이산화질소, 접지 레벨 오존, 미세 입자상 물질. 이러한 노출 오염 물질은 연결되어 있습니다 의 광범위한 심각한 건강에 미치는 영향, 증가 천식 포함 공격과 다른 호흡 충분히 심각 할 수있는 질병 병원에 사람을 보낼 수 있습니다. 오존에 노출 입자상 물질도 갖는다 조기과 연관 관련 호흡에 의한 사망 또는 심혈 관계 효과를 관련. 어린이, 노인, 환자 기존의 호흡기 질환 특히 위험하다 이러한 오염 물질의 건강에 미치는 영향. 충분이 상당히 심각, 말을하는 것입니다. 그리고의 읽기에 가자 하나 더 발췌 그리고, 우리는 살펴 보겠습니다 기본 의미 자동차의 맥락에서의이. 특히, 폭스 바겐 제조 및 설치 소위 소프트웨어 전자 제어 module-- 또는 ECM--의 감지 된이 차량 차량에 대한 테스트 할 때 EPA의 배출 기준을 준수. 등 다양한 입력을 기반으로 스티어링 휠의 위치, 차량 속도, 엔진의 기간 운영, 기압, 이러한 입력 정확하게 파라미터를 추적 사용 연방 시험 절차의 EPA 인증에 대한 방출 시험 목적. EPA의 방출 시험 동안, 차량 ECM 소프트웨어 제작 소프트웨어를 실행 준수 배출 결과. 모든 다른 시간에, 차량 ECM 소프트웨어 별도의 도로를 달렸다 감소 교정 의 효과 전체적인 발광 제어 시스템 구체적으로는 선택적 촉매 린 질소 산화물의 감소 trap-- 이는 우리가 순간에 대해 확인할 수 있습니다. 질소 산화물의 결과, 배출 10 내지 40 배의 인자만큼 증가 EPA 준수 수준 위 구동주기의 종류에 따라. 이건 정말 의미하고, 그래서 소프트웨어 실행에 소스 코드 폭스 바겐의에 않았습니다 아직 공개적으로 개시되었다 즉, 효율적이다 동등한 내부 어딘가에있다 폭스 바겐의 코드. 경우에 당신은, 테스트 및되고있는 자동차의 경우 특정 환경 요인을 감지 스티어링 휠 등에 위치 또는 움직임 결여 또는 자동차 또는 이의 다른 요소의 개수 즉, 현재 가정된다 이 공식의 일부가 될, 그들은 단순히 켜 전체 배출량은 제어 할 수 있습니다. 즉, 이들은 시작 오염 물질을 적게 방출. 그 밖의 다른 모든 상황에서 그것은 것으로 감지되지 때 실험실에서, 그들은 단지하지 않습니다. 그래서 당신은 더 많은이 점을 단순화 할 수 있습니다 뭔가 구체적인 의사 이 같은. 바퀴가 회전하지만, 경우 스티어링 휠, 암시 아니다 자동차는 일부에 있는지 회전 실린더 가지 그러나 어떤 종류의 창고는 테스트되고, 다음과 같이 행동 EPA는 당신에게 싶습니다. 그렇지 않으면하지 않습니다. 그럼 살펴 보자 짧은 비디오에서 그 어떤 의미에서 좀 걸립니다 실제로 기계적으로 이것이다. [비디오 재생] 금요일 - 마지막 EPA가 발표 일부 폭스 바겐 아우디 자동차 2009 년 사이 올해는 사용했다 소위 패배 장치 배출 법을 해결하기 위해서 깨끗한 공기를 유지하도록 설계. 하지만 정확히 무엇을 의미 하는가? 글쎄, 현대 자동차는 수십이 그 안에서 컴퓨터. 그리고 그 컴퓨터의 일부 함수 좌표 도움 최적 용 엔진 성능 확인하면서 너무 많은 쓰레기가 아니라고 배기관 나오는. 그들은 실제로 일한지 지금은 몇 년 동안 이런 식으로. 기본적으로, 모든 부분 현대 자동차의 엔진 센서 또는 컨트롤러가 그것은,이 컴퓨터에 데이터의 수천 읽고 두 번째 결정 조정 당 시간 공기에 대한 연료의 비율 등에 즉, 실린더에거야. 이러한 부정 행위 폭스 바겐 아우디 모델은 디젤이다 그리고 디젤은 하나 더있다 정말 중요한 컴퓨터 인 제어 매개 변수, 가는 미 연소 연료의 양 배기로. 이제 나쁜 소리. 당신이 원하는 것 같은 소리하지 않습니다 배기로가는 미 연소 연료. 그러나의 경우 디젤, 당신은 뭔가를 장치는 NOx 트랩이라고 그 흡수 및 질소 산화물에 대한 트랩 오염 물질은 것입니다 그 그렇지 않으면 대기로 이동합니다. 그리고 NOx 트랩의 효과 미 연소 연료로 강화된다. 그래서 패배 장치는 특별한 프로그램이다 이러한 컴퓨터 내부에서 그 그것을 만들 수 있습니다 차 방출을 충족처럼 기준이되지 않는 경우에도. 폭스 바겐은 자사의 손에 문제가 있었다. 그 디젤 엔진이 알려져 좋은 연비를 얻기를위한, 하지만 NOx 트랩은 잘 작동 더 많은 연료가 사용되는 경우. 그래서 차를 감지 할 이 패배 장치를 사용하여, 그것은 배출량을 받고 때 테스트는 그것이 더 많은 연료를 사용하는 것, 잘 NOx 트랩 작업을, 배출량은 잘 될 것입니다. 그러나 당신은 도로에 장치를 얻을 해제, 당신은 더 적은 연료를 굽는 하지만 당신은 많은 40 번 퍼팅 대기 오염 물질에 더 많은. 하지만 도대체 어떻게했는지 자동차는 것을 알고있다 배출 준수 테스트중인? EPA는 정교한이었다 말한다 물건을 확인 시스템 스티어링 휠 위치 등, 속도, 엔진에 얼마나 오래, 심지어 대기압. 즉, 거기 방법이 실수 없었다 소프트웨어가 되었기 때문에 감지하는 것은 매우 신중하게 설계 공식 방출 시험. 그것은 꽤 심각 기만과 그이다 왜 폭스 바겐에 이러한 심각한 문제. 사실, 그들의 CEO, 마틴 Winterkorn, 그냥 물러났다. 그럼 다음에 어떻게됩니까? 그럼 당신은 절반 만 하나있어, 경우 디젤 Jettas, 비틀즈, 이용 양말, Passats, 또는 아우디 A3s는 영향을 좋은 소식입니다 당신의 차는 여전히 운전하는 것이 안전합니다. 당신은 그것을 멀리 넣을 필요가 없습니다 폭스 바겐은 리콜을 발행 할 때까지. 그러나 어떤 점에서 그들은있어 아마해야 할 것 자동차 내부의 소프트웨어를 업데이트합니다. 그렇게되면 당신은 수도 탱크 당 더 적은 마일을 얻을. 변호사는 이미 준비하고있다 집단 소송에 대한 최대 그래서 소유자는 보상받을 수 있습니다 미래의 어떤 시점에서. 하지만 그에게 않을거야 조만간 일어날. [END 재생] 데이비드 J. 마란 : 그래서이 실제로 제기 흥미로운 더 큰 그림 질문 으로 신뢰합니다. 권리? 우리 모두 아이폰 또는 안드로이드가 나 우리의 주머니에서 뭔가 가능성 요즘, 또는 노트북 우리의 바퀴에 만든 실행되는 소프트웨어 애플과 마이크로 소프트 다른 회사와 송이. 하지만 어떻게 우리가 알고 무엇을 이 소프트웨어 제품은 하 어떤 이들은 실제로 회사는 그들이 무엇을 말? 예를 들어, 누가에의 말할 때마다 당신 아이폰에 전화를 걸 또는 안드로이드 폰 등, 그 전화 번호도 아니라고 일부 회사의 서버에 업로드되는 일부 프로그램의 당신이했기 때문에 그것이 작동 여부, 작성 아이폰 OS 나 안드로이드와 같은 시스템 자체를, 또는 당신이 다운로드 한 때문에 일부 타사 응용 프로그램 어떻게 든 듣고된다 모든 것을 당신이 입력하는 나 모든 것을 당신은 실제로 말을하는지. 당신은 알고 어떻게, 언제 너희들은 연타를 실행 또는 컴파일 할 수 있도록 당신의 CS50, 방법에 자신의 소프트웨어 당신이 CS50 자신의 직원이 수행 CS50 라이브러리로서, 모든 로깅되지 않았습니다 당신이 이제까지 왔 문자열 또는 모든 당신이 이제까지 쪘 인치? 글쎄, 당신은 확실히 볼 수 있었다 무엇인가에 대한 소스 코드를 CS50 라이브러리와 같은, 당신 소스 코드를 볼 수 있었다 Linux 운영 체제 CS50의 IDE에서 실행. 그러나 놀라운 프리젠 테이션 1984 년에 다시 주어졌다 로 튜링 상을받은에서 알려진 매우 유명한 컴퓨터 과학자 이름 켄 톰슨 as-- 사람 튜링 상을받은 컴퓨터 과학의 일종이다 노벨상, 만약에 당신, 그의 작업 운영체제라는 매우 유사 유닉스, 우리가하는 무엇을 사용하는 정신은 리눅스입니다. 그리고 문제는 그가 물었다 그의 본질적으로 수락 연설, 프레임 워크를 내려 놓고 세 논의 년 신뢰와 보안에 대해,이이었다. 어느 정도까지해야 하나 신뢰에 이 조각을 program-- 그 진술 의 software-- 트로이 목마의 무료? 아마도 그것이 신뢰하는 것이 더 중요하다 소프트웨어를 쓴 사람들. 그리고 사실, 우리는 연결 한 이야기에 그가 이 상을 수락 할 때 준 CS50의 웹 사이트에 80 년대 오늘의 강의 페이지에서. 당신이 볼 수 무엇 때문에 그가 실제로 준다이다 방법도 상당히 간단한 예 연타이든 같은 컴파일러 다른 사람들이 과거에 사용한 컴파일러, 컴파일러 우리에 포함 된 경우 어떻게 자신이 경우 조금 사용 본질적으로 말한다 조건, 이 코드를 사용하고 있음을 알 수있는 경우 하여 GetString 함수 또는의 getInt 기능은 가서 삽입 백도어 나 트로이 목마 등이 그 프로그램 지금 일부 0을 가지고 악의적 인 일을 할 것. 모든 로깅하여 그 키 입력 데이터를 업로드, 일부 서버, 또는 정말 아무것도. 그리고 무엇 켄 톰슨 그의 이야기에서 할에 간다 경우에도 그 입증하는 것입니다 당신은 소스에 액세스 할 컴파일러의 코드가 악의적으로이 일을 할 수 있습니다 이 때문에 문제가되지 않는다 이 닭고기와 계란이있다 과거 많은 현실 년함으로써 컴파일러 자신을 컴파일하는 데 사용됩니다. 즉, 돌아 오는 때 사람 최초의 컴파일러를 작성했습니다했다. 그리고 그 후, 언제 그들이 업데이 트했습니다 소스 코드를 변경하여 컴파일러 기능을 추가하고 컴파일 우리 같은 사람들이 사용하기 위해, 잘, 그들은 이전을 사용하는 컴파일러의 버전 새로운 컴파일 컴파일러의 버전. 그리고 당신은 살펴 경우 그가 준 이야기에서, 당신이 있기 때문에 그것을 볼 수 있습니다 그 원형, 당신이 실제로 버그가하거나 트로이 목마는 소프트웨어에 포함 우리가 사용하고 있습니다. 그리고 당신은 볼 경우에도 이러한 프로그램에 대한 소스 코드, 그것도 분명하지 않을 수도 있습니다 속임수 실제로 때문에 일부 이전 버전의 그 이후로왔다 컴파일러 우리의 소프트웨어에 위협을 주입. 어떤 경우에만 우리는 말을 정말 할 수 없습니다와하지 말아야 신뢰 소프트웨어 우리의 노트북에서 실행 전화 또는 장소의 수 또는. 그리고 사실, 나중에 경우 이번 학기에 우리는 웹 프로그래밍에 대해 이야기를 시작 실제로 구축 시작 웹 응용 프로그램 자신을, 우리는이에 대해 얘기하자 위협과 다른 사람. 지금, 당신은 궁금하고 알아 차렸을 수도 작은 작은 다스가 있다는 것을 클립에서 베이더 그 직전이 게재되었다 폭스 바겐에 대한. 만약 당신은 본 적이 없어, 나는 우리는 밝게한다고 생각 기분이 모든 때문에 매우 우울하고 무섭다. 내가 다시 볼거야 슈퍼 볼 2011 시에 의해 상용 Volkswagen--이 거의 again-- 그들에게 호감한다 TV에 처음 방송. 그것은 60초 클립의 난 당신이 즐길 수 있습니다 생각. [비디오 재생] [음악 - "스타 워즈"의 주제] [개 짖는 소리] [CAR 시작] [END 재생] 데이비드 J. 마란 : 그래. 난 그냥 확인했다. 그 차 위반의 목록입니다. 괜찮아. 그래서 우리는 몇 가지를 보면 전 순간을 의사. 그리고 여기에 더 큰 의사 코드 스 니핏 것을 우리는 지금까지 몇 번 봤어요. 그리고의는이 기회를 사용하자 이제 새로운 프로그램을 소개합니다 우리가했던 기술 알고리즘 참조 지난 주 우리는 병합 정렬에서 보았을 때. 그러나 현실을 공식화하는 방법 보자 우리는 실제 코드에서 사용할 수 있습니다 그리고, 우리는이를 사용하는거야 길 아래에 기술 대부분의 다른 특정 문제를 해결하는 것. 그래서 첫 번째 프로그램 중 하나 우리 이제까지 의사 코드이기는하지만, 썼다. 그리고 어떻게이 프로그램 우리는 과정을 수행 할 수 전화 번호부에 마이크 스미스를 찾는 것이 었습니다. 특히 라인 여덟 예고 이 이동하려면 문을했다 (11). 사실, 어떤 언어, 그 중 C, 실제로이 있나요 문자 그대로 문 즉 당신을 수 있습니다에 이동 특정 라인으로 이동합니다. 그것은 일반적으로 인해 눈살을 찌푸리게 것 그것은 아주 쉽게 남용 될 수 있습니다 당신은 점프 시작할 수 있습니다 반대로 사방 프로그램 가지를 사용하는 로직 및 제어 흐름 우리는 단지와 함께 지금까지 사용했던 것을 루프와 조건 등을들 수있다. 그러나 우리는이 알고리즘을 단순화 할 수 있습니다 의사 코드로는 다음과 같다. 대신이 반복의 또는 방법을 반복 여기서 우리가 계속하고 다시 다시 세를 라인에, 왜 우리는 종류의 펀트 더하지 않습니다 일반적으로, 줄 일곱 10 말 단지 그 두 교체 와 라인 쌍, 스미스는 이전 다른 경우 이 책에서 우리는거야 에 마이크를 검색 책의 왼쪽 절반. 스미스는 이후에 인 다른 경우 책, 오른쪽에 마이크를 검색 반 책. 그리고 이미 원형을 알 수 있습니다. 권리? 나는에 마이크 찾고 있어요 전화 번호부 다음 나는 결국 아마 히트 라인 7, 어쩌면 라인 (10) 자신에 대한 나의 명령은 검색이다 전화 번호부의 절반에 마이크합니다. 글쎄, 내가 어떻게 마이크를 검색 할 수 있습니까? 나는 중간에있어 마이크, 이유를 검색 당신은 종류의 원에서 저를 보내는? 하지만 그 무엇 때문에 괜찮아요 문제의 크기에 일어나고, 라인 7, 10에 기록 된대로? 우리는 검색을 말을하지 않을 마이크를 들어, 마이크를 검색합니다. 우리는 구체적으로 무슨 말을하는지? 의 왼쪽 절반에 그 검색 효율적이고 우측 절반 문제의 절반 크기. 그래서 우리는 종류의 걸 괜찮아요 이 원형에 참여, 이 원형 인수 적어도 우리가 있기 때문에 문제가 작아 만드는. 그리고 결국 우리는 도달 할거야 그 소위 기본 케이스 경우 우리는 단지 한 페이지를 가지고 있고이 우리의 자원 봉사 지난 주와 같은 뭐 실수 우리는 한 페이지를했다 다음 왼쪽 우리는하지 않습니다 마이크 스미스를 찾고 유지해야 그는 그 페이지를 때문에 또는 그는 아니다. 그래서 우리는이 아이디어,이를 구현하는 방법 실제 코드에 원형의 종류? 음, 우리는 기술을 활용할 수 있습니다 그는 일반적으로 재귀로 알려져있다. 그리고 우리는이를 본 적이 병합 정렬에 대한 의사 지난 주. 이이었다 리콜 병합 정렬에 대한 의사. 그것은 틀림없이보다 간단 거품 또는 선택 또는 삽입 정렬 단지 간략화 환산 있는 당신은 그것을 표현할 수 있습니다. 하지만 그 때문이다 우리는 일종의 원형의 것 뭔가를 검색, 말 다시 검색하여. 그러나 우리는 하나에 검색하는 왼쪽 절반 오른쪽 절반 다음 결국 우리는있어 이 경우, 병합. 그러나 여기, 너무과 이 두 종류의 라인, 우리는 다시이 있었나요 재귀의 생각. 구체적으로이 무엇을 의미하는지, 알고리즘의 맥락에서, 알고리즘은 재귀 점이다 그것은 사용하거나 자신을 호출합니다. 또는 C의 점에서, 함수는 라는 함수를 recursive-- 푸, foo는 경우 재귀 어딘가에 그 소스 코드, 함수 foo 자체를 호출합니다. 그리고 그 모든 foo는 이제까지 않는 경우 나쁜 또 다시 자신을 호출한다. foo는 결국 중지 된 경우와 마찬가지로 그것은, 괜찮아요 말해서, 정렬 병합 잠깐, 이 문제는 슈퍼이면 작은, 예를 들면, 아니면 난 누구 그를 발견 찾고, 그냥 돌아갑니다. 재귀,하지 마세요 주기적으로 다시 자신을 호출한다. 그리고 이제 살펴 보자 이 실제로 작동하는 방법. 그래서 앞서 열린 갈거야 여기에 두 개의 소스 코드 예제입니다. 중 하나는 시그마 0이라고합니다. 그리고이 전혀 없습니다 재귀,하지만의는하자 이 프로그램이 무엇을하는지 살펴 보자. 나는 밖으로 모두 제거했습니다 그것은 그러나 모든 의견 CS50에서의 소스 코드 웹 사이트가있는 경우 의견을 가지고 나중에 다시 그것을 통해 읽고 싶어. 그리고 이제 몇하자 정신의 여기를 확인합니다. 이 코드의 상단 그래서 우리는 CS50.h.을 포함해야 이 기능은 무엇입니까? 왜 여기에? 합리적인 쉽게 설명하자면. 그것은 무엇을합니까? 그래. 청중 : getInt는 기능이 작동하도록. 데이비드 J. 마란 : 그래서 getInt는 기능이 작동합니다. 이 내부에 있기 때문에 파일, CS50.h, 어떤 우리는 긴에서 전에 볼 수 있습니다 소스 코드의 관점 기능의 무리가 있습니다 declared--의 getInt,하여 GetString, others--과하지 않는 한 무리 우리는 사실, 즉 라인을 포함해야 컴파일러 연타가 아니다 이 존재 함을 알 것. 그리고 같은 라인에 간다 INT가 정의 두 printf의 함수이고, 우리는 꽤 계속 사용. 이제 선 네 약간 펑키 보인다 그것은 단지 하나의 라이너입니다 때문이다. 그것은 더 곱슬, 세미콜론 없어 있어요 중괄호, 그것의 내부에없는 코드입니다. 그러나 우리가 전화를했다 주 과거에이 일이? 그래. 그래서 프로토 타입. 왜 우리는이 있습니까 보인다 프로토 타입 약간 중복 될 일반적으로 보통 우리 때문에 함수를 다시 참조 나중에 파일에서 마우스 오른쪽? 그런데 왜 우리는 그냥있어 잔 마셔요 않습니다 머리를 긁적하지만 난 그것을 할게요. 그래. 청중 : [들리지] 주 후 기능. 데이비드 J. 마란 : 맞아요. 컴파일러는 당신을 알 수 있도록 결국 정의하거나 구현합니다 아마도 주 후 그 기능. 그래서 연타 가장 컴파일러 종류의 벙어리 그들은 단지 알 수 있습니다 당신은 무엇을 그들에게 말해. 그리고 당신은 사용하고자하는 경우 시그마라는 함수, 당신은 더 나은 컴파일러를 가르쳐 그것이 사전에 존재한다. 이제, 주 자체도 이 라인의 무리가 비록, 지금 쯤 잘하면 꽤 잘 알고있다. 그것은 DO 루프 동안 있어요 인생에서 누구의 목적 여기에 분명히을 얻을 것입니다 사용자의 양의 정수입니다. 그리고 그를 귀찮게 계속 또는 그녀는 협조 할 때까지. 그런 다음 라인 (16)에 내가 가진 흥미로운 전화. IntAnswer. 왼쪽에 어떤 측면은 나에게 int를 제공합니다 Answer--라는 store-- 수있는 저장하려고하는, 분명히, 시그마의 리턴 값. 그래서 시그마 단지입니다 임의하지만 의미있는 이름 나는 함수에 준 것을 인생에서 누구의 목적 하나 인 공방을하는 것입니다 우리는이 case--에 N을 전화 할게 단지 그 숫자의 합을 촬영 플러스 모든 양수 그건 그것보다 작다. 나는에 숫자 2를 전달한다면 시그마, 내가 추가 할 2 플러스 1 플러스 0-- 그래서 나 3 준다 0--. 내가 시그마 3에 전달하면, 내가 원하는 3 플러스 2 플러스 1을 가지고있는 나에게 (6)을 제공합니다. 기타 등등. 그래서 그냥 추가 모든 숫자 그것 이하. 자, 여기까지 난 그냥 갈거야 대답을 인쇄합니다. 그래서 빠른 전성 검사로하자 시그마 0-- 점 슬래시 시그마을 0-- 나를 2를 입력 할 수 있습니다. 그리고 실제로 3를 얻을. 내가 3을 입력 할 수 있습니다. 나는 참으로 6를 얻을. 그리고 누군가가 신속하게 수학을 할 수 있다면, 내가 얻을 갈 거 야 (50)는한다면? 청중 : [들림]. 데이비드 J. 마란 : 음, 아니. 그러나 1275 아주 가까이이다. 그래서이 50 일의 결과는 플러스 49 플러스 48 플러스 47 플러스 (46) 1 끝까지. 그건 그래서 모든 시그마는 않습니다. 그러나 이제 우리는했습니다 방법을 살펴 보자 지금을 구현했습니다. 그래서 여기 아래 함수 자체입니다. 그리고 이것은이하지 않는 것 아무것도 아직 재귀와 함께 할 수 있습니다. 사실, 우리는을 사용하고 오래된 학교 기술. 나는 변수라는 합계를 초기화하는거야 제로로, 나는 여기 foreloop을 가지고, 나는라는 int를 선언하고있어 나는 1--에 동일 설정 나는에가 동일하게 설정 할 수 있지만 제로, 그러나 나는 또한 일을 해요 이후, 는 0 또는 1의 경우 누가 관심. 그것은 아무런 영향을 미치지 것. 그래서 나는 너무 오래 내가 같이 반복 해요 m보다 작거나, 같 어느 에 전달 된 인수입니다. 그리고 난 그냥 계속 I. 그리고 통찰력을 증가 루프의 모든 내가 합을하고 일을 해요 플러스 I. 같습니다 그리고 그것은 의도적이다. 나는이에, 싶지 않아 경우, 합계 플러스 플러스 등이있다. 실제로 추가 할 I의 전류 값 이는 더 크고 더 크게 유지 및 실행 집계에 더 큰. 그리고 나는 합계를 반환합니다. 그래서 대답은 값의 합을 가져옵니다. 그리고 나는 그것을 밖으로 인쇄 할 수 있습니다. 그래서 기회가 여기에있다, 하지만 종류의 단순화 이 코드 개념 그리고 타격의 종류는 하나입니다 의 관점에서 마음 단순 심지어하지만 정렬 시간이 걸립니다 의 이유를 주셔서 감사합니다 이 작은 예에 강력합니다. 여기 그래서 one-- 시그마입니다 이 코드의 두 번째 버전. 상단까지 모든 그래서 동일 같은 이야기는 이전과 같이 적용됩니다. 하지만 지금의이 살펴 보자 시그마 구현하는 난 그냥이 아래로 깍습니다 lines-- 코드의 네 줄, 정말, 플러스 일부 중괄호 및 공백. 그러나 나는 무엇을하고 있는가? m이보다 작거나 같으면 제로, 나는 가지 처리해야 그 슈퍼 간단한 경우. 그리고 당신은 나에게 제로 또는 아무것도 손 경우 그냥 이상한이다 음 난 그냥 임의로에 갈거야 하지만 지속적으로 0을 반환. 나는이 일을하지 않으 좀 이상한 무한 들어가 때문에 음의 값의 루프. 당신이 나에게 주면 그래서 난 그냥 말하는거야 제로 이하, 나는 제로를 반환하고 있습니다. 그 때문에 그러나 그것은 좋은 전화 번호부의 한 페이지 그는 남아. 나는 매우 구체적인 문제를 물고있어 재귀 뭔가를 호출하지. 그러나 라인 (31)에서, 무엇을 나는 일을 할 것입니까? 괄호는 유지된다 일, 희망, 조금 명확하게. 하지만 내가 뭘 모든 난입니다 M--를 반환 무엇 당신은 가구 있구만 플러스 손 M-- 죄송의 가치, 플러스 M 마이너스 1의 시그마의 값. 그래서 이것은 무엇을 의미합니까? 당신이 입력으로 나에게 숫자 3을주는 경우에, 대답 나는 궁극적으로 얻고 싶은 3 더하기 2 더하기 1이 나 6을 제공하기 때문에 6입니다. 하지만 난에 대해 어떻게 생각하십니까 이 코드는 어떻게 실행 되는가? 내가 시그마 호출 처음 나는, 값 3 전달 그 조각에 말처럼 종이, 여기에 값 3의 나는 시그마로이를 통과했습니다. 도 3은 그렇게 분명하지 0보다 IF 조건은 적용되지 않습니다. ELSE는 않습니다. 그래서 나는 무엇을해야합니까? 나는 인 M을 반환하려면 M 마이너스 1의 3, 플러스 시그마. 그래서 내가이 추적 할 수 있습니다. 나는이 넣어 갈거야 종이 아래의 조각. 그리고 어떤 값을, 할 수 분명, 내가 전달하는 것입니다 이야기를이 시점에서 시그마에? 무슨 수? 2, 오른쪽? 3 빼기 1은 2입니다. 그래서 나는 조금 필요 여기에 종이 스크랩. 그래서 지금 시그마는 다시 호출 받고있다. 그리고 의도적으로 넣었습니다 이 아래로이기 때문에 종류의 일시 정지 등 이야기의 버전 지금은 초점이기 때문에 M 마이너스 1의 신호에. 그래서 m은 3, M이었다 빼기 1은 2입니다. 그래서 여기에 내가 통과 한 2입니다. 분명히 2 이상인 0 그래서이 경우는 적용되지 않습니다. 그렇지 난이 인 M을 반환 어떤 값의 일, 플러스 시그마? 그래서 시그마의 1-- m이기 때문에 만약 지금 2 그래서 2 빼기 1은 1입니다. 그래서 지금은 1의 값을 가지고있다. 난 그냥 번호를 전달 해요 함수 sigma-- 1 또는 자신 here-- 그래서 1 분명하지 않다 0 미만, 아직 적용되지 않습니다. 그렇지 않은 경우 1 플러스 무엇 시그마? 0. 그래서 내가 그냥 기억하자. 나중에 다시 그에게 얻을 것이다. 지금은 앞서와 조금도 갈거야 숫자 0 아래 그 때문에 내 인수 또는 매개 변수입니다. 나는 숫자 0을 통과 해요 그리고 마지막으로이 과정 단지 자신에게 광고를 반복 nauseum 무엇 때문에 중단 않습니다 나는이 0을 참조하면 나는 즉시해야합니까? 나는 제로를 돌려줍니다. 그래서 지금 당신이 이야기를 되감기해야합니다. 지금 시간이 거꾸로가는 경우에, 가장 최근의 것은 무엇 이었습니까 말 그대로라면 내가 그랬어 비디오 되감기? 내가 가장 최근에 데리러 갈거야 1 그 날 1을 제공 더하기 0은 1입니다. 나는 되감기 유지하는 경우 이야기, 그 날 줄 것 1 2 더하기이 실행 값입니다. 그래서 3입니다. 그리고 나는 감기를 유지하는거야. 내가 먼저 번호를 넣었을 때 3-- 그래서 3 플러스 3 (6) 나에게 준다. 그리고 지금, 당신은 되감기 한 경우 이 시점까지 비디오까지, 이것은 매우이었다 첫 번째 질문 물었다. 3 전달하면, 3 시그마는 무엇인가? 그것은 참 6의 합이다 종이의 모든 조각. 그 조금 걸리는 경우에 따라서에있는 동안 그 괜찮아요, 당신의 마음을 주위에 래핑합니다. 그러나이 little--이었다 고려 내가 쌓아 매우 신중한했다 서로의 상단에이 숫자. 그것은을 가진 같은 종류의 시간에 기록 memory--, 비디오 스크러버와 같은, 나는 참으로 되감기 수있다. 그리고 우리는 돌아올거야 조금의 그 은유. 그러나 첫째로, 그것은 거기에 밝혀 괴짜와 재미 많은 사람들이, 나는 구글, 생각한다. 겠습니까 아주의 사람 인터넷 검색을 마음에 좋은 단지 잠시 올라오고 및 내가 뭔가를 검색하는 데 도움? 매우, 매우 낮은 키. 결코 사람 아마도 이전에 올. 그래. 그래? 어서. 내려 가자. 당신의 이름은 무엇입니까? SAM : 샘. 데이비드 J. 마란 : 샘, 아래에 온다. 이는 동일합니다. 만나서 반갑습니다. 안녕하세요. 이상 어서. 그래서 모든 나는 당신이 경우에 할 필요가 당신은, 샘, 여기에 구글의 수 있습니다. 당신은 용어 재귀를 검색 할 수 있습니까? 망치하지 마십시오. 그리고 지금 그래 let's--. 확인이를 클릭합니다. 더 나은 것을 클릭합니다. 아, 그것을 얻을. 아니? 그래. 그럼 몇 가지 다른 작업을 수행 할 수 있습니다. 관련 순전히 학문적 여기에,하지만 당신이 이제까지 철자 바꾸기 위해 구글을 검색? SAM : 제 데이비드 J. 마란 : OK. 철자 바꾸기 대신 재귀를 검색합니다. 어떻게 비스듬히 약. 혹시 비스듬히 검색? 자,이 사람은 조금 어렵다 볼 수 있지만 희망을 확인 everything's--. 그것은 단지 당신과 나이 즐기고있다. 그래. 그래서 마지막으로,이 one's-- 그것은 약간 비스듬히이다. 지금 배럴 롤을한다. 멋진. 괜찮아. 빅 샘을 부탁드립니다. 여기 당신은 간다. 감사. 그래서 모두에서 일어나는 이 바보 예? 그래서 정말, 후드 아래 줄의 코드 구글의 수백만 분명히 IF 몇 바보 본질적 조건 사용자가있는 경우 확인 이 구절에 입력, 아마했다 무언가를 시간의 사소 양 단지에 구현 이 방법으로 재미있는합니다. 그러나 그것이 종기 전부 후드 아래로 아래로. 하지만, 물론, 재귀 geekier의 더 그 특별한 트릭 중 예. 그리고 확실히 거기에 다른 사람을 거기의 뿐만 아니라 우리는 아마도이 있는지조차 아직 발견했다. 그래서 좀 봐, 또는 고려 이제 다음 프로그램 확실히 하나를 잡아 길 밖으로 이들. 나는 앞서 갈거야 및 의 프로그램을 엽니 다 두 값을 교환하려고 것. 우리가 거​​기 가기 전에 그러나,이 해 보자. 우리는 하나 더 얻을 수 자원 봉사, 내 생각? 당신은 자원 봉사 하시겠습니까? 아니? 최대 어서. 최대 어서. 괜찮아. 그래서 당신의 이름은 무엇입니까? 로렌 : 로렌. 데이비드 J. 마란 : 로렌. 최대 로렌 어서. 그래서 로렌되고있는 다음과 같이 여기에 도전했다. 만나서 반갑습니다. 그래서 로렌은 여기 앞에있다 그녀의 두 개의 빈 컵. 그리고 우리는 일부 오렌지가 주스와 우유 우리는 갈거야 앞서 다음을 수행. 우리는이를 채울 것입니다. 여기에 우유의 몇 온스 및하자 여기에 약간의 오렌지 주스를 입력합니다. 그리고 모두의 앞에 이러한 관객, 이 컵의 두 값을 교환합니다. 우유 컵에 오렌지 주스를 넣어 와 오렌지 주스 컵에 우유. 당신은에 있다면 당신은이 작업을 수행하는 방법 가정 및 기타 소모품에 대한 액세스를했다? 로렌 : 다른 컵에 넣어. 데이비드 J. 마란 : OK. 그래서 임시로하자 변수, 우리가됩니다. 그리고 지금 가서 구현 이 같은 교환 절차. 그래서, 좋은. 우리는 임시로 OJ를 넣었습니다 변수, OJ 변수에 우유, 지금은 임시 변수 우유 변수로. 그래. 그래서 아주 잘 지금까지. 그래서 그 보유 out--집니다 단지 잠시 동안 생각했다. 여기에, 그냥 조금 그것을 괴짜하고,이 해당 C 코드 것 우리는 단지 구현있다. 우리는 두 개의 입력 A와 B의 양쪽을 가지고 이는 우리는 단지입니다 단순화를 위해 말할 것이다 INT의. 내가 교체 할 경우에, 여기에 주목 두 변수, 및 b의 값, 우리는 참으로 중개인이 필요합니다, 임시 변수, 임시 컵, 되는이 값 중 하나를 부어 그래서 우리는 그것을위한 자리가 있습니다. 그러나 코드는 정확히 로렌 여기에 구현했습니다. 이제 단지를 얻을 수 작은 미쳤는 밝혀 당신은하지 않고이 작업을 수행 할 수있는 임시 변수. 하지만, 우리는거야, 제대로 이렇게하려면 일부 화학와 속임수해야합니다. 우리는 여기에 몇 가지 여분의 컵을 가지고있다. 그래서 가장 가까운 점은 보인다 우유와 물 perhaps-- 같은 또는 우유와 OJ-- 우리는 몇 가지가있다 물은, 그래서 우리는이 하나를 채울 수 있습니다 맑은 물 몇 온스와. 즉 너무 많은 아마. 그래. 즉 너무 많은 확실히있다. 하나 잠시만. 그리고 지금 우리는 내가 기억으로는, 기름을 가지고 중학교 화학 클래스, 희망은 물과 혼합하지 않습니다. 그러나 가지 종류의 우유와 OJ처럼 보인다. 지금, 사용하지 않고 임시 변수 당신은 그 두 값을 바꿀 수 있습니까? 물 컵에 들어가는 오일은 그래서 물은 오일 컵에 간다. 로렌 : 없음 컵? 데이비드 J. 마란 : 없음 컵. 그리고 실제로 적이 없다 이 년 전에이 테스트 이 가만히 있으면 그래서 나도 몰라 실제로 화학적으로 작동합니다. 즉,이 일이 안되었다. 그것은 작동합니까? 괜찮아. 그래서 분리? 좋다. 이제 우리는을 얻을 수있어 다른 컵에 물. 스마트 화학 집중 할 수 아마 나보다 더 나은이 작업을 수행. 로렌 : 물이 바닥에 있습니다. 데이비드 J. 마란 :이었다 water-- 어떻게 우리가 이런 짓을 마지막으로 키입니다. 당신은 올바른 순서로 그것을 할 수 있습니다. 그래. 괜찮아요. 그래서 지금 우리는 기름 두 잔이있다. 그래. 괜찮아요. 하지만이 난 -보다 더 가공 화학적 경우 로렌 : 이것은 물이다. 데이비드 J. 마란 : 그것은 주로 물이다. 괜찮아. 그러나 여전히 이전과 같은 컵입니다. 그래서 그건 ... 저기 그것을 시도 붓는다. 그래. 이 수업 시간에 잘 사용 오늘이다. 그래. 그래서 지금 좋은 우우. 일종의. 괜찮아. 그래서 아주 좋아. 로렌을 부탁드립니다. 아주 잘. 그러니, 당신의 마음을 날려 버릴 이것은 아마도 뭔가 당신이 CS50 ID를 좋아하는 경우에 재생하려면 당신은, 실제로, 두 변수를 교환 할 임시 정수를 사용하지 않고. 이는 대응하는 코드는 C이다. 그리고 당신은 마지막에서 호출하는 경우 수요일, 우리는 경우 간략 소개 C. 그리고 수행에 몇 가지 새로운 사업자 사람이 어떤 작은 당근을 기억 기호는, 그 작은 삼각형 키보드에서 기호를 나타냅니다? 어떤 비트 연산자? 청중 : EXOR. 데이비드 J. 마란 : EXOR. 독점 또는. 당신은 그냥 재미에 들어 싶다면 집, A와 B 두 개의 임의의를 제공하기 위해 어떤 eight--와 나는 같은 값 여덟 비트 값을 선택합니다. 당신이 32 비트를 사용하여이 작업을 수행 할 경우, 당신은 매우 빨리 지루해합니다. 그러나 단지 여덟 비트를 제공 하나 또는 두 개의 무엇이든의 가치, 과 유사한 값 b를 제공합니다. 다음의 정의를 사용하여 지난 수요일에서 XOR의, 비트에 의해 각각의 해당 비트를 적용 및 (b)의 각각에서 그 8 비트, 다음이 코드 당 정확히 해. 그리고 그것은 잘못된하지 무슨 당신은 화면에 여기를 참조하십시오. 그것은 참으로 귀결 세 XOR 연산에 어떻게 든 마술과 B 위치를 교환 해드립니다 정보를 잃지 않고. 그래서 기름과 물 트릭은 가장 가까운 실제 화신 나는 그것을 모방하는 생각 할 수있다. 그러나에 확실히 쉽게 임시 변수를 사용하여, 여기이 경우에서와 같이. 그리고이 너무 기회라고한다 또한, 마이크로 최적화 이런 종류의, 컴퓨터 과학자 등 , 말을하면서 재미 가지 당신이없이 이런 짓을하는 방법에 대해 자랑 여분의 변수로 교환 같은, 그것은 모든 강력한 아니에요. 32 비트, 등을 저장하기 때문에 실제 INT의 경우, 모든 강력한 아니다 시스템 위치에 당신은 메가 바이트의 수만을 사용하고있는 또는 더 많은 메모리 요즘. 그리고 사실, 우리는 때를 얻을 수 나중에 문제 세트 당신은 마법을 구현 검사하고 있습니다 그래서 함께 할 도전 이 같은 작은 RAM과 같은 작은 에 가능한 시간 여전히 당신을 computer-- 구현하기 위해 일주일이 당신은 당신이있을거야 잔 마셔요거야 그건 ... 이러한 자원을 최소화하기 위해 도전했다. 그리고 정말 만의 이번 학기 행사 당신은 면도하도록 권장 볼 수있는 곳 심지어 최적의 성능 떨어져 그렇지 않으면 비용이 든다. 그래서 우리는 어떻게 뭐 ... 이 실제 코드에서 볼? 내가 지금 앞서 가자 그리고 예를 열어 이 고의적이라고 어떤 스왑되지는 않기 때문에 실제로 변수를 교환 당신은 실제로 예상대로. 그럼 살펴 보자. 여기에는 CS50이없는 프로그램입니다 라이브러리는 단지 표준 I / O 일. 이제 우리는 프로토 타입을 가지고 맨 위로 스왑하는 단지 그것이 나중에 정의 할 수있어 의미합니다. 그리고 여기에 주입니다. I는 임의의 x 및 y를 할당 각각의 값에 하나, 둘, 단지 그들이 작은 것 때문에 쉽게 생각합니다. 그리고 난 그냥 printfs의 무리가 나는 정신 체크를해야한다. X는 1 Y는 2가 생각된다이고 그 printfs 말 무슨. 그래서 마법 지금까지. 그럼 함께 항에 갈거야 점 점 점 스와핑, DEF 인쇄 할 수 있습니다. 나는 스왑을 호출하는거야 기능, x와 y에 전달합니다. 그리고 이제 지금을 위해 가정하자 스왑 정확히 구현 그것은 순간 전으로 임시 변수. 그래서 나는 대담하게 주장 교환. X이와 y는 지금 지금이다. 그러나 파일은 물론, 어떤 스왑라고하지 않습니다. 그럼 실제로 어떻게되는지 보자. 그때에는 스왑 및 컴파일하지 않는 경우 ./noswap을, x는 1이고, Y는 2입니다. 교환 스와핑. X는 Y는 2, 1입니다. 그래서 실제로에도 결함이있는 것 같다 swap--하지만은들을 당장 아래로 스크롤하자 당 정확하게 구현 코드는 내가 잠시 전에 제안했다. 그래서 우리는 멋진 얻을하지 않을거야 지금은 배타적 물건. 이것도 단지 작동해야 우유와 OJ와 같은, 하지만, 제대로 동작하지 않습니다. 그래서 다시이 작업을 수행 할 수 있습니다. 어쩌면 내가 바로 그것을 실행되지 않았습니다. 그래서 다시 없음 스왑 실행되지 수 있습니다. 어쩌면 난 - NO. 그래서 그냥 작동하지 않습니다. 그래서 조금 정신 검사를 할 수 있습니다. 나 스왑 여기에 앞서 가자 다만, 추가 잠깐, %의 난입니다 / n 및하자 플러그인의 값입니다. 정말 원하기 때문에 무슨 일이 일어나고 있는지 볼 수 있습니다. 그리고 실제로,이다 디버깅 기술 당신은에서 사용할 수 있음 근무 시간 또는 이미 집에서, 단 상반기에 가깝다 PSET3에 Armendariz의 비디오 우리가 인쇄를 도입, 상기와 같은 고화질 적어도 추천 기법 간단한 경우에. 내가 가서 make를 실행하자 다시 더 스왑하지 ./noswap. 흥미. 그래서 사실로 보이는 알 수 있습니다. 엑스 1이고, Y는 2이지만, B가 1 인 경우에는 2이다. 그래서 그 두 어떻게 든 교체있어 그러나 x와 y는 교환 점점되지 않습니다. 그래서 무슨 일이야, 분명합니다 , 여기까지 나는 x와 y가된다 그는 로컬 변수는 주요의 범위는, 나는 x와 y를 전달 해요 교환합니다. 이제, 교환, 분리 함수로서 인수를 호출 무료 또는 매개 변수 아무것도 그것을 원한다. 푸는 X 또는 Y 또는 A 또는 B 또는 바 또는. 단지 그들이 걸 명확하게하는 X 동일하지와 y 자체, 나는 A와 B를 말한. 그러나 우리는 그들에게 우리가 원하는 무엇이든을 호출 할 수 있습니다. 그리고 그것은처럼 보인다 스왑 전달되는 x-- 일명 할까 .. 그리고 그것은이다 y-- 일명 B에 전달되는. 어떻게 든이 세 줄은 정확하게 이러한 값을 스와핑 로렌은 우유와 OJ했던 것처럼. 그러나 우리는 인쇄 할 때 값, 및 B 교환 참으로하지만 X와 Y는 그들에게 변화가 없습니다. 그 x와 y가 여기에있다 기억합니다. 그래서 우리는이를 통해 볼 수 있습니다 뿐만 아니라 다른 기술. 그리고이 너무 기술이다 문제에 포함 된 세 가지를 설정합니다. 의 앞서 가자와이 작업을 수행 CS50 ID는 이미하지 않은 경우. 우측의 우리에 이 디버거 탭이 있습니다. 그리고 당신은이를 열 경우, 일부 비밀 정보가있다 즉, 처음에 당신을 던져입니다. 하지만 이제 정말 빨리이 떨어져 애타게 할 수 있습니다. 그래서 하나는, 당신은 지역 변수를 참조하십시오. CS50의 IDE에 구축 밝혀,과 프로그래밍 환경의 더 많은 일반적으로, 디버거이다. 당신이 시각적으로 볼 수있는 도구 무슨 일이 프로그램의 내부에 무슨 일 첨가에 의지하지 않고 printfs 및 컴파일 및 실행 그리고 printf의의를 추가하고 컴파일 근무 시간에, 어떤 이미 실행 또는 집, 아마 꽤 지루한지고. 그래서 여기에, 그냥 순간에, 우리는있어 실시간으로 볼 것 우리 지역 변수의 값. 우리는 또한 설정할 수거야 브레이크 포인트라고 무엇을하는 기회가 일시 중지 내 프로그램에 코드의 특정 라인에서 실행 나는 약 궁금있다. 권리? 이 프로그램은 두 번째 분할에서 실행됩니다. 그것은 우리 느린 인간에 대한 종류의 좋은 데요 일시 정지, 잠시 시간을내어 할 수 있도록 참조 주위에 무슨 일이야 코드의 특정 라인 프로그램 없어야없이 이를 통해 완전히 마무리. 그래서 중단 점에 우리를 허용하는 것 휴식 및 특정 지점에서 일시 정지합니다. 콜 스택의 멋진 방법입니다 기능은 무엇인지 말 순간에 호출되는. 주요 항상 처음이라고합니다. 그러나 주요를 호출하는 경우 스왑 호출 된 함수, 우리는 실제로이를 보게 될 것입니다 왔다 기능의 타워 역순했다. 그럼 것을 볼 수 있습니다. 나는 축소거야. 나는 내 코드로 돌아갈거야. 그냥 내가 원하는 때문에 여기 현학적하기 위해, 내가 가서 클릭거야 다만 라인 다섯의 왼쪽에. 그리고 그 빨간 점을 만듭니다. 그리고 오른쪽에 주목 디버거가 이봐, 알고, 내가 방금 말한 중단 점에서 noswap.c 라인 다섯, 특히 이 코드 줄에서. 그래서 디버거는 내가 알고 다음 번 것을 요청했습니다 내 프로그램 그것을 일시 정지를 실행 이보다는 실행 슈퍼 빠른 전체를 실행. 그래서 지금은 디버그를 클릭거야 IDE의 매우 상단에있는 버튼을 그것은 다음과 같은 작업을 수행 할 것입니다. 그것은 처음에는 다소을 열 것 무서운 찾고 제 2 터미널 .- 창문 에서 원격 디버깅 이러한 호스팅하고 such-- 우리는 다시 올 거 야 모두가 오래 전에 의미합니다. 하지만 지금은 중요한거야 그 빨간 점을 맞았 것입니다, 디버거가 의도적으로이 execution-- 일시 중지 하지 그 자체로 그 라인에 있지만, 처음에 그 함수의 실제 코드의 라인. 라인 일곱 인 이유입니다 지금 노란색으로 강조. 그리고 이제 살펴 보자 우변. 그것은 기본적으로 같다, 잘 충분히, X는 어떤 값을 가지고? 0. Y는 어떤 값을 가지고? 제로. 그리고 그 점에서 예상 할 수있어 그 x와 노란색 line--가 가지고있는 y-- 아직 실행되지 않습니다. 그래서 X의 값은 1이 안됩니다. 그것은 어떤 다른 값을 가질 수 있습니다, 소위 쓰레기 값입니다. 그리고 우리는 그것의 점에서 운이있어 본질적으로,이 시점에서 제로. 그래서 지금 몇있다 버튼을 우리가 신경 쓸 필요 이 방법으로 디버깅 할 때 약. 여기에 주목, 우리는 재생 버튼이 있습니다. 그리고 우리는 재생하는 경우 또는 충돌 즉 단지, 다시 시작 를 통해 실행하는 것 프로그램의 나머지 또는 또 다른 중단 점을 돌 때까지. 그러나 나는 다른 설정하지했습니다 중단 그래서 그냥 말까지 실행하는 것. 패배의 종류 주위에 파고의 목적. 그래서 그 대신, 내가 걱정 오른쪽에이 아이콘. 그리고 가리키면 그들에게, 당신은 너무해야 당신은 작은 tips-- 도구 설명을 볼 수 있습니다. 이것은 하나 이상의 단계입니다. 이제는 스킵을 의미하지 않는다 다음 코드 줄. 즉, 단지 그것을 실행 의미 다음으로 이동 다음으로 이동 다음으로 이동합니다. 즉, 비아 그 버튼을, 나는 걸을 수 한 번에 내 코드를 한 단계를 통해. 말 그대로 라인으로 라인. 이제, 오른쪽 다른 하나는 거기에 있다고 우리는 단지 한 순간에 볼 수있다. 이것은 소위이다 아이콘 단계 씩 나에게 다이빙을 허용하는 것 또 다른 기능으로. 그러나 그냥 순간에서 볼 수 있습니다. 그래서 스텝 오버를 클릭거야. 내가 클릭으로 그리고 지금, 알 오른쪽 상단의 버튼, 현지에서 대략 당신의 눈을 유지 변수와 X에 무슨 일이 일어 나는지. X 해주기 때문에 1 노란 선은 현재 실행 된 우리는 라인 8에 이동했습니다. 그리고 잠시의 Y에 희망이 될 것이다. 지금, 아무것도 흥미가 조금 발생합니다. 이 모든이는 printf의입니다. 그리고 내 차 터미널에 주목 창, 나는 인쇄 데프의 출력을 참조하십시오. 그리고 지금은을해야 프로그래머로 결정. 나는이 라인을 통해 단계 수 코드를 실행하지만 내부 기능에 대한 호기심이 점점. 아니면 내가 실제로 한 단계 수 및 스왑 자체의 내부 이동합니다. 그럼 후자를 할 수 있습니다. 내가 가서 클릭하자 하지 스텝 오버하지만 속으로 단계. 공지 사항, 갑자기 윈도우 변경 첫 번째 강조 스왑의 코드 라인. 즉 라인 (21)이다. 그리고 지금, 펑키의 종류는 그 무엇이다, 당신이 여기에 보면, 예상대로 쉼표 (B)는 각각 1, 2이다. 왜 임시 32,767입니까? 많은처럼, 그 온도를 불러 오기 잠시 전에 빈 컵, 라인 (21) 여기에 선언된다. 내 말은 왜 32,000-, 이유는 그것은 단지 몇 가지 이상한 값? 그래? 청중 : 그것은 초기화 아니에요. 데이비드 J. 마란 : 그것은 초기화되지. 그래서 우리의 컴퓨터 항상 실제 메모리가 있습니다. 항상 실제 RAM이 있습니다. 그리고 항상 거기의 영점 하나는, 바로 거기에있어? 우리가 사용하고 있기 때문에 우리의 하루 종일 컴퓨터, 당신은 CS50 IDE를 사용하는 또는 서버 하루 종일. 그 RAM 일부 0을 가지고 하나 그래서 나 어떤 하나의 나 약간의 0과 1. 아무리 여부 당신이 그들을 사용하고 있지. 당신은 빈 가질 수 없습니다 공간은 어디 비트를 할 수 있습니다. 그들은 0과 1 중이야. 그래서 때문에, 그 온도를 밝혀 우리는 아직 초기화되지했습니다 우리는 그 32 비트를 가지고 있지만 그들은 적이 없다 알려진 값으로 초기화. 그래서 그들은했다대로 가장 최근에 그 32 bits-- for-- 사용 우리는 단지 몇 가지의 유물을보고있다 그 특정 (32)의 이전 사용 비트. 즉시 그래도 스텝 오버 클릭으로, 휴, 온도는 1의 값을 얻을 것입니다. 내가 다시 할 경우에,이다 값이 부여 될 것 다음 B가에가는 값 1을 설명한다. 그래서 무슨 일이 지금에 좋다 이야기의이 시점 디버거가 있다는 것이다 슈퍼 천천히, 나를 보여주는 내 자신의 속도로, 어떤 스왑의 상태입니다. 그러나 여기 상단 통지에 주목 실제로 호출 스택 그것은 두 개의 층이 있습니다. 로 강조이야 이제 하나 스왑, 내가 대신 홈페이지를 클릭하면, 지역 변수를 변경하는 방법을 알 수 개발자는 단지 홉 수 있으므로 주위에 어떤 다른 범위로 이동합니다. 우리는이 모든 일을하는지 그래서 비록 일을 제대로 A와 B를 교환, 나는 스왑 사이에서왔다 갔다하는 경우 는 2이고, B는 1 주이고, 주요 전혀 영향을 받았다? 아니. 그래서 테이크 아웃은 여기에 무엇입니까? 음, 언제 밝혀 당신은, 스왑과 같은 함수를 호출 당신은 그것을 인수를 전달하는 것을 당신은 스왑 함수에 전달하고 이 경우는 복사 그 인수. 따라서 X 및 Y는 각각 각 경우 32 비트, 어떤 스왑을 받고있다 두 개의 새로운 지역입니다 변수 또는 인수 라는 및 b--하지만 사람들은 임의적 names--하지만 0의 패턴 내부 및 B의 것들이다 줄은 x와 y와 동일합니다 하지만 그들은하지 있습니다 x와 y와 같은 것. 주요의 그 조각에있다 것처럼 그것은이다 종이 숫자 1과 x와 y 2, 그리고 그 후, 손 때 종이 조각은 스왑, 스왑은 매우 빠르게 도착 자신의 펜, 아래로 쓴다 1 종이 자체의 시트에 2, 손 메인 원래 XY를 백업 다음 자신의 작업을 수행 A와 B를 가진 것. 그리고 이것은 지금 때문에 매우 중요하다 이 사소 의미를 가지고 실제로 올바른 코드를 작성하기위한 이 것 때문에 우리는 바꿀 수 없습니다 두 변수. 나는 올바른 스왑 기능을 작성했습니다. 우리는 같은 로렌 그것을 구현했습니다 현실에서 올바른 스왑 기능, 하지만 그 분명히 없음 문제 경우 실제로 할 수 없습니다 영구적으로 두 값을 교환합니다. 그래서 우리는 다른 방법이 필요합니다 실제로이에서 얻을 수 있습니다, 우리는 할 수 있어야합니다 실제로,이 문제를 해결한다. 그리고 그것은 out--집니다 우리는 올 것이다 다시이 특정 사진에 long-- 전에이 하나의 방법입니다 당신은 당신의 컴퓨터의 메모리를 그릴 수 있습니다. 그냥 사각형입니다. 당신은 어떤을 그릴 수 방법 그러나 그것의 수 로 그릴 편리 다음과 같은 이유로 사각형입니다. 우리는 넘어 오늘을 시작하는거야 소위 스택에 대해 이야기. 그리고 스택은 체크입니다 의 memory--의 덩어리를 RAM-- 기능을 액세스 할 수 그들이 호출 할 때까지. 그리고 그것은 그에서 밝혀 이 스택의 맨 아래 홈페이지의 지역 변수의 모든 어디 조직도 C와 조직도 V 및 모든 물건과 기본적으로 갈 수 있습니다. 그리고 메인 경우 , 스왑 같은 다른 함수를 호출 물론, 스왑은 서로를 얻을 것입니다 위의 메모리 최대의 층. 그래서 당신에게 빠른 피상적를 제공합니다 이의 사진, 내가 가서 경우 ​​here-- 나를에이를 반영 할 수 오버 헤드로 정말 내가 무슨 저기 ..., 우리는 대한 유일한 걱정하는 경우 지금은이 그림의 아래, 입니다 나는 프로그램을 실행할 때 및 주요, 호출되는 주요 덩어리가 주어집니다 내 컴퓨터의 RAM 소위 스택의 하단. 그리고 나는 그것을 그릴거야 의도적으로 제곱. 그래서 32 비트 또는 4 바이트 같다. 그리고이 주요 기능이있는 경우 1의 값을 가지는 변수라는 X 그것은라는 변수가 있습니다 2의 값을 가진 Y는 그건 메모리의 은색을 복용처럼 그 홈페이지가 조작함으로써 주어졌다 시스템 있도록 나누기 최초의 지역 변수가 간다 두 번째는 간다, 그리고 그것 뿐이다. 주요 스왑, 스왑을 호출 할 때 메모리의 자신의 조각을 얻는다 우리는 다음과 같이 그릴거야 운영 체제로부터, 그리고이 것 그 자신의 지역 변수를 기반으로 우리의 구현에 이전 지역 변수와 처음와 b 그 값 1과 2를 얻을. 하지만, 가능한 한 빨리 교환 코드, 실행 로렌 실제로 스왑 OJ와 우유, 무슨 일이야? 음,이 2는 1이되고있다 1에 의해, (2)이되고, 및 되 고 임시 변수가있다 결국에는 그 모든 시간을 사용 멀리 간다. 그러나 그것은 중요하지 않습니다 얼마나 많은 일을 당신이 이 라인이 메모리 공간에 동행입니다에, X 및 Y는 완전히 그대로이다. 그래서 우리는주는 방법이 필요 좋아 스왑 및 기능 비밀 액세스, 만약에 당신에게 함수는 x와 y 같은 메모리에 그때 엔. 그럼 살펴 보자 도움이 예 우리는이되었습니다 정확하게 볼 이 모든 시간에가는. 나는 앞서 갈거야 최대 열 제로를 비교. 그리고 나는 종료거야 우리의 디버거, 내가 갈거야 이 무서운 찾고 메시지를 닫습니다 그냥 잠깐 말한다, 당신은 중간 디버깅에있어. 여기이 탭을 숨기는거야 그냥 단순로 이동합니다. GDB가 살해 된 경우 그래서 걱정하지 마십시오. 그건 그냥 프로그램이 있음을 의미 의도적으로이 경우, 종료되고, 나에게서부터로. 그리고 지금 제로는이 작업을 수행 비교. 나는 CS50를 사용하고 있습니다 표준 I / O 라이브러리를. 그 첫 번째 주요 기능을 가지고있어 라고, 뭔가 말을하고, 문자열을 가져옵니다. 그런 다음 다시 그것을 말한다 다른 문자열을 가져옵니다. 그리고이 두 개의 문자열을 통지 각각 S와 T라고합니다. 그리고 지금이 프로그램은, 비교 제로, 삶의 목적, 그것은 말해하기로했다, 나는 같은 일을 입력 했습니까? 그래서 나는 일주일에 다시 갈거야. 내 동일한 동일한 연산자를 사용하고 있습니다 이는 품질 연산자이다. 아니 대입 연산자, 항등 연산자. 난 그냥 S와 T를 비교하고있다. 그래서 실제로 가서이 작업을 수행 할 수 있습니다. 그리고 앞서 갈거야 과 제로를 비교합니다. 나는 ./comparezero을 할거야. 그리고 나는 갈거야 앞으로 뭔가 말 등의 소문자에 엄마를하자 어떻게 대문자로 엄마에 대한. 그리고 물론 나는 다른 일을 입력합니다. 괜찮아. 즉, 예상 할 수있다. 이제 다시 실행하자. 두 번, 소문자를 소문자을한다. 즉 나에게 슈퍼 동일 보인다. 입력합니다. 그래. 아마 때문에 그냥 이상한 내 문법을 좋아하지 않는 것. 그럼 자본 MOM을하자, 자본 엄마, 동일. 다른 것들. 그래서 이유는 무엇입니까? 음, 사실 무슨 일이야 여기에 후드 아래에? 그래서 다시 가서 보자 여기에 단지 순간 무엇을 고려하여 GetString 실제로하고있다. 당신이하여 GetString를 호출 할 때, 즉 함수 우리의 자신이 쓴 어떻게 든를 가져옵니다 사용자의 문자의 순서. 그리고의 첫 번째 가정하자 시간 나는하여 GetString를 호출, 그 날을 제공합니다 메모리 청크는 다음과 같습니다. 그리고 나는 모든 소문자로 입력 한 경우 M-O-M-- 무엇은 후에 간다? 그냥 빨리 전성 검사. 백 슬래시 제로. 우리는 알고있다. 그리고 우리가 연주 리콜 주위 Zamila의 이름으로 다른 이름의 무리 때 롭 여기에보고 있었다 메모리의 내부에서 무슨 일이 일어나고 있는지에. 그래서 이야기는 정확히 동일합니다. 이것은 무엇을하다하여 GetString 나에게 반환됩니다. 지금, 내 코드는 순간 전에 저장 에서 getString 반환 값 변수들이라고합니다. 그리고 두 번째는 내가라고, 이는 t라는 변수에 저장. 내가 여기에 가면 그래서 필요 이 지역 variable--을 그립니다 나는 일반적으로 갈거야 그냥 ... 우리가 겠지만 문자열을 그립니다 여기에 작은 광장으로 s-- 호출합니다. 엄마를 어떻게하는지 그리고 지금, somehow-- 이 변수의 내부 이동? 음, 우리는 돌아 가야 할 필요가 여기에 첫 번째 원칙. 하여 GetString는 실제로 무엇을 반환? 그래서 그 M-O-M을 밝혀 슬래시 제로, 및 임의의 개수 같은 메모리에 다른 문자열 Zamila 롭거나 앤디 또는 다른 사람, 에 물론 우리의 컴퓨터의 RAM 또는 메모리. 그리고 당신의 RAM은 당신이 그때 엔이 RAM의 공연, RAM의 두 기가, 또는 억 억 바이트, 아니면 더 많은 요즘. 그래서 오늘의 목적을 위해, 가정하자, 우리가 번호를 어떻게 문제가되지 않습니다 그들, 그러나 우리는 각각의 번호를 수 그 억 억의 또는 네 억 바이트. 그리고 그냥 임의로 그런 말을하자 이것은 첫번째 바이트, 초 바이트이며 세 번째, 네 번째. 나는 일부러 대해 0을 사용하고 있지 않다 오늘하지만 우리는 다시 그에게 올 것이다. 환언하면,이이면 처음으로 나는 프로그램을 사용하고 있습니다 난 그냥 운이 첫 번째지고있어 물린 후 위치 하나에 두 개의입니다 다음 세 네보다. 그리고 그리기 유지하는 경우, 상자 번호 억이 방법을 통해 여기에있을 것입니다. 그래서 만약 당신이 다음, 어떻게 생각하세요, 하여 GetString 실제로 반환? 그것은 M-O-M의 백 슬래시를 반환하지 않는 것 제로 자체가 명확하게 그 때문에 내가 그린 한 상자에 맞지 않습니다. 그래서 실제로 다른 무엇을 getString에 있습니다 모든 주 복귀 할? 대답은에 보드 여기 어딘가에. 당신은 M-O-M 백 슬래시 제로에 맞지 않을 수 있습니다 그래서 대신에 의미가 있는가? 당신은 퍼팅, 슈퍼 영리해야한다면 소위 엔지니어링 모자, 당신은 무엇을 반환 할 수 있을까? 어떤 정보의 최소한의의 당신은 여전히​​ 것이라고를 반환 할 수 있습니다 메모리에 M-O-M을 찾을 수 있습니다? 그래? 대상 : 하나. 데이비드 J. 마란 : 하나. 그리고 왜 하나? 청중 : 그것은 말할 것 때문에 당신은 어디에 [들림] 이동합니다. 데이비드 J. 마란 : 맞아요. 난 그냥 주소를 반환하기 위하여려고하고있다 내가 입수했습니다 문자열. 이에 주소 경우는 위치입니다. 그래서 정말 s--에 저장되는 모든 문자열 변수 때문에 far-- 다만있다 해당 문자열의 주소입니다. 한편, 나는 호출하는 경우 두 번째 난을 getString에 말 그대로 같은 누군지 모르겠지만를 입력 lowercase-- M-O-M과 M-O-M 또 다른 백 슬래시 제로, 그리고 지금 아마 내 프로그램의 몇 시간 동안 어쩌면이 실행 된 (10)이고, 이는이 12이고, 위치 11 이 13입니다. 다른 컴퓨터를 사용 어떤 이유로 메모리. 무엇 지금 내 두 번째로 간다 내 프로그램 T의 변수? 10. 정확히. 그래서 우리가 볼 때 이 프로그램의 소스 코드 여기서 나는 단순히 노력하고있어 두 값을 비교, 이다 T로 동일 동일이야, 무슨 일이야 분명 인간의 대답? (1) (10)과 동일하지 않을 그냥 아무 때문이다. 그리고 여기에 거짓말 우리에게 기회 정말 단지 첫 번째, 다시로 이동합니다 원칙과 잘, 생각, 무슨 일이 후드 아래에 무슨 일? 우리는 얘기를했습니다 비트와 바이트 메모리, 그러나 이해하는 것이 실제로 유용 당신이하여 GetString를 호출 할 때 때문에, 우리가 생각하더라도 그것은이다 M-O-M 또는 문자열 엄마를 반환 또는 앤디 또는 Zamila 또는 같은 기술적 그냥 주소를 반환하는 것 메모리의 청크의. 하지만 괜찮아요. 내가 방법을 알고 있기 때문에 문자열이 어디 끝? 나는 시작에 불과을 부여하고있는 경우에는 어떻게해야합니까? 음, 백 슬래시 제로, 오른쪽? 그냥 내가 할 수있는 선형 시간 인쇄 데프 M-O-M과 인쇄. 그리고 최대한 빨리 백 슬래시를 참조로 내가 시작했던 곳 제로, 난 상관 없어 이미 암묵적으로 알고 어디 종료해야합니다. 그래서 오늘은 beginning--을 표시하고 내가 우리 때문에 극적으로이 작업을 수행 할 수 많은 어려움을 겪었 이 여기에 wheels-- 훈련을받을 그래서 오늘 훈련 바퀴 시작 나서야 우리는에서 공개하는 least-- [박수] 즉, 여행 잘 가치가 있었다 네, 오늘 아침에 대상에? 그래서들을 당장이,이 변 아웃, 문자열 같은 건. 문자열이 존재하지 않습니다. 그것은 우리가 했어 동의어이다 CS50 라이브러리의 내부. 이제부터 우리는 호출 시작하는거야 S와 T하지 문자열하지만 문자 스타. 문자 스타 그리고 우리는거야 오래 전에 떨어져 애타게. 하지만이 말을하는 것입니다, 우리가 계속 경우에도 그 지금하여 GetString을 사용하여, 기술적으로 내가해야 문자 스타와 문자 별 말을합니다. 그리고 그것은 무엇을 그 별을 밝혀 표시하기 위해가는 것은 뭔가 포인터 또는 주소라고합니다. 그리고 사실, 맛보기 무엇을 앞두고있다 에서이 20초 클립 우리의 스탠포드 친구 닉 Parlante 자, 꽤 많은 시간 전, 지출 시간의 말도 안되는 금액, 최고로 나는에 말할 수있는 자신의 부엌 또는 그의 지하실, 클레이 메이션을 세계에 소개 라는 문자 빙키 누구와 함께 우리는 것 포인터 옆에 시간이 도입 될 수있다. 그래서 여기 와서 무엇의 미리보기입니다. [비디오 재생] 이봐, 빙키. 일어나. 그것은 포인터 재미를위한 시간이다. 그게 무슨입니까? 포인터에 대해 알아? 아, 케이크. [END 재생] 데이비드 J. 마란 : 그리고 그 메모, 우리는 수요일에 당신을 볼 수 있습니다. 괜찮아. 춤은 누구? 어서. 춤은 누구? 당신은 내가 그것을 시작하고 싶어? 나는 그것을 시작할 수 있습니다. Woooo! 로렌 : 달콤한 공상 모세.