[Powered by Google Translate] Дейвид Дж. Малан: Добре, това е CS50, и това е началото на седмица две. Благодаря. Нека започнем тук с едно телефонно обаждане. Аз съм за да наберете шестстотин и седемнадесет милиона BUG-CS50. CS50: Това е CS50. За Shuttle Boy, натиснете 1. Да започне отначало, натиснете 9. Дейвид Дж. Малан: Така каза той за Shuttle Boy, натиснете 1. Така че отиваме да натиснете 1. CS50: Какъв е вашия произход? За четворни, натиснете 1. Mather, натиснете 2. Boylston, натиснете 3. Ламонт, натиснете 4. Държавите зала, натиснете 5. Да започне отначало, натиснете 0. Дейвид Дж. Малан: Ще натиснете 1 за четириядрени. CS50: Следваща совалката оставя това много минути в 1:10 PM и след това в 13:20, 13:30, 13:40. Това е CS50. Дейвид Дж. Малан: Така че това е глас CS50. И това е един пример от сортовете на окончателните проекти, Например, можете да отхапват към края на семестъра. Например, че shuttleboy.cs50.net съществува - всъщност е проект, който за първи път се пише след като CS51 назад, когато бях студент. И вдъхновение тук беше тогава, всички те са имали печатните графици автобус и не е имало идеята да гледаш на нещата онлайн. И така, аз вид на гълъб в един уикенд, изсипва през отпечатва график, както и преминаване към компютърна програма. По това време се случи компютърната програма да бъде написана С. И всъщност тя се завтече като напишете Shuttle Boy мига подкани като сме правили до този момент. Но с течение на годините той се превърна в един миг съобщения бот. Тя се разви по-скоро в този сайт, в едно SMS-базиран инструмент, както и в този глас-базиран инструмент. И това е да намекват за всякакви неща, които можете да направите за себе си до края на семестъра. Например, там, версията SMS на Shuttle Boy се случва да работи по следния начин. Ако на мобилния си телефон, можете да изпратите текстово съобщение до 41411 и след това да изпрати специален sboy символ, за Shuttle Boy, последвано от А и Б, където А е произход и Б е дестинация - например, Boylston Space Quad - какво трябва да се върне в рамките на няколко секунди е текст съобщение от Shuttle Boy ви казвам точно кога следващите няколко совалки, от тази гледна точка за това точка Б. И това е един по-общ пример за това, което е известно като с помощта на API. Така например, това тук е просто shuttleboy.cs50.net, действителната уеб-базиран въплъщение на тази. Но данните, които подчертават този и други приложения, които CS50 е разработила са изложени на всички тук под формата APIs, приложни програмни интерфейси. И това е само един луксозен начин на казвайки, че хората ни харесва Интернет и други са прекарали известно време в създаване на софтуер, който можете да използвате, за да вземете данните от нас и след това да изградят свои собствени приложения на върха на този набор от данни. Така например, тази Shuttle Boy страница API, което се случва да бъде в ръководството CS50 по същество документи как можете да отидете да попитате CS50 сървъри за данни. Например, ако сте запознати с CSV файлове, разделени със запетая стойности, разделени, те са просто бърз и мръсен Excel подобни файлове. Така че може да поиска трансфер Момче за всички данни по всеки един от къщи и техните GPS координати, и вие ще получите обратно, по същество, електронна таблица като тази, че След това можете да прочетете в програмата на собствения си и след това генерира резултати, като Shuttle Boy се случва да се прави. За тези по-познати, по-модерни представителства на данни JSON, JavaScript Object Notation. Нещо ще се върне към вас края на семестъра. Но отново, това е само един от няколко от APIs CS50. Вълнуващото нещо е сега, тези дни, Facebook и Twitter и Google, както и почти всеки популярен уеб сайт от там има някакво API, което означава, че ако прочетете документация на уебсайта си, можете да се регистрирате за сметка, след това можете да започнете да пишете софтуер на върха на каквато и да е инструменти или данни, които компанията предлага. И така, един от нашите собствени сътрудници на преподаване няколко години назад пише Mac версия на този. Така че връзката Mac тук горе в ляво, всъщност можете да изтегляне на Mac OS джаджа, която работи на вашия собствен Mac да направи същите видове на нещата. Така че всичко е въпрос на изграждане на върха на набори от данни като тези. Но повече за това към края на семестъра. Така че нека да се потопите по-бързо на бъг, просто някак да се неща затоплена днес, и мисля, обратно на някои от неща погледна миналата седмица. По-специално, нека вървим напред и издърпайте нагоре, да речем, този пример тук. Buggy1.c, това е на разположение на интернет страницата на курса, ако искате искал да го изтеглите и да мушкам около себе си. Но нека да я увеличите тук, в тази сравнително кратка програма, а просто супер-бърз обзор на някои от основните градивни елементи, които ние наистина ще започнете да приемате за даденост. Така синята неща, в редове от 1 до 9, са само софтбол въпроси. Така че това са само коментари. Те нямат функционално значение. Но те са коментари в смисъл, че те са отбелязва, че I, човека, за себе си, така че в лекция и след лекция, всъщност мога да си спомня какво тази програма прави, без да се налага да четете през него линия по ред и пресъздаване на историята в съзнанието ми. Освен това, ако в ръка тази програма на някой друг като вас, това е много по-ясни за вас, защото коментари като този, какво всъщност прави програмата, или поне това, което програма е трябвало да се прави. Дали това е вярно или не е съвсем друг въпрос. Сега, в C, с многоредови коментари, се припомни, че он-лайн тук е магически символ, / *. Това означава, че тук идва началото на коментар. И нищо друго няма значение, докато не стигнат до края терминатор, което е * /, точно обратното. Така че самият факт, че имам 80-тук от някои странни звезди ляво на дясно наистина е просто естетически детайл. Той няма функционално значение. Сега какво ще кажеш за линия 11? Какво означава това в други думи? Какво е това? ПУБЛИКАТА: Включва стандарт. Дейвид Дж. Малан: Добре, добре. Така че това включва stdio.h библиотека. И така, какво означава това? Е, вътре в този файл, stdio.h са цял куп декларации на функциите - че е код, че някой друг е написал. И перфектен пример за функция, която е обявена в stdio.h - които фаворит до сега? Така ФОРМАТ, един от най-често срещаните да се използва, разбира се по-рано, от тази библиотека е там. Ако изключа тази линия на код, звъня да крещи ми нещо за използването на недеклариран символ. Недекларирани Нещо, което вероятно е ключовата дума, защото ние не са информирали компилатор ФОРМАТ изглежда искали, освен ако не включват тази линия. И още на Земята, наистина, това, което тази линия се казва, е отвори този файл, stdio.h, където и да се намира на сървъра твърд диск или твърд диск на уреда и копиране и поставяне точно там в досието ми, без да ми се налага да направите това ръчно. Сега, след като сме се тук до основното, не след дълго ние ще започнем подигравателен освен вътр и това, което е нищожно. Но за сега, нека погледнем трите линии в рамките на 15 до 17. Това тук аз твърдя, като бъги. Линия 7 в коментарите ми казва "трябва да отпечата 10 звездички, но не го прави. "Защо това не се отпечатват, в действителност, 10 такива звезди? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Точно така. Така че забележите, че започва да брои от 0. И това е всъщност конвенция в програмирането и компютърни науки в по-общ план, като се започне да се брои от 0 вместо 1. И това наистина просто произтича от факта, че за Например, когато имахме осем души на сцената, когато никой не е повишаване на тяхната страна, те са всички ефективно нули. И така, това е просто вид на компютъра конвенция така, следователно, да започнем да броим от 0. Ако това е най-малък брой могат да се представят в двоичен. Така че тук сме започнали и инициализиране на 0. Сме аз равна на 0. Но тогава аз направих тази грешка тук, да кажа, че е по-малко от или равна на 10. Но ако смятате, че, ако започват от 0 и тогава ще отида до 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, аз съм всъщност ще отпечатате 11 звезди на екрана, защото съм качил до и равен на 10. Така лесно определят тук е какво? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Просто го смените с по-малко от. Ако наистина искате, можете да направите това. Но като цяло, това е те гледат накриво. И така, започва да брои от 0 е просто нещо, което трябва обикновено се използва. Сега, какво ще кажеш за цялата тази конструкция и на себе си? Тази линия 15 demarks за контур. Така че не е функция. Това е просто изявление. Това е примка конструкция, както видяхме в Scratch. И тя има три части. Забележете, че там е първата част ляво на точка и запетая. Има средната част между двете точка и запетая. И тогава там е дясната част на дясно на втората точка и запетая. Сега, първото от тях какво прави? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Назад там? Да? ПУБЛИКАТА: Инициализация. Дейвид Дж. Малан: Инициализация. И така, какво означава това? Обявен за променлива се обадих. Тя е от тип Int, защото съм посочено вътр аз. И аз съм инициализиране на стойност 0. И така, какво е това наистина да кажеш? Ефективно казва компютъра хей, дай ми достатъчно памет, достатъчно RAM, за да се вмести в брой, а след това поставете номер 0 в това парче на RAM. И като настрана, колко голяма е едно цяло число обикновено, най-малко вътре на уреда? Аудитория: 32 бита. Дейвид Дж. Малан: 32 бита. Така че това означава, че ми даде 32 бита, иначе известни като четири байта, и постави стойност 0 в нея, което е доста лесно, защото Това просто означава всички части до 0. Така че сега, втората част е състоянието. И състояние, както подсказва и името, е това, което се проверява отново и отново и отново, дали това е вярно или невярно. Така че това е просто казвам направите следните редове код - а именно линия 16, защото това е само отстъп отдолу - толкова дълго, колкото е по-малко от 10. И след всяка итерация през този цикъл, направете incrementation, което в този случай е + +. Сега, тя не трябва да бъде I + +. Това бих могъл да бъда. Но ако го направя това, какво поведение ще да бъде на тази програма? Аудитория: Това ще бъде един безкраен цикъл. Дейвид Дж. Малан: Това ще бъде някакъв безкраен цикъл, освен ако имаме късмет, след отрицателен 2 милиарда, или така. Може би нещата ще обгърне, просто от природата на крайните броя на битовете, които са разпределени за вътр. Но това със сигурност ще обхождане много повече от 10 и със сигурност повече от 11 пъти. И сега, точно както настрана, осъзнавам, че съм + + и аз - наистина са синтактична захар. Това е просто краткия запис на това, което е малко повече изрично е записано, както следва: I = I + 1. Това е идентично да съм + +. Тя просто вид изглежда по-хубава да кажа, че + +. Това е по-кратка, по-разбираеми. И така правят повечето хора, че вместо. Но това е идентичен функционално това, което току-що видяхме. Така че по-кратко, бързо решение тук е просто да кажа, че обхождане от 0 по целия път до по-малко от 10. И тогава наистина ще получите 10 звезди. Така че нека опитаме това. Нека се отвори терминала в долната част. Позволете ми да отидете в директорията, че това е инча И аз отивам да го компилирате ръчно с звъня за сега. И аз отивам за съставянето на настоящия като buggy1.c, Въведете. И сега buggy1, защо няма такъв файл или директория нарича buggy1? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да. Така че това всъщност се нарича a.out. Така припомни, ако просто звъня, където звъня компилатор и не укажете името, което искате да даде на вашата програма, това ще да фалира a.out. Така че наистина, ако го направя ли - Опа. И аз не. - Черно-бяло въпрос някои от срещнаха е фиксиран. Но позволете ми да направя това. Там имаме a.out на лявата страна. Така че ние трябва да тичам a.out вместо buggy1. Така че нека да вървим напред и да направите това. . / A.out Enter. И аз очевидно не съм направил какво? ПУБЛИКАТА: Save. Дейвид Дж. Малан: Спаси ми файл. Така че това се решава лесно като натиснете Control S, или ще File, Save, като в повечето програми. Нека отида тук, изчистване на екрана, стартирайте го отново. И все още има бъг. Така че това, което се случва - ПУБЛИКАТА: Вие не се компилира. Дейвид Дж. Малан: А, добре. Аз не го компилирате. Като идиот, аз търся код, за да видим какво не е наред. Така ехтя buggy1.c, сега a.out. Пфу, спаси. Така че изглежда малко грозно, защото няма нова линия навсякъде в програмата. Но отново, това е просто естетически детайл. И поне ако броим тези, трябва да се сега да видим 10 такива звезди. Е, какво за този втори загряване пример? Така че през buggy2, аз твърдя, че тази версия, също ще се отпечата 10 звезди, една на ред. Така че този път, аз имам един символ за нов ред, само за да нещата малко по-красива. Но вместо това, което получавате, е това. Така че позволете ми да направя ехтя buggy2.c Enter. Сега тя отново призова a.out. Enter. Виждам само една нова линия, само последния нов ред, че се движи моя ред на следващия ред. И все пак ясно съм бил печат *, а след това на нов ред, *, След което на нов ред. Но каква е грешката тук? Да? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Точно така. Така че, за разлика от някои езици, като Python, където вдлъбнатина всъщност има функционално значение, в език като C - както ще видим, PHP, JavaScript - вдлъбнатината е наистина само в полза на хората ". Така че самият факт, че съм отстъп линия 16 и 17 изглежда страхотно, но няма функционално значение тук. Ако искам двете линии да се изпълни като част от контур, тогава аз трябва да ги приложат във фигурни скоби по този начин. Можете само да намали този ъгъл и да пропусне фигурни скоби, ако какъв е случая? АУДИТОРИЯ: Само един ред. Дейвид Дж. Малан: Само един ред. Така че това е просто хубав вид на синтаксиса подробно, така че че не губете време в писане на три линии, две от които са фигурни скоби, просто да напише един ред код. Но ако имате две или повече линии, ние наистина трябва да направите това. Така че сега да ме спаси. Нека вървим напред и изпълнете отново звъня. Тогава нека повторение a.out, а сега ги получи по една на ред. Сега, a.out отново е вид тъпо име за програмата. Как мога да разбера звъня да ми даде име на файла че е по-лесен за употреба, като buggy2 себе си? А малко по-ясно? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Добре, така че аз всъщност може да вземе много лесен за употреба прекия път и просто напишете buggy2. Аз не се уточнява в. в този случай, и натиснете Enter. И това, което прави прави е за мен от съставя buggy2.c пита звъня да го направя. По-конкретно, призовава звъня, той работи звъня се използват много по- аргументи от командния ред или комутатори, отколкото всъщност трябва. С течение на времето, ние ще се върнем към това, което всички тези различни загадъчни с тирета изрази средства. Но за сега, че току-що ме спаси неприятности на се налага да помните и да пишете на всички тези различни с тирета изрази. И главата от него в крайна сметка е че сега имам buggy2. Ако искам да направите това ръчно, все пак, може вместо това да направите това - ехтя-о buggy2 и след това buggy2.c. И това също ще ми даде файл, наречен buggy2. Така че по-кратко, звъня компилатор. Уверете се, е само лесен за употреба инструмент, който ще се използва по- и повече, защото тя просто започва да опрости нещата за нас. И се връщаме 0 накрая. За сега, само защото, но ние ще започнем подигравателен тази част днес и в сряда. Всички въпроси на който и да е от това? Да? ПУБЛИКАТА: недоловим] ли в кавички там? Дейвид Дж. Малан: OK. Когато написах в кавички ли, че ми правят някаква магия зад кулисите, за да се определи бъг. Забравих, като сме казвали много от вас дискусионните форуми, да се направи - ние ще направим това сега - Sudo Yum-Y актуализация appliance50. Опа, че това, написани. Така че уредът е като операционна система. Тази операционна система, наречена Fedora. И сега заради бавния интернет връзката ми, имам наистина го промиват. Така че Sudo Yum актуализация, тъй като ние ви казвам да се направи в набор проблем, по същество е като бягане автоматични актуализации в Mac OS или Windows. И причината за използването на този в самото начало на проблема се е така, защото, когато ние създадохме уреда, объркан, и аз случайно всички ваши програми изглеждат черно на черен екран, поради което не ги виждам по подразбиране. Но най-новата версия на уреда определя това. И аз ще се определи, че по време на почивка, след като имам интернет свързаност. Така кавичките крие моя грешка, много дискретно, очевидно. Други въпроси? Да? ПУБЛИКАТА: Къде прави идват от? [Недоловим] Дейвид Дж. Малан: Добър въпрос. Когато прави? Това е Linux програма, която е съществувала в продължение на много години, дълго преди CS50. И той идва с операционна система като Fedora. Той не идва от библиотеката CS50. Всъщност, единствените неща, които идват от библиотеката CS50 до този момент, че сме виждали, са GetString, GetInt, всички тези Вземи функции, и на низ дума, и до известна степен думата булев. Но ние ще се дразни, че освен, когато се потопите в CS50 уреда. Така че, да, още един въпрос тук. ПУБЛИКАТА: Като казахте, правят и след това бъги, как компютър знаеш [недоловим]? Дейвид Дж. Малан: Добър въпрос. Така че, когато просто да buggy1 или да направите buggy2, как прави знаеш? Така че по подразбиране, ако въведете направи buggy1, да търси файл, наречен buggy1.c. И тогава той изпълнява съответните команди звъня като по този начин се преодолява файл по подразбиране продукция, наречена a.out. Всъщност, ако се вгледаме в това, което правят, какво да се откажат от това. Ако се вгледаме в това, което правят всъщност прави, да buggy2 това е вече към днешна дата. Така че нека да премахнете RM команда, програма писах преди. Въвеждане на Y-E-S, за да потвърдите, че искате да го премахнете. Ако аз сега правят, забележете, че в тази много дълга линия, е това последното нещо, което тук-о buggy2. Всичко да се прави минава този аргумент, така да се каже, за да Звъня, така че аз не трябва да си го напишете. Добре, така че бързо няколко административни съобщения. Така че за участъци, които официално започна този смешен Неделя, винаги ще искате да се въвеждат, ако имате един лаптоп. Ако не разполагате с лаптоп, постигнат от мен Пратете ми имейл. И ние ще разбера работния процес. Това, което обикновено ще намерите в раздел е, че те са част концептуално, част ръце. Ще специално раздела на въпроси, част от проблем седмица комплект, за да преминете през някои от концептуален материал от лекцията. И това е всичко в сегашния набор проблем. И ние ще се потопите в някои практически дейности, понякога от които ще се изисква да бъдат представени, понякога на които няма. Така например, тази първа седмица, те са замислени само като загряване упражнения. И вие ще откриете, че тези проблеми са наистина точно това. Те са замислени да бъдат сравнително малки, но не непременно тривиални програми, да се пишат, които не са непременно вълнуващи и на себе си, но са добри възможности за практикува с синтаксис, с нови функции, в уюта на секция, където имате няколко от съучениците си представят като както си TF. И какво ще направим с течение на времето се използва инструмент, наречен CS50 пространства, като вместо само с помощта на CS50 техника, ще вместо да отидете на уеб страница в браузъра, където ще бъде в състояние да пишат код в прозореца на браузъра по време на раздел. И тогава, ако се включите в другаря си учение може да се покаже каквото и да пишете на вашия екран във вашия браузър прозорец в предната част на класа, независимо дали анонимно или публично, така че той или тя може да преминете през с съучениците си, какво си направил добре, това, което не е добре. И отново, бъдете сигурни, всичко това може да бъде добре анонимни. Но това ще бъде прекрасна възможност за много повече интерактивност от нещо като лекция позволява. В същото време, ние ще имаме тези неща, наречени супер секции, които не са задължителни, но са отворени за всички класа, така че можете да направите това по-колективно проблем зададете една. Ето графика. Това също е публикуван на началната страница на cs50.net. Забележете, че там ще бъде хакер специфичен една утре следобед. И ние ще снимат днес и утре и след тези онлайн в рамките на 24 часа. Така че не, ако не можете да направите някое от тези времена, да се притеснявате. И отново, графикът е на линия в cs50.net. По отношение на себе си, разделящ, трябва да са придобили имейл с инструкции да отидете на началната страница на курса, за да се намери вашето раздел. Ако животът се е променил и трябва да промените вашата секция, не е проблем. Върни се, че един и същ URL, cs50.net/section, единствено число, и ще попълват подобна форма, така че можете да след това ни даде предпочитанията си. И ние ще следваме до края на седмицата, като на това, което можем да настанят. Миналата седмица се припомни, че ние предложихме CS50 Обсъждане обсъждане на курса инструмент, в лекция. Така че ние трябваше 40 въпроса, които бяха зададени и отговори по време на лекция. Така че изглежда да работи добре, така че ние ще продължим опитват да направят това. Ако по време на лекция, не само се чувстват комфортно на осведомеността ръката си, не е проблем. Отиди на cs50.net/discuss, пишете там, и един от нашето учение сътрудници или ще му отговори по електронен път или повишаване на тяхната ръка от ваше име анонимно да попитам, в зависимост от естеството на въпроса. И по отношение на обратната връзка, обикновено psets ще бъде върната в рамките на една седмица. Защото това отнема малко време, за раздели, за да се постигне равновесие, първо pset, 0 и 1, ще бъде малко забавени, тъй като нещата се успокоят. Но очаквайте, че в идните седмици. Добре, така че нека ме постави на моята сериозна глас само за миг. Така че това всъщност е интересен климат да бъде като тази дискусия, това, което с всички други неща става на територията на колежа, свързани с тях. Но CS50 определено имаше своята история на този конкретен тема, колкото всяка година, този курс, за много години, рекламни бордове около 3% на класа. Това най-новата година, 2011, CS50 Ad-качва 35 студенти. Това не е, мисля, че поради липсата на яснота. Осъзнайте, че в учебната програма на курса, има страница на обяснение, където линиите са. Същата декларация се повтаря на всеки един от проблем поставя на първа страница. Така че говорим за това днес наистина само за да хора, водени от грижата за това. И ние Опитах различни неща. И това, което решихме, че ще направим днес е просто отделете малко време, за да действително изглежда на някои от последните случаи, които са дошли. Вместо да се държи като малка мръсна тайна, всъщност точка, това, което студентите са направили и как сме открити и наистина основната мотивация е дори да водим този разговор. Така че с това каза, линията по същество е това - на учебната програма, вие сте добре дошли, вие се насърчават, за да се говори със съучениците си. Това е цялата цел като тези съвместни работно време в Annenberg и насърчаване на хората за окончателния проект да работим заедно. Но да теглим чертата, когато дойде време наистина да пиша вашето окончателно решение. Говорейки на английски език, напълно добре, говори в псевдо код, напълно добре. Изпращане по имейл на свой съученик pset, да ги гледам през екрана, ръцете продължите да пишете, над линията, както добре. Гледайте учебната програма за отделните линии. Но само за да нарисува картина как това е за съжаление действителност, осъзнаваме, че има сайтове там, че решения от този клас и много други класове. Фактът, че вие ​​или около 3% от вас знаят, че то съществува означава, че ние знаем, че това съществува. Фактът, че има сайтове като този, където можете да плаща на някого да се прави проблемните комплекти - това е действителен случай, който дойде миналата година. Това е един сайт наречен odesk.com. И Тим е името на лицето, които се публикуване на този сайт и да попита някой, който да си върши pset 7 този конкретен случай. Е, odesk.com е много Google, и ние също много добър в Googling. Тук също има сайтове - и това е по-скоро брутално, честно казано. [Смях] Дейвид Дж. Малан: Смешното нещо за този сайт, ако ви да прочетете страницата, те говорят за своята корпоративна култура и как обслужване на клиентите им е номер едно приоритет, за да сте сигурни, че вашите задачи получават се обърна навреме. Но в цялата му сериозност, отново на факта, че тези сайтове съществува, ние осъзнаваме, също са осведомени за тези видове сайтове. За да ви дам представа за това какво представлява това обикновено взема, ние обикновено не има големи скандали, където хората работят заедно по какъвто и да е вид на огромни мащаби, а по-скоро тези нощни моменти на слабост, където да има толкова много да се направи, това е 04:00 AM сте изчерпани, и вие мисля за себе си, добре, нека просто да погледнете в моя съквартирант или на моя приятел код или нещо подобно. И проявите на този, за съжаление включва Student Подаване на нещо като това и да представи Студентски B нещо като това, което със сигурност в един компютър науката клас, е изключително лесен за компютърни учени да се открие с софтуер. Това е друга често срещана парадигма, където сте вид работейки рамо до рамо на някой, може би говори Английски, само глоба, pseudocode. Но след това идва време, за да представят, и psets просто се обменят по електронната поща Dropbox или други подобни. Но в опит да се направи по-ясно, че това е какво се е случило, то това е това, което се представя. Това също не пътуване до добре написани парчета софтуер като ние всъщност трябва да се открие неща от този род. И наистина това, което правим, е изпълняване на софтуер, която сравнява всички Доводите срещу всички през изминалата година тази година изявления, срещу всичко, което намери на Интернет, срещу всяка работа сайт там. Всичко това е много автоматизирано. И така, ние правим това наистина в голяма справедливост на 97%, които наистина работят ослите им в този и в други класове и въвеждане в цялото това усилие, така че работата в крайна сметка те твърдят, е тяхната собствена. И мога да отида в продължение на векове. Това са само няколко от случаите на миналата година. Няколко студенти представиха тези файлове по същия начин за pset 2, 3 pset, pset 4, 5, pset pset 6, pset 9. В този случай, това е тест 0 и през миналата година, когато двама студентите се представи по същия начин това изречение сред много други, "Искането на типа -" точка, точка, точка. Така че дори и в клас 600 се открие това на представените викторини. Така че по-кратко, това честно казано, аз мразя да се налага този вид разговор - но това е наистина съзнателно усилие тази година, за да се опитам да карам, че броят. Защото, въпреки че казваме тези неща всеки години, мисля, че реалността, че спря на няколко още секунди от обикновено и всъщност посочва, , че това, което може да изглежда като, нали, не е толкова голям проблем, най-малко мисля, че до този момент, както в справедливостта себе си и съучениците си тук. Така че, ако някога имате някакви въпроси по отношение на линията е просто достигне до мен лично. Но отговорът винаги е, напълно е подчертано в последната минута, парични средства в края на ден. Или ако това е въпрос не закъснели ден, честно казано, ми пишете лично. Ще измислим нещо. Моля, не постави времето си тук в Харвард изложени на риск. Сега, мисля, че трябва да се облекчи настроение, така че включително и тази, като на следващия слайд. [Смях] Дейвид Дж. Малан: Този сайт беше страхотно. Аз всъщност имам разсейва малко. Е това. И тогава това беше невероятно. Добре, така че мисля, че на това коте късно през нощта, когато правите тези решения. Добре, да се върнем към по-забавно и по-сериозни неща, като условия. Добре, говорихме за кратко за тях. Това е нещо, което вероятно е доста познат от света на надраскване. И в света на надраскване, имаме нужда понякога да отивам да вилици на пътя. Направите това или онова или другото нещо тук. И когато искаме да направим това, ние можем да използвате, в C сега, това, ако друго построи. А пък тук имаме булеви изрази. Например, булеви изрази тук можем да ИЛИ заедно, в смисъл, че имаме това състояние ИЛИ това състояние. Ние можем и заедно, в смисъл, че ние искаме да проверите това състояние и това условие. И тук имаме ключ изявление, което не е така подобни синтактично на тези видове условия, но ни позволява да правим еквивалент на ако, иначе, ако друго, ако, в противен , ако и други подобни, като просто ги изброява всеки отделен случай за всеки отделен случай. Така видяхме тези, които за последен път. И тогава ние започнахме засяга неща като вериги. Видяхме една от тях само преди миг. Но има и тези за цикъл. Например, този тук. Така че, докато (състояние), направете това нещо отново и отново. Така че фундаментално, това, което изглежда да бъде различен между настоящата контур и този цикъл, докато сме тук? Това за контур и този цикъл, докато. Да? Какво е това? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Добре. Така че, като има предвид, че в контур състояние, има ясно още синтаксис. Е това инициализация, има тази актуализация. В една линия, докато има само това състояние. Така че изглежда, че това е малко сравнение спрямо цикъл, което означава, че ако искаме да имаме променливи и ние искаме да има incrementation, ние всъщност трябва да направи това нещо себе си. Така че нека да вървим напред и да се отворят Gedit. Позволете ми да преминат към уреда. И нека направим една бърза малък пример, че разграничава един от тях от другата. И тук в съзнанието ми, аз трябва да кажа едно нещо. Аз специално се споменава името Тим. Тим всъщност е някой, че един студент се опитаха да намерят, за да се направи домашните си работи за тях. Ние нямахме Тим в този конкретен раздел. Така че осъзнават, за да не разкрива един студент, той не е бил студент. Това беше случаен човек в интернет се правят нещата чрез пълномощник миналата година. Така че, ние откриваме, че също. Така че в този случай тук, позволете ми да отида напред и отвори нов файл. File, New. Това ми дава раздела тук. Позволете ми да отида напред и да го запишете като loop.c. Позволете ми да отида и щракнете върху Запиши. И тогава тук, да вървим напред и да започнете да пишете # Включват . Нека я увеличите инча Сега ние ще направим INT главната (нищожна). Сега нека да вървим напред и да направи за (INT I = 0; I < о, 10; I + +). И сега отивам да вървим напред и да се отпечатват на звездата, че направих по-рано. И след това в края на тази програма, ние просто ще отпечатва нов ред, просто така, че моят ред не изглежда всички разхвърлян. върне 0. Изглежда синтактично правилно? Досега. Така че нека да видим. Така че нека да я увеличите, в моя терминален прозорец. И ме пусна напред и стартирайте линия, защото нарекох тази нещо loop.c. Така че контур. Изглежда да съставят OK. Позволете ми да тичам линия, а сега Въведете. И изглежда, че са отпечатани 10 звезди. Така че нека просто превръщане на тази линия, докато и да видим какво видове въпроси, с които се препъвам. Така че, вместо това, да ме пуснеш тук и да кажа, докато аз по-малко от 10 - нека се отървем за контур. ОК, така че ние имаме няколко проблеми вече. Така че условието е същото, но аз съм очевидно липсва инициализация. Аз съм липсва incrementation. И така, какво трябва да компилатор вероятно да ми каже, когато се опитвам да съставят тази програма? Да? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Добре. Така че ще каже нещо като недекларирания - в този случай, аз променлива. И наистина, използването на недеклариран и идентификатор. И така, това е в контраст с езици като PHP и Python и Ruby, с които някои от вас може да са запознати, , където можете просто започнете да използвате променливи волю-неволю и не трябва да се притеснявате за да ги декларират изрично винаги. В C и в езици като Java и C + +, което трябва да бъде супер изрично. А ако искате променлива Обадих се, вие трябва да ми кажете какъв вид променлива. Така че ние ще трябва да се определи това, както следва. Аз ще трябва да отида тук и въведете Int и, следователно, Са декларирали променлива, се обадих. Сега, аз пропускат една стъпка. Аз очевидно не съм го инициализира, но нека да видим дали, че в малкото прави звъня Спри да се оплакваш. Така че нека римейк на тази програма. Добре, сега просто се оплаква поради друга причина. "Variable" аз "е неинициализирана, когато се използва тук." Добре, така че това е доста изрично. Инициализация просто означава създаване равна на стойност. И ние не сме направили това, така че нека се опитам да е равна на 0. Сега нека се опитаме това отново и отново да стартирате звъня. Съставител и този път. И аз съм за да го стартирате. Но голям стар безкраен цикъл, защото съм направил инициализация, аз съм направил състояние, но аз никога не съм правил всякакъв вид на incrementation. И така, как мога да направя incrementation? Е, в последно време контур, тя се чувства като аз ще трябва да го направи в рамките на цикъла, защото много прилича на първата седмица примери за прави примка конструкции, като с чорапи и със самостоятелно отчитане, което трябваше да направя нещо в самия край, като се върна на следващия ред. Какво ще стане, ако отида напред и това е като + + тук? Нека дори не обобщава. Хвани ме вече. Какво не е наред тук? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Така че това определено не е вътр. То аз. И фигурни скоби, както преди, Вдлъбнатината не е достатъчно. Така че сега съм тази конструкция. Така че, докато аз е по-малко от 10, отпечатайте една звезда, тогава аз нарастване. И начина, по който линия, докато работи, е, че веднага след като се удари дъното на цикъла, което в този случай изглежда като линия 10, , че ще се върна, за да линия 6, като в този момент състояние ще бъдат проверени отново. И ако аз все още е по-малко от 10, ние ще направим линии 8 и след 9, тогава ние ще удари 10, и се върна до 6, отново и отново и отново и отново, толкова дълго, колкото е по-малко от 10. Така че нека да пуснете отново направи тук. Добре, ние сме съставили по-добре. Нека повторно контур. И сега действително изглежда да работи. Така плюсове и минуси? Е, досега всъщност не е цяло на Организацията за освобождение на Палестина - Толкова е сладък. Добре, че беше - ах, че е било инцидент. Добре, нека се върнем на линия за. Така че за вериги са приятни, защото те са супер изрично. И въпреки, че те са малко по несръчност да пиша, това е много мощен и ви позволява да направите няколко неща наведнъж. Докато вериги не изглежда да има огромна сума на стойност само все още, защото тя се чувства като ние просто трябва да вършат повече работа. Ние трябва да сложим инициализация тук, актуализира тук, и ние трябва да помним, за да правя всичко това. Така че ние ще видим, че докато вериги всъщност придават себе си само различни контексти, различни данни структури като списъци и хеш-таблици, нещата ние ще стигнем до средата на семестъра. Но за сега, знам, че има този трети тип, известен като направи докато контур. И ние сме виждали това накратко. И това може да бъде супер полезни с pset 1. Всеки път, когато искам да направя нещо и след това проверете дали потребител не оказа съдействие, и ако те не го направя отново, направи линия, докато се поддава на този вид логика. Тъй като на поръчка от горе до долу тук предполага, буквално означава направите това. И ще направим това отново и отново, какво може да бъде това? Може би това означава, призовава GetInt или GetString и след това проверка на стойността на GetInt или GetString и след това викове към потребителя, ако те не са оказали съдействие, като ги помолите отново и отново и отново. Когато искаш да направиш нещо веднъж, след това проверете някои условия. Така че нека опитаме това. Нека променим това сега, за да направи линия, докато. И аз ще отида напред и да направите следното. Така че направете следното. Нека да направим Int I = GetInt (), но нека първо да съобщите на потребителя какво да правя. Така малко по-различно този път. "Дай ми INT". Така че аз ще използва ФОРМАТ за това. И сега аз ще отида тук, и аз ще направя това докато аз, да речем, по-голяма от нека да видим, аз, да речем, по-малко от 0, или аз по-голяма от 10. С други думи, искам номер 1-9, просто произволно. Така че аз съм с комбинирана булев израз тук, за да сигурен, че е по-малко от 0 или по-голяма от 10, в който случай аз ще направя този цикъл отново тук. Така че, отново да направите това - докато аз е по-малко от 0 или ще е по-голяма от 10. Така че сега да вървим напред и да направи това, след като сме направили това. Нека направим една бърза проверка на здрав разум. ФОРМАТ ("Благодаря, аз е% г", аз). Така че тази проста програма пита потребителя за едно цяло число, прави, че това е в някакъв диапазон от 1 до 9 включително, и след това благодари на потребителя, като им напомня какво те просто написали, точно като малко здрав разум проверка. Но нека да видим дали това работи, както е предвидено. Нека отида с главата надолу и изпълнете отново направи лупинг. Хмм. "Използване на недекларирания идентификатор" I ". Това е странно. Мислех, че сме решени, че. Същият симптом, но различен код. Да? АУДИТОРИЯ: [недоловим вътре двете, ние трябва да [Недоловим. Дейвид Дж. Малан: Точно така. Така че това всъщност ни води до тема, известен като обхват. Оказва се, че C, отново, това наистина ще ви отведе буквално. И ако направя нещо подобно, където Вие декларирате, вътр и след това го зададете някаква стойност, но вие, че вътре в чифт фигурни скоби, какво C прави предполага, че искат само тези 32 бита, за които е известно, както и да съществува в рамките на контекста на тези фигурни скоби, в контекста на линии От 6 до 9. Така че аз се декларира, и му се приписва стойност по линия 8, но веднага след като получите извън линия 9 под презрамки къдрава, аз вече не е в обхват, така да се каже. S-С-О-Р-Е. Това вече не е в правилния контекст. Така че сега не е I, така че това е като че ли ние дори не са имали декларирали, че тя изобщо. Така че това, което е корекция за нещо подобно, ако Причината е, че е обявен в рамките на фигурните скоби, които очевидно е лошо? Тук? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да. Така че можем да го инициализирате отвън. Така че нека да отидете напред и да изтриете декларация части, по силата на който Определяне на типа, и нека да го направя тук. Така че в съответствие 5, сега казва: "Дай ми Int." Наречете го. Забележете, в линия 9, аз не искам да правя това, защото аз вече има 32 бита. Аз не искам да попитам компютър за различни 32 бита. Искам да използвам същите тези 32 бита. И сега, защото е обявена в съответствие 5, тя все още е легален да го използвате в ред 11 и ред 12. Така че, нека се опитам да компилирате и да видим ако звъня спира да крещи. направи линия. Така че сега тя е "имплицитно декларация на функция В c99 "GetInt" е невалиден. "Какво е това? Да? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да. Така че сега, че аз съм всъщност използва GetInt, това не е нещо че просто идва с C. Това идва от CS50. Така че имаме нужда от този тук. И нека да се върна бързо надолу тук и изпълнете отново направи. Добре, най-накрая. Сега сме решени, че и друга грешка. Нека сега тичам линия и да видим какво ще се случи. "Дай ми вътр. Аз ще го дам 11. Аз ще го дам -1. Аз ще го дам Foo. Аз ще го дам 5. И сега тя наистина работи. Но бързо се променили тук поради някаква причина. Защо го казвам опитайте отново един от тези пъти, но ми дай INT останалите три пъти? Защо е това поведение е по-различно? ПУБЛИКАТА: низ. Дейвид Дж. Малан: Моля? АУДИТОРИЯ: Ти ми даде низ. Дейвид Дж. Малан: Да. Така че ние го даде низ в този трети опит, когато написах Foo. Foo е низ. Това очевидно не е вътр. CS50 начина, по който е изпълнила GetInt е, че ние не провери дали нещо не е по-малко от 0 или по-голяма от 10 за вас, защото как можем да знаем предварително какъв вид INT искате? Но ние можем да минимално проверите за вас, не на потребителя най-малко въведете цяло число? И ако не го направят, ние крещи към потребителя, като напишете "опитайте отново" на на екрана. Така че сега ние имаме програма, която е примка. Добре. Сега, кой от тях е на по-добра конструкция? Така че това е мястото, където нещата започват да се получи малко разхвърлян, факта, че трябва да се помни, да декларирате променлива тук ако искате да го използвате във вътрешността на някои фигурни скоби и извън него. Но дори и ако това изглежда малко загадъчен на пръв поглед поглед, просто отново, не забравяйте, проста логика. За да използвате нищо в C, независимо дали това е функция или това е променлива, трябва да го включи, ако това е функцията в някои библиотеката, или ще трябва да го декларира. Но сега трябва да бъдат допълнително наясно с факта, че го обявява в дясното поле. Вие не го твърде плътно вътре в скоби. Така че, позволете ми да се връщам. Ако се върнем към нашия например от по-рано, и аз отивам обратно за Int, Int = 0; <10; + +, и аз направи ФОРМАТ звезди, като това, и след това затворете скоба, и сега ФОРМАТ и сега е - според същата логика, какво ще се случи, когато се опитам да съставят тази програма? ПУБЛИКАТА: Невалиден идентификатор. Дейвид Дж. Малан: Значи това е друга невалиден идентификатор, недекларирания идентификатор. Сега, причината е малко по-различно. Има очевидно не фигурни скоби тук, но същото идея, една и съща история на обхвата. Ако сте декларирали променливи, както и във вътрешността на контур, дори ако не са изрично писмено къдрава скоби, мислете за тях психически, че все още е там, в който случай, че е валидно само вътрешността на линия за. Не е валиден, след като стигна до следващия ред, което в този случай сега е 10. Така че само няколко въпроса на обхвата и подобни. Добре, някакви въпроси? Добре, така че това е вид тривиална малка програма, отпечатване само на малки звезди. Но нека да видим, ако си спомняте тази песен тук. Това е невероятно досадно песен, децата ще пеят на училищен автобус и други подобни. Но това, което е хубаво за него е, че той има тази цикличност, което е "99 бутилки бира на стената, 99 бутилки бира. Приемайте по една, преминават около 98 бутилки бира на стената. "И тогава песента повтаря 97, след това 96, след това 95, 94, по целия път до 0, ако действително има далеч в автобуса. Така че това е хубава програма да сортирате инвентар, защото моята Боже, ако може просто да приложи това с няколко реда код, можете да изплюе на цели текстове за това песен доста бързо. Но по пътя, можем да започнем да дразни освен някои на тези основни за цикъл и сега също въведе функции, които се пишат, връщат стойности че минаваме наоколо. Но първо, защо не отидем напред и ни вземат пет минути прекъсне тук? И когато се върнем, ще пеем тази песен. Добре, така че ние сме назад. И когато казвам, ние сега ще пея тази песен, искам да кажа програмно, а не устно. Така че тук имаме beer1.c, който е един прилагането на настоящия определена песен. И само за да бъде ясна, за онези, които не са запознати с това, което това нещо изглежда, нека вървим напред и да beer1 Enter. Сега нека тичаме beer1 и какво ще видим - колко бутилки на бира ще има? Ще въведете 99, както се пее в песента. Enter. И сега, ако преминете през Опа - ако преминете през всичко това, ще видим, че това наистина пее цялата песен. Изчакайте една минута. Моят плъзгач е малко объркано. Да използваме по-голям прозорец. Така beer1, 99, там отиваме. Така че тук имаме цялата песен, изпята много по-бързо от компютър, отколкото би могло да е от нас. Така забележите, обаче, цикличен характер. Той казва 99, след това 99, след това "вземете, да го давате наоколо ", след това 98. И сега го повтаря отново и отново. Така че това всъщност е добра възможност за някакъв вид примка построи. Забележете, че аз съм един вид на намаляване на ъгъла тук. Забележете, че казвам "98 бутилки бира на стената, 97 бутилки бира на стената ", и че беше толкова че когато стигнем до един бутилки бира, не е нужно да се притеснявате за английската граматика. Но ние също може да се определи това с малко на ако състояние, може би. Ако този брой е в единствено, продължавайте и кажете "бутилка", противен случай, ако това е множествено число, да речем "бутилки". Но за сега, аз съм напълно намаляване на този ъгъл. Така че нека да видим какво имаме тук. Така че ние имаме някои коментари на върха. Аз включително тези две библиотеки, както често сме били. А сега нека превъртете надолу до първия действителните реда код. Линия 17 започва основната. Line 21 и 20 колко бутилки от бира ще има? И тогава аз наричам GetInt. И сега имам малко здрав разум проверка. Така че това е конвенция, която сега ние ще започне приемането на по-строго вход на потребителя. Понякога просто не искам да ги подкани отново и отново, и отново. Ако потребителят винтове и не си сътрудничат, добре. Спри и просто не се справят с тях. И така, това е, което правя тук. Ако N е по-малко от една, аз съм просто да крещи на потребителя, "Съжалявам, че няма смисъл." И тогава аз ще произволно връщане 1. Така че отново, това е само една конвенция, която да се използва за. За сега, вземете го на вяра. Но до сега, ние винаги сме били върне 0, защото казахме връщане 0 означава какво? АУДИТОРИЯ: успех. Дейвид Дж. Малан: Успех, това е всичко. Така че сега ние сме най-накрая започват да мислят за не-успехи - с други думи, ъглови случаи, грешка условия - сега имам един безкраен доставка, или най-малко четири милиарда възможни неща, които могат да се объркат в моите програми. И мога да започна да им зададете индивидуални номера. Сега, по принцип е достатъчно просто да се върне нещо различно от 0. Така че ние просто ще върне едно за сега. Но причината за връщане 1 е, че веднага след като се върнете 1, познайте какво се случва с останалата част от програмата? Спира. Това е всичко. Така че самият факт, че Връщам 1 е ефективно късо съединение изпълнение на тази програма, така че нищо под линия 27 ще продължи да се изпълнява. Веднага след като основни връща, това е то. Добре, така че, ако потребителят не си сътрудничат и да стигнем до линия 30 защото те въвели в законна брой, тук е моят изпълнението на тази песен. Тогава първо разпечатате символ за нов ред, само за естетика. Аз сега имам за цикъл. И забележите, аз правя нещата по малко от друга посока. Не трябва да се направи по-малко, отколкото, че не е нужно да правите + +. Вместо това мога да кажа инициализира Аз променлива, равна на N, номер на потребителя въвели в, а след това направете следното, за да дълго, колкото е по-голяма от 0, тогава аз - след като приключите едно повторение на този цикъл. Така че можем да разчитаме с помощта на линия, както добре. Сега, това е почти седмица неща сега, ФОРМАТ. Така печат "бутилки% D бира на стената." Print "% г бутилки от бира. "един дъх, преминават около" Print "% D бутилки бира на стената." Така че това е все още% D, но забележите, че аргументът за ФОРМАТ се променя. След запетая, аз имам, защото аз искам да кажа 99. След това запетая, аз имам, защото аз искам да кажа 99. След това запетая, аз имам - 1, защото аз искам да кажа, 98 в тази първа итерация, и така нататък. И сега тук, аз просто трябва някаква глупава малка забележка. И тогава линия 42, се върна 0 по силата на споразумение, което означава, че всичко е наред. И какво, ако goofed? Какво може често срещана грешка тук? Е, какво ще стане, ако случайно казах добре, аз искам да се брои до 0, искам 0 бутилки бира на стената? Така че аз казвам, че е по-голяма или равна на 0. Какво ще е симптом, че сега видя дали мога компилирате beer1 и да го стартирате? ПУБЛИКАТА: отрицателен. Дейвид Дж. Малан: Да, ще отида отрицателен. Това е по една грешка, невероятно често срещана грешка, за да се направи. Да се ​​върна към терминален прозорец и да го направя тук, така че ние можем да видите повече в даден момент. Enter, 99 бутилки бира. Затвори, но отидохме все така леко твърде далеч. Ние изпя песента твърде далеч надолу, така че сега удари отрицателно число. Така че съвсем не работи. Добре, така че лесно можем да поправим, че като се върнем към начина, по който някога е бил. Но какви са някои възможности за подобрение? Е, нека да отвори beer2.c и превъртете надолу тук и да вземе погледнете тази версия. Кое е първото нещо, което скача като различни в тази версия тук? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да, така не аз, защото го хрумна ти знаеш какво, аз искам на потребителя за N и тогава аз съм място аз равна на N, и след това съм аз променя, но аз никога не съм докосва N отново. И така, какво по дяволите е точка на разпределянето на 32 бита Обадих се просто така, че мога да имам различна променлива? Така че в този случай, аз някак признава, че ненужно дизайн функция. И аз сега ще кажа а н е по-голяма от 0, напред и да отпечатате една и съща песен, която минава N ФОРМАТ като вторият аргумент, и N - 1 като втори аргумент тук. И тогава на всяко повторение на този цикъл, давай напред и само снижаване н себе си. Сега, функционално, тази програма ще са идентични. Ако пиша в 99, N започва в 99. Аз декремент, намаление, намаление, намаление. Отивам да получите по целия път надолу до "Една бутилка от бира на на стената, една бутилка от бира. Приемайте по една, Заобикаля. 0 бутилки бира на стената. "The End, защото направих получите състояние правилно. Това е по-голям от 0. Не съм правил тази грешка. Така че, който е по-добре, версия или версия две? Чух, че един куп роптанията за двама. Защо две? Какво е това? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: О, добре. Така че няма да слезе под 0, но не забравяйте, версия едно, оригинална правилната версия не отиде под 0 или. Така че не забравяйте, че това е правилната версия. Така че нека поне се сравняват двете правилните версии. Какво е аргумент в полза на версията две са, ммм, по-добре? Да? АУДИТОРИЯ: Той използва по-малко пространство. Дейвид Дж. Малан: Добре, така че използва по-малко пространство, нали? Като има предвид, версия, което се използва 32 бита за N, и после още 32 бита за I. Версия само две използва 32 бита за N, така че изглежда да е плюс. Други мисли? Някой иска ли да се твърди, в полза на един? Да? АУДИТОРИЯ: Вие трябва да използвате допълнителен ред код за N - Дейвид Дж. Малан: Добре, разбира се. Така че това е справедливо. Така че това е просто, поне за мен - Искам да кажа, това всъщност се чувства малко разхвърлян, фактът, че Не мога да сортирате на капсулиране на моята логика в едно красива линия, за контур, като за цикъла може. Ето, аз вид трябва да халс по този н в края на цикъла, защото логично това е необходимо. Но това някак ме трие по грешен начин, просто защото изглежда отделно от логиката тук, макар че отново, че е необходимо. Други мисли? Да? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да. И какво ако вместо това, в края на песента, исках да отпечатате отново името на песента? Like "Благодаря за възпроизвеждане на 99 бутилки бира", или нещо глупаво така? Но въпросът е, ти искаше достъп до първоначалната стойност. Фактът, че сте мутирал или променени N на всеки итерация и затова са унищожени първоначалната си стойност означава, че просто не може да направи това в края. Сега, може би, ние ясно не искам да правя , че в тази програма. И така, на кого му пука? Но това е много валидна точка. И за да бъда честен, наистина никой не правилният отговор тук. И двамата са еднакво правилни. Мога да бъда убеден, така или иначе. Аз ще кажа, че като цяло, това е един добър принцип, ако попита потребителя за някаква стойност и съхранява в променлива като N, просто някак по принцип, това е вероятно добро да запази нещата. И всички данни, които искате да мутира отново и отново, само да си направите копие на тази променлива, просто така, че имат достъп до оригиналния. Харчат още 32 бита, но реалността е това компютъра, като два гигабайта RAM тези дни, и ние сме заяждане над 32 бита? Наистина не е такъв голям проблем. И дори тук, на това устройство с половин концерт или гигабайт RAM, 32 бита срещу 64 бита, не е такъв голям проблем. Разбира се днес, ще бъде начин претоварени от размера на самата програма, която ще бъде неколкостотин килобайта, ако не и няколко мегабайта, тези дни. Така основателни опасения, нито един правилен отговор. Но поне това са мисли, че трябва да започне да мине през ума си? Защото в pset 0, въпреки че наистина се очакват само коректност, или най-малкото се отказва от различни бъгове, които може да са се сблъскали, докато се движим напред, дизайнът е ще бъде друг ключов аспект, както на писане на код , а също и нашата оценка код. И така, най-малко, че неща като това. И само защото нещо работи не означава, че е добре, не означава, че тя е добре. И това е едно от нещата, на преподаване специализанти и проблемни комплекти ще ни помогне да дразни част с течение на времето. Ами, нека кажем, тази версия тук? Нека направим нещо малко секси тук в момента. Първо, позволете ми да се отърве от този. И сега нека да поправя това граматически въпрос. Така че в тази версия, искам да определи граматиката, така че , а не само да кажа скоби S, като "бутилка" или "бутилки" - Аз не искам да се намали този ъгъл - Аз също искам да динамично отпечатате думата "бутилки" или "бутилка", като по този начин се използват контейнери те% S днес. Така че аз трябва да условно да се провери каква е стойността на АЗ. И ако това е 1, аз искам да кажа "бутилка", и ако това е всичко друго, искам да кажа "бутилки". Така че, нека се опитаме да направим това. Така че, ако аз == 1, а след това ме пусна напред и обяви - Имам нужда от низ, така че позволете ми да направя струнни s1, защото това е първият низ което ме интересува в момента. Отивам да кажа "бутилка". И тогава, нека да видим, низ s2 - и ще ти обясня къде отивам в един миг - "Бутилки". Така че припомни, че в тази песен, трябва да бъде в състояние да отпечатате потенциално неща, две различни думи. Така че, ако се върнем тук, забележете, че когато стигнем до този пример тук ", две бутилки бира на стената, две бутилки бира, вземете, Заобикаля ", искам тази четвърта линия, за да се каже "една бутилка бира на стена "Така че аз трябва да се реши, не искам да кажа" бутилки "или "Бутилка"? Така че аз ще произволно да се каже, добре, Отивам да обяви променлива наречена s1, канап едно, че ще се включи тук и тук, защото тези думи са винаги еднакви, само защото на естеството на песента. И аз ще се обадя s2 думата, искам да в крайна сметка се появи тук. Сега, буквално 99 от 100 пъти, че ще бъде същото и в двете от тези случаи, защото 3 е в множествено число, 2 множествено число, 4 е в множествено число. Но в този ъгъл случай, когато стигнем до 2 и след това един или дори 1 и след това 0, имам нужда от тази логика. Така че аз трябва да прекарат известно време в моя код получаване на това право. Така че, ако го направя, ако аз == 1, а след това, s1, равни на "бутилка" и s2 равен на "бутилки", защото това ще бъде за 1 бутилка, и това ще бъде за 0 бутилки. А това тук, какво означава това? Само за да бъде ясно. Това е просто коментар. Така че самият факт, че може да има един-лайн коментари означава мога да коментирам кода си по този начин, но друга често срещана парадигма, е, че ако имате супер-кратка фраза, че искате да се поставите и това е просто по-разбираеми, да се сложи в края на линията на код, можете да абсолютно направя нещо подобно. И сега какво, ако направя това? Иначе, ако аз не е равен на 1. Така се равнява на взрив - удивителен знак е известен като "взрив". Така взрив = 1. Така че, ако не е равен на 1, какво мога да вместо искате да направите? Е, първата дума, искам да бъда това, което? Така низ 1 трябва да бъде "бутилки" за множествено число бутилки, и след това ще бъде множествено число "бутилки", както и, за сега. И ние ще видим дали това всъщност получава от нас да там, където искаме да отидем. Така че сега, ако ми превъртете надолу тук, забележете, че аз съм включите Не само аз, но S1. Аз съм включване в s1. И тогава тук, аз съм минус 1, което е същото като преди, но s2. С други думи, аз искам английската дума за промяна на базата по тази логика. Сега вече има някои проблеми в този кодекс. Какво е счупен вече на вратата? Да? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Точно така. Така че вече съм нарушил урок на обхвата. Така че аз съм обявена за S1 и S2, но аз съм го правил вътрешността на фигурни скоби, което означава, да, този код ще работи до линия 42, но веднага след като се удари линия 43, познайте какво не вече не съществува? Е, познайте какво вече не е в обхват - s1, или S2. Така че ние трябва да поправя това. Така че нека ми изтриете декларации. И аз ще оставя имената на променливите и изтрийте този тук и изтрийте този тук. И в каква насока трябва да наистина да декларира тези неща? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да, така че вероятно точно тук, 33-Иш. Така струнни s1 и след низ s2. И се оказва, което мога да направя това. Ако сте деклариране на две променливи от същия вид, всъщност можете просто да използвате запетая и че в C. Всички надясно, така че сега имам две променливи - S1 и S2. Съм ги присвояване на стойностите в тези условия тук или тук. И тогава аз ги използвате по-долу. Колко добре е това сега ще работим? Е, това е все още малко бъгав, но нека поне вижте колко далеч сме придобили. Така че нека да вървим напред и да beer3. Е тази beer3? Да, това е beer3. А сега нека вървим напред и стартирайте beer3. 399 99. Ние вероятно може да пропуснете повечето от тях. И тук, погледни това. "Една бутилка бира на стената, една бутилка от бира, едно от тях, преминават около 0 бутилки бира на стената. " Но аз привлече вниманието ви само половината от решението. Нещо прецаках тук. Така че изглежда, че на ъгъла такива случаи, когато аз се равнява на това, което двете стойности? АУДИТОРИЯ: 2, 1. Дейвид Дж. Малан: 2 и 1. Това не е една, а не 1. Това е наистина само тези последните две строфи на тази песен. Така че това, което мога вместо искате да направите? Така че изглежда, че е уловил случай, ако аз == 1, след първата дума е "бутилка", но втората дума "бутилки". Но тук искам да променя това да бъде == 2. И ако това е така, какво мога да искам първата дума да бъде? Публиката: "бутилки". Дейвид Дж. Малан: "Бутилки", така и за две бутилки. И тогава тази дума тук трябва да бъде - Публиката: "Бутилка". Дейвид Дж. Малан: "Бутилка", единствено число. Добре, нека да я увеличите, се върна тук, прегласуване направи, Re план beer3, тип 99 отново. Добре, "Сегментация грешка (ядро дъмпингови)." Какво съм сгрешил? АУДИТОРИЯ: Не е нужно стойност [недоловим. Дейвид Дж. Малан: Ах, отлична точка. Добре де, какво не е наред тук? Така сегментация вина, и ние всъщност ще видим това доста няколко пъти в бъдеще, умишлено. Но за сега, какво означава това всъщност означава това? Сегментация вина почти винаги означава, че имате по някакъв начин се опита да достъп до паметта, RAM в компютъра си, че не го направите, че не сте всъщност попитах операционната система. Така че в този случай, обърнете внимание на това, което съм направил, което е недостатъци в моята логика. Са възложени S1 и S2 стойност, ако аз се равнява на 1. Съм също така направи, че ако е равно на 2. Но аз не съм го направил в безкрайна редица други възможности - по-специално, 3 или 4, или точка, точка, точка, 99. Така че едно решение за това може да бъде само да има друго състояние. И ме пусна тук и да кажа s1 равен - какво трябва да бъде тук? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: "бутилки", защото в общия случай, това е просто едно и също нещо. Така се равнява на цитат, кавички, "бутилки". Така че за множествено число бутилки, и след това тук, за множествено бутилки. Добре, сега нека се върнем на моя терминален прозорец, прекомпилирате, прегласуване. 99. Whew. И нека да направим една бърза проверка здрав разум. Технически погледнато, ние ще искате да прочетете всичко това, за да се уверите, те са правилни, но нека да погледнем най-известните виновници. 3 бутилки, 2 бутилки, 2 бутилки, един бутилка, 1 бутилка, 0 бутилки. Ние изглежда да са най-малко го определя за сега. Но за улов тук е, че това, което бог ужасна бъркотия това е само за решаване на един глупав едносимволен граматически подробности. Така че има вид на причината, поради която съм срязал този ъгъл по-рано, защото това е напълно досадно да трябва да пиша това много код. Но се оказва, че там е малко по-елегантни начини за изразяване на точно същото нещо. И можем да направим това по следния начин. Нека оставим това на екрана за момент и въведе нещо, известно като третичния оператор. Това е вид на един лайнер, който е имал намерение да направи живее малко по-секси, както беше обещано. И аз ще направя това, както следва. Дай ми низ наричат ​​S1 и ми позволи да възлага, както следва. (I == 1)? "Бутилка", в противен случай "бутилки". String s2 получава (I == 2)? "Бутилка", в противен случай "бутилки". И така, какво тогава е разликата тук? Тези два реда код, аз твърдя, може да замени цялата тази бъркотия. Така че аз го наричам бъркотия, просто защото някак си трие ми грешен начин, че толкова много редове код. Не е грешно. Това не е лош дизайн. Например, това е напълно правилно и съвършено глоба. Но кодиране получава досаден ако трябва да изразиш себе си, така дяволите специално отново и отново, и отново, с проста сценарий като този. С някои команди, като тази. Така че това по същество се казва обяви низ наричат ​​S1 и я зададете тази стойност или тази стойност, ако съм == - Съжалявам, че трябва да го кажа по-ясно. Декларираме променлива s1, я зададете тази стойност, ако това е вярно. В противен случай, тя определя тази стойност. С други думи, това е вид начин на един ред казват, че щом друго, но това задание по протежение на пътя. Така че, ако е един, след това отидете напред и да наричат ​​това "бутилка". И след това друго, го наричат ​​"бутилки". Междувременно, s2, втората дума, че ние трябва да се определи, ако аз се равнява на 2, ние ще настроите s2 "бутилка". В противен случай, да го настроите да "бутилки". И това, което това означава, че в момента е, че може да мине през това и да изтриете всички тези редове код. И когато казвам, малко смешно, че сега това е секси, тя е секси в стилистичен смисъл. Фактът, че функционално, този код е всъщност ще направи точно същото нещо. И въпреки че това може да изглежда малко загадъчен на първия поглед, защото преди не съм виждал тази конструкция, бих твърдят, че в крайна сметка ще бъде много по- чете и така много по-лесно за нас, хората, за да сортирате разбере, защото сега можете просто да прочетете код на един ред. Тя все още е подобни по смисъл, ако, когато това е състояние и след това е това, което е вътре в ако и това е това, което е вътре в друго. Но можем да направим това само много по-елегантно. И ако сега се върнем към неговото крайно, след като заличи всички на тези линии и ги заменя само с тези две, прекомпилирате, пуснете отново бутилки бира с 99, забележете, че ми граматиката е в действителност, все още вярна. Така че отново - нещо, което да започне. 2 бутилки бира, 1 бутилка бира. Изглежда прав. Да. Така че ние имаме много по-кратка решение. Така че това също, както можете да получите по-удобно с C не, непременно с първия pset или дори второто, но осъзнават, че тези конструкции може да ни позволи да прави неща, някога по-елегантно. Сега нека да направим нещо друго тук. Нека вървим напред и да се отворят return1.c. Сега нека да започнем да реши друг проблем по начин, който ни позволява да пишат по-сложен код. Така че тук е просто малка програма, чиято цел в живота е да увеличите стойности. И всъщност, нека да направи крачка назад. Позволете ми да направите това ръчно. Остави ме да включва и INT главната (нищожна). И нека ми се обади тази increment.c. И това, което искам да направя? Отивам да вървим напред и да кажа нещо подобно - ще се обади на номерата и същ - INT х. Така INT х получава 2; ФОРМАТ X% г, на нов ред, х. Така че аз съм пишете бързо, но нещо от познати неща. Тогава аз ще направя х + +. Тогава аз отивам отново да отпечатате, че едно и също изречение. И тогава аз ще върне 0, само за да излезете от програмата. Добре, така че това е програма, която стъпка номер. Първо ще се инициализира нещо за 2 и след това е ще увеличи го и го разпечатате отново. Така че нека да тече увеличение, невероятно проста програма. Но да предположим, че искам да куб стойност, за да направи нещо малко произволно. И аз всъщност искам да направя х получава кубче от нея. Така че може да използва това, което се нарича функция Pow, но аз не наистина ли къде се намира все още. Така че аз отивам да го направим по старомодния начин. х пъти това се равнява на х пъти х х пъти. Така че аз съм cubing стойност, тя се умножи по себе си отново и отново, и отново, така че да получите мощността 3 в този случай. Така че сега трябва да бъде, както ще видим по които да се печатат - направи увеличение, така че всъщност не е наистина увеличите вече, но ние ще оставим само името - 2 и след това 8. Сега, ние имаме началото на възможност за усъвършенстване тук, при което този cubing нещо от умножаването на броя от само себе си от само себе си от само себе си се чувства като това може да бъде само полезно да има като функция, подобно на някой реши преди години - знаете, вид полезно, ако един от нас сяда и пише ФОРМАТ, така че останалата част от света да го използвате, защо не седнете и напишете функция, наречена куб , че прави това cubing за нас, така че ние не трябва ръчно да прилагане на идеята за cubing стойности тук? Така че един прост пример, но нека да вървим напред и да използват това е като възможност да напишете нашата собствена функция. Така че до този момент, ние сме използват само основната, и ние сме използвали други функции на хората, но не сме писали за нашето собствено. Така че тук ние тръгваме. Отивам да вървим напред и да напишете функция, наречена куб. И аз ще го вземат вход. Така че му вход ще бъде цяло число. И какво смяташ да правиш? Това ще обяви INT изход = вход пъти вход пъти вход. И след това ще се върне тази продукция. И тогава трябва да бъдат специфични сега. Тази функция ще върне вътр. Така че тук е как искате да пишете свои собствени функции. Първо ще се реши какво е името на вашия функция ще бъде. И като цяло, нещо обяснителен е добро, така че аз ще го наричат ​​куб. След това трябва да се уточни какво ще се върне, какво е неговата продукция ще бъде. И ние нямаме още, че много опции. Int, Чар, флоат, булев, низ. За сега, аз отивам да се придържаме с вътр, защото аз го искам да се върне цяло число. След това трябва да се уточни какво своите ресурси, ако има такива, са. И ако куб приема аргумент, взема нещо средно между скоби, трябва да се даде този аргумент име, така че може да се нарече нещо като сте прилагат или писане тази функция, а вие трябва да му се даде вид, което в този случай ще бъде Int. Така че по-кратко, куб е функция, която приема цяло число като вход и връща целочислена като продукция. Така че какво прави с този вход? Е, в ред 14, декларирам променлива наречена продукция, и аз я зададете стойност, вход пъти вход пъти вход. И тогава се върна изход. И така, как мога да използвам това? Какво мога да променя тези символи се осветяват, он-лайн 7 да бъде, не мислиш ли? ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Да, така че куб на х. Така че х е променлива, което означава, че има някаква стойност. За щастие, това е от тип цяло число. И тъй като х е едно цяло число, това означава, че може да премине в куб. И въпреки, че аз съм висш стойността на х със стойността куб х, както е случая до този момент, по всяко време има знак за равенство и линия на код, нещата в дясно ще се изпълни, и после го възлага на стойност в ляво. Така че цел на операциите е, както се надяваме. Така че тази работа? Е, позволете ми да сляза тук. Нека отваря терминален прозорец. Нека правим увеличение, Enter. "Присъщо декларация на функция" куб "е невалиден C99 "Като настрана, c99 се отнася до езика C, тъй като е определени през 1999 г., което е актуализация версия от 1989 г., което е актуализация в сравнение с оригинала. Така че това, че всички средства. И така, какво означава това, че "имплицитно декларация за функция "куб" е невалиден? "Това е точно тук. Това е точно там в линия 12. ПУБЛИКАТА: недоловим. Дейвид Дж. Малан: Какво е това? ПУБЛИКАТА: Това не е преди. Дейвид Дж. Малан: Това не е преди. Така че това е нещо. С е много глупаво, или C компилатори са много глупаво. Те наистина само това, което ви казвам тях да направят. А те, по-специално, да чете само кода си отгоре до долу, ляво на дясно. Така че, ако компилатора, звъня, чете кода си, ред 1, разбира как да направите това. О, тук идва основната. Добре, нека вървим напред и да декларирате променлива х. Позволете ми да изкара нещо. Линия 7, какво по дяволите е куб? Това не е обявена в stdio.h. Той не идва с В. Нямам представа какво да правя. И така звъня само спасява закъсали и излез с това съобщение за грешка. Така че ние може да се определи това по няколко начина. Ние можем да учим звъня куб е, като просто се движат, където декларация. Така че аз нарязани и че сте го поставили на върха на главната. Сега осъзнавам, че точно защото основният вече не е на първо място, това е все още изпълняват по подразбиране. Основно е основният. Това е името на функцията по подразбиране. Това не е от значение, когато е в файл. Но поне сега звъня е виждал куб, преди да го използвате. Така че нека да видим дали звъня сега е по-щастлив. Направете увеличение, тя съставя този момент. Нека тече нарастване. И наистина, тя изглежда да се работи. Сега, вие може да дойде със сценарии в крайна сметка, когато това не е възможно да се сложи на всяка функция над всяка друга функция. Ще се заби в този безкраен цикъл, в действителност, когато този човек иска да бъде тук, но това човек трябва да бъде там. Така че това не винаги работи. Така че, за щастие, C има по-елегантно решение. Отивам да поставите този гърба, където си беше, само защото аз предпочитате, като въпрос на принцип, че основната винаги да бъде в горната част, защото това е хубаво да се види какво тази програма прави по подразбиране. И това, което аз ще направя тук, е да декларира това, което се нарича прототип. Отивам да заявя функция куб, като буквално копиране и поставяне. Всъщност, това не е буквално. Така буквално копиране и вмъкване на ред 15 над линията 6. Няма значение какво линия завършва на. Това се случва да бъде на линия 4. Но това не трябва да бъде преди главната. Но забележете разликата. Линия 4 завършва с точка и запетая, което означава, хей, Звъня, вземете моята дума за това, че съществува функция куб, който заема вътр и връща Int. Но аз няма да ви кажа какво е още. Просто знам, че обещавам да ви кажа, в крайна сметка. И наистина, сега е добре, че това е по-долу. Така че това е по-добре, защото тогава в горната част на файл, можете да издърдорвам, бързо огън, един ред всеки, какви са имената на вашите функции, каква е тяхната входовете са, какви са техните изходи. И за да бъде по-ясно, вход обикновено означава аргумент или параметър, синоними. Изход означава връщане стойност, това, което го прави ръка обратно към мен. Така че в този случай тук, куб е обявен в горната част, но определено, иначе известни като изпълнени, на дъното. Така че сега нека се върнем тук и отново да стартирате тази. Така че сега ме пусна напред и изпълнете отново да пуснете отново увеличение. И сега не изглежда да се работи добре. Така че сега можем да вървим напред и фактор нещо като бира пример в тази четвърта версия. Така че нека превъртете надолу. И забележите, че на този урок в сърцето си точно сега. Фактът, че аз пеех същата строфа отново и отново и отново, на една и съща линия на припева в песента, филц Както и защо не мога да направя, че от фактор във функция? И наистина, това трябва да бъде един от мотивацията. Освен факта, че някой друг в света, може да искате да използвате функцията куб - това е една добра причина да вземе предвид нещо и напишете собствена потребителска функция - ако има парче код в програмата си, че просто прави концептуален смисъл, че някак си искам да му се даде име - като в този случай, хор - тогава също така могат да пишат, че като отделна функция. Не е нужно да напиша всичко в основната ако просто чувства чиста, да се отделят и да му дадете име. Така че в този случай, обърнете внимание, че имам коментар на върха тази функция, която просто пее за брой бутилки. Забележете, че тук не трябва да се обадя тези неща вход и изход. В действителност, този път аз току що се обади моят принос б за бутилка. И забележи тук, невалидни подсказва какво? Този рефрен - ПУБЛИКАТА: Не го върне. Дейвид Дж. Малан: Не връщат стойност. И наистина, функции не трябва да се връщат стойности. Те просто могат да направят нещо. Те могат да имат така наречените нежелани реакции, които в този случай е само един куп за отпечатване на екрана. Така забележите, че този код тук, аз буквално открадна от предишния пример. Единствената разлика е, вместо да използвам като моя променлива, аз съм сега с помощта б като моя променлива. Така че аз имам б тук, имам б тук, имам б минус 1 тук. Но кодът е точно същото. Но само за да ви покажа как можем да използваме това, пусни ме напред и действително да промени това да бъде за контур. за (INT I = I>, аз -). Така че аз съм откраднал, че от предишния пример. Преди това той е в линия 37, че щях да започна пее тази досадна песен. Но вместо това, аз съм просто сега ще се обадя хор от I. Готово. Така че сега във всяко повторение на този цикъл, наричат ​​това функция, хор, че се случи да пиша. Тя не е написана от някой друг преди години. Но хор, междувременно, използва ФОРМАТ да отпечатате на тези четири линии. Но факта, че аз се обаждам хор отново и отново в линия означава, че аз отивам да се получи, в самия край, една и съща песен, тъй като имам до този момент. Така че по-кратко, сега, ако погледнем назад в моя код, въпреки че функционално това е еквивалентно на, забележете, че това е започват да стават още по-разбираеми. Аз не знам точно как GetInt се изпълнява. Честно казано, аз не знам как се изпълнява хор. Но това няма значение за мен. Не ми пука, защото сега мога да сортирате, като човек, прочетете това от горе до долу. И тъй като функциите са именувани според това, което те направи, кодът е все по-четлив. Нашите програми получават много по-сложно - до края на семестъра, ще се пише стотици линии код в езици като PHP и JavaScript и като - ще откриете, че това е много по-лесно, отколкото да следите какво сте направили. И когато започнете да си сътрудничи с приятели или партньори или колеги, вие ще бъдете в състояние да напиша много повече масивни програми, като започне да упражнява тези основни градивни блокове. Така че с това каза, защо не сме го наричат ​​на ден? И ние ще се видим в сряда. Аплодисменти]