[Powered by Google Translate] Дейвид Дж. Малан: Добре, това е CS50 и това е края на Седмица 1, така че учебните карти са и общият брой на съученици, че имате тази година е 745. И ние сме толкова развълнувани, че толкова много от вас в хода този семестър, но въпреки че този курс е толкова голям, осъзнаят, че тези неща като обеди петък, като работното време, 15 души раздели и т.н., че наистина са предназначени за създаване на този по-интимна околната среда. Така че, въпреки че можем да се събират веднъж или два пъти седмично, тук в Сандърс, знаем, че голяма част от своя опит в този курс много ще бъде ръце успоредно на съучениците си и на преподавателския състав. Така че тук сме, Fall 2012. Така припомни, че последния път, когато завърши на внимание неточности, говорим за представяне на номера. И ние погледнахме в един от провалите, които са се случили в реалния свят, когато се стигна до недоразумение как работят компютрите. Е, днес ние ще преразгледаме още една от тези идеи, и продължаваме нашата дискусия на клиента CS50 и C и какво означава наистина да програмирате. Но първо, само на няколко съобщения вихрушка. Раздели започват тази неделя и първата седмица винаги е малко бърз старт, защото ние току що в раздел форми. Правим същото, сега, с преподаване събратя, сега че те знаят техния график, така че ние сме, имащ за цел Събота сутринта, за да се свържем с вас, с вашата секция задание и TF. Осъзнайте, че те ще започнат на следващия ден, неделя или понеделник или вторник. И тогава ние ще се настанят раздел промени, тъй като те възникват в идните дни. Работно време, междувременно, са отново, тази вечер, 20:00 до 11, в Annenberg, както и утре вечер. Въпреки че проблемните комплекти обикновено се дължат в четвъртък по обяд, че сте до пет края на ден, за да прекарат, следователно наличието на работно време в четвъртък, ако пари в брой в едно от онези късни дни и, като по този начин се представя нещо в петък. Позволете ми да предложа, че Дяволът е сред още по-забавно, сред по-ниски ключови комплекти проблем. И аз ще се задържат тези късни дни, стратегически, просто за по-късно през семестъра, когато животът започва да става по начина, по с изпити и други класове. Проблем Set 1, междувременно, ще бъдат публикувани на курса уебсайта този петък, като ще бъдат в хода пеша чрез видео, което ще бъде заснет в 14:30 в петък и след това публикувано онлайн от следващия ден. Така че ние приключи в понеделник. Искам да - всъщност, една бележка тук. Тъй като класовете - защото Сандърс не точно поддават себе си на случайни Q & A гърба и нататък ужасно добре, ние сме Ще се опитам нещо малко Новото тази година, с което ако не сте доволни вдигане на ръка или просто не биха предпочели да вдигнете ръката си в стая като тази, отиваме да имат някои от учебните сътрудници и CAS екипажа cs50.net/discuss по време на лекция. Така че, ако имате въпрос, защото бях напълно ясно нещо или сте любопитни за някои тема, опитайте се да го публикувате. Тагнете с етикет на лекцията, а ние ще направим всичко възможно днес и следващата седмица - Ще опитаме това - да го областта електронен или онлайн, или ако тя се чувства като ние трябва да наистина да се справят с нея масово, един от учебните сътрудници или Центърът ще вдигне ръка и да поиска анонимно от ваше име. Така че ние ще да опитам и да видим колко добре работи. Но, по всякакъв начин, да продължи да вдигнете ръце, както бихте искали. Така че последния път, когато се разкри, че 10% или една десета не е в Всъщност, 0.1, като са били обучавани преди много години. Това е в действителност, стойност, като това. Но това не е напълно вярно, нали? Ние просто трябва това ограничение в компютрите, съгласно който, ако имат само ограничено количество памет, RAM, или повече специално бита, добре, има само ограничен брой неща, които могат да представляват. Например, ако имаме нула, и ние искаме да представлява в двоичен, използвайки осем бита, където малко, отново, е нула или един, можем да го представя като 00000000. И това е малко излишно многословен. Точно както в десетичната система в реалния свят, като цяло, ако искате да напишете номер 123, хора вероятно не пишат 00000123, въпреки че, функционално, това е точно същия номер. Ние просто капка водещи нули, така да се каже. В двоичен, което можем да направим същото. Binary и нула, нула и бинарни е точно нула. Нужно е само едно малко. Но пак, най-често мерна единица в света на изчислителната техника байта, осем бита. Просто защото най-малко, доста безполезно. Осем бита, не е страшно полезно, но поне е по- полезни, отколкото една единица мярка. Така е и с осем бита, ние ще обикновено представляват двоичен. Така че тук имаме номера нула, едно, две, и след това, тъй като Нейт е в нашия видеоклип миналата сряда, можем да продължим брои до седем, до осем. И тогава, ако ние използваме все повече и повече битове, може да брои до безкрайност. Но ако имате само един краен брой тези битове, както е случай във всяка компютърна система, или дори ракети система, добре, наистина само има краен размер на прецизност. Така че, ако искате да представите номера като 0,1, добре, компютърът трябва да изберат. И ако на нея има само определен брой номера, може да представляват, може да дойде в близост до 0.1 за вас, но това не е така непременно да ви даде точно стойността, която искате. И това е само едно от предизвикателствата на компютри, под предния капак, за щастие. Като се движим по-далеч в семестъра, те по-ниско ниво детайли стават много по-малко интересна, но със сигурност прилагането на тези идеи може да има някои много реалния свят последици. Един от тях е малко по-забавно. Колко от вас са виждали невероятния филм Office Space? Ако не сте, това е неофициална домашна работа за седмица. Но в офис пространство, събратя в този филм предимство именно на тази идея, но всъщност те са откраднали от друг филм, който може да се наложи видяхме, преди дори години. Така че, нека да ви дам няколко секунди от този трейлър от този невероятен филм и това е много академично значение. [ИГРАЕ MOVIE] Всъщност аз съм се насърчава. Мога да програмирате вирус, който ще разкъса, че постави много време. Е, как действа тя? Всеки път, когато има банкова сделка, при която лихвата е компютърна, има хиляди на ден, компютърът се озовава с тези фракции на сто. Но аз няма да правя нищо незаконно. Незаконно? Самир, това е Америка. Трябва да Кълна се в Бога. Ако никой не знае за това, но нас, нали? Без членове на семейството, без приятелки, никой. [Недоловим. Не се притеснявайте, човече, аз няма да кажа на никого или. [Свършва филма] Добре, така че може би този филм по-добре, отколкото повечето хора тук, но във всеки случай, вирус, че те са били се опитва да създаде - и във филмите, по всяко време те ще се обади нещо вирус като цяло той всъщност не е вирус. Това е просто една програма, която някой е написал да направя нещо. И в този случай, момчетата се опитват да се напише програма които се възползваха от тяхната компания, наречена Innotech компютърна система, като компютри, TOO, дори когато въпрос за пари, може да не е задължително представляват пари точно. Така че, въпреки че може да имате $ 0.10 във вашата банкова сметка, 0.10, добре, компютърът може в действителност да смятате, че имате това много цента в банковата си сметка. И така, какви са тези момчета са се стремят да се направи - и те откраднал идеята, тя се превръща от Супермен III, където Ричард Прайър направи същото нещо - те са по същество писането на програми, които се стремят да вземат всички на задния номера, всички малки, малки, малки фракции от пари и източване на тези, така че хората просто мисъл, о, това е само $ 0,10, но всички тези последните номера в крайна сметка. Така че една чудесна идея и обратен ефект весело в тази специално фолио. Но в реалния свят, има много повече относно последици от тези видове неща. И една от причините да се потопите в областта на компютърните науката отново е неговата приложимост не инженерните науки сам, но само за да други области, както добре. Така че това е по-малко безгрижен поглед към това какво може да се обърка, но тя също е доста отваряне на очите, мисля, че когато става въпрос за разбиране как точно вездесъщ технологии като компютри и програмни или тези дни, под формата на софтуер. Така че това следващия клип е само около шест минути, продължава там, където бяхме последния път, но ни позволява да гледаме малко в по-голяма дълбочина в една такава на тези въпроси. Позволете ми да прескочите до там, където бяхме, което е точно тук. И ние имаме част две от две, за около шест минути тук. [PLAY MOVIE] Преследван модерни ракетни технологии. През 1991 г. с началото на първата война в Залива, Patriot ракети са имали подобен вид проблем номер преобразуване. И като резултат на това, 20 души са били убити 20 американски войници, и около 100 ранени, когато Patriot, който трябваше за защита срещу входящи Скъд, не успя да изстреля ракета. Когато Ирак нахлу в Кувейт и Америка стартира Desert Буря в началото на 1991 г., ракетни батареи "Пейтриът" разгърнати за защита на Саудитска Арабия и Израел от иракската "Скъд" ракетни нападения. The Patriot е в САЩ със среден обсег "земя-въздух" система, произведени от компанията Raytheon. Размерът на самия прехващачи "Пейтриът", става въпрос за около 20 фута дължина и тежи около £ 2000. И тя носи бойна глава от около - Мисля, че това е грубо £ 150. И самата бойна глава е високо взривно вещество, което има фрагменти около нея. Корпусът на бойната глава е проектирана да действа като едри сачми. Ракети са извършени четири в опаковка и са транспортирани от полуремаркета. Patriot противоракетна система датира най-малко до 20 години. Тя е била първоначално проектирана като за противоракетна отбрана на въздуха, за да свалят вражески самолети, в първата война в Залива. Когато тази война дойде, армията искаше да го използвате, за да стреля надолу Скъд не, самолети. The Air иракски сили, не е кой знае какъв проблем, но армията е притеснен за Скъд. И така, те се опитаха да ъпгрейд на Patriot. Прихващащ враг ракети пътуване в MACH 5 ще да бъде достатъчно голямо предизвикателство. Но когато "Пейтриът" е изпратена в експлоатация, армия не е наясно с иракски модификация, която се Скъд почти невъзможно да се удари. Това, което се случи, е Скъд, които са били идва бяха нестабилни. Те са се клатушка. Причината за това е на иракчаните, за да получите 600 км, на 300 Км ракета гама, тегло на предната бойна глава и бойна глава запалка. Така че сега Patriot се опитва да дойде на "Скъд", както и по-голямата част време, по-голямата част от времето, тя би просто летят от "Скъд". След като операторите Пейтриът система реализира Patriot пропусна целта си, те се взриви Patriot бойна глава. За да се избегнат евентуални произшествия, то е било позволено да падне на земята. Това е, което повечето хора видяха, като големи огнени кълба в небето, и неразбрани като прихваща бойни глави "Скъд". Въпреки, че в нощното небе, Patriots да бъде успешно унищожени Скъд в Dhahran, може да има не грешка за нейната ефективност. , Радарна система Patriot изгубили следите на входящо Скъд "и никога не стартира поради до софтуерен недостатък. Израелците, които първи открили, че колкото по-дълго системата, толкова по-голямо разминаване стана, поради часовник, вграден в компютъра на системата. Около две седмици преди трагедията в Dhahran, Израелците към Министерството на отбраната съобщи, че система е загуба на време. След около осем часа от, те забелязали, че система става забележимо по-малко точни. Министерството на отбраната отговори, като разказвам всичко на Patriot батерии да не напускат системите за дълго време. Те никога не каза, че това, което дълго време - 8 часа, 10 часа, 1000 часа. Никой не знаеше. Patriot батерия, разположени в казармата в Dhahran и неговата погрешна вътрешния часовник е бил на над 100 часа на нощта на февруари 25тия. Проследяват време с точност от около 1/10 от секундата. Сега 1/10 на втория е интересен номер, защото не може да се изразява в двоичен, точно, което означава, не може да бъде изразено точно във всеки съвременния цифров компютър. Трудно е да се повярва. , А да използват това като пример. Нека да броя 1/3. Една трета не може да бъде изразена в десетични, точно така. Една трета са 0,333 за безкрайност. Няма начин да се направи това с абсолютна точност в десетичен. Това е точно същия вид проблем, който се случи в Patriot. Колкото по-дълго системата се завтече, става по-лошо време грешка. След 100 часа работа, грешката във времето е само около една трета от секундата. Но по отношение на поразят с ракета пътуване в MACH 5, което доведе до проследяване на грешка от над 600 метра. Би било фатална грешка за войниците на Dhahran. Това, което се случи, е стартирането на "Скъд" е бил открит от ранно предупреждение спътници и те са знаели, че "Скъд" в тяхната обща посока. Те не знаят къде идва. Той сега е на радара компонент на Patriot система, защитавайки Dhahran, да се локализира и следи за входящи враг ракети. Радарът беше много умен. Може би всъщност проследяване на позицията на "Скъд" и след това предскаже къде вероятно ще бъде следващия път, когато радар изпрати пулс. Това се нарича обхвата на порта. След това, когато реши, е минало достатъчно време, за да отидете на Patriot назад и провери следващото място за тази DETECTED обект, той се връща. Така че, когато се върна на грешното място, то тогава не вижда възрази, и тя реши, че не е имало обект. Това беше фалшива откриване и пада на пистата. Входящо Скъд "изчезнал от екрана на радара. И секунди по-късно, той се блъсна в казармите. На "Скъд" убити 28 и беше последният уволнен по време на първата война в Залива. Трагично е, че актуализация на софтуера пристигна в Dhahran на следващия ден. И недостатък бе определен софтуер, затваряне на една глава в размирни история на Patriot ракета. PATRIOT всъщност е акроним за "поетапен Проследяване Array Пресечната точка на Target ". Добре, така че много по-скръбен резултат на не съвсем разбирането на този свят. И храна за вкъщи, наистина, от филма е, че решението имаше рестартирате системата за противоракетна отбрана всеки от време на време. И така отново, една от целите на този курс, разбира се на по-скромен мащаб, отколкото тези приложения, е да наистина много отворено и всички очи как точно да отида за вземане на машини правят това, което искате от тях да направят и как да отидете за това, че правилно, а по начина, по който го правят добре, елегантно и така нататък. И така, днес, нека да се потопите в малко повече от това, но , така че ние не отиде твърде бързо, и по-специално за тези, които по-малко удобни, но също така, че ние може да задържи интереса на тези по-удобно, нека просто бързо започват с малко рекапитулация на някои от тези идеи. И отново, попитайте, както в лицето или онлайн, ако имате въпроси, така че да можем да поддържаме всички на една и съща страница. Така че CS50 техника, бърза крачка назад, е какво, в собствените си думи? Всичко е наред, ако вие нямате представа какви са тези думи могат да бъдат все още. [Недоловим] Добре, така че универсален интерфейс - , че всички ние можем да споделите. Разбира се. Така че бихме могли, например, да ви кажа да отидат в някоя сайт, изтеглите този софтуер за Mac OS. Изтеглете този софтуер за Windows, конфигурирате в по този начин и това. Но реалността е, тогава се натъкваме на безброй технически подкрепа въпроси. А също и тези дни, много от това, което се прави от страната на сървъра, в света на компютрите, особено когато става въпрос за уеб програмиране и уеб базирани приложения, е всъщност доста често се извършва на Unix или Linux компютри, за разлика от Компютри Mac или Windows компютри. Така че сред квит, тогава се използва това нещо, наречен CS50 техника е, че ние всички ще имат една и съща среда. Така че всеки е на същата страница, без значение какъв хардуер ви дойде в колежа, но също така ще бъде в опитването на точно една и съща среда, която ще се използва към семестър в края, както и за развитие на мрежата, както и в бъдеще за реални приложения на света от него. Така че, по-конкретно, CS50 техника е безплатна парче софтуер, който ви позволява да стартирате друга операционна система, Linux, в този случай, от собствения си компютър, в един прозорец. Сега не може просто да изтеглите уреда. Имате нужда от програма, с която да играят или да стартирате уреда. И това парче от софтуер обикновено е известен като хипервайзор. Хипервайзори идват под формата на продукти като VMware, Virtual Box, Parallels. Всички видове дружества правят софтуера, както безплатно, така и търговски, така. Това, което ще видите в Проблем Set 1 са инструкции за това как да получаване на свободен софтуер, с който да стартирате CS50 техника. И след като веднъж сте се, ще има, в прозореца на вашия Mac или PC, десктоп среда, която изглежда доста като този, където тя има менюто "Старт" подобно нещо в долния ляв ъгъл. Начало папката или директорията, в горния ляв там, кофа за боклук, и така нататък. Така че ние ще дразни освен необходимите данни, като отидем. Но сега нека да започнем да се потопите в C. С този език за програмиране, подобен по дух Scratch, но далеч по-малко графично, но по ирония на съдбата, далеч по-силен, след като се разбирам с него. Така че в C, пишем програми чрез писане на изходния код, което е английски като синтаксис, подобен на чорапи демонстрация, че ние направихме последния път, който ви позволява да Изразете себе си доста точно, ако arcanely, към компютъра. Така че, какъв вид софтуерен продукт действително се нуждаят да пишат програми на език, като C, на базата на разговор в понеделник? [Недоловим] OK, просто трябва текстов редактор. Вие не се нуждаят от специален софтуер сама по себе си да пишат програми. Ти просто трябва текстов редактор като Notepad, Windows, TextEdit на Mac, или нещо, което се нарича Gedit, в света на Linux, който ние ще използваме тук. И това е всичко, за да пишат програми. Но писането е само половината от уравнението. След това трябва да ги изпълните. Но за да стартирате програми - не можете да стартирате код. Вместо да трябва да правя това, което за първи път? Да. Дейвид Дж. Малан: Трябва да съставят. И някой друг, компилирането на изходния код означава - [Недоловим] Дейвид Дж. Малан: Точно така. Превръщането да нули и единици. Тъй като всички нас, тези дни, имат компютри, които имат процесори, почти всички от които са направени от компания, наречена Intel, и Intel Inside, означава, че този мозък вътрешността на компютър, известен като процесора. И едно от нещата, които прави, че мозъкът е, той знае как да се разбере модели от нули и единици. Той знае какъв модел на бита представлява допълнение, модел представлява изваждане, какъв модел на бита представляват печат и създаване на звуков сигнал. Така че по-кратко, CPU, заедно с операционната система, което е парче от софтуер, който работи на върха на процесора, така да се каже. Взети заедно, тези две парчета знаят как да стартирате програми, които ние, хората пишат. Така че, ако аз отида в уреда CS50 тук, аз трябва да отворите произволен текстов редактор и да получите достъп до тази по няколко начина. Да отидете в Меню, програмиране, и тогава мога да изберете - Не, не това меню. Мога да отида Аксесоари / Gedit тук, за да отворите моят малък текстов редактор. Или по-просто, аз да щракнете върху тази малка икона в долния ляв ъгъл. И сега да получа тази среда тук. Това е доста напомня на обикновен текстов редактор, само с една или две разлики. В началото, когато курсорът мига сега, това е мястото, където Мога да започна да пиша код. В дъното е това нещо, наречено терминален прозорец. И какви неща мога да направя в този т. нар. терминален прозорец? [Недоловим] Добре, така че аз ще изпълняват команди. А някои от командите, които ние още в понеделник бяха малко загадъчни в първото, но ли за списък, CD за промяна директория, RM, за премахване. Така че това е нещо от старата школа начин на навигацията компютър, използвайки само клавиатурата и текстови команди, и, като цяло, не с помощта на мишката. Но ще видим, не след дълго, това всъщност ни дава малко повече мощност и малко по-голяма прецизност, с която да изразят себе си. И тогава тук в ляво, просто ще видим, като започнем софтуер за запис, малко резюме на програма, която съм писал горе в ляво. Но ще видим, че отново не след дълго. Така че нека да направим нещо по-просто. Позволете ми първо да отида напред и да отидете на File, Save, а аз съм само ще кликнете върху jharvard тук, над и в ляво, и jharvard отново е името за дома си папка, лични файлове, мен, сега е Джон Харвард, като всички вас скоро ще бъде Джон Харвард в тази среда. Той има директорията My Documents и т.н., че искам да спася, сега, този файл инча Така че аз ще да го наричат ​​hello.c. Тогава аз отивам да напред и кликнете Save, и сега това, което имам тук е раздела hello.c, толкова много като друг вид редактор. Така че сега ме пусна напред и започнете да пишете програма. INT главната (нищожна). И тогава аз просто направих последен път, ФОРМАТ за печат форматирани, ("Здравей, свят!" ); Почти завършена. Но ми липсва няколко подробности. Това, което липсва от тази програма, че аз наистина необходимо за да компилирам? Да. [Недоловим? Дейвид Дж. Малан: Да, така че аз трябва да включва стандартния I / O библиотека. Така че това трябва да премине над основната, така че аз съм просто ще направят някои стая за него. И аз ще направя # включват . И забележите, че ъглови скоби. И като настрана, Gedit е лесен, ако понякога е малко объркващо, в това, че се опитва да помогне очите забележите каква насока с какво. Така че самият факт, че моето курсорът е в непосредствена близост до този правоъгълен скоба, забележете как се подчертава друга под ъгъл скоба плюс това. И това е само за да привлече вниманието ми към факта, че да има симетрия. И симетрия в програмирането по принцип е нещо добро. По същия начин, ако се преместя курсора до края, забележете как фигурни скоби линия, за да покажат, че, да, имам отворен и затворена, така да се каже. Добре, и мога да правя нещо друго. Това не е строго необходимо, но е добра практика, да кажем, върне 0. И връщането на 0 какво прави за нас тук? Или означава какво? [Недоловим] Дейвид Дж. Малан: Но нищо не е наред. И честно казано е трудно за много да се объркат в програмирате този кратък. Така че аз съм просто е супер ясно, че всичко е наред. I, на човека, когато стартирате тази програма вероятно никога не ще виж, че 0. Като цяло, тези числа, които се връщат от главния само надигат главите на хората, когато нещо се обърка. И ще получите малко поп, казвайки на системна грешка, едно, две, три, или независимо от броя е, че действително е била върната. Така че всичко друго наред с това? [Недоловим] Дейвид Дж. Малан: Така че това не е толкова функционална грешка но естетически. Може би трябва да се постави в символ за нов ред в края на тази струна, така че да можем действително да придвижите курсора до на следващия ред и програмата просто изглежда малко по-хубава. Така че сега ме пусна да ми терминален прозорец и увеличение инча И това нещо тук, това се нарича ред. Това е просто ми напомня кой съм аз, jharvard @ уреда, където Уредът е името на компютъра, аз съм на. В скоби е това тилда, завъртулка символ, който представлява това? АУДИТОРИЯ: домашна директория. Дейвид Дж. Малан: домашна директория. Така че това е само една съкратена нотация се казва, че сте в личната си папка, където всички файлове по подразбиране. Така че сега, тук, мога да въведа ли за списък. И единственото нещо, което виждам тук в момента е hello.c. И това е добре, защото аз просто написах това. Така че позволете ми да отида напред и да правят здрасти. И забележите, аз не съм пишете направи hello.c. Вместо това, аз съм само въвеждане на база името на файла, здравей. И, както видяхме в понеделник, просто ще заключим, че искам в файл. Така че сега сте въвели направи здрасти. Сега виждам този доста дълъг команда и ще продължи виждате това отново и отново. Но за да бъде ясно, ехтя, дума, която току-що се появи, това е действителната компилатор. Уверете се, е само изграждане на полезност. Това е просто една по-лесна за ползване програма, която ме спасява, в дългосрочен план, да пишете невероятно досадно дълго команди като че един. Така бихте могли да стартирате звъня ръчно. Можете да въведете всички, че ръчно. Просто става много досадно. И така да е само една програма, която опростява живота ни и работи по-сложни команди за нас. Добре, сега какво файл трябва да имам в текущата директория ми? Не само hello.c, но също така поздрави. Така че, ако искате да стартирате Здравейте, припомни, че казвам точка наклонена черта, където матрични средства в текущата папка, където и да , и след това да стартирате програма, наречена "здравей, и наистина, сега, Имам здравей свят. Добре, всички въпроси на работния процес или синтаксиса на това, което току-що? Добре, така че нека вземем нещата отново с една степен. Така че това е underwhelming просто да се напише програма, че само не казва: Здравей, свят. Така че ние го промени, да кажем, в понеделник, здравей, Дейвид. Това е малко по-лично, но също толкова трудно кодира като първата версия. Така че не всичко, което непреодолими. Но съществува, C, функциите сигурност освен печат, функции, които ви позволяват да получите въвеждане от потребителя. И начина, по който е направил това, на другия ден, както следва. Преди да разпечатате нещо, аз за първи път нещо от потребителя. Така че нека да го направя отново. String, където S е просто произволно име, тук, за низ, се равнява на GetString. Така че това, което е GetString? Тя очевидно получава низ, въз основа на негово име. Но какво е това, по-технически? Това е функция. Така че това е функция, която не идва с C сама по себе си. CS50 екип е писал това. И така да използвате тази не може просто да включва stdio.h, Можете също така трябва да включва какво? Да. Така cs50.h, което е просто файл писахме преди няколко години. Ние го инсталирали на уреда за вас, заедно с всички стандартни файлове. И така, в тези първи няколко седмици от класа, ние ще използваме това само за да се опрости процеса на правене на много основни такива неща стават приноса на потребителите. Защото, както ще видим след няколко седмици, получаване на приноса на потребителите в език като C всъщност е изненадващо сложна, особено, защото не се знае предварително, обикновено, как много неща потребител ще въведете инча И когато вие не знаете колко данни да се очаква, не знам колко памет да се разпределят. И ако действително има състезателна потребител, който се опитва да проникна в системата ви, катастрофата вашия компютър, добре, обикновено е първият метод за атака, точно както аз направих Понеделник, въведете цялата дълга поредица от произволни символи, удари Enter, и да видим какво ще се разгражда. Тъй като, ако дадена програма, почивки, че загатва пробив в сигурността, потенциално. Това със сигурност загатва, програмист, след като направи грешка, но по-опасно, може да са направили свързани със сигурността грешка, и като цяло ще видим, че това е колко машини са изложени на риск, на този ден, както в света на интернет и програми в командния ред, като тази. Добре. Така низ и се равнява на GetString. Така че, по-конкретно сега, какво линия 6 правя тук? Така че в дясното получава низ, отнема колко аргументи? Добре. Така че няма. Малко здрав разум проверка. Аргумент, отново, е само един вход за функция да променят поведението по подразбиране по някакъв начин. Но в този случай, аз не искам да се променят поведението на GetString. Аз просто исках да се получи низ. Така че аз не слагаме нищо в скоби, а след това сложих точка и запетая demarking края на линията на код. Сега, знак за равенство, не означава, равен на себе си. Това означава, задача, която означава, сложи каквото стане изведен от дясната вътрешността на каквото и да е от ляво. Така че от лявата страна, ние казваме, че са декларирали на низ. И по-специално, ние сме разпределени вътрешна памет на които ще сложим на бита, което представлява поредица от символи. Но днес, ние сме разпределени или обявени низ. Добре. Така че сега, след като съм направил това, аз искам да се включите в стойността на не, стойността на Давид. Така че това не е защо? Така че това е просто буквално хард-кодиран и. Е да се каже "здравей," което не е това, което искам. Така че мога да направя това. Знак за процент е контейнер, но сега трябва да да премине в отпечатване на втория аргумент. Спомнете си, че аргументи към функции са разделени от запетаи, така че следващото запетая тук сложих след това писмото. И в този контекст, а е променлива и ФОРМАТ, при получаване на тези два входа - низ от ляво и променливата името на правото - ще се включите на последния в бившата за нас, и ще отпечата само хубав красив низ, съдържащ каквото и да е, че сме въвели инча Така че нека опитаме това. Отивате да вървим напред и да се увеличат, обратно да ми терминален прозорец. Zoom в дъното тук. Повторете направи здрасти. Звъня изглежда да са били повторение. Отивам да въведете / здравей, въведете. Нищо не се случва, но все пак е в този ред , че мога да пиша нещо като Нейт, Enter, и сега имаме Здравей, Нейт. И аз мога да го направя отново с Роб, и така нататък. Така че се надяваме сега, тази програма е да се държи като смятам. Сега не, всичко, което лесен. Нямам представа, това, което се очаква от мен. Така че ние със сигурност може да се почисти до малко. Нека да се върна тук, и вместо просто гмуркане и иска от потребителя за низ, нека изрично да укажете на потребителя това, което аз очаквах. Така ФОРМАТ ("Въведете низ:" ); Така че не променливи тук. Не процента знаци. Само прост английски фраза. Позволете ми сега да отидете на дъното тук и повторение моята програма. Но нищо не се е променило. Защо? Аз трябва да го компилирате. Така лесно грешка да се направи. Но вие трябва не само да запишете файла, но компилирате програмата. И така, ако пуснете отново направи здравей, сега звъня пистите. Сега мога да тичам. / Здрасти. И сега виждам "Въведете низ:". Добре. Сега тя е малко по-лесен за употреба. Нейт, Enter, здравей, Нейт. Е, нека се опитаме отново и да започнем да мислим за ъглови случаи. Така че просто като в самото начало, съветваме ви или са в процес насърчавани в спец. някак да си помисля какво може да се сбъркате, ако не се предвиди всичко, което потребителят може да направи. Bugs, следователно, може да последва. Така че, влезте низ - какво е ъгъл случай? Какво е сценарий, че аз, програмист, не може да има очаква? Да. Добре. И какво, ако напиша в редица така? Добре. Така че все още работи. Gramatically няма смисъл. Но поне работи програмата. Какво е друг ъгъл случай? Нещо, което не съм очаквал. Да? Добре. Така че бихме могли да направим нещо подобно наистина, наистина голям брой. Така че нека да направим това тук. Позволете ми да намалите за секунда, позволете ми да се подчертае. Не можете да копирате и поставите тук. Добре. Така че не мога да копирате и поставите в тази терминален прозорец, така че ние ще просто го симулират. Нека я увеличите, ще приключи. Аз няма да направя това за твърде дълго, защото тя няма да разрушават в тази програма. Но това е възможно. Enter. Но това не стана. Добре. Но това е истински случай ъгъл. И единствената причина, че се държи правилно, така че да се каже, е, защото CS50 функция GetString всъщност е проектирани под предния капак, както ще видим след няколко седмици, автоматично да разпредели повече и повече RAM, повече и повече памет от операционната система, когато тя осъзнава, уау, наистина сте написали в нещо доста дълъг. Сега, това е малко бяла лъжа. Ако ние всъщност замълча за доста време и аз напечатани в нещо като 5 милиарда символа на клавиатурата тук, или наистина хит копиране и поставяне доста, доста вероятно може да доведе до програмата за катастрофата. Само малко по-трудно да се симулира, че с краен период от време. Какво е друг случай ъгъл, можем да опитаме? Да? Да. Така че защо да не отговори нищо? Така че ние всъщност трябва да се вземат някои мерки, защото в противен случай програмата ще седи там мига през целия ден. Но ако просто натиснете Enter - Добре, сега, все още изглежда наред. Не се срине, но може би сега има възможност да започнат да прилагат по-строга програма че действително проверява. И ако низът, изречение, дума, която аз въвели има дължина 0, добре, може би трябва да крещи потребител, или да му кажа или да въведете низ отново, така че ние всъщност ще получите това, което изглежда като правилното поведение, а не само пълен контрол от моя страна. Въпрос в гърба? Десетично число. Така че можем да се опитаме, че твърде. 1.10000005. Изглежда, че това ще работи действително добре. А това всъщност се очаква. Въпреки че може би сме написали, че броят там, или по-голям брой по-рано, да разбере, че когато пишете на потребителя вход и ние сме с помощта на GetString функция, не въпрос, ако това, което съм пишете прилича номер. Спомнете си, че според ASCII, всичко на вашия клавиатурата има числова стойност, която може да бъде съпоставена с характер на знака. Така че в този случай, въпреки че може да въведете номер, компютърът се ще да мисля за него, така да се каже, тъй като низ - нещо, което изглежда като номер, но е всъщност не е номер. Но това е всъщност перфектно Segue, защото сега можем да всъщност прехода към писане на програми, които използват други типове данни. Така че, освен чрез символа, или по-скоро, освен с помощта на струните, осъзнаем, че имаме и други типове данни в C, както и в други езици. Чар, както подсказва и името, е само един символ. Плувка е стойност с плаваща запетая, и това е само фантазия начин да каже реално число - нещо, което има десетична запетая точка, при това с някои цифри наляво и / или надясно. Число е цяло число, което е само един номер, като 123. И сега по-интересно са неща като двойна. Какво казваме двойно е за последен път? Това е 64, нали. И докато обикновено поплавък е 32-битова - така че това дълго в паметта, тя използва 32 нули и единици, за да представляват ценности - двойно е буквално два пъти, че означава, че може да представлява по-големи числа, или може да представлява по-точни цифри. Така можеш да имаш повече номера след десетичната запетая, но както колегата каза във видеото, дори нещо по-просто концептуално като 1/3 не могат да бъдат представени именно от компютър, тъй като в крайна сметка вие се изчерпи на бита и поради това може да направи само .33333333 толкова много пъти, най- кой момент просто трябва да кажа, че съм на представителство пространството, аз трябва просто да го наричат ​​на ден и го представлява донякъде неточно. И дълго тъпо име, но това е, защото има данни за типа, известен като дълго в C, която неслучайно често е 32 бита, точно като число е 32 бита, но дълго е общо 64 бита. Така че това просто означава, че може да представлява по-голям номера от това. Добре. Така че, ако ние действително искате да започнете, представляваща неща, ние може да се наложи по-сложни видове, както и затова имаме низ. Така че в библиотеката CS50, че файл, наречен cs50.h, ние сме обяви тип данни, така да се каже, наречена низ, но низ всъщност не съществува. Това е отново един от тези слоеве започваш да се лющи след седмица или две и я изхвърлите, и действително погледнем под капака какво всъщност е низ и как е представена. Ние сме също така ще разгледаме булеви стойности. Така че това, което е булев в контекста на Scratch? Това е вярно или невярно. Така че това е просто стойност, това е вярно или невярно, или изключен, 1 или 0, но искате да видите в света. Така че в C, благодарение на CS50 библиотека, която на свой ред включва друга библиотека под капака, ние имаме достъп до тип данни, която се нарича булев, които ще буквално ни позволи да зададете стойностите вярно или невярно неща в програмата. Така че нека да вървим напред тук и пишат малко програма, която прави нещо, включваща номера вместо. Така че нека да се върна на CS50 техника, позволете ми да отида напред и създаде нов файл, наречен - нека просто кажем нещо по-просто, като math.c. Добре. А сега отидете до върха на моята програма, аз съм ще направи обичайните - # Включват , така че мога да използвам ФОРМАТ, INT главната (недействителни) - ние ще се върнем, в крайна сметка, какво Int тук, какво невалидни тук означава, но за сега, просто знам, че вие трябва да започнете програми като тази. Сега отивам да вървим напред и да кажа нещо малко различни - ФОРМАТ ("Дай ми номер:" ); Тогава аз ще направя INT N = GetInt, защото тя се разбра, че GetInt е друга функция в библиотеката CS50 освен GetString. И сега аз ще направя нещо глупаво, като "благодарение % г ", за десетично цяло число, а след това запетая N, и след това се върнете 0. Така че отново, върнете 0 има нищо общо с броя съм иска от потребителя. Просто означава в края на краищата, предполага се, че е добре. Така че нека да ми терминален прозорец тук. Позволете ми да въведете математика, влиза. И нещо не е наред. Направете математика не работи. Това е първата от нашите съобщения за грешки. Защо? Малко загадъчен, но - Да. Така cs50.h. Така че отново, особено в началото на, ще напиша първата си програма за pset 1 в раздели, в работно време, и честно казано, това ще бъде огромна понякога какви са тези неща действително се казва. Но ще разбереш много бързо те да започнат да падат в кофи, при които това означава, че сте спрели на # включва в началото на файла. И звъня, компилаторът ви информира за това, като казвайки: доста fancifully, имплицитно декларация за функция GetInt е невалиден. Добре. И така, какво означава това? Това просто означава, че сте имплицитно обявен GetInt в смисъл, че не са изрично декларирани. Изрично да декларират INT, трябва да се научи Звъня, че той съществува. И много просто решение за това е да го науча включително и този друг файл, cs50.h, в началото на файла. Защото буквално, какво # включват тя разказва звъня почти да намерите файл, наречен cs50.h, копиране, го поставете автоматично в горната част на програмата ми за мен, и последващо конвертиране на изходния код на нули и единици. Но това очевидно ще бъде много досаден, ако ние, хората, копиране и поставяне на тези големи файлове през цялото време, така # включват само прави всичко това автоматично, без да muddying моя код с някой друг библиотека. И библиотека е просто още един файл, съдържащ функции и други неща, които някой друг е написал, че ние сме деблокирането заради нашата собствена. Добре. Нека да опитаме отново. Направи математика. Enter. Добре. Така че изглежда да са работили. Така че нека сега тичам по математика. / Математика. Въведете ми дава номер, 123. Благодаря за 123. Сега нека се опитаме друг случай ъгъл. Низ е доста щедри, тъй като низ може да бъде всичко. Може да изглежда като брой, изглежда символи, изглежда думи. Но число е вътр. Така че сега, ако аз съм трудно потребител, и казва: "Дай ми телефонен номер ", какво ще стане, ако се опитам да направя нещо като 0.1? Е, това е номер, и е в съответствие с граматика се използва тук, но под предния капак, аз съм на Разбира се използвате функцията за GetInt. Така че нека да видим какво ще стане. Enter, опитайте отново. Добре. Нека бъде трудно и просто да натиснете Enter отново. Enter, Enter. Така че сега изглежда, че GetInt е малко по- мощен от GetString. Ние, персоналът, прилагани по такъв начин, че ако ние забелязваме не сте ни даде едно цяло число - и число е десетично число съдържащи нули, такива, двойки, тройки, четворки, петици, шестици, седмици, осмици, или деветки. И това е всичко. Не знака след десетичната запетая, без знаци, без препинателни знаци. Изглежда, че ние трябва да си сътрудничат. Така че нека се опитам четири, пет, шест, и това ме получава чрез. Така че наистина, за да бъде анален тук, може би трябва да се каже "Дай ми цяло число ", за да предаде на потребителя точно това, което възнамерявате. Сега нека помислим за под предния капак. Ние не отиваме да разгледаме как cs50.h днес се изпълнява, тази библиотека. Но ако продължава да твърди, опитайте отново, опитайте отново, опитайте отново, какво програмиране изграждане съм вероятно под капак за прилагане на това? Така че просто една линия, нали? Един от най-простите идеи, които видяхме в Scratch. Завинаги изграждане, Повторение изграждане. Предполага се, че в тази програма, под предния капак, дори въпреки че е написан на C и не нулата, прави нещо, наречено завинаги да, ако потребителят не е въвели в цяло число, да речем опитайте отново, опитайте отново, опитайте отново, опитайте отново, така че накрая, когато правим цяло число, тогава да се измъкнат от тази линия. Така че какви други функции можем да използваме тук в библиотека CS50? Е, донякъде от очевидните, най-малко въз основа на типовете данни, които ние вече знаем, съществува. Реализирахме GetString, GetInt, но и в целия първа седмица на термина, можете да използвате GetFloat и GetDouble и GetLongLong, за да получите точно типове данни, които искате. Тъй като ключов детайл тук е, че за разлика от някои езици, като Python и Ruby, където не трябва непременно да обяви тип данни на дадена променлива - не трябва да кажеш на компютъра, какви неща ти започваш да се сложи в променливата в C, вие трябва да бъдете все така точно. Така че, ако искате променлива наречена N, парче на съхранение че в този случай се случва да бъде 32 бита от Конвенцията, трябва да се каже на компютъра, че тези битове ще съхранява броя - не е герой, а не низ, а не с плаваща запетая. И това се отнася до въпрос, който ефективно натъкна на миналата седмица. Ако ние използваме нули и единици номера да представлява не само номера, но както и бакалавърска степен и Cs, как в света е компютър, трябва да знае, че всъщност този модел на бита представлява номер 65, за разлика от представляващ буква А, който случайно, в съответствие с ASCII, спомняте, беше равностоен до 65? Така че тези типове данни контекста на компютъра, така че , че не знае дали тези битове трябва да се тълкува като INT или като низ. Всички въпроси, а след това, по този въпрос? Да? Дейвид Дж. Малан: Добър въпрос. Ако вземем stdio.h, запишете файла - да ме пусне на терминален прозорец и изпълнете математика, увеличение и да въведете сега получавам друга грешка, защото аз съм имплицитно обявяване на това, което днес функционират? ФОРМАТ. Така че сега съм създал нов проблем, чието разрешаване е по същество едни и същи. Трябва да се сложи това обратно. ПУБЛИКАТА: недоловим] Дейвид Дж. Малан: О. Така че, ако аз - Добре, да. Така че, ако премахнете включването на стандартната I / O библиотека тук, а после сте, че ако мога да се отърва от ФОРМАТ, се отърве от ФОРМАТ? Да. Това трябва да работи, защото аз вече не съм с такива - ОПА. Ли просто лъжа? О, добре. Това няма да работи, защото на нова грешка, ние просто въведе. А това е малко по-очевидно. Какъв е проблемът? Неизползваните променливи N. Така че тази грешка е в резултат на нашата конфигурирали уредът е особено педантичен, наистина да крещи за всяка възможна грешка, дори ако това е вид фатална грешка като този - дали наистина е толкова голям се справят, че отпуснат вътр, поставя някои в нея, а след това що не направи нищо с него? Така функционално. Това няма да се прекъсне програмата. Това е просто глупаво, нали? Няма смисъл да попита за този номер, съхранени в променлива, ако никога не започваш да се направи нещо с него, независимо дали я отпечатате или да го спаси. Така че в този случай, звъня признава, колкото и казва неизползвани променливи N. Така че можем да поправя това, ако наистина искаме. Но отново, това не е добро програмиране. Така че аз просто може да направи това - слизат тук, позволете ми да изчистите екрана, направете математика. , Която работи. Сега мога да тичам моята програма по математика, Приема вход - добре, че е лошо. Вход, и това е всичко, което прави в този случай. Така че всъщност, нека се опитаме един друг случай ъгъл, че ние не мисля, че по-рано. В този случай - тук, нека да се върнем към този, който е малко по-лесен за употреба. Нека да се върна тук и да стартирате отново направи математика. Опа, какво съм направил погрешно? Трябва да се търкаля още по-назад. Добре. Сега сме отново в първоначалното състояние, където всички се надяваме да бъде добре. И сега, ако аз тичам математика, 123 изглежда да работи. Но това не е наистина ефективен доказателство, да кажем добре, че работи. 789, който работи. Време е да се представят. Защото има други случаи ъглови тук. Низ не наистина ни даде много проблеми при въвеждане на цяло много герои. Но какво ще стане, ако напишете в това? Натискането на номер 1 цяло много, много тук - добре, става малко скучно, така че аз отивам да спира до тук, а аз ще удари Въведете. Какво, по дяволите, се случи? Така че това всъщност може да бъде обяснено. Така го като бинарни? Добра мисъл, но не, не е факта, че тя го взе като двойна, защото наистина, това е просто вид на съвпадение. Ние можем да направим това отново. Така че няма два в двоична система, това е вероятно е достатъчно, така или иначе. Enter. Така че това не е проблем. Какво друго? Точно така. Така че обратно на това, което всъщност е едно цяло число. Това е 32 бита, които колективно се интерпретират като число. Ако имате 32 бита, което означава, че всеки един от битовете могат да бъдат 0 или 1, 0 или 1. Така че това означава, че има две възможности за тази част, две възможности за това две възможности за това малко - така че това е два пъти два пъти - така че това е от 2 до 32 мощност е общият брой на пермутации от нули и единици, ако имате 32 контейнери, нули или такива, пред вас. Така че, ако имам 2 на 32, математически, че това, което? Така че това е много. Това е 4 млрд. евро, или да даде. И 4 милиарда не изглежда да бъде това, което е отпечатана тук. В действителност, това изглежда близо до 2 млрд. евро. Но това не е случайно. Фактът, че компютъра ми е погрешно огромен брой, моята огромна поредица от единици и след това ми огромна последователност от двойки, около 2 милиарда евро, се обяснява как? Има една капачка на вътр. Има определено е максималната стойност, която може да представлява. Но това обикновено е 4 млрд. евро, нали? Ако от 2 до 32 е около 4 млрд. евро, който изглежда като това е най-големият брой. Така че не остатък, но една добра мисъл. Отрицателните числа. Така че, ако имате 4 милиарда възможни неща, които могат да представлява различните пермутации на 32 0s и 1s, добре, че има причина, че ние, хората, може да искате да представляват не само положителни числа но отрицателни числа. И наистина, това е предположението, че C прави. Така е и с 32 бита, може да представлява грубо отрицателен 2 млрд. по целия път до положителен 2 млрд.. И така, в този случай, това, което ние наистина виждаме, е само периферията на капацитета на нашата число, и ние имаме, така че да се каже, препълни цяло число. Опитали сме се да се тъпча повече битове в него, отколкото всъщност може да се побере. Така крайният резултат е, че по същество всички 1 бита. Сме обърна на нашите бита на, ние сме се опитвали да представят възможно най-голям брой, но явно не е почти достатъчно голям, за да представлява две неща, които току-що сте въвели инча Да? ПУБЛИКАТА: недоловим] Дейвид Дж. Малан: Добър въпрос. Защо не можем просто да декларирате, че отрицателен подпише само като характер? Така че ние абсолютно биха могли, и бихме могли след това да запишете допълнителен бит. Но ти все още ще трябва да декларирате, че тире, и , което ще ви струва най-малкото нещо, вероятно малко. Така че, да, ние може да има 32 бита, използвани за нашия номер, но сега имаме нужда от още малко за нашия тире символ, знак минус. Така че сега имаме 33 битови стойности, които бихме могли да направим, но това е просто не е начина, по който това е направено. Взехме решение разговори години, 32 бита е нещо като единица мярка тук. Така че ние ще използваме един от тези битове ефективно представляват негативизъм и 31 бита да представляват номера. Други въпроси? Добре. Това е много. Защо не отидем напред и пет минути почивка тук? Добре. Така че отново, за да не се надцени математическите приложения на програмирането, нека просто да извади този пример преди да преминем в други конструкции, просто защото ще илюстрира няколко общи препъни точки по някои от основите, когато става дума за писане на програми. В този случай, прави аритметични изрази, които имат някаква интересно значение за синтаксиса. Така че това е само една формула, с която можем да конвертирате температури от Фаренхайт към Целзий. Ако не си спомняте, това е просто формулата. Така че, ако се включите по Фаренхайт стойност от 32 градуса, което е замразяване, ще бъде 32 минус 32 е 0, и наистина, 0 в градуси по Целзий е нулата. Толкова бързо здравия разум проверите там - това е познатата формула. Оставете ме да премина на уреда, обаче, и да започне написването на програма, наречена като f2c "Фаренхайт към Целзий точка в ". И в горната тук, аз ще започнем с # включват stdio.h, и аз ще направя INT главната (нищожна) и отново ще се върне в бъдеще, какво Int там и какво означава невалидни. А сега да отида напред и да въведат програма, която по същество прави това преобразуване за нас. Така ФОРМАТ, нека кажем, температура по Фаренхайт. И тогава ме пусна напред и да получите стойността от потребителя. Каква стойност трябва да получа от потребителя, ако искам да ми даде температура по Фаренхайт? Да? Какво бихте предложили? Да. Така плувка се чувства доста разумно. Имаме отново, само няколко опции, които сме виждали до този момент. Имаме неща като Чар, двойно, плувка, вътр., Дълго, дълго, показва, низ. Така че, тези, флоат се чувства доста разумно. Можем да използваме двойно, нали, защото ако ние наистина искаме да представлява температура на човека - 98.60000 - бихме могли да се използват 64 бита, за да направи това, но тя се чувства като Overkill за температурата. Така че нека просто отидете с плувка. Сега имам нужда от една променлива. Само да запазим нещата прости, аз отивам да го наречем е, но аз може просто както правилно го наричат ​​температура, но или е добре. Така че плува F = GetFloat. Веднага след като сега са решили да използвате GetFloat, все пак, аз трябва да се направи една корекция. Да. Така че ние трябва да # включват , в противен случай компилаторът е ще крещи по нас. Сега, когато имам поплавък, нека вървим напред и да направим преобразуване. Така че, първо, нека да получите в навик, тук коментира моя код. Така че, отново коментар е просто нотация за човека, който е не са част от програмата сама по себе си, но това, ви помага разбере какво си направил на следващата сутрин, или на следващия месеца, тя помага на преподаване колегите си да разберат какво си направил или това, което възнамеряваше да направи, така че е като цяло много добра практика. На всеки няколко реда код, напишете коментар за себе си или вашия колега. Така че тук, аз отивам да се каже, "Искайте потребител за температурата. Не трябва да бъде пълно изречение, само на кратка фраза. Но идеята зад коментира в C е, че всеки от вашите коментари трябва да ти даде сила - или, да речем, TF или колега - обезмаслено програмата си и да разберат какво точно се прави, като не толкова много четене на код, но от четене на коментари, които трябва да бъде кратък и ясен. Добре, така че сега да отида напред и да каже, "Convert Фаренхайт към Целзий. "Така че аз ще отида напред и да направим, да речем, плува в. Ние ще продължаваме да Целзий като стойност с плаваща запетая. И нека се хладно оръжие в това. Формулата е отново тук. 5/9 пъти F минус 32. Така че нека да го направим. Така че 5 разделена на 9, минус - Опа, аз го вече побъркани. Times. Така че 5/9 пъти F минус 32. Така е минус 32, точка и запетая. И сега, тук, аз отивам да вървим напред и да кажа, отпечатайте резултат. И тази част е лесно. ФОРМАТ. Как да отида за печат? Е, бих могъл да кажа "Този брой в градуси по Целзий е% е \ N", само за някои естетика. И тогава каква стойност искам да включите тук ФОРМАТ. вторият аргумент? Добре. Така че просто в. Така че ние ще започнем с това, и след това просто ще върне 0. Отново, това има нищо общо с математиката. Това просто означава, че всичко е наред. Сега, това е правилно, тази програма? Добре. Така че съм направил някои грешки. Дори ако вие нямате представа какво програмиране, можете да сортирате на гърба на безплоден началното училище какво грешки тук може да бъде. Какво е един от първите? ПУБЛИКАТА: недоловим] Дейвид Дж. Малан: Да. Така че ни липсва скоби. Е било умишлено, че го направих скоби в тоника плъзнете тук, защото всъщност има това понятие за на операции или предимство на някои операции - умножение - имат по-висока задължителен, имат по-висок приоритет, отколкото неща като събиране или изваждане. Така че ние сме направили това в продължение на години, само за да стане ясно точно каква математическа операция трябва да се направи на първо място. Така че може би трябва да имитират точно това. В противен случай, компютърът вероятно ще се опитам да направя нещо подобно разделение 5 от 9, а след това умножава F, след което се изважда 32 от цялото това нещо. Което не е, всъщност, това, което искаме да направим. Така че нека да вмъквам. Нека добавим ми скоби, скоби тук. Нека сложим това тук. Ето, аз просто забелязах друга грешка, която направих по протежение на пътя. Да? ПУБЛИКАТА: недоловим] Дейвид Дж. Малан: Ah. Добре. Така че ние всъщност имаме същото число разделение въпрос от преди. Поправи това, нека да видим какво е симптом. Но ние ще трябва да се коригира Другата грешка тук. Да? ПУБЛИКАТА: недоловим] Дейвид Дж. Малан: Да. Така че, глупава грешка съм направил, но невероятно важно. Компютърът не е просто ще си затворим очите и да ме използва капитал F, когато всъщност обявява променлива като малки е тук, в съответствие 8. Така че аз трябва да се коригира в ред 11 ми капитализация, които преди малко е бил столица F по погрешка. Ами тук? Ако това е с малки букви, както и? Тя трябва да бъде, но това е съвпадение. Е, че% има нищо общо с променлива. Така че просто да бъде супер ясно, позволете ми да отида напред и преименувате това, накратко, "температура". Позволете ми да преименувате тази "температура". Нека не преименувате този. Защото, отново% е ​​в световен мащаб означава, "плаваща запетая стойност." Няма нищо общо с променлива. Но "температура", навсякъде е само малко по-многословен, така че аз отивам да се върнем към малка буква "е" S. Сега, нека да вървим напред до прозореца ми тук. Направете f2c - което, отново, произволно име даде този файл. Изглежда вече са го изготвили. Нека ме прегази f2c. Enter. Температура по Фаренхайт - нека го направим лесен. 32. OK, поправи. Но, ако аз сега правя 212 за кипене - пука. Добре. Затова е ясно, не се коригира, ако си TF се опитва най-малко две стойности. Така че какъв е проблемът тук? Е, вече постави пръста си върху какъв е проблемът. Но защо е, че по случая? До тук, когато правя разделени по математика от 5 до 9. Така че концептуално, това е съвсем верен. Изцяло в съответствие с формулата. Но компютри само точно това, което да им кажа да се направи. И това, което ние сме ефективно казваща на компютъра, тук е разделят цяло число 5 от цяло число 9 и ми даде резултат. Проблемът е, че все пак, когато се разделение използване на данни видове, изходът е един и същ тип данни като входовете. И така, ако двата входа са двете цели числа, изходът ще да бъде вътр. И така 5 разделена на девет точка е нещо. Но това, което е най-близкото цяло число да посоча нещо? Така че, всъщност е 0. Така че, както говорихме в понеделник, всичко след десетичната точка получава отрязва. Тя просто се хвърлят. Така че това е пълна грешка, тъй че може и просто умножете всичко от 0 тук. Сега, мога да оправя това по няколко начина. Бих могъл да направя това. 5.0 разделен на 9,0. Технически погледнато, аз не дори да се наложи да го направя. Тя не е достатъчно просто да се направи една на числа с плаваща запетая - или двойно - от поставянето на десетичната точка тук. Защото това, което се случва в момента, е, когато се раздели едно число от поплавък, или двойно, компютърът ще го осъзнае О, един от тях е по-точен. Позволете ми да се заблуждават от страна на който ви дава по-голяма точност, отколкото сте възнамерявали. Така той ще се конвертира в резултат - тя ще се върне като стойност с плаваща запетая, както и резултатът. Така че това ще проработи. Това ще работи. А има и един друг механизъм, който ще видим в -подробно следващата седмица. Можете всъщност, като програмист, кажете на компютъра действително лечение на един тип данни като сякаш беше друг. Така че аз в действителност може да направи това. В скоби, мога да кажа нещо подобно (плувка), отворени скоба, в близост скоба. И това е, което се нарича "Кастинг". Отново, по- това следващата седмица. Но това е само програмна начин да кажете компютъра, да знам, девет е цяло число или дълго. Знам, че не е стойност с плаваща запетая. Но да го третирате като така или иначе. Така че, за да се хвърли тип данни означава да конвертирате от единия към другия. Честно казано, това е малко грозно, така че ще предложи да отидем обратно към първоначалното предложение на точно конвертиране тези неща ръчно стойности с плаваща запетая. Защото сега това е просто супер ясно какво става, и това не е всичко, което отвлича вниманието. Така че, нека сега се върна в моя терминален прозорец. Направете f2c. Позволете ми да отида напред и да стартирате тази. И, както настрана, вие се отегчават пишете тези команди отново и отново, да разбере, че компютрите, като Linux, са склонни да бъдат доста умен. И ако аз хит, ние може да премине през цялата ми история команди, нагоре и надолу. Така че в този случай тук, може просто да отидете да тече f2c. Аз да ви крещят, защото аз просто го направи преди секунда. Той вече е към днешна дата. Така че сега мога да тичам f2c отново. Нека се опитаме 32 по Фаренхайт. Сега нека се опитаме 212 по Фаренхайт. Пфу. Изглежда да работи. Сега, това е добре, но тя се чувства малко произволно, че Аз съм показват шест цифри след десетичната точка. Нали? Ако сте лицето времето по телевизията, вие сте вид на doofus ако четете на температурата до тази степен на точност. Така че нека да се опрости тази процедура. Така че нека да отиде тук, за да ми ФОРМАТ. И да, искам да плува. Но аз искам да уточни прецизност. И аз ще да бъде малко по-кратка. Отивам да се каже, дай ми една точка след десетичната запетая. Така че вместо да казват% е, аз отивам да се каже% 0.1 е. И това просто означава, дайте ми една позиция след десетичната запетая. Добре. Нека опитаме отново. Нека отново го пуснете след съставянето. И сега пиша през 32, и се върна на по-кратка стойност. И аз мога да въведа, сега, 212, и да се върнат по-кратки стойност, както добре. А има и други неща, които можете да правите с ФОРМАТ. Всъщност можете да определите колко широка трябва да бъде номер. Ако искате да имате подложка върху него, така че можете да десния съгласува или ляво-приравни всички номера или се опитват да център неща. Така разбирам, че има малки трикове, които можете да направите там. Но те просто се свеждат до формат кодове, като имаме там. Така че по отношение на този въпрос на приоритет. Това е много скучно масата, за да мине през методично. Но осъзнават, че авторите на C излезе с правила, които да посочват кои оператори имат по-високи предимство, по-обвързваща сила, отколкото други. Така че, като има предвид, че в началното училище, ние обикновено се знаеше, че е умножение и деление, събиране и изваждане, тогава някои други неща. В света на програмирането, има много по-дълъг списък на нещата. И това не е нещо, което си струва запаметяването сега. Ще се аклиматизират към него преди време. Но както и в началното училище, скоби реши въпросите на предимство, от Super Clear компютър, така и човешки какво е предназначен. Така че, помисли това е просто малко лист измама. Но по-голямата част от тези детайли ние няма да стигнем до известно време. Добре. Сега, нека да изгради и да се премести далеч от тези глупави малко математически примери. Все още използват същите принципи, но започват изразява себе си малко повече като Scratch. Така че в самото начало, имахме тези булеви изрази. И на английски език, булев израз е това? Вярно или невярно. Това е нещо, което се изчислява на вярно или невярно. 1 или 0. Включен или изключен. Каквото и да искате да го наречете. Сега в Scratch, парчета пъзел изглеждаше така. И това е комбинация, на дъното има от три пъзел парчета. Една връзка - нещо, което е празно и празно. И тогава две булеви изрази вътре в него. Така че можете да гнездят булеви изрази, за да получите повече сложно булеви изрази. Например, ако е събота, и това е хубаво време, а след това да излезем навън. Или нещо произволно подобно. Така че можете да се присъедините булеви изрази, за да излезе с по-голяма стойност за истинност, чиито отговор се основава на по-малките. Сега, в C, слава Богу, това картографиране е всъщност е доста проста. Скоби, за да направим нещата по-ясно тук. && Е какво означава "и". Ето как отиваме да конвертирате тези блокове от нулата C. И за условията видяхме в Scratch, на лявата ръка страна, мога да ги стека по подобен начин в C. Ако х е по-малко от Y, а след това направи това. Иначе, ако х е по-голяма от години, след това направете това. Иначе логично те трябва да бъдат равни, така че при че те са равни. Така че ние вече могат да започнат да градят тези неща. Така че нека да направим един пример. Позволете ми да отвори файл, който е на уебсайта на Разбира се, че Писах по-рано. Това се нарича nonswitch.c. И ще видим защо само за миг. Така че в този файл - nonswitch.c - първо да осъзнае, че има цял куп коментари най-отгоре. Това е просто обяснение на името на файла, какво прави, и така нататък. И това очевидно демонстрира използването на Boolean И, conjoining два израза. Така че нека да видим как работи тази програма. Включа моите два файла, cs50.h и stdio.h. Ако превъртете надолу, сега към програмата, тя е малко по-дълго отколкото сме написана преди, но доста четене. Така за първи път печата на потребителя, по линия 18, "Дай ми цяло число между 1 и 10." Така че е точно там. Сега цяло число. Но осъзнават, че GetInt - доста проста. Просто ще получите вътр. Това ще гарантира, че тя не получи едно цяло число и не низ или число с плаваща запетая. Но това няма да направи какъвто и да е вид на границата проверка. Няма да филтрирате номера, за да бъде между определен диапазон. Така че ние имаме за изпълнение на това себе си. Така че просто като Scratch, където бих могъл да направя връзка на два израза, мога да направя това в C, както следва: Ако N е по-голямо или равно на 1, и N е по-малка и или равно на 3, аз отивам до много произволно постановление, че номер на малък брой. Само за целите на изявление. Иначе, ако N е между 4 и 6, печат "качват средно номер. "Иначе, ако N е между 7 и 10, печат" избра голям брой "Иначе печат" Вие избирате невалиден номер. " Защото е логично, че следва, ако сме изчерпани нашите граници. Така че, разберете, това не е точно как пишем по-голяма или равен в клас по математика. Нали? Обикновено го изготви по този начин, с линията под него. Но няма такъв бутон на клавиатурата. Така символ в C за изразяване на по-голямо от или равна на два знака, а символът за по-малко от или равна на два знака, както добре. Добре. Така че, ако използвате тази програма, можете да предположите какво е ще направим. Ако отида напред и да nonswitch Enter. И тогава nonswitch. Дай ми число между 1 и 10. Аз ще го дам 11. Взех невалиден номер. Нека се опитам номер 3. Взех малък брой. Така сравнително лесно. Ами ако искам да се промени поведението на тази програма и направи нещо малко по-различно, а? Нека вървим напред и да кажа това. Позволете ми да се отървете от всичко това. И позволете ми да кажа, ако (N == 42). И тогава аз ще да вървим напред и да се каже за печат "Избра правилният отговор. "Иначе ние ще вървим напред и да кажем, ФОРМАТ ("Избра грешен отговор "); Добре. Просто защото. Сега, няколко точки, можем да направим тук. Първо, аз не въведете символ, че човек би си помислил, че е най-разумно. Когато искате да проверите равенство Оказва се, че не използвате знак за равенство. Вместо това използвайте равен знак за равенство. И защо може да стане това, просто интуитивно? Да. ПУБЛИКАТА: недоловим] Дейвид Дж. Малан: Правилно. Знак за равенство вече се използва за възлагане. Някой наистина не мисля, че това. И така, сега, когато става въпрос за тестване на равенство, ние трябва да бъде по-ясен, и да кажа равнява равни. Много често срещана грешка е да се направи това. И, ако в работно време или през следващата седмица или в следващите две седмици направите нещо подобно и след това се борят с него в продължение на 10, на 20 минути се опитвам да разбера какво по дяволите бъг е, разберете, че вие ​​сте един от тези хората, които са направили тази грешка. Така че, супер лесно да се направи. Но целта е да се предотврати тази грешка. Това може да се оцени, защото това, което е наистина казват? Ако N получава 42. Така че глаголните хора използват устно, за да се изрази понятието за възлагане е "получава." Така че, ако N получава 42. Така че това означава, че възлага от 42 до N. Сега имам булев израз в скоби, вътре в това състояние, чиято стойност е 42. Нали? Защото, ако го оценят от вътрешната страна, общият брой отговор, сега е 42. Така че, ако ви зададе въпроса, "ако (42)," това, което е че наистина говориш? Е, булеви изрази може да бъде само истина или лъжа. 1 или 0. Включен или изключен. Така че, изглежда, имаме случай ъгъл, който всички на внезапно, аз казвам "ако (42)". Това не е булева стойност. Така че това, което компютърът направи, обаче, е, че по същество той се приравнява нещо, което не е 0 се интерпретира, за да е истина. 1. On. Всички те са функционално еквивалентен. Само стойност 0 или ключова дума е невярна, тъй като ние ще в крайна сметка виждате, всъщност е фалшива. Така че, "ако (42)" всъщност ще бъде вярно, защото тя не е нула. Така че, за да бъдем по-точни, булева стойност не е чак толкова много вярно или невярно, но за това случай, ако е 0 или ненулева. Толкова невярна или не е фалшива. И това ни позволява да обхване още по- възможности в вмъкнат израз. Така че ние трябва да казват, все така внимателно, че това - ако (N == 42). Просто защото ние трябва да се уточни тест за равенство, не е присвояване на стойност. Какво друго е отбележи тук? Тези фигурни скоби, които всъщност не са необходими. Съм ги правиш само за да бъде гнида-придирчиви тук. Но когато имаш условие, че има само един ред код, за удобство, програмисти не трябва да използвате фигурни скоби. Достатъчно е просто да тире от естетически съображения, и след това напишете вашата линия на код. Само когато искате да напишете два реда код - за Например, в противен ФОРМАТ ("Чао!"). Ако искате да направите , че това е счупен. Можете да тире всичко, което искате, но е факт, че имате написали два реда код, без да се използват фигурни скоби означава, че тази програма няма да работи коректно или може да дори не съставят правилно. Така че за сега, да бъда честен, мисля, че най-добрия навик е просто използват фигурни скоби, и вие ще откриете, че те правят супер ясно какво се случва. Също така, както настрана - особено ако сте сред тези, които използват препоръчваните книги или онлайн ресурси осъзнават, че има това понятие за стил в програмиране. И някои хора предпочитат да постави фигурна скоба тук на линия. Някои хора предпочитат да правят абсурдни неща, искал да ги слагам тук. Няма по-грешен отговор, когато става въпрос за стил, но това е погрешно. Но някои хора го правят. [Смях] Дейвид Дж. Малан: Споменавам това сега, просто защото като можете да прочетете на нещата в книги или онлайн, ти започваш да се получи различни съобщения от различни учители и различни автори. И просто осъзнаваш, че функционално, те са еквивалент, но бъдете последователни. Така че в този случай, ние ще стандартизират къдрава скоби се редят на опашка в ляво. Добре. Така че нека да вървим напред и стартирате тази, и да видим какво ще се случи с тази програма. Направете nonswitch. След това стартирайте nonswitch. Дай ми цяло число между 0 и - така че не е от значение вече, но аз съм просто ще произволно да се каже 42. И взех правилният отговор. Е, сега, нека да вземе това в различна посока. Оказва се, че е някакъв друг синтаксис може да се използва в програмата. Ето едно ново парче на синтаксиса, който е функционално същото, но просто въвежда друг начин да изрази себе си. Така че това е, което се нарича "преминаване изявление." И ключ изявление работи, както следва. Това отнема в скоби, стойността, която искате да "Преминаване". Искаш ли да се държат по различен начин, въз основа на стойността му. Така че това означава включване на стойността на N. И какво означава това? Е, ако N е 1 или 2, или 3, давай и да разпечатате " вдигна голям брой "и след това почивка. Причина за разпадането е, че начинът, С работи е както веднага след като намери случай, че отговаря, тя започва изпълнение на кода по-долу. Така че, ако имам един ред код, както аз правя тук по линия 27, ще се изпълни. Ако добавите друга линия, той ще се изпълни. Друга линия тук, той ще се изпълни. Програмата само спира изпълнение на това, което е под приложимата съдебна изявление, когато изрично казват "счупи." Толкова лошо. Точно така, в този случай, като резултат. Дело 4 или 5 или 6, по същия начин, ще да отпечатате съобщение. В този случай, среден брой. Почивка. Дело 7, 8, 9, 10, че ще ходи да изпишете "вдигна голям номер. "Break. И тогава там е буквално ключови думи, наречен "по подразбиране" това е ефективно като "друг" изгради. Така че нов синтаксис, но интелектуално, нищо нов тук. Това е точно като нулата. Ако, в противен случай, ако друго, ако вид на блок. Така че това е включен версия на тази програма. Но забележете, че ние го направихме с номера тук. Нека се отвори втора версия, само за да покаже нещо малко по-конкретен. Така че тук имаме степени. Оказа се, можете да използвате ключове не само числа, но символи. Не във всички типове данни, но най-малко знака. Така че тук, бихме могли да направим нещо подобно, ако стойността на C, че потребителя написали, в ред 19, от използване на GetChar функция, е столица A или малки, нека го тълкуват като степен, и казват, че качват отличен успех. И надолу по отчета за ключа, имаме ли друг дела за "Б" и "C", и така нататък. Но нека сега завършвам едно друго нещо. И отново, вид, плаващи през някои от тези примери. Но това е наистина така, че можем да ги прилагат, сега - или наистина, просто ги преведат сега - на C. Така че нека да вървим напред и да направите това. Отивам да се отвори нов файл. И аз ще да го включват . И тогава аз ще направя INT главната (нищожна). Позволете ми да запишете файла като loop.c. Само като пример. И аз ще отида напред и да направите следното. Искам да напиша много досаден програма. Така 10. Нека го направим. 9. Добре. Веднага след като започнат да правят това в програмирането, вие сте вероятно прави нещо нередно. Но ние ще започнем от там, така или иначе. Опа. Това всъщност е погрешно. 7. 6. 5. 4. Нищо няма да се случи, когато стигнем до 0. 3. 2. 1. Добре. 0. Изтрий. Добре. Така върне 0. Така че тази програма очевидно ще направи това, което много досадно казва, че ще направи. Това ще да отпечатате всички тези ценности, от горе до долу. Така че нека да ме правят контур. И тогава - ОПА. Направете примка. Бях в грешна директория. А сега нека тичаме контур. Enter. Ура. Много хубаво. Ница, програма. Добре, но сега нека да направим това по-добре. Точно както в самото начало, когато започнахме с помощта на примка изграждане, вместо просто копиране и поставяне на пъзел парчета, позволете ми това нещо. Така че в C, има различни примка конструкции, един от които изглежда по този начин. А "за" примка има три неща, разделени от две точка и запетая. И тогава, вътре в тялото на цикъла, така да се каже - неща вътрешността на фигурни скоби - можем да направим нещо отново и отново. Така че, това, което имам тук на екрана, това е буквално коментар. / / Тук идва коментар. Това не е код. Това е само описание на английски език, за мен, човека. Така инициализации, условия и актуализации. Е, нека да видим как работи това. Това ми позволява да пренапише тази програма, както следва. За - така че тук идва моята линия - INT I - тук идва променлива, наречена "Аз" - получава инициализира с 10. Така че ми е инициализация. Искам да направя този цикъл, толкова дълго, като "Аз" е по-голяма или равен на 0. И на всяко повторение на този цикъл, искам да правя. Така видяхме + + в понеделник. - Е точно обратното. Намалява стойността с 1. Вътре в този цикъл, искам да направя нещо. Така че аз ще да кажа нещо подобно ФОРМАТ. Аз не искам да кажа, 10 сега, защото това очевидно е само ще отпечатате една и съща стойност. Какво искам да отпечатате вместо това, вероятно? Да. Така че "аз". Така% г. Така че аз отивам да открадне една от тези идеи от по-рано - тази замяна за формат кодове и след това тук, в дъното, ще върне 0, просто за добра мярка. Но сега, имам по-кратка програма. Това е само няколко реда, а не около 10 или 11 линии. Нека да отида до моя ред надолу. Римейк контур. Повтаряне на линия. И това изглежда да бъде същата. Сега програмата не е по-интересно. Но сега мога да пиша нещо подобно. Мога да променя този на 100. След това мога да компилирате програмата си. И тогава мога да пуснете програмата си. И сега тя отива супер-бърз на днешните компютри. Но там имам - и всъщност, ми scrollback буфер не дори да се стигне толкова далеч. Точно така. Така че имаме всички 100. Но това е лесно да се правят грешки тук. Какво ще е очакваното поведение, ако аз случайно го направиш? Така че тя се чувства като безкраен. Така че нека да видим, ако компютърът се държи. Така че нека да вървим напред и да направи линия. И нека ме прегази контур. Така че нека да се върнем към това само за миг. Ще оставим този план. Защото какво трябва да се брои до, минимално? Вероятно най-малко 2 млрд. евро, ако имаме, че много от бита и ние използваме положителни стойности. Така че нека да скочи обратно тук. Освен тези видове вериги, ние имаме това, което се нарича докато цикъл. Така че, точно като в Scratch, трябваше Завинаги блока, и ти трябваше Повторете блокове. По същия начин, C, просто има и други начини да изразиш себе си. Така че това понятие за време цикъл, който ви позволява да Изразете себе си малко по-различно. И тогава ще трябва нещо, наречено направи линия, докато , който работи малко по-различно, както добре. И ние ще дразни освен с течение на времето. Но нека да погледнем на последното тук. Ако влезем в все още работи. Това е доста безкраен. Така че нека ме пусне в положителна, и да се покаже как всъщност можем да малко по-ефективно управление въвеждане от потребителя. Това е доста кратка програма. И тук имаме в основната INT N декларация. Така че ми даде променлива наречена N. Сега, аз буквално се каже "Направи". И тогава аз имам отворен къдрава презрамки, в близост фигурна скоба. И тогава забележите, веднага след това, тя казва, докато н е по-малко от 1. Така забележите, че тези редове - 19-24 - композира колективно направи линия, докато И отново, нов синтаксис не е нова идея. Това е просто друг начин на примка, синтактично. И така, какво правим? Направете следното, докато н е по-малко от 1. Така че това, което искам да направя? Настоявам да ми даде положително число. Тогава всъщност се опитват да получите число от потребителя. Но по отношение на реда на операциите тук, защото докато условието е тук, аз след това да се провери, е н по-малко от 1? Така че предполагам, че на потребителя - след като са били търсени по този начин - видове в стойността 0. Това условие ще бъде вярно или невярно? Е, това всъщност се случва, за да е истина. Тъй като N е 0, а 0 е по-малко от 1. И така, какво означава? Направи го пак. Направи го пак. Направи го пак. Едва след това състояние се оценява в грешна. Ако пиша в 42. Ами не, 42 не е по-малко от 1. Затова този цикъл се извършва изпълнение. И така, в този момент, програмата ще кажа, благодаря за 42, в този случай. Сега, когато имате този начин да изразиш себе си - Не трябва да чакаме това да приключи. Това ще отнеме известно време. За да се продължи следващия път, може би. Но сега, имате възможност да се надяваме да се разбере малко на онази хумор. Извинявам се. Това не е представителна за хумор в компютърната наука света, но тя е сладка. [Смее се] Нека в края на тази бележка. И ние ще се видим в понеделник. Аплодисменти]