[Powered by Google Translate] [Раздел 4] [по-малко удобни]
[Нейт Hardison] [Харвардския университет]
[Това е CS50. [CS50.TV]
>> Добре, добре дошли обратно към раздел.
В раздел тази седмица ние ще направим няколко неща.
Отиваме в първия сет рекапитулация Задача 2,
което е Цезар и Vigenère проблем.
И тогава ние ще се потопите в Quiz преглед 0
и да прекарат малко време регенериране какво сме говорили за
във всяка една от лекциите досега, и ние ще направя няколко проблеми
от викторини на предходната година.
По този начин вие имате един добър начин да се подготвят за това.
>> За да започнете, аз съм заредил няколко добри решения
за проблем, свързан с предишния набор, Задача 2, в това пространство.
Ако вие всички удари тази връзка,
и ако щракнете върху името ми и кликнете върху първата ми преразглеждане
ще видите caesar.c, което е точно това, което търся в.
Нека поговорим за това наистина бързо.
Това е само пробен разтвор.
Това не е непременно идеалното решение.
Има много различни начини, за да напиша това,
но има няколко неща, които ми се искаше да подчертае
, които видях като бях класификация, общи грешки, които мисля, че
това решение върши много добра работа за манипулиране.
>> Първото има някакъв вид на заглавната коментар на върха.
По линии 1 до 7, за да видите детайли,
какво точно тази програма се прави.
Добра стандартна практика, когато пишете C код
независимо дали вашата програма се съдържа в един файл или
дали е разделен на множество файлове е да има някаква
ориентира коментар на върха.
Това е също така и за хора, които ходят и пишат код в реалния свят.
Това е мястото, където те ще сложи информация за авторските права.
Показани са # включва.
На линия 16 има тази # определят, ние ще се върнем в само малко.
И тогава, след като функция започва, след като основните започва,
защото тази програма е, съдържаща се в една функция
първото нещо, което се случва и това е много идиоматичен и типични за програма на С
че в командния ред аргументи е, че тя веднага проверява
>> за брой аргумента, argc.
Точно тук виждаме, че тази програма се очаква точно 2 аргументи.
Не забравяйте там е, че първият аргумент, който е специален
, която винаги е името на програмата, която се провежда,
името на изпълнимия файл.
И така, какво прави това е, че позволява на потребителя да стартирате програмата
с повече или по-малко аргументи.
Причината, поради която искате да проверите за това веднага е така, защото
не можем да достъп до тази argv масив точно тук надеждно
докато сме проверени, за да се види колко е голям.
>> Едно от най-често срещаните грешки, които видях, хората веднага ще отида в
и вземете argv [1].
Те ще вземете основният аргумент на масива и не за да проверя върху него,
и след това ще направя тест за argc както и следващия тест,
дали не е първият аргумент е, наистина е цяло число в същото време,
и че не работят, защото в случай, че няма предоставените аргументи
ще се вземете аргумента, че не е там или да се опитват да вземете едно, че не е там.
>> Другото голямо нещо, което ще забележите, е, че
винаги искате да разпечатате някаква полезна съобщение за грешка
на потребителя да ги ориентират.
Сигурен съм, че сте всички програми, в които изведнъж се срива,
и ще получите този нелеп диалоговия прозорец, който се появява и казва
нещо ужасно загадъчен и може би ви дава код за грешка или нещо подобно
че няма смисъл.
Това е мястото, където наистина искаме да предоставим нещо полезно
и насочени към потребителя, така че когато го стартирате и да отидат "О", длан лицето.
"Знам точно какво да правя. Знам как да поправя това."
>> Ако не се отпечатват съобщение, че в крайна сметка действително
напускане на потребителя да отиде разгледа изходния си код
да разбера какво се е объркало.
Има също така няколко пъти, че ще използват различни кодове за грешки.
Тук ние просто да кажа, че има грешка,
има грешка, има грешка.
Големи програми, често програми, които се наричат ​​с други програми,
ще се върне някакъв вид специални кодове за грешки при различните сценарии
програмно съобщават това, което в противен случай би
просто използвайте хубава английска съобщение.
Cool.
Тъй като ние работим, вие виждате, че издърпайте ключа.
Ние тестваме, за да видите, ако ключът се вписва.
Получите съобщение от потребителя.
Причината да го направим в тази линия, докато и това е нещо, което ние ще обхване
в малко, но се оказва, че ако въведете контрол D
когато се, че GetString ред на терминала
какво всъщност прави той изпраща специален символ
към програмата.
Тя се нарича ELF или края на файла характер.
И в този случай, нашата низ съобщение ще бъде нула,
така че това не е нещо, което ние проверихме в проблема си е поставил.
>> Но като отидем, че сега сме започнали да говорим за указатели
и динамично разпределение на паметта на хийпа,
проверка за нищожно, когато имате функция, които биха могли да
върне нула, като стойността е нещо, което вие ще искате да получите в навик за правене.
Това е тук преди всичко за илюстрация.
Но когато правиш виж GetString в бъдеще,
Проблем Задайте 4, вие ще искате да пазят това в ума.
Отново, това не е проблем за Проблем Set 3, тъй като ние все още не са покрити.
И накрая, ще стигнем до тази част, където стигаме до основната линия криптиране,
и има няколко неща се случват тук.
Първо, ние обхождане на цялото съобщение себе си низ.
Тук сме пази strlen повикване в състояние,
редица от вас са посочили, не е чудесен начин да отида.
Оказва се, че в този случай също не е голям,
отчасти защото сме изменение на съдържанието на самото съобщение
вътре в цикъл, така че ако имаме съобщение, че е на 10 знака,
първи път, ние започваме, че за контур strlen ще се върне?
10.
>> Но ако след това променя съобщение, казват, че променя 5 характер,
и хвърли в \ 0 характер в 5-та позиция,
по-късен итерация strlen (съобщение) няма да се върне това, което е направил
първи път повтори,
но вместо това ще се върне пет, защото ние хвърли в тази нула терминатор,
и се определя дължината на низ
от позицията на този \ 0.
В този случай, това е чудесен начин да отида, защото ние сме го промяна в.
Но ако забележите, че това всъщност е учудващо проста за криптиране
ако можете да получите по математика правилно.
Всичко, което е необходимо, е да се провери дали има или не писмо, което търсите в
главни или малки букви.
>> Причината, поради която трябва само да провери за това и ние не трябва да се провери за
е алфа случай е така, защото
Ако знакът е главна или ако това е с малки букви
тогава това е определено азбучен характер,
защото ние не разполагат с главни и малки цифри.
Другото нещо, което правим и това е малко трудно
е, че ние сме промяна на стандартната Цезар шифър формула
че дадохме в спецификацията проблем набор.
Какво е различното тук е, че ние се изважда
главни столица случай, а след това ще добавя капитала на
архивирате в края.
>> Знам, че някои от вас са направили това в кода си.
Ли някой от вас да направите това във вашите твърдения?
Ти ли направи това. Можеш ли да обясниш какво прави това, Sahb?
Като го извади, защото Министерството на отбраната след него,
трябва да го вземе, така че по този начин можете да получите кашлица] позиция.
И тогава, като го добавяте отново по-късно се размърда над този, който сте искали.
Да, точно така.
Какво Sahb каза е, че когато искаме да добавим
нашето послание и нашата основна заедно
и след това Министерството на отбраната, че Министерството на отбраната, че от NUM_LETTERS,
ако ние не се умалява нашето послание в подходящия обхват 0-25 първо,
тогава можем да се наистина странно номер
защото ценностите, които се разглеждат, когато погледнем съобщение [I],
когато погледнем към ItH характер на нашия обикновен текст съобщение,
е на стойност някъде в обхвата 65-122
въз основа на ASCII стойности за главни букви от А до малки Z.
И така, когато Министерството на отбраната от 26 или от NUM_LETTERS
тъй като това ни беше # определят в горния десен ъгъл тук,
, че това ще ни даде стойност, която е в границите 0-25,
и ние се нуждаем от начин да мащаб, че обратно
и да получите в съответния ASCII диапазон.
Най-лесният начин да направите това е просто да мащабирате всичко
в обхвата 0-25 да започнем с това,
и след това смени всичко обратно в края.
>> Друга често срещана грешка, която видях хора се вливат в, е, че
ако не се прави това мащабиране веднага
и добавите съобщение и ключа заедно и да ги добавите, да речем,
в знак променлива, проблем с това
е, тъй като съобщението [] е относително голям брой, за да започнем с
забравяйте, че това е не по-малко от 65, ако това е главна буква
ако имате голям ключ, да речем, нещо като 100,
и добавите тези две заедно в знаковият символ ти започваш да се получи преливане.
Вие ще получите стойност, която е по-голяма от 127,
, която е най-голямата стойност, че Чар променлива може да побере.
Отново, ето защо ще искате да се направи такова нещо, да започнем с това.
Някои хора се около този случай, ако друго и тестване
, за да видите, ако това ще преливат преди това, че,
но по този начин се получава около това.
И тогава, в този разтвор отпечатани целия низ в самия край.
Други хора отпечатва символ в даден момент. И двете са страхотни.
В този момент, вие имате някакви въпроси, всякакви коментари за това?
Нещата, които харесвате, неща, които не ви харесват?
>> Имах един въпрос.
Може би съм го пропуснал по време на вашето обяснение, но как тази програма
прескачане на празни пространства за свързване ключът към дължината на текста?
Това е само Цезар шифър. >> О, съжалявам, да.
Да, ще видим.
В шифър на Цезар имаме около това, защото
само обърна знака.
Ние само ги завъртя, ако те са били главни или малки.
Вие чувствате доста добре за това?
Чувствайте се свободни да копирате този дом, вземете я,
сравни с това, което вие пише.
Определено не се колебайте да изпращат въпроси за това.
И отново, осъзнават, че целта тук с проблема задава
е да не се вие ​​да напишете перфектната код за проблемните комплекти.
Това е поучителен опит. Да.
>> Обратно към не се прави по време на цикъл, ако то се равнява на нула,
толкова нищожен просто не означава нищо, те просто удари влиза?
Null е специална стойност показалеца,
и ние използваме за нищожно, когато искаме да кажем
имаме указател променлива, която е насочена към нищо.
И така, обикновено това означава, че тази променлива, това съобщение променлива
е празна, а тук, защото ние използваме CS50 специален тип низ,
каква е CS50 тип низ?
Виждали ли сте какво е, когато Дейвид дръпна назад качулката в лекцията?
Това е фънки-това е показалеца, нали?
Добре, да. >> Това е знак *.
И така, наистина бихме могли да замените това
тук с Чар * съобщение,
и така GetString функция, ако тя не успешно низ от потребителя,
тя не може да прави разбор на низ, и единия случай, в които не може да анализира низ
е ако потребител въведе края на файла характер, контролът D,
, което не е нещо, което обикновено правя, но ако това се случи
тогава функцията ще върне тази нищожна стойност като начин да се каже
"Хей, аз не се получи низ."
Какво би станало, ако ние не поставяме съобщение = NULL,
което е нещо, което не са правили все още?
Защо това е проблем?
Защото знам, че ние говорихме малко в лекция за изтичане на памет.
Да, нека да го направим, и да видим какво ще се случи.
>> Въпрос на Базил е какво ще се случи, ако ние всъщност не са
това съобщение = NULL тест?
Да се ​​придвижите нагоре към върха.
Вие може да коментира това.
Всъщност, аз ще го запишете в ревизия.
Това ще бъде ревизия 3.
Това, което ще трябва да направите, за да стартирате тази програма е, че ще трябва да кликнете на тази иконка тук,
и ще трябва да добавите аргумент да го.
Ще трябва да му се даде основният аргумент, тъй като искаме да премине в аргумент на командния ред.
Тук аз ще го дам под номер 3. Харесва ми 3.
Сега мащабиране, изпълнението на програмата.
Бягане, събиране, изграждане.
Ето ни. Чакат да бъдат подканени.
Ако въведете нещо като здравей, където се отиде?
О, програмата ми отне твърде много време, за да се изпълнява. Бях jawing за прекалено дълго.
Here It Goes.
Сега напишете просто 'Здравей'.
Ние виждаме, че той криптира подходящо.
Сега какво се случва, ако ние не направим бързо GetString да се върне на нула?
Не забравяйте, че казах, че ние сме го направили чрез натискане на контрол D в същото време.
Ще се придвижите нагоре. Ние ще се кандидатира отново.
Сграда. Там тя си отива.
Сега, когато удари контрол D
Имам тази линия, който казва opt/sandbox50/bin/run.sh, сегментиране вина.
Бяхте виждал това преди?
>> [Student] Защо има не >> Съжаляваме?
[Студентски] Защо има не ядро ​​сметището в този случай?
Основната сметището е въпросът е защо има не ядро ​​сметище тук?
Въпросът е, че може да има, но ядрото дъмп файл
че се записва на твърдия диск.
В този случай ние сме инвалиди основните сметища
по план сървър, така че ние не са хора Seg Faulting
и изграждане на тона на основните сметища.
Но може да се получи един.
Основни сметища са вид на нещо, което често може да изключите,
и понякога правя.
Сегментацията вина, за да отговоря на въпроса ви, Базил,
се казва, че ние се опитахме да достъп до показалеца
че не е създаден да сочи към нищо.
Запомни Бинки във видеото, когато Бинки се опитва да
отидете достъп до показалеца, който не е насочен към нещо?
В този случай аз предполагам, технически показалеца сочи към нещо.
Това сочи към нула, което е технически 0,
но, което е определено да бъде в сегмента, която не е достъпна
от вашата програма, така че да получите грешка сегментация
защото не сте достъп до паметта, която е валиден сегмент
като купчина сегмент или сегмент комин или данни сегмент.
Cool.
Повече въпроси относно Цезар?
>> Нека продължим нататък. Нека разгледаме Revision 2 наистина бързо.
Това е Vigenère.
Тук, в Vigenère
ние ще ходим през този доста бързо, защото отново
Vigenère и Цезар са доста сходни.
Header коментар преди,
# Определят преди да се избегне използването на тези магически числа.
Хубавото е, че ние искахме да се премести в
различна азбука или нещо подобно.
Вместо да се налага ръчно да промените всички 26 в кода
бихме могли да променим това до 27 или го пуснете
ако бяхме се използват различни азбуки, различни езици.
Отново, ние имаме тази проверка на броя аргумента,
и наистина почти може да вземе това като шаблон.
Почти всяка програма, пишете трябва да има
ако е необходимо, на командния ред аргументи някаква последователност от линии
, който се чете като в самото начало.
Това е една от първите тестове на здрав разум, които искате да направите.
>> Ето какво пък бе ние се увери, че
ключовата дума е валидно, и това беше втора проверка, която направихме.
Забележете отново, че сме разделени от argc и 2.
Имайте предвид, че в този случай, нещо, което ние трябваше да направим, беше вместо
използва и ние искахме да валидира целия низ,
и за да направите това, което всъщност трябва да отидете знак по знак
над низ.
Няма по-добър начин да се обадя нещо върху него
защото дори, например, да аз ще върне 0
ако не може да прави разбор на цяло число, така че дори не работят.
Отново хубаво съобщение, в което се казва на потребителя точно какво се е случило.
Тогава, отново, ние също се справи с делото, когато
на потребителя в контролна D случаен характер.
>> И тогава Шарлот имах един въпрос по-рано за това как успяваме да пропуснете пространства
в нашия низ тук.
Това беше нещо подобно на това, което направихме с Myspace програма
, че сме направили в раздел, както и начина, по който това работи
е, че ние проследяват броя на писма, които сме виждали.
Докато вървяхме над съобщението низ, докато вървяхме през знак по знак,
проследяват индекса като част от нашата линия, а след това също се следят
броят на буквите, така че без специални знаци, които не са цифри, не-бялото пространство
че сме виждали в отделна променлива.
И тогава това решение променя ключа
да получите действителната ключов цяло число, и го прави в движение,
точно преди да отива за криптиране на действителния характер на съобщение.
Има някои решения, които са били перфектно твърде голям
, които ще променят нагоре при изпитването за валидност на ключа.
В допълнение към като се уверите, че характерът и ключовата дума
е буква, също се оказа, че в цяло число
в обхвата 0-25 тогава пропуснете да направи това по-късно в тази линия.
Отново, което виждате тук, това наистина е точно същия код
, който използвахме в Цезар в този момент.
Ти правиш точно същото нещо, така че Истинският трик е, фигуриращ
как да включите ключовата дума в цяло число.
>> Едно нещо, което ние направихме, че тук е малко по-гъста
е, че ние повтаря тази фраза, предполагам, че бихте могли да го наречем,
Три пъти по линии 58, 59 и 61.
Може ли някой да обясни какво точно прави тази фраза?
Достъп до характер, както ти каза.
Да, това е недоловим герой в ключовата дума,
и затова е виждал писма, защото сте само се движат по
дума веднъж сте виждали писмо,
така че ефективно да пропуснете пространства и подобни неща.
Да, точно така.
И тогава след като съм виждал празна дума просто мод, така че се движите напред наоколо.
Точно така. Това е идеалното обяснение.
Кевин каза, е, че искаме да се индекс в ключовата дума.
Ние искаме да се num_letters_seen характер, ако щете,
но, ако num_letters_seen надвишава дължината на ключовата дума,
начина, по който се върна в подходяща гама е да използваме оператора мод
ефективно да обгърне.
За пример, както в краткосрочен, ключовата дума е бекон,
и това е 5 букви.
Но сме виждали 6 писма в обикновен текст в този момент
и криптирана 6.
Ние ще сложим край на достъп до num_letters_seen,
което е с 6, Министерството на отбраната дължината на ключовата дума, 5,
и така ще получите една и така, това, което ние ще направим, е, че ние ще
достъп до първо вътре характер на ключовите думи в този момент.
>> Добре, всички въпроси, свързани Vigenère
преди да продължим?
Вие чувствате доста добре за това?
Cool, чудесно.
Искам да се уверите, че вие ​​получавате възможност да видят код
, че ние мислим изглежда добре и имат възможност да се учат от него.
Това ще бъде последният ще се използва пространства за момента,
и ние ще преход сега, и аз ще отида да cs50.net/lectures
така че можем да направим малко преглед викторина.
Най-добрият начин, мисля, че да започнете да правите викторина преглед
е да дойде този Лекции, cs50.net/lectures
и под всяко от заглавията на седмица, така че ако гледам тук на седмица 0,
Виждам, че имаме списък от теми, които ние обхванати в Седмица 0.
>> Ако някоя от тези теми изглежда непознато за вас
вие със сигурност ще искате да се върнете и излъскване на лекция бележки и евентуално
дори обезмаслено чрез лекции, да ги гледате отново, ако искате
да се получи усещане за това какво се случва с всяка една от тези теми.
Аз ще кажа допълнително тази година един от прохладните ресурси, сме се погрижили
тези шорти, които сме създали, и ако се вгледате в Седмица 0,
не всички от темите, включени, но ние имаме доста от тях,
някои от по-сложните такива, така че гледам тези шорти отново
е добър начин да получите до скорост.
По-специално, аз отивам да се сложи в щепсела за три на дъното, тъй като тези.
Но ако сте се борят с двоичен, бита, HEX, че такива неща,
двоичен е страхотно място да започнете.
ASCII е още едно, че е добре да видите също.
Можете дори да ме гледаш 1.5x скорост, ако аз отивам твърде бавен за вас.
Тъй като това е преглед, не се колебайте да направите това.
>> Само да започне наистина бързо, ние ще да мине през няколко от тези викторини проблеми
само бързо да бълват чрез тях.
Например, нека разгледаме проблем 16, че имам право тук на борда.
Имаме тази следното изчисление в двоичен,
и ние искаме да покажем някаква работа.
Добре, аз отивам да се даде този шанс.
Вие, момчета, трябва да следват заедно с хартия,
и ние ще направим това много бързо.
Ние искаме да извърши следното изчисление в двоичен.
Имам 00110010.
И аз отивам да го 00110010.
За по математика гении след заедно у дома,
това е ефективно да се умножи по две.
Нека започнем.
Отиваме да следват същия алгоритъм, освен това, че правим
когато се добави десетични числа заедно.
Наистина Единствената разлика тук е, че ние контур обратно около
след като имаме 1 + 1 вместо веднъж да стигнем до 10.
>> Ако започнем от дясно, наистина бързо, каква е първата цифра?
[Student] 0. >> [Нейт H.] 0.
Велики, втората цифра?
[Student] 1.
[Нейт H.] Дали това е 1? 1 + 1?
[Student] 10.
[Нейт H.] точно, така че това е цифрата, че аз пиша точно под 2 сумират?
[Студентска 1, 0, 0 и след това носят 1.
[Нейт H.] 0 и носи една точно.
Следваща нагоре, босилек, ти си.
Каква е третият? >> [Василий] 1.
[Нейт H.] 1, перфектно. Кевин?
[Кевин] 0. >> [Нейт H.] 0, Шарлот?
[Шарлот] 0. >> [Нейт H.] Да, и какво да правя?
[Student] 1.
[Nate Х. И какво да правя? И тогава аз нося 1.
Perfect, Sahb? >> Sahb Сега имате 1.
[Нейт H. И да правя нещо тук?
[Sahb] Тогава за следващия имате 1, защото пренесени 1.
[Нейт H. Велики, така че тук можем да го завършим до.
Cool.
Студентски ли 0 + 0 = 0?
0 + 0 = 0.
1 + 1, както ти каза, е 10, или 1, 0, а.
10 е подвеждащо, защото за мен 10 означава числото 10,
и това е приумица на начина, по който го представлява, когато ние сме го писмено.
Ние представляваме номер 2 до 1, 0, а номер 10 е малко по-различен.
>> Какво е нещо хубаво за двоичен е, че наистина не са много
случаите, в които трябва да научите.
Има 0 + 0 = 0, 0 + 1 = 1,
1 + 1 е 0, и след това продължете 1,
и след това можете да видите тук, на третата колона от правото
имахме 1, 1 и 1.
И 1 + 1 + 1 е 1,
и ще ви отнесе още 1.
Когато правиш двоичен допълнение, доста проста.
Щях да направя още няколко от тях здравия разум себе си проверите
преди да отида, защото това е
може би нещо, което ще видите в анкетата.
Сега нека го направим следващата, както и.
Нека направим проблем 17.
Отиваме да конвертирате двоично число в десетично.
Имам 10100111001.
Не забравяйте в двоичен видеото, че аз
Минах през няколко примера, и показа как
всичко работи, когато го правиш в десетичен.
Когато работите в десетичен представителство Мисля, че сме
в този момент в живота ни, така отлично в това, че
това е доста лесно да се замазват механиката на това как всъщност работи.
>> Но за да направи бърза рекапитулация, ако имам номер 137
това наистина означава и отново, това е в десетичен представителство
номер 137 в десетична означава, че имам 1 х 100 + 3 х 10 + 7 х 1.
Това е всички пребиваващи на екрана.
И тогава, ако се вгледате в тези номера точно тук,
100, 10 и 1, ще видите, че те са всъщност всички правомощия на 10.
Имам 10 ², 10 ¹, и от 10 до нулата.
Ние имаме подобен вид нещо в двоичен,
с изключение на това, че нашата база, както ние го наричаме, е 2 вместо на 10.
Тези 10s, че съм написал тук в долната част,
този 10 ², 10 ¹, от 10 до нулата, 10 е нашата база,
и показател, 0, 1 или 2,
се подразбира от позицията на цифрата в числото, което пишем.
1, ако ние гледаме на него, този 1 е в 2-ра позиция.
3 е в 1-ви позиция, и 7 в 0th позиция.
Това е начина, по който различните експонати по-долу за нашите бази.
>> След we'll-всъщност, знаеш ли какво?
Ние ще направим, където ми бутонът?
Там тя си отива.
Обичам този отмените нещо.
След това мисля, че за мен най-малко
най-лесният начин да започне конвертиране на двоично число
или шестнадесетично число, където основата е 16
, а не 10 или 2 е да вървим напред и да напиша
бази и експонати за всички числа в двоичен моя номер в горната част.
Ако започнем от ляво на дясно отново,
което е вид нелогично,
Ще се върнете към черно тук, ние имаме два на 0th позиция,
и след това имаме два ¹, 2 ²,
и след това 2 до 3, от 2 до 4, от 2 до 5, 6,
7, 8, 9 и 10.
Тези, които съм писал са всички експонати.
Само че пише бази тук, в първите 3 само за космоса.
>> В този момент аз отивам да вървим напред и аз всъщност се случва да изтриете
неща, които направихме в десетична запетая, ако това е добре.
Всички сте го схванали.
Тези от вас, гледане на онлайн Сигурен съм, че ще бъде в състояние да ме назад, ако искате.
Превключване обратно на писалката.
Сега, това, което ние можем да направим, ако вие не сте напълно до ускоряване на вашите правомощия на две,
това е много готино.
Случва се. Разбирам.
Веднъж имах интервю за работа, където ми беше казано, трябва да знам всички правомощия на две
чрез 2 до 30.
Той не е бил на работа, имам.
Както и да е, вие да отидете напред и да направи по математика тук,
но с двоичен не наистина да има смисъл,
и нито смисъл с десетичен или шестнадесетичен,
да направи по математика, където имате нули.
Можете да видите, имам 0, 0, 0, 0, 0, 0 тук.
Защо да не го направи смисъл да се направи реалната математика
за изчисляване на подходяща мощност от 2 за тази позиция?
Точно така, като Шарлот каза, че ще бъде 0.
Както и да си спестите време, ако изчисляване на правомощията на две не е вашата силна костюм.
В този случай, ние само трябва да се изчисли за 2 до 0, което е?
[Student] 1.
, [Нейт H.] 1, 2 до 3, което е?
[Student] 8. >> Нейт H.] 8.
2 до 4?
Student [2]. Съжалявам, 1.
[Нейт H.] 2 до 4 е 16, точно така.
От 2 до 5, Кевин? >> 32.
, [Нейт H.] 32, от 2 до 8?
[Student] 32 х 8, 256.
[Нейт H.] Perfect.
И 2 до 10?
[Student 1024.
[Нейт H.] Да, 1024.
>> След като имаме тези числа, можем да обобщим всички тях.
И това е мястото, където това е наистина важно да се направят няколко неща.
Един от тях е карам бавно и да проверите вашата работа.
Можете да кажете, че има една в края на този номер,
така че определено трябва да се състои от нечетен брой като моя резултат,
защото всички останали ще бъдат дори номера
като се има предвид, че това е двоично число.
Другото нещо, което трябва да направите, е ако стигнем до тази точка от теста
и сте го написали това далеч
и сте изчерпване на времето
погледнете броя на точките, че този проблем е на стойност.
Този проблем, както можете да видите, ако обърнете обратно към моя лаптоп наистина бързо
този проблем е на стойност 2 точки, така че това не е нещо на добавяне
трябва да се минава през ако сте наистина притиснат от времето.
Но ние ще се върнете на IPAD, и ние ще мине през него наистина бързо.
>> Предпочитам малък брой първи
защото аз намирам, че по-лесно.
Харесва ми 32 и 8, защото те вървят ръка за ръка доста лесно, и получаваме 50.
16 и 1 получава 17.
Има получаваме 57,
и след това можем да направим останалата част на този, така че можем да направим 57, 156.
Хайде де.
Човече, добре, нека видим.
Имахме 57, 256 и 1024.
В този момент, аз предпочитам просто отидете.
Аз нямам представа. Ясно трябва да се чете по този въпрос.
7, 6 и 4, вие получавате 17.
1, 5, 5, 2, 13.
Тогава ще получат 3, и след това получаваме 1.
1337.
Великденско яйце, има ли някой?
Някой да признае този номер?
Крис разпознава номера. Какво означава това, Крис?
Крис] Leet.
Leet, така че ако се вгледате в това, че изглежда като Leet.
Hacker неща. Внимавай за този вид неща в средносрочен план или викторина, а.
Ако видите, че такива неща и се чудите "А"
, които биха могли да означават нещо.
Не знам. Дейвид обича да го поставя.
Това е добър начин да се здравия разум да го проверите.
Както добре, мога да видя какво става.
>> Това е 0/Week Седмица 1 неща.
Ако ние се върнете обратно към нашите лаптоп сега,
отдалечаване, както и няколко други неща.
Има ASCII, което ние сме били прави много с проблема комплекти.
Това понятие на капитала А. Какво е това наистина?
Знаейки това е десетично цяло число.
65 е това, което е съпоставена с в ASCII таблица,
и това е, прочее, как компютърът го пише,
и това е как сме се размине пишейки
столицата характер и характера малки
в някои от тези решения и проблемни, че сте били прави.
Няколко други неща.
Имаме отчети, булеви изрази, условия, цикли, променливи и конци.
>> Тези всички изглежда да има смисъл за по-голямата си част?
Някои от тази терминология е малко по-фънки от време на време.
Харесва ми да мисля на изявление, както и за по-голямата част нещо, което завършва с точка и запетая.
Твърдения като х = 7, която определя променлива,
вероятно нарича х = 7.
Вероятно х също е един вид, който може да съхранява числото 7,
така че това е вътр или евентуално с плаваща запетая или кратък или по-Чар,
нещо подобно.
Булев израз се използва тези двойни равен
и взрив е равна или не се равнява на по-малко от, по-голяма от
по-малка или равна на всички такива неща.
Условия тогава, ако другаде изявления.
Бих забравяйте, че не може да има друго без съответното ако.
Също така, не може да има друго ако без съответното ако.
Loops, припомни 3 видове вериги ние сме били на чук
за последните няколко секции и проблемни комплекта.
Използването на време, когато сте се въвеждане от потребителя,
използвате по време на цикли до определено условие е вярно,
и след това с помощта на тези вериги, ако трябва да
итерация на цикъла сте в момента, е как мисля за това.
Или, ако сте прави за всеки знак в низ, аз искам да направя нещо,
за всеки елемент в масив, искам да направя нещо за този елемент.
>> Нишки и събития.
Те не са покрити, така изрично в C,
но не забравяйте, това от самото начало.
Това е идеята с различни скриптове.
Това също е това понятие за излъчване на дадено събитие.
Някои хора не използват радио-и телевизионно разпространение в техните проекти, а първоначално
, което е много готино,
но това са два различни начина на работа с този голям проблем, наречен едновременност,
което е как да получите програми за изпълнение
или привидно изпълнява по едно и също време?
На различни задачи, докато други задачи също работи.
Това е вашата операционна система изглежда да работи.
Ето защо, въпреки че, например,
Имам си браузър, който, също може да се включи Spotify и да играе една песен.
Това е повече от концептуален нещо, което трябва да се разбере.
Аз ще взема поглед към къси нишки
ако искате да научите повече за това.
>> Да видим, аз вярвам, че може да са били
проблем на тази в една от тях.
Отново аз мисля, теми и събития, които не са нещо, което ще разгледаме в C
просто защото това е значително по-трудно, отколкото в Scratch.
Вие не трябва да се тревожи за това, но определено разбират понятията,
разбере какво става.
Преди да продължим нататък, всички въпроси на седмица 0, материали?
Всички чувствам доста добре?
Разбиране на променливи и какво променлива?
>> Нека продължим. Седмица 1.
Няколко неща, които не са особено покрити
в викторина преглед задължително и също са по-концептуални неща, за да си помисля.
Първата е тази идея за какво изходния код, компилатори и обектен код.
Някой? Базил.
Е обект код, искам да кажа, изходния код е какво слагате в ехтя,
и обектен код е какво ехтя поставя така, че компютърът ви да прочетете програмата.
Точно така.
Изходен код е кода на C, която всъщност въвежда.
Обектен код е това, което получавате от ехтя.
Това е 0s и 1s в този двоичен формат.
Тогава какво се случва, когато имате куп обектни файлове,
кажем, че съставянето на проект или програма, която използва множество файлове с изходен код,
които по условие са дадени в файлово разширение.
Ето защо имаме caesar.c, vigenère.c.
Ако пишете Java програми, които ги дават разширение. Java.
Python програми имат разширение. Пи често.
>> След като имате множество файлове в, да ги компилирате.
Звъня плюе всичко това двоичен боклуци.
Тогава, защото искате само 1 програма
имате Хеалатно връзка, всички от тях обект подава заедно
в 1 изпълним файл.
Това е и какво се случва, когато използвате на CS50 библиотека, например.
Библиотеката CS50 е едновременно. З заглавния файл
, че сте прочели, че # includecs50.h.
И тогава тя също е специална двоичен файл библиотека
, който е бил съставен, че е 0s и 1s,
и че л флаг, така че, ако се върнем към нашите пространства и ние с нетърпение наистина бързо
какво се случва тук, когато погледнем в нашия ехтя команда,
това, което имаме, е, това е нашата сорс тук.
Това са куп компилатора знамена.
И тогава в самия край, те-л знамена връзка
реалните двоични файлове за тези две библиотеки, CS50 библиотечни и след това по математика библиотека.
>> Разбиране всеки тип цел файлове
в процеса на компилация е нещо, което ще искате да бъдат в състояние да
дават най-малко общ преглед на.
Изходен код. Обектен код излиза.
Обектен код файлове свързват заедно, и ще получите красива, изпълним файл.
Cool.
Това е също така, където можете да получите грешки в няколко точки
в процеса на компилация.
Това е мястото, където, например, ако вземете това свързване флаг,
CS50 знаме, и да го пропусне в помещения или когато сте кода си,
това е мястото, където ще получите съобщение за грешка в свързването фаза,
и свързващата програма ще каже: "Хей, ти се обади функция GetString
, която е в библиотеката CS50 ".
"Ти ми каза, че е в библиотеката CS50, и не мога да намеря кода за него."
Това е мястото, където трябва да го обвърже, и това е отделен
от компилатора грешка, защото компилаторът търси на синтаксиса и такива неща.
Това е добре да се знае какво се случва, когато.
>> Други неща, които трябва да знаете.
Бих казал, вие определено искате да погледнете в краткосрочен типаж, направено от Йордания
да се разбере какво цели числа са под капака,
символа са под капака.
Когато говорим за ASCII и ние действително изглежда в ASCII таблица,
какво прави ни дава под капака поглед
как компютърът всъщност представлява капитал и цифрата 7
и запетая и въпросителен знак.
Компютърът също така има специални начини да представляват
числото 7 като цяло число.
Тя има специален начин да представлява числото 7 като число с плаваща запетая,
и тези, които са много различни.
Типаж е как да кажеш на компютъра "Хей, аз искам да конвертирате
от едно представителство в друга представителство. "
Защо не можем да разгледаме в този.
>> Бих искал също да погледнем на библиотеките и върху компилатори.
Тези, които говорят за процеса на компилация,
библиотека, както и по някои от тези въпроси, които може да се задават.
Въпроси материали върху Седмица 1?
Има ли някакви теми тук, че да изглежда обезсърчително искате да покрие?
Опитвам се да взриви през по-голямата част от тези по-ранни теми, така че можем да стигнем до
указатели и направи малко на рекурсия.
Мисли?
Всичко за покриване?
Време е за малко шоколад може би?
Вие, момчета, работят през него.
Аз ще продължа да отпиват от кафето си.
Седмица 2.
Добър разговор, добър разговор.
През седмица две говорихме малко повече за функциите.
>> През първите няколко комплекта проблемни ние всъщност не пишат никакви функции
от коя функция?
[Student] Майн. >> Майн, точно така.
И така сме видели различни костюми, че основната носи.
Там е тази, в която не възприема аргументи,
и ние просто казват невалидни между скобите,
и тогава там е другият, където ние искаме да вземат аргументите на командния ред,
и както видяхме, това е, когато имате INT argc и струнен argv масив
или, че сега сме в действителност изложени низ да бъде знак *, че това е
ние ще започнем да я пиша като знак * argv, а след това и скоби.
В Проблем Комплект 3, вие видя един куп функции,
и реализира един куп функции, рисуват, изглежда, се кодира.
Прототипите са написани там за вас.
>> Това, което исках да говоря за тук с функции наистина бързо
е, че има три части за тях, когато пишете функция.
Трябва да се определи типът на връщане на функцията.
Трябва да зададете име на функцията, и тогава ще трябва да се уточни
списъкът с аргументите, или списъка параметър.
Например, ако трябва да се напише функция, за да обобщим куп числа
и след това се върнете към мен сума, какво ще бъде мой тип декларация
ако исках да обобщим числа и след това се върнете сумата?
Тогава името на функцията.
Ако отида напред и да пишат в зелено, тази част е типът на връщане.
Тази част е името.
И след това в скоби
е мястото, където давам аргументи,
често съкратено като аргументи, понякога наричани params за параметри.
И ако имате такава, можете просто да зададете.
Ако имате няколко отделят всеки един със запетая.
И за всеки аргумент ти я дам две неща, които са Кевин?
Кевин Трябва да се даде вида и след това името.
И тогава името, а името е името, което ти започваш да се използват
да се позове на този довод в рамките на сумата функция,
в рамките на функцията, която пишете в момента.
>> Не е нужно за Например, ако аз отивам да обобщим,
масив от цели числа Ще INT масив,
и аз ще си дам някои фигурни скоби
тогава, когато минавам масив на сумата функция
Го преотстъпвайте на първа позиция от списъка на аргументите.
Но масив, който минавам с не трябва да имат ARR име.
Arr ще бъде, как се отнасят до този аргумент в тялото на функцията.
Другото нещо, което ние трябва да се вземе предвид,
и това е малко по-различен от функции, но мисля, че това е важен момент,
е, че в C, когато пиша функция като тази
как мога да знам колко елемента са в този масив?
Това е малко подвеждащ въпрос.
Ние говорихме за това малко в раздел миналата седмица.
Как да знам, че броят на елементи в масив в C?
Има ли начин?
>> Оказва се, че няма начин да се знае.
Вие трябва да прехвърли в отделно.
Има един трик, който можеш да направиш
ако сте в една и съща функция, в която е била обявена за масив,
и вие работите със стак масив.
Но това работи само ако сте в една и съща функция.
След като премине масив до друга функция или ако сте обявена за масив
и ще ви постави този масив на куп, които сте използвали изчистване
и такива неща, тогава всички залози са изключени.
Тогава всъщност трябва да преминат около
специален аргумент или друг параметър
ви казвам колко голям масив.
В този случай, щях да искам да се използва запетая - Съжалявам, но ще екрана тук
и аз ще премине в друг аргумент,
и го наричат ​​INT дъл за дължината.
>> Едно нещо, което може да дойде на теста
ви с молба да напише или изпълнение на конкретна функция, наречена нещо.
Ако не ви даде прототип, така че цялото това нещо тук,
цялата тази бъркотия се казва в декларацията на функцията или прототип на функция,
това е едно от първите неща, които вие ще искате за нокти, ако той не е дал
да ви веднага на теста.
Друг трик съм научил, е, че
кажем, че сме ви прототип на функция, и ние казваме: "Ей, ти трябва да го напиша."
Вътре в фигурни скоби, които имате на теста
ако забележите, че има връщане вид и забележите, че типът на връщане
е нещо различно от невалидни, което означава, че функцията не връща нищо,
тогава едно нещо, което определено искам да направя е да напишете
някакъв вид връщане, в самия край на функцията.
Върни се, и в този случай, ние ще сложим празен, защото искаме да попълни празното.
Но това стане ли мисли по правилния начин за това как отивам да подходим към този проблем?
И това ви ви напомня, че ще трябва да връща стойност
на обаждащия се на функцията.
>> Да. >> Студентски стил се прилага, когато пишете код на теста?
Такива като отстъпи и такива неща? >> Студентски Да.
Не, не е толкова много.
Мисля, че много на това е нещо, което ще изясни на теста в деня на
но обикновено се притеснявате за # включва и такива неща, това е вид отвън.
Студентски Имате ли нужда от коментар на ръкописен код?
Имате ли нужда от коментар на ръкописен код?
Коментирайки винаги е добре, ако сте притеснен за частично кредит
или искате да съобщи намерението си за грейдер.
Но аз, отново ще се изясни на самия тест и тест в деня,
но аз не вярвам, че ще се изисква да напишат коментари, не.
Обикновено не, но това е определено вид на нещо, където
можете да съобщи намерението си, като "Хей, това е мястото, където аз отивам с него."
И понякога това може да помогне с частичен кредит.
Cool.
>> Базил.
[Василий] Каква е разликата между деклариране, да речем, вътр Lang
в аргументи и параметри в сравнение с обявяване на променлива в рамките на функция?
Уау, кафе слезе трахеята.
[Василий] като нещата, които искате да поставите в аргументите.
Да, това е чудесен въпрос.
Как избирате какви неща искате да поставите в аргументацията
в сравнение с това, което неща, които трябва да направите в рамките на функцията?
В този случай ние двете от тях като аргументи
защото те са нещо, което да не погине нито един, който ще се използва функцията сума
трябва да се уточнят тези неща.
>> Сумата функция, както се говори, няма как да знае
колко е голям масива става от абонат или който се използва сумата функция.
Това няма как да знае колко голям е този масив.
Причината, поради която преминават в тази дължина точно тук като аргумент
е така, защото това е нещо, което ние сме основно казва на обаждащия се на функцията,
, който ще се използва функцията сума, "Хей, не само вие трябва да ни даде масив
от цели числа, вие също трябва да ни кажете колко голям масив, който сте ни дали е ".
[Василий] Онези двете ще бъдат командния ред аргументи?
Не, това са реални аргументи, които трябва да предадете на функцията.
>> Позволете ми да направя нова страница тук.
[Василий] като име ще мине
[Нейт H.] Ако имам Int основната (Void),
и аз ще сложа моето завръщане 0 тук, в дъното,
и кажа, че искам да извикате функцията сума.
Искам да кажа, вътр х = SUM ();
За да използвате функцията сума трябва да преминат и в двата масива, че искам да обобщя
, а дължината на масива, така че това е мястото, където
ако имах масив от цели числа,
казват, че имах вътр numbaz [] = 1, 2, 3,
вид на ползване, което хакнат синтаксис точно там,
тогава какво щях да правя, е в сумата, бих искал да премине в
numbaz, както и номер 3
да се каже функцията сума "Добре, тук е масив, искам да обобщя.
"Ето неговия размер."
Това прави ли смисъл? Това отговаря ли на въпроса ти?
>> В много отношения го прави успоредно какво правим с основен предмет на
когато имаме аргументите на командния ред.
Програма като Цезар шифър, например, че е необходимо
аргументите на командния ред не ще бъде в състояние да направи каквото и да било.
Не знам как да криптирате, ако не кажа, че какво, за да използвате
или ако не сте го кажа кой низ искаш да криптирате.
Подтик за вход, това е мястото, където ние имаме две различни механизми
за вземане на вход от потребителя, за вземане на информация от потребителя.
Проблем Задайте една видяхме този GetInt, GetString, GetFloat начин
пита за вход, и това се нарича използва стандартния входен поток.
Това е малко по-различен.
Това е нещо, което можете да направите по едно и също време, за разлика от
Когато стартирате програмата, когато стартирате програмата работи.
Аргументите на командния ред са посочени, когато стартирате програмата протичане.
Ние сме били смесване на две от тях.
Когато използваме аргументи за функция, това е много прилича на командния ред аргументи в основния.
Това е, когато се позовава на функцията, която трябва да го кажа
какво точно се нуждае, за да изпълнява своите задачи.
Друго добро нещо, което трябва да разгледаме и ще ви позволи да погледнете го в свободното си време,
и той беше облечен в теста е това понятие на обхвата
и локални променливи в сравнение с глобалните променливи.
Да обръщат внимание на това.
>> Сега, когато сме на това други неща,
Седмица 3 ние започнахме да говорим за търсене и сортиране.
Търсене и сортиране, поне в CS50
е много въведение към някои от най-теоретичните части на компютърната наука.
Проблемът на търсене, проблемът на сортиране
са големи, канонични проблеми.
Как можете да откриете определен брой в масив на милиарди числа?
Как можете да откриете конкретно име вътре в телефонния указател
, която се съхранява на вашия лаптоп?
И така ще се въведе това понятие на асимптотичната пъти тичам
наистина да количествено колко време, колко е трудно на тези проблемни,
колко дълго те вземат за решаване.
, Аз вярвам, 2011, викторина, че има проблем, че мисля, че заслугите
обхваща много бързо, което е този, проблем 12.
О, не, това е Омега.
>> Тук ние не говорим за възможно най-бързото време на изпълнение
за определен алгоритъм и след това възможно най-бавния тече в момента.
Това Омега и O са наистина само комбинации.
Те са забележки комбинации се казва, че
колко бързо по най-добрия случай ще ни алгоритъм план,
и как бавно в най-лошия възможен случай нашия алгоритъм ще бягаш?
Нека да направим няколко от тях, и те също са били покрити
в краткосрочен асимптотичната бройна система, която аз силно препоръчвам.
Джексън направи една наистина добра работа.
С двоично търсене, ние говорим за двоично търсене като алгоритъм,
и обикновено говорим за това по отношение на голямата си O.
Каква е голяма O?
Какво е възможно най-бавния време на изпълнение на двоично търсене?
Студентски] N ²?
Затвори, аз предполагам, подобна на тази.
Това е много по-бързо от това.
[Student] Binary? >> Да, двоично търсене.
[Student] Това е дневник н.
Вход N, така че това, което прави влезете N означава?
Тя полувремена всяка итерация.
Точно така, така че в най-бавния възможен случай,
казват, че ако имате сортиран масив
от един милион числа и броя търсиш
е първия елемент в масива или последния елемент в масива.
Не забравяйте, че двоичен алгоритъм за търсене работи, като погледнете в средата елемент,
виждат, че това е мач, който търсите.
Ако е така, тогава добре, вие го намери.
>> В най-добрия възможен случай, колко бързо се изпълнява двоично търсене?
[Студенти] 1.
1, това е константно време, голяма O от 1. Да.
[Student] Аз имам един въпрос. Когато казвате, влезте на N, искаш да кажеш по отношение на база 2, нали?
Да, така че това е друго нещо.
Ние казваме Дневник N, и аз предполагам, че когато бях в гимназията
Аз винаги се приема, че дневника е база 10.
Да, така че отговорът е "да", влезте база 2 обикновено е това, което ние използваме.
Отново, връщайки се към двоично търсене, ако търсите или
елемент в самия край или елемент в самото начало,
, защото започне в средата и след това да изхвърлите
в зависимост от това кое половина не отговарят на критериите, които търсиш,
и да отидете на следващия половин и следващата половина и в следващия половин.
Ако търсите най-големият елемент в цяло число млн. масив
Отивам да го намали наполовина най-регистър на 1 милион пъти
преди най-накрая тест и да видим, че елементът Търся
е в най-голямата или най-висок индекс на масива,
и че ще се регистър на N, влезте от 1 милион пъти.
>> Bubble вид.
Мислите ли, спомня алгоритъм вид балон?
Кевин, може ли да ми даде бърз рекапитулация на това, което се е случило в алгоритъма балон вид?
Кевин] По принцип тя преминава през всичко в списъка.
Изглежда първите две.
Ако първият е по-голям от втория Тя ги суапове.
След това сравнява второ и трето, едно и също нещо, суапове,
трето и четвърто, по целия път надолу.
По-големи числа ще последват до края.
И след като обаче много примки сте готови.
Точно така, така че това, което Кевин каза е, че ще гледаме по-големи числа
балон до края на масива.
Например, имаш ли нещо против да ни ходене през този пример, ако това е нашата масив?
[Кевин] ще взема 2 и 3.
3 е по-голяма от 2, така че можете да ги разменят.
[Нейт H.] Право, така че ние суап тях, така че да получите 2, 3, 6, 4 и 9.
Кевин Тогава сравни 3 и 6.
3 е по-малък от 6, така че можете да ги остави,
и 6 и 4, искате да ги разменят, защото 4 е по-малък от шест.
[Нейт H. надясно, така че да получите 2, 3, 4, 6, 9.
[Кевин] и 9 е по-голям от 6, така че можете да я оставите.
И ще се върнете отново през него.
>> [Нейт H.] съм направил в този момент? >> Кевин] Не
И защо не съм направил в този момент?
Защото изглежда като моя масив се сортират. Търся го.
[Кевин] през нея отново и се уверете, че няма да има повече суапове
преди да могат напълно да спре.
Точно така, така че трябва да продължа и да се уверите, че няма суапове
че можете да направите в този момент.
Наистина беше просто късмет, както ти каза, че ние в крайна сметка
само да направи 1 преминават през и ние сме подредени.
Но за да направите това в общия случай ще трябва да направите това отново и отново.
И в действителност, това е пример за възможно най-добрия случай,
като видяхме в проблема.
Видяхме, че възможно най-добрия случай е N.
Минахме през масива 1 път.
Какво е най-лошия възможен случай за този алгоритъм?
Кевин] N ².
И това, което изглежда това? Какво би поглед масив като това ще отнеме н време ²?
[Кевин] [недоловим] сортирани.
Точно така, така че ако имах масив 9, 7, 6, 5, 2,
първа 9 балон по целия път до.
След 1 итерация ще имаме 7, 6, 5, 2, 9.
Тогава 7 балон, 6, 5, 2, 7, 9, и така нататък и така нататък.
>> Ще трябва да мине през целия масив N пъти,
и всъщност можете да получите малко по-точно от това
, защото след като веднъж сме преместили 9 начина, по който в последната си възможна позиция
ние знаем, че ние никога не трябва да се сравни с този елемент отново.
След като започнете да бълбука 7
ние знаем, че можем да спрем, след като 7 е точно преди девет
тъй като ние сме вече в сравнение 9 към него.
Ако направите това по интелигентен начин, това не е наистина, аз предполагам, че много време.
Ти няма да се сравнят всички възможни недоловимите] комбинации
всеки път, когато минават през всяка итерация.
Но все пак, когато говорим за тази горна граница да кажем, че
търсите в N ² сравнения път през.
>> Нека да се върнем, и тъй като ние сме започват да стават малко по-кратко време
Бих казал, определено трябва да мине през останалата част на тази таблица,
запълни всичко.
Помислете примери. Помислете за конкретни примери.
Това е наистина удобно и полезно да се направи.
Равен.
Това е нещо на масата, че като ти мине през по компютърни науки
ти трябва наистина да започне да се знаят тези от сърце.
Това са въпроси, които изпаднали в интервюта.
Това са различни неща, които са добре да се знае,
и мисля за тези крайни случаи, наистина разберете как да мислим за
знаейки, че за балон сортирате възможно най-лошата масив
да сортирате с това е този, който е в обратен ред.
>> Указатели. Нека поговорим малко за указатели.
През последните няколко минути, което имаме тук
Знам, че това е нещо, което, заедно с файла I / O, която е доста нов.
Когато говорим за указатели причината, поради която искам да говоря за указатели
е така, защото, когато ние работим в C
ние сме наистина на доста ниско ниво, в сравнение с най-съвременни езици за програмиране.
Ние сме в състояние да манипулират променливите в паметта,
разбера, където те всъщност се намира в рамките на нашата RAM.
След като сте преминали, за да взима уроци операционната система, която ще видите
, че това е, отново, на абстракция.
Това всъщност не е случая.
Имаме виртуална памет, която се крие тези подробности от нас.
>> Но за сега може да се предположи, че когато имаш програма,
Например, когато започнете да пускате своите Цезар шифър програма
Ще се върнете обратно към моя IPAD наистина бързо
, че в самото начало си програма, ако имате, да кажем,
4 гигабайта RAM на вашия лаптоп,
да се отмени това парче, и ние ще се обадя RAM.
И започва на място, отиваме да се обадя 0,
и завършва на място, че ние ще се обадя 4 гигабайта.
Наистина не мога да пиша. Човече, това е хакнат.
Когато програмата се изпълнява
операционната система да напише RAM,
и задава различни сегменти за различни части от вашата програма за живеене.
Надолу тук тази област е на ничия земя.
Когато отиде малко по-далеч тук
имаш всъщност мястото, където
код за програмата живота.
Че действителните двоичен код, че изпълнимия файл всъщност получава заредени в паметта
когато стартирате програмата, и тя живее в сегмента на кода.
И както си програма изпълнява процесора разглежда този код сегмент
да разбера какво е следващата инструкция?
Каква е следващата линия на код трябва да изпълните?
>> Има също така и данни сегмент, и това е мястото, където тези низови константи
се съхраняват, че сте използвали.
И след това все по-нагоре има това място, наречено на куп.
Достъп до паметта там с помощта на изчистване
и след това към самия връх на вашата програма
има стека,
и това е мястото, където ние сме били играе през по-голямата част от началото.
Това не е скалата или нещо подобно.
Голяма част от това е много машина зависи,
операционната система зависима, но това е относително как нещата се състоят от.
Когато стартирате програмата и Вие декларирате променлива, наречена X-
Отивам да се направи друга кутия по-долу, и това ще бъде RAM, както и.
И аз отивам да гледам.
Ще изготвя назъбени линии, за да показват, че това е само една малка част от RAM
и не всички от него, тъй като ние привличаме най-отгоре.
>> Ако декларирам целочислена променлива, наречена X,
тогава какво всъщност се е картографиране
, които се съхраняват в таблицата символ на моята програма
, който свързва името на Х към този район на паметта, че съм съставен
между вертикалните линии.
Ако имам линия на код в моята програма, която казва х = 7
процесор си знае "О, добре, знам, че рентгеновите живота на това място в паметта."
"Отивам да вървим напред и там напишете 7."
Как не го знае какво място е в памет?
Е, това е всичко, направено по време на компилация.
Компилаторът се грижи за разпределяне, когато всяка една от променливите ще отидете
и създаване на специален картографиране, или по-скоро свързването на точките
между символ и къде отива, името на променливата
и къде отива да живее в паметта.
Но се оказва, че можем да го достъп в нашите програми, както и.
Това стана важно, когато започнем да говорим за някои от структурите от данни,
което е идеята, че отиваме да се въведат по-късно.
>> Но за сега, какво можете да знаете е, че мога да се създаде показалеца на това място, х.
За пример мога да създадете променлива показалеца.
Когато ние създаваме променлива указател ние използваме нотация звездата.
В този случай, това казва, че аз отивам да се създаде показалеца на вътр.
Това е един вид точно като всяка друга.
Ние го дадат променлива като у
и тогава ние, равна на адреса, на адрес.
В този случай, ние можем да настроите години да сочи към х
, като адрес на х, което правим с този символ,
и тогава ние години да сочи към него.
Това по същество е, ако се вгледаме в нашата RAM
това създава отделна променлива.
Това ще да го наричат ​​г.,
и когато този ред на код изпълнява
всъщност се случва да създаде малък показалеца, за които ние обикновено се използва като стрела,
и го постави г. да сочи към х.
Да.
[Student] Ако х е вече показалеца, бихте просто правя
Int * Y = X вместо с амперсанд?
Да.
Ако х е вече показалеца, след това можете да зададете два указатели равни един с друг,
в този случай Y не би х
но това ще посоча какъвто и да е х е насочена към.
За съжаление, ние сме извън времето.
>> Това, което ще кажа в този момент, можем да говорим за това офлайн
но бих казал започне работа през този проблем, # 14.
Можете да видите, че има вече малко попълнен за вас тук.
Можете да видите, че когато ние заявяваме 2 указатели, вътр Х и Y,
и имайте предвид, че сочи * до променливата е нещо, което беше направено миналата година.
Оказва се, че това е подобно на това, което правим тази година.
Няма значение къде пишете *, когато сте обявяване на показалеца.
Но сме написали * до вида
защото това го прави много ясно, че сте обявяване на показалеца променлива.
Можете да видите, че декларирането на две указатели ни дава 2 кутии.
Тук, когато ние х равна на изчистване
това се казва заделяне на памет в купчина.
Тази малка кутийка точно тук, този кръг, се намира на куп.
X е насочена към него.
Имайте предвид, че у все още не е насочен към нещо.
За да получите памет за съхраняване на номер 42 в х
ние ще използваме това, което нотация?
[Student] * х = 42.
Точно така, * х = 42.
Това означава, че следваш стрелката и хвърлят 42 там.
Тук, където ние ш и х Y сочи към х.
Отново, това е точно като това, което каза Кевин, където ние Y равна на х.
Y не е насочен към х.
Вместо това, тя сочи какво х е насочена както и.
>> И накрая в този последен прозорец има два възможни неща, които можем да направим.
Един от тях е, бихме могли да кажем * х = 13.
Другото нещо е, бихме могли да кажем Алекс, не знаеш какво можем да направим тук?
Може да се каже * х = 13 или
[Student] Може да се каже INT каквото.
[Нейт H.] Ако това беше посочено като едно цяло число променлива бихме могли да направим това.
Ние също може да се каже * Y = 13, защото те са, както сочи към едно и също място,
така че бихме могли да използваме променливи, за да стигнем до там.
Да. >> Студентски] Какво щеше да изглежда, като че ли можем просто да кажем, INT х е 13?
Това ще бъде за обявяване на нова променлива, наречена Х, който няма да работи.
Ще имаме сблъсък, защото ние декларирахме, за да бъде показалеца тук.
Студентски] Ако ние просто трябваше това твърдение само по себе си какво щеше да изглежда по отношение на кръга?
Ако имахме х = 13 тогава ние ще трябва кутия, и по-скоро, отколкото като стрела
излиза от кутията, ние ще го привлече като само на 13.
[Student] В кутията. Добре.
>> Благодаря ви за гледане и късмет на Quiz 0.
[CS50.TV]