[Powered by Google Translate] [Преглед] [Квиз 0]
>> [Лекси Рос, Томи МацВиллиам, Лукас Фреитас, Џозеф Онг] [Универзитет Харвард]
>> [Ово је ЦС50.] [ЦС50.ТВ]
>> Хеј, сви.
Добродошли на разматрање седници за квиз 0, која се одржава у среду.
Шта ћемо вечерас, ја сам са 3 друга поздрав,
и заједно ћемо да прођемо кроз преиспитивање онога што смо урадили у току до сада.
То неће да буде 100% свеобухватан, али би требало да вам дати бољу идеју
шта ли већ имате доле и шта још треба да уче пре среде.
И слободно да подигне руку са питањима као што ћемо заједно,
али имајте на уму да такође ћемо имати мало времена на крају
ако се кроз са неколико минута резервни да општих питања,
па имајте то на уму, па ћемо да почнемо од почетка са Недељи 0.
>> [Квиз 0 коментар!] [Део 0] [Лекси Рос] Али пре тога хајде да причамо о
логистика у квизу.
>> [Логистика] [Квиз се одржати у среду 10/10 уместо предавања]
>> [(Видети хттп://цдн.цс50.нет/2012/фалл/куиззес/0/абоут0.пдф за детаље)] То је у среду, 10. октобра.
>> То је у среду, а ако одете на овај УРЛ овде,
која је такође доступна са ЦС50.нет-ту је линк на њу,
можете видети информације о томе где да иду на бази
Ваше презиме или школа припадност, као и
она говори о томе шта квиз ће обухватити и врсте питања које ћете добити.
Имајте на уму да и ви ћете имати прилику да погледате у квизу у одељку
тако да ваши ТФС треба да иде преко неких практичних проблема,
и то је још један добра прилика да видимо где и даље морате да студирате за квизу.
Хајде да почнемо од почетка са Битес 'н' бита.
Запамтите мало је само 0 или 1,
а бајт је збирка од 8 ових бита.
Хајде да погледамо ову колекцију бита овде.
Требало би да смо у стању да схватимо колико битова има.
Где можемо да рачунамо само постоји 8 од њих, осам 0 или 1 ком.
А пошто има 8 бита, то је 1 бајт,
и идемо га конвертовати у хексадецимални.
Хексадецимални је база 16, и то је прилично лако да конвертујете
број у бинарном, што је оно што је, у броју у хексадецимални.
Све што радимо је да погледамо група 4,
и ми смо их претворили у одговарајућу цифру хексадецимални.
Почећемо са десне највише групи 4, па 0011.
То ће бити једна 1 и 2 једна, тако да заједно то чини 3.
А онда хајде да погледамо на другом блоку 4.
1101. То ће бити један 1, један 4 и један 8.
Заједно то ће бити 13, што чини Д.
А ми ћемо запамтити да у хексадецимални не само иди 0 до 9.
Идемо 0 до Ф, па после 9, 10 одговара,
11 до Б, и тако даље, где је Ф 15.
Ево 13 је Д
тако да га претворите у децимални све што радимо јесте заправо
третирати сваки позицију као моћ 2.
То је један од 1, 2 један, нула 4с, нула 8с, један 16, и тако даље,
и то је мало тешко да се израчуна у глави, али ако идемо на следећи слајд
можемо видети одговор на то.
>> У суштини ми идемо преко право назад лево,
и ми смо множењем свака цифра одговарајућом снагом 2.
И запамтите, за хексадецимални смо означили ове бројеве са 0к на почетку
тако да не бркају са децималним бројем.
Настављајући даље, ово је АСЦИИ табела,
и шта ми користимо АСЦИИ за је да се мапирају од знакова да нумеричке вредности.
Запамтите у криптографске псет смо направили велику употребу АСЦИИ табели
како да користе различите методе криптографије,
Цезарова и Вигенере шифра, конвертовање различитих слова
у низу према тастеру датог од стране корисника.
Хајде да погледамо мало АСЦИИ математике.
Гледајући 'п' + 1, у облику карактера који ће бити К
и не заборавите да '5 '= 5.
А како тачно ћемо конвертовати између оних 2 форми?
Није заправо превише тешко.
Да би добили 5 ми одузима '0 '
јер постоје 5 места између '0 'и '5'.
У циљу да иде на другу страну ми само додали 0,
тако да је нешто као редовне аритметике.
Само запамтите да када нешто има наводнике око њега то је карактер
и тако одговара вредност у АСЦИИ табели.
Прелазак у општијим темама рачунарских наука.
Научили смо шта је алгоритам и како ми користимо програмирање
имплементирати алгоритме.
Неки примери алгоритама су нешто заиста једноставно као
провере да ли је број паран или непаран.
За то се сећате да смо модифитсиране број са 2 и проверите да ли је резултат 0.
Ако је тако, чак је. Ако не, то је чудно.
И то је пример заиста основног алгоритма.
>> Мало више укључена једна је бинарна претрага,
што ћемо прећи преко касније у ревијалном седници.
А програмирање је термин који користимо за полагање алгоритам
и претварање да кодирају рачунар може да прочита.
2 Примери програмирања Греб,
што је оно што смо урадили у Недељи 0.
Иако ми заправо не откуцати код је начин спровођења
овај алгоритам, који се штампа бројеве 1-10,
и овде радимо исто у Ц програмском језику.
То су функционално еквивалентни, само написан на различитим језицима или синтаксе.
Онда смо сазнали Боолеан израза,
и боолеан је вредност која је истинито или лажно,
и овде често боолеан изразима
уђемо услова, тако да ако је (к ≤ 5),
Па, ми смо већ поставили к = 5, тако да се стање ће да процени да истина.
А ако је то истина, шта год код је испод стању
ће бити оцењен од стране рачунара, тако да ниска ће бити одштампана
на стандардном излазу, а термин стање
односи се на све што се налази унутар заграда у ако изјаве.
Запамтите све операторе.
Запамтите да су то && и | | када смо покушавали да комбинују 2 или више услова,
== Не = бисте проверили да ли 2 ствари су једнаке.
Запамтите да = је за доделу док == је боолеан оператер.
≤, ≥ а онда коначна 2 су сама по себи.
Општи преглед Булову логику овде.
А Булов израз су такође важни у петљи,
што ћемо прећи сада.
Научили смо око 3 врсте петљи до сада у ЦС50, за, док су, и то док.
И важно је да знате да, док за већину сврхе
ми заправо можемо генерално користе било који тип петље
постоје одређене врсте сврхе или заједничких образаца
у програмирању која се посебно позивају на једној од ових петљи
да би најефикаснији или елегантно да га кодирају на тај начин.
Идемо преко шта свака од ових петљи има тенденцију да се користи за већину често.
>> У фор петљи већ углавном знају колико пута желимо да прелазили.
То је оно што смо ставили у стању.
Јер, и = 0, и <10, на пример.
Ми већ знамо да желимо да урадимо нешто 10 пута.
Сада, за вхиле петље, генерално ми не нужно
знам колико пута желимо да петља да трчи.
Али ми знамо неку условом да желимо да
увек бити истините или лажне увек бити.
На пример, док је подешен.
Рецимо да је боолеан променљива.
Иако је то тачно желимо код процене,
па мало више проширивати, мало општији него за петље,
али свако за петљу се могу конвертовати у вхиле петље.
Коначно, да ли вхиле петље, што може бити најтежих схватити одмах,
се често користи када желимо да прво проценити код
пре првог када смо проверили стање.
Уобичајена употреба торбица за то док петља
је када желите да добијете унос корисника, а ви знате да желите да пита корисника
за унос барем једном, али ако вам не дају добар допринос одмах
желите да задржите питате их док су вам дати добар улаз.
То је најчешћи употреба не вхиле петље,
и погледајмо стварне структуре ових петљи.
Они увек обично имају тенденцију да прате ове обрасце.
>> На петљи за унутрашње имате 3 компоненте:
иницијализација, обично нешто као инт и = 0, где је ја контра,
стање, где желимо да кажемо покрене ово за петљу док тај услов и даље држи,
Као што сам <10, а онда на крају, упдате, који је како смо инкрементирање
бројач променљиву у сваком тренутку у току.
Уобичајена ствар да се види да је само и + +,
што значи инкрементирање сам од 1 сваки пут.
Ви такође можете да урадите нешто као ја + = 2,
што значи додати 2 да ја сваки пут кад идем кроз петљу.
А онда урадите то само односи на било који код који заправо води као део петље.
А за вхиле петље, овај пут смо заправо имају иницијализацију ван петље,
тако, на пример, рецимо да ми покушавамо да урадимо исту врсту петље као што сам управо описао.
Ми бисмо рекли инт и = 0 пре него што почне петља.
Онда бисмо могли рећи, а ја <10 урадили,
тако да је исти блок кода као и раније,
и овај пут је исправка део кода, на пример, и + +,
заправо иде унутар петље.
И на крају, за то док, то је слична вхиле петље,
али морамо имати на уму да ће код проценити када
пре него што је услов проверава, тако да чини много више смисла
ако се осврнемо на то у реду врха до дна.
У уради док петља код процењује пре него што чак погледате док стању,
док је вхиле петље, проверава први.
Изјаве и променљиве.
Када желимо да створимо нову променљиву најпре желе да га покрене.
>> На пример, инт бар покреће променљиву бар,
али не дају неку вредност, па шта је сада барској вредност?
Ми не знамо.
То може бити неки смеће вредност која је претходно сачуване у меморији тамо,
а ми не желимо да користимо ту променљиву
док ми заправо му дати вредност,
па смо га прогласити овде.
Онда смо иницијализовати да буде 42 испод.
Сада, наравно, знамо да то може да се уради на једној линији, инт = 42 бара.
Али само да буде јасно вишеструке кораке које ће он,
декларација и иницијализација се посебно дешава овде.
То се дешава на једном кораку, а следећи инт баз = бар + 1,
ова изјава у тексту, да се повећава Баз, тако да је на крају овог блока кода
ако смо били за штампање вредност Баз било би 44
јер ми изјављујемо и иницијализовати га буде 1> бара,
и онда смо га увећати још једном са + +.
Ишли смо у овом лепом кратко, али је добро имати општи
разумевање онога теме и догађаји су.
Ми смо углавном радили у Огреби,
па можете мислити нити као више секвенци кода
ради у исто време.
У стварности, то је вероватно не ради у исто време,
али некако апстрактно можемо мислити о томе на тај начин.
>> У Сцратцх, на пример, имали смо више Спрајтови.
Могло би се извршава различит код у исто време.
Могло би бити ходање док други говори нешто
у другом делу екрана.
Догађаји су још један начин да одвајање ван логике
између различитих елемената вашег кода,
Огреби и ми смо били у стању да симулирају догађаје користећи емитовање,
и то је заправо Кад прими, не Када чујем,
али у суштини то је начин да се преносе информације
из једног у други спрајт.
На пример, можда ћете желети да пренесу игру преко,
и када други спрајт прими игру преко,
реагује на одређени начин.
То је важно за разумевање модела за програмирање.
Само да иде преко основног Недељи 0, шта смо прошли кроз тако далеко,
хајде да погледамо овај једноставан Ц програм.
Текст може бити мало мали одавде, али ћу ићи преко њега заиста брзо.
Ми укључујући 2 Главом фајлове на врху, цс50.х и стдио.х.
Ми смо тада дефинише константан зове лимит бити 100.
Ми смо тада спроводи наш главни функцију.
Пошто смо овде не користите аргументе командне линије морамо ставити празнину
као аргумената за главни.
Видимо инт горе главни. То је повратак тип, па се врати 0 на дну.
И ми користимо ЦС50 библиотечке функције добити инт
да пита корисника за улаз, а ми смо га сачувате у овом променљивом к,
тако да смо прогласити изнад к, а ми смо га покрене са к = ГетИнт.
>> Ми смо затим проверите да ли је корисник нам је дао добру улаз.
Ако је ≥ РОК желимо да врати код грешке од 1 и одштампа поруку о грешци.
И на крају, ако је корисник дао нам добар улаз
ћемо средити број и штампају тај резултат.
Само да се уверите да су они сви хит кући
можете видети ознаке различитих делова кода овде.
Поменуо сам константне, заглавља датотеке.
О, инт. Уверите се да запамтите да је локална променљива.
То је у супротности са глобална променљива, што ћемо разговарати о томе
касније мало у ревијалном седници,
и ми смо иф позивом библиотеке функцију,
па ако нисмо били су стдио.х заглавља датотеке
не бисмо могли да принтф позове.
И ја верујем да је стрела који је добио одсекао овде указује на% д,
што је обликовање стринг у инт.
Она каже да одштампате ову променљиву као број,% д.
И то је за Недељи 0.
Сада Луцас ће се наставити.
Хеј, момци. Моје име је Лукас.
Ја сам студент друге године у најбољој кући на кампусу, Матхер,
и ја ћу да причам мало о Недељи 1 и 2,1.
[Недеља 1 и 2,1!] [Луцас Фреитас]
Како Лекси је говорио, када смо почели превођења код од нуле до Ц
једна од ствари коју смо приметили је да не може само
напиши код и покрените га користите више зелену заставу.
Заправо, морате да користите неке кораке како би ваш Ц програм
постала извршна датотека.
У суштини оно што радите када пишете програм је да
да преведете своју идеју у језику који разуме преводилац,
па кад пишете програм у Ц
шта радиш заправо пише нешто што ваш компајлер ће да разуме,
и онда компајлер ће превести тај код
у нешто што ће ваш рачунар разуме.
>> А ствар је, ваш рачунар је заправо веома глуп.
Ваш рачунар може разумети само 0с и 1с,
па заправо у првим рачунарима људи обично програмиран
коришћењем 0с и 1с, али не више, хвала Богу.
Ми не треба да памтите секвенце за 0с и 1с
за за петљу или за вхиле петље и тако даље.
Зато имамо компајлер.
Шта компајлер ради је у суштини превођење Ц кода,
у нашем случају, на језику који ће рачунар разумети,
која је предмет код и компајлер да смо помоћу
зове се јека, тако да је ово заправо симбол за кланг.
Када имате свој програм, морате да урадите 2 ствари.
Прво, морате да састави свој програм, а онда ћеш да покренете програм.
Да би саставио свој програм имате много опција да то учини.
Први је да се уради програм.ц кланг
у који програм је име вашег програма.
У том случају можете видети они само кажу: "Хеј, компајлирам свој програм."
Ви не кажете: "Желим то име за мој програм" или нешто.
>> Друга опција даје име свог програма.
Можете рећи зазвечати-О, а затим име које желите
извршна датотека да се зове као и онда програм.ц.
А можете да урадите да програм и видети како се у прва 2 случаја
Ставио сам ц и. На трећем Имам само програме?
Да, ви заправо не би требало ставити ц када користите направити..
Иначе преводилац заправо ће викати на тебе.
Такође, не знам да ли ви сећате,
али много пута смо се користи-лцс50 или-лм.
То се зове повезивање.
То је само говори компајлеру да ћете користити оне библиотеке тамо,
тако да ако желите да користите цс50.х сте заправо морали да куцате
зазвечати програм.ц-лцс50.
Ако не урадите то, компајлер неће да зна
да користите те функције у цс50.х.
А када желите да покренете свој програм имате 2 опције.
Ако сте кланг програм.ц нисте дали име свог програма.
Ви морате да покренете коришћењем / а.оут..
А.оут је стандардна име које зазвечати даје свој програм ако не му дати име.
Иначе ћеш урадити / програм. Ако сте дали име свог програма,
и ако јесте да програм име које програм ће добити
већ ће бити програмиран исто име као ц датотеку.
Онда смо разговарали о типовима података и података.
>> У основи типови података су иста ствар као мале кутије које користе
за чување вредности, тако да типови података су заправо баш као Покемонс.
Они долазе у свим величинама и врстама.
Ја не знам да ли је аналогија смисла.
Података величина заправо зависи машине архитектури.
Сви подаци величине да ћу овде да покажем
заправо за 32-битне машине, што је случај нашег апарата,
али ако ви заправо кодирање ваш Мац или Виндовс, такође, у
Вероватно ћете имати 64-битни машина,
па сетите да су подаци величине које ћу показати овде
су за 32-битне машине.
Прва коју смо видели била инт
што је прилично једноставно.
Ви користите инт да ускладишти природан број.
Такође смо видели карактер, цхар.
Ако желите да користите писмо или мало симбол вероватно ћеш користити знак.
Цхар има 1 бајт, што значи 8 битова, као Леки рекао.
У суштини имамо АСЦИИ табелу која има 256
могуће комбинације 0 и 1с,
и онда када откуцате знак да ће превести
лик који улази ви број који имате у АСЦИИ табели, као Леки рекао.
Ми такође имамо пловак, коју користимо за чување децималне бројеве.
Ако желите да изаберете 3.14, на пример, идете да користите пловак
или дупло има више прецизности.
Пловак има 4 бајта.
Двапут има 8 бајтова, тако да једина разлика је прецизност.
Такође имамо дуг који се користи за целих бројева,
и можете видети за 32-битне машине инт и дуго имају исту величину,
тако да заправо не смисла да користе дуго у 32-битној машини.
>> Али, ако користите Мац и 64-битни машина, заправо дуго има величину 8,
тако да стварно зависи од архитектуре.
За 32-битне машине то нема смисла да користи дуго заиста.
И онда дуго дуго, с друге стране, има 8 бајтова,
па је веома добро ако желите да имате дужу природан број.
И на крају, имамо низ, што је заправо знак *
који је показивач на цхар.
То је врло лако да мисле да је величина низа ће бити као
број знакова да сте тамо имају,
али заправо знак сама *
има величину показивача на знак, који је 4 бајта.
Величина једног цхар је 4 бајта.
Није битно да ли имате малу реч или писмо или нешто слично.
То ће бити 4 бајта.
Такође смо научили нешто о ливење,
Дакле, као што можете да видите, ако имате, на пример, програм који каже
инт к = 3 и онда принтф ("% д", к / 2)
Шта ви момци знају шта ће да штампају на екрану?
>> Неко >> [Студенти] 2.
1. >> 1, да.
Када радите 3/2 да ће добити 1,5,
али пошто смо користите цео ће то игнорисати децимални део,
и ти ћеш имати 1.
Ако не желите да се то деси што можете да урадите, на пример,
се прогласи флоат и = к.
Тада к које су биле 3 ће сада бити 3.000 уи.
А онда можете да одштампате и / 2.
Заправо, требало би да имам 2. тамо.
То ће учинити 3.00/2.00,
и ти ћеш добити 1.5.
И ми имамо тај .2 ф само да питам за 2 децимална јединица у децималном делу.
Ако имате .3 ф да ће то заиста имати 1.500.
Ако је 2 то ће бити 1,50.
Такође имамо и овде случај.
Ако не плива к = 3,14 и онда принтф к
ћеш добити 3.14.
А ако ти је к = инт к,
што значи да третирају као инт к и штампање Кс сада
ћеш имати 3,00.
Да ли то смисла?
Зато што си прво третирање к као цео број, тако да сте занемарујући децимални део,
и онда ти штампање к.
И на крају, можете да урадите ово,
инт к = 65, и онда прогласе цхар ц = к,
и онда ако штампате ц заправо ћеш добити
, Тако да у суштини оно што радите овде
је превођење цео у карактеру,
баш као АСЦИИ табела ради.
Такође смо разговарали о математичким операторима.
Већина од њих су прилично једноставне, тако +, -, *, /,
а такође смо разговарали о мод, што је остатак поделе на 2 бројева.
Ако имате 10% 3, на пример,
то значи да подели 10 са 3, а шта је остатак?
То ће бити 1, па то је заправо веома корисно за много програма.
За Вигенере и Цаесар Прилично сам сигуран да сви од вас користи мод.
О математичким операторима, будите веома пажљиви при комбиновању * и /.
>> На пример, ако радите (3/2) * 2 шта ћеш добити?
[Студенти] 2.
Да, 2, јер 3/2 ће бити 1,5,
али пошто радиш операције између 2 целих
сте заправо само ће размотрити 1,
и онда 1 * 2 ће бити 2, па будите веома, веома опрезни
када радиш аритметику са целих због
можете добити да 2 = 3, у том случају.
И такође бити веома опрезан у вези првенства.
Обично треба да користите заграде да бисте били сигурни да знате шта радите.
Неки корисни пречице, наравно, један је и + + или и + = 1
или коришћењем + =.
То је иста ствар као раде и = и + 1.
Такође можете да урадим - или ја - = 1,
што је иста ствар као и = и -1,
нешто момци ви користите много у за петље, најмање.
Такође, за *, ако користите * = и ако то урадите, на пример,
и * = 2 је иста ствар као да сам = и * 2,
а иста ствар за поделе.
Ако радите и / = 2 то је иста ствар као и = и / 2.
>> Сада о функцијама.
Ви сазнао да су функције веома добра стратегија да сачувате шифру
док сте програмирања, тако да ако желите да извршите исти задатак
у коду опет и опет, вероватно желите да користите функцију
само тако да не морате да копирате и налепите код изнова и изнова.
Заправо, главни је функција, а када сам вам показати формата функције
ћете видети да је то прилично очигледно.
Ми користимо функције из неких библиотека,
На пример, иф, ГетИн, који је од ЦС50 библиотеке,
и друге функције као што тоуппер.
Све ове функције се заправо спроводе у другим библиотекама,
и када се те тетхер фајлове у почетку вашег програма
кажете да ли молим вас дајте ми код за те функције
тако да не морате да их спроведе сама?
А такође можете да напишете своје функције, тако да када почнете програмирање
схватите да библиотеке немају све функције које су вам потребне.
За последњи псет, на пример, писали смо нерешено, јагму, и проналажење,
и то је веома, веома важно да буде у стању да напише функција
јер су корисне, а ми их користимо све време у програмирању,
и штеди доста кода.
Формат функција је овај.
Имамо повратни тип у почетку. Шта је повратак тип?
То је само када је функција ће да се врате.
Ако имате неку функцију, на пример, факторијел,
који ће за израчунавање факторијела целог броја,
Вероватно ће то такође вратити цео број.
Затим повратак тип ће бити инт.
Принтф заправо има повратни тип празнину
јер не враћају ништа.
Ти само штампањем ствари на екрану
и одвикавање потом функцију.
Онда имате име функције које можете да одаберете.
Требало би да буде мало разуман, као што не бирају такво име киз
или као к2ф.
Покушајте да се име које има смисла.
>> На пример, ако је факторијел, кажу факторијел.
Ако је функција која ће привући нешто, назовите га нацртам.
И онда имамо параметре, који се такође називају аргументи,
који су као ресурса који су потребни ваша функција
из кода да изврши свој задатак.
Ако желите да израчунате факторијел броја
Вероватно вам је потребно да имате број за израчунавање факторијел.
Један од аргумената да ћеш да је сама број.
А онда ће да уради нешто и врати вредност на крају
осим ако је то празнина функција.
Хајде да видимо један пример.
Ако желим да напишем неку функцију која сумира све бројеве у низу целих бројева,
пре свега, повратак тип ће бити инт
јер имам низ целих бројева.
А онда ћу имати име функције као сумАрраи,
а онда ће да се сама низ, да инт нумс,
а затим и дужина низа, тако да знам колико бројева Морам да сумирам.
Онда морам да покрене променљиви зове суму, на пример, за 0,
и сваки пут кад видим елемент у низу бих га додате у свему, тако да сам за петљу.
Баш као Леки рекао, ти инт и = 0, и <дужина и ја + +.
А за сваки елемент у низу јесам сума + = нумс [и]
и онда сам се вратио суму, тако да је врло једноставно, а то штеди доста кода
ако користите ову функцију много пута.
Онда смо узели погледамо условима.
Имамо ли, иначе, и друго ако.
Хајде да видимо шта је разлика између њих.
Баците поглед на ова 2 кодова. Која је разлика између њих?
Први је, у основи кодови желим да кажем
ако број је +, - или 0.
Прва каже да ако је> 0 онда је позитиван.
Ако је = 0 онда да је 0, а ако је <0 онда је негативан.
>> И други ради ако иф, елсе.
Разлика између њих је да је ово једна заправо неће
проверите да ли је> 0, <0 или = 0 три пута,
тако да ако имате број 2, на пример, да ће то доћи и рећи:
иф (к> 0), а то ће рећи да, тако да штампам позитиван.
Али, иако знам да је то> 0 и то неће бити 0 или <0
И даље ћу да урадим је то 0, то је <0,
па ја заправо идем унутар оклијевања да ја не морам да
јер сам већ знао да то неће задовољити било који од ових услова.
Ја могу да користе ако иф, елсе изјава.
То је у основи каже да ако је к = 0 да штампам позитивно.
Ако није, ја ћу да се тестирати.
Ако је 2 не идем да радим ово.
У суштини, ако сам имао к = 2 што би рекли
иф (к> 0), да, тако да одштампате ово.
Сада када знам да је> 0 и да је задовољан првом уколико
Нећу чак ни да покрене овај код.
Код ради брже, заправо, 3 пута брже ако користите ово.
Такође смо сазнали и и или.
Ја не идем кроз ово јер Лекси већ разговарали о њима.
То је само && и | | оператора.
>> Једино што ћу рећи је да буде опрезан када имате 3 услове.
Користите заграде, јер је врло збуњујуће када имате услов
и још један или други.
Користите заграде само да би били сигурни да ваши услови смисла
јер у том случају, на пример, можете замислити да
то би могао да буде први услов и један или други
или су услови у комбинацији 2 у и
или трећи, па само будите опрезни.
И коначно, ми смо разговарали о прекидача.
Прекидач је веома корисно када имате променљиву.
Рецимо да имате променљиву као н
то може да буде 0, 1 или 2, и за сваки од тих случајева
ћеш да изврши задатак.
Можете рећи укључите променљиву, а то значи да
вредност онда је као вредност1 ћу да урадим ово,
и онда сам паузу, што значи да нећу гледати на било коју од других случајева
јер смо већ задовољни тај случај
и онда вредност2 и тако даље, и ја такође могу имати прекидач подразумевани.
То значи да ако се не задовољава ниједан од случајева које сам имао
да ћу да урадим нешто друго, али то је опционо.
То је све за мене. Сада идемо на Томија.
Добро, ово ће бити недеља 3-исх.
Ово су неке од тема ћемо се покривају, Црипто, обим, низове, и тако даље.
Само брзо реч о крипто. Нећемо да закуца ове куће.
>> Ми смо то урадили у псет 2, али за квиз да ли знате разлику
између Цезара шифри и Вигенере шифри,
како и од оних рада шифрама и како је за шифровање
и дешифровање текста помоћу те шифре 2.
Запамтите, Цезарова шифра једноставно окреће сваки знак за исти износ,
пазећи да мод по броју слова у алфабету.
А Вигенере шифра, с друге стране, ротира сваки карактер
другачијим износ, тако да уместо да каже
Сваки лик ротирана за 3 Вигенере ће ротирати сваки карактер
другачијим износ у зависности од неког кључну реч
где свако слово у кључну представља неки други износ
да бисте ротирали јасан текст.
Хајде да прво говоримо о променљивом обиму.
Постоје 2 различита типа променљиве.
Ми имамо локалне променљиве, и то ће бити дефинисано
ван главног или ван било које функције или блока,
и то ће бити доступна било где у вашем програму.
Ако имате функцију и у тој функцији је, а петља
велика глобална променљива је доступна свуда.
Локална променљива, с друге стране, сцопед на место где се дефинише.
>> Ако имате овде функцију, на пример, имамо ову функцију г,
и унутар г постоји променљива овде зове и
а то значи да је локална променљива.
Иако је ова променљива се назива год
и ове променљиве се зове И ове 2 функције
Немам појма шта једни другима локалне променљиве су.
С друге стране, овде кажемо инт к = 5,
и ово је изван опсега било које функције.
То је ван делокруга главни, тако да је ово Глобална променљива.
То значи да унутар ових 2 функција када кажем Кс - или к + +
Ја приступа исту к при чему то и и то и су различите променљиве.
То је разлика између глобална променљива и локалне променљиве.
Што се тиче дизајна тиче, понекад је вероватно боља идеја
да променљиве локалне кад год евентуално могу
јер има гомила глобалних променљивих може добити заиста збуњујуће.
Ако имате гомилу функција свих измена исту ствар
можда заборавити шта ако је ова функција случајно модификује ова глобална,
и ова друга функција не зна о томе,
и то не добити прилично збуњујуће као што сте добили више кода.
Имајући променљиве локалне кад год евентуално могу
је само добар дизајн.
Низови, запамтите, просто спискови елемената истог типа.
Унутар ЦИ не може имати списак као 1, 2.0, здраво.
Ми не можемо то да урадим.
>> Када смо прогласити низ у Ц сви елементи морају бити истог типа.
Овде имамо низ од 3 целих бројева.
Овде имам дужину низа, али ако само сам га проглашава у овој синтакси
где сам прецизирао шта је све елементе се не треба овај технички 3.
Компајлер је довољно паметан да схватим колика је низ треба да буде.
Сада када желим да се или поставите вредност низа
ово је синтакса за то.
То ће заправо изменити други елемент низа, јер, сетите се,
бројевима почиње на 0, а не у 1.
Ако желим да прочитам ту вредност могу да кажем нешто као инт к = арраи [1].
Или, ако желим да подесите ту вредност, као што радим овде,
Ја могу да кажем арраи [1] = 4.
То време приступа елементе свог индекса
или њихов положај или када су у низу,
и да је списак почиње од 0.
Ми такође могу имати низове низова,
и то се зове мулти-димензионални низ.
Када имамо мултидимензионални низ
То значи да можемо да имамо нешто попут редова и колона,
а ово је само један од начина да визуелно овог или размишљате о томе.
Када имам мултидимензионални низ то значи да ћу почети требати
више од 1 индекс, јер ако имам мрежу
Само кажем шта сте у ред нам не даје број.
То је заиста само ће нам дати списак бројева.
Рецимо да сам овде тај низ.
Имам низ зове мрежа, а ја кажем да је 2 редове и 3 колоне,
па ово је један од начина да се то визуелно.
Кад кажем да желим да се елемент на [1] [2]
то значи да, јер су редови, а затим колоне
Ја ћу да скочим на ред 1, јер сам рекао 1.
>> Онда ћу да дођем овамо на колоне 2, и ја ћу добити вредност 6.
Смисла?
Мулти-димензионални низови, запамтите, технички су само низ потеза.
Можемо имати низове низова низова.
Можемо да наставим, али заиста један начин да се размишља о томе
како се ово изнео и шта се дешава је да се визуализује
у мрежи као што је овај.
Када прођемо низове на функцијама, они ће да се понашају
мало другачије него када смо прође редовне променљиве функције
као проласка инт или пловак.
Када прођемо у инт или цхар или било који од ових других типова података
само смо узели погледамо ако функција мења
вредност тог променљиве та промена неће пропагира горе
до позива функције.
Уз низ, с друге стране, да ће се десити.
Ако прођем у низу да се неке функције и да функција мења неки од елемената,
када се вратим до функције које га зове
мој низ сада ће бити другачије, а вокабулар за то
је низови доноси референце, као што ћемо видети касније.
Ово се односи на то како показивачи рада, где су ови основни типови података,
С друге стране, доноси вредности.
>> Можемо размишљати о томе како да направите копију неког променљиве, а затим пролази у копији.
Није битно шта радимо са том променљиве.
Расписивање функција неће бити свестан да је промењена.
Низови су само мало другачији у том смислу.
На пример, као што смо управо видели, главни је једноставно функција
да узме у 2 аргумената.
Први аргумент да је главна функција је аргц, или број аргумената,
а други аргумент се зове аргв,
и оне су стварне вредности тих аргумената.
Рецимо да имамо програм који се зове тхис.ц,
а ја кажем да ово, а ја ћу да покренем овај у командној линији.
Сада да прође у неким аргументима мом програму назвао,
Могао бих да кажем нешто / ово је цс 50..
То је оно што ми замишљамо Давид радимо сваки дан на терминалу.
Али, сада је главна функција унутар тог програма
има ове вредности, тако да је аргц 4.
То може бити мало збуњујуће, јер стварно ми само пролази у је цс 50.
То је само 3.
Али запамтите да је први елемент аргв или први аргумент
је назив саме функције.
То значи да имамо овде 4 ствари,
а први елемент ће бити / ово..
И ово ће бити представљен као стринг.
Затим преостали елементи су оно што смо унели после имена програма.
Дакле, само што у страну, као што смо видели у вероватно псет 2,
запамтите да стринг 50 се = целобројни 50.
Дакле, ми не можемо рећи нешто попут: "инт к = аргв 3".
>> То једноставно не иде да има смисла, јер је ово стринг, а ово је цео број.
Дакле, ако желите да конвертујете између 2, запамтите, ми ћемо
имају ову магичну функцију зове атои.
Који узима стринг и враћа цео број представљен инсиде тог низа.
Дакле, то је лако направити грешку на квизу,
Само мислим да ће то аутоматски бити исправан тип.
Али, само знам да ће то увек бити жице
чак и ако стринг садржи само цео број или знак или пловак.
Дакле, хајде да причамо о покретању време.
Када имамо све ове алгоритме који раде све те луде ствари,
постаје заиста корисно да поставим питање: "Колико су узели?"
Ми представљамо то нешто зове асимптотско нотација.
Дакле, ово значи да је - добро, хајде да кажемо да дамо алгоритам
неки стварно, стварно, стварно велики улаз.
Ми желимо да поставимо питање: "Колико дуго ће то трајати?
Колико кораци ће трајати наш алгоритам за покретање
у функцији од величине улаза? "
Дакле први начин можемо описати покрене време је са великим О.
А ово је наш најгори случај трчање време.
Дакле, ако желите да сортирате низ, и дајемо наш алгоритам низ
то је у опадајућем редоследу, када је требало да буде у растућем редоследу,
то ће бити најгори случај.
Ово је наша горња граница у максималној дужини времена наш алгоритам ће узети.
С друге стране, ово је Ω ће описати најбоље случаја време рада.
Дакле, ако дајемо вец сортирани низ на сортирање алгоритам,
колико дуго ће требати да га сортирате?
И то је, онда, описује нижа граница на вођење време.
Дакле, овде су само неке речи које описују неке заједничке трчање пута.
То су у растућем редоследу.
Најбржи пут имамо ради се зове константан.
>> То значи да без обзира на то колико елемената дајемо наш алгоритам,
без обзира колико је велика наша низ је, сортирање га
или радите шта год ми раде низа ће увек заузимају исту количину времена.
Тако да могу да представљају то само са 1, што је константа.
Такође смо гледали логаритамском време извршавања.
Дакле, нешто као бинарни претрагу је логаритамска,
где смо исекли проблем у пола сваки пут
и онда се ствари само се већи од тамо.
И ако сте икада пишете О било факторске алгоритма,
вероватно не би требало да размотри ово као свој дневни посао.
Када упоредимо трчање пута важно је имати на уму ове ствари.
Дакле, ако имам алгоритам који је О (н), и неко други
је алгоритам О (2н) су заправо асимптотски еквивалентна.
Дакле, ако замислимо н бити велики број као елевенти милијарде:
па кад смо у односу елевенти милијарди нешто слично елевенти милијарди + 3,
изненада да +3 заиста нема више велику разлику.
Зато ћемо почети с обзиром на те ствари буду еквивалентни.
Па је и као ових константи овде, тамо је 2 к ово, или додавањем 3,
ово су само константе, а то ће пасти горе.
Зато све 3 од ових рун времена су исто као и рећи да су О (н).
Слично томе, ако имамо 2 други одрадили пута, рецимо О (н + 2н ² ³), можемо додати
+ Н, + 7, а онда ћемо имати још једну рун пут то је само о (н ³).
опет, то су иста ствар, јер то - то нису исти.
То су исте ствари, жао ми је. Дакле, то су исти јер
н ³ тхис ће доминирати тхис 2н ².
>> Оно што није иста ствар је ако смо покренули пута као О (н ³) и О (н ²)
јер н ³ је много већа од ове н ².
Дакле, ако имамо експонента, одједном то почиње да битно,
али када смо управо бавимо са факторима као што смо ми овде,
онда неће битно, јер они само иду испадне.
Хајде да погледамо неке од алгоритама које смо видели до сада
и разговарају о свом време извршавања.
Први пут у потрази за број у листи, који смо видели, било линеарно претраживање.
А примена линеарне претраге је супер једноставно.
Ми само имамо списак, а ми ћемо да погледамо сваки елемент у листи
док не нађете број тражимо.
То значи да у најгорем случају, то О (н).
А најгори случај овде може бити ако је елемент
последњи елемент, затим користећи линеарну претрагу морамо да погледамо сваки елемент
док не дођемо до последњег, како да знам да је то заправо био на листи.
Ми не можемо једноставно одустати на пола пута и кажу: "То вероватно није тамо."
Са линеарном претрагу морамо да погледамо целу ствар.
Најбољи случаја трчање време, с друге стране, је константна
јер у најбољем случају елемент тражимо је само први на листи.
Тако да ће нам узети тачно 1 корак, без обзира колика је листа
ако тражимо првог елемента сваки пут.
>> Дакле, када претражујете, запамтите, он не захтева да наша листа буде сортирана.
Зато смо једноставно ћемо гледати преко сваког елемента, а то није ни битно
којим редоследом ти елементи су унутра
Интелигентнији претраживач алгоритам је нешто као бинарни претрагу.
Запамтите, имплементација бинарног претраживања је када ћеш да
настави да тражи на средини листе.
И зато гледамо на средини, потребно је да се листа сортирана
иначе не знамо где је средњи је, и морамо да погледамо у
цела листа да га пронађете, а затим у том тренутку смо само губимо време.
Дакле, ако имамо сортирани списак и нађемо средину, ми ћемо упоредити средину
елементу тражимо.
Ако је превисока, онда можемо да заборавимо десној половини
јер знамо да ако је наш елеменат је већ сувише висока
и све десно од овог елемента је још већи,
онда не треба да постоји изгледају више.
Где с друге стране, ако је наш елеменат је пренизак,
знамо све са леве стране тог елемента такође је пренизак,
тако да заправо не смисла да тамо погледам, било.
На овај начин, са сваким кораком и сваки пут гледамо средину листе,
ћемо смањити наш проблем у полувремену, јер одједном знамо
гомила бројева који не може бити онај кога тражимо.
>> У Псеудокод би изгледати отприлике овако,
и зато смо сечење листу пола сваком тренутку,
наши најгори случај за време извршавања скаче са линијског на логаритамску.
Тако изненада имамо пријављивање у корацима у циљу пронаћи неки елемент у листи.
Најбољи случаја трчање време, међутим, још увек је константан
јер сада, рецимо само да је елемент тражимо јесте
Увек тачан средњи првобитног списка.
Тако да можемо да расте нашу листу велики као хоћемо, али ако елемент тражимо је на средини,
онда само ће нам узети 1 корак.
Зато смо О (лог н) и Ω (1) или константна.
Хајде да ствари покрене бинарну претрагу на овој листи.
Дакле, хајде да кажемо да тражимо елемента 164.
Прва ствар коју ћемо да урадимо је наћи средину ове листе.
Тако се дешава да само средиште ће пасти између ова 2 броја,
па рецимо само произвољно рећи, сваки пут средину пада између 2 броја,
хајде само да заокружи.
Ми само треба да будемо сигурни да ово урадите сваки корак на том путу.
Дакле, ми ћемо заокружити, а ми ћемо рећи да 161 је средином нашој листи.
Дакле, 161 <164, а сваки елемент лево од 161
је такође <164, тако да знамо да то неће да нам помогне на све
да почнете да тражите овде, јер је елемент тражимо не може бити тамо.
Дакле, шта можемо да урадимо је да можемо да заборавимо тој целој левој половини листе,
а сада само разматра са десне стране 161 па надаље.
>> Дакле, опет, ово је средину, нека само заокружи.
Сада 175 је превелика.
Дакле, ми знамо да неће да нам помогне у потрази овде или овде,
па можемо само да баци то назад, и на крају ћемо погодити 164.
Сва питања о бинарном претрагу?
Идемо даље од тражења преко вец сортиране листе
да заиста узимање листу бројева у било ком редоследу
и да на тај списак у растућем редоследу.
Први алгоритам смо гледали звала мехур врста.
И то би било једноставније од алгоритама смо видели.
Буббле сорт каже да када неки елементи унутар 2 списку су ван места,
што значи да је већи број са леве стране мањег броја,
онда ћемо да их замене, јер то значи да ће бити списак
"Више поређано" него што је била раније.
А ми смо само ћемо опет наставити овај процес и опет и опет
док се на крају елементи врста балона на њихову тачну локацију и имамо сортиран списак.
>> Рун време то ће бити О (н ²). Зашто?
Па, зато што у најгорем случају, ми ћемо узети сваки елемент, и
ћемо завршити у поређењу са сваком другом елементу у листи.
Али, у најбољем случају, имамо већ сортиране листе, балон је некако
Само ћу да прођем кроз једном рећи "Не Нисам правио никакве свопови., тако да сам урадио."
Дакле, имамо најбоље случај покренут време Ω (н).
Хајде да покренемо неку врсту балон на листи.
Или прво, хајде да погледамо неке Псеудокод заиста брзо.
Желимо да кажемо да пратите, у сваком итерацији петље,
води евиденцију о томе да ли смо или нисмо променили неке елементе.
Дакле разлог за то је, ми ћемо се зауставити када нисмо заменили никакве елементе.
Дакле, на почетку нашег петље нисмо заменили ништа, па ћемо рећи да је то лаж.
Сада ћемо да прођемо кроз листу и упоредите елемент ја да сам елемента + 1
и ако је тачно да постоји већи број са леве стране мањег броја,
онда ми ћемо само да их замене.
>> А онда ћемо се сетити да смо се заменили елемент.
То значи да морамо да идемо кроз листу најмање 1 више времена
јер је стање у којем смо се зауставили када је цела листа већ сортиран,
што значи да нисмо направили никакве свопови.
Зато је наш услов овде је 'а неки елементи су заменили ".
Дакле, хајде да погледамо ово ради на листи.
Имам списак 5,0,1,6,4.
Буббле сорт ће почети скроз у лево, и то ће да се упореди
Тхе и елементи, па од 0 до и + 1, што је елемент 1.
То ће рећи, и 5> 0, али сада 5 је са леве стране,
тако да морам да променим 5 и 0.
Када сам их мењате, одједном сам се овај другу листу.
Сада 5> 1, па ћемо да их замене.
5 није> 6, тако да не морате ништа да радите овде.
Али 6> 4, тако да морамо да се замене.
Опет, морамо да пролазе кроз цео списак да евентуално открију
да су у квару, ми их замене,
и у овом тренутку морамо да пролазе кроз листу 1 више времена
да бисте се уверили да је све у свом налогу, а у овом тренутку балон врсте заврши.
Другачији алгоритам за узимање неких елемената и сортирање их је избор врста.
Идеја која стоји иза избора врсте је да ћемо да се изгради сортирани део листе
1 елемент у једном тренутку.
>> А начин на који ћемо да урадимо то је да гради леву сегмент листе.
У суштини, сваки - на сваком кораку, ми ћемо узети најмањи елемент смо оставили
која још није сортиран, а ми ћемо га преместили у тај сортираних сегменту.
То значи да треба стално да пронађете минималну несортиран елемент
и онда узети ту минималну елемент и своп га са оним
лево највише елемент који се не сортира.
У бекству време то ће бити О (н ²), јер у најгорем слуцају
морамо упоредити сваки елемент сваког другог елемента.
Зато ми је рекао да ако почнемо на левој половини листе, морамо
да иде преко целе десне сегменту наћи најмањи елемент.
А онда, опет, морамо да идемо преко цео десни сегмент и
наставим преко тога изнова и изнова и изнова.
То ће бити н ². Ми ћемо морати да петље унутар другог за петље
што сугерише н ².
У најбољем случају мисли, рецимо да му дамо већ сортиране листе;
ми заправо не раде ништа боље него н ².
Зато избор врста нема начина знајући да
минимални елемент је само један сам се деси да се гледа.
То је још увек треба да се уверите да је то заправо минимална.
>> А једини начин да се уверите да је то минимум, користећи овај алгоритам,
је да погледате сваки елемент поново.
Дакле стварно, ако га дају - ако дате Селецтион сортирати већ сортиране листе,
то неће урадити ништа боље него што дају списак који није сортиран још.
Узгред, ако се деси да буде случај да нешто је О (нешто)
и омега нечега, можемо само да кажем више језгровито да је θ нечега.
Дакле, ако видите да се било где, то је оно то само значи.
>> Ако је нешто тета н ², то је и велика О (н ²) и Ω (н ²).
Со најбољем случају и најгори случај, то не направи разлику,
алгоритам ће учинити исту ствар сваки пут.
Дакле, ово је оно што Псеудокод за избор врсте могла да изгледа.
Ми смо у основи ћемо рећи да желим да прелазили преко листу
слева на десно, а на сваке итерације петље, ја ћу да се креће
минимални елеменат у ову сортираном делу листе.
А када крећем тамо нешто, никад нисам треба да погледамо тог елемента поново.
Јер чим сам свап елемент на левом делу листе, то је сортирано
јер ми радимо све што је у растућем редоследу помоћу минимума.
Тако смо рекли, у реду, ми смо у позицији сам, и морамо да погледамо све елементе
са десне стране И како би пронашли минимум.
Значи желимо да погледамо у и + 1 на крај листе.
И сада, ако је елемент који тренутно гледамо је мање од нашег минимум до сада,
који, запамтите, ми почињемо минималну офф да буде само
год елеменат тренутно смо у, ја ћу претпоставити да је минимална.
Ако нађем елемент који је мањи од тога, онда ћу да кажем, у реду,
добро, ја сам нашао нову минимум.
Идем да се сетим где је минимална је.
>> Дакле, сада, када сам прошао кроз ту десну некласификовани сегменту,
Ја могу да кажем да ћу да мењате минималну елемент са елементом који је у позицији сам се.
То ће да се изгради своју листу, мој сортиран део листе слева на десно,
и ми никада не треба да гледају на елементу још једном да је у том делу.
Када смо га заменили.
Дакле, хајде да сортирање избор на овој листи.
Плави елемент овде ће бити и, и црвени елемент ће бити минимална елемент.
Тако сам почиње скроз на левој страни листе, тако да у 5.
Сада морамо да нађемо минимум унсортед елемент.
Зато ми кажемо 0 <5, тако да 0 је мој нови минимум.
>> Али ја не могу да зауставим, јер иако можемо признати да 0 је најмањи,
морамо покренути кроз сваки други елемент листе да бисте се уверили.
Дакле 1 већа, 6 је већи, 4 је већи.
То значи да после гледа све ове елементе, ја сам одлучан 0 је најмања.
Зато ћу мењати 5 и 0.
Једном сам свап да ћу добити нову листу, а ја знам да никад треба да погледамо у том 0 поново
јер када сам га заменио, ја сам га сортирају и готови смо.
Сада је то тако једноставно дешава да је плава елемент је опет 5,
и морамо да погледамо на 1, 6 и 4 утврдити да је 1
је најмања минимална елемент, па ћемо мењати 1 и 5.
Опет, морамо да погледамо - упоредите 5 на 6 и 4,
и ми ћемо мењати 4 и 5, и на крају, упореди
та 2 бројеви и своп их док не добију нашу сортирани списак.
Сва питања у вези одабира врсте?
Ок. Идемо до последњег теми овде, а то је рекурзије.
>> Рекурзија, запамтите, ово стварно мета ствар где функција
више пута сам зове.
Дакле, у једном тренутку, док је наш фуцтион је више пута се зове,
постоји потреба да се нека тачка на којој смо стали зове себе.
Јер ако то не урадимо, онда смо само ћемо наставити да се то уради заувек,
и наш програм је само неће да прекине.
Ми то називамо услов база случај.
А основни случај, каже, уместо позивања поново функцију,
Ја ћу само да се врати неку вредност.
Дакле, кад смо се вратили вредност, престали смо да зове себе,
а остатак позива смо направили до сада такође могу вратити.
Супротно од основног случаја је рекурзивни случај.
А ово је када желимо да други позив на функцију коју тренутно бавите ин
И ми смо вероватно, мада не увек, желе да користе различите аргументе.
>> Дакле, ако имамо функцију која се зове ф и ф управо звао узети 1 аргумент,
а ми смо само наставите зове ф (1), ф (1), ф (1), и то је тако једноставно дешава да
аргумент 1 спада у рекурзивна случају, ми још увек никада неће престати.
Чак и ако имамо базу случај, морамо бити сигурни да на крају ћемо погодити тај случај базу.
Ми не само држати боравка у овом рецурсиве случају.
Генерално, када смо се зовем, вероватно ћемо имати другачији аргумент који сваки пут.
Овде је заиста једноставан рекурзивни функција.
Дакле, ово ће израчунати факторијел броја.
До врх Овде имамо базу случај.
У случају да је н ≤ 1, нећемо звати факторијел поново.
Ми ћемо зауставити, ми само идемо да се врате неку вредност.
Ако то није тачно, онда ћемо погодила нашу рекурзивно случај.
Приметимо да нисмо само позивањем факторијел (н), јер то не би било веома корисно.
Ми ћемо позвати факторијел нешто друго.
>> И тако да можете видети, евентуално ако прође факторијел (5) или нешто,
ћемо позвати факторијел (4) и тако даље, и на крају ћемо погодити овај случај базу.
Дакле, ово изгледа добро. Хајде да видимо шта се дешава када смо покренули ово.
То је скуп, и рецимо да је главни ће позвати ову функцију са аргументом (4).
Дакле, једном факторијел види и = 4, факторијел ће се звати.
Сада, одједном, имамо факторијел (3).
Дакле, ови функције ће наставити да расте док се на крају ми је погодила нашу базу случај.
У овом тренутку, повратна вредност је ово повратак (нк повратак вредност ове),
повратак вредност је нк повратак вредност овога.
На крају морамо да удари неки број.
На врху овде, ми кажемо повратак 1.
То значи да када се вратимо тај број, можемо поп ово са стека.
Дакле, ово факторијел (1) се ради.
Када је 1 враћа, овај факторијел (1) повратак, овај повратак на-1.
Повратна вредност ове, запамтите, био нк повратак вредност овога.
Тако изненада, овај момак зна да желим да се вратим 2.
>> Дакле, запамтите, врати вредност је само нк повратак вредност овде.
Тако сада можемо рећи 3 к 2, и на крају, овде можемо да кажемо
ово је само ће бити 4 к 3 к 2.
И Када се ово повратак, ми смо добили до једне инсиде целобројног главног.
Сва питања о рекурзије?
У реду. Дакле, има још времена за питања на крају,
али сада Јосиф ће обухватити преостале теме.
>> [Џозеф Онг] У реду. Дакле, сада када смо разговарали о рецурсионс,
Хајде да причамо мало о томе шта је обједињавање врста.
Обједињавање врста је у суштини један начин сортирања листу бројева.
И како то ради је, са врстом стапања имате листу, а шта ми радимо је
кажемо, хајде да поделите то на 2 половине.
Прво ћемо покренути обједињавање сортирање поново на левој половини,
онда ћемо покренути обједињавање врсте на десној половини,
а да нам сада даје 2 половине које су сортиране, а сада ћемо заједно комбиновати те половине.
То је мало тешко видети без пример, тако ћемо проћи кроз покрете и види шта се дешава.
Дакле, ви почнете са ове листе, ми га поделити на 2 дела.
Ми смо покренули обједињавање врсте на левој половини прве.
Тако да је лева половина, а сада смо их пролазе кроз ове листе опет
која добија прошао у стапања врсте, а онда гледамо, опет,
на левој страни овог списка и ми смо покренули обједињавање врсте на њега.
Сада смо доле на листи од 2 бројева,
и сада је лева половина је само 1 елемент дуго, а ми не можемо
подељен списак који је само 1 елемент у полувремену, па смо само кажем, кад имамо 50,
што је само 1 елемент, то је већ сређено.
>> Када смо завршили са тим, можемо да видимо да можемо
пређите на десној половини ове листе,
и 3 такође сортира, па сада када су поредани обе половине ове листе
можемо придружити ове бројеве поново заједно.
Тако смо погледати на 50 и 3, 3 је мањи од 50, тако да иде у први и затим 50 Улази
Дакле, то је урадио, а ми се вратимо до тог списка и сортирање да је десна половина.
42 Да ли је то сопствени број, тако да је већ сређено.
Дакле, сада смо то упоредити 2 и 3 је мањи од 42, тако да добија ставио у први,
Сада 42 добија ставити у, а 50 добија ставио унутра
Дакле, то је сортиран, идемо скроз назад до врха, 1337 и 15 година.
Па, ми смо сада погледамо на левој половини ове листе, 1337 је само по себи тако да се сортирају и исто и са 15 година.
Дакле, сада смо комбинују ова 2 броја за сортирање, оригинална листа, 15 <1337,
тако то иде први, а затим 1337 иде унутра
И сада смо поредани обе половине првобитног списка до врха.
И све што треба да урадите је да се комбинују ове.
Гледамо на прва 2 броја овог листа, 3 <15, тако то иде у редослед низа први.
15 <42, тако да је унутра иде Сада 42 <1337, који иде унутра
50 <1337, тако то иде унутра и приметио да ми само узели 2 броја искључивање ове листе.
Дакле, ми нисмо само наизменично између 2 листа.
Ми само гледамо на почетку, а ми смо одвојили елемент
то је мањи, а затим стављајући га у нашу низа.
Сада смо спојили све половине и ми смо урадили.
>> Сва питања у вези обједињавања врсту? Да?
[Студентски] Ако је то одвајање у различите групе, зашто не само да деле једном
и имате 3 и 2 у групи? [Остатак питања неразумљив]
Разлог - тако, питање је, зашто не можемо само да их споји на том првом кораку након што их имате?
Разлог можемо да урадимо ово, почните на левом већини елемената обе стране,
а онда се један мањи и ставио га у, да знамо да су ови
појединачне листе су у разврстаних налога.
Дакле, ако ја гледам на левом већини елемената оба полувремена,
Знам да ћеш бити најмањи елементи тих листа.
Тако да могу да их ставим у најмањих елемената спотова овог великог листе.
С друге стране, ако погледате ове 2 листа у другом нивоу тамо,
50, 3, 42, 1337 и 15, оне се не сортира.
Дакле, ако ја гледам на 50 и 1337, ја ћу да ставим 50 у мојој листи први.
Али то заиста не смисла, јер 3 је најмањи елемент од свих њих.
Дакле, једини разлог смо да урадимо ово комбинује корак је зато што су наши спискови већ сређено.
Који је разлог зашто морамо да пређемо све до дна
јер када имамо само један број, ви знате да један број
само по себи је већ сортирана листа.
>> Има ли питања? Не?
Сложеност? Па, можете видети да на сваком кораку има крај бројеви,
и можемо поделити листу у пола лог н пута,
што је где смо добили овај Н к лог н комплексности.
И видећете најбољи случај стапања врста је н лог н, па је тако једноставно дешава
да је најгори случај, односно Ω тамо, такође је н лог н.
Нешто треба имати на уму.
Мовинг он, идемо на неку супер основном фајлу И / О.
Ако сте гледали Сцрамбле, приметићете смо неку врсту система
где сте могли писати лог фајл ако прочитате кроз кода.
Хајде да видимо како сте могли да урадим.
Па, ми имамо фпринтф, коју можете мислити као о само принтф,
али само штампање у датотеку уместо тога, и стога ф на почетку.
Ова врста кода горе, оно што ради је, као што сте можда видели у Сцрамбле,
иде кроз 2-димензионални низа штампе од ред по ред оно што су бројеви налазе.
У овом случају, иф исписује до вашем терминалу или оно што ми зовемо стандардни излаз секције.
>> А сада, у овом случају, све што треба да урадите је замени иф са иф,
реци то како датотеку коју желите да штампате, ау овом случају то само исписује тог фајла
уместо да се штампа до вашем терминалу.
Па, онда се поставља питање: Где смо добили ову врсту фајла из, зар не?
Ми смо прошли пријавите на овај фпринтф фуцтион али нисмо имали појма где је дошао из.
Па, рано у коду, оно што смо имали је био тај комад кода овамо,
која у суштини каже да отварају датотеке позива лог.ткт.
Шта радимо после тога морамо да се уверите да је датотека у ствари отворен успешно.
Тако да можда не за више разлога, ви немате довољно простора на вашем рачунару, на пример.
Дакле, увек је важно пре него што урадите било операције са датотеком
да проверите да ли је датотека је успешно отворен.
Дакле, шта то, то је аргумент за фопен, добро, можемо да отворимо датотеку на много начина.
Оно што можемо да урадимо је, можемо то да прође ж, што значи заменити датотеку ако излази већ,
Можемо прође а, који су додати на крај датотеке, уместо од превасходног је,
или можемо навести р, што значи, да отворите датотеку само за читање.
Дакле, ако програм покуша да направи било какве измене у датотеци,
викати на њих и не дозволити да то уради.
Коначно, када смо завршили са датотеком, заврсио раде операције на њему,
морамо да будемо сигурни да затворите датотеку.
И тако на крају свог програма, ви ћете их поново проћи
ова датотека које сте отворили, и само га затворите.
Дакле, ово је нешто важно да морате да будете сигурни да урадите.
Зато запамтите можете отворити датотеку, онда можете писати датотеке,
не операције у датотеци, али онда морате да затворите датотеку на крају.
>> Сва питања о основном фајлу И / О? Да?
[Студентски питање, неразумљив]
Баш овде. Питање је, где се ово лог.ткт фајл појавити?
Па, ако само му дати лог.ткт, он га ствара у истом директоријуму као извршну.
Дакле, ако ти си - >> [Студентски питање, неразумљив]
Да. У истом фолдеру, или у истом директоријуму, како је ви зовете.
Сада меморија, стек, и гомила.
Па како је меморија постављени у рачунару?
Па, можете замислити меморије као нека врста овог блока овде.
И у меморији имамо оно што се зове гомилу заглави тамо, и стек који је тамо доле.
А гомила расте надоле и стек расте нагоре.
Дакле, као што Томи помиње - Ох, добро, и ми имамо те друге 4 сегменте који ћу добити у секунди -
Као што је раније Томи, знаш како његове функције себе називају и зову једни друге?
Они граде ову врсту стек оквира.
Па, ако главни позиви Фоо, Фоо добија стави на стек.
Фоо позива Бар, Бар добити ставимо на стек, и да добија стави на стек после.
И док су се врате, сваки се скидају са стека.
Шта свака од ових локација и меморију држите?
Па, на врху, који је текст сегмент садржи саму програм.
Дакле машина кода, то је тамо, када компајлирате програм.
Даље, било иницијализован глобалне променљиве.
>> Дакле, имате глобалне варијабле у свом програму, а ти кажеш као, а = 5,
које добија стави у том сегменту, а одмах испод тога,
имате неиницијализоване глобалне податке, који је само инт,
али не кажем да је то једнако било шта.
Схватите ово су глобалне променљиве, па су ван главни.
Дакле, ово значи да све глобалне променљиве које су проглашени али се није покренут.
Дакле, шта је у гомили? Меморија издвојено коришћењем маллоц, које ћемо добити у мало.
И на крају, са стека имате локалне променљиве
и све функције које би се могло назвати у било које од својих параметара.
Последња ствар, стварно не морате да знате шта променљиве раде,
али кад год покренете програм, постоји нешто у вези, као
ово је корисничко име особе која је водио програм.
И то ће бити нека врста на дну.
У погледу меморијских адреса, које су хексадецималне вредности,
вредности у горњем крећу 0, и они иду скроз доле до дна.
У том случају, ако си на 32-битном систему,
адреса на дну ће бити 0к, затим АФ, јер то је 32 бита,
што је 8 бајтова, у овом случају 8 бајтова одговара на 8 хексадецималних цифара.
Дакле, овде ћете имати, рецимо, 0кФФФФФФ, и тамо ћеш имати 0.
Дакле, шта су показивачи? Неки од вас можда нису покривени ово у одељку раније.
али смо отишли ​​преко њега у предавању, тако да показивач је само тип података
које складишти, уместо некакве вредности као што су 50, њој се чува адресу неког локације у меморији.
Као тог сећања [неразумљиво].
Дакле, у овом случају, оно што смо се, имамо показивач на цео број или инт *,
и она садржи овај хексадецимални адресу 0кДЕАДБЕЕФ.
>> Дакле, оно што ми имамо је, сада, ово показивача указује на неко место у меморији,
и то је само, вредност 50 је у овој меморијској локацији.
На неким 32-битним системима, на свим 32-битним системима, показивачи заузимају 32 бита или 4 бајта.
Али, на пример, на 64-битном систему, показивачи су 64 бита.
Дакле, то је нешто што ћете желети да имате на уму.
Дакле, на крају-битном систему, показивач је крајници дуго.
Показивачи су некако тешко сварити без додатних ствари,
па идемо кроз пример динамичке меморије алокације.
Шта динамичка додела меморије ради за вас, или оно што ми зовемо маллоц,
омогућава вам да издвоји неку података ван сета.
Дакле, ови подаци врста трајније за време трајања програма.
Јер, као што знате, ако објави к унутар једне функције, а да функција враћа,
више немате приступ подацима који су ускладиштени у к.
Шта показивачи урадимо је да су нам складиште меморије или продавница вредности
у другом сегменту меморије, односно гомиле.
Сада када смо се вратили из функције, докле год имамо показивач
на ту локацију у меморији, онда оно што можемо да урадимо је да можемо само да погледамо вредности тамо.
Погледајмо пример: Ово је опет наша меморија распоред.
И ми имамо ову функцију, главни.
Шта ради је - у реду, тако једноставно, зар не? - Инт к = 5, то је само променљива на стек у главни.
>> С друге стране, сада ћемо прогласити показивач који позива функцијских гивеМеТхрееИнтс.
И тако сада идемо на овој функцији и стварамо нови стек оквир за то.
Међутим, у овом стек оквира, ми изјављујемо инт * темп,
који у маллоцс 3 целих бројева за нас.
Дакле, величина инт ће нам дати колико бајтова ово инт је,
и маллоц нам даје да многи бајтова простора на гомили.
Дакле, у овом случају, ми смо створили довољно простора за 3 целих бројева,
а гомила је пут до тамо, што је разлог зашто сам га извући више горе.
Када смо завршили, ми вратимо овде, треба само 3 ИНТС вратио,
и враћа адресу, у овом случају у коме је памћење.
И ми смо поставили показивач = прекидач, и тамо имамо само још један показивач.
Али, шта да се функција враћа се овде слажу и нестаје.
Дакле температура нестаје, али ми и даље одржавају адресу где
те 3 целих су унутар мреже.
Дакле, у овом сету су показивачи су сцопед локално за наслагани оквира,
али сећање на које се они односе се на гомилу.
>> Да ли то смисла?
[Студентски] Можете ли да поновите? >> [Џозеф] Да.
Дакле, ако се вратим само мало, видиш да темп додељено
део меморије на гомилу до тамо.
Дакле, када је ова функција, гивеМеТхрееИнтс враћа, овај стек овде ће нестати.
И са њим било варијабли, у овом случају, то показивач који је додељен у наслаганом кадру.
То ће нестати, али пошто смо се вратили темп
и ми смо поставили показивач = темп, показивач се сада дешава да се укаже исту меморију локације као темп била.
Дакле, сада, иако смо изгубили температуру, да локалне показивача,
ми смо и даље задржати меморијску адресу онога што је указивање на унутрашњост тог променљиве показивачем.
Питања? То може да буде нека врста конфузне теми ако нисте прошли кроз њега у секцији.
Можемо, ваш ТФ ће дефинитивно ићи преко њега и наравно да можемо одговорити на питања
на крају разматрање седници за ово.
Али, то је нека врста комплексног тему, а имам још примера које ће се појавити
који ће помоћи разјаснити шта показивачи заиста јесу.
>> У овом случају, показивачи су еквивалент низовима,
тако да могу да користе овај показивач као исто као инт низ.
Тако сам индексира у 0, а мења први цео на 1,
променом други цео до 2, и 3. цео до 3.
Дакле, више на показивача. Па, сећам Бинки.
У овом случају смо додељен показивач, или смо прогласили показивач,
али у почетку, када сам проглашен за показивач, није указује на било које место у меморији.
То је само смеће вредности унутар ње.
Дакле, немам појма где је то показивач упућује на.
Она има неку адресу која је само испуњену 0 и 1 је где је првобитно објављен.
Ја не могу ништа да урадим са овим док не позове маллоц на њему
и онда ми даје мало простора на гомили где могу ставити вредности унутра.
Онда опет, ја не знам шта је унутра ове меморије.
Дакле, прва ствар коју треба да урадите је да проверите да ли систем има довољно меморије
да ми врати 1 цео на првом месту, што је разлог зашто ово радим провери.
Ако показивач је нулл, што значи да то није било довољно простора или неки други грешке,
па треба да изађете из мог програма.
Али, ако је то урадио успео, сада могу да користе тај показивач
и шта * показивач ради је прати где је адреса
где та вредност је, а поставља га једнака 1.
Дакле овде, ми смо проверу да ли је меморија постојала.
>> Када знате да постоји, можете ставити у њега
шта вредност коју желите да ставите у њу, у овом случају 1.
Када смо завршили са тим, потребно је да ослободите тог показивача
зато морамо да се вратимо на систем који меморије које сте тражили на првом месту.
Јер рачунар не зна када смо завршили са тим.
У овом случају смо експлицитно смо га говорим, ок, ми смо урадили са том меморијом.
Ако неки други процес је потребно, неки други програм је потребно, слободно да иде напред и да га.
Оно што можемо учинити је да ми само можемо добити адресу локалних променљивих на сету.
Дакле, инт је унутар наслаганом оквиру главног.
И када смо користили овај амперсанд, ово и оператер, оно што ради је
потребно је к, а к је само неке податке у меморији, али има адресу.
То је негде лоциран. Тако се зове и к, шта то ради је то нам даје адресу к.
Чинећи то, ми правимо показивача тачку где је к у меморији.
Сада смо само немој несто * к ћемо добити 5 назад.
Звезда се зове дереференцинг га.
Ви пратите адресу и добићете вредност њега ускладиштена тамо.
>> Има ли питања? Да?
[Студентски] Ако не урадите 3-зашиљену ствар, то још увек саставља?
Да. Ако не урадите 3-показивач ствар, то је још увек ће да састави,
али ја ћу вам показати шта се дешава у другом, и без тога,
то је оно што ми зовемо осипање меморије. Ви не дајете у систему
резервну своју меморију, тако да након док програм иде да акумулирају
меморија која се не користи, и ништа друго не може да користи.
Ако сте икада видели Фирефок са 1,5 милиона килобајта на вашем рачунару,
У менаџера задатака, то је оно што се дешава.
Имате меморијску цурење у програму који они не руковање.
Дакле, како се показивач аритметичка ради?
Па, показивач аритметика је некако као индексирања у низу.
У овом случају, имам показивач, и шта ја радим јесте да направим показивача указују на првом елементу
овог низа од 3 целих бројева које сам издвојила.
Па шта сад да радим, звезда показивач само мења први елемент у листи.
Звезда поинтер +1 поена овамо.
Дакле, показивач је овде, показивач +1 је овде, показивач +2 је овде.
>> Дакле, само додавањем 1 је иста ствар као креће дуж овог низа.
Оно што ми радимо је, када радимо показивач +1 добићете адресу овамо,
и да би се добила вредност овде, ставиш звезду на из целог израза
да дереференце га.
Дакле, у овом случају, ја постављање прву локацију у овом низу од 1,
Друга локација на 2, а треће место на 3.
Онда шта ја радим овде је сам штампа наш показивач +1,
који је само ми даје 2.
Сада сам увецава показивач, па показивач једнако показивач +1,
која га покреће напред.
И сада ако штампате показивач +1, показивач +1 је сада 3,
која је у овом случају исписује 3.
А да би нешто бесплатно, показивач да га дам
мора бити усмерена на почетку низа који сам се вратио из маллоц.
Дакле, у овом случају, ако бих да позовем 3 овде, то не би било у реду,
јер је у средини низа.
Морам да одузмите доћи до оригиналној локацији
почетна тачка први пре него што сам га ослободи.
Дакле, овде је више укључени пример.
У овом случају, ми смо додељивања 7 знакова у низу знакова.
>> И у овом случају оно што ми радимо је да смо петље у првој 6 од њих,
и ми смо их поставите на З.
Дакле, за инт и = 0, и> 6, и + +,
Дакле, показивач + и само ће нам дати, у овом случају,
показивач, показивач +1, показивач +2, +3 показивач, и тако даље, и тако даље у току.
Шта ће то урадите је да се добије ту адресу, дереференцес да добије вредност,
и промене које вредност до Ж
Онда на крају запамтите да је ово ниска, зар не?
Све жице морају завршити са нултом престаје карактера.
Дакле, оно што ја радим је у показивачу 6 сам ставио нулл терминатор карактер за
И шта сад ја у суштини радим овде је принтф спроводи за серију, зар не?
>> Дакле, када се принтф сада када је достигла крај стринга?
Када се удари нулл укида карактер.
Дакле, у овом случају, мој оригинални показивача указује на почетку овог низа.
Ја одштампали прву карактер напоље. Ја га помери један.
Ја одштампате тај лик напоље. Крећем га.
И ја наставим да радим ово док сам до краја.
А сад је крај * показивач ће дереференце ово и добити назад нулл укида карактер.
И тако моја рута, а покреће се само када је вредност није нула престанак карактер.
Дакле, сада сам излазак из ове петље.
И тако ако одузмете 6 од овог показивача,
Ја се вратим све до почетка.
Запамтите, ја ово радим јер морам да идем на почетак како би га ослободили.
>> Па, знам да је то много. Има ли неких питања?
Молим вас, да?
[Студентски питање неразумљиво]
Може ли се рећи да гласније? Извините.
[Студентски] На последњем слајду непосредно пре него што ослобођени показивача,
где сте заправо мења вредност показивача?
[Јосепх] Дакле, овде. >> [Студент] Ох, у реду.
[Јосепх] Дакле, имам показивач минус минус, десно,
који се креће уназад једну ствар, а онда сам га ослободе,
јер показивач мора да буде указао на почетак низа.
[Студентски] Али то не би било потребно да сте престали после тој линији.
[Јосепх] Дакле, ако сам престао након тога, то би се сматрати осипање меморије,
јер нисам покренути бесплатно.
[Студентски] Ја [неразумљиво] након прве три линије где сте имали показивач +1 [неразумљиво].
[Јосепх] Аха. Дакле, шта је питање било?
Извините. Не, не. Иди, иди, молим те.
[Студентски] Дакле, ви не мења вредност показивача.
Не би сте морали да урадите показивач минус минус.
[Јосепх] Да, баш тако.
Дакле, када ја показивач +1 и показивач +2,
Ја не радим показивач једнако показивач +1.
Дакле, показивач само остаје указујући на почетку низа.
То је само кад радим плус плус да поставља вредност унутра показивача,
да је то заправо креће ово заједно.
У реду.
Још питања?
>> Опет, ако је ово врста неодољив, то ће бити покривен у заседању.
Питајте свог момка наставу о томе, и ми можемо одговорити на питања на крају.
И обично не воле да се овај минус ствар.
Ово мора да тражи мене воде евиденцију о томе колико сам офсет у низу.
Дакле, у принципу, ово је само да се објасни како радове показивач операције.
Али, оно што ми обично воле да урадите је да желите да направите копију показивача,
и онда ћемо искористити ту копију кад идемо около у низу.
Дакле, у овим случају да користите копију за штампање цео стринг,
али ми не треба да урадимо као показивача минус 6 или пратите колико смо се преселили у ово,
само зато што знамо да је наша оригинална тачка ипак указао на почетак листе
и све што смо промењен је ово копија.
Дакле, у принципу, мењати копије оригиналне показивачем.
Не покушавајте да некако слично - немојте мењати оригиналне копије.
Покушавајући да мењају само копије оригинала.
Дакле, приметите кад прођемо стринг у инт
Ви не морате да стави звезду испред њега као што смо урадили са свим осталим дереференцес, зар не?
Дакле, ако штампате цео стринг% с очекује је адреса,
и у овом случају показивача или у овом случају као низ знакова.
>> Ликови, цхар * с, и низови су иста ствар.
Поинтер је карактера, а карактер низови су иста ствар.
И тако, све што треба да урадимо је да прође у показивачем.
Ми не треба да прође у као * показивача или нешто слично томе.
Дакле, низови и показивачи су иста ствар.
Када радиш нешто к [и] овде за низу,
шта ради под хаубом је то каже, добро, то је карактер низ,
тако да је показивач.
И тако к су иста ствар,
па оно што ради је он додаје и у к,
што је исто као кретање напред у меморији толико.
А сада к + и нам даје неку адресу,
и ми дереференце адресу или пратите стрелицу
где та локација у меморији је и добијамо вредност од те локације у меморији.
Тако, тако ове две су потпуно иста ствар.
То је само синтаксни шећер.
Они раде исту ствар. Они су само различити синтацтицс за другог.
>> Дакле, шта може да крене наопако са показивачима? Као, много. Ок. Дакле, лоше ствари.
Неке лоше ствари које можете да урадите не проверава да ли ваш позив маллоц враћа нулл, зар не?
У овом случају, тражим систем да ми дају - шта је то број?
Као 2 милијарде пута 4, због величине цео број је 4 бајта.
Ја то тражим као 8 милијарди бајтова.
Наравно, мој рачунар неће бити у стању да ми дају толико назад меморије.
А ми нисмо проверили да ли је ово нула, тако да када покушамо да дереференце је тамо -
пратите стрелицу на место где ће то - ми немамо ту меморију.
То је оно што ми зовемо дереференцинг нулл показивач.
И ово у суштини изазива да сегфаулт.
Ово је један од начина на које можете сегфаулт.
Други лоше ствари које можете да урадите - ох добро.
То је дереференцинг нулл показивач. Ок.
Други лоше ствари - па, да то поправимо само стави чек у ту
која проверава да ли је показивач је нулл
и излазак из програма ако се деси да маллоц враца нулл показивач.
То је ккцд стрип. Људи разумеју сада. На неки начин.
>> Дакле, меморија. И ја сам отишао у ово.
Зовемо маллоц у петљи, али сваки пут ми зовемо маллоц
губимо траг где је овај показивач указује да,
јер смо га цлобберинг.
Дакле, почетни позив маллоц ми даје сећање овамо.
Моји Показивач показивачи на ово.
Сада, ја не ослободе, тако да сада зовем маллоц поново.
Сада то указује овамо. Сада моје сећање окренут овде.
Указујући овамо. Указујући овамо.
Али ја сам изгубио траг од адресе свих меморије овамо да сам издвојила.
И сада ја више немам никакву референцу на њих.
Дакле, ја не могу да их ослободе ван овог петље.
И тако би се решили овако нешто,
Ако сте заборавили да слободне меморије и ти овај меморијски цурење,
Морате да ослободите меморију унутар ове петље када завршите са њим.
Па, то је оно што се дешава. Знам много о теби мрзим ово.
Али сада - иаи! Добићете као 44.000 килобајта.
Дакле, ти га ослободити на крају петље,
и да ће само да ослободе меморијској сваки пут.
У суштини, ваш програм нема више цурење меморије.
>> А сад нешто што можете да урадите јесте ослободили меморију коју сте тражили два пута.
У том случају, ви маллоц нешто, промените њену вредност.
Ви га ослободити једном, јер сте рекли да су завршили са њим.
Али онда смо га ослободили поново.
То је нешто што је прилично лоше.
То неће почетку сегфаулт,
али после, док оно то не се двоструки ослобађању овог квари ваше гомили структуру,
а ви ћете научити нешто више о томе, ако се одлучите да класу као ЦС61.
Али у суштини, након док ваш рачунар ће се збунити
шта меморијске локације где је и где је складиште -
где се подаци чувају у меморији.
И тако ослобађајући показивач два пута је лоша ствар коју не желите да урадите.
>> Друге ствари које могу да иду лоше не користи сизеоф.
Дакле, у овом случају маллоц 8 бајтова,
и то је иста ствар као два цела броја, зар не?
Дакле, то је савршено безбедан, али да ли је?
Па, као Луцас говорио на различитим архитектурама,
целих су различите дужине.
Дакле, на уређају који користите, цели бројеви су око 4 бајта,
али на неком другом систему они могу бити 8 бајтова или су можда 16 бајтова.
Дакле, ако сам само користите овај број овамо,
овај програм може да ради на апарату,
али то неће да издвоји довољно меморије на неком другом систему.
У овом случају, то је оно што сизеоф оператора користи.
Када зовемо сизеоф (инт), шта то ради је
то нам даје величину цео о систему који програм је покренут.
Дакле, у овом случају, сизеоф (инт) ће вратити 4 на нешто попут апарата,
и сада ово воља 4 * 2, што је 8,
што је само количина простора неопходног за два целих бројева.
На другом систему, ако инт је као 16 бајтова или 8 бајтова,
само це да се врати довољно бајта за складиштење тај износ.
>> И коначно, Структуре.
Дакле, ако сте желели да сачувате судоку таблу у меморији, како би смо то урадили?
Можда мислите попут променљиве за прву ствар,
променљива за другу ствар, променљива за трећи ствар,
променљива за четврту ствар - лоше, зар не?
Дакле, једна побољшање можете направити на врху то је да направимо 9 к 9 низ.
То је у реду, али шта ако сте хтели да повежете друге ствари са судоку одбора
свиђа оно потешкоћа одбора је,
или, на пример, шта је ваш резултат, или колико времена се то узима да реши овај форум?
Па, шта можете да урадите је да креирате струцт.
Оно што у суштини кажем је да сам дефинише ову структуру овамо,
и ја сам дефинисање судоку таблу која се састоји од одбора који је 9 к 9.
>> А оно што има да има показиваче на име нивоа.
Она такође има Кс и И, који су координате где сам сада.
Такође је време проведено [неразумљив] и има укупан број потеза сам инпуттед до сада.
И тако у овом случају, могу груписати гомилу података у само једној структури
уместо да га као лете около као што су различите променљиве
да ја стварно не могу пратити.
И то нам омогућава да имамо само лепу синтаксу за врстом референцирање различите ствари унутар овог струцт.
Ја само могу да урадим боард.боард, а ја добијем назад судоку таблу.
Боард.левел, схватам колико је то тешко.
Боард.к и боард.и дај координате где бих могао бити у одбору.
И тако сам приступ оно што ми зовемо поља у струцт.
Ово дефинише судокуБоард, који је тип који имам.
И сада смо овде. Имам променљиву под називом "одбор" типа судокуБоард.
И тако сада можете да приступите сва поља које чине ову структуру овамо.
>> Сва питања у вези Структуре? Да?
[Студентски] За инт к, и, ви изјавио како на једној линији? >> [Јосепх] Аха.
[Студентски] Дакле, молим вас да урадите то са свима њима?
Као у Кс, И запета пута да укупни?
[Јосепх] Да, дефинитивно могу да урадим, али разлог због којег сам ставио Кс и И на истој линији -
и питање је зашто можемо само урадите то на истој линији?
Зашто не бисмо само стави све то на истој линији је
Кс и И су повезани једни са другима,
а ово је само стилски тачније, у извесном смислу,
зато што је груписање две ствари на истој линији
да као врста односе на исту ствар.
И само поделити ове распада. То је само стил ствар.
То функционално свеједно какву.
Било која друга питања о Структуре?
Можете да дефинишете покедек са струцт.
Покемони има број и има писмо, власник, тип.
А онда, ако имате низ Покемон, можете чине покедек, зар не?
Ок, кул. Дакле, питања о Структуре. Они су повезани са Структуре.
>> Коначно, ГДБ. Шта ГДБ да радите? Она вам омогућава да дебуг свој програм.
А ако нисте користили ГДБ, ја бих препоручио гледајући кратки
и само иде преко онога што ГДБ је, како се ради са њим, како би га користили,
и тестирати га на програму.
И шта ГДБ вам омогућава да урадите јесте то омогућава паузирање [неразумљиво] Горе ваш програм
и практична линија.
На пример, желим да паузирате извршење на линији 3 попут мог програма,
и док сам на линији 3 могу одштампати све вредности које су тамо.
И тако оно што ми зовемо као паузирање у складу
се зовемо ово стављање тачку прекида на тој линији
и онда можете да одштампате променљиве на стање програма у то време.
>> Тада можемо одатле корак кроз програм ред по ред.
А онда можемо да погледамо стање стека у то време.
И тако би се користили гдб, оно што ми радимо је да позове звека на Ц фајлу,
али морамо да га прође-ггдб заставу.
А када смо завршили са које смо управо покренули ГДБ на Резултујућа фајлу.
И тако сте добили неку масу као текста овако,
али заиста све што треба да урадите је да куцате у команди на почетку.
Бреак главни ставља тачку прекида на главни.
Листа 400 наводи линије кода око линије 400.
И тако се у овом случају можете само погледати око себе и рећи, ох,
Желим да поставите тачку прекида на линији 397, која је то линија,
и онда ваш програм ради у том кораку и то ће сломити.
То ће паузу тамо, а ви можете да одштампате, на пример, вредност ниске или високе.
И тако постоји гомила команди које треба да знате,
и ово Слидесхов ће ићи на сајту,
па ако желите само да референце ових или желите ставити их на ваше преварити листова, слободно.
>> Кул. То је квиз преглед 0, а ми ћемо остати ако имате било каквих питања.
У реду.
>> [Аплауз]
>> [ЦС50.ТВ]